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分功,仿真没问题。

    作者:库小仑

    物联沃分享整理
    物联沃-IOTWORD物联网 » FDTD + Python API + Interconnect联动设计(无源器件)

    发表回复