我们模拟二维介电圆柱体的 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。