本文重点参考自Lumerical官方的此篇文章,以翻译内容为主体并附加相关的FDTD Script介绍,主要目标是学习了解S参数的使用方式及其提取相位等参数的基本原理
Lumerical Support — Metamaterial S parameter extraction
注:下文中的输入/输出信号对应于入射光和反射/透射光,个人使用S参数来提取光的相位信息。
S参数也被称为散射参数,常用于描述 2×2 网络(network)或传输线(transmission lines)的传输行为。对于如上图所示两给定的输入信号a1和a2, 输出信号b1和b2,可采用下面公式进行计算:
S参数是采用的是复振幅(包括振幅和相位)的形式来表示反射和透射系数。从上式中我们可以看出输出信号b1分别由输入信号a1、a2与系数S11、S12相乘求和得到,输出信号b2则同理。其中,a1入射光对应的是反射系数S11和透射系数S21,a2入射光对应的是反射系数S22和透射系数S12。
已知入射信号a和b的系数与电场成正比,设Ei,Er,Et分别表示入射、反射和透射电场,则S参数可表示为S11=b1/a1=Er/Ei而S21=b2/a1=Et/Ei。在使用S参数时需要保证模型满足以下两条件(需保证在以下前提的情况下使用,在实在不知道如何使用的情况下,可以参考Lumerical官方分析组库中各监视器及超材料的摆放位置):
当场从光源传播到超材料再到监视器时会积累额外的相位差(见下图)。而仅需要超材料的S参数(即超材料引入的变化,如突变相位),要抵消这个额外传播过程的影响我们必须补偿该相位差。假设入射和透射空间中的波数分别为ki和kt,则监视器T中来自光源S的额外相位差为 ki * rs+kt * rt,其中rs和rt是距离。同理反射监视器 R对应的额外相位差是ki * rs+ki * rr。
在Lumerical软件提供的分析组对象库中已经提供了现成的S参数分析组,上文中提到的额外相位差的补偿便在分析组的脚本中完成。注意我们假定平面波在平面超结构表面上传播之后,得到的反射波和透射波是依旧以平面波形式传播,可以使用点频域监视器(即分析组中的折射率监视器)来记录电场分量,另外两个平面频域监视器用于测量传输功率(以及光栅投影近场数据)来计算超材料的S参数和传输效率。
对于平面结构定义的S参数中相关偏振参数的约定见下图。如果超材料上下方的介质具有不同的折射率, ∣ S 12 ∣ 2 |S12|^2 ∣S12∣2和 ∣ S 21 ∣ 2 |S21|^2 ∣S21∣2都大于1。Lumerical软件提供的S分析组还可以处理斜入射以及输入和输出s和p偏振光的情况。
下面针对S-parameter分析组中具体参数的设置进行介绍。首先是分析组的属性设置(Setup),在分析组对象内部的脚本中有详细描述,下面详细介绍其中属性设置参数:
完成基本属性设置参数后,需要再设置以下4个分析属性(Analysis):
最后,Lumerical软件提供的S参数分析组会生成四个 S 参数分析结果。其中,“S”是主输入偏振和相同输出偏振的S参数(例如,如果光源是s偏振,它只计算s偏振透射和反射光的结果)。而 “S_polarization”是主输入偏振和两个方向输出偏振的S参数,在光线极化方向被超材料旋转时使用。而“T”和“R”分别是透射功率和反射功率。
下面提供一个设置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%);
}
}