半解析电磁计算笔记(三):散射矩阵怎样级联,又怎样恢复每层的场?
多层介质:散射矩阵的星积与逐层场恢复
目的
多层结构可以逐层向外包入:先把末端半空间当作已知响应,再依次加入界面和传播段,直至得到整体散射矩阵。计算内部场时,沿保存下来的子结构响应逐层向内恢复,就像重新剥开已经包好的洋葱。
“包起来”消去内部相向波,留下两端口关系;“剥开来”在指定层重新求出这两个波。两步都使用同一组散射方程,不需要将 S 转换回 T。本文先推导层间连接与场恢复,再介绍多层薄板程序的核心函数及 benchmark。
仅有最终整体 S 的四个元素不能确定所有内部场;还需逐层几何和中间子结构响应。程序因此保存左右累计矩阵。整体 T 也需要相应局部关系才能恢复内部。
1. 每层场与端口的统一定义

图 1:层号由左到右增加,最外为半空间。A 始终朝正 z,B 始终朝负 z;只有在最左、最右外端口,才能将它们分别直接称为外部入射或出射。内部一个 A 波,是左子结构的出射,也是右子结构的入射。
固定横向波数
使用第一、二篇的偏振基矢。半空间的参考平面取最近界面;先以有限层右端为共同参考推导,再说明程序的稳定场重构接口。
一个子结构 X 的 S 定义为
其中 a 表示进入该子结构的波,b 表示离开该子结构的波。左入射
2. T 的级联与 S 的级联,区别在哪里?
T 的定义是同一参考面的正反向波配对。若 X 在左、Y 在右,且连接处使用同一基矢、同一参考面,
直接代入就得到
3. 用连接处的 u、v 推导星积

图 2:X 在左,Y 在右。u 向右,是 X 的右侧出射和 Y 的左侧入射;v 向左,是 Y 的左侧出射和 X 的右侧入射。中间虚线是参考切面,不是新材料界面。图中星号表示下面定义的级联运算。
两个子结构分别满足
把四行都展开:
中间两式是一对反馈方程。将 v 代入 u,令 $\delta=1-X{22}Y{11}$,得到
再代入 bL、bR,整理成
这就是本文定义顺序下的 Redheffer 星积:左边的 X 先经过,右边的 Y 后经过。有些文献把它写成带圈乘号等其他符号,也有相反的记号顺序。符号本身不能决定四个元素怎样排列,必须先明确式 (3.3) 的端口定义。本文使用
3.1 为什么多出一个分母?
$X{22}
3.2 星积的几条运算规则
在端口兼容、相关反馈逆存在的条件下,星积满足结合律,可以从左向右累积,也可以从右向左累积;一般不满足交换律。它不是逐元素相乘,也不是矩阵相加。
空结构的波直接穿过,因此星积单位元是
最简单的区别是
对于当前各向同性问题,每种偏振只有一个通道,式中元素是复数。若元素本身变成多通道矩阵,不能继续交换乘法次序或把分母当成一个数,见文末说明。
4. 可以一层一层加入吗?具体按什么顺序?
可以。将每个界面和每个有限层传播段各看成一个 S 块:
这里 Cj 是第 j 层的传播 S,不是传输矩阵。最外半空间不插入无限厚度的传播段。按几何顺序排出
从
这就是“一层层加入”的准确含义:加入界面、加入传播段,并执行星积,不是把各层 S 相加。若左侧已经是一整个薄膜堆栈,它的整体 S 也能继续与新块作星积。
5. 包好以后保留什么:各层右端的子结构响应
先采用 CoeAB_layer_SMM 使用的共同右参考面。令第 j 个有限层范围为
A、B 都在同一右端参考面,不是“一个在左端、一个在右端”。第 1 层的参考面是入口界面 z=0;最后一层没有有限右端,参考面取出口界面。

图 3:虚线切在第 j 层右端、尚未跨过下一材料界面的位置。左边 Pj 包括此前所有结构及第 j 层的传播段;右边 Qj 从该切面开始,包括下一个材料界面和其后结构。两条内部箭头是同一平面的 Aj、Bj。
记界面 S 为
右侧子结构是
P、Q 在这里是 2×2 散射矩阵。尤其
6. 从外层包入:左右子结构的逐层递推
左向右递推的初值为 P1=J。先跨过界面 j,再传播完整个下一有限层:
这正是原函数先 cascade_S(curr_SL,S_int{i}),再在下一层有限时接 S_prop{i} 的原因。数组 S_left{j} 保存的就是 Pj。
右向左递推从 QL=J 开始。为了从第 j+1 层右端回到第 j 层右端,需要将“第 j+1 层传播”和“界面 j”依照几何顺序接到现有结构前面:
所以原代码先执行 cascade_S(S_prop{i},curr_SR),再执行 cascade_S(S_int{i},curr_SR),不是把两个因子顺序写反。最终 S_right{j} 保存 Qj。
例如四层结构,完整链为
| 切面 | 左侧 S_left |
右侧 S_right |
|---|---|---|
| 第 1 层右端,即入口面 | J | 全部结构 |
| 第 2 层右端 | ||
| 第 3 层右端 | ||
| 第 4 层左端,即出口面 | 全部结构 | J |
因而任意切面都满足
这张表给出了左右累计矩阵的保存范围,可直接对应程序中的两次循环。
| 原代码变量 | 本文解析量 | 下标的具体含义 |
|---|---|---|
S_int{i} |
介质 i 与 i+1 的界面 | |
S_prop{i} |
第 i+1 个材料层的传播,厚度 d_layer(i) |
|
S_left{i} |
从入口到第 i 层右参考面 | |
S_right{i} |
从第 i 层右参考面到出口 | |
ABCoe{i} |
同一参考面的两个电场波系数 |
所以传播数组的第 i 项与材料层的第 i+1 层对应,不能把这两个 i 当成相同层号。
7. 逐层剥开:从左右响应恢复 Aj、Bj
整个结构的外部入射是
从第一张矩阵的第二行、第二张矩阵的第一行,得到
P21 是外部左入射传到切面的透射;P22 是从切面朝左看见的反射;Q11 是从切面朝右看见的反射;Q12 是外部右入射传到切面的透射。这四个量都是整段子结构的响应,不是某一个邻近界面的 Fresnel 系数。
联立后得到
这与原代码末尾 Ai、Bi 的两行表达式逐项相同。分母表示切面两侧子结构之间的往返反馈,外部双侧入射也已包括。
左入射 1、右入射 0 时,才简化为
因此“通过 S 恢复场”的实质,是保留被总 S 消去的中间切面,再解其内部两波。原 CoeAB_layer_SMM 已经实现,不需要再造一个求解器。
8. 对应 Get_Field_From_ABCoe 的场重构
令 $\zeta=z-z{ref,j}
原 Get_Field_From_ABCoe 按同样的右端参考平面,计算标量
第二篇曾将板内 A2、B2 都定义在左端。两套系数并不矛盾,换参考面即可:
在同一个位置代入式 (3.20),结果应相同。原代码返回的是 right 这组,不要拿它直接与左参考系数比较。
9. 用第二篇薄板核对原程序
空气 | n=1.5、100 nm | 空气,600 nm、正入射 TE,
P2 已包含一次板内传播,Q2 只是右界面。恢复公式给出
换回左参考面,得到第二篇的
可以直接调用已有原函数核对,不需要新增函数:
1 | % 从发布目录根部,使用完整保留的原仓库函数。 |
这里直接运行共同右参考面的接口;ABCoe、S_left、S_right 的层号一致,可逐项检查第 2 层的解析结果。
10. 核心函数与三个程序的分工
整个项目只组织三部分核心程序。第一部分计算无源多层薄板的反射、透射与内部场;第二部分把偶极子展开成平面波,调用第一部分,再组合 Green 张量、Purcell 因子与远场;第三部分处理球外偶极子的球多极子辐射。
本篇介绍第一部分。原始接口保留在 TransferMatrix 的快照中,整理后的公共入口位于模块 1:
| 计算步骤 | 原函数 | 整理后的入口 |
|---|---|---|
| 单界面 s/p 散射 | interface_S | mlpw.interface |
| 散射块星积 | cascade_S | mlpw.cascade |
| 整体响应、左右累计及层内系数 | CoeAB_layer_SMM/TMM | mlpw.solve |
| 空间场分布 | Get_Field_From_ABCoe | mlpw.field |
原接口的 ABCoe 使用共同右参考面,TE 的标量场是 Ey。通用 Cartesian 场应按偏振基矢恢复,不能把所有偏振都写成一个标量 A+B。整理后的 mlpw.field 返回 E、H 三个分量,内部使用 Aleft、Bright 两端参考来避免增长指数;两端参考和共同参考之间仅相差已知传播因子,边界物理完全相同。
模块 2 的 mldipole.rt 只负责上下结构的层序、厚度和源平面的相位转换。它直接调用模块 1 的 mlpw.solve 获取每个角谱分量的反射、透射,不另写 Fresnel 系数或多层递推。对角各向异性使用的平面波本征模与场重构也归模块 1;模块 2 只完成源投影及互易远场组合。
11. 数值实现与 benchmark
从发布目录运行:
1 | setup; |
首先用第二篇的单块玻璃板核对复振幅与板内系数;再检查多层 TMM/SMM、切向 E/H 连续与功率守恒。复场对比须统一 TM 基矢和参考面,不能只比较未转换的系数符号。
| 基准 | 检查量 | 已执行结果 |
|---|---|---|
| 100 nm 玻璃板、600 nm、TE | r、t 与解析分数 | -5/13、12i/13 |
| 普通双层薄膜 | SMM/TMM 复系数差 | 2.31e-16 |
| 空间界面检查 | 切向 E/H 采样残差 | 6.61e-9 |
| 五周期四分之一波长镜 | 新旧实现反射率差 | 9.13e-15 |
| 原布拉格场分布例子 | 内部 TE 复场差 | 约 3.7e-15 |
| 20 片高折射率层 | 新旧实现功率差 | 不超过 8.78e-12 |
这些指标分别检查归一化、矩阵级联和内部场恢复。界面采样残差包含跨越界面的有限采样距离,不是纯线性方程残差;不能将不同误差定义当成精度排名。极厚吸收/倏逝层和窄共振需要另外检查数值范围。

图 4:空气 | (HL)^5 | 空气,nH=3.5、nL=1.45,设计波长 1300 nm,各层光学厚度为四分之一波长,正入射 TE。

图 5:空气 | (HG)^4H | 空气,nH=2、nG=1,dH=2L、dG=L,omega L/c=3。图 4、5 是两个不同配置。另两个原例子——20 片层频谱与吸收光刻胶驻波——及全部参数、脚本、CSV 和比较记录见完整 benchmark 集合。
下一篇在这里已经建立的多层散射程序上引入点偶极子的角谱与 Green 张量,第五篇再单独展示 Purcell 因子和远场图的数值结果。
补充:元素变成矩阵时的星积
以上 s/p 独立通道的四个元素是复数。若以后处理耦合偏振或多个模式,X、Y 的每个元素块会变成矩阵。定义 $Du=I-X{22}Y{11}
这时次序不能交换,也不能把 Du 与 Dv 当成同一个分母。若以后扩展程序,应解线性方程,例如 Du\X21,而不是显式求逆。cascade_S 实现的是本篇的标量通道,不能直接把每个元素换成矩阵后照抄标量除法。
关于散射连接及其数值背景,可参阅 R. C. Rumpf, “Improved Formulation of Scattering Matrices for Semi-Analytical Methods That Is Consistent with Convention,” Progress In Electromagnetics Research B 35, 241–261 (2011), DOI:10.2528/PIERB11083107。本文的实际公式均由式 (3.3) 的端口关系直接消元,不依赖猜测文献里的星号方向。






