Lumerical官方案例、FDTD时域有限差分法仿真学习(十一)——米氏散射 (Mie scattering 2D)

官网链接

我们模拟二维介电圆柱体的 Mie 散射。 将 FDTD 模拟的角散射结果与解析解进行比较。

在这里插入图片描述

一、结构设置

1.1 光源

全场散射场(total-field scattered-field,TFSF)源注入有限跨度的平面波,并将计算区域划分为两个区域。在源区内部同时存在入射场和散射场,而在源区外部只存在散射场。全场散射场源的工作原理是在其边界处,减去直接透射通过源区域或从平坦基板反射的任何光。因此,只有被完全包含在源区域内部的特征散射的光,才能穿过边界并传播到散射场区域。

1.2 分析组

总场监视器
在这里插入图片描述
Scirpt:

####################################################
# Total field
# This object can be used to calculate nano-particle
# cross sections. 
# # 这个对象可以用来计算纳米粒子的横截面。

# Output properties
# sigma: cross section 横截面
# lam: vector of wavelengths 波长向量
# f: vector of frequencies 频率向量
#
# Tags: FDTD total field monitor
#
# Copyright 2012 Lumerical Solutions Inc
################################################################

f=getdata("y2","f");   # get frequency data
lam=c/f*1e9;              # convert to wavelength in nm.

# Calculate power flowing outwards in each direction in 
# scattered field region. 
# Note minus sign for bottom and left monitors.
# 计算散射场区域每个方向向外流动的功率。
# 注意底部和左侧显示器的减号。
Ptop    =  transmission("y2");
if(havedata("y1")) { Pbottom = -transmission("y1"); }
else { Pbottom = Ptop; }
Pright  =  transmission("x2");
if(havedata("x1")) { Pleft   = -transmission("x1"); }
else { Pleft = Pright; }

# Calculate total power flowing outwards.
# power scattered (in Watts)
# 计算向外流动的总功率。
# 功率分散(以瓦特为单位)
Pscat = (Ptop + Pbottom + Pleft + Pright)*sourcepower(f);

# Calculate scattering cross-section
# 计算散射截面,也即面积
sigma=Pscat/sourceintensity(f);

havedata
在这里插入图片描述
sourcepower

在这里插入图片描述
在这里插入图片描述
sourceintensity

在这里插入图片描述
散射场监视器
在这里插入图片描述
Scirpt:

####################################################
# Scattered field
# This script calculates scattering cross-section
# and far field projection.
# # 这个脚本计算散射截面和远场投影。
# Input properties
# do far field: 0 for no, 1 for yes
#
# Output properties
# theta: vector of angles for far field projection 远场投影的角度向量
# E2_far: vector of far field intensities at angles theta 1 mm from cylinder
# 距离圆柱 1 毫米角度的远场强度矢量
# sigma: scattering cross section 距离圆柱 1 毫米角度的远场强度矢量
# lam: vector of wavelengths 波长向量
# f: vector of frequencies 频率向量
#  
#
# Tags: FDTD scattered field monitor
#
# Copyright 2012 Lumerical Solutions Inc
################################################################

f=getdata("y2","f");   # get frequency data
lam=c/f*1e9;              # convert to wavelength in nm.

# Calculate power flowing outwards in each direction in 
# scattered field region. 
# Note minus sign for bottom and left monitors.
Ptop    =  transmission("y2");
if(havedata("y1")) { Pbottom = -transmission("y1"); }
else { Pbottom = Ptop; }
Pright  =  transmission("x2");
if(havedata("x1")) { Pleft   = -transmission("x1"); }
else { Pleft = Pright; }

# Calculate total power flowing outwards.
# power scattered (in Watts)
Pscat = (Ptop + Pbottom + Pleft + Pright)*sourcepower(f);

# Calculate scattering cross-section
sigma=Pscat/sourceintensity(f);

###########################################################
# far field calculation
if(%do far field%)
{

  #define a vector of angles for far field calculation # 定义远场计算的角度向量
  theta=linspace(0,180,200);

  #calculate the X and Y vertices at a radius of 1mm from the cylinder
  #these are the locations where the far field calculation is done
  #计算距离圆柱1mm半径的X和Y顶点
   #这些是远场计算完成的位置
  r0=1e-3;
  x=r0*cos(theta*pi/180);
  y=r0*sin(theta*pi/180);

  #read the monitor frequencies #读取监视器频率
  far_fj=matrix(2); # find indices of wavelengths for far field proj. # 找到远场项目的波长指数,1um和2um。
  far_fj(1)=find(c/f,1e-6);  
  far_fj(2)=find(c/f,2e-6); 
  #allocate a matrix for the result 为结果分配一个矩阵
  E2_far = matrix(2,length(theta));

  # loop over all angles and far field positions
  # 循环所有角度和远场位置
  for(j=1:2){ # the frequency points

      tempE = farfieldexact("x2",x,y,far_fj(j))-farfieldexact("x1",x,y,far_fj(j))
             +farfieldexact("y2",x,y,far_fj(j))-farfieldexact("y1",x,y,far_fj(j));
	# tempE大小为200×3,即L×3
      # sum over all field components E2 = |Ex|^2 + |Ey|^2 + |Ez|^2
      # 对所有场分量求和 E2 = |Ex|^2 + |Ey|^2 + |Ez|^2
      E2_far(j,1:length(theta)) = sum(abs(tempE)^2,2); #第二个维度求和,即各场分量
 }
}

farfieldexact

在这里插入图片描述
在这里插入图片描述
数据mie_cylinder
在这里插入图片描述
数据以 3(行)X 1000 列的行/列格式组织
第一行是以度为单位的散射角
第二行是 lambda = 1 微米的散射幅度
第三行是 lambda = 2 微米的散射幅度

(注:列数太多了,所以没有完整显示为一行)

mie_theory_2d.lsf

###########################################################################
# Scriptfile: mie_theory_2d.lsf
#
# Description:
# This script analyses the results of mie_theory_2d.fsp
#
# Copyright 2009, Lumerical Solutions, Inc.
###########################################################################

do_far_field = 1;         # set 0 to not perform this test, 1 to perform the test
# 设置 0 不执行此测试,设置 1 执行测试
do_cross_sections = 0;    # set 0 to not perform this test, 1 to perform the test

select("scat");
set("do far field",do_far_field);
runanalysis;

###########################################################################
# Far field projections
if (do_far_field) {

  E2_far = getdata("scat","E2_far");
  theta = getdata("scat","theta");
  
  for(j=1:2){ # the frequency points
      E2_far(j,1:length(theta)) = E2_far(j,1:length(theta))/E2_far(j,1);
  }

  #load analytic result from file, there are 1000 points
  #从文件中加载解析结果,有1000个点
  mie_theory_data = readdata("mie_cylinder.txt");
  theta_analytic = mie_theory_data(1,1:1000);

  # plot data for the 2 wavelengths
  E2_analytic_1=interp(mie_theory_data(2,1:1000),theta_analytic,theta);
  E2_analytic_2=interp(mie_theory_data(3,1:1000),theta_analytic,theta);
  plot(theta,E2_far(1,1:length(theta)),E2_analytic_1,
             E2_far(2,1:length(theta)),E2_analytic_2,
             "angle (degrees)","scattered intensity (log scale)",
             "scattered intensity (log scale)","logplot");#"logplot"表示绘制对数图
  legend("FDTD 1 micron","Analytic 1 micron","FDTD 2 microns","Analytic 2 microns");
  # polar(theta*pi/180,E2_far(1,1:length(theta)),E2_analytic_1, E2_far(2,1:length(theta)),E2_analytic_2);
  # legend("FDTD 1 micron","Analytic 1 micron","FDTD 2 microns","Analytic 2 microns");
}




###########################################################################
# Cross sections
if (do_cross_sections) {
  ?"  Calculating scattering and absorption cross sections";

  # collect data on wavelength range
  f=getdata("scat","f");      # get freqency data
  lambda=c/f;                 # convert to wavelength
  r = getnamed("circle","radius"); # the radius of the mie particle

  # Calculate scattering cross-section
  sigmascat = getdata("scat","sigma");
  Qscat = sigmascat/(2*r);

  # Calculate absorption cross-section
  sigmaabs = -getdata("total","sigma");
  Qabs=sigmaabs/(2*r);

  # calculate the size parameter
  size_parameter = (2*r)/lambda;

  # Plot results
  plot(size_parameter,Qscat, Qabs ,"size parameter (d/lambda)","Mie efficiency","cross section");
  legend("Scattering","Absorption");
}


readdata

在这里插入图片描述
interp
在这里插入图片描述

二、结果

打开并运行名为 mie_theory_2d.fsp 的仿真文件。 模拟在下面创建 mpeg 电影。 全场散射场 (TFSF) 源用于产生入射到介质圆柱体上的平面波。 只有被圆柱体散射的光传播到 TFSF 边界之外。

在这里插入图片描述
mie_theory_2d_movie_TM

运行模拟后,运行名为 mie_theory_2d.lsf 的脚本文件。 脚本文件计算 2 个波长的一系列远场投影,并将结果与存储在文件 cylinder.txt 中的电介质圆柱体散射的分析数据进行比较。 请注意,监视器记录了 25 个波长,但分析组中的脚本选择了 1 和 2 微米的监视器数据。 结果图(对数刻度)如下所示。 分析和模拟结果在所有角度都非常吻合,超过 5 个数量级。

在这里插入图片描述
该脚本还可以计算散射和吸收截面。 吸收将为零,因为圆柱体是由没有吸收的电介质组成的。 要计算横截面,请编辑脚本并将 do_cross_sections 变量设置为 1。

  • 13
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值