4. 参数驱动引擎架构设计

参数驱动引擎的目标,是把“改一个参数、重跑一次仿真、看一组结果”从人工操作变成可编排、可追溯、可批量执行的自动化链路。要做到这一点,关键不在于把脚本堆在一起,而在于把职责切成四个边界清晰的模块:参数管理器负责“参数是什么、从哪来、是否合法”;模型生成器负责“把参数变成可求解的模型”;求解调度器负责“什么时候算、用什么资源算、算失败怎么办”;结果解析器负责“从求解输出中提取什么、如何回写参数集”。四者通过约定好的数据契约串联,而不是互相直接调用内部实现。

模块职责与边界

参数管理器是整条链路的唯一参数入口。它维护三类信息:参数定义(名称、类型、单位、默认值、取值范围)、参数实例(某次设计工况下的一组具体取值)、参数来源(手工输入、CSV 批量导入、优化算法采样、上游系统接口)。参数管理器对外只暴露“取一组参数”“校验一组参数”“登记一组结果”三类操作,不关心模型如何生成。校验是它的核心价值:例如弹性模量必须为正、板厚需落在 0.5~5.0 mm、网格尺寸不得大于特征尺寸的三分之一,这些约束在进入建模前就应拦截,避免把非法参数送进求解器后才发现错误。

模型生成器接收一组已校验参数,输出求解器可读的模型文件与元数据。它通常由模板层和替换层组成:模板层保存几何拓扑、边界条件位置、材料卡片的占位符;替换层把参数值写入占位符,并同步更新与参数强相关的派生量,例如由板厚和材料密度计算质量、由载荷和截面积计算应力参考值。模型生成器必须记录“本次生成使用了哪些参数、生成了哪个文件、文件哈希是多少”,这份生成清单是后续追溯的唯一凭据。

求解调度器不参与建模,只负责执行。它根据任务优先级、资源占用和求解器类型,把模型文件分发给本地进程、计算节点或作业队列。调度器需要处理三类状态:排队、运行、结束(成功/失败/超时)。对失败任务,它应保留求解器日志路径和退出码,而不是简单丢弃。调度器还应支持并发度控制,避免多个大模型同时抢占内存导致整体崩溃。

结果解析器从求解输出中提取用户关心的指标,例如最大等效应力、最大位移、一阶固有频率、质量。它按“结果字段—提取路径—单位换算”的映射表工作,把原始输出转成结构化记录,再回写给参数管理器,形成“参数集—结果集”的配对。解析器必须能识别求解未收敛、结果文件缺失等异常,并把这些情况标记为无效结果,而不是填入默认值。

参数驱动引擎四模块数据流 参数管理器 参数定义 / 实例 / 来源 范围与单位校验 参数集版本登记 结果回写入口 模型生成器 模板占位符替换 派生量同步计算 生成模型文件 + 哈希 生成清单记录 求解调度器 任务排队与优先级 并发度与资源控制 状态:排队/运行/结束 日志与退出码留存 结果解析器 字段映射提取 单位换算 异常标记 结构化结果 参数集 模型文件 求解输出 结果回写:参数集 ↔ 结果集配对 模块间数据契约(示例字段) 参数集 ParamSet id / 版本 / 来源 t=2.0mm, E=210GPa F=1200N, 网格=3mm 模型清单 ModelManifest model_id / 文件路径 参数集 id / 哈希 生成时间 / 模板版本 任务记录 JobRecord job_id / model_id 状态 / 退出码 / 耗时 日志路径 / 资源占用 结果集 ResultSet job_id / 参数集 id σ_max / δ_max / f1 有效性标记 / 单位

数据流与状态约定

四模块之间传递的不是“文件路径”这种弱契约,而是带标识的结构化记录。一次完整流转可以这样描述:参数管理器产出一份带 param_set_id 的参数集;模型生成器消费该参数集,产出带 model_id 和文件哈希的模型清单;求解调度器消费模型清单,产出带 job_id 的任务记录;结果解析器消费任务记录与求解输出,产出带 result_id 的结果集,并通过 param_set_id 回写。这样,任意一个结果都能反查到它由哪组参数、哪个模型、哪次任务产生。

状态约定同样重要。建议统一使用 PENDING → RUNNING → SUCCESS / FAILED / TIMEOUT 五态,其中 FAILED 必须携带退出码与日志路径,TIMEOUT 必须携带已运行时长。结果解析器只处理 SUCCESS 的任务;对 FAILED 和 TIMEOUT,它应生成一条“无效结果”记录,标记原因,而不是跳过。这样批量运行时,用户能一眼看出哪些参数组合算通了、哪些没算通、没算通的原因是什么。

一个可执行的参数表与结果判读示例

下面给出一份用于薄板静力分析的参数表示例(数值为教学假设,非实测结果)。参数管理器按此表校验并生成参数集,模型生成器据此替换模板中的板厚、弹性模量、载荷和网格尺寸。

参数名符号示例值单位约束
板厚t2.0mm0.5 ≤ t ≤ 5.0
弹性模量E210000MPaE > 0
集中载荷F1200N0 < F ≤ 5000
网格尺寸h3.0mmh ≤ 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 和资源不足导致的失败做有限重试,对参数非法或模型错误不做重试,因为重试也不会成功。第四,结果解析器要不要做单位换算?必须做,并且换算规则要集中配置,避免同一物理量在不同模块中出现两套单位。

把四个模块的输入输出固定成上述数据契约后,参数驱动引擎就不再是一堆脚本的集合,而是一条可追溯、可批量、可判读的自动化链路。后续无论是接入优化算法、批量扫描还是与上游设计系统对接,都只需要替换参数来源或增加结果字段,而不必重写整条链路。