4. 参数化建模与设计变量定义
在CAE优化算法与求解器自动联动的框架中,参数化建模是连接“优化算法”与“求解器”的桥梁。优化算法本身并不理解几何、网格或材料,它只认识一组设计变量向量 x = [x₁, x₂, …, xₙ]。参数化建模的任务,就是把这组无量纲或带量纲的变量,映射为求解器能够直接读取的输入文件(如Nastran的BDF、Abaqus的INP、ANSYS的APDL或Fluent的Journal)。如果映射关系不清晰,优化循环就会出现“算法改了变量、求解器却没反应”或“响应面梯度失真”的典型故障。
一、参数化的四个层次与映射链
工程上通常把参数化对象分为四类:几何参数、网格参数、材料参数和边界条件参数。它们与求解器输入之间并非简单的一对一关系,而是存在一条“设计变量 → 参数化模型 → 求解器关键字”的映射链。以常见的结构优化为例:设计变量可能是筋板厚度 t,几何参数化层将其解释为某个面偏移量,网格参数化层决定该面附近网格是否重新划分,材料参数化层可能同时把 t 关联到等效密度,边界条件参数化层则保证载荷作用点随几何移动而更新。最终,求解器输入中的 PSHELL 卡片厚度字段、GRID 坐标和 FORCE 作用节点都随 t 变化。
二、几何参数化:从尺寸驱动到特征驱动
几何参数化最直接的方式是尺寸驱动,即把CAD草图中的标注尺寸暴露为设计变量。例如某支架的安装孔中心距 L 在 80~120 mm 之间变化,在SolidWorks中通过方程式或配置即可实现;在ANSYS SpaceClaim中则用 Pull 面配合参数集。更稳健的做法是特征驱动:把倒角半径、筋板厚度、孔阵列间距等特征参数直接作为变量,避免重建时出现拓扑失败。
实际工程中,几何参数化必须考虑“可重建性”。当变量变化导致面合并、边消失或产生自相交时,CAD内核会报错,优化循环随即中断。因此建议在参数化阶段就设定变量上下限,并做一次扫掠测试:以 L = 80, 90, 100, 110, 120 五个水平重建模型,确认无失败后再接入优化算法。这一步的代价远低于在优化迭代中反复处理几何失败。
三、网格参数化:节点坐标与拓扑的两种策略
网格参数化有两种典型策略。第一种是“网格随动”:保持网格拓扑不变,仅根据几何变形更新节点坐标。例如机翼气动弹性优化中,结构网格节点坐标由几何参数插值得到,单元连接关系不变。这种方法计算快、无重划分开销,但仅适用于小变形或形状变化平缓的场景。第二种是“网格重划分”:当几何变化剧烈时,重新生成网格。此时设计变量会触发网格尺寸、边界层厚度、局部加密区等参数更新。
与求解器输入的映射上,网格参数化最终体现为 GRID 卡片坐标、CTRIA3/CQUAD4 连接关系以及 PSHELL 属性中的厚度。若采用重划分策略,还需保证载荷和约束能够自动映射到新网格的对应节点上,否则会出现“载荷悬空”导致求解失败。
四、材料参数化:本构与属性的变量化
材料参数化常见于多材料拓扑优化、复合材料铺层优化和热-结构耦合优化。设计变量可以是弹性模量 E、泊松比 ν、密度 ρ、热膨胀系数 α,也可以是复合材料单层厚度和铺层角度。在求解器输入中,这些参数对应 MAT1(各向同性)、MAT8(二维各向异性)或 MAT9(三维各向异性)卡片。
需要特别注意的是材料参数的物理约束。例如密度 ρ 必须为正,泊松比 ν 对 isotropic 材料需满足 -1 < ν < 0.5,否则刚度矩阵非正定,求解器会直接报错。在优化算法中,这些约束应作为边界条件写入变量定义,而不是等求解器报错后再处理。
五、边界条件参数化:位置、方向与幅值的联动
边界条件参数化是最容易被忽视、却最容易导致优化结果失真的环节。当几何变化时,载荷作用点、约束面、接触对都可能移动。如果边界条件不随动,优化算法会“钻空子”:例如把加强筋移到远离载荷的位置以降低应力,而载荷却仍作用在旧节点上,结果自然不可信。
实现边界条件参数化的关键是建立“几何-边界”的关联关系。在Abaqus中可用 *NSET 配合几何面定义,在Nastran中可用 RBE3 单元把载荷分配到随动节点上。对于随动载荷,还需在求解器输入中启用大变形或跟随力选项(如 NLGEOM 或 FOLLOW)。
六、参数化建模的工程实现建议
在实际项目中,建议采用“参数化模板 + 脚本驱动”的方式。以Python为例,可用 pyNastran 或 pyAbaqus 读取模板文件,替换关键字字段后写出新输入文件。模板中保留固定拓扑和注释,变量字段用占位符标记,脚本只替换占位符,避免误改其他卡片。
# 示例:用pyNastran替换PSHELL厚度
from pyNastran.bdf.bdf import BDF
model = BDF()
model.read_bdf('template.bdf')
for eid in model.elements:
if model.elements[eid].type == 'PSHELL':
model.elements[eid].t = t_new # t_new来自优化算法
model.write_bdf('design_001.bdf')
这种方式的优点是映射关系显式、可追溯,且便于与优化算法对接。优化算法每产生一组新变量,脚本就生成一份新的求解器输入,求解器计算后返回目标函数和约束值,形成闭环。参数化建模的质量,直接决定了这个闭环能否稳定收敛。
最后需要强调:参数化不是“把能变的都变成变量”,而是选择对目标函数和约束真正敏感、且物理上可实现的参数。变量过多会导致优化维度爆炸,变量过少则可能错过最优解。通常建议先做灵敏度分析,筛选出贡献度最高的 5~15 个参数作为设计变量,其余保持固定。这样既保证优化效果,又控制计算成本。