当前位置: 首页 > news >正文

梯度波导_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 点 / 边的网格计算结果。

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

http://www.dtcms.com/a/363726.html

相关文章:

  • ubuntu之坑(十九)——VMware虚拟机扩容磁盘
  • git工具笔记
  • 若想将gpu的代码在昇腾npu上运行,创建docker应该创建怎么样的docker?(待完善)
  • C/C++哆啦A梦
  • Java 技术支撑 AI 系统落地:从模型部署到安全合规的企业级解决方案(二)
  • 【面试场景题】外卖平台如何扛住高峰期上千qps订单查询流量
  • Python错误调试测试——调试
  • GNU Make | C/C++项目自动构建入门
  • 【日常学习8】2025-9-3 学习控件Day2
  • 解决HyperMesh许可证与版本不匹配问题
  • 【107】基于51单片机智能炒菜机【Proteus仿真+Keil程序+报告+原理图】
  • Vue + fetchEventSource 使用 AbortController 遇到的“只能中止一次”问题解析与解决方案
  • LeetCode 844.比较含退格的字符串
  • Spring 事务原理解析:AOP 的一次完美落地
  • 高校党建信息管理系统的设计与实现-(源码+LW+可部署)
  • wpf模板之DataTemplate
  • HTML第五课:求职登记表
  • apache-jmeter-5.1.1安装部署与使用教程(小白一看就会)​
  • Docker启动两个Redis镜像并配置一主一从
  • Spring Boot数据脱敏方案
  • sed相关知识
  • C++基础组件
  • 【值得收藏】手把手教你用PyTorch构建Transformer英汉翻译系统,从训练到推理
  • 小程序蓝牙低功耗(BLE)外围设备开发指南
  • C++革命性新特性:默认实例导出(exportDefault)让单例模式变得无比简单!
  • Vue2 入门(一)介绍及Demo项目创建
  • GISBox内置免费GIS服务器:地形服务发布与应用全指南
  • ChartView的基本使用
  • Redis 的压缩列表:像快递驿站 “紧凑货架“ 一样的内存优化结构
  • Redis-底层数据结构篇