本文演示了 Lumerical 仿真軟件與 Python 聯(lián)合工作的具體流程,展示了開發(fā)復(fù)雜的自動(dòng)化仿真計(jì)算和高級(jí)數(shù)據(jù)處理、繪圖的可行性。使用 Python API(即上一篇文章中提到的lumapi庫(kù))即可實(shí)現(xiàn)仿真軟件與Python的交互操作。用戶可以用 Python 代碼實(shí)現(xiàn)對(duì)于 Lumerical 軟件仿真的初始化設(shè)置,運(yùn)行和迭代,以及數(shù)據(jù)傳遞和處理。
1. 開啟會(huì)話
連接到 lumapi.py 文件是啟用 Lumerical-Python API 接口的關(guān)鍵。首先需要導(dǎo)入 lumapi 庫(kù)并初始化會(huì)話 (初始化會(huì)話需要 GUI lisence),詳細(xì)方法參考Lumerical Python API (二) - 初始配置,之后便可以對(duì)仿真對(duì)象進(jìn)行訪問,相關(guān)的開啟會(huì)話函數(shù)在lumapi庫(kù)中均有定義:
fdtd?=?lumapi.FDTD()??#開啟會(huì)話
mode?=?lumapi.MODE()
device?=?lumapi.DEVICE()
interconnect?=?lumapi.INTERCONNECT()
這種類似構(gòu)造函數(shù)的命令中,帶有以下兩種可選參數(shù):
如果要打開名為simple_high_Q_cavity.fsp的工程,只需運(yùn)行:
shQc?=?lumapi.FDTD(filename='simple_high_Q_cavity.fsp',?hide?=?False)
如果要在FDTD中直接運(yùn)行名為simple_high_Q_cavity.lsf的腳本,且不顯示仿真軟件的GUI/CAD,只需運(yùn)行:
run_script?=?lumapi.FDTD(filename='simple_high_Q_cavity.lsf',?hide=?True)
2. 導(dǎo)入方法
使用API接口進(jìn)行編程時(shí),可以用Python定義函數(shù),也可以利用lumapi中的自動(dòng)同步函數(shù),從 .lsf 腳本文件中導(dǎo)入函數(shù),具體方法是用eval( )函數(shù)執(zhí)行腳本。例如,要導(dǎo)入腳本字符串中的函數(shù),只需運(yùn)行:
fdtd?=?lumapi.FDTD()
fdtd.eval('function?helloWorld(){return?\'hello?world\';}\nfunction?addTest(a,b){return?a+b;}')
print(fdtd.helloWorld())
print(fdtd.addTest(9.2,2))
便會(huì)輸出結(jié)果“hello world”以及“11.2”。要導(dǎo)入腳本文件“testScript.lsf”中的函數(shù),只需運(yùn)行:
fdtd?=?lumapi.FDTD()
script?=?open('C:/desktop/testScript.lsf'.'r').read()
fdtd.eval(code)
腳本也可以在構(gòu)造函數(shù)中作為參數(shù)來定義方法:
def?testAddingMethodsFromConstructor(self):
app?=?self.appConstructor(script='testScript.lsf')
expectedMethods?=?{'helloWorld'}
expectedResults?=?['hello?world?from?script?file']
results?=?[]
results.append(app.helloWorld())
self.assertEqual(results,?expectedResults)
app.close()
3. 仿真對(duì)象
從2019a版本開始,Python API支持使用構(gòu)造函數(shù)添加對(duì)象和從構(gòu)造函數(shù)設(shè)置仿真對(duì)象。構(gòu)造函數(shù)可以添加仿真區(qū),并設(shè)置相關(guān)的參數(shù),如位置、大小等等:
fdtd.addfdtd(dimension='2D',?x=0.0e-9,?y=0.0e-9,?x_span=3.0e-6,?y_span=3.0e-6)
添加監(jiān)視器:
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)
如果對(duì)象的某一參數(shù)會(huì)受到其他參數(shù)影響,這時(shí)使用有順序的字典設(shè)置,要用到OrderedDict( )函數(shù),注意OrderedDict包只適用于Python 2,可以安裝適用于Python 3的Collections包。如果參數(shù)獨(dú)立,則可以直接用Python字典設(shè)置:
props?=?{'name':?'power',
?????????'x'?:?'0.0',
?????????'y'?:?'0.0',
??????????'monitor?type'?:?'linear?x'}
fdtd.addpower(properties=props)
如果要給仿真對(duì)象修改或添加某些參數(shù),lumapi中均有相應(yīng)的函數(shù)來完成,也可以通過本文“2.導(dǎo)入方法”中提到的方式,用一些.lsf腳本命令實(shí)現(xiàn),例如添加長(zhǎng)方體:
rectangle?=?fdtd.addrect(x?=?2e-6,?y?=?0.0,?z?=?0.0)
rectangle.x_span?=?10.0e-6
rectangle.y_span?=?0.4e-6
rectangle.z_span?=?0.2e-6
Python會(huì)自動(dòng)刪除作用域以外的變量,因此大多數(shù)時(shí)候不需要手動(dòng)關(guān)閉會(huì)話。在pyCharm中,Python程序運(yùn)行結(jié)束也會(huì)自動(dòng)關(guān)閉會(huì)話,即所打開的仿真軟件窗口在程序運(yùn)行結(jié)束時(shí)會(huì)自動(dòng)關(guān)閉。也有一些其他編譯器,不自動(dòng)關(guān)閉會(huì)話,如果想手動(dòng)進(jìn)行關(guān)閉,可以使用close( )函數(shù):
fdtd.close()??#關(guān)閉會(huì)話
本節(jié)簡(jiǎn)單介紹了lumapi的會(huì)話管理,可以初步實(shí)現(xiàn)Lumerical仿真軟件與Python腳本的交互。Lumerical腳本語言可以看作是Python代碼的子集,lumapi給用戶提供了更為豐富的創(chuàng)造空間,原先.lsf腳本難以實(shí)現(xiàn)的功能,現(xiàn)在都有希望借助Python腳本實(shí)現(xiàn)。之后我們將討論兩種腳本之間的關(guān)聯(lián),并闡述Python與Lumerical之間數(shù)據(jù)傳遞的規(guī)律。
參考:
[1]https://optics.ansys.com/hc/en-us/articles/360041873053