如何在 FEniCS (dolfin) 中使用 MeshFunction?

计算科学 pde Python 芬尼克斯
2021-11-26 23:20:55

我是 FEniCS 的初学者,但仍在努力学习一些基础知识。具体来说,
我在执行 Langtangen-Logg 书中解决 PDEs in Python - The FEniCS Tutorial Volume I 中的教程时遇到了一些问题。我认为有些问题是由于本书的不同版本和我的安装(2019.1.0)造成的。

问题之一是使用MeshFunctionor CellFunction,FacetFunction等。

示例(第 90 页的 4.3.2)说:

materials = CellFunction(’size_t’, mesh)

这对我不起作用。经过一些研究,我发现CellFunction自 2017.2.0 起已弃用:
Deprecate VertexFunction、EdgeFunction、FaceFunction、FacetFunction、CellFunction;改用 MeshFunction

我得到了这个例子来进行一些试验和错误(至少看起来它正在工作):

materials = MeshFunction('size_t', mesh, 2)

但我真的不明白如何以及为什么。特别是在尝试下一个使用FacetFunction.

2017.2.0文档并没有过多说明如何使用MeshFunction. 参数的描述是dim (unsigned int)
MeshFunction 的拓扑维度。可选的。

的描述CellFunction只是:
在给定的网格上创建拓扑码为 0 的 MeshFunction。
For FacetFunction
在给定网格上创建拓扑余维 1 的 MeshFunction。

它不适用于materials = MeshFunction('size_t', mesh, 0). 我认为在“CellFunction”的情况下,codimension 0可能意味着0用于dim参数。

因此,我的问题是:

  1. “codimension”是指dim论点吗?
  2. 在这种情况下,“拓扑维度”和“拓扑余维度”是什么意思?
  3. 如果我应该使用MeshFunction而不是上面提到的所有其他函数,那么将 MeshFunction 用于单元格与将其用于构面等有何不同?

PS:我知道Fenics: Meshfunction usage的问题,但它并没有真正回答我的问题

2个回答

不同的专用VertexFunction, EdgeFunction, FaceFunction, FacetFunction,CellFunction确实已被弃用,并且(至少)从 2018.2 版本开始已被删除。相反,它们已被合并到一个通用目的MeshFunction中,该目的将定义它们的网格对象类型作为(强制性)参数,称为“拓扑维度”。

为了理解放在那里的内容,强调几何对象(点、线、多边形、多面体)和拓扑对象(顶点、边、面、单元)之间的差异可能会有所帮助——而前者具有相同的维度(基本上根据定义)无论环境空间的定义是什么(“nD”中的“n”),后者都不是,因为它们取决于它们在形成网格时所扮演的角色。相反,它们的区别在于codimension,即“n 减去几何尺寸”(它们与“完整空间”的距离):

  • 细胞有(根据定义)codimension 0
  • 刻面具有(根据定义)codimension 1(单元格的边界)
  • 有(根据定义)codimension n-1
  • 顶点有(根据定义)codimension n(边的边界)

例如,在 1D 中,一条线(几何维度 1)是一个单元(codimension 0=1-1),而在 2D 中它是一个 facet(codimension 1=2-1)(这些可以重叠:在 2D 中,边和 facet 是相同;在 1D 中,刻面和顶点是(而边缘没有意义)。)


回到 FEniCS:正如上面试图说明的那样,网格对象是由它们的 codimension 描述然而,MeshFunction采用实际(几何)尺寸,通过简单的算术是“n减去codimension”。要以与维度无关的方式编写此代码,可以使用函数 `mesh.topology().dim() 例如,标记

  • 细胞, 使用MeshFunction('size_t',mesh,mesh.topology().dim())
  • 方面, 使用MeshFunction('size_t',mesh,mesh.topology().dim()-1)
  • 边缘,使用MeshFunction('size_t',mesh,1)
  • 顶点,使用MeshFunction('size_t',mesh,0)

免责声明:这对2018.12019.1版本有效。

如果您使用的是最新版本的 FEniCS,则网格工具已被弃用,正如您所注意到的。这些工具现在在mshr模块下。您可以通过终端安装它:conda install -c conda-forge mshr

此外,如果您想转换网格,dolfin-convert也已弃用。这些功能现在捆绑在meshio模块中。相似地:conda install -c kayarre meshio

这两种情况下的用法应该与旧 dolfin/FEniCS 文档中描述的相似。