问题描述
我是 fenics 和 python 环境的初学者。请不要用力打我:)
我正在尝试同时求解具有两个速度的两个 PDE。在 fenics-tutorials 中已经存在类似的问题,但感兴趣的变量是标量(而不是向量)。所以我尝试为 VectorFunctionSpace 更改 MixedElement - 不幸的是它不起作用。
错误:NotImplementedError:无法获取非向量表达式的长度。
当我使用 FunctionSpace 而不是 VectorFunctionSpace 时,它不会将我的变量识别为向量而不是标量。这会导致 BoundaryCondition 和 DotProduct 出现问题。
# ----- minimal workspace -------
from mshr import *
from fenics import *
#Geometry mesh
mesh = RectangleMesh(Point(0.0,0.0),Point(2.2,0.41),21,21)
#discr. Elements
P1 = FiniteElement('P',triangle,1)
V1 = FiniteElement('P',2)
TH = MixedElement([V1,P1])
V = VectorFunctionSpace(mesh,TH,2)
# set Variable,split and Testfunc
v1,v2 = TestFunction(V)
u = Function(V)
u_n = Function(V)
u1,u2 = split(u)
u1_n,u2_n = split(u_n)
# set BC - no Slip
walls = 'near(x[1],0) || near(x[1],0.41)'
inflow = 'near(x[0],0)'
inflow_profile = ('4.0*1.5*x[1]*(0.41 - x[1]) / pow(0.41,2)','0')
bcu_inflow = DirichletBC(V.sub(1).collapse(),Expression(inflow_profile,degree=2),inflow)
bcu_walls = DirichletBC(V.sub(1).collapse(),Constant((0,0)),walls)
bcu = [bcu_inflow,bcu_walls]
#coupled PDE
F1 = dot( (u1 - u1_n)/k,v1)*dx \
+ dot( dot( u1_n,nabla_grad(u1) ),v1)*dx \
+ dot( u1 - u2,v1)*dx\
+ dot( (u2 - u2_n)/k,v1)*dx \
+ dot( dot( u2_n,nabla_grad(u2) ),v2)*dx \
+ dot( u2 - u1,v2)*dx
# loop for calculating
t = 0
for n in range(num_steps):
solve(F1 == 0,u,bcu)
感谢您对本主题的任何帮助和讨论。我也希望这个最小的工作空间足以理解我的问题。
干杯和新年快乐 - 在 PDE 中迎接新的挑战!
乔
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)