前面的文章介绍了如何搭建一个具体物体的几何结构(Structure)。在这篇文章里,我们来聊一聊如何建立仿真区域FDTD。从这篇文章开始,直到后面的分析部分,我们将在同一仿真物体基础上添加FDTD、光源、监视器等仿真模型,以便进行后续的说明。
首先,我们用如下的代码搭建一个物体(Structure)的仿真模型:
um=1e-6;
nm=1e-9;
addrect;
set("name","SiO2");
set("material","SiO2 (Glass) - Palik");
set("x",0);
set("y",0);
set("x span",1*um);
set("y span",1*um);
set("z max",100*nm);
set("z min",-1*um);
addrect;
set("name","Si");
set("material","Si (Silicon) - Palik");
set("x",0);
set("y",0);
set("x span",1*um);
set("y span",1*um);
set("z max",300*nm);
set("z min",100*nm);
addrect;
set("name","etch");
set("material","etch");
set("x",0);
set("y",0);
set("x span",100*nm);
set("y span",1*um);
set("z max",300*nm);
set("z min",100*nm);
大概长这样:
这是一个由硅和二氧化硅构成的光栅结构。下面,我们搭建一个用于分析光波在透过该光栅时发生衍射的FDTD仿真区域,代码如下:
addfdtd;
set("dimension",2);#三维仿真区域
set("x",0);
set("y",0);
set("z min",-10*nm);
set("z max",2*um);
set("x span",0.2*um);
set("y span",0.4*um);
set("x min bc","periodic");#设置x方向周期边界条件
set("y min bc","periodic");#设置y方向周期边界条件
set("Mesh type","auto non-uniform");#仿真网格为自动精度
set("Mesh accuracy",3);#高精度
在这段代码中,有很多是前面的文章中已经出现过的内容,这里不作赘述。我们重点介绍几个和FDTD本身相关的部分:
set(“dimension”,2):仿真空间维度,“dimension”参数一般有两个值:1和2,其中1表示仿真的区域是二维区域,2表示仿真三维区域。这里设置为2,表示我们仿真的是一个三维区域
set(“x min bc”,“periodic”):边界条件,根据实际的仿真区域(维度)设置,有"x max bc",“x min bc”,“y max bc”等多个边界,可选用的边界条件见下表:
边界条件 | 说明 |
---|---|
PML | 完美匹配层 |
Metal | 金属边界 |
Periodic | 周期边界 |
Symmetric | 对称边界 |
Anti-Symmetric | 非对称边界 |
Bloch | 适合斜入射 |
PMC | 理想磁导体 |
关于各种边界详细的说明与使用条件请在Lumerical官网和有关论坛上查找。
set(“Mesh type”,“auto non-uniform”):网格类型,有“auto non-uniform”、“custom non-uniform”、"uniform"三种可选,一般默认为“auto non-uniform”,若不需更改网格类型,本条代码可不写。这里使用的是默认的自动精度
set(“Mesh accuracy”,3):自动网格精度,在“auto non-uniform”模式下设置。有1~8一共8个等级,精度随着数字的增大而提高,一般默认为2,不建议太高,容易给CPU带来很大的负担。这里设置为3,属于高精度仿真
除了使用系统自动计算的网格,也可以使用自定义精度的网格,代码如下:
addfdtd;
set("dimension",2);#三维仿真区域
set("x",0);
set("y",0);
set("z min",-10*nm);
set("z max",2*um);
set("x span",0.2*um);
set("y span",0.4*um);
set("x min bc","periodic");#设置x方向周期边界条件
set("y min bc","periodic");#设置y方向周期边界条件
set("Mesh type","uniform");#仿真网格为自定义精度
setnamed("FDTD","dx",20*nm);#x方向网格精度为20*nm
setnamed("FDTD","dy",20*nm);#y方向网格精度为20*nm
setnamed("FDTD","dz",10*nm);#z方向网格精度为10*nm
这里设置的“dx”、“dy”、“dz”参数即为自定义的网格精度(最小网格大小)。