☰
金膜表面等离子体共振的COMSOL建模:共振角仿真与参数优化
2026/9/28 8:15:25 网站建设 项目流程

近几年做SPR相关的光学仿真,我几乎每次都会先在COMSOL里把金膜-介质体系的角度响应曲线算出来,再决定实验到底该在哪个角度附近采集数据。这个操作听起来简单,但真的自己动手搭模型时会发现,坑全藏在细节里:材料数据选哪组、极化是不是p偏振、边界怎么不反射、网格能不能咬住50nm的金膜,随便一个地方出问题,共振角度就能偏出好几度,甚至干脆看不到反射谷。

这篇文章就围绕“金膜表面等离子体共振(SPR)在COMSOL中的建模观察”这个主题,把我实际搭建和调参的过程拆开讲清楚。重点不是罗列菜单,而是说清楚每个关键设置为什么这么做,以及遇到曲线异常时怎么排查。适合刚接触SPR仿真、或者已经能跑通示例但想自己建模的读者参考。

1. 共振角到底在测什么:波矢匹配决定一切

很多人一上来就找COMSOL案例库,能跑通官方例子,但换个角度、换层膜、换介质就不灵了。原因是没抓住SPR的基本物理:共振角度不是软件算出来的一个花哨结果,它是入射光波矢与表面等离激元波矢匹配时的入射角。

1.1 Kretschmann结构:棱镜、金膜、被测介质三层棋盘

实际SPR实验中用得最多的是Kretschmann结构:一束光从高折射率棱镜入射到镀在棱镜底面的金膜上,金膜另一侧是待测介质(通常是水溶液或空气)。当入射角合适时,金膜界面上会激发表面等离子体波,入射光的能量大量耦合进等离激元,反射光强因此出现一个陡峭的低谷。

COMSOL里仿真这个结构,最小模型就是三层:上半空间是高折射率棱镜,中间是一层50nm左右的金膜,下半空间是被测介质。这里很多人会纠结要不要把棱镜画成三角形或者梯形,实际做下来,纯为了看共振角度,完全可以把棱镜当作一个无限大的高折射率介质域,用散射边界配合平面波入射来等效。只要光从棱镜介质一侧入射到金膜这个条件不变,三角形棱镜带来的只是光束几何变换,不会改变共振角的物理本质。

1.2 共振角是手算就能预判的,仿真只是把这个角度精确找出来

表面等离子体波的波矢沿界面方向是:

k_sp = k0 * Re[ sqrt(ε_m * ε_d / (ε_m + ε_d)) ]

其中ε_m是金膜的复介电常数(实部为负),ε_d是被测介质的介电常数。入射光在棱镜里沿界面方向的分量是:

k_x = k0 * n_p * sin(θ)

共振发生时两者相等。整理一下就能得到共振角:

θ_sp = arcsin( n_eff / n_p ) n_eff = Re[ sqrt(ε_m * ε_d / (ε_m + ε_d)) ]

我习惯在动手建模前先按这个公式估算角度,后面看仿真曲线时会非常有底。举一组典型参数:波长633nm,BK7棱镜折射率1.52,金膜介电常数取-11.7+1.25i,水折射率1.33。代入计算,n_eff大约1.44,共振角大约71.6°。如果被测介质换成空气(n=1.0),共振角会掉到大约43.5°。这个差距非常大,因此折射率变化一个很小的量,共振角就会明显移动,这正是SPR传感器有极高灵敏度的来源。

没有这个理论预判,仿真做出来一个谷就以为是对的,很容易被错误数据带偏。

2. 几何、材料与极化:先决定共振角可不可信

模型几何本身很简单,但材料数据和物理场极化的选择,直接决定了共振角度是否可信。这一部分我愿意多说几句,因为新手翻车基本全在这。

2.1 等效几何:棱镜用半无限域代替,节省时间且够用

二维模型里我通常这样布局:

  • 顶层区域:棱镜介质,折射率1.52,高度3~5μm
  • 中间层:金膜,厚度50nm,宽度10~20μm
  • 底层区域:被测介质(水),高度2~3μm

从顶部入射边界面激发平面波,让它斜向下传播到金膜上表面。模型宽度选择10~20μm是权衡过的:太窄会引入侧向边界反射,太宽则网格数量上升。10μm宽度配合两侧的吸收边界,反射率曲线已经比较光滑,20μm效果更好。竖直方向不需要很高,因为金膜本身几乎不透光,水里的透射场很快就衰减掉了,棱镜侧主要关心的是反射波。

这里千万不要把金膜画成一个“面”,一定要画成有厚度的域。虽然SPR物理上可以简化为界面条件,但COMSOL中体现金膜内部的电场衰减和损耗,需要一个真实厚度的几何域,尤其后续要观察场分布时。

2.2 金的复介电常数:选错数据,共振角差5度不稀奇

这是最关键的材料设置。金在633nm附近的介电常数,不同文献给出来的差异很大,常见的有-11.7+1.25i、-15.9+1.08i、-18.3+1.3i等。这些数据都是不同制备条件下测得的,膜厚、沉积速率、表面粗糙度都会影响实际光学常数。

COMSOL内置材料库里确实有“金”的光学数据,但如果你直接在材料库中选择金并应用,默认的数据未必适合你复现的实验体系。我更推荐的做法是查自己实验对应波长下的金膜光学常数,或者先用公认的文献数据,比如Johnson & Christy数据,再通过仿真-实验对比来反推自己膜层的真实介电常数。

具体操作上,在材料节点里新建一个空材料,直接设置相对介电常数。以ε=-11.7+1.25i为例,在相对介电常数里把实部填-11.7,虚部填1.25。注意COMSOL中有些接口允许用折射率输入,但折射率虚部的符号约定容易搞混,所以最稳妥的直接填ε实部和虚部。

棱镜和水的设置就简单了:棱镜的相对介电常数是1.52²=2.31,水的相对介电常数是1.33²=1.77。如果你后面要做折射率扫描,把水的折射率定义成全局参数n_d,然后相对介电常数直接写成n_d²,后续换介质时就不用改材料。

2.3 极化一定要是p偏振:TE模式下永远不会出现共振谷

SPR只能由p偏振光激发。在三维语言里,p偏振就是电场矢量在入射面内的偏振;放到二维模型里,等效于磁场垂直于仿真平面。因此在COMSOL选择物理场接口时,要选择“电磁波,频域”中的面外磁场版本,很多版本里会标注为TM波。如果你用的是默认的面外电场版本,也就是说电场垂直于仿真平面,那算出来的是TE偏振,金膜界面不会激发表面等离激元,反射率曲线会是一条光滑的无谷曲线。

我见过太多新手的“共振曲线消失”问题,最后发现就是极化选错了。在物理场接口的添加界面里,务必确认选的是“电磁波,频域(TM波/面外磁场)”这一类。模型求解变量会是面外磁场Hz,电场自动在平面内,这才是支持SPR的偏振状态。

3. 入射角扫描的实现:边界条件、参数化扫描与R(θ)曲线

这一部分内容是实际操作的重头戏:怎么在COMSOL里让光斜着打进来,怎么扫角度,怎么把反射率作为角度函数提出来。

3.1 散射边界条件配合入射场:斜入射最直接的加载方式

斜入射的实现方法不止一种,有人用周期性端口,有人用Floquet周期边界,但多数场景下最简单直接的是用“散射边界条件”加载入射场。

顶部边界(棱镜侧入射边界)设置为散射边界条件,勾选“入射场”选项,然后指定平面波的传播方向为:

x方向分量:sin(θ) y方向分量:-cos(θ)

其中θ就是入射角。之所以把方向设定为单位矢量,是因为COMSOL会自动用波数乘以这个方向,形成正确的入射平面波。磁场幅值设成1A/m即可,因为反射率是比值,入射幅值最终会归一化掉。

底部边界(水侧)同样设置为散射边界条件,但不要勾入射场,让它作为透射波吸收边界。左右两侧边界如果模型宽度够宽,可以直接也设散射边界条件;如果想得到更干净的曲线,建议在左右两侧各加一个小矩形PML域,再在外面设置吸收边界。这样表面等离子体沿界面传播到侧边时会被吸收,不会反射回来干扰入射区。

这里有一个关键提醒:如果光束从顶部向下入射,需要确保COMSOL中入射波方向指的是能量传播方向,不是波矢的相反方向。最稳妥的验证方法是用一个最简陋的模型跑一遍:去掉金膜,让棱镜和水直接接触,此时如果边界条件设置正确,反射率应该接近0,因为光基本全部透射进入水中。如果R接近1甚至大于1,说明入射场的方向搞反了或者符号约定和时谐因子不一致,需要调整。

3.2 参数化扫描:角度范围和步长怎么选

角度扫描本身没有任何技巧,但范围与步长有讲究。对BK7+水体系,全内反射临界角大约61°,共振角在65°~75°之间,所以扫描范围我常设为55°到80°,留出余量。步长先取0.2°,扫描完后看谷底大概在哪个角度,再在谷底附近单独做一个加密扫描,步长取0.05°甚至更小。这样做比一开始就用极小步长全范围扫要快得多,结果也更精确。

在定义参数时把角度和弧度分开处理,能省掉很多单位换算的麻烦。全局参数里写:

theta_deg = 60 theta = theta_deg * pi / 180

后续所有边界条件和表达式里都用theta,而参数化扫描扫描theta_deg。这样你在结果里看到的横坐标是直观的度数,不会因为弧度单位而读错。

参数化扫描的研究设置里,把theta_deg作为参数,范围写成range(55, 0.2, 80),求解类型选择频域,固定频率对应波长633nm。如果模型不大,扫描一百个角度也就几分钟,完全能接受。

3.3 反射率R(θ)的提取:用积分能流而不是场强

反射率怎么从COMSOL里拿出来,是新手最容易卡住的一步。不要直接画边界上的电场强度,因为那个值包含入射场和反射场的干涉叠加,不好用。正确做法是计算反射方向上的坡印廷通量,再除以入射功率。

在参数化扫描完成后,新建一个一维绘图组,添加“全局”绘图。表达式中,反射率R可以定义为入射边界上朝外(反射方向)的能流积分除以入射能流。COMSOL中时间平均坡印廷通量可以用emw.nPoav提取,对边界做积分可以用积分算子或者直接在派生值里选边界积分。

R的归一化逻辑是:入射平面波功率密度与入射角相关,近似正比于cosθ,所以即使你偷懒不严格归一化,只看反射率曲线的相对形状和谷底位置也基本不受影响。但作为工程习惯,我还是会先建一个无金膜模型把R校准到接近0,确保表达式方向正确。

如果你使用端口方式建模,那就更省事,COMSOL会直接给出S参数,比如S11就是反射率。端口方式对斜入射的平面波同样适用,但模式配置比散射边界麻烦,我没有把它作为首选方案写出来。

4. 共振角度判定:反射谷、场增强图与折射率扰动

当参数化扫描完成,你会得到一组R(θ)数据曲线。接下来就是从曲线和场图两个角度确认共振角度,以及理解共振角为什么会漂移。

4.1 R(θ)曲线上的谷底:这就是共振角

把反射率R对入射角θ画出来,正常情况下会看到一个明显的“V”形谷。谷底对应的角度就是共振角。在我常用的参数下(BK7棱镜,金膜50nm,水介质,633nm),谷底大约在70°~72°附近,具体数值取决于金膜介电常数的选取。

有几个特征需要关注。一是谷深,理想情况下反射率可以降到接近0,但如果网格太粗或者边界处理不当,谷底可能只能降到0.5甚至更高,这时候优先怀疑网格问题,而不是物理问题。二是谷宽,共振峰的半高宽一般有几度,如果曲线出现剧烈振荡而不是平滑低谷,基本可以判断是模型边界反射造成的伪影,不是真实共振。三是谷底附近是否出现小的毛刺,这通常提示网格质量不够好,或者膜层内有数值色散。

定位谷底最直接的方法是先看曲线大概范围,然后在结果里用“全局计算”把所有解的R值列成表格,找到最小值对应的角度。COMSOL里也可以加一个最小值探针,但个人经验是直接读表格最直观。

4.2 电场增强图:反射谷之外的第二个铁证

反射率曲线出现谷只说明能量没有返回棱镜侧,它可能被吸收或散射,不一定百分之百激发等离激元。因此还要看电场分布图,这是判断SPR是否真实发生的第二层证据。

在共振角对应的解上绘制二维电场模分布,你会看到金膜-介质界面上出现明显增强的电场,电场强度比入射场高一个数量级甚至更多。由于表面等离激元的局域特性,电场在界面处最大,向水侧和棱镜侧都呈指数衰减。尤其在水侧的穿透深度只有一两百纳米,所以如果你看到场强分布一片均匀,没有界面局域增强,那说明当前角度可能不是真正的共振角,或者极化设置有问题。

我习惯在共振角前后各取一个角度(比如谷底角±2°)分别画场图对比。共振角处界面电场强度显著增强,偏离共振角后增强效应几乎消失,这个对比非常直观,也很有说服力。

4.3 折射率变化带来的共振角漂移:直接对应传感灵敏度

标题里的“不同入射角下的共振角度观察”,往应用层面延伸,就是改变待测介质折射率,观察共振角移动。这也是SPR传感器的核心工作模式。

把水的折射率从1.33改成1.34,重新跑一遍角度扫描,你就看到R(θ)曲线整体向右移动,谷底角度从71.6°附近变成73°附近。这一度多一点的偏移,对应的是0.01的折射率变化,换算成分子层的吸附厚度,可能只是几纳米的量级。这也是为什么SPR能做高灵敏生物分子相互作用分析。

实际操作时,可以把两个角度扫描的参数化结果放在同一个一维绘图组里,用不同的颜色或线型区分。你会非常清楚地看到曲线平移。这个可视化比单纯记录数值更有利于向别人解释SPR的灵敏度原理。

5. 网格、边界与数据一致性:共振谷消失的经典排查路径

这部分内容可能不是最“炫”的,但恰恰是决定仿真能不能用的地方。我把实际遇到的几个坑按排查顺序写出来,供你对照。

5.1 金膜只有50nm厚,网格必须咬得住趋肤深度

金膜厚度50nm,而金在可见光波段有趋肤效应,场在金属内部快速衰减。如果网格太粗,膜层内只有一两个单元,数值上根本分辨不了场分布,反射率和共振角都会严重失真。

我的做法是:金膜区域单独用映射网格,厚度方向分4~6层,也就是单层厚度控制在8~12nm,长度方向单元尺寸控制在50~100nm。水层和棱镜层用自由三角形网格,并在金膜界面处添加边界层,首层厚度20nm左右,向外逐渐放大。整体网格最大单元尺寸不要超过介质中波长的1/5,633nm光在水里波长约476nm,所以最大单元在100nm量级就够了。

有一个快速的收敛性校验方法:把网格加密一倍,再算一次共振角。如果共振角变化小于0.1°,说明网格基本收敛;如果移动超过0.3°,必须继续加密。这个习惯能帮你省很多找数据问题的精力。

5.2 边界反射伪造出来的曲线振荡

即使物理模型完全正确,如果左右边界或者底部边界处理不当,你会看到反射率曲线上叠加周期性的小波纹。这是因为表面等离子体波沿金膜界面传播时,遇到计算域侧边界后被反射,反射波和入射激发波干涉,在反射率上形成振荡。

解决方案主要有三种。第一,把模型宽度增加到至少20μm,让侧边界反射路径足够远,衰减掉大部分能量。第二,在左右两侧添加PML吸收层。第三,在左右边界使用周期性边界条件,这在理论上更符合平面波无限延伸的假设,但配置Floquet周期条件需要额外指定波矢相位,比PML复杂一些。

实际项目里我最常用的是“加宽模型+PML”的组合,简单粗暴且好用。在10μm宽度下曲线就够看,20μm基本没有振荡,30μm一味增加宽度只会浪费计算时间。

5.3 材料数据不一致是共振角偏差最大的来源

前面说过金膜介电常数有多种文献值,这里再强调一遍:如果你用-11.7+1.25i得到共振角72°,换用-18.3+1.3i共振角可能变成67°,差别接近5°。这5°不是因为模型建错了,而是材料数据本身就是不同工艺条件下的真实反映。

因此在把仿真结果和实验对比之前,要么用自己实验室金膜的椭偏测量数据,要么在参考文献时把材料来源写清楚。不要同时拿A文献的材料数据和B实验的共振角对表,那只会让你怀疑自己的模型错了。

另外提醒一点,当被测介质折射率过高时,n_eff可能超过棱镜折射率,arcsin函数失去实根,意味着在这个棱镜体系下不存在表面等离激元模式。这时候要换更高折射率的棱镜(比如SF10,折射率约1.72),或者缩短波长。这个现象在仿真中表现为整个扫描范围内反射率曲线没有谷,很多人误以为网格设置错了,实际上是一个物理边界。

6. 扩展:从共振角到折射率灵敏度的完整套路

模型稳定之后,这个“棱镜-金膜-介质”框架可以非常方便地扩展成传感器的仿真模板。

6.1 用两次参数化扫描直接读取灵敏度

灵敏度定义为单位折射率变化引起的共振角偏移,单位是°/RIU。我在做灵敏度计算时,会在参数化扫描里多加一层参数n_d,比如从1.33到1.35,步长0.01。扫描结束后,每组折射率对应一条R(θ)曲线,谷底角度单独提取出来,然后做一个线性拟合,斜率就是灵敏度。

以BK7棱镜、50nm金膜、633nm波长为例,灵敏度通常在100~200°/RIU之间,具体数值和金膜厚度、棱镜折射率、波长密切相关。如果你想知道膜厚对灵敏度的影响,可以把金膜厚度也定义成参数,一层层扫描。这是让COMSOL发挥价值的最典型做法:单纯手算很难快速做这种三维参数空间扫描,而仿真只需改参数重新计算。

6.2 把角度调制换成波长调制

SPR传感有角度调制和波长调制两种方式。角度调制就是本文一直做的固定波长、扫入射角;波长调制则反过来,固定入射角,在某个波长范围内扫描,观察反射率谷底波长对折射率变化的响应。

在COMSOL里做波长调制非常方便,不需要改动任何几何和边界条件,只要把研究的频域扫描参数从角度改成波长即可。固定一个入射角(比如共振角附近),波长范围设在600~700nm之间,反射率谷底位置就是共振波长。两种调制方式在同一套模型里切换,物理本质是一样的,波矢匹配条件没变。

6.3 加一层修饰膜,模拟生物分子吸附

真实的SPR生物传感,金膜表面往往有一层功能化分子膜,比如抗体或探针分子,折射率通常在1.45左右,厚度几纳米到几十纳米。在模型里这很简单:在金膜和被测介质之间再插入一个薄矩形域,厚度10nm左右,折射率设1.45。然后扫描被测介质的折射率,观察共振角偏移。

这层高折射率修薄膜会明显影响共振角,有时甚至导致共振模式消失,因为等效n_eff被拉高了。实际体系里修薄膜是部分覆盖、表面不均匀,所以共振谷会变宽变浅。这些效应在纯理论计算里很难处理,但COMSOL里可以逐步逼近:先做均匀膜,再考虑多层膜甚至等效介质层。我通常把这一步当成“更接近实验的仿真版本”,在项目讨论时很有说服力。

最后再分享一个习惯:每次跑完参数扫描,我会顺手把金膜的介电常数、棱镜折射率、入射角范围和步长这些关键参数写在一个文本文件里,连同R(θ)数据一起导出。SPR仿真最怕回头找不到当初用的哪一套材料数据,尤其是在多个版本之间反复调整之后。模型本身不难,难的是让每次结果都可复现、可追溯。养成这个小习惯,你会发现后续所有基于这个模型的扩展工作都顺畅很多。

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

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

立即咨询