光学超结构这个方向这两年越来越热,无论做超表面透镜、完美吸收器还是光学隐身验证,绕不开的两个仿真工具就是 FDTD 和 COMSOL。我先后用这两种工具做了一整套光学超结构模型,总结下来最大的心得是:别指望一个工具从头打到尾,FDTD 适合宽谱响应快速筛选,COMSOL 适合精细多物理场分析和优化,两者衔接得当能省掉大量返工。这篇分享写给正从 FDTD 起步、想迁移到 COMSOL 做深入仿真的朋友,也适合那些一上来就想用 COMSOL 算光电耦合、却被网格密度和求解耗时折磨的新手。
1. 为什么光学超结构要同时用 FDTD 和 COMSOL
1.1 光学超结构仿真的核心诉求
光学超结构,简单说就是把人工设计的微纳结构按亚波长周期排列,让光在结构表面产生异常相位、吸收或偏振调控。这类模型的核心诉求有三个:一是要看宽谱响应,也就是反射率、透射率随波长的变化;二是要拿到电磁场分布,分析共振模式在哪一层、哪个位置被激发;三是很多情况下还要考虑结构受力、升温之后的性能漂移,这会引入多物理场耦合。
FDTD 和 COMSOL 正好分别擅长这两个阶段。我习惯把工作流拆成“粗筛 + 精算”两条线:FDTD 负责快速算宽谱、摸底参数空间;COMSOL 负责在候选设计点做更严格的边界条件处理和多物理场验证。两者互补的配合方式能让仿真速度和质量都上一个台阶。
1.2 FDTD 的强势区和明显短板
FDTD 的核心思路是在时域上直接求解麦克斯韦方程组,用一个宽谱脉冲一次性激发整个目标波段。这意味着你不用像频域求解那样逐点扫描波长,跑一次就能拿到 400nm 到 800nm 的反射透射谱。这个特性让 FDTD 在超表面参数筛选阶段效率极高,我经常把柱高、直径、周期各设几个变量,批量扫描几十组,一个晚上就能把趋势摸出来。
它也有明显的短板。第一,材料模型偏简单,金属色散和各项异性材料虽然能拟合,但灵活度远不如 COMSOL 里自定义材料关系那么高。第二,FDTD 是纯电磁仿真,没法直接耦合热场、力学场或压电效应。第三,网格是按 Yee 网格空间离散的,遇到曲线边界或斜边结构时容易产生阶梯效应,需要细化网格来补偿,算起来内存占用不小。
1.3 COMSOL 的优势、代价和使用边界
COMSOL 走的是有限元法路线,优势非常清晰:几何适应性强,可以对曲面、细小圆角建立高质量网格;多物理场耦合是它的看家本领,光学超结构可以同时添加电磁波、固体传热、结构力学甚至流体传热,直接模拟光热变形后的光学响应变化。另外它的参数化扫描、优化模块和自定义偏微分方程接口也很成熟,做逆设计、拓扑优化都在一个软件里完成。
代价也很现实。光学超结构在光频段做全波仿真时,特征尺寸通常只有几百纳米,三维模型网格量动辄百万量级。如果在 COMSOL 里做同样的宽谱扫描,频域求解每次只能算一个频率点,几十个波长点叠加起来,求解时间会成倍增长。所以 COMSOL 更适合针对少数关键频率做高精度数值实验,不适合拿来做全波长盲扫。
2. 从 FDTD 到 COMSOL 的模型迁移关键点
2.1 材料色散数据怎么才能统一
从 FDTD 把模型搬进 COMSOL,最容易踩的坑就是材料数据不一致。FDTD 材料库里的折射率 n、消光系数 k 往往来自拟合模型或内插数据,COMSOL 里如果用不同的材料库版本,同一波长下的 n、k 可能差零点几个百分点,共振峰位置和幅值就会明显错位。
我现在的做法是:以实验或权威数据源为标准,把 n、k 数据拉成一个 CSV 表,包含波长、实部折射率、虚部折射率三列。FDTD 里用插值材料加载这个表,COMSOL 里用“折射率”材料模型也引用同一份表。这样两个软件读的是同一组数据源,结果不一致时起码可以排除材料差异。需要注意插值方式尽量都用线性插值,波长间隔不要太大,在吸收边或色散剧烈的波段建议加密到 5nm 一取点。
2.2 几何建模的转换方式
很多人在 FDTD 里习惯直接画圆柱、方块,导出 STL 再导入 COMSOL,结果导入后出现破面、法向翻转,网格怎么都划不顺。我的经验是:简单几何体直接参数重建,别用 STL 中转。比如圆柱纳米柱,直接新建一个圆柱体,把半径、高度输入到参数表里就够了;复杂结构比如陀螺状、分形结构,可以导 STEP 或 IGES 格式,比 STL 的曲面质量好很多。
重建几何时有个细节要注意:FDTD 里的三维结构往往默认放在介质的顶层或悬浮在背景中,COMSOL 里则需要明确结构属于哪个域,和衬底是否做布尔并集。我的习惯是先建衬底层,再建超结构层,用“形成联合体”把相邻域合并,这样后续分配材料的操作更清晰,网格也不会在交界面上出现多余的自由度。
2.3 边界条件和激励的对应关系
光学超结构仿真必然涉及周期性,FDTD 里通常用周期边界或 Bloch 边界,COMSOL 对应的是 Floquet 周期边界。两者物理含义等价,但相位因子的定义习惯不同,迁移时最容易搞错符号。比如斜入射情况下,FDTD 里的 Bloch 波矢方向可能和 COMSOL Floquet 周期条件的 k 方向定义相差一个负号,导致计算结果看起来像镜像入射角。
激励方式也需要对齐。FDTD 里一般用平面波源,COMSOL 里则用端口边界或散射边界加背景场。简单结构建议用端口边界,直接给入射功率,后处理用 S 参数表示反射透射;复杂结构或需要看场分布时,用背景场的方式更直观。每迁移一个模型,我会先用一个已知理论解的简单平板模型做“标定测试”,确认两边结果一致后再跑超结构,这样能快速发现边界或激励设置是否出了问题。
| 关键项 | FDTD 常见设置 | COMSOL 对应设置 | 需要对齐的重点 |
|---|---|---|---|
| 周期条件 | Periodic / Bloch | Floquet 周期边界 | 相位因子方向和周期矢量 |
| 入射光源 | Plane wave source | 端口/背景场 | 入射角、偏振方向 |
| 吸收边界 | PML | PML / 散射边界 | PML 厚度和位置 |
| 输出结果 | Transmission/Reflection | S 参数 | 归一化方式、能量守恒 |
3. 实操记录:模拟项目X的超表面单元仿真
3.1 用 FDTD 先跑宽谱筛选
我以某介质柱超表面为例,结构是周期 400nm 的圆柱阵列,柱高 600nm,直径 200nm,衬底折射率按常见介质设置,目标波段 400nm 到 800nm。第一步先在 FDTD 里建立几何,设置背景折射率为 1.0,光源用波长范围为 350nm 至 900nm 的平面波脉冲,沿负 Z 方向正入射。边界条件选周期边界,Z 方向上下加 PML,注意 PML 离结构至少半个波长,否则会产生虚假反射。
网格方面,我按照结构最小尺寸的五分之一设定网格步长,也就是直径 200nm 的圆柱侧面圆周方向能平滑表达的最小网格大约为 20nm,再配合自动加密功能让折射率变化大的界面处进一步细分。仿真跑完后,从监视器提取透射谱,可以看到超表面在某个波长附近出现明显透射峰或谷。这一步的信息量已经够大,能快速判断这个参数组合有没有继续深挖的价值。
3.2 把模型搬进 COMSOL 做精细分析
筛选出候选参数后,我在 COMSOL 里重建同一模型。模型树里选择三维空间维度、电磁波频域接口,设置单元胞尺寸跟上一步保持一致。几何用参数化方式重建圆柱和衬底,材料选择与 FDTD 同一个数据表。边界条件设为 Floquet 周期边界,端口位置放在结构上方,背景折射率按空气设置。网格尺寸设置最大单元为波长的十分之一,在圆柱和衬底界面处加局部细化。
由于 COMSOL 是频域仿真,我会选择谐振峰附近的频点做单点求解,通常取峰值两侧各 2 个频点,一共 5 个频率,观察响应曲线的形状和相位变化。这里有个细节:COMSOL 里端口默认的“通过功率归一化”不一定和 FDTD 里的功率归一化方式完全相同,需要确认透射率是用 S21 模的平方还是功率比值,否则两者数值会差一个倍数甚至出现大于 1 的可疑结果。
3.3 结果对比和参数提取技巧
对比两端结果时,我最关心的指标有三个:共振波长位置、峰值幅值、结构顶面和底面的电场强度比。如果普通峰值位置一致,但幅值差几个百分点,先不要急着调网格,优先检查材料插值表是否一致,再检查 PEC 或阻抗边界设置是否误用了理想导体。如实测下来仍对不上,可以在 COMSOL 里做一次网格加密收敛验证,看峰值位置会不会继续移动。
相位信息是超表面设计的重要输出。COMSOL 可以直接提取端口处的透射相位,FDTD 里也可以用监视器导出场数据再提取相位。需要注意的是相位分析前一定要做包装处理,因为反三角函数会给到 -pi 到 pi 的不连续值,直接用原始数据画图会出现跳变。我习惯在数据处理脚本里做相位展开,让相邻像素点之间的相位差尽量平滑,再和理论相位分布对比。
4. COMSOL 高频光频段仿真的调优策略
4.1 网格密度到底怎么定
COMSOL 的光学仿真网格没有统一答案,但有一条经验线:结构内部每个波长范围内至少要有 10 到 15 个网格点,局部细小特征比如尖角、薄层必须进一步加密。比如结构直径只有 200nm,而波长是 600nm,柱体内部波长就是 600nm 除以有效折射率,实际单元网格最大边长约 40nm 到 60nm 才能保证结果基本收敛。
网格太密内存受不了,太稀共振峰算不准,所以我的做法是分两轮试探:第一轮使用全局较粗网格加局部细化,跑通流程;第二轮只看关键频点,把目标区域网格减半加密,对比两个结果。如果峰值波长移动小于 1nm,说明网格已经收敛,继续加密就是浪费算力;如果移动明显,就要加大加密力度。注意周期性边界面上网格必须一致,边界上的网格节点数量要对齐,否则周期延拓时可能出现断裂感。
4.2 求解器选型和一些收敛性提升手段
COMSOL 光频段求解默认用直接求解器,内存消耗巨大,但稳定性好。模型如果内存吃紧,可以换迭代求解器加预处理。实际经验是,超表面模型矩阵条件数普遍比较差,尤其是包含金属层时,直接求解比迭代求解更省心;而纯介质模型用迭代求解加多网格预处理,内存可以明显降低,速度也不慢。
如果遇到不收敛,先降低激励功率或改用“小信号”激励试试,很多时候是吸收边界反射叠加造成场值过大。再看 PML 层厚度,太薄的 PML 在斜入射时吸收效果非常差,我通常设置三层以上、总厚度达到四分之一波长以上。也可以切换到“瞬态”接口看场分布是否发散,帮助定位是边界问题还是材料模型问题。
4.3 频域扫描加速的实际技巧
COMSOL 逐频点扫描确实慢,但有几个技巧能让效率提升不少。第一,先用粗频率步长扫描全局,看清响应形态后再加密谐振区。比如目标波段 600nm 到 700nm,先每 10nm 算一个点,找到峰区后,峰区附近每 1nm 再扫一遍,其它区域不加密。第二,开启“自适应频率扫描”功能,COMSOL 会利用前后频率点的解做初始猜测,加速收敛。第三,利用参数化扫描时的解重用,让软件从上一个频率点的解开始迭代,减少初始迭代次数。
还有一个偏门但实用的技巧:用二维轴对称模型替代三维模型,前提是超结构具有旋转对称性。比如圆柱形纳米柱,如果入射光沿轴向正入射,模型可以简化成二维轴对称问题,计算量会下降一到两个数量级。很多团队用这个技巧跑全参数扫描,效率非常可观。但要注意,斜入射或结构对称性被破坏时不能用这个简化,否则会出现明显误差。
5. 常见问题与排查技巧实录
5.1 FDTD 反射谱出现异常抖动
我在早期做超表面仿真时遇到过一个问题:反射谱出现类似噪声的高频波动,看起来像是数值噪声,但怎么加密网格都没改善。后来检查发现是 PML 设置得太薄,加上光源脉冲的中心波长和 PML 吸收频率不匹配,导致反射波到达监视器后产生干涉纹。解决办法是把 PML 层数从 8 改为 12 到 16,并把 PML 与结构之间的距离拉开到至少一个中心波长,波动就消失了。
另一个常见原因是时间步长太大。FDTD 的稳定性条件要求时间步长小于空间步长与光速的比值,一般软件会自动计算,但如果几何体非常薄,可能触发自动时间步长减小,进而自动仿真时长不足,导致频谱未完全收敛。遇到这种情况,查看监视器里的场值随时间是否衰减到零,如果衰减不干净,延长仿真时间或提高 PML 吸收效率是主要方向。
5.2 COMSOL 计算时内存直接爆掉
COMSOL 三维光频段全波模型,内存需求非常夸张。有一次我直接对直径 500nm 的超表面单元做了全波长扫描,还没跑完就出现内存不足。后来一查,单元网格数超过 400 万,而每个网格节点存储的未知量在电磁波频域接口里又特别多,确实吃不消。
解决思路有三个:一是改用迭代求解器降低内存占用;二是简化结构细节,比如把圆角半径小于 5nm 的特征直接去掉,这些微小特征对光学响应影响很小,但会让网格数量剧烈增加;三是把衬底和空气域的网格适度放粗,其实衬底内部远离界面区域场变化很小,不需要和界面处同样的网格密度。
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 反射谱高频抖动 | PML 薄或距离近 | 加厚 PML,拉开距离 |
| 共振峰位置偏移 | 材料色散数据不一致 | 统一 n/k 数据源 |
| 内存不足 | 网格过多、直接求解器 | 改用迭代求解,简化几何 |
| 计算时间过长 | 频点过多、网格过密 | 粗扫描加局部加密 |
| 结果不收敛 | 边界条件或激励设置错误 | 降低激励功率,检查 PML |
5.3 FDTD 和 COMSOL 结果对不上怎么办
两套软件算同一个模型,结果完全一致的概率并不高,差几个百分点是常态。如果差别过大,我按这个顺序排查:先看几何尺寸是否一致,特别是圆柱直径和厚度的单位有没有搞混;再看边界条件,FDTD 里的周期边界和 COMSOL 里的 Floquet 周期边界相位定义是否匹配;最后看监视器位置,FDTD 的透射监视器如果放在衬底上方而不是下方,会把衬底的反射也算进透射里。
还有一个容易被忽略的差异是激励源的极化方式。FDTD 里平面波源的电场方向默认沿 X 或 Y,COMSOL 端口则要手动指定端口模式和极化方向,两边方向不一致时超表面这类偏振敏感结构的响应会完全不同。我习惯在两边都固定电场沿 X 方向,并在结果对比时先看最简单的 0 阶透射率,低阶模式对设置差异最敏感,容易暴露问题。
6. 写在最后的实操体会
这套从 FDTD 到 COMSOL 的流程,我前后磨合了不少项目,最深的体会是:工具只是链条上的环节,关键是围绕物理问题设定一条清晰的技术路线。FDTD 做快速宽谱筛选时不要追求绝对精度,它的价值在于缩小候选参数范围;COMSOL 做精细分析时不要盲目追求网格最密,先通过收敛性测试找到合理精度再批量计算,效率会高很多。
实际操作中我还摸索出一个工作流:先用 FDTD 对关键参数做正交扫描,把趋势图存下来;然后把 COMSOL 作为“标定工具”,针对两三个候选结构做全波仿真和多物理场耦合验证;最后如果要做优化,再用 COMSOL 的优化模块结合参数化几何做迭代。这样两条线各司其职,既没有浪费 FDTD 的宽谱优势,也没有让 COMSOL 陷入穷举式扫描的泥潭里。
如果你也刚接触光学超结构仿真,可以先挑一个简单的周期单元模型,把这两个工具的流程完整跑通一遍,记录了网格设置、边界条件、材料数据这些关键参数,后面再做复杂结构时就有参考基准了。仿真这条路没什么捷径,但踩过坑之后再回看,每一步经验都值回票价。