FDTD + Python API + Interconnect联动设计(无源器件)
前言
在进行FDTD仿真时,往往需要检测设计结构是否满足使用,可以使用集成电路进行测试,Lumerical FDTD可以将FDTD设计好的器件参数导入到自带的Interconnect模块,可以在电路级进行仿真,从而验证该器件的理论性能,此外,可以通过Python API进行设计结构,近年来,在FDTD反向设计领域使用比较广泛,生成数据集比较方便,当然,FDTD自己的脚本也比较方便,毕竟是原生的,因此Python API也是根据FDTD的相关指令进行操作,鉴于本人也是初学者,以下内容仅作交流使用。
使用过程中需要的软件和模块:
VSCode(python)
Ansys Lumerical(FDTD、Interconnect)
目录
Python API使用
注意点
导入路径和包
import numpy as np
sys.path.append(r"C:\Program Files\Lumerical\v202\api\python")
import lumapi
import random
选择FDTD自带的python解释器,大致路径如下:
PS(FDTD版本最好大于2020,FDTD自带python版本>3.6,不然可能会无法调试,只能运行)
fdtd = lumapi.FDTD()
该代码可检测是否可以通过python启动FDTD
Python API设计一个器件的流程可以如下:
1、定义器件的基本结构参数,如某些尺寸参数(单位:米,若是500nm即5e-7)、材料的折射率等;
2、启动FDTD;
3、构建结构;
4、保存该结构的.fsp文件;
5、运行fdtd仿真(fdtd.run());
6、导出结果并保存。
此外可以在开头或结尾选择清空器件。
fdtd.switchtolayout()
fdtd.selectall()
fdtd.delete()
下面列举一些常用的fdtd指令用法,该部分可参考官方command,
Lumerical scripting language – Alphabetical list – Ansys Optics
当我们遇到一个模块不知道里面有什么参数时(比如,name、injection axis等,可以去官网查询或者去github搜索相关代码(fdtd.addport)这样)。我目前遇到的有两种增加结构的方式:
这种直接定义:
fdtd.addrect(name ='input_wg', x_min = x_min, x_max = x_max, y = 0 , y_span =
wg_width, z_span = 220e-9, material = "Si (Silicon) - Palik")
这种先添加,再修改属性:
fdtd.addport()
fdtd.set({'name':'port1',
'injection axis':'x-axis',
'direction':'Forward',
'x':-size_x/2+0.2e-6,
'y': 0,
'y span':mode_width,
'z': 0,
'z span':200e-8})
下面列举我用到的一些添加结构、端口、监视器等。
fdtd.addfdtd(dimension = '3D', index = index,
mesh_accuracy = 3, x_min = x_min,
x_max = x_max, y_min =y_min, y_max = y_max,
z = 0, z_span = z_span,
auto_shutoff_min = 1e-6, simulation_time = 5000e-15)
fdtd.setglobalsource("wavelength start", 1100e-9)
fdtd.setglobalsource("wavelength stop", 1900e-9)
fdtd.setglobalmonitor('frequency points', 10)
fdtd.addport()
fdtd.set({'name':'port1',
'injection axis':'x-axis',
'direction':'Forward',
'x': size_x,
'y': 0,
'y span': width,
'z': 0,
'z span': 1e-8})
fdtd.addport()
fdtd.set({'name':'port2',
'injection axis':'x-axis',
'direction':'Backward',
'x': size_x,
'y': y,
'y span': width,
'z': 0,
'z span': 1e-8})
fdtd.addpower(name = 'opt_fields', monitor_type = '2D Z-normal',
x = 0, x_span = size_x, y_min = size_y, y_max = size_y)
fdtd.addmesh(name = 'fom_2_mesh', override_x_mesh = True, dx = dx,
override_y_mesh = False, override_z_mesh = False,
x = size_x ,
x_span = 2*dx, y = d2, y_span = mode_width)
fdtd.addindex(name = 'global_index', x_min = -size_x/2, x_max = size_x/2, y_min = -size_y/2, y_max = size_y/2 )
fdtd.addstructuregroup(name = 'initial_guess')
poles1 = np.array([
[d / 2, 0],
[0, 0],
[0, d1],
[d / 2, d1]
])
bend1 = fdtd.addwaveguide(base_width = w1, base_height = 1e-9, base_angle = 90, poles = poles1, material = "Si (Silicon) - Palik")
fdtd.addtogroup('initial_guess') #之后定义的结构也都可以加入到这个组
FDTD设计的S参数导出(无源器件)
首先我们要知道,interconnect的器件都是有输入和输出的,所以我们需要在FDTD中对结构添加端口,我用官方的案例进行演示:
没错,addport就是控制这个,一般器件都是左进右出,可以将左边的端口改成forward,右边的端口改成backward,即port1对应forward,port2,port3对应backward,在这种情况下仿真就可以不用光源mode了。
一般我们仿真都是3维结构,确保z平面也是有厚度的,即设置z = xxx um。
检查一下结构有没有问题,我们就可以导出参数了。
之后右键S-parameters sweep,选择edit,编辑端口方向,我们不考虑群延迟那些。
之后右键S-parameters sweep,选择run,等待仿真完成,出现其他情况说明仿真有问题,检查仿真区域、是否没有选择3d等情况。
仿真完毕,我们导出FDTD格式的文件就可。Export——>Lumerical Format. 完成。
Interconnec验证
我们创建一个interconnect文件,官方给的时ONA器件,我用一个我可以理解的方式验证一下功率,添加器件,选择导入文件,上一步保存的.dat文件
导入之后,自动变成设定的端口数。添加其他器件:
1*2分功,仿真没问题。
作者:库小仑