前言
本文主要介绍Lumerical脚本语言和fdtd的一些用法,后续会不断更新。
一、运行仿真软件
1.模式转换
语法 | 描述 |
---|---|
switchtolayout; | 从ANALYSIS模式转换到LAYOUT模式,用于修改仿真对象,会丢失ANALYSIS模式的结果 |
?layoutmode; | LAYOUT模式返回1,ANALYSIS模式返回0 |
代码如下(示例):
load("test.fsp");
status = layoutmode;
if (status == 1) {
addrect;
}
else {
switchtolayout;
addrect;
}
#首先,导入"test.fsp"文件,如果我们想要在仿真区域里加入一个长方形(addrect;);
#其次使用layoutmode判断仿真文件的状态,
#如果是ANALYSIS模式,那么调用switchtolayout进行状态切换进而添加结构;
#如果是LAYOUT模式则可直接执行addrect命令
2.运行仿真文件
语法 (FDTD) | 描述 |
---|---|
run; | 按照resource manager的指定好的并行模式进行计算仿真 |
runparallel; | 按照resource manager的指定好的并行模式进行计算仿真 |
run(option1); | Option1 (default: 3),可以选择1,2,3,分别代表不同的计算方式 |
代码如下(示例):
newproject; # 创建一个新的方针文件
addfdtd; # 添加fdtd仿真区域
adddipole; # 添加一个偶极子光源
run; # 运行
3.配置resource manager
语法 | 描述 |
---|---|
addresource(“solver”); | 用来选择计算方法,如addresource(“DGTD”); 选择时域不连续伽略金方法进行计算 |
deleteresource(“solver”,resource_num); | 从resource manager中删除resource |
4.检查证书
语法 | 描述 |
---|---|
checkout(“licensefeature”); | 从license server中获得当前软件的licensefeature概况 |
checkout('heat_solver');
checkout('FDTD_Solutions_engine');
checkout('cml_compiler');
二、添加对象
1.仿真区域
语法 | 描述 |
---|---|
addfdtd; | 在仿真环境中添一个fdtd仿真区域 |
代码如下(示例):
addfdtd;
set("dimension",2); # 1 = 2D, 2 = 3D
set("x",0);
set("x span",2e-6);
set("y",0);
set("y span",5e-6);
set("z",0);
set("z span",10e-6);
run;#在以上的区域运用fdtd方法进行模拟计算
2.添加仿真对象
A.set命令
语法 | 描述 |
---|---|
?set; | 返回选择对象的一系列结构参数 |
set(“property”,value); | 如set(“radius”,1e-6);设置半径参数为1e-6;value值可以是数值或字符串(见示例) |
set(“property”,value,i); | 和set(“property”,value);类似,当多个对象需要设置参数时,可使用此命令(i代表索引) |
setnamed(“name”, “property”, value); | 和set(“property”,value);类似,‘name’参数为指定选择的对象 |
代码如下(示例):
select("circle");#选择所以的‘circle’结构
for (i=1:getnumber) {
rad=get("radius",i);
set("radius",rad+2e-6,i);
} #依次遍历,使所有的半径值增加2e-6
set("x min bc","PML");#设置x边界条件为PML(完美匹配层)
set("enabled",0);#删除一个结构
#选中一个结构对象,改变其参数
coordinates = {"x" : -3e-7,
"x span" : 1e-6,
"y" : 5e-6,
"y span" : 1e-5,
"z" : 1e-7,
"z span" : 2.2e-7};
set(coordinates);
B.添加结构
语法 | 描述 |
---|---|
addcustom; | 个性化添加结构对象(见示例1) |
addcircle; | 添加圆形结构(见示例2) |
addpyramid; | 添加锥形结构(见示例3) |
addlayerbuilder; | 添加层状结构(见示例4) |
addlayer(“name”); | 添加层状结构(见示例4),同时声明层的名称 |
- 更多示例,请参看lumerical官方添加对象说明
代码如下(示例1):
#生成一个半球,"revolution"代表旋转
addcustom;
set("create 3D object by","revolution");# y = sqrt(0.5^2-(x-0.5)^2)
set("equation 1","sqrt("+num2str(0.5)+"^2-(x-"+num2str(0.5)+")^2)");
set("x span",1e-6);
set("y span",1e-6);
set("z span",2e-6);
#生成一个半圆,"extrusion"代表沿着z方向压缩
addcustom;
set("create 3D object by","extrusion");# y = sqrt(0.5^2-(x-0.5)^2)
set("equation 1","sqrt("+num2str(0.5)+"^2-(x-"+num2str(0.5)+")^2)");
set("x span",1e-6);
set("y span",1e-6);
set("z span",2e-6);
代码如下(示例2):
addcircle;
set("name","new_circle");
set("x",1e-6);#圆形坐标
set("y",2e-6);#圆形坐标
set("radius",5e-6);
set("z",0);#圆形坐标
set("z span",10e-6);#设置z方向的厚度
代码如下(示例3):
addpyramid;
set("name","my_pyramid");
set("x span bottom",5e-6);
set("x span top",3e-6);
set("y span bottom",4e-6);
set("y span top",3e-6);
set("z span",1e-6);
set("material","Si (Silicon) - Palik");
代码如下(示例4):
addlayerbuilder;
# Layer 1 = 100 nm layer of silver
addlayer("layer_1");
setlayer("layer_1","thickness",100e-9);
setlayer("layer_1","material","Ag (Silver) - CRC");
# Layer 2 = 500 nm layer of silicon
addlayer("layer_2");
setlayer("layer_2","thickness",500e-9);
setlayer("layer_2","material","Si (Silicon)");
C.添加光源
语法 | 描述 |
---|---|
adddipole; | 添加偶极子光源,见代码示例1 |
addgaussian; | 添加高斯光源,见代码示例2 |
addplane; | 添加平面波,见代码示例3 |
addmode; | 添加波模,见代码示例3 |
代码如下(示例1):
adddipole;
set("x",0);
set("y",-1e-6);
set("z",5e-6);
代码如下(示例2):
#生成一个沿z负方向传播的高斯光束
addgaussian;
set("injection axis","z");
set("direction","backward");
set("x",0);
set("x span",2e-6);
set("y",0);
set("y span",5e-6);
set("z",10e-6);
set("use scalar approximation",1);
set("waist radius w0",0.5e-6);
set("distance from waist",-5e-6);
代码如下(示例3):
#生成一个沿z负方向传播的平面波
addplane;
set("injection axis","z");
set("direction","backward");
set("x",0);
set("x span",2e-6);
set("y",0);
set("y span",5e-6);
set("z",3e-6);
set("wavelength start",0.3e-6);
set("wavelength stop",1.2e-6);
代码如下(示例4):
addmode;
set("injection axis","x");
set("x",0);
set("y",0);
set("y span",5e-6);
set("z",0);
set("z span",10e-6);
3.添加监视器对象
语法 | 描述 |
---|---|
addindex; | 添加折射率监视器,见代码示例1 |
addeffectiveindex; | 添加有效折射率监视器,见代码示例2 |
addtime; | 添加时间监视器,见代码示例3 |
addmovie ; | 添加视频监视器,见代码示例4 |
addpower; | 添加能量监视器(用于获取频域中的能量信息),见代码示例5 |
addprofile; | 添加profile监视器,此监视器和上面的能量监视器相似,不同之处在于获取时profile监视器进行了差值运算,所以会降低数据的准确度,见代码示例6 |
R = getresult(“monitor_name”,“T”); | 添加完监视器获取数据的方法为getresult()命令,"T"为获取的数据,见代码示例7 |
?getresult(“monitor_name”); | 获取监视器的数据 |
代码如下(示例1):
addindex;
set("name","index_monitor");#指定监视器的名称
set("monitor type",2); # 2D y=0平面二维监视器
set("x",0);
set("x span",5e-6);
set("y",0);
set("z",10e-6);
set("z span",5e-6);
代码如下(示例2):
addeffectiveindex;
set("name","neff");
set("x",0);
set("x span",5e-6);
set("y",0);
set("y span",5e-6);
代码如下(示例3):
addtime;
set("name","time_1");
set("monitor type",1); # 一维也就是一个点
set("x",0);
set("y",0);
set("z",10e-6);
代码如下(示例4):
addmovie;
set("name","movie_1");
set("monitor type",3); # 1 = 2D x-normal, 2 = 2D y-normal, 3 = 2D z-normal
set("x",0);
set("x span",5e-6);
set("y",0);
set("y span",5e-6);
set("z",0);
set("lock aspect ratio",1);#此处用于锁定纵横比
set("horizontal resolution",240);#此处指定水平分辨率
代码如下(示例5):
addpower;
set("name","field_profile");
set("monitor type",2); # 2D z-normal
set("x",0);
set("x span",5e-6);
set("y",0);
set("y span",5e-6);
set("z",0);
代码如下(示例6):
addprofile;
set("name","field_profile");
set("monitor type",2); # 2D z-normal
set("x",0);
set("x span",5e-6);
set("y",0);
set("y span",5e-6);
set("z",0);
代码如下(示例7):
# 以获取电场数据为例说明
E=getresult("monitor","E");
# 输出E的数据集
?E;
# 这里为句点引用,即E数据集的某一个具体量(f,Ex等)
?size(E.f);
?size(E.Ex);
# 获得 |E|^2 最大值
?max(E.E2);
# 可视化操作
visualize(E);
# 可视化操作
Ex = pinch(E.Ex,4,1);
image(E.x*1e6,E.y*1e6,Ex,"x (um)","y (um)","Ex");
E vs x, y, z, lambda/f
result:
5 1
result:
343 255 1 5
result:
3.223651