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


15

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

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

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


我发布这个问题是因为我花了大约一天半的时间才弄清楚答案。如果我昨天没找到它,我还是会在这里问这个问题。我有兴趣查看是否还有其他快速方法可以完成同一任务。
Geoff Oxberry 2013年

当您说“解析原始文本”时,您的意思是直接进入文件还是使用python解析器?
SAAD 2014年

当时,我的意思是手工编写一个Python解析器。
Geoff Oxberry 2014年

Answers:


16

我可以从具有相同结构化网格的不同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


4
永远不要忘记要拥有两个输入(inputs [0]和inputs [1]),在选择可编程滤波器之前,必须突出显示这两个数据集(将其称为参考链接)。
toliveira

3

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


1

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

将数据块从一个文件复制到另一个文件的步骤显然很麻烦,但这是我能想到的最好的选择。


1

我意识到这有点老了,但是我也许对VisIt解决方案感兴趣:

您可以在VisIt中使用称为基于连接的交叉网格字段表达式的方法来执行此操作。这很麻烦,但是基本上是在数据库(在您的情况下是VTK文件)之间映射字段的机制。

当文件之间的拓扑相同时(例如您的情况),将使用“基于连接性”(conn_cmfe)。

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

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

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

然后,您可以使用伪彩色图来绘制“ MyPhi_Diff”。

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

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

这是更多信息:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.