【lumerical knowledge exchange】
Lumerical的脚本与Matlab的极其类似,而且可以完全调用Matlab文件,关于Matlab调用,常见的就这几个命令
matlab
matlabget
matlabload
matlabput
matlabsave
1: ? 问号、size和 length
前述的错误,说明矩阵的维数出了问题。可以用? 查找。例如,变量名var1。 在行输入窗口(Prompt):
?size(var1);
result:
9 6
说明这个矩阵是9*6 .
对于一维矩阵,可以用这个命令 length
问号后面表示是要显示的变量值,数值或字符。
2:pinch
在有些数组相乘时,如果维数不同,即使某个数组的某个维数里面只有一个元素,例如E(30,30,1,50),它也是4维数组。如果要与3维数组相乘,必须将E的第三维消除,将它变为E(30,30,50),就可以用pinch , 其它用法参见pinch 263网页。
3:定义矩阵
与其它语言一样,如果要逐个向一个矩阵不同元素里面附值,需要先行定义变量,一般用Matrix . 例如,nx=10 ; nf=5; Ex=matrix( nx,nf);由此就定义了一个二维数组。
还可以同时定义一个一维数组并赋值,例如 w1=1e-6;w2=1.5e-6;nw=50;w=linspace(w1,w2,nw);
4: dataset 数据包
这个命令得到的是即包含自变量如空间坐标和频率、又包含因变量,如电场(矢量)、透射率和其它通过分析组计算并输出的数据包等。见后面例子。
transmission
用于计算透射率和反射率:
RT=transmission(“monitor_name”);
f=getdata(“monitor_name”,“f”);
注意,transmission由于是根据颇印庭矢量计算的,结果有正有负,需要根据情况修正为正的结果,因为transmission是功率量,不可能是负的:
https://kb.lumerical.com/en/ref_scripts_transmission.html
image
FDTD Solutions 初学者: transmission函数的使用、透射率反射率正负号问题
6: getdata 和 getresult
getdata:最常用的获取监视器(包括光源以及分析组中的监视器等)数据的命令,常见的格式是getdata( “monitor”, “dataname”);例如:Ex = getdata(“monitor1”,“Ex”); 注意,对于3D仿真,这个结果是4维x,y,z f/t 数据,取决于你的设置,一般是一个平面上的数据,因此其中一个坐标维数的元素是一个,例如,当监视器是XY平面时,结果应该是EX(nx,ny,1,nf) 其中nx是x方向的抽样点数, ny是y 方向的抽样点数, nf是频率点数。在米散射的例子 96中,仿真结束后,运行
Ex=getdata(“x_normal_profile”,“Ex”); 这是一个[1,33,33,15]的矩阵,其中nx=1, ,ny=nz33,nf=15.
getresult 这个命令得到的是dataset 71,常用的格式是getresult(“monitor_name”,“dataset名字”); 例如米散射的例子 96中,仿真结束后,运行
sigma_c=getresult(“scat”,“sigma”); ;获得自变量波长和频率以及因变量散射截面积。此命令同时运行了分析组,所以才有结果。
visualize(sigma_c);可以直接看结果曲线,横坐标是波长或频率,纵坐标是散射截面积。
可见,getdata给出的是结果矩阵数据,只知道矩阵大小,不知道其自变量大小;而getresult不仅给出结果矩阵数据,还带有自变量。
7: getsweepdata 和getsweepresult
getsweepdata 这个命令类似于getdata,从运行后的扫描组中获得一个变量,常见格式是getsweepdata(“sweep_name”, “data”);其中data可以是扫描的自变量,也可以是结果变量。例如在这个例子中 82,先运行thickness_sweep
运行 R=getsweepdata(“thickness_sweep”,“R”); 获得扫描的31个反射率数据;
运行plot(1:length®,R);可见得到的纵坐标是反射率,但是横坐标只能是这个一维数据的元素序列数,1,2,…, 31。
getsweepresult 类似于getresult,同时得到扫描的自变量和结果变量。例如,用这个例子 82,先运行thickness_sweep,再运行
RT=getsweepresult(“thickness_sweep”,“R”);得到反射率和波长/频率以及扫描厚度。可以用visualize(RT)可以查看它们之间的关系。这个例子有点特殊,是因为光源设置为单色光,因此是固定波长0.5um,看到的是曲线。如果修改光源为宽光谱例如 0.5~0.6 um,同时修改监视器的global settings来记录30个频率点,得到的就是是2D图形,横坐标为波长,纵坐标是厚度,sweep_AR_coating_thickness.fsp (253.8 KB)。
一般建议:
1:用变量表示数值,这样如果需要改变只需要改一次就可以。
2:要使用的数组一般需要先定义。
3: 在Script文件里面,可以用鼠标选择几行单独运行,以便逐一检查文件中的错误。
4:在Script文件中,可以用鼠标选定几行单独运行,便于诊断错误原因。方法是,点左键选取几行,再点击右键选Run Selection即可运行所选定的几行。注意,此功能在结构组/分析组中不工作。
如何知道一个监视器的输出量?
可以用
?getdata(“monitor_name”);
或者
?getresult(“monitor_name”);
上述monitor_name可以是监视器的名字、光源名字以及分析组名字。如果是dataset需要用getresult。
其它相关帖子:
1:用Script设置边界条件
2:plot的几个选项及其意义(含Legend)
3:在mode solution 中的FDE求解器使用Frequency analysis分解结果如何保存成txt格式!
有关脚本的详细说明和教程参见这里 。
上网嫌慢的话,可以下载脚本列表,根据需要只要Ctl+点击某个命令就可以连到官网察看详情: Lumerical脚本命令列表(Word文件列表,可以下载保存)