FEniCS:导入网格以及材料和边界数据

计算科学 有限元 芬尼克斯
2021-12-15 16:38:55

将在提供子域和边界标记的外部生成器中生成的网格导入 FEniCS (python) 程序的首选方法是什么?我为此目的使用了 MeshData->MeshFunctions,但是切换到并行 mpi 程序我发现这些 MeshFunctions 没有转移到 mpi 进程使用的部分网格。MeshFunctions 似乎不再受支持 - 有什么替代方案?

使用几何信息来恢复子域对我来说非常不方便。

我正在使用我自己的 (diffpack)grid 到 xml 转换器,该转换器当前正在创建两个具有子域和边界信息的 MeshFunction。从单进程代码中读取这样的 xml Mesh 文件,我能够获取和使用这些 MeshFunction。但是,当从 mpi 代码中读取相同的网格时,它会被划分为子网格,并且 MeshFunction 在此阶段会丢失。我的问题是我是否可以创建一个 xml 网格文件,其中包含在网格细分期间不会丢失的数据。

2个回答

这些问题取决于您用来生成外部网格的程序。Dolfin 提供了dolfin-convert将外部网格转换为 dolfin 网格的脚本。根据您转换的格式,您可以获得网格内边界条件的不同表示,因为并非所有格式都已更新为最新的存储格式。正如您所指出的,MeshFunctions存储在 Mesh.data 中不再是首选的存储格式。

如果您能够以diffpack(.grid) 格式保存您的网格,我知道管道应该会进行相当的更新。然后,您应该能够通过以下方式访问域:

mesh.domains().facet_domains()
mesh.domains().cell_domains()

但是,此语法在开发版本中已更改,您需要在其中显式创建MeshFunction

dim = mesh.topology().dim()
facet_domains = MeshFunction("size_t", mesh, dim-1, mesh.domains())
cell_domains = MeshFunction("size_t", mesh, dim, mesh.domains())

请注意,没有标记的网格实体将获得数据类型的最大数量。

我发现 MeshFunctions 需要存储在单独的文件中,但现在我得到“不支持并行读取旧式 XML MeshFunctions。考虑使用新格式” - 将搜索这种新格式的规范. 编程 FEniCS 绝对令人兴奋,但代码的一些稳定性可能会很好;-)