h5文件新增应力数据未在关联xdmf及Paraview中显示问题
问题原因
你遇到的加载失败问题核心有3个:
- 最核心原因:未同步更新XDMF索引文件。XDMF作为轻量描述文件,会写死所有需要加载的数据集路径、维度、数据类型、关联网格位置,Paraview加载XDMF配套的H5文件时,只会读取XDMF中明确声明的字段,不会主动扫描H5内新增的内容,因此你写入的新数据完全不会被Paraview感知。
- 代码存在数组引用bug:你写的
t_princ = e_princ是numpy数组的引用赋值,没有为真应力数组独立开辟内存,后续给t_princ赋值时会直接覆盖之前写入的工程应力数据,最终两个数据集存储的内容完全一致,全为真应力值。 - 新增数据集缺少必要元数据属性:你观察到的属性数量差异是因为原始数据集带的5个属性是HEDM数据格式约定的元数据(包含数据类型标识、分量说明、关联网格层级等信息),Paraview或其他HEDM处理工具读取时会依赖这些属性识别数据结构,缺失会导致数据识别异常。
修复步骤
- 修正数据写入代码,解决数组覆盖问题,同时补全必要属性
import h5py import numpy as np from tqdm import tqdm nf_product = h5py.File(filename,"a") e_princ = np.empty((280,150,280,3), dtype=np.float32) # 独立创建真应力数组,避免和工程应力共用内存 t_princ = np.empty_like(e_princ) for i in tqdm(range(grain_count)): a = np.where(feature_ID == i+1) e_princ[a,0] = eng_stress[i,0] e_princ[a,1] = eng_stress[i,1] e_princ[a,2] = eng_stress[i,2] t_princ[a,0] = true_stress[i,0] t_princ[a,1] = true_stress[i,1] t_princ[a,2] = true_stress[i,2] EngineeringStress = nf_product.create_dataset( 'DataContainers/nfHEDM/CellData/EngineeringStressPrinciple', data=e_princ ) TrueStress = nf_product.create_dataset( 'DataContainers/nfHEDM/CellData/TrueStressPrinciple', data=t_princ ) # 复制原有同位置数据集的属性作为模板,保证元数据格式一致 ref_dataset = nf_product['DataContainers/nfHEDM/CellData/FeatureIds'] for attr_name in ref_dataset.attrs.keys(): EngineeringStress.attrs[attr_name] = ref_dataset.attrs[attr_name] TrueStress.attrs[attr_name] = ref_dataset.attrs[attr_name] # 补充矢量分量说明 EngineeringStress.attrs['ComponentNames'] = np.array(['Sigma1', 'Sigma2', 'Sigma3'], dtype='S') TrueStress.attrs['ComponentNames'] = np.array(['Sigma1', 'Sigma2', 'Sigma3'], dtype='S') nf_product.close()
- 修改配套XDMF文件,新增两个应力字段的声明
找到XDMF文件中定义nfHEDM网格下CellData的段落,和原有FeatureIds等字段平级,新增两个矢量字段的定义,示例如下:
<!-- 原有FeatureIds等字段保持不动 --> <Attribute Name="EngineeringStressPrinciple" AttributeType="Vector" Center="Cell"> <DataItem Dimensions="280 150 280 3" NumberType="Float32" Format="HDF"> 替换为你的h5文件名.h5:/DataContainers/nfHEDM/CellData/EngineeringStressPrinciple </DataItem> </Attribute> <Attribute Name="TrueStressPrinciple" AttributeType="Vector" Center="Cell"> <DataItem Dimensions="280 150 280 3" NumberType="Float32" Format="HDF"> 替换为你的h5文件名.h5:/DataContainers/nfHEDM/CellData/TrueStressPrinciple </DataItem> </Attribute>
注意配置项必须和H5内数据完全匹配:维度顺序、数据类型(Float32对应你写入的np.float32)、H5内路径不能写错,因为是3个主应力分量,AttributeType固定填Vector。
- 重新加载验证
清除Paraview的原有文件缓存,加载修改后的XDMF文件,即可在CellData变量列表中找到新增的两个应力字段,直接选择即可完成颜色映射。
补充:如果不想修改XDMF,也可以直接在Paraview中选择加载H5文件内的对应数据集,但这种方式不会自动关联原有晶粒网格结构,无法和已有的特征ID可视化结果对齐,不推荐使用。
内容的提问来源于stack exchange,提问作者Eve Knife
相关产品推荐
相关产品推荐

