3. CAE软件二次开发接口与脚本封装

CAE自动化平台能否真正落地,很大程度上取决于能否稳定地“驱动”底层求解器。Abaqus、ANSYS、Nastran 这些主流软件都提供了二次开发接口,但它们的语言、调用方式和数据组织方式差异很大。本节的目标不是逐一罗列 API,而是建立一套统一的封装思路:把不同求解器的接口差异收敛到平台内部,对外只暴露一致的参数输入与结果输出。

三类主流接口的定位差异

Abaqus 的核心脚本接口是 Python。它通过 abaqus cae noGUI=script.py 或 abaqus python 启动,脚本中可调用 mdb(模型数据库)、session(会话对象)和 odbAccess(结果数据库访问)。参数化建模通常直接操作 mdb.models['Model-1'] 下的 Part、Material、Assembly、Step 等对象;结果提取则通过 openOdb() 打开 odb 文件,读取 steps['Step-1'].frames[-1].fieldOutputs['S'] 这类字段输出。

ANSYS 传统界面以 APDL 为主,参数化能力体现在 *SET、*GET、数组与 *DO 循环上。APDL 脚本可直接在批处理模式下运行:ansys -b -i model.mac -o out.log。较新的 ANSYS 版本同时提供 PyMAPDL 与 PyAnsys 系列库,允许用 Python 调用 MAPDL 实例,但大量既有模型仍以 APDL 宏形式存在,封装时往往需要“Python 生成 APDL 再提交”的混合模式。

Nastran 本身是求解器,输入文件为 BDF/DAT 格式,二次开发更多体现为“卡片级参数化”:用脚本生成或修改 BDF 中的 GRID、CTRIA3、PSHELL、MAT1、SPC、LOAD 等卡片,再调用求解器执行,最后解析 F06/OP2 结果文件。因此 Nastran 的封装重点不在 API 调用,而在文本模板与结果解析。

CAE 二次开发接口统一封装架构 平台统一接口层(参数字典 in → 结果字典 out) build(params) · solve(params) · extract(params) · 统一异常与日志 Abaqus · Python API mdb.models / Part / Step openOdb → fieldOutputs abaqus cae noGUI=run.py 参数化建模 + 结果提取一体 ANSYS · APDL / PyMAPDL *SET / *GET / *DO 宏 ansys -b -i model.mac Python 生成 APDL 混合模式 批处理日志解析结果 Nastran · BDF 卡片 GRID / PSHELL / MAT1 模板生成 + 卡片替换 F06 / OP2 结果解析 文本级参数化,无强 API 可复用组件封装(SolverAdapter) 统一参数校验 · 模板渲染 · 进程调用 · 结果归一化 · 错误码映射 平台任务调度 / 参数扫描 / 结果入库

参数化建模脚本的编写要点

参数化建模的关键是“把几何与工况中会变的量抽成参数”,而不是把整个建模过程录制成宏。以 Abaqus 为例,一个可复用的建模脚本通常接收一个参数字典,例如 {"L": 200.0, "H": 50.0, "t": 4.0, "E": 210000.0, "nu": 0.3, "load": 1200.0},脚本内部用这些变量驱动草图尺寸、材料属性、截面厚度和载荷幅值。这样同一份脚本可以覆盖一批尺寸组合,而不需要为每个方案单独维护模型。

APDL 侧同理,应把尺寸、网格密度、载荷步写成 *SET 参数,并在宏开头集中声明,避免参数散落在建模命令之间。Nastran 则建议维护一份带占位符的 BDF 模板,例如用 {{THICK}}、{{LOAD}} 标记需要替换的字段,由 Python 读取模板后渲染成实际输入文件。

求解脚本的提交与监控

求解阶段的核心是“可等待、可判断、可回收”。Abaqus 可用 subprocess.run(["abaqus", "job=Job-1", "input=model.inp", "cpus=4", "interactive"]) 同步等待;ANSYS 用 ansys -b -i model.mac -o out.log 批处理;Nastran 用 nastran model.bdf scr=yes。封装组件需要捕获返回码、扫描日志中的 ERROR/FATAL 关键字,并把“求解成功但结果异常”与“求解失败”区分开。

建议在封装层统一约定:返回码为 0 且日志中无致命错误,才判定为求解成功;否则抛出带日志路径的异常,便于平台侧定位。

结果自动提取与归一化

结果提取最容易出现“每个求解器一套写法”的问题。Abaqus 从 odb 读取场输出,ANSYS 从 *.rst 或通过 *GET 提取,Nastran 解析 F06 中的应力/位移表。封装层应把三者统一成同一结构,例如:

{
  "max_stress": 187.4,      # MPa
  "max_disp": 1.26,         # mm
  "safety_factor": 1.42,
  "status": "ok",
  "source": "Job-1.odb"
}

这样上层参数扫描、优化或报告模块只依赖这套字段,不需要关心底层是 Abaqus 还是 Nastran。单位、坐标系和提取位置必须在封装层显式声明,避免不同求解器默认约定不一致导致结果误读。

封装为可复用组件的实践建议

  • 接口统一:所有求解器适配器实现同一组方法,如 build(params)、solve(params)、extract(params),平台按名称选择适配器。
  • 参数校验前置:在调用求解器前检查参数范围与必填项,避免无效任务占用计算资源。
  • 模板与脚本分离:把 BDF/APDL/Python 模板作为资源文件管理,代码只负责渲染与调用。
  • 日志与产物归档:每次任务保留输入文件、求解日志和结果文件路径,便于复现与排障。
  • 版本可追溯:记录求解器版本与脚本版本,避免因环境变化导致结果不可比。

把上述内容收敛到一个 SolverAdapter 抽象类中,Abaqus、ANSYS、Nastran 各自实现具体子类,平台侧只面向统一接口编程。这样新增求解器时只需增加一个适配器,而不需要改动参数扫描、结果入库和报告生成等上层逻辑,二次开发成果才真正具备工程可复用性。