4. 参数化建模与变量驱动

在 HFSS 中,几何模型本质上是一组带数值的构造记录:矩形有长和宽,圆柱有半径和高度,倒角有角度,材料有名称和电磁参数。参数化建模的核心思想,是把这些数值从“写死的常量”变成“有名字的变量”,让模型由变量表达式驱动。这样,当设计变量改变时,几何尺寸、位置、材料属性会按依赖关系自动更新,而不需要重新绘制模型。对于批量仿真而言,这一步决定了后续能否用脚本一次性生成几十甚至上百个变体。

HFSS 的变量体系分为两类:设计变量(Design Variables)和局部变量(Local Variables)。设计变量属于整个设计,可被所有几何对象、边界条件、材料定义引用,是参数扫描和优化最常用的驱动量;局部变量只在某个对象或某个属性内部有效,适合表达中间计算量。在脚本中,两者都通过变量表管理,但作用域不同。一个常见的做法是:把真正需要扫描的尺寸(如贴片长度 L、馈电位置 xf、基板厚度 h)定义为设计变量,把由它们推导出来的量(如 λg/4、偏移量)定义为局部变量或直接写成表达式。

变量定义的关键在于表达式,而不是单个数值。HFSS 支持在变量值中写算术表达式和内置函数,例如 L/2、h+0.5mm、2*pi*r、sqrt(eps_r)。这意味着几何尺寸之间可以建立依赖链:改变基板厚度 h,馈电探针长度自动跟随;改变工作频率 f0,四分之一波长变换段的长度自动重算。这种依赖关系是参数化建模真正的价值所在,也是脚本相对于手工建模的优势——手工改一个尺寸容易漏改关联尺寸,脚本则通过表达式保证一致性。

下面给出一个典型的脚本化建模片段,以微带贴片天线为例。示例参数为合理假设值,用于说明写法,不代表任何实测结果。假设工作频率 f0 = 2.45 GHz,介质基板相对介电常数 eps_r = 4.4,厚度 h = 1.6 mm。

# 定义设计变量(示例值)
oDesign.ChangeProperty(
    ["NAME:AllTabs",
     ["NAME:LocalVariableTab",
      ["NAME:PropServers", "LocalVariables"],
      ["NAME:NewProps",
       ["NAME:f0",  "PropType:=", "VariableProp", "UserDef:=", True, "Value:=", "2.45GHz"],
       ["NAME:eps_r","PropType:=", "VariableProp", "UserDef:=", True, "Value:=", "4.4"],
       ["NAME:h",   "PropType:=", "VariableProp", "UserDef:=", True, "Value:=", "1.6mm"],
       ["NAME:L",   "PropType:=", "VariableProp", "UserDef:=", True, "Value:=", "28.5mm"],
       ["NAME:W",   "PropType:=", "VariableProp", "UserDef:=", True, "Value:=", "38mm"],
       ["NAME:xf",  "PropType:=", "VariableProp", "UserDef:=", True, "Value:=", "L/4"]]]])

# 用变量驱动几何:基板
oEditor.CreateBox(
    ["NAME:BoxParameters",
     "XPosition:=", "-W/2", "YPosition:=", "-L/2", "ZPosition:=", "0mm",
     "XSize:=", "W", "YSize:=", "L", "ZSize:=", "h"],
    ["NAME:Attributes", "Name:=", "Substrate",
     "MaterialValue:=", "\"FR4_epoxy\""])

# 用变量驱动几何:贴片
oEditor.CreateRectangle(
    ["NAME:RectangleParameters",
     "IsCovered:=", True,
     "XStart:=", "-W/2", "YStart:=", "-L/2", "ZStart:=", "h",
     "Width:=", "W", "Height:=", "L"],
    ["NAME:Attributes", "Name:=", "Patch",
     "MaterialValue:=", "\"copper\""])

这段脚本里,几何坐标和尺寸全部写成变量或表达式,没有出现硬编码的数值。当把 L 从 28.5 mm 改为 27.0 mm 时,贴片长度、馈电位置 xf(因为 xf = L/4)会同步变化。这就是“尺寸批量驱动”的基础。

材料属性的驱动方式与尺寸类似,但对象是材料定义而非几何坐标。HFSS 中材料既可以引用库材料(如 copper、FR4_epoxy),也可以自定义材料并给相对介电常数、损耗角正切、磁导率等赋变量。脚本中通常先创建或修改材料,再把材料名赋给对象的 MaterialValue。若希望批量改变基板介电常数,可把 eps_r 作为设计变量,在材料定义中引用它,而不是在每个对象上单独改。这样一次变量修改即可影响所有引用该材料的对象。

建议把“需要扫描的量”和“由扫描量推导的量”分开管理:前者定义为设计变量,后者写成表达式。这样变量表既清晰,又不会在批量驱动时误改中间量。

批量驱动的实现路径通常有三种。第一种是参数扫描:在 HFSS 内设置扫描变量和取值列表,由求解器逐个变体求解。第二种是脚本循环:在外部用 Python 或 VBScript 循环改变量值,每次修改后保存为新设计或新项目,再提交求解。第三种是变量表批量导入:把一组变量组合写成 CSV 或表格,由脚本逐行读取并写入设计。三种方式各有适用场景:参数扫描适合变量少、组合规整的情况;脚本循环适合需要同时改几何、材料、边界甚至求解设置的复杂批量;变量表导入适合已有试验设计(DOE)矩阵、需要严格复现组合的场合。

无论采用哪种方式,都要注意变量更新的时机。HFSS 的几何在变量改变后需要触发重建(Rebuild),否则后续操作可能仍引用旧几何。脚本中通常在改变量后显式调用重建或保存,再进入求解。此外,变量名应避免与 HFSS 内置函数名、单位符号冲突;表达式中的单位要统一,例如长度都用 mm,频率都用 GHz,避免混用导致量纲错误。

参数化建模与变量驱动关系图 设计变量(Design Variables) f0 = 2.45 GHz eps_r = 4.4 h = 1.6 mm L = 28.5 mm 表达式 / 局部变量 xf = L/4 W = 38 mm λg = c/(f0·sqrt(eps_r)) 探针长 = h + 0.5 mm 几何对象 / 材料属性 Substrate(FR4_epoxy) Patch(copper) Probe(圆柱) AirBox(辐射边界) 引用 驱动 批量驱动方式 参数扫描 变量少、组合规整 求解器逐个变体求解 适合快速趋势观察 脚本循环 改几何/材料/边界 保存新设计或新项目 适合复杂批量组合 变量表导入 CSV/表格逐行读取 严格复现 DOE 矩阵 适合试验设计场景 驱动 变量更新后重建

从图中可以看到,变量层、表达式层、几何/材料层构成一条清晰的驱动链:设计变量被表达式引用,表达式再驱动几何对象和材料属性;批量驱动方式作用在变量层,通过改变量值触发整条链更新。理解这条链,就能在脚本中判断“改哪个量、影响哪些对象、是否需要重建”。

实际脚本中还需要处理几个细节。第一,变量单位:HFSS 变量值可带单位,也可不带;不带单位时按当前模型单位解释。建议显式写单位,避免歧义。第二,变量命名:使用有意义的英文名,如 patch_L、sub_h,避免 a1、v2 这类无法追溯的名字。第三,材料变量:若把 eps_r 作为设计变量,材料定义中应引用变量名而非数值,否则改变量不会影响材料。第四,批量保存:脚本循环时,建议每个变体保存为独立项目或独立设计,并在文件名中体现变量组合,便于后续数据处理阶段对应结果。

变量表达式中的循环依赖会导致重建失败。例如 A = B + 1,B = A - 1,两者互相引用。定义变量时应保持依赖方向单一,从“独立变量”指向“派生变量”。

完成参数化建模后,可以用一个简单检查判断变量驱动是否生效:改变某个设计变量的值,观察模型树中相关对象的尺寸标注是否同步变化;若某个对象没有变化,说明它的尺寸没有引用该变量,仍是硬编码值。这一步在批量仿真前做一次,能避免大量无效计算。

参数化建模与变量驱动是批量仿真的入口。只有模型真正由变量控制,后续的扫描、循环、结果提取才有意义。脚本的价值不在于“自动点按钮”,而在于把设计意图写成可复现、可追溯、可批量执行的变量关系。