Photonics – Chinese

Photonics – Chinese

Topics related to Lumerical and more, in Chinese language

Ansys Insight: 光在传播过程中,相位差计算问题

    • Guilin Sun
      Ansys Employee

      工程师好!我想请教一下:

      光随着空间位置传播,相位差如何计算。众所周知,光在传播过程中,相位会随着空间和时间变化而改变,我现在想定量计算一下随着空间位置改变,相位是如何改变的。空仿真情况下添加一个单色平面波(波长1.55μm),Z轴正传播,X偏振,从空间位置0开始向上传播,我添加了三个XY面场监视器(Z=0,Z=1.55μm,Z=3.1μm)和一个XZ面场监视器(Y=0),然后通过Angle(Ex,Ex为电场绝对值最大分量)分析波前相位和传播相位的改变。现有如下6个问题需要请老师指导一下:1.从场监视器Angle(Ex)提取出来相位的数值,是考虑了时间和空间变化后得到的吗?

      2.随着空间位置改变,相位的计算公式应该用kr-wt+phi0还是k*r+phi0呢?

      3.XY场监视器(Z=0)中的Angle(Ex)初始相位为什么不是0,是否能通过设置光源某些参数调为0?

      4.XY场监视器(Z=0)的波前相位Angle(Ex)的值设为phiA,XY场监视器(Z=1.55μm)的波前相位Angle(Ex)值设为phiB,沿传播方向传播一个波长,相位差值理论上是2pie,但从模拟结果来看,phiB-phiA的相位差值为什么不是2pie?

      5.XZ场监视器中的相位分布范围为(-pie,pie),但沿着Z的slice相位变化为一直增大,如何把slice相位变化范围规定在(-pie,pie)?如果是用脚本的话,脚本应该怎么写?

      6.光在真空中传播和在InGaAsP波导中传播,相位的变化规律是否一致?如果不一致,区别在哪里?

      以上几个问题麻烦老师帮忙解决一下,十分感谢!

      A1:频域监视器只考虑与时间无关的结果,因此没有时间的影响。时间产生的位相就是Wt,如果必要你可以看稳态场随时间的进化,实际上并没有特殊的物理在里面 https://support.lumerical.com/hc/en-us/articles/360034915793 30

      A2:是k*r+phi0,因为频域里面没有时间。

      A3:光源灰色区域是非物理的结果,频域监视器不可以在那里监测此体积内的任何场。因此我们一直建议频域监视器不要穿过光源区,也不要接触到光源区。

      A4:FDTD是离散算法,离散网格与连续世界的一个重要区别就是,离散网格内光的传播有数值色散Numerical Dispersion,也就是离散传播速度小于物理速度,所以位相有差别。

      A5:你可以使用Unwrap

      exz=getresult(“Exz”,“E”);

      x=exz.x;

      z=exz.z;

      Ex=pinch(exz.Ex);

      phix=unwrap(angle(Ex));

      plot(z*1e6,phix(find(x,0),:),“z um”, “phase”);

    • Guilin Sun
      Ansys Employee

       

      image

      A6:光在传播过程中产生位相,也就是k*r+phi0,r是从光源位置开始的。你说的两中材料,折射率不同,k就不等,所以位相变化就不同,而k与材料内波长的倒数有关。

      更多的物理原理请参考物理光学,以及FDTD专著。


      非常感谢老师针对以上问题的解答!但是还是有两个问题不太明白:
      1.既然相位数值是按照Phi=K*r+Phi0来计算,那为什么从xz面频域监视器里面看Angle(Ex)的话,相位数值会出现负值呢?这个负值相位又是如何计算得到的?有计算公式吗?
      phase1
      2.还是上面的第4个问题,XZ场监视器中的相位分布范围为(-pie,pie),但沿着Z的slice相位变化为一直增大,如何把slice相位变化范围规定在(-pie,pie)?如果是用脚本的话,脚本应该怎么写?
      这个问题您可能看错了,我是想得到相位在pie处跳变的结果(而unwrap函数是连续变化的,也就是不在pie处跳变),我自己写的脚本总是报错,所以还麻烦老师针对我这个仿真测试文件写一个脚本,帮我得到相位在pie处跳变的结果,谢谢了! Phase_test_Air.fsp (1.8 MB)


       

      通常我们研究,两个介质界面的反射的时候,一般都研究界面的反射率或者透射率,而往往会忽视界面引入的额外相位差;因为在计算透反射率的时候考虑的是能量的比值,这是由透反射系数(复数 complex number 包含幅值和相角)的平方得到的(计算透射时还要考虑两种材料的折射率)。复数平方之后,相角就丢失了,因此透反射率是不包含相位信息的。 但是有时相位信息又很重要,尤其是最近大火的“超透镜”,本质上就是利用微纳结构在波长尺度内引入一个人为可控的额外相位差,从而调控远场的波前,那我们该如何使用FDTD分析界面引入的额外相位差呢? 尤其是在反射的情况下,如 @u201613896 提问的那样。 FDTD采用的相位定义方式和波矢方向,可以参考上面两个帖子。 重点强调的是,在source设置中设置的“Phase”是平面波的初相位 φ0 . 同时,记住,空间相位的零点在光源面上。 我们以一个简单的模型为例,光源的位置为 H_source,界面位置为 H_Sub, 反射监视器位置为 H_R。 光源处相位为 φ0,光源到界…


      这个页面可供参考

       


       
      gsun:

      A3:光源灰色区域是非物理的结果,频域监视器不可以在那里监测此体积内的任何场。因为,我们一直建议频域监视器不要穿过光源区,也不要接触到光源区。

      孙老师!针对上面的第3个问题,我有点疑惑。既然监视器不能接触或穿过光源区,那么如何计算光源的初始相位?空间位置为0时,光源面相位理论上应该是0吧?(k r,因为r=0,所以k r=0)我想应该是通过脚本,那么通过什么指令可以得到呢?麻烦孙老师帮忙解答一下!


       
      S201861311:

      非常感谢老师针对以上问题的解答!但是还是有两个问题不太明白:
      1.既然相位数值是按照Phi=K*r+Phi0来计算,那为什么从xz面频域监视器里面看Angle(Ex)的话,相位数值会出现负值呢?这个负值相位又是如何计算得到的?有计算公式吗?
      phase1
      2.还是上面的第4个问题,XZ场监视器中的相位分布范围为(-pie,pie),但沿着Z的slice相位变化为一直增大,如何把slice相位变化范围规定在(-pie,pie)?如果是用脚本的话,脚本应该怎么写?
      这个问题您可能看错了,我是想得到相位在pie处跳变的结果(而unwrap函数是连续变化的,也就是不在pie处跳变),我自己写的脚本总是报错,所以还麻烦老师针对我这个仿真测试文件写一个脚本,帮我得到相位在pie处跳变的结果,谢谢了! Phase_test_Air.fsp (1.8 MB)

      还有这两个问题,感觉另一个人的回答有点答非所问了,再麻烦孙老师帮忙解答一下!


      重点强调的是,在source设置中设置的“Phase”是平面波的初相位 φ0 . 同时,记住,空间相位的零点在光源面上。

      你要是仔细看了我给出的链接,就不会觉得答非所问了,那个帖子里面包含了很多平面波相位计算的重要信息。
      我在那个帖子里面 研究的是反射前后的相位差,你只考虑一个方向的,那不就是你要研究的传播的相位差吗?


       
      S201861311:

      空间位置为0时,光源面相位理论上应该是0吧?(k r,因为r=0,所以k r=0)我想应该是通过脚本,那么通过什么指令可以得到呢?

      如果光源的初始位相是零,原则上说是这样。但是由于光源灰色区的结果是非物理的结果,所以不建议你一定要得到光源准确位置的位相。光源初始位相可以从光源里面用脚本得到。


      Junyu 说的对,你需要先看看相关连接,了解一下相关问题。我在这里代表Lumerical谢谢Junyu的慷慨帮着。

      A1: 因为计算位相的算法是正负Pi,所以就有负值。前面已经说了,用phix=unwrap(angle(Ex));可以得到线性变化的位相。

      A2: 你使用
      phix=unwrap(angle(Ex));

      phi0=angle(Ex);

      plot(z*1e6,phix(find(x,0),:),‘z um’, ‘linear phase’);

      plot(z*1e6,phi0(find(x,0),:),‘z um’, ‘±pi phase’);

       

       

      你如果想看看跳跃的地方,可以ZoomIn
      image
      用这个可以看前50个点的结果
      ?phi0(find(x,0),1:50);
      result:
      0.398281 0.554182 0.738981 0.923784 1.10858 1.29338 1.47816 1.66293 1.84769 2.03243 2.21716 2.40188 2.58661 2.77134 2.95608 3.14083 -2.95759 -2.77281 -2.58802 -2.40322 -2.21841 -2.03361 -1.84882 -1.66403 -1.47927 -1.29451 -1.10977 -0.925039 -0.740314 -0.55559 -0.37086 -0.186122 -0.00137023 0.183396 0.368176 0.552969 0.737769 0.922573 1.10738 1.29217 1.47695 1.66172 1.84648 2.03122 2.21595 2.40067 2.5854 2.77013 2.95487 3.13962
      ?transpose(phi0(find(x,0),1:50));
      result:
      0.398281
      0.554182
      0.738981
      0.923784
      1.10858
      1.29338
      1.47816
      1.66293
      1.84769
      2.03243
      2.21716
      2.40188
      2.58661
      2.77134
      2.95608
      3.14083
      -2.95759
      -2.77281
      -2.58802
      -2.40322
      -2.21841
      -2.03361
      -1.84882
      -1.66403
      -1.47927
      -1.29451
      -1.10977
      -0.925039
      -0.740314
      -0.55559
      -0.37086
      -0.186122
      -0.00137023
      0.183396
      0.368176
      0.552969
      0.737769
      0.922573
      1.10738
      1.29217
      1.47695
      1.66172
      1.84648
      2.03122
      2.21595
      2.40067
      2.5854
      2.77013
      2.95487
      3.13962

      是不是能正好找到正负pi的位置,要看所用网格师傅足够细.一般没有必要.

Viewing 1 reply thread
  • You must be logged in to reply to this topic.