【FDTD Lumerical超材料S参数提取】

    本文重点参考自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官方分析组库中各监视器及超材料的摆放位置):

  1. 要测量近场的S参数,若测量区域如监视器位置存在瞬逝场的影响(见物理光学)可能会导致测量出错,因此要确保监视器离结构足够远;
  2. 模拟光源和监视器要与超材料表面保持一定距离,监视器必须与超材料保持足够远来避免瞬逝场的影响)。

      当场从光源传播到超材料再到监视器时会积累额外的相位差(见下图)。而仅需要超材料的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 S122 ∣ S 21 ∣ 2 |S21|^2 S212都大于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.未找到某些频率点的所需顺序。当不支持目标光栅顺序时会发生这种情况。)。
分析组的分析属性参数

     最后,Lumerical软件提供的S参数分析组会生成四个 S 参数分析结果。其中,“S”是主输入偏振和相同输出偏振的S参数(例如,如果光源是s偏振,它只计算s偏振透射和反射光的结果)。而 “S_polarization”是主输入偏振和两个方向输出偏振的S参数,在光线极化方向被超材料旋转时使用。而“T”和“R”分别是透射功率和反射功率

四、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%);
  }
}

猜你喜欢

转载自blog.csdn.net/weixin_44636369/article/details/123280909
今日推荐