为单个HDF5编写xmf的Python代码,其中包含要在Paraview、Visi中可视化的时序数据

2024-06-25 23:56:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试使用XMF在Paraview中加载hdf5文件。这是一个大数据可视化的范例,使用hdf作为存储,xmf作为元数据链接器,通过paraview、visit等大数据可视化软件读取hdf文件。在

在hdf5文件中,有一系列张量数据被命名为stress_0,stress_1。。。。。如此类推直到压力达到100。单个数据集包含64*64*64*6个数据点。在

现在,我想在Paraview中用顺序张量数据stress_I制作N步动画。具体来说,我想加载stress_0,从Paraview获得一个图像帧,然后加载stress_1,得到一个图像框,依此类推。在

实现这一点的一般过程是使用XDMF编写XMF。但是我不知道如何去做这个例子here。在

访问社区之前可能会遇到这样的问题。他们的一个讨论thread解释了一点,但不多。在

  1. 有没有可能使用python提供的hdf5文件以及它包含的数组的所有元数据来生成这个xmf?我相信可以。但不知道它的包装。欢迎提出任何建议。在

Tags: 文件数据图像可视化visithdf5hdfstress
2条回答

最后,我通过以下我前面提到的几个链接来解决这个问题。python文件是这样的

from __future__ import division
import numpy as np

# using h5py
#import h5py as h5pi

#test = h5pi.File('name_of_h5.h5',mode='r',driver='core')
#test.keys()[:] # this contains all the data files' name inside hdf5

# defining the grid
Nx,Ny,Nz =64, 64, 64

# Total time steps
tEnd = 5000

# Data dumping step
nOutput = 10

# Not taking initial points
waittime = 3400

filename = 'Name_of_h5.xmf'
f = open(filename, 'w')

# Header for xml file
f.write('''<?xml version="1.0" ?>
<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" []>
<Xdmf Version="2.0">
<Domain>
<Grid Name="Box" GridType="Collection" CollectionType="Temporal">
''')

# loop over the attributes name written using time
t = 0
frameN = 0 # For time sequence 
while t <= tEnd :
    t = t + 1; 
    if( np.mod(t, nOutput) == 0 and t > waititme):

        # Naming datasets 
        dataSetName1 = 'Name_of_h5.h5:/S_%.8d'%(t)
        dataSetName2 = 'Name_of_h5.h5:/V_%.8d'%(t)

        # at individual time write the time independent Box grid. is it overdoing?
        f.write('''
        <!  time step  >
        <Grid Name="Box %d" GridType="Uniform"> # 
        <Topology TopologyType="3DCoRectMesh" Dimensions="%d %d %d"/>
        <Geometry GeometryType="ORIGIN_DXDYDZ">
           <DataItem DataType="Float" Dimensions="3" Format="XML">0.0 0.0 0.0</DataItem>
           <DataItem DataType="Float" Dimensions="3" Format="XML">1.0 1.0 1.0</DataItem>
        </Geometry>
        <Time Value="%d" />
        '''%(frameN, Nx, Ny, Nz, frameN))

        # First Attribute
        f.write('''\n
        <Attribute Name="S" AttributeType="Scalar" Center="Node">
        <DataItem Dimensions="%d %d %d" NumberType="Float" Precision="4"
        Format="HDF">%s
        </DataItem>
        </Attribute>
        '''%(Nx, Ny, Nz, dataSetName1))

        # Second Attribute
        f.write('''\n
        <Attribute Name="N" AttributeType="Vector" Center="Node">
        <DataItem Dimensions="%d %d %d 3" NumberType="Float" Precision="4"
        Format="HDF"> %s
        </DataItem>
        </Attribute>
        </Grid>\n'''%(Nx, Ny, Nz, dataSetName2))
        frameN +=1

# End the xmf file
f.write('''
   </Grid>
</Domain>
</Xdmf>
''')

仅供参考,总是有meshio(我的一个项目),它还支持读/写XDMF文件。在

相关问题 更多 >