3. 材料属性与函数定义

在 COMSOL 中,几何只决定“在哪里算”,网格只决定“算多细”,而材料与函数决定“按什么规律算”。同一套几何和边界条件,仅把材料从线弹性换成超弹性、或把介电常数从常数改成随温度变化的插值函数,结果可能完全不同。本节围绕三条主线展开:材料库的调用与继承、自定义材料参数的建立、以及变量与函数如何真正作用到物理场方程中。

一、材料库调用:从内置数据到模型节点

COMSOL 内置材料库按材料大类组织,例如 Built-in > Semiconductor > Si - Silicon、Built-in > Liquids > Water, liquid、Built-in > Gases > Air。在“材料”节点右键选择“从材料库添加”,即可把某个材料添加到当前组件。添加后,材料节点下会出现若干“材料属性组”,每组对应一个物理量,例如硅的 Basic 组包含相对介电常数、带隙、电子/空穴迁移率等。

材料库调用的关键不是“点一下添加”,而是理解属性组的物理含义与适用物理场。以结构力学为例,材料需要提供杨氏模量 E、泊松比 nu、密度 rho;以传热为例,需要导热系数 k、恒压热容 Cp、密度 rho。若材料库中某属性缺失,物理场会报“未定义材料属性”,此时必须手动补充。材料库数据通常带温度依赖表达式,例如硅的带隙随温度下降,调用后会自动以温度 T 为自变量,这一点在后续与自定义函数叠加时要特别注意。

二、自定义材料参数:常数、表达式与温度依赖

当材料不在库中,或需要研究某种假设材料时,应新建“空材料”并手动填写属性。自定义参数有三种典型写法:

  • 纯常数:如 E = 210[GPa]、nu = 0.30、rho = 7850[kg/m^3],适合线弹性小变形分析。
  • 带单位的表达式:如 k = 0.6[W/(m*K)]*(1+0.002*(T-293[K])),把温度依赖直接写进属性框。
  • 引用函数:如 k = k_T(T),其中 k_T 是预先定义的插值函数,适合实验数据点较多、需要平滑插值的情况。

自定义材料时最容易出错的是单位一致性。COMSOL 允许在数值后写单位,但若忘记写单位,软件会按 SI 基本单位解释。例如把 E = 210 写成无单位,实际会被当作 210 Pa,导致结构几乎无刚度。建议所有自定义参数都显式带单位,并在“单位”列核对量纲。

材料属性中的温度依赖表达式,其自变量 T 默认取物理场中的绝对温度。若模型使用摄氏度,需写成 T[1/K] 或先定义 T_C = T - 273.15[K] 再引用,避免量纲错误。

三、变量与函数:让参数“活”起来

变量与函数是材料属性从“静态数值”走向“空间/时间/场依赖”的桥梁。COMSOL 中常用三类定义:

类型典型用途示例
参数(Parameters)全局常数、几何尺寸、载荷幅值L = 0.1[m]、F0 = 500[N]
变量(Variables)随空间或解变化的中间量sigma_vm = sqrt(...)、q_conv = h*(T-Tinf)
函数(Functions)插值、解析、分段、随机等k_T(T) 插值、step1(t) 阶跃

函数定义中,插值函数最常用。以导热系数随温度变化为例,在“全局定义 > 函数 > 插值”中设置:

函数名称: k_T
数据格式: 表格
T 值:   273  373  473  573  673  773
k 值:   401  399  393  384  372  357
插值方法: 线性
外推: 常数

定义完成后,在材料导热系数框中填入 k_T(T),物理场在每次迭代时都会用当前温度查表得到 k,从而实现非线性传热。若数据点较少,也可用解析函数,例如 k = 401[W/(m*K)] - 0.05[W/(m*K^2)]*(T-273[K])。

四、赋值到物理场:作用域与优先级

变量和函数定义好后,必须被物理场“看见”才能生效。COMSOL 的作用域规则是:全局定义对所有组件可见,组件定义只对该组件可见,物理场接口下的定义只对该接口可见。若在“组件 1 > 定义 > 变量”中定义 h_eff,则只有组件 1 的物理场能引用;若在“全局定义 > 变量”中定义,则所有组件都能引用。

赋值时还要注意覆盖顺序:材料属性中的表达式优先级高于材料库默认值;物理场节点中的局部定义优先级高于全局定义。例如材料中写了 k = k_T(T),而物理场中又定义了同名变量 k,则物理场局部定义会覆盖材料属性。为避免混乱,建议变量命名带前缀,如 mat_k、phys_h。

材料属性与函数在物理场中的赋值链路 材料库调用 Built-in 材料 Si / Water / Air 属性组自动加载 E, nu, rho, k, Cp 温度依赖表达式随库带入 自定义材料参数 空材料 + 手动填写 E = 210[GPa] k = k_T(T) rho = 7850[kg/m^3] 显式带单位,避免量纲错误 函数与变量定义 插值函数 k_T(T):273→401, 373→399, 473→393 解析函数 step1(t)、变量 q_conv 参数 L = 0.1[m]、F0 = 500[N] 作用域:全局 / 组件 / 物理场 局部定义覆盖全局同名变量 物理场接口中的属性赋值 固体力学:E, nu, rho ← 材料节点 传热:k, Cp, rho ← 材料节点 + 函数 k_T(T) 求解器迭代 T 更新 → k_T(T) 重算 → 刚度/导热矩阵更新 非线性 反馈 常见错误 漏单位 / 作用域不可见 / 同名覆盖

五、一个可复现的示例:温度依赖导热系数

下面给出一个可直接在 COMSOL 中复现的最小示例,用于观察函数赋值对结果的影响。对象为 0.1 m × 0.1 m 二维方块,材料为自定义合金,密度 rho = 7800[kg/m^3],恒压热容 Cp = 500[J/(kg*K)],导热系数用插值函数 k_T(T) 定义,数据点如下:

T [K]:   300   400   500   600   700   800
k [W/(m*K)]: 45   43   40   36   31   25

左边界设为 T = 800[K],右边界设为对流换热 h = 50[W/(m^2*K)]、Tinf = 300[K],上下边界绝热。若把 k 当作常数 45 计算,右边界温度约为 620 K;改用 k_T(T) 后,由于高温区导热系数下降,热量更难传出,右边界温度会升高到约 660 K 左右(示例为合理估算,实际数值以求解结果为准)。这一差异说明:函数赋值不是装饰,而是直接改变温度场分布。

操作时,在“材料 > 基本 > 导热系数”中填入 k_T(T),并确认函数 k_T 定义在“全局定义”下。若求解器报“未定义变量 k_T”,通常是函数定义在组件下而材料节点在全局作用域,需把函数移到全局定义,或在材料中改用组件内变量。

插值函数的外推方式要谨慎选择。若温度超出数据范围,选择“常数”会保持端点值,选择“线性”会按最后两点斜率外推,可能得到负的导热系数。工程上建议把数据范围覆盖实际工况,或改用“最近邻”外推并检查结果合理性。

六、检查与验证

完成赋值后,建议按以下顺序检查:第一,在“材料”节点右键“显示材料属性”,确认每个物理场需要的属性都有来源;第二,在“结果 > 派生值 > 全局计算”中输入 k_T(500[K]),验证函数返回值与表格一致;第三,做一次常数与函数对比求解,观察温度场或应力场差异是否在预期方向。只有函数被物理场真正引用、且作用域可见,材料属性才算“赋值成功”。