计算每个单元格最长边的长度

计算科学 Python 芬尼克斯
2021-11-30 06:12:33

mesh = UnitSquareMesh(2, 2)
Q = FunctionSpace(mesh, 'DG', 0)

这按预期工作

R = mesh.ufl_cell().circumradius
R = project(R, Q)

但这失败了

h = mesh.ufl_cell().max_facet_edge_length
h = project(h, Q)

编译生成的代码时出现错误:未声明“facet_area”...

max_facet_edge_length 是否像我预期的那样返回单元格最长边的长度,还是做其他事情?如果是这样,是否有一些实现?或者我应该遍历单元格及其边缘以手动计算 h 吗?

1个回答

好吧,一个单元格的最长边的长度 h可以用 Python 计算——即效率不高

h = Function(Q)
for c in cells(mesh):
    h.vector()[c.index()] = max(e.length() for e in edges(c))

为了澄清

mesh.ufl_cell().max_facet_edge_length

定义可以在刻面上评估的刻面直径(最长边的长度)。例如,内部惩罚稳定可以通过这种方式实现

h_F = mesh.ufl_cell().max_facet_edge_length
n = FacetNormal(mesh)
alpha = Constant(0.01)
F += alpha('+')*h_F**2*inner(jump(grad(u), n), jump(grad(v), n))*dS

u为稳定量,这里v取其测试函数和alpha稳定参数为常数。但是对于以对流为主的问题,例如可以用对流速度进行缩放。http://dx.doi.org/10.1090/S0025-5718-07-01951-5http://dx.doi.org/10.1007/s00211-007-0070-5