资源中心

News Center

Lumerical Python API (五) - 数据传递

发布日期:
2023-12-11

浏览次数:

用Python API启动Lumerical的仿真软件时,建立了两者环境之间的联系,彼此的工作空间不共享,而是在变量传递过程中创建一个相同的副本,根据getv( )和put( )函数中定义的转换类型来进行前传和后传。2020a R4版本将典型传输速率提高至约为300MBs,并将传输数据所需的内存开销减少[1],提高了数据传输的效率,但当数据量传输量非常大的时候,数据传递的规律仍显得很重要。

Lumerical和Python中的数据类型对应如下:

LumericalPython
Stringstring
Realfloat
Complexnp.array
Matrixnp.array
Cell arraylist
Structdictionary
Datasetdictionary

仿真过程中,经常会从监视器中提取各种数据类型的结果,并进一步进行传递、数据处理、作图等操作。接下来针对大家使用Python API进行仿真或提取结果时,常涉及到的数据类型进行总结:

1. 原始数据(Raw Data)

从运行过的仿真工程中的监视器结果中,可以直接访问原始数据,这些数据在 Lumerical中以矩阵的形式存在,将其传递到Python环境时,将作为numpy数组返回。矩阵各维度的长度将与相关参数的长度一致,与监视器在各个维度上的监测点个数有关。

属性:数据集中实际数据,例如,电场分量Ex、Ey、Ez是场分布监视器的属性。

参数:数据集的相关位置向量。例如,位置x、y、z和频率f可以是场剖面监视器的参数。

用getdata( )函数可以获取监视器的原始数据,注意与getresult( )区分,得到数据后可以用Python的squeeze( )函数,或者Lumerical的pinch( )函数来删除单个元素的维度,调整结果矩阵的形式。

以下是一个简单的Python API控制Lumerical FDTD进行仿真,并提取数据回到Python的例子:

with lumapi.FDTD() as fdtd:
    fdtd.addfdtd(dimension='2D', x=0.0e-9, y=0.0e-9, x_span=3.0e-6, y_span=1.0e-6)
    fdtd.addgaussian(name = 'source', x=0., y=-0.4e-6, injection_axis='y', waist_radius_w0=0.2e-6, wavelength_start=0.5e-6, wavelength_stop=0.6e-6)
    fdtd.addring( x=0.0e-9, y=0.0e-9, z=0.0e-9, inner_radius=0.1e-6, outer_radius=0.2e-6, index=2.0)
    fdtd.addmesh(dx=10.0e-9, dy=10.0e-9, x=0., y=0., x_span=0.4e-6, y_span=0.4e-6)
    fdtd.addtime(name='time', x=0.0e-9, y=0.0e-9)
    fdtd.addprofile(name='profile', x=0., x_span=3.0e-6, y=0.) 

    # Dict ordering is not guaranteed, so if there properties dependant on other properties an ordered dict is necessary
    # In this case 'override global monitor settings' must be true before 'frequency points' can be set    
    props = OrderedDict([('name', 'power'),
                        ('override global monitor settings', True),
                        ('x', 0.),('y', 0.4e-6),('monitor type', 'linear x'),
                        ('frequency points', 10.0)])

    fdtd.addpower(properties=props)  
    fdtd.save('fdtd_file.fsp')
    fdtd.run()

    #Return raw E field data
    Ex = fdtd.getdata('profile','Ex')
    f = fdtd.getdata('profile','f')
    x = fdtd.getdata('profile','x')
    y = fdtd.getdata('profile','y')
    
print('Frequency field profile data Ex is type', type(Ex),' with shape', str(Ex.shape ))
print('Frequency field profile data f is type', type(f), 'with shape', str(f.shape ))
print('Frequency field profile data x is type', type(x), 'with shape', str(x.shape ))
print('Frequency field profile data y is type', type(y), 'with shape', str(y.shape ))

Python程序设置了光源、环形结构、网格、监视器等,最终返回相应结果的维度,如下图所示,可以直接用Python对数据进行进一步处理、出图。

Lumerical Python API (五) - 数据传递
2. 数据集(Datasets)

数据集是互相相关的结果,打包在Lumerical中,可以轻松地可视化或访问,主要包含三种直线数据集:

Lumerical Python API (五) - 数据传递

其中,Nx, Ny, Nz为坐标向量的长度,Np为参数长度。正如本节之前提到的,如果数据集中参数的维度比较小,例如二维或一维,那么很多个维度的长度将为1,这时就需要使用Lumerical的pinch( )函数来删掉多余的单元素维度。非结构化空间数据集情况类似,但包含了网格点的连通性属性,作为空间属性,广泛用于有限元求解器CHARGE、HEAT、FEEM和DGTD。

传递给python环境的空间数据集将被转换为字典,字典中的键(keys)与各种属性和参数相关联。由于属性是矩阵,它们将转换为numpy数组。此外,它们将有一个特殊的元数据标签'Lumerical_dataset',当执行往返传递时,可以保留它们的结构。使用 getresult( )方法获取返回的数据集:

with lumapi.FDTD('fdtd_file.fsp') as fdtd:   
    #返回两种维度不同的数据集
    T, time = fdtd.getresult('power', 'T'), fdtd.getresult('time','E')
    #创建一个非结构化数据集
    fdtd.eval('x = [0;1;2];y = [0;sqrt(3);0];z = [0;0;0];C = [1,3,2];ds = unstructureddataset(x,y,z,C);')
    ds = fdtd.getv('ds')
    
print('Transmission result T is type', type(T),' with keys', str(T.keys()) )
print('Time monitor result E is type', type(time),' with keys', str(time.keys()) )
print('Unstructured dataset is type', type(ds),' with keys', str(ds.keys()) )

返回结果:

Lumerical Python API (五) - 数据传递

参考:

[1]https://optics.ansys.com/hc/en-us/articles/360041401434-Passing-Data-Python-API

Lumerical Python API (五) - 数据传递


相关推荐

Lumerical 薄膜铌酸锂电光相位调制器
在这个示例中,我们基于Mercante等人的工作[1]模拟了一种薄膜铌酸...
Lumerical 单行载流子光电探测器仿真方法
综述在本例中,我们将研究混合硅基光电探测器的各项性能。单行载流子(uni...
使用 Lumerical 对铁电波导调制器进行仿真应用
01说明在本例中,我们仿真了使用BaTiO2的铁电波导调制器,BaTiO...
Lumerical 单光子雪崩二极管仿真
01说明二次光子在单光子雪崩探测器(SPAD)的雪崩过程中被发射,它们对...