在python fenics中求解具有混合边界条件的3D泊松方程

时间:2018-10-18 09:00:13

标签: python poisson fenics

我是FEniCS的新手。我在Win10上使用Ubuntu应用程序,然后安装了python3.6和fenics。

我正在尝试求解3D泊松方程,例如Laplace(u)= f,x和y的横向边界具有Dirichlet边界条件(u = 0),而Neumann边界条件(∂u⁄∂z = ug)用于上下边界,该方程(f和ug)的rhs和Neumann边界条件的数据都是来自数值实验的网格数据。在这个数值模型中,我的实际网格为301x301x22,水平分辨率为2km,垂直分辨率不一致,范围为0.08km至1km。

我一直对fenics中的网格与实际问题中的网格之间的连接感到困惑。我在fenics中设置的网格和间距是否应该与我的实际问题相同?如果是这样,如何在fenics中设置非均匀网格(我曾经像我的示例一样尝试过网格映射)?

例如,简化我的问题,我的代码中有网格数据f和ug,其水平分辨率为2km,垂直高度为Z,我尝试创建这样的网格:

from dolfin import *
import numpy as np

# Create mesh and define function space
mesh = BoxMesh(Point(0.0, 0.0, 0.0), Point(10.0, 10.0, 5.0), 5, 5, 5)
Z = [0.02666,  0.10259,  0.22883,  0.41162,  0.65375,  0.95918] #vertical levels of my actual grid data(unit:km)
zz=[]
for vertex in vertices(mesh):
    z = vertex.x(2)
    zz.append(Z[int(z)])
mesh.coordinates()[:,2] = np.array(zz)
V = FunctionSpace(mesh, 'Lagrange', 1)                                                                                                           

#Define boundary conditions
u0 = Constant(0.0)
tol = 1E-14   # tolerance for coordinate comparisons
def Dirichlet_boundary(x):
    return abs(x[0]) < tol or abs(x[0] - 10) < tol or abs(x[1]) < tol or abs(x[1] - 10) < tol
bc = DirichletBC(V, u0, Dirichlet_boundary)

#my input data----RHS and neumann boundary condition of u
f=np.arange(6*6*6).reshape(6,6,6)
ug=np.arange(24,6*6*6+24).reshape(6,6,6)

#Expand 3D data into 1D according to mesh coordinate
f_ve = Function(V) 
d2v = dof_to_vertex_map(V)   
f_value=f.flatten()
f_ve.vector()[:]= f_value[d2v]
g_ve = Function(V)   
ug_value=ug.flatten()
g_ve.vector()[:]= ug_value[d2v]

# Define variational problem and Compute solution
u = TrialFunction(V)
v = TestFunction(V)
a = inner(nabla_grad(u), nabla_grad(v))*dx          
L = g_ve*v*ds - f_ve*v*dx  
u = Function(V)
solve(a == L, u, bc, solver_parameters={"linear_solver": "cg","preconditioner": "amg"})
print(u(2,3,Z[3]))

此代码可以正确运行。但是结果似乎不正确!那么我的网格物体生成或其他网格物体有什么问题吗?

如果您能帮助我,我将非常感谢。

Jean Chan

0 个答案:

没有答案