首页/文章/ 详情

通过代码如何读写altair的h3d文件

1天前浏览3
最近遇到的问题,需要对h3d文件进行修改,在通过软件操作是达到了目的,但是导出的h3d文件,只能包含一种datatype,这并不满足需求,所以需要另辟蹊径来处理。
两种办法,第一是通过后处理,讲结果提出来,写为文本文件,再配合hvtrans生成h3d文件,第二是基于compose生成,compose提供了完整的h3d文件读写的API。后者的工作量明显小很多,故选择基于Compose来进行操作。
下面是一个简单案例,这个OML脚本展示了如何使用Altair Compose中的H3D API来操作HyperWorks的H3D文件。作为经常跟H3D文件打交道的工程师,来看看创建的逻辑吧。

一、效果如图所示

左侧为模型文件,没有结果信息。右侧是加入结果信息后的效果

二、脚本整体逻辑

   这个脚本的核心功能是:基于现有模型H3D文件,创建包含多工况结果的新H3D文件。具体流程如下:

  1. 复 制只有模型的H3D文件作为结果文件

  2. 定义要操作的节点和单元集 合

  3. 创建不同的数据层(Layers)

  4. 定义各种数据类型(标量、矢量、张量等)

  5. 创建两个分析工况(Subcases)

  6. 生成模拟结果数据并写入H3D文件

  7. 关闭文件

三、逐段解析

1、初始设置

clearallcloseallclc;
cd(fileparts(omlfilename('fullpath')));
  • 清空工作区、关闭所有图形窗口、清空命令行

  • 将当前目录设置为脚本所在目录(omlfilename('fullpath')获取当前脚本完整路径)

2、文件准备

modelFile = 'model.h3d';
resultFile = 'multiple_subcase_example.h3d';
delete(resultFile); 
copyfile(modelFileresultFile'f');
  • 删除可能已存在的结果文件(避免冲突)

  • 将模型文件复 制为结果文件('f'表示强制覆盖)

3、实体定义

nodes = [2:33];
elems2D = [1:9];
elems3D = [10:18];
lsnd = [1:length(nodes)];
ls2d = [1:length(elems2D)];
ls3d = [1:length(elems3D)];
  • 定义节点ID范围:2到33

  • 定义2D单元ID范围:1到9

  • 定义3D单元ID范围:10到18

  • 创建对应的索引列表(lsnd=节点索引,ls2d=2D单元索引,ls3d=3D单元索引)

4、打开H3D文件

idx = createh3dfile(resultFile'append');
  • 以追加模式打开H3D文件

  • idx是文件句柄,后续操作都需要它

5、创建数据层(Layers)

lidx1 = createh3dlayer(idx'Layer 1');
lidx2 = createh3dlayer(idx'Layer 2');
lidx3 = createh3dlayer(idx'Layer 3');
  • 创建三个数据层,用于组织不同类型的结果

  • 每个层都有唯一ID(lidx1, lidx2, lidx3)

6、定义数据类型

tidx1  = createh3ddatatype(idx'DT scalar node:nolayer nocorner','scalar',   'node');
tidx2  = createh3ddatatype(idx'DT scalar elems:layer corner',   'scalar',   'elem''layers''all''corners');
tidx3  = createh3ddatatype(idx'DT scalar elems:layer nocorner''scalar',   'elem''layers', [lidx1,lidx2,lidx3]); % Equivalent  toto all
tidx4  = createh3ddatatype(idx'DT vector elem layer nocorner',  'vector',   'elem''layers''all'   );
tidx5  = createh3ddatatype(idx'DT vector elem layer corner',    'vector',   'elem''layers''all'   , 'corners');
tidx6 = createh3ddatatype(idx,  'DT 2Dtensor elem layer nocorner','2Dtensor''elem''layers''all'   );
tidx7 = createh3ddatatype(idx,  'DT 2Dtensor elem layer corner',  '2Dtensor''elem''layers''all'    , 'corners');
tidx8 = createh3ddatatype(idx,  'DT 3Dtensor elem nocorner',      '3Dtensor''elem''layers''all'   );
tidx9 = createh3ddatatype(idx,  'DT 3Dtensor elem corner',        '3Dtensor''elem''layers''all'    , 'corners');
  • 定义了9种不同的数据类型:

    1. 节点标量(无层、无角点)

    2. 单元标量(所有层、带角点)

    3. 单元标量(指定层、无角点)

    4. 单元矢量(所有层、无角点)

    5. 单元矢量(所有层、带角点)

    6. 单元2D张量(所有层、无角点)

    7. 单元2D张量(所有层、带角点)

    8. 单元3D张量(无角点)

    9. 单元3D张量(带角点)

7、创建分析工况(Subcases)

sidx1 = createh3dsubcase(idx'Subcase 1', {'SC1 Iteration 1'});
sidx2 = createh3dsubcase(idx'Subcase 2', {'SC2 Iteration 1''SC2 Iteration 2'});
  • 创建两个分析工况:

    • Subcase 1:包含1个迭代步

    • Subcase 2:包含2个迭代步

8、生成模拟结果数据

scalar_nodes =          lsnd;               % size 1 x nbNodes
vector_nodes =          repmat(lsnd31); % size 3 x nbNodes (X, Y and Z)
tensor2D_nodes =        repmat(lsnd31); % size 3 x nbNodes (XX, YY, XY)
tensor3D_nodes =        repmat(lsnd61); % size 6 x nbNodes (XX, YY, ZZ, XY, YZ, ZX)
scalar_elems =          ls2d;% size 1 x nbElems
vector_elems =          repmat(ls2d31);% size 3 x nbElems (X, Y and Z)
tensor2D_elems =        repmat(ls2d31); % size 3 x nbElems (XX, YY, XY)
tensor3D_elems =        repmat(ls2d61); % size 6 x nbElems (XX, YY, ZZ, XY, YZ, ZX)
scalar_elems_3D =       ls3d;% size 1 x nbElems
vector_elems_3D =       repmat(ls3d31);% size 3 x nbElems (X, Y and Z)
tensor2D_elems_3D =     repmat(ls3d31);% size 3 x nbElems (XX, YY, XY)
tensor3D_elems_3D =     repmat(ls3d61);% size 6 x nbElems (XX, YY, ZZ, XY, YZ, ZX)
scalar_elems_corner =   repmat(ls3d18);% size 1 x nbElems
vector_elems_corner =   repmat(ls3d38);% size 3 x nbElems (X, Y and Z)
tensor2D_elems_corner = repmat(ls3d38);% size 3 x nbElems (XX, YY, XY)
tensor3D_elems_corner = repmat(ls3d68);% size 6 x nbElems(XX, YY, ZZ, XY, YZ, ZX)
  • 生成各种类型的结果数据:

    • 节点数据:标量、矢量、2D/3D张量

    • 单元数据:标量、矢量、2D/3D张量

    • 带角点的单元数据

  • 使用repmat复制数据来模拟真实结果

9、写入数据到H3D文件

writeh3ddata(idxsidx1  , 1   , tidx1  ,    0,    0,     nodesscalar_nodes);
writeh3ddata(idxsidx2  , 2   , tidx2  ,lidx1,    0,   elems3Dscalar_elems_3D);
writeh3ddata(idxsidx2  , 2   , tidx2  ,lidx1,    1,   elems3Dscalar_elems_corner);
writeh3ddata(idxsidx2  , 2   , tidx2  ,lidx2,    0,   elems3Dscalar_elems_3D*2);
writeh3ddata(idxsidx2  , 2   , tidx2  ,lidx2,    1,   elems3Dscalar_elems_corner*2);
writeh3ddata(idxsidx2  , 2   , tidx2  ,lidx3,    0,   elems3Dscalar_elems_3D*3);
writeh3ddata(idxsidx2  , 2   , tidx2  ,lidx3,    1,   elems3Dscalar_elems_corner*3);
  • 将生成的数据写入H3D文件

  • 参数说明:

    • idx:文件句柄

    • sidx:工况ID

    • 第3个参数:迭代步ID

    • tidx:数据类型ID

    • lidx:层ID(0表示无层)

    • 第6个参数:角点标志(0=无角点,1=有角点)

    • 实体ID数组

    • 结果数据数组

10、关闭文件

closeh3dfile(idx);
  • 完成所有写入操作后关闭文件

四、实际应用中的注意事项

  1. 性能考虑

    • 大批量写入数据时,建议先组织好所有数据再一次性写入

    • 避免频繁打开/关闭H3D文件

  2. 错误处理

    • 添加检查确保实体ID在模型中存在

    • 验证数据维度与数据类型匹配

  3. 扩展应用

    • 可以读取实际CAE分析结果,处理后写入H3D

    • 用于创建自定义后处理结果

  4. 调试技巧

    • 先用小规模数据测试

    • 在HyperWorks中检查生成的H3D文件

   这个脚本展示了H3D API的基本用法,实际工程中可以基于此开发更复杂的结果处理工具,比如多工况结果对比、自定义指标计算等。

来源:TodayCAEer
Altair
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-06-11
最近编辑:1天前
TodayCAEer
本科 签名征集中
获赞 36粉丝 114文章 371课程 2
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈