4. 参数驱动引擎架构设计
参数驱动引擎的目标,是把“改一个参数、重跑一次仿真、看一组结果”从人工操作变成可编排、可追溯、可批量执行的自动化链路。要做到这一点,关键不在于把脚本堆在一起,而在于把职责切成四个边界清晰的模块:参数管理器负责“参数是什么、从哪来、是否合法”;模型生成器负责“把参数变成可求解的模型”;求解调度器负责“什么时候算、用什么资源算、算失败怎么办”;结果解析器负责“从求解输出中提取什么、如何回写参数集”。四者通过约定好的数据契约串联,而不是互相直接调用内部实现。
模块职责与边界
参数管理器是整条链路的唯一参数入口。它维护三类信息:参数定义(名称、类型、单位、默认值、取值范围)、参数实例(某次设计工况下的一组具体取值)、参数来源(手工输入、CSV 批量导入、优化算法采样、上游系统接口)。参数管理器对外只暴露“取一组参数”“校验一组参数”“登记一组结果”三类操作,不关心模型如何生成。校验是它的核心价值:例如弹性模量必须为正、板厚需落在 0.5~5.0 mm、网格尺寸不得大于特征尺寸的三分之一,这些约束在进入建模前就应拦截,避免把非法参数送进求解器后才发现错误。
模型生成器接收一组已校验参数,输出求解器可读的模型文件与元数据。它通常由模板层和替换层组成:模板层保存几何拓扑、边界条件位置、材料卡片的占位符;替换层把参数值写入占位符,并同步更新与参数强相关的派生量,例如由板厚和材料密度计算质量、由载荷和截面积计算应力参考值。模型生成器必须记录“本次生成使用了哪些参数、生成了哪个文件、文件哈希是多少”,这份生成清单是后续追溯的唯一凭据。
求解调度器不参与建模,只负责执行。它根据任务优先级、资源占用和求解器类型,把模型文件分发给本地进程、计算节点或作业队列。调度器需要处理三类状态:排队、运行、结束(成功/失败/超时)。对失败任务,它应保留求解器日志路径和退出码,而不是简单丢弃。调度器还应支持并发度控制,避免多个大模型同时抢占内存导致整体崩溃。
结果解析器从求解输出中提取用户关心的指标,例如最大等效应力、最大位移、一阶固有频率、质量。它按“结果字段—提取路径—单位换算”的映射表工作,把原始输出转成结构化记录,再回写给参数管理器,形成“参数集—结果集”的配对。解析器必须能识别求解未收敛、结果文件缺失等异常,并把这些情况标记为无效结果,而不是填入默认值。
数据流与状态约定
四模块之间传递的不是“文件路径”这种弱契约,而是带标识的结构化记录。一次完整流转可以这样描述:参数管理器产出一份带 param_set_id 的参数集;模型生成器消费该参数集,产出带 model_id 和文件哈希的模型清单;求解调度器消费模型清单,产出带 job_id 的任务记录;结果解析器消费任务记录与求解输出,产出带 result_id 的结果集,并通过 param_set_id 回写。这样,任意一个结果都能反查到它由哪组参数、哪个模型、哪次任务产生。
状态约定同样重要。建议统一使用 PENDING → RUNNING → SUCCESS / FAILED / TIMEOUT 五态,其中 FAILED 必须携带退出码与日志路径,TIMEOUT 必须携带已运行时长。结果解析器只处理 SUCCESS 的任务;对 FAILED 和 TIMEOUT,它应生成一条“无效结果”记录,标记原因,而不是跳过。这样批量运行时,用户能一眼看出哪些参数组合算通了、哪些没算通、没算通的原因是什么。
一个可执行的参数表与结果判读示例
下面给出一份用于薄板静力分析的参数表示例(数值为教学假设,非实测结果)。参数管理器按此表校验并生成参数集,模型生成器据此替换模板中的板厚、弹性模量、载荷和网格尺寸。
| 参数名 | 符号 | 示例值 | 单位 | 约束 |
|---|---|---|---|---|
| 板厚 | t | 2.0 | mm | 0.5 ≤ t ≤ 5.0 |
| 弹性模量 | E | 210000 | MPa | E > 0 |
| 集中载荷 | F | 1200 | N | 0 < F ≤ 5000 |
| 网格尺寸 | h | 3.0 | mm | h ≤ t × 2 |
假设某次运行中,求解调度器返回 SUCCESS,结果解析器按映射表提取到最大等效应力 σ_max = 186.4 MPa、最大位移 δ_max = 0.42 mm、一阶固有频率 f1 = 312.7 Hz。判读时先看有效性:任务状态是否为 SUCCESS、结果文件是否完整、单位是否已换算为 MPa/mm/Hz。再看合理性:若材料屈服强度为 235 MPa,则 σ_max 接近但未超过屈服,属于可接受但需关注;若 δ_max 超过设计允许的 0.5 mm,则应判定该参数组合不满足刚度要求。最后把结论回写到参数集,标记为“通过/不通过/需复核”,供后续优化或筛选使用。
实现时的关键取舍
第一,参数管理器要不要持久化?建议持久化,至少保存参数集 id、版本和来源,否则批量运行后无法复现。第二,模型生成器是“整文件替换”还是“增量修改”?对模板稳定的场景,整文件替换更可控;对大型模型,增量修改更省时,但必须记录修改了哪些字段。第三,求解调度器是否要支持失败重试?建议对 TIMEOUT 和资源不足导致的失败做有限重试,对参数非法或模型错误不做重试,因为重试也不会成功。第四,结果解析器要不要做单位换算?必须做,并且换算规则要集中配置,避免同一物理量在不同模块中出现两套单位。
把四个模块的输入输出固定成上述数据契约后,参数驱动引擎就不再是一堆脚本的集合,而是一条可追溯、可批量、可判读的自动化链路。后续无论是接入优化算法、批量扫描还是与上游设计系统对接,都只需要替换参数来源或增加结果字段,而不必重写整条链路。