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。
五、一个可复现的示例:温度依赖导热系数
下面给出一个可直接在 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]),验证函数返回值与表格一致;第三,做一次常数与函数对比求解,观察温度场或应力场差异是否在预期方向。只有函数被物理场真正引用、且作用域可见,材料属性才算“赋值成功”。