写这篇笔记的时候我刚好在跑一个多物理场耦合的项目FDTD Solutions 的仿真队列整整排了两天。身边好几个师弟师妹问我这软件到底怎么入门网上资料又碎又老官方手册厚得像字典很多人卡在“界面都认识、就是跑不出好结果”这一步。我花了差不多两个月把常用功能过了一遍也踩了不少坑把能记的、能查的、能直接抄作业的东西整理成这篇万字笔记覆盖建模流程、网格设置、光源监视器选型、常见报错排查这些核心环节。不管你是刚接触 FDTD Solutions 的科研新手还是被某个仿真结果折磨得怀疑人生的老用户这篇都应该能帮你省下不少自己试错的时间。1. 先把 FDTD 是什么这件事搞清楚1.1 时域有限差分法的基本原理FDTD 全称是 Finite-Difference Time-Domain也就是时域有限差分法。它的核心思路通俗点讲就是把麦克斯韦方程组在空间和时间上都离散化然后在每一个网格点上用差分方程近似偏微分方程一步一步在时间轴上“推演”电磁场的变化。你可以把它想象成用无数个小立方体把仿真区域填满然后让电磁波在这些小格子里一格一格地往前传。这种方法的优势非常明显一次仿真就能得到宽频带的结果因为光源可以打一个脉冲进去时域响应里天然包含了所有频率分量再做一次傅里叶变换就能拿到频谱。这在研究超表面、光子晶体、等离激元这类结构时特别合适因为往往需要看一个很宽波段内的透射、反射、吸收响应。不过 FDTD 也有比较尴尬的地方。它求解的是时域问题所以如果结构的品质因子很高电磁波在里面来回振荡很久才能衰减完仿真时间就会变得非常长。再一个是网格问题要分辨小尺寸结构网格就得加密内存消耗也会明显上去。1.2 FDTD Solutions 能做什么、解决什么问题FDTD Solutions 是 Lumerical 公司现在隶属 Synopsys推出的商业级 FDTD 仿真软件主要面向纳米光子学、集成光学、等离激元学等方向。我平时用它的场景大概有这么几类超表面单元设计与参数扫描比如不同尺寸的纳米柱对透射相位的影响。金属纳米结构的等离激元共振看吸收峰位置怎么随几何尺寸变化。波导器件设计包括模斑转换器、定向耦合器、弯曲波导这类结构。周期性结构的光学响应比如光栅、光子晶体平板的透过率谱。它跟 COMSOL 相比最大的优势在计算效率。COMSOL 用有限元法在处理开域辐射问题时需要比较小心地设置边界条件FDTD 在均匀背景里自动用 PML 吸收边界对大多数纳米光学问题来说用起来要“无脑”一些。但 FDTD 对结构形状的贴合度不如有限元法因为网格是矩形正交的斜边和曲面需要靠阶梯近似来逼近。1.3 学习前的软硬件准备说句实在话FDTD Solutions 这个软件对配置是有点要求的。我自己办公机是 16GB 内存的笔记本跑二维模型问题不大但一上三维模型就得把网格使劲调粗否则内存很容易爆。如果是研究金属结构或者高折射率介质结构建议工作机至少 32GB 起步64GB 会舒服很多。软件本身在 Windows 和 Linux 上都能跑Linux 服务器上做参数扫描会被广泛使用。公司或课题组有服务器的话建议直接配置 LSF 或 Slurm 调度并行效率在核心数不高的情况下还是可以的。不过要注意FDTD Solutions 的并行扩展性不是线性的核心超过一定数量后加速比提升有限一般 8 到 16 核是比较甜点区间。2. 界面、对象树和核心概念动手前先磨刀2.1 界面布局和文件结构FDTD Solutions 的图形界面跟大多数 CAE 软件类似最上面是菜单和工具栏左边是对象树中间是三维视图窗口右边是属性面板底部有脚本控制台。新同学最容易懵的是“为什么我建了个结构视图里看不到”多半是没把结构材料设定成合理值或者尺寸太小没在视口里聚焦。文件结构这块要建立一个好习惯每个仿真项目单独建一个文件夹里面按版本号或日期存放文件。FDTD Solutions 的工程文件以 .fsp 为扩展名它是一个完整的多层结构包含模型对象、网格设置、光源监视器、边界条件、仿真区域以及分析脚本。另存为时它不会自动打包结果数据所以要保留仿真结果需要把 .fsp 文件和相关的 .log、.dat 文件一起备份。2.2 对象树结构、光源、监视器、网格、边界我把对象树里的东西分成几大类理解了它们各自扮演的角色后面操作逻辑就清楚了结构对象用于定义仿真区域内的物理结构包括几何形状、材料、位置、朝向。常见的有矩形板、圆柱、球体、多边形也可以通过导入 CAD 文件获得复杂结构。光源仿真能量的注入方式包括平面波、偶极子、高斯光束、模式光源等。监视器在仿真过程中记录需要的物理量包括折射率监视器、时域/频域监视器、功率监视器、电影监视器等。网格区域用来局部加密网格的地方。全局网格控制整体精度网格区域用于细化关键位置。边界条件仿真区域的边界处理方式包括 PML、周期性、布洛赫、金属、对称/反对称等。2.3 “新材料”怎么加才不容易出错FDTD Solutions 自带一个材料库覆盖了不少常见光学材料但实际研究中经常要用到非库内材料这时候就需要手动输入折射率或介电常数数据。我的建议是从文献或者公开数据库里把数据整理成两列波长或频率折射率实部或虚部然后通过 Material Explorer 导入。一个常见的坑是导入数据时单位不一致。材料数据常见的横坐标有“微米”、“纳米”、“电子伏特”FDTD Solutions 默认你用波长单位时是微米如果用电子伏特就要在导入向导里选好对应类型。这个不仔细后面折射率分布会错得很离谱仿真出来什么结果都解释不了。3. 建模实操从零开始搭一个超表面单元仿真3.1 超表面单元的几何建模我拿一个比较典型的例子来说明完整建模流程一个直径 200 nm、高度 400 nm 的圆柱形硅纳米柱放在二氧化硅衬底上单元周期是 400 nm用来研究它在可见光波段的透射响应。第一步先确定仿真区域。因为这是周期性结构仿真区域只需要包含一个周期x 和 y 方向边界长度各设置成 400 nm。z 方向从衬底下方 500 nm 到结构上方 500 nm留出充足的空气区域给 PML 缓冲。第二步创建衬底结构。选 Rectangle在属性里把 x 和 y 尺寸设成跟仿真区域一样z 方向从 -400 nm 到 0材料选 SiO2。这里要注意周期性结构中的衬底厚度不需要真实模拟硅片几百微米的厚度只需要设置一个光学厚度足够大的层让光在其中传播时相位响应不会受到底部边界的影响即可。第三步创建硅纳米柱。选 Cylinder半径 100 nm高度 400 nm中心坐标 (0, 0, 200)让底面落在衬底表面。材料从库中选“Si (Silicon) - Palik”这是常用晶体硅数据在可见光近红外区域适用性不错。3.2 模拟区域、边界条件和光源设置模拟区域 FDTD 对象里x 和 y 方向设置成周期性边界条件这是周期结构仿真最基本配置。z 方向用 PML。如果你研究的是斜入射情况周期性边界条件下还需要开启布洛赫边界条件并设置对应的 k 向量。光源方面我选择用平面波光源波长范围 400 nm 到 800 nm方向从空气侧垂直往下打偏振沿 x 方向。FDTD Solutions 里平面波光源默认注入方向是负 z 方向所以把它放在结构上方空气区域即可。这里有个细节要强调在周期性结构仿真里平面波光源的横向尺寸必须覆盖整个仿真区域否则边缘效应会导致结果不准确。FDTD Solutions 会自动处理这个问题但如果你把光源尺寸手动改小了仿真结果就会出现奇怪的振荡。3.3 监视器布局与透射反射谱提取要提取透射谱和反射谱各放一个频域功率监视器。透射监视器放在结构下方衬底中间的某个位置反射监视器放在结构上方光源和结构之间。注意监视器平面要足够大能够收集到全部透射或反射功率。FDTD Solutions 有一个便捷功能叫“Transmission/Reflection”分析组它能自动提取监视器的功率数据并通过边界摆位计算出透射率和反射率。没有这个功能的话也可以手动在脚本里用 transmission 函数提取。跑完仿真后把透射监视器的 T_plus 或者 reflection 监视器的 R_minus 数据导出画图就能看到对应波段内的光谱响应。我一般会顺手把吸收率也算了吸收率 1 - 透射率 - 反射率这样能更全面判断器件的性能。4. 网格设置与仿真实战精度和速度怎么平衡4.1 全局网格精度和网格细化区域网格是 FDTD 仿真里对结果影响最大的一个设置没有之一。全局网格精度通常用“Mesh Accuracy”参数控制取值范围是 1 到 8。默认值是 2对很多简单结构来说已经够用但对亚波长的金属结构或高折射率对比界面建议至少到 3 或者 4。网格精度每提高一级网格数量大约会增加一倍内存和仿真时间也会大幅上升。所以在实际项目里我不太建议把全局精度盲目调高而是用局部网格区域把需要精细分辨的地方加密。网格区域的使用逻辑很简单在需要加密的实体位置添加一个 Mesh 对象把网格步长设为需要的数值。比如硅纳米柱表面附近可以把网格步长设为 5 nm 甚至更小。因为超表面的光学响应高度依赖于结构内部的场分布局部加密能在不大幅增加计算量的前提下显著提高精度。4.2 自动关闭条件与收敛性判定FDTD 仿真的时域推进并不会一直持续下去软件通过 auto shut-off level 判断什么时候场能量衰减到足够低然后自动结束仿真。默认设置通常是 1e-5也就是说当仿真区域内所有时域监视器检测到的场能量衰减到初始峰值能量的 1e-5 时认为仿真趋于稳定可以结束。但 Q 值很高的结构比如光子晶体微腔或超表面中的共振模式能量衰减很慢仿真持续时间会很长。遇到这类问题我建议先把 auto shut-off level 调到 1e-7 或更低同时用时间监视器观察场随时间的衰减情况。如果时间监视器显示能量呈指数衰减但始终不收敛可以适当延长 simulation time。判断仿真是否收敛还有一个比较实用的技巧对比不同网格密度下的结果。如果加密网格后某个关键指标比如共振峰位置变化很小说明当前网格密度下结果已经收敛。这是我每做一个新结构必做的一步。虽然会耗时但这个时间花得值。4.3 内存管理技巧三维 FDTD 相比二维计算量直接上两到三个量级内存经常成为主要瓶颈。一个最简单有效的办法是能用二维就不要跑三维。很多波导问题和周期性结构问题在结构完全沿某一方向均匀的情况下完全可以用二维仿真近似结果和三维的差异通常不到 5%。另外就是多用对称/反对称边界条件。如果结构关于 x 轴或 y 轴对称光源偏振方向也符合对称性就可以在相应方向用 Symmetric 边界条件计算量直接减半甚至减到四分之一。这个操作在等离激元和超表面仿真里使用频繁几乎每篇相关论文都能看到这种设置。5. 光源、监视器和分析组从“跑出来”到“看得懂”5.1 常用光源选择和适用场景FDTD Solutions 里光源类型不少选错光源是新手特别容易犯的问题。我按场景给总结一下平面波光源适用于计算透射反射谱、吸收率是超表面和周期性结构仿真的首选。偶极子光源适用于研究点源激发比如荧光分子靠近金属纳米颗粒时的辐射增强、等离激元共振激发。高斯光源适用于自由空间光束传播问题比较接近实际激光器输出。模式光源适用于波导结构可以精确耦合特定模式进入波导计算模场分布、模式折射率等。总场散射场光源TFSF适用于散射截面计算比如单个颗粒的散射特性。5.2 监视器类型进阶用法除了最常见的频域功率监视器FDTD Solutions 还有很多监视器能派上用场。折射率监视器用来检查结构几何有没有建错。我第一次做双层超表面的时候怎么都觉得结果不对后来加了一个折射率分布监视器才发现第二层结构的位置在 z 方向上偏了 50 nm。频域场监视器记录特定频率的电/磁场分布可以用来直观查看共振模式的特征。比如看等离激元共振是偶极模式还是四极模式直接看近场分布图就够了。电影监视器记录时域场演化对理解物理过程帮助很大但数据量非常大一般在正式跑大仿真前用来调试模型。5.3 分析组的妙用分析组是 FDTD Solutions 里很实用但很多人没有注意到的功能。它在对象树里表现为带公式脚本的复合监视器。比如透射反射分析组、光的散射截面分析组、菲涅尔系数分析组等本质上是一个预置的脚本集合自动对选定的监视器数据做后处理并输出结果。用分析组的好处是很明显的省去了写脚本的麻烦而且结果是实时自动更新的改变几何参数重新跑仿真后分析结果立刻刷新。缺点是这些分析组对监视器摆放位置和命名是有要求的不按规则来就会报错。第一次使用某个分析组前建议先双击对象看看它的说明文档和依赖的监视器名称。6. 参数扫描与脚本化重复劳动交给电脑6.1 参数扫描优化功能手工改参数一遍一遍跑仿真的做法不可取不仅效率低下也容易出错。FDTD Solutions 里可以把任意结构参数定义成“设计变量”然后通过 Optimization and Sweep 功能进行参数扫描。以超表面单元为例纳米柱直径从 100 nm 扫到 250 nm步长 10 nm这个就是一个一维参数扫描。把直径设为设计变量扫描范围填好软件就会自动依次跑完所有仿真并把结果汇总到一个扫描文件里。这种功能在单元库设计时非常好用几乎所有超表面相关的研究都依赖参数扫描来筛选合适的结构参数。6.2 用 Lumerical Script 写循环批处理参数扫描功能有一定限制比如扫描多个参数的联合优化时效率并不高。这时候用 Lumerical Script 写代码控制仿真会更灵活。Lumerical Script 是一种类似 MATLAB 的脚本语言可以控制模型参数、运行仿真、提取数据。下面这段代码是几个基础操作# 指定工程文件并打开 switchtolayout; load(nanopillar.fsp); # 修改设计参数 setnamed(cylinder, radius, 120e-9); # 运行仿真 run; # 提取数据 T transmission(T); R transmission(R); # 保存数据 save(nanopillar_r120_T.mat, T);注意这里 transmission 函数的参数是监视器名字。FDTD Solutions 里常用的数据提取函数还包括 getresult、getdata、eps 等等。搞懂了这几个函数基本的数据处理流程就都能跑通了。6.3 服务器批量仿真配置项目推进到大规模参数扫描时单机串行跑是撑不住的尤其是三维模型。你可以把工程文件放到 Linux 服务器上用命令行模式运行。常见调度系统是 Slurm 或 LSF。单任务的命令行启动格式很简单fdtd-solutions -n 16 nanopillar.fsp-n 参数指定使用几个核心并行计算。如果做成批量任务就需要在每个任务前用脚本修改设计参数然后用不同的工程文件名或不同目录区分递交任务队列时每个任务独立跑一个参数点。这里我吃过一个亏批量提交任务时如果所有任务向同一个结果目录输出 log 文件不同任务的日志会互相覆盖导致排查问题时完全找不到对应信息。正确做法是为每个任务单独建一个输出目录或者把任务 ID 融入文件名。7. 一手踩坑记录与排查实战7.1 常见报错信息汇总这两个月里我遇到的报错信息不少挑几个典型的来说说。“Singular matrix”或者“Mesh refinement failed”一般是因为结构几何异常比如物体尺寸小于网格步长、两个物体边界刚好重合导致网格节点退化。解决方法通常是检查几何尺寸适当调整网格或者稍微挪动一下物体位置错开网格对齐。“Insufficient memory”就是内存不够了。这个除了升级硬件还可以从网格数量入手检查是不是全局网格精度调太高了或者有些不需要精确计算的区域也开了局部网格。之前我把一个波导仿真局部网格设置范围设得太大内存占用一下子从 8GB 冲到 60GB调整后降到了 15GB。“Divergence detected”表示仿真中场值发散通常是材料参数设置错误比如金属介电常数虚部填成了正数或者 PML 边界设置有问题。出现这个信息时先检查材料数据然后检查 PML 层数和位置有没有覆盖到结构附近的强场区域。7.2 结果不对时的排查思路仿真结果和预期差异很大时我一般按下面顺序排查第一步检查折射率监视器。如果结构折射率分布都不对后面再分析也没有意义。第二步单独看光源和监视器。把结构全删掉只保留背景材料和光源、监视器跑一个空白仿真。透射率应该是 1没有反射和吸收反射率应该是 0。如果这个不对光源或监视器本身就有问题。第三步检查边界条件和仿真区域大小。周期性结构的周期大小如果设置不对会直接改变光谱响应特性。PML 离结构太近会吸收掉部分近场导致结果失真。第四步检查网格收敛性。用更细的网格重复仿真看结果变化是否在可接受范围内。7.3 金属材料建模的坑色散模型怎么用金属在可见光和近红外区域具有强烈的色散效应介电常数实部和虚部都随波长变化剧烈必须使用合适的色散模型描述而不能简单设成一个常数折射率。FDTD Solutions 材料库里对常用金属金、银、铝、铜等提供了几种经验模型包括 Drude、Drude-Lorentz、Palik 等。计算等离激元共振时不同模型的差别会导致共振峰位置偏移几十纳米这在要求比较高的研究中影响还是不小的。我的习惯是如果研究的是金或银纳米结构尽量用 Palik 实验数据因为它覆盖的波长范围比较宽最接近真实材料的响应。Drude 模型在远离等离子体频率的波段表现良好但在接近或低于等离子体频率时误差较大。假如论文用了一个特定的数据来源你也要保持数据来源一致否则复现对比时会出现系统性偏差。7.4 高阶经验PML 与仿真时间协同调试再分享一个细节PML 边界条件虽说是吸收边界但它的吸收效果跟入射角度和频率有关。如果仿真时间很长但能量始终衰减不下来除了结构本身 Q 值高的原因之外也有可能是 PML 没有把杂散反射吸收干净导致能量一直在边界之间来回反射。此时有两个手段一是增加 PML 层数软件里默认是 12 层必要时调到 48 层二是把 PML 区域长度增加让它离结构更远减弱近场耦合到 PML 的强度。这个调整对金属纳米结构和微纳波导来讲尤其明显因为它能消掉结果里的高频振荡毛刺。8. 更实用的数据后处理技巧8.1 场的可视化与导出FDTD Solutions 的结果可视化主要靠右上角的可视化面板。可以通过勾选监视器显示电场强度、磁场强度、功率流、折射率分布等。场分布图导出时可以在脚本里用 image 或 export 命令保存也可以在视图窗口手动右键导出数据。对需要发表论文的图片来说我通常会在 FDTD Solutions 里先把场分布数据导出为二维矩阵然后在 MATLAB 或 Origin 里重新绘制。这样配色、坐标范围、标尺字体都能统一控制。8.2 透射方法T_plus 和 R_minus 到底怎么看使用传输函数时要注意方向。透射监视器中的 transmission(T) 函数返回值是一个 2x1 矩阵第一个元素对应正向传播功率第二个对应反向传播功率。在超表面仿真中透射监视器放在结构下方光从上方入射所以需要的是正向传输分量也就是 T(:,1)通常记为 T_plus。反射监视器在结构上方需要反向传输分量即 R(:,2)记为 R_minus。如果搞反了方向透射反射谱就会出现离谱的错误甚至在某些波长超过 1。8.3 近场到远场转换远场投影是 FDTD Solutions 里非常实用的功能。它可以根据近场数据通过等效面原理外推出无穷远处的辐射方向图不需要真的把仿真区域扩展到远场区域。使用方法是在结构周围放置一个封闭的频域场监视器然后通过 Analysis 里的 farfield 脚本函数计算远场分布。这个功能在纳米天线、单颗粒散射方向图研究里应用很广泛计算结果也可以导出成可输入其他软件处理的文本数据。近场到远场转换需要监视器是闭合表面否则会有边缘泄漏。对于周期结构远场计算还需要特别处理布洛赫周期性通常在脚本里要调用 unix 不少设置细节需要对照帮助文档来搞。结尾给新人的几个学习建议说下来我个人体会最深的一点是学这个软件别急着追求所谓“高级功能”。先老老实实把一个矩形波导或者一个圆柱的仿真流程走通把每种监视器输出的是什么物理量搞清楚再上手处理实际研究里的复杂结构。遇到“结果不对劲”优先考虑是不是几何建错、网格太粗、材料数据不对然后再考虑是不是软件本身的问题这能帮你节约大量调试时间。最后还想分享一个小偏方每次跑完一个仿真花两分钟把工程文件的关键参数截图或者誊抄在实验记录里记录下来 D50、周期、监视器位置、网格步长、仿真时长这五类信息。过两周再回来看你会庆幸自己留了一手。做仿真本质上是在跟自己的记性和耐心较劲把过程记录下来比多跑十个仿真更有价值。