2. CAE求解器接口基础

在CAE优化算法与求解器自动联动的工程链路中,求解器接口是算法层与物理计算层之间的“握手协议”。优化算法负责生成设计变量、判断收敛、更新种群或梯度方向,而真正的刚度、流场、温度场、模态或疲劳寿命计算,全部由外部求解器完成。接口基础决定了自动化流程能否稳定、可复现地运行。本节围绕四件事展开:常见求解器类型、输入输出文件格式、命令行调用方式,以及批处理执行与结果解析要点。

一、常见求解器类型与接口特征

CAE求解器按物理场和数值方法可分为若干类,接口设计时首先要识别其“可编程入口”在哪里。

  • 结构线性/非线性求解器:如Nastran、Abaqus/Standard、ANSYS Mechanical APDL、OptiStruct。输入通常为文本卡片式模型(BDF、INP、CDB),输出为位移、应力、应变、模态频率、屈曲因子等。接口重点是批量改写设计变量卡片(如PSHELL厚度、PBAR截面),并读取结果文件中的节点/单元响应。
  • 显式动力学求解器:如LS-DYNA、Abaqus/Explicit、Radioss。输入为关键字文件(K文件),输出为d3plot、binout等二进制结果。接口重点是关键字参数替换、*INCLUDE路径管理、以及通过LS-PrePost或Python库提取时间历程曲线。
  • CFD求解器:如Fluent、CFX、STAR-CCM+、OpenFOAM。输入为网格、边界条件、求解控制参数(journal、dict、case)。输出为残差、升阻力系数、压力场、温度场。接口重点是journal脚本录制与参数化、以及后处理宏的自动执行。
  • 多物理场与优化专用求解器:如COMSOL、OptiStruct、Genesis。它们通常自带优化模块,但外部联动时仍需通过文件或API交换设计变量与响应。

不同求解器的接口“粒度”差异很大:有的支持命令行参数直接覆盖模型参数,有的必须通过修改输入文件再重新提交,有的提供Python/Java API。工程上最稳妥的通用做法是“模板文件+参数替换+命令行提交+结果文件解析”,因为它不依赖特定版本的API,跨版本迁移成本低。

二、输入输出文件格式:接口的“数据契约”

输入文件是优化算法向求解器传递设计变量的载体。常见格式包括:

  • 文本卡片格式:Nastran BDF、Abaqus INP、ANSYS CDB。设计变量通常对应特定卡片字段,例如壳单元厚度在PSHELL的T字段,梁截面在PBAR的A、I1、I2字段。接口程序需要按固定列宽或关键字定位并替换数值。
  • 关键字格式:LS-DYNA K文件,以*SECTION_SHELL、*MAT_ELASTIC等关键字组织。参数替换需注意关键字块内的字段顺序和单位制。
  • 脚本/字典格式:OpenFOAM的dict、Fluent journal、STAR-CCM+ macro。这类格式更适合用模板引擎(如Jinja2)生成,而不是简单字符串替换。
  • 二进制/中性格式:如Nastran OP2、Abaqus ODB、LS-DYNA d3plot。它们不适合直接文本编辑,但适合作为结果解析对象。

输出文件是求解器返回给优化算法的“成绩单”。解析时需关注三类数据:标量响应(质量、最大应力、一阶频率、阻力系数)、场量(节点位移、单元应力、压力分布)、以及状态信息(求解是否收敛、警告与错误码)。标量响应最容易接入优化目标与约束;场量通常需要先降维(如取最大值、平均值、RMS)再使用。

接口设计时,建议为每个求解器建立一份“变量映射表”:左侧是优化算法中的设计变量名与取值范围,右侧是输入文件中的卡片、关键字、字段位置及单位。这份映射表是自动化流程可维护性的核心资产。

三、命令行调用方式与批处理执行

命令行调用是自动化联动的“执行入口”。不同求解器的调用形式不同,但基本结构一致:可执行程序 + 输入文件 + 工作目录 + 输出重定向 + 返回码。

# Nastran 示例(Windows)
nastran.exe job.bdf scr=yes bat=no mem=8gb

# Abaqus 示例
abaqus job=job_name input=job.inp cpus=4 interactive

# LS-DYNA 示例
lsdyna.exe i=model.k ncpu=4 memory=200m

# Fluent 批处理示例
fluent 3ddp -g -t4 -i run.journal

# OpenFOAM 示例
simpleFoam > log.simpleFoam 2>&1

批处理执行的关键点:

  1. 工作目录隔离:每次优化迭代应在独立目录中运行,避免结果文件互相覆盖。目录名可包含迭代编号或设计变量哈希。
  2. 返回码检查:求解器正常结束通常返回0,非0表示异常。但部分求解器即使出现警告也返回0,因此还需检查日志中的“ERROR”“FATAL”“not converged”等关键字。
  3. 超时控制:优化循环中单次求解可能因网格畸变、接触发散而卡死。应设置超时时间,超时后终止进程并标记该设计点为失败。
  4. 资源管理:并行核数、内存上限、许可证占用需与调度系统协调,避免多个迭代同时抢占资源。
  5. 日志留存:标准输出和错误输出应重定向到文件,便于失败复现和结果审计。

一个典型的批处理脚本会依次完成:生成输入文件 → 调用求解器 → 检查返回码与日志 → 解析结果 → 写入响应文件。若任一步失败,则写入失败标记并跳过该设计点,而不是让整个优化流程崩溃。

四、结果解析要点与接口健壮性

结果解析是接口中最容易出问题的环节,因为求解器输出格式可能随版本、平台、并行方式变化。建议遵循以下原则:

  • 优先使用中性结果文件:如Nastran OP2、Abaqus ODB、LS-DYNA binout,它们比文本输出更稳定,且有成熟的Python库(pyNastran、abaqus-python、lasso-python)支持。
  • 文本解析要容错:不要假设固定行号,而应通过关键字定位。例如在Nastran F06中查找“MAXIMUM DISPLACEMENT”或“STRESS”块,再提取数值。
  • 单位统一:输入文件单位制与优化算法单位制必须一致。常见错误是输入用mm-t-s,而目标函数按m-kg-s读取,导致量级偏差。
  • 缺失值处理:若某次求解未输出目标响应,应返回NaN或失败标记,并让优化算法按约束违反或惩罚处理,而不是用0代替。
  • 结果缓存:相同设计变量可能被重复评估,可用哈希键缓存响应,减少求解次数。
不要用“读取结果文件最后一行”这类脆弱方式解析。求解器日志中可能包含迭代信息、警告、时间统计,最后一行往往不是目标响应。应基于关键字或结构化解析器提取。

五、接口联动的整体数据流

把上述内容串起来,一个典型的CAE求解器接口数据流如下:优化算法输出设计变量 → 模板引擎生成输入文件 → 批处理脚本调用求解器 → 求解器产生结果文件 → 解析器提取响应 → 响应返回优化算法。这个链路中,任何一环的格式、路径、单位、返回码处理不当,都会导致优化流程中断或结果失真。

CAE求解器接口数据流与关键控制点 优化算法 设计变量 x 目标/约束 模板与参数替换 BDF / INP / K / dict 变量映射表 批处理调用 命令行 + 工作目录 返回码 / 超时 CAE求解器 Nastran / Abaqus Fluent / LS-DYNA 结果文件 OP2 / ODB / d3plot F06 / log / csv 结果解析 关键字定位 / 库解析 单位统一 / 缺失值 响应返回 质量 / 应力 / 频率 阻力 / 温度 失败处理 返回码≠0 / 超时 / 日志ERROR 关键控制点 变量映射表 · 工作目录隔离 · 返回码与日志检查 · 单位统一 · 结果缓存

图中展示了从优化算法到求解器再回到算法的完整闭环,并标出了失败处理分支。实际工程中,接口的稳定性往往比算法本身的先进性更影响优化效率。一个能正确处理超时、日志错误、单位不一致和缺失响应的接口,可以让优化流程在无人值守下持续运行;反之,即使算法再优秀,也会被频繁的求解失败和解析异常拖垮。

最后给出一个可直接参考的接口检查清单,用于每次接入新求解器或新版本时逐项确认:

检查项确认内容常见问题
输入模板设计变量对应卡片/关键字字段位置明确列宽错位、关键字拼写错误
单位制输入、求解器、优化算法三者一致mm-t-s与m-kg-s混用
命令行可执行路径、参数、工作目录正确许可证未释放、路径含空格
返回码0为正常,非0为异常警告也返回0,需查日志
日志关键字ERROR/FATAL/not converged检测仅看返回码漏判
结果解析基于关键字或中性文件,非固定行号版本升级后行号偏移
缺失响应返回NaN或失败标记,不用0代替0被误认为有效响应
超时与清理超时终止进程,清理临时文件僵尸进程占用许可证