ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

COMSOL超表面仿真:透射谱与多极子展开全流程指南

COMSOL超表面仿真:透射谱与多极子展开全流程指南 先立个目标这篇文章写完你要能照着它把“周期性结构 多极子展开 透射谱 可视化”这条链路完整跑通而不是只停留在“我看过一篇教程”的层面。我自己做超表面和光子晶体仿真这几年最深的体会是COMSOL算透射谱本身并不难难的是把谱线和物理机制对应起来——谷底是电偶极共振还是磁偶极共振劈裂是源于模式耦合还是晶格衍射这些光靠看电场分布猜十次有八次要翻车。多极子展开就是用来解决这个问题的把远场辐射按电偶极、磁偶极、电四极等通道拆开谁在哪个波长主导一图看清。这篇文章就围绕这条主线从建模、边界条件、透射谱计算到多极子展开的数学原理与代码实现再到联合可视化分析一步一步拆开讲。1. 项目定义与计算链路梳理1.1 这个项目到底在算什么先说清楚我们要处理的物理场景一个二维周期性排列的纳米结构阵列比如金纳米盘、硅纳米柱、或者开口谐振环平面波正入射或斜入射照上去我们关心两件事第一不同波长下结构阵列的透射率是多少这是我们常说的透射谱第二某个透射谷或透射峰对应的电磁模式到底是什么类型这就要靠多极子展开来回答。为什么要做多极子展开因为透射谱本质上是一个宏观可观测量的结果它把所有微观电磁响应都“混合”在了一个曲线里。两个物理机制完全不同的结构可能画出几乎一样的透射谱同一个结构在不同波长处可能先后由不同的多极子通道主导。如果只看谱线形状你永远只能描述“发生了什么”没法解释“为什么发生”。多极子展开就是把散射场按球谐函数基底拆解把每一个共振峰的物理身份标签贴上去。这个项目的典型应用范围很广超表面滤波器设计、完美吸收器、传感结构、非线性增强结构甚至电磁超材料单元设计凡是涉及“周期性亚波长结构 远场光谱响应”的场景这套流程都能直接平移。对做实验的人来说它还能帮你在加工前就预判某个共振峰的角谱响应、对入射角的敏感度以及结构参数偏移后峰的移动方向。1.2 计算流程的整体框架整个仿真与分析链路可以分成五个环节缺一个后面都会卡壳几何建模与材料定义构建周期性单元赋予随波长变化的复折射率数据这一步出错后面所有结果都白算。边界条件与端口设置周期性结构用 Floquet 周期性边界条件COMSOL 里叫 Periodic Condition激发源用端口Port或背景场Background Field这一步决定了你算的是无限阵列还是孤立颗粒。频域扫描求解在目标波段内扫频得到 S 参数随频率波长的变化关系。多极子展开计算从 COMSOL 里导出单元内电磁场分布在 MATLAB 或 Python 里做体积分得到各阶多极子系数。联合可视化把透射谱和多极子贡献画在同一张图里找到峰谷与辐射通道的对应关系。每一步都有容易翻车的细节。比如 Floquet 端口的模式阶数默认可能只算 0 阶但高阶衍射通道在某些波段里是开着的漏掉就会导致透射谱在高频段严重失真。再比如多极子展开的坐标原点选在结构几何中心还是质心结果会差很多尤其是对于不对称结构原点选错会把低阶多极子的贡献“泄漏”到高阶项里去。1.3 我用的软件版本与模块配置我这次用的是COMSOL Multiphysics 6.1物理场接口选的是RF Module下的Electromagnetic Waves, Frequency Domain (ewfd)。这里有两个常见的选型坑第一不要用波动光学模块Wave Optics来算。波光学接口默认的因变量是电场虽然也能算但它对材料色散的处理方式、端口定义的习惯和 RF 接口不太一样。尤其在可见光到近红外波段材料折射率实部小于 1 的情况比如金、银RF 接口的边界条件处理更稳健。当然如果在微波波段两个都可以但既然要统一流程我建议全部走 RF。第二求解器要启用直接求解器DirectMUMPS。周期性结构 色散材料 频扫这三件事凑在一起迭代求解器很容易不收敛或者收敛到错误的解。直接求解器慢一些但胜在稳。我在一个硅纳米柱阵列上试过迭代求解器在某个波长上静默地给出了一个能量不守恒的结果透射加反射大于 1排查了很久才发现是求解器的问题。2. 周期性结构的建模细节几何、材料与边界条件的正确配置2.1 几何建模的取舍原则周期性结构的几何建模关键不是画得像不像而是算得了、算得准、算得快。这三个目标经常冲突需要做取舍。以金纳米盘阵列为例子。实际加工出来的纳米盘边缘是有一定倾斜角度的底部可能还有一层几纳米的粘附层比如钛或铬。但从仿真角度除非你的研究目标就是研究边缘角度对共振的影响否则这些细节全部忽略。原因很简单COMSOL 在边界处要画网格每多一个小圆角或倾斜面网格量就可能翻倍而计算结果差异常在 1% 以内远小于实验中的加工误差。我的建议是第一步先用最简单几何跑通全流程圆柱 基底 空气层。等流程完全跑通再根据需要逐步加入复杂化因素。这样能保证你不会把大量的时间花在几何细节上最后发现多极子展开程序里有一个 bug 需要从头再来。几何参数上要特别注意一个点单元尺寸晶格常数和结构尺寸的相对关系。对于亚波长结构单元尺寸通常要小于工作波长否则会出现高阶衍射但也不能太小否则相邻结构之间的近场耦合太强多极子展开的单颗粒近似会失效。经验上晶格常数 p 和工作波长 λ 的关系在 0.5λ 到 1.0λ 之间比较常见。这个区间内Floquet 模式通常只有 0 阶传播多极子分析的结果也最干净。2.2 材料色散数据的处理一个容易被忽略的精度陷阱金属材料的色散必须用实验测量的复折射率数据不是常数也不是简单的 Drude 模型就够。我用的是 Johnson and Christy 的金、银数据这是光学仿真界的“老黄历”了虽然老但可靠、可复现审稿人也认。COMSOL 里导入色散数据有两种方式在材料节点下用 Interpolation 函数把波长-折射率数据点导入然后设置折射率实部 n 和虚部 k 为插值函数。这种方式最灵活也最容易检查数据是否正确。直接用 COMSOL 材料库里的内置金属材料。方便是方便但内置数据的来源和适用范围有时候不透明而且不同版本的 COMSOL 材料库数据有差异。如果你要复现别人论文里的结果强烈建议自建材料保证数据来源一致。这里有个特别容易翻车的精度陷阱插值函数要在整个计算波段内连续可导。COMSOL 在求解时会用到折射率对频率的导数比如计算群速度、色散效应时如果插值点之间是线性插值导数就是分段的常数会在数据点上出现跳变。虽然大多数情况下这不影响 S 参数的计算结果但如果你后续要做材料的损耗分析或者非线性分析这个问题会被放大。我的做法是导入数据后用 MATLAB 做一次平滑再以平滑后的数据点建插值函数。平滑方法用移动平均或者局部回归loess都可以关键是不要改变数据的总体趋势尤其是不要抹掉等离激元共振峰的位置。2.3 Floquet 周期性边界条件的正确打开方式周期性边界条件的设置在 COMSOL 里路径是Definitions Periodic Condition。但这里有几个细节新手特别容易踩第一个细节边界条件要成对选择。你需要先定义一个“源边界”Source再定义一个“目标边界”Destination两者的网格必须完全匹配。COMSOL 的周期性边界条件会自动处理匹配所以只要你用同一个几何操作生成的对面边界通常没问题。但如果你的几何是通过复制、旋转等操作生成的两对面一定要检查每一对面是否都配了对。漏掉一对面结果直接就是错的而且错得毫无征兆。第二个细节k-vector 的设置。正入射时Floquet 波矢的周期分量是 (0,0)这最简单。斜入射时需要根据入射角和方位角算周期分量这个稍后展开。一个常见的误区是有人以为周期性边界条件只需要在 x 和 y 方向各设一对就完了其实还需要注意端口处的高阶衍射模式是否要包含这个后面专门讲。第三个细节对称性边界条件的误用。如果结构在 x 或 y 方向有镜面对称可以额外加 Perfect Electric Conductor (PEC) 或 Perfect Magnetic Conductor (PMC) 对称面来减半模型。但仅当入射场也满足对应对称性时才成立。斜入射时入射场本身就不满足镜面对称强行用对称面会算出错误结果。我一开始图省事在正入射验证完之后直接切到斜入射没去掉对称面结果透射谱上出现了莫名其妙的尖峰排查了半天才意识到是这个问题。2.4 端口设置与衍射模式为什么透射谱高频段会失真在周期性结构中端口设置不能只留一个默认的“Port 1, Port 2”。COMSOL 的 RF 模块中端口类型选Periodic它会自动计算 Floquet 模式。但关键在模式阶数的选择默认情况下可能只会计算少数几个低阶模式而高频段高阶衍射模已经打开如果这些模式没有被包含在计算中能量就会“消失”透射率算出来偏低。怎么判断哪些模式需要包含方法很简单看频率对应的波长 λ 和周期 p 的关系。对于正入射当 λ p 时只有 0 阶模式传播当 λ p 时至少会出现 (±1, 0) 和 (0, ±1) 阶衍射。所以如果你的计算波段最低波长已经小于周期就必须在端口设置里手动加高阶模式。在 COMSOL 中操作路径是Port 节点 Periodic Mode list手动列出所有可能传播的模式阶数。我建议宁可多算几个也不漏因为高阶模如果不传播COMSOL 会自动衰减掉对结果没有影响但漏掉一个传播的模式结果直接就是错的。这里我再强调一个检查手段算完透射谱后把 T R透射率反射率画出来看是否等于 1。如果不等于 1不要怀疑物理先回去检查端口模式有没有漏。能量守恒是对周期性结构仿真最简单的“体检”。3. 透射谱的计算逻辑与数据导出从 S 参数到光谱曲线3.1 频域扫描设置波长扫描还是频率扫描COMSOL 中的频域扫描有两种方式按频率扫和按波长扫。对于光学问题我强烈建议按波长扫。原因很实际材料色散数据通常是按波长给的按波长扫描可以直接复用插值节点扫描点也更好控制密度。在Study Step 1: Frequency Domain中设置扫描范围时把单位改成 nm然后设置步长。步长不是越小越好COMSOL 的频域求解器在每个频点是独立求解的点数太多总耗时线性增长而一些窄线宽的共振峰可能在几个纳米内就从峰顶到谷底步长太大根本捕捉不到。判断步长是否合适的办法很土但很有效扫完一遍看看透射谱里有没有“尖刺”如果有把那个附近的谱线单独加密重新扫一遍和原来的结果对比。如果峰谷变深了说明原步长不够如果没变化说明步长够了。这里有个经验值可以参考对于等离激元结构在共振峰附近步长建议不超过 2 nm非共振区可以放宽到 5-10 nm。如果结构是低损耗介质比如硅共振线宽本来就窄步长建议 1 nm 以下。3.2 S 参数的本质与透射率的正确算法COMSOL 在端口处计算出来的 S 参数本质上是端口模式复振幅的比值。对于周期性端口S21 的物理意义是透射 0 阶模式的复振幅与入射 0 阶模式的复振幅之比是一个复数包含了相位信息。但注意S21 的模平方不完全等于透射率。透射率是功率之比。在无损耗、对称结构、正入射这些条件都满足时T |S21|² 成立。但一旦有高阶衍射模式传播能量会被分配到高阶通道里这时只取 S21 会低估总透射。正入射且只关注 0 阶光谱时T |S21|² 是常用近似这个没问题。但如果你的研究涉及斜入射或者短波段正确的做法是把每个传播模式对应的 S 参数模平方加起来得到总透射。COMSOL 的端口节点里会列出所有模式的 S 参数把它们都导出。不过这里还有个更省事的方案直接在 COMSOL 里定义一个“能量透射率”的全局变量用端口边界上的坡印廷矢量积分来计算透射功率再除以入射功率。这样做的好处是不需要关心哪些模式在传播功率积分自动包含了所有通道的能量。操作上在Derived Values Surface Integration里选端口边界面对Time-average Power Flow, Outgoing做积分即可。3.3 数据导出的格式与后续处理流程COMSOL 导出一维数据有几种方式我最常用的是Results 1D Plot Group Global把多个变量画在一起然后File Export Data Plot导出为文本文件。导出时注意几点导出数据点的密度。COMSOL 默认导出的是绘图点如果你在频域扫描里设置了“Store fields on all frequency points”那每个频点都有结果但如果没有存储场只有 S 参数结果导出的是 S 参数在每个频点的值。这个在导出设置里可以指定。变量名的记忆。导出的表头是变量名比如port_1_Sparam、port_2_Sparam。这些名字在你建模的时候就会生成导出时对应关系要理清楚。我习惯在做完定义后把端口编号和物理意义记在一个笔记里防止后面导出时对应错。文本格式。导出为 .txt 或 .csv 都行。如果数据有很多列用 .csv 更方便后续在 Python 里读取。导出的原始曲线通常会有一定的数值噪声尤其是远离共振区的平缓区域S21 的幅值在两个相邻频点之间可能会有小波动。这不是物理效应是数值求解的误差。处理方式是在绘图时做一次平滑滤波比如 Savitzky-Golay 滤波窗口大小不要太大否则会把尖锐的共振峰抹平。4. 多极子展开的原理与代码实现找出占主导的共振机制4.1 多极子展开的物理图像多极子展开的思想并不复杂任意一个电流分布产生的远场辐射可以看成一系列“基本辐射体”的叠加。基本的零阶辐射体是电偶极子ED它由电荷分离产生第二重要的是一阶辐射体包括磁偶极子MD由环形电流产生和电四极子EQ由电荷的四边形排布产生再往上还有磁四极子MQ、电八极子EO等。低阶多极子的远场辐射功率和频率的标度关系不同电偶极子辐射功率正比于 ω⁴磁偶极子也是 ω⁴但电四极子正比于 ω⁶。这意味着什么在高频段高阶多极子更容易被激发贡献占比会上升。所以同一个结构低频段可能是电偶极子主导高频段切换到磁四极子或电八极子这是完全正常的。多极子展开的价值在于它把“一团复杂的电磁场分布”压缩成一组标量系数每个系数对应一个明确的物理图像和辐射方向图。通过比较各阶系数的贡献权重我们就能判断光谱中的每个共振峰是由哪种模式触发的。4.2 笛卡尔张量形式的积分公式实用选择多极子系数的计算有两种常用形式球谐函数展开和笛卡尔张量积分形式。在 COMSOL 的网格数据上我用的是第二种因为它可以直接利用仿真中得到的电流密度 J(r)做体积分不需要处理球谐函数的角动量耦合问题。推导这里不展开实际要用到的公式如下电偶极矩[ \mathbf{P} \frac{1}{i\omega}\int \mathbf{J} , d^3r ]磁偶极矩[ \mathbf{M} \frac{1}{2c}\int (\mathbf{r} \times \mathbf{J}) , d^3r ]电四极矩张量形式[ Q_{\alpha\beta} \frac{1}{i2\omega}\int \left[ r_\alpha J_\beta r_\beta J_\alpha - \frac{2}{3}(\mathbf{r}\cdot\mathbf{J})\delta_{\alpha\beta} \right] d^3r ]其中 (\alpha, \beta \in {x,y,z})(\delta_{\alpha\beta}) 是克罗内克函数。有了这些矩就可以用下面的公式计算各通道的散射功率在非磁性的情况下[ P_{ED} \frac{\mu_0\omega^4}{12\pi c}|\mathbf{P}|^2 ][ P_{MD} \frac{\mu_0\omega^4}{12\pi c}|\mathbf{M}|^2 ][ P_{EQ} \frac{\mu_0\omega^6}{160\pi c^5}\sum_{\alpha,\beta}|Q_{\alpha\beta}|^2 ]这几个公式的适用范围是真空/均匀介质背景。如果结构埋在介电常数为 (\varepsilon_d) 的均匀介质中需要做替换(\mu_0 \to \mu_0/\sqrt{\varepsilon_d})、(c \to c/\sqrt{\varepsilon_d})。对于基底上的结构严格来说不是均匀背景但实际处理中可以用“平均环境”做一个近似。这一点后面会专门展开因为它是很多人在多极子展开结果不合理时忽略的原因。4.3 MATLAB 实现从 COMSOL 导出体电流密度到多极子系数在 COMSOL 中体电流密度 J 不是直接可以导出的物理量。需要先手动定义一个变量。在Definitions Variables里定义Jx ewfd.Jx Jy ewfd.Jy Jz ewfd.Jz然后在需要做多极子展开的波长点把整个结构域内的 Jx、Jy、Jz 导出。推荐导出到 .txt 文件格式是每一行存储一个网格单元中心点的坐标以及该点的 J 分量。有了这些数据MATLAB 的实现很直接% 读取 COMSOL 导出的体电流数据 % 格式: x y z Jx Jy Jz data load(current_density.txt); x data(:,1); y data(:,2); z data(:,3); Jx data(:,4); Jy data(:,5); Jz data(:,6); % 离散体积元的体积假设网格近似均匀取平均体积 dx median(diff(unique(x))); dy median(diff(unique(y))); dz median(diff(unique(z))); dV dx * dy * dz; omega 2*pi*c/lambda; % 角频率单位注意统一 % 电流密度体积分电偶极矩复数 Px (1/(1i*omega)) * sum(Jx(:)) * dV; Py (1/(1i*omega)) * sum(Jy(:)) * dV; Pz (1/(1i*omega)) * sum(Jz(:)) * dV; % 磁偶极矩需要叉乘 r × J Mx (1/(2*c)) * sum( (y.*Jz - z.*Jy) ) * dV; My (1/(2*c)) * sum( (z.*Jx - x.*Jz) ) * dV; Mz (1/(2*c)) * sum( (x.*Jy - y.*Jx) ) * dV; % 散射功率 mu0 4*pi*1e-7; P_ED mu0*omega^4/(12*pi*c) * (abs(Px)^2 abs(Py)^2 abs(Pz)^2); P_MD mu0*omega^4/(12*pi*c) * (abs(Mx)^2 abs(My)^2 abs(Mz)^2);代码看着简单但有三个细节必须注意第一单位要统一。如果 COMSOL 几何用的是纳米电流密度单位是 A/m²那么坐标要转换成米再算否则差 10^9 的因子。我在第一次算的时候就是忘记转换单位得到的高阶多极子项异常大检查了整整一天。第二体积元的计算不能想当然。如果网格不是均匀的用上面的median(diff(unique))方法会不准确。更稳妥的办法是在 COMSOL 里做一次体积分记录总积分值然后在 MATLAB 里用点数反推平均体积dV 几何体积 / 总点数。这个值比你用坐标差推算的更稳健。第三相位基准要一致。多极子系数是复数相位取决于坐标原点和参考时刻。如果你的目的是看相对贡献大小相位不重要但如果是做干涉分析比如电偶极和磁偶极之间的干涉就必须明确原点和参考面。通常把原点选在结构的几何中心或重心并且保持所有波长、所有结果都在同一参考系下。4.4 周期性与多极子展开的冲突及处理策略这里有个概念性的问题需要说清楚多极子展开严格来说是对孤立颗粒的散射场做的。而我们在 COMSOL 里模拟的是周期性阵列每个单元里的电流分布是包含了相邻单元耦合的“等效”电流。那周期阵列的多极子展开为什么还是有效的答案是定性有效定量有偏差。当晶格常数大于结构尺寸的 3 倍以上、相邻单元间的近场耦合较弱时每个单元内的电流分布接近于孤立颗粒的电流分布此时多极子展开各项的相对大小基本可靠。但当单元间距很近时相邻颗粒之间的近场相互作用会改变每个颗粒的等效极化率此时多极子展开的结果只能作为参考不能严格定量解释。有一种常见的处理方式用“单颗粒 周期性边界”的两步法。第一步用 COMSOL 算单个颗粒在平面波照射下的散射场做常规多极子展开第二步把阵列作为一个周期系统分析用多极子的“阵列因子”array factor修正。这样得到的结果更严格但实现复杂度翻倍而且需要搞清楚阵列因子和耦合之间的微妙关系。我的建议是多数情况下用单元电流直接展开就够了在论文里加上一句“多极子展开基于单元内电流定性反映共振模式类型”即可。5. 透射谱与多极子联合可视化从谱线形状读出物理机制5.1 多极子谱线和透射谱叠加一张图讲清楚机制计算的最终产出是一张联合图横轴是波长左纵轴是透射率右纵轴是多极子散射功率对数坐标不同颜色的曲线分别对应电偶极、磁偶极、电四极的贡献。画好这张图的关键在于归一化。透射率是 0-1 范围的量而多极子散射功率的量级可能从 10^-10 到 10^-6直接画在一张图里多极子曲线会被压成一条贴着横轴的线什么都看不见。我习惯的做法是把每个多极子通道的功率除以所有通道功率之和得到“相对贡献占比”。这样所有曲线都在 0-1 之间和透射率可以同轴显示方便直接对比。多极子谱线和透射谱线叠加之后一个典型的“标准图景”是这样的某波长处电偶极子散射功率占比突然上升该处透射谱出现一个谷底。磁偶极子占比上升的位置往往伴随一个 Fano 不对称线型因为磁偶极共振通常和宽带背景产生相消干涉。电四极子占比在短波长处开始抬头透射谱出现一个更宽更浅的谷。注意透射谷的位置和多极子共振峰的位置并不严格重合。透射谷是“总场干涉相消”的结果多极子峰是“某一种辐射通道增强”的结果。两者之间通常有几纳米的偏移这是正常的不要试图把它们硬生生对齐。判断关联时应该看“透射谷附近是否有某个多极子通道的占比同步抬升”而不是找完全重合的极值点。5.2 用多极子的干涉项解释 Fano 线型透射谱里经常看到一种不对称的峰谷结构史称 Fano 共振。这种线型的来源可以用多极子的干涉来解释当一个窄带的暗模式比如磁四极子与一个宽带的亮模式比如电偶极子在频谱上重叠时两条通道的辐射场会发生相消或相长干涉产生不对称线型。要在多极子分析中识别这种干涉光看各通道的功率占比还不够因为功率是模平方丢失了相位信息。正确的做法是把复数的多极子矩比如电偶极矩 P 和磁偶极矩 M在同一个复平面上画出来。如果两条矢量的方向在某个波长处突然从“同向”变成“反向”那这里必然存在干涉异常对应透射谱里会出现 Fano 线型。这个分析做一次两次之后就会形成直觉看到谱线上有个明显不对称的峰谷组合第一反应就去看那两个波长的复多极子矩的相位关系。相位差接近 180° 且宽度相似基本可以锁定是 Fano 型共振。5.3 电场与功率流分布图验证多极子判断的“照妖镜”多极子展开给了结论但有时候结论可能出乎意料这时候需要用电场分布图和功率流图来交叉验证。具体操作为在 COMSOL 后处理中选一个透射谷对应的波长画结构内部及周围 3D 电场增强分布 |E|/|E0|。观察增强区域如果是电偶极共振增强区通常集中在结构的一端或两端呈现明显的偶极子极化方向如果是磁偶极共振增强区会形成一个首尾相接的环形分布这是环形位移电流的典型特征如果是四极甚至更高级的模式增强区会呈现更多的节点结构。更直观的标准是位移电流分布在结构中做一个截平面画电流箭头图。磁偶极子对应的是一个闭合的环形电流图案电偶极子对应的是沿某个方向的大致平行的电流线。这两种图案非常容易辨认几乎不可能认错。我一般建议在论文里放这样一组图透射谱-多极子联合图当“总览”电场分布图当“特写”两个证据彼此支撑这个共振机制的论述就立得住。5.4 可视化编码建议让看图的人快速抓住重点画图这件事很多人不重视但审稿人或导师第一眼就是从图里判断工作质量的。这里分享几个我在可视化上的做法透射谱用黑色粗线多极子通道用彩色细线。主次分明不会被多根彩色线干扰。共振波长处加一条竖直虚线把透射谷和多极子峰对齐标注。这样读者可以快速定位每个共振峰对应的多极子通道。多极子占比用面积图stacked area而不是折线图。堆叠面积图能一眼看出“哪个波长段哪种机制占主导”比折线的阅读成本低得多。如果做斜入射扫角分析用二维颜色图横轴波长纵轴入射角颜色表示透射率然后在图上叠加多极子共振峰位置点。这样做可以看模式随角度的色散行为信息量非常大。6. 实操中容易翻车的几个细节与排查思路6.1 收敛性检查网格加密到结果不变才算数这是周期性结构仿真最老生常谈但依然最多人栽的问题。COMSOL 的默认网格是为通用物理问题设计的对等离激元结构来说默认网格几乎必然太粗。金属表面的趋肤深度在可见光波段只有几十纳米如果边界层网格不够密表面电流分布会被严重低估导致多极子展开的偶极矩计算偏差巨大。我的经验是至少做三组网格的收敛性测试粗网格默认网格或略加密。中网格在金属表面加 3-5 层边界层网格最大边界层厚度小于趋肤深度的 1/3。细网格在中网格基础上把全局最大单元尺寸再减半。如果透射谱从粗到细变化明显继续加密如果中网格和细网格的结果几乎重合谷深差异小于 1%取细网格的结果做后续分析。另外要盯着看多极子展开的结果因为透射谱可能已经收敛但多极子矩对网格更敏感——它直接依赖于电流分布的细节电流分布只要有微小扰动高阶矩的数值就可能跳动很大。6.2 多极子结果不合理的排查清单如果多极子展开的结果明显不合理比如所有波长都是电偶极主导完全没有磁偶极贡献按以下顺序排查第一检查坐标单位。我把这个列第一位因为我自己犯过而且这个错误的表现方式非常具有迷惑性——结果看起来“很合理”只是数值完全不对。坐标一定要转换成米再做积分。第二检查电流密度变量名。COMSOL 中的电流密度是ewfd.Jx、ewfd.Jy、ewfd.Jz不要在Variables里把它们重新定义成同名的另一个变量否则可能导出错误的数据。导出前先在数据检查里画一次这个变量的分布看看是否符合物理预期。第三检查积分域。正确做法是只在结构域内做积分。空气域中的位移电流也要考虑尤其当结构周围存在强近场时空气域的位移电流对多极子矩也有贡献。但大部分情况下结构内部的传导电流占主导空气域的贡献可以忽略。如果你发现多极子结果对积分域边界很敏感就要把积分域扩大到包含近场区域再试试。第四检查坐标原点。原点偏移会导致偶极矩和高阶矩之间发生混合。验证方法是故意把原点移动几个纳米看多极子结果是否发生明显变化。如果变化明显说明你的结果对原点敏感需要重新选择原点的位置一般选几何中心即可并保持一致。6.3 高频段透射率大于 1 的排查思路这是个让我印象深刻的问题。某次仿真在波长接近周期的短波段透射率居然超过了 1。物理上这是不可能的问题一定出在数值设置上。排查路径如下检查端口模式列表。这是我前面反复强调的高频段高阶衍射模式必须加入端口计算。漏掉会对能量的计算产生影响。检查网格。如果金属结构表面网格太粗表面等离激元的传播长度会被高估可能导致局部的功率流积分偏大。检查坡印廷矢量的积分面。积分面如果紧贴着结构表面近场中的非辐射分量会被错误地计入“透射功率”。正确的做法是至少把积分面放在距离结构表面半个波长以上的位置。最终我的问题就是出在第一点漏了高阶衍射模式。补上之后T R 恒等于 1问题消失。6.4 周期结构斜入射的 Floquet 波矢设置如果你的研究涉及斜入射Floquet 周期性边界条件的设置就要多费些心思。k 矢量的切向分量为[ k_{//} \frac{2\pi}{\lambda} (\sin\theta\cos\phi, \sin\theta\sin\phi) ]在 COMSOL 的 Periodic Condition 中需要把这里的 k 分量转换成对应的相位因子。注意这里的 θ 是入射角φ 是方位角两者独立缺一个都会造成斜入射结果完全错误。斜入射时还有一个容易被忽略的问题S 参数的定义会变。端口模式可以分解为 TE 和 TM 偏振两种偏振的 S 参数是分开计算的。当入射角变大模式之间可能发生耦合这时光看一个偏振的透射谱就不够了需要同时看交叉偏振透射比如 TE 入射产生 TM 透射那是手性超表面和偏振转换器件的核心指标也是一大批论文的看点。7. 个人经验拓展从“能算出来”到“讲得明白”的关键几步7.1 多极子展开和高级后处理一个参数化扫描的自动化脚本思路当模型、边界条件、多极子展开程序都稳定之后你会发现最耗时间的事情变成了重复劳动换一个结构参数直径、周期、高度重新跑一遍频扫导出数据再跑一遍多极子展开画图判断结果。这一步可以通过 COMSOL 的Parameter Sweep和COMSOL with MATLAB联合脚本把整个流程自动化。具体思路是在 COMSOL 中把几何参数设为全局参数用model.param().set(d, value)修改参数值循环求解、导出、调用 MATLAB 多极子展开函数最后把所有结果汇总成一张“参数-波长-多极子贡献占比”的三维图。这个自动化能带来的价值非常大你可以一次性扫描几十组参数各组之间不需要手动干预。更重要的是你可以同时记录每个参数组合下多极子共振峰的位置和类型从而画出“结构参数调谐模式类型”的相图——这种图在设计超表面时极其有用。7.2 数值实验的记录习惯最后说一个看起来和“硬核仿真”无关但实际极其重要的习惯每次仿真都要记录完整的日志。我之前吃过一次亏调了一个晚上的参数终于得到了想要的谱线但因为没有记录具体参数第二天想复现死活找不到那组参数对应的设置。从那以后我养成了一个习惯仿真文件命名带参数摘要比如Au_disk_d120_p300_h40_theta0.txt同时在项目笔记里记录当天的修改内容和结果现象。对于周期性结构 多极子展开这种多步骤流程一条完整记录应该包括几何参数、材料数据来源、网格参数、频扫设置、端口模式数、多极子展开的文件名与代码版本。这样即使三个月后回过头来看也能完全复现当时的计算。这不是形式主义是做研究的基本功。毕竟仿真的核心价值不只是“得到结果”而是“让结果可以被检验、被复现、被信任”。
返回列表