☰
飞秒激光烧蚀双温模型COMSOL建模与求解实践
2026/10/28 5:58:38 网站建设 项目流程

做飞秒激光烧蚀数值模拟,最容易被低估的一步,是把"一束光打上去、材料被削掉一层"翻译成一组能收敛的偏微分方程。很多人第一次接触这个题目,都是从双温模型开始的:两个温度场、一个耦合项、一个激光源项,看着公式没几行,真要放进 COMSOL 跑出物理上说得通的结果,中间隔着参数取值、量纲一致性、时间步限制、相变判据、网格无关性这一连串坑。这篇东西就是把我自己反复折腾下来的一套做法完整摊开:双温模型到底在算什么、参数怎么算、COMSOL 里两个系数型 PDE 怎么摆、求解器怎么配、结果怎么判、出问题怎么查。无论你是刚接触激光加工仿真、想跑通第一个算例的研究生,还是已经在做工艺参数筛选、需要一套可复用模型的工程人员,下面这些内容都能直接拿去对照着改。

1. 先想清楚:飞秒烧蚀为什么必须上双温模型

1.1 电子和晶格在脉冲结束前根本不在一个温度上

要理解这件事,先得把时间尺度摆在桌面上。常见的飞秒激光脉宽在几十到几百飞秒,而金属里电子吸收光子、被激发到高能态这个过程几乎是瞬时的,电子气的热化时间在几十到几百飞秒量级;但电子把能量交给晶格,靠的是电子-声子散射,这个特征时间通常在皮秒量级。也就是说,在一个 100 fs 的脉冲打完之后,电子气已经热得发烫,晶格还基本是室温,两者要再花几皮秒甚至十几皮秒才趋于同一个温度。

这个"时间差"是整套建模的关键。如果用普通的单温度热传导方程——也就是只有一个 T、一个热容、一个热导率——你等于默认电子和晶格永远处于局部热平衡,这在纳秒激光加工里问题不大,但在飞秒条件下直接就把最核心的物理过程抹掉了。具体后果是:单温度模型会严重高估热扩散范围,把本该集中在表层几十纳米内的能量摊到微米尺度,算出来的烧蚀深度偏大、热影响区偏宽、阈值通量偏低。

双温模型的价值就在这儿:它把能量传递链条拆成"光子→电子气→晶格"两段,电子气温度 Te 可以在脉冲期间单独飙到上万开尔文,而晶格温度 Tl 只吃到真正传过来的那部分能量。你后面要评估的烧蚀阈值、熔融深度、热影响区宽度、乃至双脉冲之间的热积累效应,全都建立在这个时间差上。所以只要你的脉宽在皮秒以下、而且关心的是表层几十到几百纳米的响应,双温模型就不是"可选项",是"必选项"。

1.2 双温方程组的每一项在说什么

把标准的一维双温方程组写出来,逐项过一遍:

Ce(Te)·∂Te/∂t = ∇·(ke(Te,Tl)·∇Te) − G·(Te − Tl) + S(x,t) Cl·∂Tl/∂t = ∇·(kl·∇Tl) + G·(Te − Tl)

第一项Ce·∂Te/∂t是电子气的内能变化率。这里 Ce 不是常数,金属里电子热容近似正比于电子温度,Ce ≈ γ·Te,γ 是电子热容系数。这个"正比"关系是后面一堆数值麻烦的根源:Te 高的时候 Ce 很大,Te 接近零的时候 Ce 趋近于零。

第二项∇·(ke∇Te)是电子热传导。金属的电子热导率也随温度变,文献里常见的一个近似是ke = ke0·Te/Tl,基于电子-声子散射的 Wiedemann-Franz 类关系。这个式子看着简洁,实际用起来很容易出问题,后面第 5 节会专门讲。

第三项−G·(Te−Tl)是电子-声子耦合项,G 是耦合系数,单位是 W/(m³·K)。这一项是整个模型的心脏,它决定了电子气把能量倒给晶格有多快,也直接决定了电子和晶格趋于平衡的特征时间τ_ep ≈ Ce/G。以常见的金属参数估算,τ_ep落在几皮秒这个量级,跟实验上观察到的电子-晶格平衡时间是对得上的。

右端最后的S(x,t)是激光源项,标准写法是:

S(x,t) = (1 − R)·α·I(t)·exp(−α·x)

R 是表面反射率,α 是吸收系数(单位 1/m),I(t) 是入射光强的时间包络,x 是深度坐标。这个式子隐含了一个假设:能量在深度方向按 Beer-Lambert 律指数衰减,而且是被电子气吸收的。对金属来说这个假设基本成立,因为电子密度高、吸收发生在一个很薄的表层。

晶格方程相对简单,Cl 一般取常数(Dulong-Petit 极限附近),kl 是晶格热导率,金属里它远小于电子热导率,所以在皮秒尺度内晶格的热扩散几乎可以忽略——这也是为什么烧蚀形貌往往比单温度模型预测的"干净"得多。

1.3 这套模型的适用边界在哪

双温模型好用,但它是有明确边界的。我一般会在建模前先过一遍这几条:

脉宽不能太短。低于大概 10 fs,载流子还没来得及建立费米分布,双温模型的前提就不成立了,得往量子动理学那边走。脉宽也不能太长,超过几十皮秒以后电子和晶格基本同温,双温模型的收益迅速下降,普通热传导模型就够用,还省算力。

峰值场强不能太高。粗略估一下:注量 1 J/cm²、脉宽 100 fs 对应峰值功率密度接近 1e17 W/m²,对应的电场幅值在 1e10 V/m 量级。这个量级的场强下,多光子电离、隧穿电离、雪崩电离都已经很显著了,材料的光学参数在脉冲过程中会发生剧烈变化——反射率下降、吸收增强,甚至形成等离子体屏蔽。双温模型里 R 和 α 都是当成常数(或者只随温度缓慢变化)来用的,它描述不了这个反馈。

它也不管物质怎么离开表面。双温模型给你的是一维温度场,至于材料是熔化后被压力推走、还是直接相位爆炸、还是形成纳米颗粒喷射,这些属于流体力学和相变动力学范畴。所以你会看到很多论文在双温模型算完 Tl 之后,直接用一个阈值判据(比如 Tl 超过某个临界温度)判定"这里被烧掉了",这是一种工程近似,不是完整的物理描述。

我的建议是:把双温模型定位成"参数窗口的快速筛选工具"和"表层热响应的定量估计器"。它的强项是在给定材料、给定脉宽下,快速扫出一张"注量—烧蚀深度—热影响区"的表,为实验参数选择提供方向。它不负责解释烧蚀形貌的所有细节,也不适合直接对标高注量下的复杂现象。

2. 建模前的参数账本:先把物理量算明白

2.1 从注量到峰值功率密度

实验上你手里的输入通常是注量 F(J/cm²)和脉宽 τp(fs),模型里需要的却是瞬时光强 I(t)。这一步换算看着简单,但单位错一次够你查半天。

先统一到 SI:1 J/cm² = 1e4 J/m²。假设时间包络是高斯型:

I(t) = I0·exp(−4·ln2·((t − t0)/τp)²)

这里的 τp 定义为半高全宽(FWHM)。对高斯脉冲积分,F = I0·τp·√(π/(4·ln2)) ≈ 1.0645·I0·τp,所以:

I0 ≈ 0.94·F/τp

拿 F = 1 J/cm²、τp = 100 fs = 1e-13 s 代进去:I0 ≈ 0.94 × 1e4 / 1e-13 ≈ 9.4e16 W/m²。这个数量级要记住,后面判断参数合理性和估计各种特征长度时随时用得上。

在 COMSOL 里我会把这个包络做成解析函数(Analytic 函数,表达式写0.94*F/taup*exp(-4*log(2)*((t-t0)/taup)^2)),或者直接在全局定义里写成变量。推荐用解析函数,好处是后面换脉冲形状(比如双脉冲、平顶脉冲、脉冲串)只要改函数不用动 PDE 设置。

顺手算一个能量密度,用来快速判断烧蚀是否"可能"发生:1 J/cm² 的注量沉积在吸收深度 15 nm 内,对应的体能量密度约1e4 / 15e-9 ≈ 6.7e11 J/m³。金的汽化体积焓大概在3.2e10 J/m³量级(后面表格里有算法),也就是说单从能量账上看,这个注量足以汽化掉几倍于吸收深度的材料——实际上因为反射损失和热扩散,真正去除的深度也就几十到几百纳米。这个估算不精确,但能帮你在跑模型之前先判断量级对不对。

2.2 光学参数:反射率和吸收深度怎么定

吸收系数 α 不是随便填的,它跟材料在特定波长下的复折射率直接挂钩:

α = 4π·k / λ

k 是复折射率的虚部(消光系数),λ 是真空波长。以常见的贵金属在 800 nm 附近为例,k 大约在 5 左右,代入得α = 4π×5 / 800e-9 ≈ 7.85e7 1/m,对应吸收深度1/α ≈ 13 nm。这个数字很关键:它告诉你源项在空间上有多"薄"。如果你的网格在表面 20 nm 内只放了一两个单元,源项积分出来的总能量就已经不可信了,后面算什么都白搭。

反射率 R 的取值更微妙。文献里给的通常是常温、正入射、特定波长下的值,比如贵金属在近红外能到 0.95 以上。但真实加工过程中表面粗糙度、氧化层、以及脉冲期间电子气升温都会改变 R,有人测到脉冲后反射率会下降几个百分点。实用的做法是:先用常数 R 跑通、拿到基线结果,然后做一次R ± 0.03的敏感性分析,看烧蚀深度变化多少。如果变化在你关心的精度之内,就固定成常数;如果变化很大,那说明模型对光学参数的依赖过强,得回头确认实验用的表面状态。

还有一个常被忽略的点:α 和 R 是配套的。既然源项里写的是(1−R)·α·exp(−αx),那 R 已经扣掉了反射损失,α 负责描述剩余能量在深度上的分布,两者不能重复计入。有些同学把材料总吸收率乘一遍又用 α 衰减一遍,能量直接少了一大截,结果就是阈值算得偏高。

2.3 热物性参数的温度依赖与取值策略

参数取值是这类模拟最容易出问题也最容易糊弄过去的地方。我的原则是:能查到的用文献值,查不到的用可计算的估算值,所有取值都记在一个表格里,注明范围和来源类型。

下面这张表是我给金属类材料建的一套基线参数,具体数值请按你实际选的材料和文献核对,这里只作为"参数该长什么样"的参考:

| 参数 | 符号 | 典型取值 | 单位 | 说明 | | 电子热容系数 | γ | 65 ~ 75 | J·m⁻³·K⁻² | 决定 Ce = γTe | | 电子-晶格耦合系数 | G | 2e16 ~ 5e16 | W·m⁻³·K⁻¹ | 决定 τ_ep = Ce/G | | 室温电子热导率 | ke0 | 300 左右 | W·m⁻¹·K⁻¹ | 用于 ke = ke0·Te/Tl | | 晶格热容 | Cl | 2.4e6 左右 | J·m⁻³·K⁻¹ | 由 3R/M × ρ 估算 | | 密度 | ρ | 19000 左右 | kg·m⁻³ | 常温值 | | 熔点 | Tm | 1300 左右 | K | | | 沸点/汽化温度 | Tv | 3000 左右 | K | | | 熔化体积焓 | ρLm | 1.2e9 左右 | J·m⁻³ | 摩尔熔化焓/M×ρ | | 汽化体积焓 | ρLv | 3.2e10 左右 | J·m⁻³ | 摩尔汽化焓/M×ρ |

晶格热容那一项值得自己算一遍,因为很多人直接抄文献里一个数就完事了。按 Dulong-Petit 定律,固体在高温下的摩尔热容趋近 3R ≈ 24.9 J/(mol·K),除以摩尔质量再乘密度就得到体积热容。比如摩尔质量 0.197 kg/mol、密度 19300 kg/m³,算出来3×8.314/0.197×19300 ≈ 2.44e6 J/(m³·K)。这个值在室温以上、熔点以下基本是平的,所以取常数是合理的。

γ 和 G 这两个参数是双温模型里最"玄"的。不同文献给的值能差两三倍,而且它们本身也随温度变化(尤其是 G,在电子温度很高时会因为散射机制改变而下降)。我的处理方式是:取文献中值跑基线,然后对这两个参数各做 ±30% 的扰动,看烧蚀阈值和峰值温度怎么变。如果结果对 G 极其敏感,那说明这个模型的预测能力受限于参数不确定性,报结果的时候必须把这个区间带上,不能只报一个点值。

提示:G 的取值直接决定电子和晶格多久趋于平衡。如果你算出来的τ_ep = Ce/G落在几十皮秒甚至上百皮秒,而文献里同类材料的实测平衡时间只有几皮秒,那基本可以确定 G 取小了或者 Ce 的表达式写错了,先别急着往下跑,把这个数对齐。

3. COMSOL 里把双温模型搭起来

3.1 用两个系数型PDE分别管电子和晶格

COMSOL 里实现双温模型有几条路:用传热模块硬凑(改热容、加热源,但两个温度场耦合起来很别扭)、用 PDE 接口手写(最灵活)、或者用自定义方程。我选的是数学接口下的系数型偏微分方程(Coefficient Form PDE),一个管 Te、一个管 Tl,理由很实在:系数形式允许你把热容、热导率、耦合项全部写成温度的函数,而且 COMSOL 会做量纲检查,单位写错当场报错,比事后查结果异常省事得多。

系数型 PDE 的标准形式是:

ea·∂²u/∂t² + da·∂u/∂t + ∇·(−c·∇u − α·∇u + γ) + β·∇u + a·u = f

双温模型里没有二阶时间项,所以 ea 全部填 0。两个方程的系数对应关系我整理成下面这张表,直接照着填就行:

| 系数 | 电子温度场 Te | 晶格温度场 Tl | | da | Ce(Te) | Cl | | c | ke(Te,Tl) | kl | | a | G | G | | f | G·Tl + S(x,t) | G·Te | | 其余 | 0 | 0 | | 因变量单位 | K | K |

这里有个非常关键的写法选择:把耦合项G(Te−Tl)拆成左边的a·u = G·Te和右边的f里的G·Tl,而不是直接把它整个丢到源项里写成f = −G(Te−Tl) + S。两种写法在数学上完全等价,但在数值上天差地别。写成隐式(进 a 和 f 的线性部分)之后,耦合项参与雅可比矩阵,牛顿迭代的收敛性好很多;写成显式源项,当 G 很大(1e16 量级)时方程会变得极度刚性,求解器经常直接卡死或者给出振荡解。这个改动我做过对比,同一个算例下显式写法的求解时间大概是隐式写法的三到五倍,而且更容易报不收敛。

因变量单位一定要设成 K。设了之后,COMSOL 会对每个系数的量纲做检查——比如 da 必须是 J/(m³·K),c 必须是 W/(m·K),a 必须是 W/(m³·K),f 必须是 W/m³。你要是把 α 按 1/cm 填进去,或者把脉宽按 ps 代进去,量纲检查会立刻告诉你哪里不对。这个功能救过我很多次。

3.2 源项、耦合项与边界条件的写法

源项 S 在两个方程里都出现,但只加在电子方程上——物理上就是激光能量先被电子吸收。表达式:

S = (1 − R)·alpha·I0·exp(−4·log(2)·((t − t0)/taup)^2)·exp(−alpha·x)

其中 x 是深度坐标(一维模型直接就是空间坐标,二维轴对称里是 z 方向)。这里要注意 exp 的嵌套:一个是时间的,一个是空间的,别写串了。我建议拆成两个变量分别定义,比如Itime和Sdepth,然后S = (1-R)*alpha*Itime*Sdepth,这样可视化的时候能单独看时间包络对不对。

边界条件方面,一维模型的四条边各管一件事:

  • 表面(x = 0):电子和晶格都设成热绝缘(−n·q = 0)。有人会问电子热流要不要考虑热电子发射,理论上高 Te 时确实有电子逸出带走能量,但量级上比起体相沉积小几个数量级,除非你在算极高注量下的近阈值附近精细结构,否则忽略掉没问题。
  • 底面(x = L):设成热绝缘或者固定温度,取决于你模拟的是厚板还是薄膜。厚板的话底面离得足够远(后面算热扩散长度),两种设定结果一样;薄膜的话底面就是衬底,得按实际界面热阻来设。
  • 二维轴对称的话,对称轴设轴对称条件,径向边界设绝缘或者远场固定温度。

我把常会踩到的边界坑列一下:一是底面设得太近。晶格热扩散长度在纳秒尺度下能到一微米以上,如果你的计算域只有 500 nm 深,底面边界条件会直接污染表面的冷却曲线,表现为温度降得异常快。二是表面设成了"热通量"而不是"热绝缘",然后源项又在体里加了一遍,等于能量进了两次。三是二维轴对称模型里忘了把源项沿径向做衰减,结果整个面上都被均匀加热,算出来的烧蚀坑是一整个平面。

径向分布写成高斯的话,光强部分是exp(−2r²/w0²)(w0 是束腰半径),空间项乘起来就是:

S(r,z,t) = (1−R)·alpha·I0·exp(−2r²/w0²)·exp(−4·log(2)·((t−t0)/taup)^2)·exp(−alpha·z)

注意这里的 I0 要按峰值功率密度乘以一个由光斑面积归一化后的量来理解,或者直接在全局参数里把 F 定义成峰值注量,别搞混了。

3.3 初始条件、脉冲波形与求解器配置

初始条件简单:Te(0) = Tl(0) = T0,一般是 300 K。但如果你的模型接着上一次脉冲跑(多脉冲累积),那就得把上一次的终态读进来当初始值,用 COMSOL 的"研究 2 的初始值来自研究 1"这类设置。

求解器配置是这类模拟里最容易让人卡住的地方,原因在于时间尺度的跨度。脉冲本身只有 100 fs,电子-晶格平衡是几个皮秒,而整个热扩散冷却过程要跑到纳秒甚至几十纳秒。如果你把最大时间步设成 1 fs 然后跑 10 ns,那就是一千万步,普通工作站跑到天亮都不一定完。

我的做法是分段求解,把时间轴切开:

| 阶段 | 时间范围 | 最大时间步 | 求解器设置 | | 脉冲期 | 0 ~ 3τp | τp/20 | BDF,自由步长,相对容差 1e-4 | | 平衡期 | 3τp ~ 20 ps | 0.2 ps | BDF,自由步长,自动牛顿 | | 冷却期 | 20 ps ~ 10 ns | 2 ps | BDF,自由步长,容差可放宽到 1e-3 |

每一段用上一段的终态作为初值。这样脉冲期的精度能保证(每 5 fs 至少一个点),冷却期又不会被强制小步长拖死。实测下来,一个一维算例三段加起来几秒钟到几十秒,二维轴对称的长一点但也在几分钟量级。

另外一个重要的开关是"自动牛顿"里的阻尼。双温方程在脉冲峰值附近非线性很强(Ce 正比于 Te,源项又是指数型时间包络),全牛顿步经常过冲导致 Te 变成负值。把阻尼系数调到 0.7 ~ 0.9,或者干脆对 Te 和 Tl 用分离式求解器( segregated),一个场一个场地解,稳定性会好不少,代价是每步多几次迭代。我一般先用分离式跑通、确认量级对了,再换全耦合看能不能加速。

3.4 网格怎么划才不浪费算力

网格这块的核心思路是:哪里梯度大就在哪里加密,但加密的上限由物理特征长度决定,超过就是浪费。

两个特征长度必须先算出来。电子热扩散长度:

Le = sqrt(ke·τ/Ce)

取 ke ≈ 300 W/(m·K)、Ce ≈ 3e5 J/(m³·K)(对应 Te 几千 K 的中等值)、τ 取电子-晶格平衡时间 1 ps,算出来Le ≈ sqrt(300×1e-12/3e5) ≈ 32 nm。晶格热扩散长度:

Ll = sqrt(kl·τ/Cl)

取 kl ≈ 300 W/(m·K)(这里用总热导率粗估)、Cl ≈ 2.4e6 J/(m³·K)、τ 取 10 ns,算出来Ll ≈ sqrt(300×1e-8/2.4e6) ≈ 1.1 μm。

这两个数直接决定了域深和网格。域深至少取 3Ll,也就是 3 μm 以上,才能保证底面边界不影响表面结果;表面附近 50 nm 以内必须加密到纳米级,因为吸收深度只有 13 nm、电子热扩散长度只有 30 nm 左右。

我的设置是这样的:一维模型里,0 到 100 nm 用最大单元 1 nm 的均匀网格,100 nm 到 1 μm 用指数分布(增长率 1.2),1 μm 到 5 μm 用最大单元 200 nm 的粗网格。总单元数几千到一万,跑起来很轻。二维轴对称的话,同一个思路用在 z 方向,径向在束腰范围内加密、往外逐渐放宽。

注意:判断网格够不够细,不要看总单元数,看表面第一个单元在吸收深度内占的比例。如果α⁻¹内少于 10 个单元,源项积分的误差就很可观了,表现为总沉积能量比理论值低几个百分点。

4. 从温度场到烧蚀深度:判据与相变处理

4.1 阈值判据怎么选

双温模型给你的是 Te(x,t) 和 Tl(x,t),但"烧蚀深度"需要一个判据把温度翻译成几何。常见的判据有三类,各有各的适用场景。

第一类是温度阈值判据:表面或某个深度处的晶格温度 Tl 超过临界温度 Tc 就认为被去除。Tc 取汽化温度、或者 0.8~0.9 倍汽化温度(考虑表面过热和团簇喷射)。这个判据最简单,实现也最容易——跑完之后在结果里对 Tl 场做一次后处理,找 Tl = Tc 的等值面深度即可。

第二类是能量/焓判据:把从表面到某个深度的能量积分起来,跟该层材料从初始温度加热到汽化所需的焓比较,累计够了就认为这一层被去掉。这个判据比纯温度判据稳健,因为它天然考虑了潜热和热扩散的影响,不会因为某个点瞬时过冲就多算。

第三类是累积效应判据,多脉冲场景才用得上:把每个脉冲的贡献累加,考虑前一个脉冲留下的残余热量。双温模型本身不处理"表面被削掉之后下面露出来的是什么",所以多脉冲要么用移动边界,要么就在每个脉冲后手动更新几何,比较麻烦。

我自己用得最多的是第二类,具体操作是:先在 COMSOL 里导出表面到 500 nm 深度范围内 Tl(z, t_end) 的分布,然后在外部分析里计算累积焓,找到累积焓等于汽化焓的深度。这种做法的一个好处是它不依赖单个时间点的温度峰值,对求解器步长误差不敏感。

用温度阈值判据也能得到一个有用的副产品:阈值通量。固定脉宽,扫一系列注量 F,对每个 F 跑一次,记录表面 Tl 的峰值,画出来找 Tl 峰值等于 Tc 的那个 F,就是模型预测的烧蚀阈值。我一般扫 8~12 个点,用插值定位,精度够用。这个过程听起来笨,但因为是 1D 模型、单次计算几十秒,整体也就几分钟的事,比在论文里找一个阈值然后说服自己"应该差不多"可靠得多。

4.2 潜热的表观热容处理

标准双温方程里没有相变,熔化和汽化这两段吸收的能量被漏掉了。忽略潜热的后果是:温度曲线在熔点附近"冲"得太快,算出来的烧蚀深度偏大,尤其是接近阈值的时候误差能到 20% 以上。

工程上最省事的处理是表观热容法:把潜热摊到一个温度区间里,等效地增大该区间的热容。以熔化为例如,写成一个高斯型分布在熔点附近:

Cl_eff = Cl + (ρLm/(ΔT·sqrt(π)))·exp(−((Tl − Tm)/ΔT)²)

这里 ρLm 是熔化体积焓,ΔT 是涂抹宽度,一般取 50~150 K。这个式子的含义是:在 Tm 附近的一段温度内,材料"额外"吸收 ρLm 的能量,积分起来正好等于潜热。

汽化那一段同理,只是焓值大得多、涂抹宽度也大一些。汽化的体积焓比熔化大二十多倍,涂到同样宽的温度区间会让那一段热容暴涨,反而害得求解器步长被迫压得很小。我的经验是汽化段单独处理:要么把 ΔT 放宽到 300~500 K,要么干脆不用表观热容,改用累积焓判据来判定去除深度,避开这个数值麻烦。

提示:加了表观热容之后,温度曲线在相变区间会变成一段"平台",这是正常的,别以为是求解器出了问题。如果平台位置的温度明显偏离真实的熔点,那多半是 ΔT 设得太宽,把潜热涂到不该涂的地方去了。

还有一个容易忽略的点:晶格热容在高温下其实不是常数。接近熔点时 Cl 会上升几个百分点(高温下 3R 的极限值加上电子贡献)。如果你的注量很高、Tl 冲到两三千开尔文,用常数 Cl 会有系统性偏差。妥协的做法是给 Cl 加一个小的温度修正项,或者干脆按文献给的高温值取,把常温到熔点的平均值用上。

4.3 移动边界与后处理估算的取舍

严格来说,材料被去除之后表面是在向下移动的,这需要用变形几何(ALE)来实现:表面边界按去除速率移动,域随时间收缩。COMSOL 里可以做,但我一般不这么做,原因是双温模型在移动边界下会变得非常脆弱——表面移动导致网格畸变,需要重剖分,重剖分又打断求解器的连续性,还得处理"表面温度在移动过程中如何更新"这个前后不一致的问题。

更实用的路线是:不改几何,跑完之后在结果里估算去除深度。具体做法是取脉冲结束后一段时间(比如 1 ns,此时热场基本重分布完成)的 Tl 分布,找 Tl 达到临界温度的深度,或者按累积焓判据找出深度。这个估算在单脉冲、中等注量下跟移动边界结果差不太多,而且完全避开了网格畸变问题。

如果你确实需要变形几何——比如模拟多脉冲形成深孔、或者需要追踪表面形貌演化——那我的建议是分段耦合:先用固定几何跑完单个脉冲,算出这个脉冲的去除深度,然后手动把这个深度作为几何更新量,重建网格跑下一个脉冲。这样每个脉冲内部是干净的固定网格问题,脉冲之间用脚本或参数扫描来串。麻烦一点,但稳定性高得多。

还有一个后处理的细节:不要用脉冲刚结束时(比如 t = 500 fs)的温度分布来判定去除深度。那一刻电子气还没把能量全部交给晶格,Tl 还在上升过程中,你会系统性地低估深度。至少等到电子-晶格平衡之后(几个皮秒),最好是等到热扩散基本稳定(百皮秒到纳秒),结果才收敛。

5. 报错和结果异常排查实录

5.1 负温度、温度爆炸与不收敛

这是最高频的一类问题,我把遇到过的现象和对应原因整理成一张表,方便对照:

| 现象 | 最可能的原因 | 处理办法 | | Te 出现负值 | Ce = γTe 在低温趋零,热容太小导致温度跳变 | 给 Ce 加下限,如 Ce = γ·max(Te, 0.1T0) | | Te 冲到 1e5 K 以上 | 源项单位错(如 α 用了 1/cm)或注量换算错 | 检查alpha单位、F 是否从 J/cm² 换成 J/m² | | 非线性求解器不收敛 | ke = ke0·Te/Tl 在 Te≫Tl 时放大几十倍 | 给比值限幅,或改用常系数先跑通 | | 求解时间异常长 | 最大时间步被全程限制在飞秒量级 | 分段求解,冷却期放宽步长 | | 解出现空间振荡 | 表面网格太粗,源项在单元内积分失真 | 表面 50 nm 内加密到 1 nm 以下 | | 温度曲线有台阶 | 表观热容的 ΔT 设得太窄 | 放宽涂抹区间,或检查 λ 潜热单位 |

重点讲一下ke = ke0·Te/Tl这条。它在物理上有依据,但数值上极其危险:脉冲峰值时 Te 可能是 Tl 的几十倍,代进去 ke 就变成室温值的几十倍,电子热扩散长度随之暴增,等效于瞬间把能量摊平。表现出来就是表面温度上不去、烧蚀深度算得极小,或者反过来因为热导率太大致使雅可比矩阵条件数爆炸、迭代直接发散。

我的处理是双管齐下:一是给比值加限制,写成ke = ke0·min(Te/Tl, 5)之类,物理上对应高电子温度下散射增强导致热导率饱和;二是先用常数 ke 跑一遍拿到基线,再用温度依赖版本对比,确认两者的差异在可解释范围内。这个对比本身也很有信息量——如果换成温度依赖后结果变化巨大,说明你的工作点正好落在参数敏感区,报结果时得说明。

Ce 的低温问题同样值得一说。Ce = γTe在 Te = 100 K 时只有室温值的几十分之一,如果求解器某一步过冲把 Te 拉到很低,热容骤降会让下一步温度跳得更离谱,形成正反馈。给一个温和的下限(比如Ce = γ·sqrt(Te² + (T0)²)这种平滑形式,或者干脆Ce = Ce0 + γTe)就能避免,对结果的影响在中高温区间可以忽略。

5.2 能量不守恒与网格依赖

能量守恒是我每次跑完必做的一个自检。做法很简单:在 COMSOL 里定义两个积分量,一个是总的沉积能量:

E_in = ∫∫ S(x,t) dx dt

另一个是最终的总内能增量:

E_out = ∫ (Ce·Te + Cl·Tl) dx − ∫ (Ce·T0 + Cl·T0) dx

理论上两者应该相等(绝热边界下)。实际能对上 95% 以上就算正常,差太多就要查。常见的失配来源有三个:一是表面网格太粗,源项积分本身就偏小;二是时间步太大,脉冲的峰值被"漏采"掉了一部分;三是底面边界不是绝热的,能量漏出去了。

网格依赖性的检查方法:把表面网格密度翻倍、底面网格也加密一档,重跑,比较表面 Tl 峰值和烧蚀深度。如果两者变化小于 1~2%,认为网格收敛;如果变化超过 5%,说明还差得远,继续加密。我见过有人用 20 nm 的表面网格跑 13 nm 吸收深度的算例,结果表面温度比收敛值低了将近 40%,这种情况下讨论烧蚀阈值毫无意义。

5.3 结果和文献对不上的三种常见原因

就算模型跑通了、能量也守恒了,结果跟文献对不上也是常事。按我的经验,原因往往在这三处:

参数不一致。尤其是 G 和 γ 这两个,不同文献差两三倍很正常。对不上的时候先别怀疑模型,先去核对对方用的参数值。有些论文只给 γ 不给 G,或者用的是从别的材料借来的值,这种情况下的对比意义有限。

脉宽定义不一致。有人用 FWHM,有人用 1/e 宽度,还有人用积分等效宽度。同样是"100 fs",不同定义下峰值功率密度能差 40% 以上,阈值自然对不上。看文献的时候一定确认清楚人家用的是哪种定义,别想当然。

判据不一致。烧蚀阈值这东西,用"表面温度达到沸点"和"累积焓达到汽化焓"算出来的值能差 20~30%,更别说还有人用"Tl 达到 0.9 倍临界温度"这种经验修正。对比之前先确认双方的判据是不是一回事。

提示:和文献对比的正确姿势是复现对方的参数和判据,先看能不能对上对方的曲线,确认模型实现无误,再去比你自己关心的量。直接拿自己的结果去比别人的结论,中间变量太多,对不上也说不清是谁的问题。

6. 结果验证与参数敏感性分析

6.1 三条曲线判断模型是否可信

模型跑完之后,我一般先看三条曲线,它们能覆盖大部分实现错误:

第一条是表面 Te 和 Tl 随时间的变化。正确的形态应该是:Te 在脉冲期间迅速上升,峰值出现在脉冲峰值稍后一点,量级在几千到几万开尔文(取决于注量);Tl 上升明显滞后,在脉冲结束时还很低,之后几个皮秒内加速上升,最终在十几皮秒时与 Te 汇合。如果两条曲线在脉冲期间就重合了,说明 G 取太大或者脉宽设太长;如果几十皮秒后还没汇合,说明 G 取太小。

第二条是最大温度沿深度的分布。Te 应该在表面最高、在几十纳米内快速衰减(衰减长度对应电子热扩散长度),Tl 的分布更平缓、延伸更深。如果 Te 的分布在表面出现一个"凹陷",那多半是源项写成了面热源而不是体热源,或者吸收系数单位错了。

第三条是不同注量下的峰值温度曲线。这条曲线应该单调上升,且在低注量区近似线性、在高注量区因为 Ce ∝ Te 而变缓。如果出现非单调或者斜率突变,先查相变处理(表观热容的高斯是不是位置写错了)和源项的时间积分。

这三条曲线都对上了,基本可以确认实现层面没问题,剩下的就是参数和物理假设的讨论了。

6.2 网格无关性与能量守恒自检

这两个检查我在前面提过,这里给一套可以固定执行的操作流程:

先做能量守恒。定义 E_in 和 E_out 两个积分量,看比值。低于 0.9 就回去查网格和边界。这个检查每次改动设置之后都要重做,因为它对源项和边界的错误极其敏感。

再做网格无关性。选三档网格(粗、中、细,单元数大约 2 倍递增),比较表面 Tl 峰值和 1 ns 时刻的烧蚀深度。三档之间如果细和中差不到 2%,用中档就够;如果还在明显变化,继续加密。注意这个检查要在固定的时间步设置下做,否则分不清是网格误差还是时间误差。

最后做时间步无关性,方法和网格一样,把最大时间步减半重跑,看峰值温度变化。脉宽附近的时间步对峰值温度影响很大,这一项不能省。

6.3 参数敏感性:哪些参数最值得花时间

参数敏感性分析不是为了凑工作量,是为了知道你的结论有多"硬"。我做过一轮系统的单参数扰动,结论大致是这样:

最敏感的是吸收系数 α 和反射率 R。α 变化 20% 能让烧蚀深度变化接近 30%,因为它们直接决定能量沉积的空间分布。这两个参数的取值一定要有依据,别随手填。

其次是电子-晶格耦合系数 G。G 影响的是能量从电子气转移到晶格的速度,对峰值 Te 影响大,对最终的烧蚀深度影响相对小(因为能量总量没变,只是分配快慢不同)。如果你关心的是表面电子温度这种瞬态量,G 的取值必须仔细;如果只关心烧蚀深度,G 的不确定性可以容忍一些。

相对不敏感的是晶格热导率 kl 和晶格热容 Cl。在皮秒尺度上晶格几乎不导热,kl 取大取小对结果影响都在几个百分点以内。这也解释了为什么很多论文里 kl 直接取一个粗估值也没人质疑。

电子热容系数 γ 的影响居中。它通过 Ce 影响电子气的温升幅度,进而影响 Te 峰值和电子热扩散长度。γ 变化 30%,峰值 Te 大概反向变化 20% 左右,烧蚀深度变化在 10% 以内。

这套敏感性排序的实际意义是:如果你的模型结果和实验对不上,优先去核对光学参数(α、R),其次核对 G,别在 kl 上浪费时间。

最后分享一个我自己常用的做法:把整个模型做成参数化扫描,注量取 8~10 个点,脉宽取 3~4 个值,一键跑完,输出一张"注量—脉宽—烧蚀深度"的表。这张表比任何单点结果都有用,因为实验上你调参数也是在这个二维空间里找窗口,模型直接给你一张地图,比反复试错高效得多。跑这种批量算例的时候记得把网格和时间步固定下来,别每个点都用自适应设置,否则数据之间的可比性就没了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询