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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值