
Altair OptiStruct™ 是 Altair HyperWorks 平台中的一款结构分析与优化求解器在汽车、航空航天、机械装备等行业应用非常广泛。很多初学者在第一次接触 OptiStruct 时最不习惯的就是它那套“卡片”式输入文件写法。明明是做有限元分析为什么还要像写配置一样去写卡片这些卡片到底起到什么作用如果不小心写错一个字段求解器又会给出什么样的提示这篇文章就围绕 OptiStruct 的卡片使用方法展开结合完整建模案例从卡片的基本概念、文件结构、常见卡片类型、实际建模流程到错误排查和工程建议一次性把“卡片”这件事讲清楚。无论你是刚接触 Altair 系列工具的学生还是从其他求解器转过来的工程师这篇文章都能帮你少走弯路。1. OptiStruct 卡片到底是什么1.1 卡片在 OptiStruct 中的角色在解释 OptiStruct 卡片之前先看一个最基础的问题OptiStruct 求解器是如何读取模型信息的OptiStruct 的输入文件通常是以.fem结尾的文本文件这个文件的本质是 Altair 求解器的“数据交换格式”。模型中的所有信息——节点、单元、材料、属性、载荷、边界条件、分析工况、输出请求等——都会以固定格式的文本记录写入这个文件。每一行或者每一个数据块就被称为一张“卡片”Card。如果以前接触过 Nastran会发现 OptiStruct 的卡片格式和 Nastran 的 Bulk Data 格式非常相似。实际上 OptiStruct 在设计时确实参考并兼容了很多 Nastran 的卡片写法这让很多有 Nastran 使用经验的工程师能很快上手。一张卡片通常由“卡片名称”和若干“字段”组成例如GRID 1 10.0 20.0 30.0这里GRID是卡片名称表示定义一个节点1是节点编号10.0、20.0、30.0分别是节点的 X、Y、Z 坐标。这就是一张最简单的卡片。1.2 为什么用卡片而不是图形界面很多初学者会问在 HyperMesh 里可以很直观地建网格、加约束、施加载荷为什么还要去理解底层卡片主要有三个原因第一卡片是模型的最终表达形式。不论你在 HyperMesh 的图形界面里操作得多熟练最后提交求解器计算的仍然是那个.fem文件。只有理解卡片才能真正理解你的模型“在求解器眼里是什么样子”。第二卡片是排查问题的关键。当求解失败、输出异常、载荷方向不对时光看图形界面往往看不出问题打开.fem文件检查卡片字段就会发现错误根源。第三卡片是参数化和优化工作的基础。在做 DOE 分析、参数优化、批量提交计算时脚本直接修改卡片字段比每次都重新打开图形界面要高效得多。1.3 卡片的分类方式从用途上来分OptiStruct 卡片大致可以分为以下几类分类典型卡片作用模型定义卡GRID、ELEMENT、CQUAD4、CTETRA定义节点和单元材料属性卡MAT1、MAT2、MATS1定义材料本构和参数单元属性卡PSHELL、PSOLID、PCOMP定义单元物理属性载荷与边界卡SPC、SPCD、LOAD、DLOAD、FORCE定义约束、载荷和加载方式工况控制卡SUBCASE、STEP、ANALYSIS定义分析类型和工况求解参数卡PARAM、OUTPUT、TITLE控制求解过程与输出这里需要特别注意的是OptiStruct 的输入文件分为两个区域SOL与BEGIN BULK之前的区域是求解控制区用来声明分析类型、输出请求等BEGIN BULK之后的数据区则是模型数据卡也就是上面说的各类卡片所在区域。2. 环境准备与版本说明2.1 软件环境要运行 OptiStruct 求解器需要安装 Altair HyperWorks 套件。通常包含以下几个组件HyperMesh前处理工具用于建模、网格划分、卡片编辑、提交计算。OptiStruct求解器本体负责执行有限元分析和优化计算。HyperView后处理工具用于查看位移、应力、应变等结果。如果你的工作流偏向命令行或者自动化也可以在安装 HyperWorks 之后直接在终端中调用optistruct命令提交求解。不同版本的 HyperWorks 界面和卡片选项会略有差异。本文中的示例以常见版本为例重点演示卡片书写思路和求解流程具体菜单名称和按钮位置请以你安装的版本为准。2.2 是否需要单独安装求解器不需要。OptiStruct 随 HyperWorks 套件一起安装。安装完成后可以在安装目录下找到optistruct.exeWindows或optistructLinux可执行文件。如果你只想测试卡片格式是否正确可以先不启动 HyperMesh直接用文本编辑器编写一个.fem文件然后通过命令行提交求解。下面是一个典型的命令行提交方式optistruct model.fem在提交之前请确保optistruct命令所在的目录已经加入系统环境变量否则需要写完整路径。2.3 示例文件结构为了方便后续讲解本文会围绕一个简单的静力分析示例展开。项目文件夹结构如下optistruct_card_demo/ ├── model.fem # OptiStruct 输入文件 ├── results/ # 求解结果输出目录 └── README.md # 说明文档实际项目中.fem文件是由 HyperMesh 导出的本文为了演示卡片字段会直接手工编写一个最简可算的模型文件。3. 卡片语法基础与关键卡片详解3.1 卡片字段格式OptiStruct 卡片文件有一些基本书写规则。每张卡片占据若干行行内字段有固定宽度约定。常见格式分为两种自由格式和固定格式。自由格式用逗号分隔字段例如GRID,1,,10.0,20.0,30.0固定格式则严格按照列位置对齐例如GRID 1 10.0 20.0 30.0HyperMesh 导出文件通常使用固定格式因为这种格式兼容性最好不会因为逗号、空格问题导致读取错误。手工编写时自由格式更方便但要注意字段顺序不能颠倒。无论是哪种格式卡片名称都是从第 1 列开始字段之间用空格或逗号分隔。多余的空格一般不会影响读取但为了可读性建议对齐书写。3.2 常用模型定义卡片GRID 卡片GRID 卡片用于定义节点。常见字段如下GRID NID CID X Y ZNID节点编号必须唯一。CID坐标系编号默认为空表示在全局坐标系中定义。X、Y、Z节点坐标。示例GRID 1 0.0 0.0 0.0 GRID 2 100.0 0.0 0.0 GRID 3 100.0 50.0 0.0 GRID 4 0.0 50.0 0.0这 4 张卡片定义了一个平面矩形的 4 个角点。CQUAD4 卡片CQUAD4 卡片用于定义 4 节点四边形壳单元。CQUAD4 EID PID G1 G2 G3 G4EID单元编号。PID属性编号。G1 到 G44 个节点编号顺序必须按逆时针方向否则单元法向可能出错。示例CQUAD4 1 1 1 2 3 4这张卡片表示将节点 1、2、3、4 组合成一个四边形单元单元属性引用编号为 1 的 PSHELL 卡片。3.3 材料与属性卡片MAT1 卡片MAT1 用于定义各向同性材料。MAT1 MID E G NU RHOMID材料编号。E弹性模量。G剪切模量。NU泊松比。RHO密度。通常只需要给出 E、NU、RHOG 可通过材料力学公式计算但显式给出也可以。示例MAT1 1 210000.0 0.3 7.85E-9这个示例定义了一种弹性模量为 210000 MPa、泊松比为 0.3、密度为 7.85E-9 t/mm³ 的钢材参数。注意单位制OptiStruct 本身不关心单位所有数值都是“纯数字”单位一致性完全由用户保证。PSHELL 卡片PSHELL 用于定义壳单元属性。PSHELL PID MID1 T MID2 12I/T3PID属性编号。MID1膜应力计算所用材料编号。T壳厚度。MID2弯曲应力计算所用材料编号通常与 MID1 相同。12I/T3弯曲刚度修正系数一般可以不填使用默认值。示例PSHELL 1 1 2.0这张卡片表示单元厚度为 2.0 mm膜和弯曲行为都使用材料 1。3.4 载荷与边界卡片SPC 卡片SPC 卡片用于定义单点约束。SPC SID G C DSID约束集合编号。G节点编号。C约束自由度分量1 表示 X 方向平动2 表示 Y 方向平动3 表示 Z 方向平动4、5、6 分别表示绕 X、Y、Z 轴的转动。D约束位移值通常为 0。如果要约束节点 1 的所有平动自由度可以写SPC 1 1 123 0.0这里的123含义是同时约束自由度 1、2、3。如果同时约束 1、2、3、4、5、6可以写123456。FORCE 卡片FORCE 卡片用于定义作用在节点上的集中力。FORCE SID G CID F N1 N2 N3SID载荷集合编号。G节点编号。CID力方向的坐标系编号空为全局坐标系。F力的大小。N1、N2、N3力的方向向量分量。示例FORCE 1 2 0 1000.0 0.0 0.0 1.0该卡片表示在节点 2 上施加一个大小为 1000 N、方向为001的集中力也就是指向 Z 正方向。方向向量只需要给出方向求解器会自动归一化。3.5 工况控制卡片SUBCASE 卡片SUBCASE 卡片用于定义分析工况把载荷、约束、输出请求组合起来。SUBCASE 1 SPC 1 LOAD 1 DISPLACEMENT ALL STRESS ALL这里的SPC 1表示工况 1 使用编号为 1 的约束集合LOAD 1表示使用编号为 1 的载荷集合DISPLACEMENT ALL和STRESS ALL表示输出所有节点的位移和所有单元的应力。ANALYSIS 卡片ANALYSIS 卡片位于求解控制区用于指定分析类型。ANALYSIS STATICSSTATICS表示静力分析。OptiStruct 支持的常见分析类型还有MODAL模态分析、BUCKLING屈曲分析、FREQ频率响应分析等。4. 完整实战案例从卡片到求解下面通过一个完整的静力分析示例把上面讲到的卡片串联起来。这个案例模拟一块 100 mm × 50 mm、厚度为 2 mm 的钢板左端固定右端中点施加一个向下的集中力计算它的位移和应力分布。4.1 创建模型文件创建一个文本文件命名为model.fem内容如下。由于是手工编写这里采用自由格式字段之间用逗号分隔。TITLE OptiStruct Card Demo - Flat Plate Bending BEGIN BULK GRID,1,,0.0,0.0,0.0 GRID,2,,100.0,0.0,0.0 GRID,3,,100.0,50.0,0.0 GRID,4,,0.0,50.0,0.0 MAT1,1,210000.0,,0.3,7.85E-9 PSHELL,1,1,2.0 CQUAD4,1,1,1,2,3,4 SPC,1,1,123456,0.0 SPC,1,4,123456,0.0 FORCE,1,2,0,500.0,0.0,-1.0,0.0 BEGIN SCENARIO ANALYSIS STATICS SUBCASE 1 SPC 1 LOAD 1 DISPLACEMENT ALL STRESS ALL END SCENARIO END BULK4.2 文件结构解析下面逐段解释这个文件的含义。首先是TITLE行这个不是必须的但建议写上方便识别不同模型。然后是BEGIN BULK它表示从此处开始进入模型数据卡区域。接下来的数据卡4 张GRID卡片定义了矩形钢板的 4 个角点。MAT1定义了线弹性材料。PSHELL将厚度为 2.0 的壳属性指向材料 1。CQUAD4将 4 个节点组合成一个四边形壳单元。2 张SPC卡片固定了节点 1 和节点 4 的 6 个自由度模拟左端固定。FORCE卡片在节点 2 上施加大小为 500 N、方向沿 Y 轴负方向的力也就是把钢板右端向下压。再往下是BEGIN SCENARIO这是 OptiStruct 的工况定义区。ANALYSIS STATICS声明了静力分析SUBCASE 1把约束、载荷和输出请求组合起来。最后END SCENARIO和END BULK分别结束工况区和数据区。需要说明的是不同版本的 OptiStruct 对于工况区的写法略有差异。较老版本可能直接使用SEND、BEGIN BULK等划分方式新版则推荐使用BEGIN SCENARIO。如果使用旧版格式请参考你安装版本的帮助文档。4.3 提交求解保存model.fem后打开命令行进入文件所在目录执行optistruct model.fem求解开始后终端会输出求解进度。正常完成时会生成如下结果文件model.out # 求解日志文件 model.h3d # HyperView 结果文件 model.stat # 求解统计信息 model.html # 可视化摘要报告部分版本其中.h3d文件可以在 HyperView 中打开查看位移云图、应力云图等结果。如果不想使用命令行也可以在 HyperMesh 的 OptiStruct 面板中选择输入文件model.fem点击运行按钮提交求解。4.4 预期结果说明由于本例只包含一个壳单元结果精度没有工程参考意义仅用于验证卡片语法是否正确。正常求解后位移结果应该显示节点 2 和节点 3 有向下的位移其中节点 2 位移量更大节点 1 和节点 4 的位移为 0因为它们被完全固定。应力结果可以查看四边形单元的 von Mises 应力。虽然数值可能不具备实际工程参考价值但整个流程验证了“文本卡片 → 求解 → 结果查看”的闭环。4.5 扩展增加多个单元和多种载荷实际工程模型不可能只有一个单元当你需要把模型细化时可以扩展节点和单元卡片。例如像下面这样增加中间节点并把一个四边形拆成两个三角形单元GRID,5,,50.0,25.0,0.0 CTRIA3,1,1,1,5,4 CTRIA3,2,1,1,2,5这里CTRIA3表示三角形壳单元字段格式与CQUAD4类似CTRIA3 EID PID G1 G2 G3如果需要在同一个模型里施加多种载荷比如既有集中力又有压力可以使用多个载荷卡片然后在LOAD卡片中进行叠加。简单情况下也可以直接让SUBCASE中的LOAD指向同一个载荷集合编号把所有力都放在该集合中。4.6 在 HyperMesh 中查看卡片如果你更喜欢在图形界面中操作可以在 HyperMesh 中通过“Card Edit”功能查看或修改任意一张卡片的字段。方法如下在 HyperMesh 中加载或导入模型。在模型浏览树中选择要查看的组件、属性或载荷。右键选择“Edit Card”或“Card Edit”。此时会弹出卡片编辑器里面会明确显示每个字段的名称、数值和默认状态。对于不熟悉的卡片建议先使用 Card Edit 查看字段含义再回到手工编写中套用。5. 常见问题与排查思路5.1 卡片字段写错导致求解失败这是最常遇到的问题。比如CQUAD4的节点顺序不是逆时针求解器可能不会直接报错但计算出的单元法向方向是反的导致应力结果异常。排查方法打开.fem文件检查单元卡片中的节点编号顺序在 HyperMesh 中打开模型查看单元法向方向必要时使用“Element Normal”功能统一法向。5.2 单位不统一导致结果量级异常OptiStruct 不关心单位只做数值计算。如果你用 mm 建模但密度用了 kg/m³ 的单位得到的质量、力、应力就会差好几个数量级。建议在建模前确定统一单位制。常用的一组合适单位是物理量单位长度mm力N质量t吨时间s应力MPa密度t/mm³此时弹性模量应使用 MPa密度使用 t/mm³。例如钢材密度约为7.85E-9 t/mm³。5.3 没有定义输出请求很多情况下模型可以正常求解但结果文件里没有想要的数据。原因往往是忘记在SUBCASE中定义输出请求。常见输出请求写法如下SUBCASE 1 DISPLACEMENT ALL STRESS ALL STRAIN ALL FORCE ALL如果只需要部分节点的结果也可以写成类似DISPLACEMENT 1, 2, 3的形式只输出指定节点编号的位移。5.4 PARAM 卡片不生效OptiStruct 中PARAM卡片用于设置各类求解参数例如PARAM, AUTOSPC, YESAUTOSPC用于自动约束模型中可能存在的刚体位移避免求解失败。默认情况下 OptiStruct 有自己的处理逻辑但如果你显式设置了参数却不生效多半是PARAM卡片放置的位置不对。PARAM卡片通常放在BEGIN BULK之后与其他数据卡放在一起。如果放在BEGIN SCENARIO区求解器可能不会读取。5.5 常见错误速查表问题现象常见原因解决思路求解器报“LOAD not found”SUBCASE 中引用了不存在的载荷集合编号检查 FORCE/LOAD 卡片编号是否和 SPC/LOAD 引用一致节点编号冲突GRID 卡片出现重复编号搜索重复编号并修改单元出现负体积或负雅可比单元节点顺序错误、节点坐标异常检查节点编号顺序和坐标值求解结果过大或过小单位不一致统一单位制检查弹性模量和密度没有应力结果SUBCASE 中未写 STRESS ALL在工况卡中加入输出请求提示“NO ELEMENTS”单元卡片 PID 指向不存在属性检查 PSHELL/PSOLID 的 PID 编号是否存在5.6 排查建议遇到求解失败建议按下述顺序排查先看.out文件中的错误摘要定位到具体卡片和行号。打开.fem文件检查报错卡片附近的字段。在 HyperMesh 中用 Card Edit 对报错卡片做图形化检查。用最小模型验证问题是否由特定卡片引起比如只保留一个单元和一个载荷。确认单位和材料参数是否合理。6. 最佳实践与工程建议6.1 保持模型单位制统一这是做有限元分析最重要的一条经验。建议在每个模型文件开头添加注释或命名约定标明单位制。对于大型项目可以维护一个单位制对照表放在项目文档中所有成员共享。6.2 熟练使用卡片编辑器在 HyperMesh 中卡片编辑器是理解卡片字段的最佳工具。不要只看图形界面多打开 Card Edit 看字段含义。看多了以后你会发现很多卡片虽然在界面上看起来不同底层字段其实是相通的。6.3 从简单模型开始验证每次新建一个分析流程不要直接把整个整车模型或整个装配体丢进求解器。先用一个单元、两个单元的最小模型跑通流程确认所有卡片引用关系正确后再逐步增加模型复杂度。这样可以把“模型问题”和“卡片设置问题”分离开。6.4 保留原始文件与版本记录.fem文件是文本文件非常方便做版本管理。建议把模型文件纳入 Git 或 SVN 管理每次修改卡片后提交一次方便回滚和追溯。对于团队协作还可以在文件头部的注释区写明模型版本、修改人、修改日期和修改内容。6.5 合理使用 PARAM 参数OptiStruct 提供大量PARAM参数来控制求解行为但不要盲目添加。默认参数通常已经经过大量工程验证只有在确实需要调整时才修改。添加时建议在PARAM卡片旁边添加注释说明该参数的作用和设置依据。6.6 自动生成与手动编写结合实际项目中手动编写整个.fem文件并不现实因为模型规模太大。更推荐的工作方式是在 HyperMesh 中完成网格划分和大部分设置。导出.fem文件后用脚本或文本工具检查关键卡片。对于重复性的卡片修改用 Python 脚本批量处理。例如可以用 Python 脚本批量修改多个MAT1卡片的弹性模量import re def update_young_modulus(file_path, output_path, new_e): with open(file_path, r) as f: lines f.readlines() updated_lines [] for line in lines: if line.strip().startswith(MAT1): parts line.strip().split(,) # 自由格式 MAT1 卡片MAT1,MID,E,G,NU,RHO if len(parts) 3: parts[2] str(new_e) updated_lines.append(,.join(parts) \n) else: updated_lines.append(line) else: updated_lines.append(line) with open(output_path, w) as f: f.writelines(updated_lines) update_young_modulus(model.fem, model_updated.fem, 200000.0)这个示例展示了如何用脚本自动处理卡片适合批量参数扫描和优化计算场景。6.7 学习路线建议如果你希望系统掌握 OptiStruct 卡片建议按以下顺序学习掌握GRID、CQUAD4、MAT1、PSHELL这些最基础卡片。熟悉SPC、FORCE、SUBCASE的组合方式能独立完成静力分析。学习PARAM常用参数理解默认参数的含义。掌握模态分析、屈曲分析的卡片写法。学习DLOAD等动态载荷卡片的用法。最后再接触优化相关卡片如DESVAR、DRESP1、DCONSTR。篇幅所限这篇文章没有展开优化卡片的内容。对于想深入了解优化卡片的朋友可以在掌握基础卡片后查阅 Altair 官方的《OptiStruct User Guide》中关于优化设计的章节。卡片是 OptiStruct 模型的灵魂。无论你日常习惯在 HyperMesh 中做多少图形化操作最终都需要回到卡片层面来检查和理解模型。刚开始接触卡片时可能会觉得字段繁杂、格式死板但只要按“模型定义卡 → 材料属性卡 → 载荷约束卡 → 工况控制卡”这条主线去学习再配合实际算例反复练习很快就能建立起完整的卡片知识体系。希望这篇文章能帮助你理解 OptiStruct 卡片的基本用法在后续的学习和工程实践中少踩一些坑。