###########################################################################
# Scriptfile: mie_scattering_dgtd_analysis.lsf
#
# Description:
# This file visualizes the following results:
# 1) The absorption/scattering cross section
# 2) The scattered farfields from simulation and mie theory
#
# Copyright 2018, Lumerical Solutions, Inc.
###########################################################################
这是脚本的注释部分,用于说明文件名称(mie_scattering_dgtd_analysis.lsf)、功能(可视化吸收 / 散射截面和远场散射结果)以及版权信息(2018 年,Lumerical Solutions 公司)。
2. 远场散射分析部分
定义远场观测点
R_far = 1; # radius of farfield sphere
farPts = createsphericalsurface([0,pi],[0,2*pi],[0,0,1],R_far,0.1);
设定远场观测球面的半径 R_far = 1;
createsphericalsurface 函数生成一个球面网格作为远场观测点:
参数分别为极角范围 [0,pi]、方位角范围 [0,2*pi]、球心坐标 [0,0,1]、半径 R_far、网格精度 0.1(角度步长)。
farPtsX = farPts.x;
farPtsY = farPts.y;
farPtsZ = farPts.z;
theta = acos(farPtsZ/R_far); # spherical coordinate
phi = atan2(farPtsY,farPtsX);
提取远场点的笛卡尔坐标(farPtsX, farPtsY, farPtsZ);
转换为球坐标:极角 theta(与 z 轴夹角)和方位角 phi(与 x 轴夹角)。
计算 DGTD 仿真的远场
E_near = getresult("DGTD::cross_section","fields");
从 DGTD::cross_section 中获取近场电磁场数据 E_near(用于后续近场到远场的投影)。
E_far = near2far(E_near,farPts);
near2far 函数通过近场数据 E_near 和远场观测点 farPts,计算远场电磁场 E_far(仿真得到的远场散射场)。
构建仿真远场的非结构化数据集
scatFarFieldsNum = unstructureddataset("far field: numerical",farPtsX,farPtsY,farPtsZ,farPts.elements);
scatFarFieldsNum.addparameter("lambda",E_near.lambda,"f",E_near.f);
scatFarFieldsNum.addattribute("E",E_far.E,"vertex");
unstructureddataset 创建一个非结构化数据集 scatFarFieldsNum,用于存储仿真远场数据,名称为 “far field: numerical”,包含远场点的坐标和网格元素;
addparameter 添加参数:波长 lambda 和频率 f;
addattribute 添加属性:远场电场 E(存储在顶点上)。
计算 Mie 理论的解析远场
scatFun = mie3ds12(cos(theta),m,size_parameter);
mie3ds12 函数计算 Mie 散射的振幅函数 S1 和 S2(存储在 scatFun 中),参数为 cos(theta)(极角余弦)、相对折射率 m、尺寸参数 size_parameter。
k = 2.0*pi/E_near.lambda*n1;
kR = k*R_far;
计算波数 k(2πn1/λ)和 kR(波数与远场半径的乘积,用于远场相位修正)。
Etheta = mult(cos(phi),transpose(exp(-1i*kR)/(1i*kR)))*scatFun.S2;
Ephi = mult(sin(phi),transpose(exp(-1i*kR)/(-1i*kR)))*scatFun.S1;
计算球坐标下的远场电场分量:
极角方向分量 Etheta:与 cos(phi)、相位因子 exp(-1i*kR)/(1i*kR) 和振幅函数 S2 相关;
方位角方向分量 Ephi:与 sin(phi)、相位因子 exp(-1i*kR)/(-1i*kR) 和振幅函数 S1 相关。
转换为笛卡尔坐标下的电场
Ex = Ey = Ez = matrix(length(phi),length(E_near.f));
for(iii = [1:length(E_near.f)]){
Ex(:,iii) = cos(theta)*cos(phi)*Etheta(:,iii)-sin(phi)*Ephi(:,iii);
Ey(:,iii) = cos(theta)*sin(phi)*Etheta(:,iii)+cos(phi)*Ephi(:,iii);
Ez(:,iii) = -sin(theta)*Etheta(:,iii);
}
初始化笛卡尔坐标下的电场分量 Ex, Ey, Ez(维度为观测点数量 × 频率数量);
通过球坐标到笛卡尔坐标的转换公式,循环计算每个频率下的 Ex, Ey, Ez。
构建理论远场的非结构化数据集
scatFarFieldsAna = unstructureddataset("far field: analytic",farPtsX,farPtsY,farPtsZ,farPts.elements);
scatFarFieldsAna.addparameter("lambda",E_near.lambda,"f",E_near.f);
scatFarFieldsAna.addattribute("E",Ex,Ey,Ez,"vertex");
类似仿真远场,创建理论远场的非结构化数据集 scatFarFieldsAna,名称为 “far field: analytic”,添加波长、频率参数和笛卡尔坐标下的电场属性。
清理变量并可视化
clear(k,kR,phi,theta,Etheta,Ephi,Ex,Ey,Ez,scatFun,m);
clear 函数清除临时变量,释放内存。
visualize(scatFarFieldsAna);
visualize(scatFarFieldsNum);
visualize 函数分别可视化理论远场(scatFarFieldsAna)和仿真远场(scatFarFieldsNum)的数据集,用于对比两者的分布差异。
总结
该脚本的核心功能是对比 DGTD 数值仿真与 Mie 理论解析解在散射 / 吸收效率和远场散射模式上的一致性,验证仿真结果的准确性。通过归一化效率因子和远场分布的可视化,直观展示了仿真与理论的吻合程度。
3012

被折叠的 条评论
为什么被折叠?



