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