首页/文章/ 详情

Lumerical Python API (五) - 数据传递

1月前浏览1428

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

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

Lumerical
Python
String
string
Real
float
Complex
np.array
Matrix

np.array

Cell array
list
Structdictionary
Dataset
dictionary
仿真过程中,经常会从监视器中提取各种数据类型的结果,并进一步进行传递、数据处理、作图等操作。接下来针对大家使用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对数据进行进一步处理、出图。

2. 数据集(Datasets)

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

其中,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()) )
返回结果:

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



来源:摩尔芯创
pythonUM电场Lumerical控制ANSYS
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-09-29
最近编辑:1月前
摩尔芯创
光学仿真、光学培训、硅基光电子
获赞 6粉丝 4文章 32课程 0
点赞
收藏
作者推荐

【案例】基于Lumerical Charge的金属氧化物半导体(MOS)电容器的仿真

本例描述了金属氧化物半导体(MOS)电容器的仿真。在第一部分中,我们将进行稳态仿真以计算MOSCap的静态电容。在第二部分中,我们将进行小信号分析,以研究MOS电容的频率特性。MOS电容器制备及工作原理:MOS电容器可以通过在金属板和半导体之间放置绝缘体来制造。施加在金属上的电压使半导体表面上产生正(空穴)或负(电子)电荷,极性相反的电荷积聚在金属处,该结构用作电容器。依据半导体的类型(掺杂)和施加在金属栅极上的电压,MOS电容器有三种工作模式。在一种模式下,施加在金属触点上的电压在半导体表面上积累了大部分载流子,这被称为“累积”。在另一种情况下,施加的电压在半导体表面上产生少数载流子,最初在表面产生一个耗尽区域(“耗尽”工作模式),最终半导体表面的大多数载流子类型被反转,则最后一种模式称为“反转”。在对于累积和强反转两种情形,MOS电容器都可以由传统的平行板电容器近似,并假设为恒定值。然而,在耗尽模式下,耗尽区域的宽度会影响MOSCap的电容,并且电容变得与偏置相关。在累积和强反转中,MOSCap的电容可以近似为:为绝缘体的介电常数,A是表面积,d是绝缘体的厚度。在耗尽中,MOSCap的容量取决于耗尽区域的厚度,并且在耗尽区域的最大宽度处变小。MOSCap在从耗尽切换到反转之前的最小电容可以近似为:Wm是耗尽区域的最大宽度, 是反转开始时的表面电位, 是半导体的掺杂浓度。在静态和低频率操作的情况下,电容值可以用这些分析表达式来表示。对于耗尽和积累的情况,半导体中电荷的运动是由多数载流子引起的,受到半导体介电弛豫时间的限制,因此非常快。所以,MOSCap在累积和耗尽区域的高频电容遵循其静态值。然而,在反向情形中,反转层通过耗尽区域与本体半导体分离,并且表面电荷的运动受到载流子产生速率的限制。因此,反转电容在高频下变小,几乎等于MOSCap的最小电容[1]。构建物理模型构建稳态仿真模型稳态模拟:在这部分示例中,我们将对MOS电容器进行稳态仿真并计算其静态电容。将 moscap.ldev 项目文件和 moscap_static_C.lsf 脚本文件下载到同一文件夹中。运行脚本文件,它将执行两次电压扫描,一次从 0 到 2.5 V,另一次从 0 到 -2.5 V,并将计算 MOSCAP 的电容。该脚本将生成以下绘图并将电容值保存在 .mat 文件中。电容曲线的不同区域已被标记。 通过脚本语言来完成电压扫描绘制出C-V曲线图小信号仿真:接下来,我们将对同一 MOSCap 进行小信号交流分析。为此,请将 ssac_moscap.ldev 项目文件和 moscap_ac_Cap.lsf 脚本文件下载到同一文件夹中。该脚本将加载项目文件并在 -2.5 V 至 2.5 V 的每个直流偏置点执行小信号交流分析,并计算 MOSCap 的导纳。导纳的虚部将给出电容值。小信号交流分析将针对 0.001 Hz 至 1 MHz 的频率范围进行。在计算不同频率下的交流电容后,脚本将绘制 MOSFET 的低频 (0.001 Hz) 和高频 (1 MHz) 交流电容以及从稳态仿真计算的静态电容以及解析值 MOSCap 的静态反向/累积电容和最小电容,如上式给出。小信号分析时需修改Small Signal AC参数通过脚本语言来完成小信号电压扫描并绘制出C-V曲线图从图中可以看出,稳态和小信号交流模拟的结果与 MOS 电容器的理论最大值和最小值一致。[1]参考:[1]https://optics.ansys.com/hc/en-us/articles/360042760633翻译:摩尔芯创来源:摩尔芯创

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈