FDTD作为一款功能强大的光学仿真软件,已经广泛应用于纳米光学以及超材料仿真领域。但是就软件本身来说,完全上手还需要一定的时间。并且,鉴于很多微纳光学领域的仿真更适合用脚本完成,所以我写了这个脚本语言系列文章,帮助需要的朋友快速上手FDTD。
首先应说明一点,作为Lumerical的主流产品之一,FDTD采用的其实是一种叫Lumerical脚本语言(Lumerical Script Language)的命令语言。这种语言和matlab很相似,很多matlab中的语法都可以直接在Lumerical脚本语言中实现。Lumerical脚本保存在一个扩展名为.lsf的文件中,脚本编辑器在下图中的右边栏。
下面从一个简单的例子开始,介绍FDTD仿真脚本的几个主要组成部分。首先上一个实例:
switchtolayout;
selectall;delete;
nm=1e-9;#纳米单位
um=1e-6;#微米单位
#添加矩形
addrect;
set("name","SiO2");#名称为SiO2
set("material","SiO2 (Glass) - Palik");#材料为二氧化硅(玻璃)
set("x",0);#设置x中心点坐标
set("y",0);#设置y中心点坐标
set("x span",1*um);#设置x方向宽度
set("y span",1*um);#设置y方向宽度
set("z max",100*nm);#设置z方向最大值
set("z min",-1*um);#设置z方向最小值
#添加FDTD仿真区域
addfdtd;
set("dimension",2);#仿真区域为三维区域
set("x",0);
set("y",0);
set("z min",-10*nm);
set("z max",2*um);
set("x span",0.2*um);
set("y span",0.22*um);
set("x min bc","periodic");#设置x方向周期边界条件
set("y min bc","periodic");#设置y方向周期边界条件
set("Mesh type","uniform");#仿真网格为自定义方式
Mesh_size=10*nm;#网格精度10nm
setnamed("FDTD","dx",Mesh_size);
setnamed("FDTD","dy",Mesh_size);
#添加平面波
addplane;
set("injection axis","z");#入射轴与z轴平行
set("direction","backward");#朝向后方入射
set("x",0);
set("x span",0.4*um);
set("y",0);
set("y span",0.4*um);
set("z",1*um);
set("wavelength start",1.5*um);#波长(最小)
set("wavelength stop",1.5*um);#波长(最大)
#添加点监视器
addprofile;
set("name","R");
set("monitor type",1);#点监视器
set("x",0);
set("y",0);
set("z",1.5*um);
#添加时间监视器
addtime;
set("name","time");
run;#运行仿真
#获取结果并分析
select("SiO2");
surface_z=get("z max");
select("source");
source_z=get("z");
select("R");
monitor_z=get("z");
ex=getdata("R","Ex");
R_z=getdata("R","z");
f=getdata("R","f");
f=pinch(f);
lambda=c/f*1e6;
phase=pinch(angle(ex));
phai=phase-2*pi*(source_z+monitor_z-2*surface_z)*f/c;
phai=mod(phai*180/pi,360);
plot(lambda,phai,"lambda um","phase");
这是一段用于验证光从光疏介质入射到光密介质时,反射波中存在半波损失的完整仿真代码。它包含了以下几个部分:
仿真代码中的关键部分(除了分析模块)我都做了一定的注释,大家可以根据自己的需要结合注释修改代码。关于以上几个仿真模块详细的编写与使用,我们将在后续的文章中介绍。
由于本系列文章主要作为入门级的一些介绍,更详细的脚本命令和相关设置还请参考以下链接:
模型:Simulation objects.
脚本命令:Lumerical scripting language - By category.
PS:其他技术相关的具体问题也可在Lumerical官网以及kx论坛上找到。