2d-mini element-can't use sub(0), but bubble element is ok

计算科学 Python 芬尼克斯
2021-12-08 18:26:51

我的程序(在 Python 中,使用 FEniCS):

mesh=UnitSquareMesh(16,16)
U_h = VectorFunctionSpace(mesh, "Lagrange", 1)
B = VectorFunctionSpace(mesh, "Bubble", degree=3,dim=2)
Mini_h = U_h + B

边界定义(例如u0_boundaryu1_boundary分别是正方形的一部分):

w0 = Constant("0.0")
bc0 = DirichletBC(Mini_h.sub(0), w0, u0_boundary) #error
bc1 = DirichletBC(Mini_h.sub(1), w0, u1_boundary)

我得到:ValueError: Can only extract SubSpaces with i = 0 ... -1

谁能告诉我为什么?Mini_h.sub(0)是 的第一个组成部分Mini_h

实际上,问题只是矢量气泡元素,一切正常。例如:

B = VectorFunctionSpace(mesh, "Bubble", degree=3,dim=2)
bc0 = DirichletBC(B.sub(0), w0, u0_boundary)
bc1 = DirichletBC(B.sub(1), w0, u1_boundary)

另外,我想知道为什么不能直接加一个mini有限元,而不是CG+Bubble。

4个回答

如果您想要混合丰富的元素而不是丰富的混合元素,则可以以这种替代方式定义 Mini 元素:

U = FunctionSpace(mesh, "Lagrange", 1)
B = FunctionSpace(mesh, "Bubble", 3)
M = U + B
Mini_h = MixedFunctionSpace([M, M])

MINI 元素的向量部分不是混合函数空间,这就是为什么不能从中提取子空间的原因。气泡是一种丰富(+在您的Mini_h.

UFL 论文的第 2.3 节讨论了混合空间和丰富空间之间的区别:

http://arxiv.org/abs/1211.4047

你有两个选择:

这个问题已经解决了,谢谢大家!

U = FunctionSpace(mesh, "Lagrange", 1)
B = FunctionSpace(mesh, "Bubble", 3)
Q = FunctionSpace(mesh, "DG", 1)
M = (U + B)*(U + B)
Mixed_h = MixedFunctionSpace([M,Q])

这次我们可以使用 Mixed_h.sub(0).sub(0)。