#这段代码是用于计算渐变折射率光纤(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 点 / 边的网格计算结果。

#总结:该脚本通过改变网格精度,分析渐变折射率光纤中不同模式的数值计算误差,并研究色散特性随波长的变化,最终通过绘图直观展示结果并验证计算精度是否满足要求。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐