简单的 FEniCS 问题形状不匹配

计算科学 pde 芬尼克斯
2021-12-23 16:28:53

伦敦帝国理工学院的这个演讲有一个很好的例子,在第 8 页,Burgers Equations。他们的代码的第一部分是这样的:

from dolfin import*

n = 30
mesh = UnitInterval(n)
V = FunctionSpace(mesh, "CG",2)
ic = project(Expression("sin(2*pi*x[0])"), V)
u = Function(ic)
u_next = Function(V)
v= TestFunction(V)
nu = Constant(0.0001)
timestep = Constant(1.0/n)

F1 = ((u_next - u)/timestep*v)*dx
F2 = (u_next*grad(u_next)*v)*dx
F3 = (nu*grad(v)*grad(u_next))*dx

在我的系统上,此代码失败,导致总和F2F3. 我不明白为什么。

4个回答

所以问题是 FEniCS 不能在一维中识别它,u并且grad(u)具有相同的形状。(您可以在Dolfin 问题跟踪器上提出有关此问题的问题。)

如果您替换graddiv,则您的代码有效。(无粘性 Burgers 方程的一般形式是。)div(u2)=f

如果您的域是一维的,您应该使用:

mesh = UnitIntervalMesh(10)

对于 x 方向的偏导数,请使用:

u.dx(0)

错误在行

a = inner(inner(nabla_grad(u),u),v)*dx

这里你取向量 nabla_grad(u) 和标量 u 之间的内积。那没有意义。

感谢所有提示和提示。所以经过一些dist-upgrading,调试,手动阅读,我终于让这个脚本运行起来了。我在这里包括我的解决方案,只是为了完整起见。请注意,此代码在一维中对无粘性 Burgers 方程进行建模。

from dolfin import*

n = 100
mesh = UnitIntervalMesh(n)
#mesh = IntervalMesh(500,-1.,10.)
V = FunctionSpace(mesh,'CG',1)
u = Function(V)
u0 = Expression("1./(sqrt(2*pi)*0.1) * exp(-0.5*pow((x[0]-0.5),2)/0.01)")
u.interpolate(u0)

u_next = Function(V)
v = TestFunction(V)

nu = Constant(0.01)
timestep = Constant(0.01)

F = ((u_next-u)/timestep*v
     + inner(u_next.dx(0)*u_next, v))*dx
bc = DirichletBC(V, 0.0, "on_boundary")

t = 0.0
end =10
while(t <= end):
    solve(F==0, u_next, bc)
    u.assign(u_next)
    t+=float(timestep)
    plot(u)
interactive()