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
Lumerical提供了很多专用函数供用户用来获取和分析仿真结果。 常用的几个命令 参见这个帖子 。 全部列表参见知识库中 Script 。 transmission 函数根据普适的定义通过对能流密度(颇印庭矢量的实部)积分然后与光源功率相比,获得强度(功率)反射率或透射率,详细公式参见 这个连接 以及 颇印庭矢量积分 [image] 由于不使用教科书中常用的反射/透射强度与入射强度之比,因此适合于用近场量的计算。在 频域监视器 里面只要在Data to record 中勾选 Output power即可。 由于涉及颇印庭矢量的积分问题,因此,就有积分面(或线)的法向问题。 Lumerical规定面(或线)的法向沿坐标轴正向为正,否则为负。能流密度总是正的,因此,积分的结果,如果能流密度沿坐标轴正向,transmission给出的就是正的;否则,如果能流密度沿坐标轴负向,transmission给出的就是负的。而透射率反射率在物理上总是正的,因此,对于负的结果需要将其转换为正。在Visualizer里面,可以直接选-Re,在Script里面,可以在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是频率点数。在 米散射的例子 中,仿真结束后,运行
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
获得位相 (-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文件列表,可以下载保存)
在这个帖子里面 几个简单实用的脚本Script命令:用于结果分析 主要介绍了常用的分析脚本。本贴主要介绍常用的设置脚本,其实,主要的设置脚本主要有两个: setnamed https://kb.lumerical.com/en/ref_scripts_setnamed.html [image] 前提是要设置特性的物件(含光源、几何物体、光源和监视器)都有自己独特的名字。 设置名字有两个方法: 1:直接编辑修改,一般名字要有意义 2:用脚本 例如 addpower; 添加一个Power监视器 set(“name”,“z1”);将其名字改为z1 要设置其XY位置,则要 setnamed(“z1”,“x”,0); setnamed(“z1”,“y”,0); 或者 select(“z1”); set(“x”,0); set(“y”,0); 所以,第二个常用的脚本就是set https://kb.lumerical.com/en/ref_scripts_set.html [image] 它的使用一般是紧跟add,见后面几十个命令,没有单个add可以直接…
请问在运行script文件的过程中,有什么办法能强行终止?
你可以试着用 按ESC键,或者一般程序用的Ctl^C (或其它键)。
你好!
sweep 一个group一个参数时候发现不对。
单个运行结果是对的。
发现:sweep参数时候 group里面没有重新构建或者结构重叠现象。
导致sweep结果错误。
Hi @liucan ,
可以请你提供具体的文件吗,因为通常是不会出现这种状况的。请attach你的文件我们会再具体研究
getdata:最常用的获取监视器(包括光源以及分析组中的监视器等)数据的命令,常见的格式是getdata( “monitor”, “dataname”);例如:Ex = getdata(“monitor1”,“Ex”); 注意,对于3D仿真,这个结果是4维x,y,z f/t 数据,取决于你的设置
您好!请问我只想提取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)。
谢谢老师!那如果是一个关于位置和时间的四维矩阵A(x, y, z, t),该如何得到某一时刻某一位置的相应的数值呢?需要先去掉其他维度变成一维吗?还是类似A(1, N)?非常感谢!
你可能知道 老师您好,我想问一下关于getdata与getresult的问题, 嗯,你得到的数据没有错,问题在于getresult一般用来得到Dataset,而不是单个数据变量,也就是,我们一般的用法是 关于Dataset,参见 不过,知识库中并没有对此给出详细的说明。 孙老师您好,感谢您的耐心解答,我知道自己哪里出问题了,但是我对您说的一点有疑惑。rawdata中未归一化的原始数据电场Ex跟results中的电场Ex曲线趋势不同,好像不是单纯相差数量级的问题。或者这么说,rawdata中Ex代表的是什么?我们获取数据并计算的时候rawdata中数据有没有用? 我估计你说的是曲线的形状。 我想使用MATLAB输出清晰的场分布图片,那么怎么输出MATLAB可使用的数据呢? 孙老师,谢谢您的耐心解答 没有自变量跟随,是原始数据,甚至都没有归化 孙老师您好, 你说的是旧版, 可以用getresult(monitor, Ex)得到的Ex,这个是直接对时间信号做傅里叶变换得到的,因为时间步长很小,所以其结果就很小。光源设置默认振幅是1,是指时间域。 新版已经不存在这个问题,因为不能用getresult(“source”, “Ex”)得到的Ex,RawData需要用Exx=getresult(“source”,“ExAmp”); 而对于监视器,这两种方法得到的结果现在是一样的了。 一般建议不要提取Rawdata。
x(Mx)
y(My)
z(Mz)
t(Mt)
M代表它们的阵列大小
因此, 要看1
Getdata:da=getdata(“monitor::point_1_1”,“Ex”);
Getresult:re=getresult(“spherical_group::point_1_1”,“Ex”);
两个命令获得的数据有数量级上的差距,并且形状也不同。
文件:question.fsp
question.fsp (334.1 KB)
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)); 前面几个帖子对脚本script中的数据类型和数据格式作了介绍和回复,例如 script中的数据类型和数据格式 在mode solution 中的FDE求解器使用Frequency analysis分解结果如何保存成txt格式! 几个简单实用的脚本Script命令 关于数据的类型(属性) FDTD 初学 Visualizer 输出E, Re, -Re, Abs, Abs^2 是什么区别 为什么用visulaizer作图横坐标显示的是index_1 它是什么意思 Dataset是完整表示自变量X和因变量Y的关系的方式。以透射率为例,如果你仅得到T,它只是一个列矩阵,并没有与频率相关联,因此左图时横坐标只能是Index也就是矩阵中的位置指数,1、2、3、…、 nf,参见 为什么用visulaizer作图横坐标显示的是index_1 它是什么意思 Dataset就将它们联系起来了。例如,t1=getresult(‘monitor_T’,‘T’);就是从监视器 monitor_T中得到透射率这个Daraset [image] 需要用点操作获得自变量和因变量: T1t=t1.…
软件内部是按频率计算的,因此如果没有跟随横坐标,图中的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));
你看看是不是与你第一帖的结果一样?
我想请问下getresult(monitor, Ex)得到的Ex没有归化是什么意思?光源设置默认振幅是1的话,归化不是一样吗,是指对什么归化呢?
得到的就是原始输入的数值。