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