FDTD获取结构上特定区域的电场

你好 我想提取结构的电场,尝试建立一个识别结构的折射率模板的办法,不知道哪里出错了 总是实现不了?多次检查无果。麻烦帮忙看一下代码 谢谢~

mask.lsf (1.8 KB)
test.fsp (283.9 KB)

就你的情况,两个材料的实部和虚部差别很大,可以通过简单的判断就可以,参见 如何计算指定面积的模式部分功率或者限制因子(脚本窗口函数)
比如
filter=(real(n^2)<0) 得到窗口
filter=(real(n^2)<0)*n;得到窗口内的折射率
当然也可以很容易得到电场了。

你试一下。

正好我最近也研究了一下,通过折射率监视器获取特定区域的方法。
我采用的是 find 函数,在折射率监视器的结果中,找到不同材料对应的索引位置。

index_SiN=getfdtdindex(SiN,f,f,f);
out_SiN=find(index_x==index_SiN);
mask=index_x;
mask(out_SiN)=1;

其中 out_SiN就是所有氮化硅区域的索引号Index了。 接着就可以定义出mask了
不过上述代码不一定能够直接运行,这里只是提供一个思路,可以使用find函数来进行。

为了避免由于有效数字的不同而导致失败,可以进行修改,将折射率取整。

out_SiN=find(floor(index_x)==floor(index_SiN));

定义窗口函数的方法有很多,主要是根据材料性质,一般选最容易区别的方法.

谢谢,我测试了一下,用filter=(real(n^2)<0) 可以区分出金属结构的,但是用了filter=(real(n^2)==1.45)却不能区分SiO2的结构出来

谢谢~这种思路可以有——我把代码中的第一句中SiN改成SiO2用在例子文件中,居然识别不出来 :joy:

可能是在你研究的频率点上,二氧化硅的折射率不完全等于1.45,毕竟实际存在的材料,都是有一定色散的。
建议你打开折射率监视器,直接看看里面的折射率是多少。
你可能要加一句,

f=getresult(“index”,“f”);

嗯嗯,但我是直接用了折射率监视器里面的 f 数据,就如同您写的这一句 ,但是还是识别不出来

有可能是监视器的全局设定之类的和监视器的自身设定有冲突,你可以看一下,折射率监视器的工作频率和你设置的是不是真的一致。

out_SiN=find(floor(index_x)==floor(index_SiN)); 还可以用floor等语句,避免由于有效数字的不同而导致失败。

如孙老师所说,实现的方式有很多,哪种能用,哪种好用,你就用哪种吧!

@ Junyu_Li 说的对,为什么要恒定的数呢? 当然也可以用一个频率点上的数,但是你需要设置这个频率点。此外,作为软件使用人员,恒等需要慎用!只有你确认有恒等的情况才可以。

你的目的是为了找到SiO2材料,简单的方法就是用介电常数实部的正负来判断,非常简单也不会出错。前面说了,这个窗口函数只要找到非常不同的特性就可以了,原则上应该是越简单越好。

嗯嗯 在可见光范围,根据介电常数的正负判断 只能分辨出金属(负介电常数)

filter1=(real(n^2)<0); # n为获取的折射率数据

但SiO2跟周围环境(设为空气)都为正的,两者又有区别(SiO2>1,Air=1),我用不等式的方式可以得到SiO2:

filter2=(real(n^2)>1);

但倘若用等式的方式 却不可以识别出来 (不知道是什么原因)

filter2=(real(n^2)==2.12886); #2.12886为设定波长的对应折射率

你如果理解了其基本原理(折射率或者介电常数显著不相同),参考前面的几个回复,可以修改脚本,比如:
1:filter2=(real(n^2)>1.3);可以分辨出SiO2;
2:仅当你设置所有波长处用固定折射率2.12886,才有可能检测,但是检测不到边缘,因为界面上一般不等于这个数。其次,折射率是矩阵,你应该挑选处某个频率, 比如
filter2=(real(n(:,:,:,1)^2)==2.12886) 平方后是介电常数。
所以不建议用恒等。

你试一下。