FEniCS 中跨非边界线段的通量

计算科学 pde 有限元 芬尼克斯
2021-12-03 00:39:47

我正在解决矩形 [-1,1]x[-1,1] 子集上的椭圆边值问题。域包含线段 x=0,但是它不需要是边界的一部分,因此默认情况下它不与小平面对齐。

我想计算跨线段 x=0 的解函数的通量。我从教程中知道如何计算边界元素上的通量。但是,我不确定在这种情况下是否需要将线作为边界元素。我也不确定如何插入它,因为简单地将线插入网格会导致自由度发生冲突,就像天真地将矩形粘合在一起一样。你能就如何计算这个通量提供任何建议吗?

2个回答

确保网格与 x = 0 对齐。然后沿该线标记小平面并使用“内部小平面积分”计算通量。您可以通过提供一个构面函数来做到这一点,该函数markers(例如)用 标记这些构面,用 标记1其余构面0然后计算通量

line_segment = AutoSubDomain(lambda x: near(x[0], 0))
markers = FacetFunction("size_t", mesh)
markers.set_all(0)
line_segment.mark(markers, 1)
dS = dS[markers]
flux = assemble(<expression for flux>*dS(1))

如果您使用像 一样的内置网格RectangleMesh,则很容易确保网格与线段对齐。如果您使用外部网格生成器,它应该支持在网格化时尊重您的线段。

正如 Anders 所说,Dolfin 中的 CSG 功能很快就能处理这个问题。如果您现在想尝试一下,请在此处获取代码:https ://bitbucket.org/benjamik/dolfin并查看名为benjamik/csg-2d. 看看demo/undocumented/csg/2d/python/demo_csg_2d.py除此演示外,尚未记录该功能。

在将其合并到官方 dolfin 存储库之前,还有几个问题需要解决,但它们都不应该影响您的案例。