几个简单实用的脚本Script命令:用于结果分析

虽然脚本功能强大,但是对于初学者,脚本文件出错了不知如何诊断,例如
line 29: matrix index out of range

9 Likes
請問FDTD solution如何計算Phase?
重要链接汇总帖(初学者科普)
超表面单元的相位提取
如何用脚本设置旋转角度
贵金属纳米颗粒周期性阵列的吸收光谱仿真问题
几个简单实用的脚本Script命令:用于设置
我想知道如何获取图像数据,比如反射率和透光率
FDTD Solutions 初学者: transmission函数的使用、透射率反射率正负号问题
常见脚本类问题帖集锦
script中的数据类型和数据格式 Dataset
Phase selections(相位点如何准确选择)
初学者常见问题帖子集锦
圆偏振下超表面的相位提取
Sourcepower脚本问题
超表面反射光相位提取
宽光谱仿真,如何使用脚本提取不同波长的相位?
如何使用Script来设置边界条件
请问如何建立双层/多层结构
光响应度脚本实现问题
斜入射光源计算周期性结构散射的问题
Fdtd solutions 矩形纳米柱长短轴相位差仿真
关于sweep中脚本的编写
请问一下,这两句语言是什么意思啊?
Fdfd擷取繪圖的原始數據點
请问fdtd中各个波长下的|e|截面图能批量导出吗
请问如何用matlab画坡印廷矢量图?
怎么计算这个transmission efficiency
如何在场的.fld文件中添加法向和面积以便做重叠积分?
为什么仿真文件中的光源不能穿过光栅
关于MODE结果处理问题
Script教程中Exercise3的IO部分请问如何写代码
繞射光柵實驗架構轉換到fdtd模擬相關問題
关于斜入射和三维数据导出的问题
关于FDTD Solutions 和 Mode Solutions 的图片格式问题。
用脚本文件将数据转换为ldf格式出现了问题

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网页。

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 数据包
这个命令得到的是即包含自变量如空间坐标和频率、又包含因变量,如电场(矢量)、透射率和其它通过分析组计算并输出的数据包等。见后面例子。

:
5. transmission
用于计算透射率和反射率:
RT=transmission(“monitor_name”);
f=getdata(“monitor_name”,“f”);
注意,transmission由于是根据颇印庭矢量计算的,结果有正有负,需要根据情况修正为正的结果,因为transmission是功率量,不可能是负的:
https://kb.lumerical.com/en/ref_scripts_transmission.html
image


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是频率点数。在米散射的例子中,仿真结束后,运行
Ex=getdata(“x_normal_profile”,“Ex”); 这是一个[1,33,33,15]的矩阵,其中nx=1, ,ny=nz33,nf=15.

getresult 这个命令得到的是dataset,常用的格式是getresult(“monitor_name”,“dataset名字”); 例如米散射的例子中,仿真结束后,运行
sigma_c=getresult(“scat”,“sigma”); ;获得自变量波长和频率以及因变量散射截面积。此命令同时运行了分析组,所以才有结果。
visualize(sigma_c);可以直接看结果曲线,横坐标是波长或频率,纵坐标是散射截面积。

可见,getdata给出的是结果矩阵数据,只知道矩阵大小,不知道其自变量大小;而getresult不仅给出结果矩阵数据,还带有自变量。

7: getsweepdata 和getsweepresult
getsweepdata 这个命令类似于getdata,从运行后的扫描组中获得一个变量,常见格式是getsweepdata(“sweep_name”, “data”);其中data可以是扫描的自变量,也可以是结果变量。例如在这个例子中,先运行thickness_sweep
运行 R=getsweepdata(“thickness_sweep”,“R”); 获得扫描的31个反射率数据;
运行plot(1:length®,R);可见得到的纵坐标是反射率,但是横坐标只能是这个一维数据的元素序列数,1,2,…, 31。

getsweepresult 类似于getresult,同时得到扫描的自变量和结果变量。例如,用这个例子,先运行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)。

8 关于DataSet
DataSet含自变量和因变量,例如
E=getresult(“monitor”,“E”),得到的是Dataset,需要进一步提取分量,可以使用点操作:
Ex=E.Ex;
Ey=E.Ey

9:计算位相 angle(Ex)
用getdata得到每一个矢量场的分量,例如Ex,Ey,Ez,然后使用Angle就可以得到位相;
如果是用E=getresult(“monitor”,“E”),得到的是Dataset,需要进一步提取分量,例如
Ex=E.Ex;
Ey=E.Ey
等。
angle是弧度,在正负pi 之间。如果希望位相是波长的函数、位置的函数等,想看到超过Pi的位相,需要使用unwrap
image
image
获得位相 (-pi,+pi)
phx=angle(Ex);
phy=angle(Ey);
获得绝对值
absEx=abs(Ex);
absEy=abs(Ey);

超过Pi 的位相
phaseEx=unwrap(phx);

一般建议:

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文件列表,可以下载保存)

10 Likes

请问在运行script文件的过程中,有什么办法能强行终止?

你可以试着用 按ESC键,或者一般程序用的Ctl^C (或其它键)。

你好!
sweep 一个group一个参数时候发现不对。
单个运行结果是对的。
发现:sweep参数时候 group里面没有重新构建或者结构重叠现象。
导致sweep结果错误。

Hi @liucan,

可以请你提供具体的文件吗,因为通常是不会出现这种状况的。请attach你的文件我们会再具体研究 :slight_smile:

您好!请问我只想提取Ex的实部和虚部的数据到TXT文档,该如何编辑代码呢?谢谢

首先用
Ex = getdata(“monitor1”,“Ex”);
获得Ex;
然后用Write语句输出,参见这个帖子
其中str改为
str= num2str(real(Ex(i)))+", "+num2str(imag(Ex(i))));
即可。

孙老师,我想提取一个一维向量中第N个元素的值,请问该用何种命令?KB里面写get“cannot be used to get the value of a selected object in a group”,那应该用什么呢?非常感谢!

假设你有一个一维向量X(1:M), 第N个元素的值就是X(N)。

1 Like

谢谢老师!那如果是一个关于位置和时间的四维矩阵A(x, y, z, t),该如何得到某一时刻某一位置的相应的数值呢?需要先去掉其他维度变成一维吗?还是类似A(1, N)?非常感谢!

你可能知道
x(Mx)
y(My)
z(Mz)
t(Mt)
M代表它们的阵列大小
因此, 要看1<N<M,你就用A(Nx,Ny,Nz,Nt)就是某一时刻某一位置的相应的数值。

老师您好,我想问一下关于getdata与getresult的问题,
Getdata:da=getdata(“monitor::point_1_1”,“Ex”);

Getresult:re=getresult(“spherical_group::point_1_1”,“Ex”);

两个命令获得的数据有数量级上的差距,并且形状也不同。
文件:question.fsp
question.fsp (334.1 KB)

嗯,你得到的数据没有错,问题在于getresult一般用来得到Dataset,而不是单个数据变量,也就是,我们一般的用法是
E=getresult(“monitor”,“E”);
Ex=(E.Ex);
当你用它直接获得某个变量时,得到的是原始数据,即

你可以看到,你得到的
re=getresult(“spherical_group::point_1_1”,“Ex”);
没有自变量跟随,是原始数据,甚至都没有归化。 而如果用
E=getresult(“monitor::point_1_1”,“E”);
Ex=(E.Ex);
f=E.f;
plot(c/f*1e6,real(Ex));

关于Dataset,参见

不过,知识库中并没有对此给出详细的说明。

孙老师您好,感谢您的耐心解答,我知道自己哪里出问题了,但是我对您说的一点有疑惑。rawdata中未归一化的原始数据电场Ex跟results中的电场Ex曲线趋势不同,好像不是单纯相差数量级的问题。或者这么说,rawdata中Ex代表的是什么?我们获取数据并计算的时候rawdata中数据有没有用?

我估计你说的是曲线的形状。
软件内部是按频率计算的,因此如果没有跟随横坐标,图中的index_4是频率点数;
而我画的是按波长, 所以曲线形状不同。如果我用
E=getresult(“monitor::point_1_1”,“E”);
Ex=(E.Ex);
f=E.f;
plot(f*1e-12,real(Ex),“f THz”,“Re Ex”);

现在是不是一样?除了现在的横坐标是频率。
如果用
plot(1:300,real(Ex));
你看看是不是与你第一帖的结果一样?

我想使用MATLAB输出清晰的场分布图片,那么怎么输出MATLAB可使用的数据呢?

孙老师,谢谢您的耐心解答

1 Like

孙老师您好,
我想请问下getresult(monitor, Ex)得到的Ex没有归化是什么意思?光源设置默认振幅是1的话,归化不是一样吗,是指对什么归化呢?

你说的是旧版, 可以用getresult(monitor, Ex)得到的Ex,这个是直接对时间信号做傅里叶变换得到的,因为时间步长很小,所以其结果就很小。光源设置默认振幅是1,是指时间域。

新版已经不存在这个问题,因为不能用getresult(“source”, “Ex”)得到的Ex,RawData需要用Exx=getresult(“source”,“ExAmp”);
得到的就是原始输入的数值。

而对于监视器,这两种方法得到的结果现在是一样的了。

一般建议不要提取Rawdata。