梯度波导_FDTD_学习_代码
#这段代码是用于计算渐变折射率光纤(graded index fiber)中不同模式的误差与网格精度的关系,以及色散误差与波长的关系。以下是逐句分析:
use_matlab=0;
##设置是否使用 Matlab 进行计算和绘图,0 表示仅使用 MODE 计算,不调用 Matlab。
conformal_mesh_on=1;
#设置网格类型,1 表示使用 "conformal variant 1"(共形网格,精度更高),0 表示使用 "staircase"(阶梯网格)。
load("graded_index_fiber.lms");
#加载 Lumerical MODE 软件的项目文件(.lms),包含光纤结构定义。
cleardcard;
##清除数据卡片(data card),用于重置之前的计算数据。
loaddata("graded_index_fiber.ldf");
#加载数据文件(.ldf),可能包含预设的材料参数或结构数据。
lam = 1.0e-6;
#设置参考波长为 1 微米(1e-6 米)。
n0 = sqrt(4);
设定基准折射率 n0=2(因为 sqrt (4)=2)。
k0 = 2*pi*n0/lam;
##计算自由空间波数 k0(与波长和折射率相关)。
H = 40e-6;
#设置光纤相关的特征长度 H 为 40 微米。
#以下几行计算不同模式(m,n)的理论有效折射率:
m = 0; n = 0;
alpha = 2+2*(m+n);
beta = k0*sqrt(1-alpha/k0/H);
None = n0*sqrt(1-alpha/k0/H); #TE00模式的理论值
m = 0; n = 1;
alpha = 2+2*(m+n);
Ntwo = n0*sqrt(1-alpha/k0/H); #TE01模式的理论值
m = 1; n = 1;
alpha = 2+2*(m+n);
Nthree = n0*sqrt(1-alpha/k0/H); # TE11模式的理论值
mesh_cell = matrix(1,10);
#创建一个 1×10 的矩阵,用于存储不同的网格精度(每边的网格数)。
#以下循环生成 10 个网格精度值(从 20 开始,每次乘以√2):
mc=20;
for(i=1:length(mesh_cell)){
mesh_cell(i)=round(mc);
mc=mc*sqrt(2);
}
N1=matrix(1,length(mesh_cell)); 等三行
#创建存储数值计算得到的有效折射率的矩阵(N1 对应 TE00,N2 对应 TE01,N3 对应 TE11)。
#主循环:遍历不同网格精度,计算各模式的有效折射率:
for(ii = 1:length(mesh_cell)){
switchtolayout; % 切换到布局模式
# 设置网格类型(共形或阶梯)
if(conformal_mesh_on){
setnamed("MODE","mesh refinement","conformal variant 1");
} else {
setnamed("MODE","mesh refinement","staircase");
}
#设置x和y方向的网格数
setnamed("MODE","mesh cells x",mesh_cell(ii));
setnamed("MODE","mesh cells y",mesh_cell(ii));
findmodes; % 运行模式求解
# 获取各模式的有效折射率(与理论模式最佳匹配的结果)
N1(ii) = getdata(bestoverlap("TE00"),"neff");
N2(ii) = getdata(bestoverlap("TE01"),"neff");
N3(ii) = getdata(bestoverlap("TE11"),"neff");
#当网格数为 80 时,额外进行色散计算:
matlab
if(mesh_cell(ii)==80){
selectmode(3); # 选择TE01模式
setanalysis("detailed dispersion calculation", 0); #禁用详细色散计算
frequencysweep; #运行频率扫描(计算不同波长下的特性)
# 获取色散计算结果
neff = getdata("frequencysweep", "neff");
D2=getdata("frequencysweep","D"); #% 色散值
f_neff=getdata("frequencysweep", "f"); #% 频率
f_D=getdata("frequencysweep","f_D"); #% 色散对应的频率
w_D=2*pi*f_D; #% 角频率
##% 计算TE01模式的理论色散值D2th
m = 0; n = 1;
alpha = 2+2*(m+n);
D2th=alpha^2/(8*pi*H^2*n0)*(w_D^2)*((w_D^2-alpha*c*w_D/H/n0)^(-3/2));
}
}
#计算相对误差(百分比):
p1 = 100*abs((N1-None)/None); #% TE00模式的误差
p2 = 100*abs((N2-Ntwo)/Ntwo); #% TE01模式的误差
p3 = 100*abs((N3-Nthree)/Nthree); #% TE11模式的误差
D2err=abs(D2th-D2)*100/D2th; # % 色散误差
lam2=c/f_D*1e6; #% 将频率转换为波长(微米)
#误差容限检查:
if(p2(7)>2e-4) #% 检查TE01模式在160×160网格下的误差
?"ERROR: TE01 mode exceeded error tolerance...";
if(p3(7)>1e-3) #检查TE11模式的误差
?"ERROR: TE11 mode exceeded error tolerance...";
if(max(D2err)>1) #检查色散误差
?"ERROR: TE01 dispersion exceeded error tolerance...";
#根据 use_matlab 的值选择绘图方式:
#若 use_matlab=1:调用 Matlab 绘制三张图(网格精度与误差、色散随波长变化、色散误差随波长变化)。
#若 use_matlab=0:使用 Lumerical 自带的绘图功能生成相同的图,并导出为文件。
#最后一行:
plot((c/f_neff)/1e-6, real(neff), "wavelength (microns)","effective index","neff for TE01 from numerical calculation");
###绘制 TE01 模式的有效折射率随波长的变化曲线(横轴为波长,纵轴为有效折射率的实部)。
legend("n80 points perside");
#为最后一幅图添加图例,说明该曲线是基于 80 点 / 边的网格计算结果。
#总结:该脚本通过改变网格精度,分析渐变折射率光纤中不同模式的数值计算误差,并研究色散特性随波长的变化,最终通过绘图直观展示结果并验证计算精度是否满足要求。