怎样在脚本中实现,查看监视器中近场场强分布

script
fdtd

#1
  1. 已经通过下面的代码,实现了查看远场的功能:
    E = farfield3d(m,1,res,res);
    ux = farfieldux(m,1,res,res);
    uy = farfielduy(m,1,res,res);
    image(ux,uy,E,"","",“远场图I”,“polar”);

但是通过?getdata(“monitor”);语句发现,monitor里能够调用的数据是:x y z surface_normal dimension f Ex Ey Ez
Hx Hy Hz power,但是没有NxM matrix的矩阵返回光强分布。所以想请问下,怎样在脚本中实现,查看监视器中近场场强分布。谢谢!

2.每次跑脚本,我都会for循环很多次,我想把每次跑完的结果,都save供分析,但是使用 save(filename)语句,filename里不能含变量,无法把文件存下来。所以想问怎么把每次循环的结果都保存?

多谢!


#2

A1:Ex Ey Ez Hx Hy Hz是4维数据: x y z 和 f。 所以不能是NxM matrix的矩阵。 只要能看到这些就是正常的数据。 而farfield3d的结果是排在球面上二维数据,已经做过变换了。

A2:save(filename)是保存仿真文件,不是数据。要保存数据,要用
savedata(“filename”, var1, var2,…);

参见这个说明

你试一下,有问题将文件发来。


#3

怎样在脚本中实现,查看监视器中近场场强分布,即监视器中的E?
手动添加的监视器里,看E很容易,但是在脚本中,因为我是在不断扫描,后面的结果会覆盖之前的结果,所以我想怎么用image 语句实现显示近场场分布,即监视器中的E。


#4

我的确是想保存仿真文件,因为我在跑循环,后面结果会覆盖之前结果,我想把每次的结果保存下来,但是苦于 save(filename)语句里不能含变量,每次保存的文件名总是相同,后面的文件会把之前的覆盖掉,有没有办法可以实现在一次循环中,每次循环都保存一个文件
谢谢!


#5

https://kb.lumerical.com/en/index.html?ref_scripts_datasets.html 这是关于Datasets 的介绍页面,理解Rectilinear dataset 、 Matrix dataset、string、Matrix、Unstuctured data 之间的区别和特点,对编写脚本、存储数据、实现循环,都很有帮助。

希望对你有帮助!


#6

你如果扫描后网格不变,直接在Sweep里面可以看E,请参看
https://kb.lumerical.com/en/index.html?sweeps_parameter_sweeps.html

如果你是自己用脚本,那更简单,你自己定义函数,例如仅扫描一个参数, 监视器给出E(x,y,z,f),你需要先仿真一次定义
nx=length(x);
ny=length(y);
nz=length(z);
nf=length(f);
Es=matrix(nx,ny,nz,nf,N);

for(n=1:N)
#change parmaeter with n

Es(1:nx,1:ny,1:nz,1:nf,n)=getdata(“moitor”,“E”);
}

其它的类似。

最直接的就是用Sweep物件。

如果网格会改变,就不能直接用Sweep物件,而需要定义一个最大的数组,每次到要找知道
nx=length(x);
ny=length(y);
nz=length(z);
nf=length(f);

并且要保证不会超出Es的维数。


#8

原来可以用 getdata(“moitor”,“E”); ,E就是包含(nx,ny,nz,nf,N)的五维数组吧,其中的N是什么含义? 得到E以后,又怎么画图呢,就是画出跟监视器中近场图一样的图,类似于下面的


#9

N就是你扫描的变量个数;
但是getdata(“moitor”,“E”);一般只能得到(nx,ny,nz,nf)四维数据,(nx,ny,nz,nf,N)应该是通过扫描得到。

如果你仅需要XY面的结果,你不需要用3D监视器;

你已经得到了数据,下一步就是作图,例如
x=linspace(0,10,100);

y=linspace(0,10,100);

x2=sin(x);

y2=sin(y);

pic=meshgridx(x2,y2)+meshgridy(x2,y2);

image(x,y,pic,"","","",“logplot”);

image(x,y,pic,"","","",“logplot,red2blue”);