左侧为模型文件,没有结果信息。右侧是加入结果信息后的效果
这个脚本的核心功能是:基于现有模型H3D文件,创建包含多工况结果的新H3D文件。具体流程如下:
复 制只有模型的H3D文件作为结果文件
定义要操作的节点和单元集 合
创建不同的数据层(Layers)
定义各种数据类型(标量、矢量、张量等)
创建两个分析工况(Subcases)
生成模拟结果数据并写入H3D文件
关闭文件
clearall; closeall; clc;
cd(fileparts(omlfilename('fullpath')));
清空工作区、关闭所有图形窗口、清空命令行
将当前目录设置为脚本所在目录(omlfilename('fullpath')
获取当前脚本完整路径)
modelFile = 'model.h3d';
resultFile = 'multiple_subcase_example.h3d';
delete(resultFile);
copyfile(modelFile, resultFile, 'f');
删除可能已存在的结果文件(避免冲突)
将模型文件复 制为结果文件('f'表示强制覆盖)
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单元索引)
idx = createh3dfile(resultFile, 'append');
以追加模式打开H3D文件
idx
是文件句柄,后续操作都需要它
lidx1 = createh3dlayer(idx, 'Layer 1');
lidx2 = createh3dlayer(idx, 'Layer 2');
lidx3 = createh3dlayer(idx, 'Layer 3');
创建三个数据层,用于组织不同类型的结果
每个层都有唯一ID(lidx1, lidx2, lidx3)
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种不同的数据类型:
节点标量(无层、无角点)
单元标量(所有层、带角点)
单元标量(指定层、无角点)
单元矢量(所有层、无角点)
单元矢量(所有层、带角点)
单元2D张量(所有层、无角点)
单元2D张量(所有层、带角点)
单元3D张量(无角点)
单元3D张量(带角点)
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个迭代步
scalar_nodes = lsnd; % size 1 x nbNodes
vector_nodes = repmat(lsnd, 3, 1); % size 3 x nbNodes (X, Y and Z)
tensor2D_nodes = repmat(lsnd, 3, 1); % size 3 x nbNodes (XX, YY, XY)
tensor3D_nodes = repmat(lsnd, 6, 1); % size 6 x nbNodes (XX, YY, ZZ, XY, YZ, ZX)
scalar_elems = ls2d;% size 1 x nbElems
vector_elems = repmat(ls2d, 3, 1);% size 3 x nbElems (X, Y and Z)
tensor2D_elems = repmat(ls2d, 3, 1); % size 3 x nbElems (XX, YY, XY)
tensor3D_elems = repmat(ls2d, 6, 1); % size 6 x nbElems (XX, YY, ZZ, XY, YZ, ZX)
scalar_elems_3D = ls3d;% size 1 x nbElems
vector_elems_3D = repmat(ls3d, 3, 1);% size 3 x nbElems (X, Y and Z)
tensor2D_elems_3D = repmat(ls3d, 3, 1);% size 3 x nbElems (XX, YY, XY)
tensor3D_elems_3D = repmat(ls3d, 6, 1);% size 6 x nbElems (XX, YY, ZZ, XY, YZ, ZX)
scalar_elems_corner = repmat(ls3d, 1, 8);% size 1 x nbElems
vector_elems_corner = repmat(ls3d, 3, 8);% size 3 x nbElems (X, Y and Z)
tensor2D_elems_corner = repmat(ls3d, 3, 8);% size 3 x nbElems (XX, YY, XY)
tensor3D_elems_corner = repmat(ls3d, 6, 8);% size 6 x nbElems(XX, YY, ZZ, XY, YZ, ZX)
生成各种类型的结果数据:
节点数据:标量、矢量、2D/3D张量
单元数据:标量、矢量、2D/3D张量
带角点的单元数据
使用repmat
复制数据来模拟真实结果
writeh3ddata(idx, sidx1 , 1 , tidx1 , 0, 0, nodes, scalar_nodes);
writeh3ddata(idx, sidx2 , 2 , tidx2 ,lidx1, 0, elems3D, scalar_elems_3D);
writeh3ddata(idx, sidx2 , 2 , tidx2 ,lidx1, 1, elems3D, scalar_elems_corner);
writeh3ddata(idx, sidx2 , 2 , tidx2 ,lidx2, 0, elems3D, scalar_elems_3D*2);
writeh3ddata(idx, sidx2 , 2 , tidx2 ,lidx2, 1, elems3D, scalar_elems_corner*2);
writeh3ddata(idx, sidx2 , 2 , tidx2 ,lidx3, 0, elems3D, scalar_elems_3D*3);
writeh3ddata(idx, sidx2 , 2 , tidx2 ,lidx3, 1, elems3D, scalar_elems_corner*3);
将生成的数据写入H3D文件
参数说明:
idx
:文件句柄
sidx
:工况ID
第3个参数:迭代步ID
tidx
:数据类型ID
lidx
:层ID(0表示无层)
第6个参数:角点标志(0=无角点,1=有角点)
实体ID数组
结果数据数组
closeh3dfile(idx);
完成所有写入操作后关闭文件
性能考虑:
大批量写入数据时,建议先组织好所有数据再一次性写入
避免频繁打开/关闭H3D文件
错误处理:
添加检查确保实体ID在模型中存在
验证数据维度与数据类型匹配
扩展应用:
可以读取实际CAE分析结果,处理后写入H3D
用于创建自定义后处理结果
调试技巧:
先用小规模数据测试
在HyperWorks中检查生成的H3D文件
这个脚本展示了H3D API的基本用法,实际工程中可以基于此开发更复杂的结果处理工具,比如多工况结果对比、自定义指标计算等。