项目4.4 Reflection calculation using a dipole source
在此页面中,我们采用了一种不同于标准平面波源方法的替代模拟设置,使用偶极子源来计算多层堆叠结构的反射。在此情况下,我们使用空气 - 玻璃界面。这种技术很有吸引力,因为它能够在单次模拟中计算出所有角度的反射。另一个优点是,所有模拟边界都设置为 PML,这可以提高临界角或接近临界角时的角度性能。
仿真设置
上图展示了 dipole_2layer.fsp 的仿真设置。空气 - 玻璃界面清晰可见,还有偶极子源(蓝色圆圈)和剖面监视器(黄色线)。在堆叠结构的正下方放置了一个剖面监视器。前向和后向远场投影均从该监视器计算得出。反射率可通过后向投影除以前向投影得出。每种偏振态都需要进行一次仿真。
优点:
一次模拟即可得到所有角度下的反射率(R)和透射率(T)。
缺点:
此技术仅适用于无图案的平板,不适用于光栅。随着堆叠层数的增加,可能需要非常宽的模拟范围。
结果:
脚本 dipole_2layer.lsf 将运行两次模拟,然后计算解析解。对于两种偏振,模拟得到的反射率和透射率与入射角的关系以及解析解均被绘制出来。
代码分析
这段代码是 Lumerical 软件的脚本文件(.lsf),用于计算双层介质结构的反射和透射光谱,并将 FDTD 仿真结果与理论结果进行对比
# scriptfile: dipole_2layer.lsf
注释:标识脚本文件名,说明当前文件为dipole_2layer.lsf。
# This file calculates the reflection spectrum for a single dielectric interface. It does both polarizations (TE and TM) and compares to the analytic result.
注释:说明脚本功能:计算单层介质界面的反射光谱,处理 TE(S 偏振)和 TM(P 偏振)两种偏振态,并与解析理论结果进行对比。
# Copyright 2012, Lumerical Solutions, Inc.
注释:版权声明,属于 2012 年 Lumerical Solutions 公司(Lumerical 是光子仿真软件开发商)。
sweepname="2layer";
定义变量sweepname并赋值为字符串"2layer",用于指定后续要读取的 “扫描仿真”(sweep simulation)的名称(这里指 “双层结构” 的扫描仿真)。
# choose to rerun or load simulations previously run
注释:说明后续代码的作用:选择重新运行仿真或加载之前已运行的仿真结果。
#runsweep;
被注释的命令:runsweep是 Lumerical 中执行扫描仿真的命令。这里被注释,说明脚本会直接加载已完成的仿真结果,而不重新运行仿真。
f = getsweepdata(sweepname,"f");
调用getsweepdata函数从名称为sweepname(即 "2layer")的扫描仿真中,提取参数"f"(频率)的数据,并赋值给变量f。
theta = getsweepdata(sweepname,"theta");
从扫描仿真中提取参数"theta"(入射角,单位通常为度)的数据,赋值给变量theta。
n = getsweepdata(sweepname,"n");
从扫描仿真中提取参数"n"(介质折射率)的数据,赋值给变量n(可能包含多层介质的折射率)。
d = getsweepdata(sweepname,"d");
从扫描仿真中提取参数"d"(介质厚度)的数据,赋值给变量d(可能包含多层介质的厚度)。
Rs_fdtd = pinch(getsweepdata(sweepname,"r"),2,1);
getsweepdata(sweepname,"r"):提取扫描仿真中反射率("r")的原始数据(通常是一个多维数组,包含不同偏振态的结果)。
pinch(...,2,1):pinch函数用于提取多维数组中特定维度的数据,这里表示 “在第 2 个维度取第 1 个元素”,对应 TE 偏振(S 偏振)的反射率。
最终将 FDTD 仿真得到的 S 偏振反射率赋值给Rs_fdtd。
Ts_fdtd = pinch(getsweepdata(sweepname,"t"),2,1);
类似上一句,提取透射率("t")数据中第 2 维度的第 1 个元素,对应 FDTD 仿真得到的 S 偏振透射率,赋值给Ts_fdtd。
Rp_fdtd = pinch(getsweepdata(sweepname,"r"),2,2);
提取反射率("r")数据中第 2 维度的第 2 个元素,对应 TM 偏振(P 偏振)的反射率(FDTD 仿真结果),赋值给Rp_fdtd。
Tp_fdtd = pinch(getsweepdata(sweepname,"t"),2,2);
提取透射率("t")数据中第 2 维度的第 2 个元素,对应 FDTD 仿真得到的 P 偏振透射率,赋值给Tp_fdtd。
RT_Theory = stackrt(n,d,f,theta);
调用 Lumerical 内置函数stackrt计算多层膜结构的理论反射 / 透射率。
参数:n(折射率)、d(厚度)、f(频率)、theta(入射角)。
返回值RT_Theory是一个结构体,包含理论计算的反射率(Rs、Rp)和透射率(Ts、Tp)。
plot(theta,Rs_fdtd,RT_Theory.Rs,Rp_fdtd,RT_Theory.Rp,"angle (degrees)","Reflection","Reflection vs angle");
绘制反射率随入射角变化的曲线:
横轴:theta(入射角,单位 “度”)。
纵轴:反射率。
曲线包括:FDTD 的 S 偏振反射率(Rs_fdtd)、理论的 S 偏振反射率(RT_Theory.Rs)、FDTD 的 P 偏振反射率(Rp_fdtd)、理论的 P 偏振反射率(RT_Theory.Rp)。
图表标题为 “Reflection vs angle”(反射率与角度的关系)。
legend("S FDTD","S Theory","P FDTD","P Theory");
为上一个反射率图添加图例,依次对应曲线的含义:S 偏振 FDTD 结果、S 偏振理论结果、P 偏振 FDTD 结果、P 偏振理论结果。
plot(theta,Ts_fdtd,RT_Theory.Ts,Tp_fdtd,RT_Theory.Tp,"angle (degrees)","Transmission","Transmission vs incident angle");
绘制透射率随入射角变化的曲线:
横轴:theta(入射角,单位 “度”)。
纵轴:透射率。
曲线包括:FDTD 的 S 偏振透射率(Ts_fdtd)、理论的 S 偏振透射率(RT_Theory.Ts)、FDTD 的 P 偏振透射率(Tp_fdtd)、理论的 P 偏振透射率(RT_Theory.Tp)。
图表标题为 “Transmission vs incident angle”(透射率与入射角的关系)。
legend("S FDTD","S Theory","P FDTD","P Theory");
为透射率图添加图例,含义同反射率图的图例。
总结:整个脚本的核心逻辑是 “加载 FDTD 仿真数据→提取关键参数(反射 / 透射率)→计算理论结果→绘图对比仿真与理论”,用于验证双层介质结构的光学特性仿真结果的准确性