【问题标题】:FaceVariables in FiPyFiPy 中的人脸变量
【发布时间】:2018-02-17 01:15:52
【问题描述】:

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

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

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

  2. 有没有一种聪明的方法可以访问存储在 face-centered 变量中的数据?假设我想计算通过我的建模结构的电流。
    截至目前,我将存储在 FaceVariable 中的数据保存为 tsv 文件。这会产生一个包含 (x,y,z) 位置和 (ddx, ddy, ddz) 值的表。我读取文件并将数据保存到数组中以在 Python 中使用它。这似乎违反直觉,真的很不方便。能够沿某些平面或某些点访问 FaceVariable 会好很多。

【问题讨论】:

  • 您如何确定当前的连续性?
  • 我有两个外部面,其中 Dirichlet 边界条件,即施加电压。我计算通过这个边界的总电流和通过另一个边界流出的电流。有时这些值相差几个百分点,这不应该是这种情况......(这也适用于简单的几何形状,如二维矩形......)
  • 你是如何计算电流的?
  • 通过欧姆定律。电导率 x 梯度(电位)= 电流密度
  • 你用的是什么表达方式?正如我在回答中引用的 Jupyter 笔记本所示,您在计算此值时可能做出的每个选择都会产生影响。

标签: python simulation fipy


【解决方案1】:
  1. 文档没有说清楚,但.faceGrad 包括切向分量,这些分量不仅仅占相邻像元中心值。 请参阅this Jupyter notebook 了解 FiPy 可以计算的不同类型梯度的显式表达式(是的,这些内容应该进入文档:#560)。

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

【讨论】:

  • Jupyter notebook 是一个很好的资源。 FiPy 部分记录良好,部分记录不充分。关于 2:我原以为可以通过 x,y,z 坐标访问 faceVariable 数据,因为可以通过这种方式导出数据。但是,我会继续导出和重新导入。
  • 但是 FiPy 不会通过访问 x,y,z 坐标来导出数据。 FiPy 导出一个由 x、y、z 和 value 列组成的表。这就是我向你展示的如何获得。
猜你喜欢
  • 2021-10-03
  • 2014-08-20
  • 1970-01-01
  • 2021-09-03
  • 2012-08-27
  • 2014-09-11
  • 2020-11-30
  • 2011-01-08
  • 2021-01-11
相关资源
最近更新 更多