我想计算,但在 FEniCS 中看不到真正有效的方法。我的第一个想法是为两个不同的网格组装(f*v*dx)。(try1,下面),但似乎我无法组合 1D 和 2D 网格,并且 DG 网格必须在每个方向上至少有 2 个基函数,我不确定网格拓扑如何 -> 基系数布局是可控的。
我的下一个想法是解决 du/dx = f 一侧的 BC 为零,在 x = 1 上累积积分。那个一直通过组装问题,然后因奇异矩阵异常而失败。
在 FEniCS 中是否有更好的方法来做到这一点?为了解决这个问题,我建议在 FEniCS 中添加通用卷积,这样可以通过适当的矩阵乘法来完成。 .
from dolfin import *
m = UnitSquareMesh(12, 12)
V = FunctionSpace(m, "Lagrange", 1)
f = Function(V)
f.interpolate(Expression("x[1]-x[0]")) # int_0^1 f dx = x[1] - 0.5
def try1():
m2 = UnitSquareMesh(1, 12)
V2 = FunctionSpace(m2, "DG", 0)
u = Function(V2)
print u.vector().array().shape
v = TestFunction(V2)
A = assemble(f*v*dx)
print A.array()*12.0
def try2():
du = TrialFunction(V)
v = TestFunction(VectorFunctionSpace(m, "Lagrange", 1))
bc = DirichletBC(V, Constant(0.0), lambda x,b: b and x[0] < 1e-8)
#bc2 = DirichletBC(V, Constant(0.0), lambda x,b: b and x[1] < 1e-8)
a = inner(grad(du), v)*dx
L = f*v[0]*dx
#L2 = f*v[1]*dx
u = Function(V)
solve(a == L, u, bcs=bc)
print u.vector().array()