? ? 本文重点参考自Lumerical官方的此篇文章,以翻译内容为主体并附加相关的FDTD Script介绍,主要目标是学习了解S参数的使用方式及其提取相位等参数的基本原理 Lumerical Support — Metamaterial S parameter extraction
注:下文中的输入/输出信号对应于入射光和反射/透射光,个人使用S参数来提取光的相位信息。
一、S参数简介
双端口网络的S参数
? ? ? S参数也被称为散射参数,常用于描述 2×2 网络(network)或传输线(transmission lines)的传输行为。对于如上图所示两给定的输入信号a1和a2, 输出信号b1和b2,可采用下面公式进行计算:
? ? ? S参数是采用的是复振幅(包括振幅和相位)的形式来表示反射和透射系数。从上式中我们可以看出输出信号b1分别由输入信号a1、a2与系数S11、S12相乘求和得到,输出信号b2则同理。其中,a1入射光对应的是反射系数S11和透射系数S21,a2入射光对应的是反射系数S22和透射系数S12。
二、S参数的提取原理
? ? ? 已知入射信号a和b的系数与电场成正比,设Ei,Er,Et分别表示入射、反射和透射电场,则S参数可表示为S11=b1/a1=Er/Ei而S21=b2/a1=Et/Ei。在使用S参数时需要保证模型满足以下两条件(需保证在以下前提的情况下使用,在实在不知道如何使用的情况下,可以参考Lumerical官方分析组库中各监视器及超材料的摆放位置):
- 要测量近场的S参数,若测量区域如监视器位置存在瞬逝场的影响(见物理光学)可能会导致测量出错,因此要确保监视器离结构足够远;
- 模拟光源和监视器要与超材料表面保持一定距离,监视器必须与超材料保持足够远来避免瞬逝场的影响)。
? ? ? 当场从光源传播到超材料再到监视器时会积累额外的相位差(见下图)。而仅需要超材料的S参数(即超材料引入的变化,如突变相位),要抵消这个额外传播过程的影响我们必须补偿该相位差。假设入射和透射空间中的波数分别为ki和kt,则监视器T中来自光源S的额外相位差为 ki * rs+kt * rt,其中rs和rt是距离。同理反射监视器 R对应的额外相位差是ki * rs+ki * rr。
光源和监视器的相位补偿
三、S-parameter分析组参数设置
? ? ? 在Lumerical软件提供的分析组对象库中已经提供了现成的S参数分析组,上文中提到的额外相位差的补偿便在分析组的脚本中完成。注意我们假定平面波在平面超结构表面上传播之后,得到的反射波和透射波是依旧以平面波形式传播,可以使用点频域监视器(即分析组中的折射率监视器)来记录电场分量,另外两个平面频域监视器用于测量传输功率(以及光栅投影近场数据)来计算超材料的S参数和传输效率。
? ? ? 对于平面结构定义的S参数中相关偏振参数的约定见下图。如果超材料上下方的介质具有不同的折射率,
∣
S
12
∣
2
|S12|^2
∣S12∣2和
∣
S
21
∣
2
|S21|^2
∣S21∣2都大于1。Lumerical软件提供的S分析组还可以处理斜入射以及输入和输出s和p偏振光的情况。
S参数计算中关于s和p偏振光的约定
? ? ? 下面针对S-parameter分析组中具体参数的设置进行介绍。首先是分析组的属性设置(Setup),在分析组对象内部的脚本中有详细描述,下面详细介绍其中属性设置参数:
- start wavelength and stop wavelength: 指定光源的波长范围。如果起始波长和终止波长不相同,可以在全局监视器属性中设置使用的频点数。
- x/y/z span: 沿这入射轴方向表示的是R、T监视器间的距离,垂直入射轴方向则是两监视器的大小(长宽)。
- propagation direction:+1/-1表示光源传播方向。
- propagation axis: 表示光源传播轴。
- angle theta/phi: 表示光源与轴之间的旋转角(仅使用光源中最大的 s 和 p 偏振分量)。
- polarization angle:表示光源的偏振方向。
- source offset: 光源和反射监视器R之间的距离。
- source_type: 用于在两种类型的源之间进行选择:1用于Bloch/periodic,2 用于BFAST。仅将“source_type”= 2 用于斜入射的宽带模拟。
分析组的设置属性参数
? ?? 完成基本属性设置参数后,需要再设置以下4个分析属性(Analysis):
- metamaterial center and metamaterial span: 指定全局坐标中超材料区域。由于计算光源位置和远场半球,此信息用于减去S参数中的附加相位。
- target_grating_order_out: 指定用于计算S参数的特定输出光栅顺序。
- suppress_warnings:禁用(suppress_warnings = 1)或启用 (supress_warnings = 0) 带有警告消息的弹出窗口(参见下面的描述)。出现警告时的“warnings”结果为 1(以下情况将生成警告:1.光源的极化既不是 S 也不是 P;2.未找到某些频率点的所需顺序。当不支持目标光栅顺序时会发生这种情况。)。
分析组的分析属性参数
? ?? 最后介绍一下分析组会生成两个 S 参数分析结果。其中,“S”是主输入偏振和相同输出偏振的S参数(例如,如果光源是s偏振,它只计算s偏振透射和反射光的结果)。而 “S_polarization”是主输入极化和两个输出极化的S参数,只有在极化方向被超材料旋转时使用。
四、S参数设置脚本
? ?? 下面提供一个设置S参数的脚本,可以配合上文截图中给出的设置参数,自己尝试着运行脚本在模型中添加S参数,看看官方的S参数分析组是如何设置的。关于各脚本指令的具体含义,不清楚的可以在Lumerical scripting language - Alphabetical list自行查找学习。
deleteall;
# 确保输入光源是有效的
if ( (%propagation axis%=="x") or (%propagation axis%=="y") or (%propagation axis%=="z") ) {
# everything is ok
do_nothing=0;
} else {
message("Propagation axis incorrectly set. Using x direction.");
%propagation axis% = "x";
}
if ( (%propagation direction%==1) or (%propagation direction%==-1) ) {
# everything is ok
do_nothing=0;
} else {
message("Propagation direction incorrectly set. Using positive direction.");
%propagation direction% = 1;
}
? ?? 添加S参数的各个组件:光源、点监视器、平面监视器,并根据属性设置结果进行赋值(参数化模型)。
# 添加光源
addplane;
set("wavelength start",%start wavelength%);
set("wavelength stop",%stop wavelength%);
set("injection axis",%propagation axis%);
set("polarization angle",%polarization angle%);
set("angle theta",%angle theta%);
set("angle phi",%angle phi%);
set("x",0);
set("y",0);
set("z",0);
# 设置光源类型
if(source_type==1){
set("plane wave type", "Bloch/periodic");
}
else{
if(source_type==2){
set("plane wave type", "BFAST");
}
}
# 设置光源传播方向和传播轴
if(%propagation direction% == 1){
set("direction","Forward");
} else{
set("direction","Backward");
}
if (%propagation axis% == "x"){
set("x",%propagation direction%*(%source offset%-0.5*%x span%));
set("y span",%y span%);
set("z span",%z span%);
}
if (%propagation axis% == "y"){
set("y",%propagation direction%*(%source offset%-0.5*%y span%));
set("x span",%x span%);
set("z span",%z span%);
}
if (%propagation axis% == "z"){
set("z",%propagation direction%*(%source offset%-0.5*%z span%));
set("x span",%x span%);
set("y span",%y span%);
}
# 添加点监视器
addindex;
set("name","R_index");
set("monitor type","3D");
set("spatial interpolation","nearest mesh cell");
set("x",0); set("y",0); set("z",0);
set("x span",0); set("y span",0); set("z span",0);
addindex;
set("name","T_index");
set("monitor type","3D");
set("spatial interpolation","nearest mesh cell");
set("x",0); set("y",0); set("z",0);
set("x span",0); set("y span",0); set("z span",0);
# 添加平面监视器
addpower;
set("name","T");
addpower;
set("name","R");
# 根据光源传播方向设置平面监视器
if (%propagation axis% == "x") {
setnamed("T","monitor type","2D X-normal");
setnamed("T","y",0);
setnamed("T","z",0);
setnamed("T","y span",%y span%);
setnamed("T","z span",%z span%);
setnamed("R","monitor type","2D X-normal");
setnamed("R","y",0);
setnamed("R","z",0);
setnamed("R","y span",%y span%);
setnamed("R","z span",%z span%);
if (%propagation direction% == 1) {
setnamed("T_index","x", %x span%/2);
setnamed("R_index","x",-%x span%/2);
setnamed("T","x", %x span%/2);
setnamed("R","x",-%x span%/2 + 2*%source offset%);
} else {
setnamed("T_index","x",-%x span%/2);
setnamed("R_index","x", %x span%/2);
setnamed("T","x",-%x span%/2);
setnamed("R","x", %x span%/2 - 2*%source offset%);
}
}
if (%propagation axis% == "y") {
setnamed("T","monitor type","2D Y-normal");
setnamed("T","x",0);
setnamed("T","z",0);
setnamed("T","x span",%x span%);
setnamed("T","z span",%z span%);
setnamed("R","monitor type","2D Y-normal");
setnamed("R","x",0);
setnamed("R","z",0);
setnamed("R","x span",%x span%);
setnamed("R","z span",%z span%);
if (%propagation direction% == 1) {
setnamed("T_index","y", %y span%/2);
setnamed("R_index","y",-%y span%/2);
setnamed("T","y", %y span%/2);
setnamed("R","y",-%y span%/2 + 2*%source offset%);
} else {
setnamed("T_index","y",-%y span%/2);
setnamed("R_index","y", %y span%/2);
setnamed("T","y",-%y span%/2);
setnamed("R","y", %y span%/2 - 2*%source offset%);
}
}
if (%propagation axis% == "z") {
setnamed("T","monitor type","2D Z-normal");
setnamed("T","y",0);
setnamed("T","x",0);
setnamed("T","y span",%y span%);
setnamed("T","x span",%x span%);
setnamed("R","monitor type","2D Z-normal");
setnamed("R","y",0);
setnamed("R","x",0);
setnamed("R","y span",%y span%);
setnamed("R","x span",%x span%);
if (%propagation direction% == 1) {
setnamed("T_index","z", %z span%/2);
setnamed("R_index","z",-%z span%/2);
setnamed("T","z", %z span%/2);
setnamed("R","z",-%z span%/2 + 2*%source offset%);
} else {
setnamed("T_index","z",-%z span%/2);
setnamed("R_index","z", %z span%/2);
setnamed("T","z",-%z span%/2);
setnamed("R","z", %z span%/2 - 2*%source offset%);
}
}
|