圆锥入射:COMSOL 有限元与 RCWA 的对照
一维光栅在圆锥入射下的衍射,用两种互相独立的方法各算了一遍:StableRCWA 的 RCWA(C++ 模块里的 rcwa::solve_conical)和 COMSOL 的二维有限元。比较的量是每个传播级的四个通道效率和复 Jones 矩阵。从裸界面到带膜系的光栅共 8 组算例,通道效率最大相差 3.3×10−6;由端口 S 参数换算的 Jones 矩阵元最大相差 1.04×10−5,相位最大相差 0.013°,另一条直接采样电场的路线最大相差 1.5×10−5。光栅算例上的差与 RCWA 的截断误差、有限元的网格误差同量级,没有发现不随网格加密、不随截断阶数提高而减小的偏差。
| 台阶 | 算例 | 比较的通道数 | 最大差,RCWA 取 M = 60 | 出现在 | 最大差,RCWA 取 M = 200 |
|---|
光栅 A:周期 0.8 µm,光栅层厚 0.3 µm,齿宽 0.3 µm、折射率 1.8,其余是空气;空气入射,基底折射率 1.5,波长 1.053 µm,极角 42°。各台阶的结构见第 5 节。
差到 10−6 说明什么
两种方法各有离散误差。RCWA 把场展开成 个空间谐波, 是截断阶数,误差随 增大而减小。有限元把计算区域剖分成小单元,误差随网格加密而减小。两种方法之差降到各自误差的量级之后,这个差只说明两边在误差范围内一致,分不出哪一边更准。
所以每组算例除了比较两种方法,还各看了一次每种方法的结果随自身参数的变化。RCWA 一侧取 与 两次结果之差。截断误差大致按 下降(第 6 节),所以这个差约是 时截断误差的 0.91 倍,可以当作截断误差本身。
COMSOL 一侧取正式网格与再密一档的网格两次结果之差,网格的参数见第 3 节。这个差比正式网格的误差小:网格加密一档,误差只减小一半左右,两次结果之差也就只有正式网格误差的一半上下。第 6 节的表里,各光栅算例在正式网格上与 的差是这个变化的 1.5 到 2.2 倍。
下图把这四个量按台阶画在一起,每个量都是该台阶全部通道里的最大值。
本页的 RCWA 结果全部来自 C++ 模块。对照的完整报告(没有随发布)的表里,RCWA 一栏出自另一份参照实现,即 gui/ 里附带的 Python 求解器。它与 C++ 模块的 Jones 矩阵元在 M = 60 时最多相差 6.9×10−13,M = 200 时最多相差 7.2×10−12,两处的数可以互换着读。
圆锥入射与四个通道
光栅的刻线沿 方向,周期方向沿 ,周期为 。入射波矢与表面法线的夹角是极角 。入射波矢和法线所在的平面叫入射面,它与 轴的夹角是方位角 。
时入射面垂直于刻线,各衍射级的波矢都在入射面内,s 偏振和 p 偏振互不耦合,这是通常的平面内入射。 时,各级波矢沿刻线方向的分量相同,沿周期方向的分量逐级相差 :
波矢以 为单位。 是这一级所在介质的折射率,反射级取入射介质的 ,透射级取出射介质的 。 是实数的级叫传播级,它带走能量;是虚数的级叫倏逝级,离开光栅后按指数衰减。某一级恰好在两者之间、 的位置叫 Rayleigh 截止。
前面是减号,这是 C++ 模块的编号。光栅方程常用的写法里 随级次增大,本页的 +1 级是那里的 −1 级。COMSOL 的 Periodic Structure 节点自动生成的端口也按常用写法编号,所以第 3 节的端口表里这一级是 −1。
同一种介质里各传播级的波矢长度相同, 也相同,所以它们与刻线方向的夹角相同,都落在以刻线方向为轴的一个圆锥面上。圆锥入射由此得名。
各级的波矢不共面,每一级有自己的衍射面,即这一级的波矢与法线所在的平面,方位角是 。偏振相对各自的衍射面定义:s 分量的电场垂直于衍射面,p 分量的电场在衍射面内并垂直于波矢。零级的面内波矢与入射波相同,它的衍射面就是入射面。
入射波的 s、p 两个分量各自都会激发出每一级的 s、p 两个分量。所以每个衍射级用一个 2×2 的复矩阵描述,叫 Jones 矩阵:
四个矩阵元对应四个通道。下标 表示入射 偏振、出射 偏振,例如 sp 是 p 偏振入射、s 偏振出射。ss 和 pp 是同偏振通道;sp 和 ps 是交叉偏振通道, 时为零。通道效率是这个通道带走的功率占入射功率的比例,等于矩阵元模的平方乘一个能流因子:
功率按垂直于光栅表面的能流计算,能流因子就是这一级与入射波在法线方向上的能流之比。反射级的 在入射介质里取,透射级在出射介质里取。
本页比较每个传播级在反射和透射两侧各四个通道的效率,第 7 节再比较 Jones 矩阵元本身。反射 +1 级的 sp 通道记作 R+1 sp,透射零级的 ss 通道记作 T0 ss,其余类推。
有限元模型
COMSOL 一侧用二维模型,只画一个周期的截面,物理场是 COMSOL 6.4 的电磁波频域接口。结构沿刻线方向不变,场沿这个方向只带一个相位因子,对应的波数叫离面波数,,就是上一节的 乘上 。电场的三个分量都作为未知量求解。这样的二维模型算的就是三维的圆锥入射。
- 区域。自上而下是空气间隔层、结构各层、基底间隔层,全部是矩形。折射率按区域给定。吸收介质在 RCWA 里写成 ,在 COMSOL 里写成 ,取 。
- 左右边界。Floquet 周期条件:两侧的场只差一个由入射波矢决定的相位。
- 上下边界。周期端口。上边界的端口发出入射平面波,同时接收反射;下边界的端口接收透射。一个端口只接收一个衍射级的一种偏振,所以每个传播级在每一侧需要两个端口。
- 间隔层。端口只接收传播级,倏逝级靠间隔层衰减。间隔层的厚度 按衰减最慢的那个倏逝级取,使 不超过 10−8,再加 0.05 µm。光栅 A 在 φ = −40° 时上下间隔层的这个衰减量是 3.9×10−9 和 5.4×10−9。
在 COMSOL 里对应的设置如下。物理场接口里把求解的电场分量设成三分量矢量,离面波数填 。波动方程用折射率模型,折射率的实部和虚部按区域给定。周期性和端口用 Periodic Structure 节点:选上边界作激励端口,偏振选线偏振的 S 或 P,入射角填 alpha_inc(取值见第 4 节),两侧的折射率填 和 ,衍射级次按当前参数生成。左右边界的 Floquet 周期条件由这个节点自带,波矢取自周期端口。端口是按生成时的波长、角度和周期列出的,这些参数变了,传播级可能不同,端口要重新生成;本页每个算例都重新建模。
生成的端口分三类。周期端口本身接收零级里与激励同偏振的分量。它的 Orthogonal Polarization 子节点接收零级的另一种偏振。每个非零的传播级有两个 Diffraction Order 子节点:out-of-plane 的模式电场垂直于这一级的衍射面,对应 s;in-plane 的在衍射面内,对应 p。每个模型求解两次,一次 S 激励,一次 P 激励,所以下表每个端口列出两个通道。光栅 A 在 φ = −40° 时有 8 个端口:
COMSOL 的端口按它自己的级次号编号,与 RCWA 的级次号差一个符号,第 4 节说明。周期更大的附加 B 有 12 个端口。
网格
网格是自由三角形。每个区域的最大单元尺寸取 , 是该区域的折射率, 是每个局部波长里的单元数。齿的角点是介质的尖角,电场在那里有奇异性,角点处的最大单元尺寸再缩小若干倍。左边界先划分,再把网格复制到右边界,保证两条周期边界上的节点一一对应。单元用二次或三次多项式。
正式结果统一用这一档网格:三次单元,k = 16,齿角处再密 8 倍,单元尺寸的增长率 1.3。
两套约定的对应
RCWA 和 COMSOL 的时间因子、坐标、角度参数、级次编号、偏振基都不一样。要逐通道比较,先要把每一项对应起来,而且每一条对应关系都要用数值核实,不能只靠读文档。下表是全部对应关系和核实用的数。其中入射角和结构取向两条容易取错,后面分开说明。
| 项目 | RCWA | COMSOL | 怎样核实 |
|---|---|---|---|
| 时间因子 | exp(−iωt) | exp(+jωt) | 两边的复振幅互为共轭。基底里相隔一段距离的两点,电场之比与平面波的相位因子 exp(−j k·Δr) 相差 2.2×10−3,k 是波矢。这一项用的是粗网格:每个局部波长 10 个单元,二次单元。 |
| 入射方向 | 极角 θ,方位角 φ | 面内入射角 α,离面波数 kop | α = atan(tan θ·cos φ)。裸界面对 Fresnel 公式,见下。 |
| 离面波数的符号 | ky = nI sin θ sin φ | kop = +k0·ky | 基底里的平面波应当满足 k·E = 0,k 是波矢。实测 |k·E|/(|k||E|) 不超过 2.6×10−3;把离面分量反号则是 0.33 到 0.44。 |
| 结构的取向 | ε(x) | ε(−x),再整体平移 | COMSOL 里要建 RCWA 结构的镜像。用非对称光栅核实,见下。 |
| 级次 | 第 m 级,kx,m = kx,0 − mλ/Λ | 端口自己的级次号 | 不靠级次号,按每个端口报告的模式波矢与 RCWA 的 (kx,m, ky) 配对。正式结果里每个端口都配上了,两边的波矢相差不超过 2.3×10−16。见下。 |
| 偏振 | s、p,相对各级的衍射面 | 入射的 S、P 相对入射面定义,φ ≠ 0 时入射面不是模型平面。出射端口里 out-of-plane 对应 s,in-plane 对应 p;周期端口本身与激励同偏振,Orthogonal Polarization 是另一种 | 端口的模式电场方向投到 RCWA 的 、 上应当是 ±1,实测与 ±1 相差不超过 2.8×10−16。 |
| 效率 | fm·|Jab|² | |S|² | 端口的 S 参数已经按功率归一,不再乘能流因子。无吸收的算例里全部端口的 |S|² 之和应当是 1:三次单元、k ≥ 16 的 88 次求解偏差不超过 9.0×10−14,全部 150 次求解里最大的是 3.1×10−9,出在最粗的网格上。 |
最后一行的和等于 1 只说明能量守恒:无吸收的模型里功率只能从端口出去,没有端口接收的传播级会被边界反射回去,分到别的端口上。它不说明端口齐全,也不说明结果正确。下面级次号取错的那次求解少了一个传播级的端口,和照样是 1。
入射角:COMSOL 的参数是面内角
COMSOL 二维周期端口有一个入射角参数 alpha_inc。它是波矢在模型平面内的投影与法线的夹角,模型平面是光栅矢量和法线张成的平面。只有 时它才等于极角 。读端口变量得到的关系是
其中 是入射介质里的波数, 是波矢沿光栅矢量的分量(这里带单位,没有除以 ), 是沿法线方向的传播常数。要得到极角 、方位角 的入射波,应当设
θ = 42°、φ = −40° 时 α = 34.596°。
把 alpha_inc 直接设成 时,模型照常求解,各端口效率之和照样是 1,但算的是极角 47.86° 的入射。这个错误在台阶 1(裸界面)就被 Fresnel 公式查了出来,改正之后才往下做。 即 的情形没有试。
结构取向:COMSOL 里要建镜像
RCWA 用时间因子 exp(−iωt),场沿横向的变化写成 。这两个符号合起来, 的波在 RCWA 的坐标里朝 方向走。COMSOL 用 exp(+jωt) 和 exp(−j k·r), 的波朝 方向走。两边的波矢取同一组数值时,坐标之间的关系是
下标 C 是 COMSOL,R 是 RCWA。所以 COMSOL 里的结构是 RCWA 结构沿 的镜像, 是为了把齿放到周期中间而加的平移。
左右对称的光栅分辨不出这一条:光栅 A 取不取镜像,结果只差 2.2×10−8。所以另加了一个非对称光栅,一个周期内依次是折射率 1.8、1.4、1.0 的三段。
级次号:两种搭法不一样,取错不报错
RCWA 的第 级是 。COMSOL 的端口有自己的级次号,它与 RCWA 的 是什么关系,取决于端口是怎么搭的。用 Periodic Structure 节点自动生成端口时,两侧的级次号都与 RCWA 反号。手工逐个添加 Port 和 Diffraction Order 子节点时,入射侧反号,出射侧同号。下表里的关系由端口报告的模式波矢配对得出:
各台阶的结果
算例排成台阶,从最简单的结构开始,每个台阶只多一种因素,上一个对上之后才做下一个。全部算例的波长是 1.053 µm,极角 42°,入射介质的折射率 = 1,出射介质的折射率 = 1.5。
台阶 1、2:均匀结构,对解析解
裸界面有 Fresnel 公式,单层膜有 Airy 公式,两种方法都可以直接对解析值。这两个台阶检验入射角、偏振的标法,以及膜厚和膜内的多次反射。均匀结构不产生衍射,也不耦合偏振,其余通道都应当是零:每个算例有 12 个这样的通道,RCWA 给出 0,COMSOL 给出的值不超过 4.5×10−16。
台阶 3、4:光栅 A,无吸收与有吸收
齿有吸收时,反射与透射的效率之和小于 1,差额就是吸收。COMSOL 一侧可以用两种互不相干的办法得到吸收:1 减去全部端口的效率之和,或者把损耗功率密度在齿内积分再除以入射功率。
台阶 5:方位角扫描
数据表
台阶 6 与两个附加算例
网格收敛与稳健性
正式网格是怎么定下来的,以及它给出的数有多可靠,都在光栅 A(台阶 3)上试过。下面三幅图的横轴是每个局部波长里的单元数 ,纵轴是两种方法在全部通道里的最大差。
改动模型的其他设置
下表每一行只改一项设置,其余与正式结果相同(光栅 A,三次单元,k = 16,齿角加密 8 倍)。
相位
效率只用到 Jones 矩阵元的模。椭圆偏振入射、几束光相干叠加这类问题还要用到相位,所以矩阵元本身也比了,比的是完整的复数,包括各级之间的相对相位和绝对相位。比较走了两条互相独立的路线。
端口路线。由 COMSOL 的复 S 参数换算成 RCWA 约定下的矩阵元:
- 是接收这个通道的端口,1 是激励端口。取复共轭是因为两边的时间因子相反;除以 是把按功率归一的 S 参数还原成电场幅值之比。
- 指数里是参考面的换算。S 参数以各端口所在的平面为相位零点,RCWA 的反射以结构上表面、透射以结构下表面为零点。 是激励端口到结构上表面的距离, 是接收端口到相应表面的距离。 方向上,COMSOL 的相位零点在 (),RCWA 的原点在 COMSOL 的 处。本页所有模型的周期单元都从 画起,端口的左端点就在 ;零点是坐标原点还是端口的左端点,这次对照分不出来。
- 是端口 的模式电场方向相对 RCWA 单位矢量 或 的符号,取 +1 或 −1,由端口变量
ewfd.Eampl和ewfd.kMode逐个端口算出。 是激励端口发出的入射场相对 RCWA 入射单位矢量的符号。
式子里没有可调的量。 由场直接定出:在空气区采样电场,分出入射波,折算到端口平面,得到 S 激励是 ,P 激励是 ,与这两个值的偏差不超过 1.4×10−5。
场路线。不用任何端口变量。在空气区取 2 条水平线、基底区取 2 条,每条线上等距采样 32 个点的电场,对每个传播级的 做离散 Fourier 投影得到这一级的矢量振幅,再投到 、 上;空气区的零级用两条线解出入射波和反射波。S、P 两次激励合起来解出 2×2 的矩阵。这条路线只用到场和几何。
两条路线互相独立地确认了级次的配对、s 和 p 的符号约定、 轴的取向、参考面的位置,以及 P 激励时入射矢量的符号。只比效率时这些符号都不起作用;比相位时每个端口的符号都要单独确定,各类端口并不相同:
端口模式电场方向相对 RCWA 单位矢量的符号(Periodic Structure 节点)
结论与没有检查的项
对上了什么
没有检查的
- 只有一个波长(1.053 µm)和一个极角(42°)。方位角只到 80°,没有试 φ = 90°、|φ| > 90° 和负的极角。
- 没有靠近 Rayleigh 截止的点。方位角扫描的各点里,离截止最近的一级 |kt|/n − 1 = 0.051,其中 kt 是面内波矢的长度。RCWA 在截止附近的行为没有经过这次对照。
- 没有靠近圆锥入射特有的层内模式奇点的点,这类奇点见第 5 节方位角扫描的图注。做了本征分解、φ ≠ 0 的 11 个算例里,离奇点的距离指标在 0.42 到 7.6 之间,模块的警告阈值是 0.01。模块在奇点附近的精度没有经过这次对照。
- 传播级最多 6 个(附加 B:透射 4 个、反射 2 个)。没有做大周期、几十个传播级的结构。
- 只有矩形齿和分段常数的折射率。没有斜壁、圆角和金属。吸收只试了齿有吸收的一种。基底始终无吸收,这也是 RCWA 模块本身的要求。
- 入射介质始终是空气。没有试从高折射率一侧入射,也没有试全反射。
- 光栅层都是 0.3 µm 厚的一层。没有深槽,也没有几个光栅层叠在一起的结构。
- 只比了传播级。倏逝级的振幅没有比。
- 入射只有线偏振的 s 和 p。圆偏振、椭圆偏振没有在 COMSOL 里直接算,它们由 Jones 矩阵决定,而 Jones 矩阵已经比过。
- 手工搭端口的路线只在台阶 3 比了效率,没有比相位,也没有在别的台阶上重复。
- 所有模型的周期单元都从 x = 0 画起。S 参数在 x 方向的相位零点是坐标原点还是端口的左端点,没有区分。
- Jones 矩阵在比正式网格更密的网格上只比了光栅 A 一个算例。
- 网格只做了尺寸加密,试了两种单元阶次和有无齿角加密。没有试四边形网格,没有改求解器设置。
- 只用了 COMSOL 6.4 这一个版本。C++ 模块只跑了默认选项。
在 COMSOL 里重复这件事时要留意的
- 入射角。φ ≠ 0 时
alpha_inc要设成 atan(tan θ·cos φ)。设成 θ 时模型照样能解,能量照样守恒,结果是另一个入射方向的。 - 结构取向。与采用 exp(−iωt) 和 exp[−ik0(kxx + kyy)] 的 RCWA 对照时,COMSOL 里要建结构的镜像。对称结构查不出这个错。
- 级次号。Periodic Structure 节点和手工搭的 Port 在出射侧的编号相反,取错不报错。读
ewfd.kModex_K、ewfd.kModez_K按波矢配对,并检查沿法线的ewfd.kModey_K是实数;倏逝级的这个量是纯虚数。 - 端口效率之和等于 1 不能当作结果正确的证据。入射角设错、级次号取错时它都等于 1。
- 齿角要局部加密,齿的侧壁不要落在周期边界上。见第 6 节。
- S 参数的变量名。端口号是一位数时写作
ewfd.S21,到两位数变成ewfd.S10_1。附加 B 有 12 个端口,第一次运行时 10、11、12 号端口没有读出来,改了脚本之后重算。 - 吸收。
ewfd.Atotal是体积损耗的积分。想要两个独立的数,要自己把端口效率加起来再用 1 去减。 - 相位。P 激励发出的入射矢量是 ;Orthogonal Polarization 端口和出射侧各端口的模式矢量符号各不相同。比相位时要逐个端口用
ewfd.Eampl定符号。 - 脚本驱动时的两处报错。Periodic Structure 的激励端口不能指派命名选择,要给出边界编号。手工创建 Port 时标签太短会抛异常:试过的是两个字符的
pt,报错是字符串下标越界(Range [4, 2) out of bounds for length 2)。改成port1这样的标签就没事,最短要几个字符没有试。
重新运行
COMSOL 一侧的驱动脚本、作业文件和原始输出(约 100 MB,重算还需要 COMSOL 的许可证)没有随 v0.1.0 发布。全部汇总数字见仓库的 docs/validation.zh-CN.md。RCWA 一侧用的是仓库里的 rcwa::solve_conical,以及 gui/ 里附带的 Python 参照求解器(rcwa1d.py 与 conical/)。