一千萬個為什麽

搜索

計算每個單元格最長邊的長度


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?

最佳答案

那麽,單元格最長邊的長度 h 可以通過pythonically計算 - 即效率不高

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 being stabilize quantity, v its test function and alpha stabilization parameter here taken as constant. But may be for example scaled with convecting velocity for convection-dominated problems. See http://dx.doi.org/10.1090/S0025-5718-07-01951-5 and http://dx.doi.org/10.1007/s00211-007-0070-5

轉載註明原文: 計算每個單元格最長邊的長度

猜你喜歡