如何计算存储在具有相同结构的两个不同 VTK 文件中的两个字段之间的数值差异?

计算科学 可视化 VTK
2021-11-25 23:09:00

假设我有两个 VTK 文件,都是结构化网格格式。结构化网格是相同的(它们具有相同的点列表,顺序相同),并且在每个 VTK 文件中都有一个字段,称为“Phi”。我想再次使用相同的结构化网格创建第三个 VTK 文件,并绘制一个字段,该字段是第一个 VTK 文件中的 Phi 和第二个 VTK 文件中的 Phi 之间的差异。

我知道如何手动执行此操作;我可以解析两个 VTK 文件中的原始文本,将数据复制到数组中,从另一个数组中减去一个数组,然后以正确的格式将数据转储到一个新文件中。有没有更好的方法来计算这种差异并将其导出到 VTK?Python 或 VisIt 或 Paraview 等可视化软件中的解决方案比使用 C++ 等编译语言更可取。

计算这种差异的目的是比较计算 PDE 解的不同数值方法;因为我使用相同的软件来生成解决方案,所以我可以保证除了字段 Phi 之外的所有数据在我生成的每个文件中都是相同的。

4个回答

我能找到从具有相同结构化网格的不同 VTK 文件中减去两个字段的最简单方法是使用 Paraview 中的可编程过滤器,它允许您使用 Python 脚本操作数据。

在可编程滤波器对话框中,您可以将两个数组相减并使用代码写入输出:

   phi_0 = inputs[0].CellData['Phi']
   phi_1 = inputs[1].CellData['Phi']
   output.CellData.append(phi_1 - phi_0, 'difference')

在这种情况下,字段 Phi 恰好是单元格数据。如果您的字段是点数据,请将CellData脚本中的所有位置替换为PointData. 有关详细信息,请参阅http://public.kitware.com/pipermail/paraview/2010-April/016667.html

在 ParaView 中有可用于此的附加属性过滤器。它要求数据集中有相同数量的点才能正确附加点数据,并且数据集中有相同数量的单元格才能正确附加单元数据。尽管使用相同名称的数组(即您的示例中的 Phi),但它会出现问题。在使用附加属性过滤器之前,您可以使用计算器过滤器轻松复制该数组。然后你可以使用另一个计算器过滤器来做减法。不过,这可能比使用 ParaView 的 Python 可编程过滤器效率低。除此之外,您可以使用 vtkpython 可执行文件手动执行此操作,因为您可以直接访问网格及其属性。

我没有特别好的方法,但我会将“phi”字段从一个 VTK 文件复制到另一个文件中,并将其命名为“phiprime”或其他名称。在 Paraview 和 Visit 中,您可以选择通过使用其他字段值的公式来定义新字段。然后,您可以在字段编辑器中将字段“error”定义为“error=phi-phiprime”,并将此字段“error”绘制为曲面、等高线图或您感兴趣的任何内容。

将数据块从一个文件复制到另一个文件的步骤显然很尴尬,但这是我能想到的最好的方法。

我意识到这有点老了,但我认为您可能对 VisIt 解决方案感兴趣:

您可以在 VisIt 中使用称为 Connectively Based Cross Mesh Field Expression 的东西来做到这一点。这是一口,但基本上是在数据库之间映射字段的机器(在您的情况下是VTK文件)。

当文件之间的拓扑相同时使用“基于连接”(conn_cmfe) - 就像您的情况一样。

还有一个“基于位置”(pos_cmfe),它在具有不同拓扑的网格之间进行采样。

对于您的情况,打开第一个文件并使用“表达式”窗口定义表达式 (MyPhi_Diff):

Phi - conn_cmfe(<file2.vtk:Phi>, mesh)

然后你可以用伪彩色图绘制“MyPhi_Diff”。

您还可以使用向导来帮助定义表达式

(选项菜单->“数据级别比较”)

这是更多信息:

http://visitusers.org/index.php?title=Cmfe