mie scattering(DGTD)-代码研究(2)

###########################################################################

# 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 理论解析解在散射 / 吸收效率和远场散射模式上的一致性,验证仿真结果的准确性。通过归一化效率因子和远场分布的可视化,直观展示了仿真与理论的吻合程度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值