FiPy 中的面部变量

FaceVariables in FiPy

我在 FiPy 的帮助下对通过各种结构的电流进行建模。为此,我求解拉普拉斯方程的电势。然后,我使用欧姆定律推导场并借助电导率获得电流密度。

FiPy 将势存储为以单元为中心的变量,并将其梯度存储为以面为中心的变量,这对我来说很有意义。我有两个关于以脸为中心的变量的问题:

  1. 如果我遇到二维或三维问题,FiPy 会计算所有方向(ddx、ddy、ddz)的梯度。渐变是一个 FaceVariable,它始终在两个单元格中心之间的面上定义。对于结构化(四边形)网格,只有一个导数应该大于零,因为对于任何面,所涉及的两个单元中心的位置应该只在一个坐标上不同。然而,在我的模拟中,经常出现不止一个导数(ddx、ddy、ddz)大于零,即使对于结构化网格也是如此。
    该手册对 FaceGrad-Method 给出了以下解释: Return gradient(phi) 作为 rank-1 FaceVariable,对法线方向使用差分(二阶梯度)。
    我看不出,这与我上面指出的理解有何不同。
    是什么让它变得更加成问题:每当包含 "too many" 个导数时,即使在我建模的最简单的结构中,电流似乎也不守恒...

  2. 有没有巧妙的方法来访问存储在以面为中心的变量中的数据?假设我想计算通过我的建模结构的电流。
    截至目前,我将存储在 FaceVariable 中的数据保存为 tsv 文件。这会产生具有 (x,y,z) 位置和 (ddx, ddy, ddz) 值的 table。我读取文件并将数据保存到数组中以在 Python 中使用它。这似乎违反直觉,而且确实很不方便。如果能够沿某些平面或某些点访问 FaceVariable 会好很多。

  1. 文档没有说清楚,但 .faceGrad 包括切向分量,它不仅仅考虑相邻像元中心值。 请参阅 this Jupyter notebook for explicit expressions for the different types of gradients that FiPy can calculate (yes, this stuff should go into the documentation: #560).

  2. 可以使用 myFaceVar.value 访问该值,使用 myFaceVar.mesh.faceCenters 可以访问坐标。 FiPy 是围绕非结构化网格设计的,因此采用任意切片并非易事。 CellVariable 个对象通过调用 myCellVar((xs, ys, zs)) 支持插值,但 FaceVariable 个对象不支持。见 .