使用Python和tvtk将数据保存到VTK中,包含多个向量场

5

我正在尝试保存与同一结构网格相对应的三组矢量量(速度、湍流强度和速度波动标准差)。理想情况下,我希望它们成为同一个vtk文件的一部分,但到目前为止,我只能将其中一组保存到文件中,如下所示:

sg = tvtk.StructuredGrid(dimensions=x.shape, points=pts)
sg.point_data.vectors = U
sg.point_data.vectors.name = 'U'
write_data(sg, 'vtktestWake.vtk')

我花了几个小时搜索如何添加多个向量或标量场的示例,但失败了,所以想在这里问问。任何指导将不胜感激。

谢谢,

Artur


能否将每个字段保存到单独的文件中,然后在需要时将它们组合在一起,甚至可以在 ParaView 或类似软件中进行? - Aleksander Lidtke
我不知道在paraview中是否有一种方法可以做到这一点,我会去看看。不过,我认为应该有更直接的方法... - Artur
1
我相当确定这是不可能的。你也许可以将正确的信息存储为对比点和细胞数据,但这种方法很笨拙,不能同时可视化(据我所知),而且无法帮助存储任意数量的向量。还有其他文件格式可能更有用,可以保存vtk场景或摄像机的当前状态。您能否提供更多关于您正在尝试做什么的详细信息? - aestrivex
感谢您的回复。在我使用的CFD程序中,数据是通过paraview格式可视化的,一个案例文件可以导入多个字段的数据。因此,我认为vtk对象可以容纳多个矢量和/或标量场。因此,我的想法是将我感兴趣的所有三个场存储在同一个vtk文件中。如果您说这不可能,那我就会制作3个单独的vtk文件,每个数量一个文件。我想应该同样有效。 - Artur
实际上,vtk文件格式允许保存每个点和单元格的多个点数据或单元格数据 - 我经常使用它!只是一个问题,tvtk写入器是否允许这样做。 - Jakob
谢谢你的评论Jakob。我也认为这是可能的,因为我每天都在使用它。唯一的问题是如何(或是否)可以用Python以某种方式完成,而不必重写内置函数(这只是我的一个小项目的一部分,所以我没有时间去做那些)。 - Artur
1个回答

5

经过一番搜索,我找到了以下解决方案,基于这个这个示例。您需要使用add_array方法添加附加数据字段,请参见:

from tvtk.api import tvtk, write_data
import numpy as np

data = np.random.random((3,3,3))
data2 = np.random.random((3,3,3))

i = tvtk.ImageData(spacing=(1, 1, 1), origin=(0, 0, 0))
i.point_data.scalars = data.ravel()
i.point_data.scalars.name = 'scalars'
i.dimensions = data.shape
# add second point data field
i.point_data.add_array(data2.ravel())
i.point_data.get_array(1).name = 'field2'
i.point_data.update()

write_data(i, 'vtktest.vtk')

嗨,抱歉回复晚了,但我上周末非常忙碌。我刚刚测试了你的解决方案,它运行得非常出色!非常感谢你的帮助!祝安好 - Artur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接