以下文章來源于微信公眾號:硅光口袋?,作者李子正
Lumerical軟件具有較強的擴展性,可以仿真波長量級光電器件中的各種現(xiàn)象。軟件官網(wǎng)提供了各方向的基礎(chǔ)案例,利用自帶的腳本語言和數(shù)據(jù)傳遞流,將一部分功能打包以供調(diào)用。我們在進行自己領(lǐng)域內(nèi)的仿真時,可以借鑒案例思路,使用腳本控制整個仿真過程。這方面的教程基本沒有,導(dǎo)致我自學軟件的時候浪費了大量時間,這期借助一個簡單的例子:彎曲波導(dǎo)插入損耗的掃描,總結(jié)FDTD仿真中數(shù)據(jù)傳遞的方式,以及腳本控制該過程的方法。
首先,用如下一張動圖來表達軟件中指令和數(shù)據(jù)的關(guān)系。這里我用編程中常見的語言來類比(如云朵中所示),黑色箭頭代表指令的傳遞方向,紅色箭頭代表結(jié)果數(shù)據(jù)的返回方向。“Script File Editor”是個編譯器,其語法類似C和matlab的混合體,也支持python,用它可以控制仿真的整體運行,這就像主函數(shù)調(diào)用各個自定義函數(shù)并對變量進行操作的過程,結(jié)果各函數(shù)會將結(jié)果數(shù)據(jù)返回。“Optimizations and Sweeps'是用來實現(xiàn)參數(shù)化掃描和優(yōu)化的模塊,相當于一個自定義函數(shù),可以被主函數(shù)調(diào)用。剩下的部分都在項目樹中,“model”代表整個仿真模型,是極大的父類,包含了仿真區(qū)、結(jié)構(gòu)組、分析組、光源等子類,而波導(dǎo)、微環(huán)、監(jiān)視器等則是子類的子類,子子類。這些子類中包含了各種可調(diào)參數(shù),包括位置、尺寸、材料等,以及用于記錄有限時域差分結(jié)果的數(shù)組變量,包括電場、磁場、透射譜等。
該流程圖以FDTD Solutions為基準,可以推廣至其他幾個孿生軟件。接下來,用一個很簡單的測彎曲損耗的例子說明該過程,模型就是一個槽波導(dǎo),如下圖。我們要實現(xiàn)的是一鍵掃描在不同彎曲半徑條件下,波導(dǎo)的插入損耗,并將相應(yīng)的結(jié)果圖畫出來。
接下來按照前面的流程圖,描述具體設(shè)置。在父類model中,在設(shè)置頁面設(shè)置變量bending_radius記錄波導(dǎo)的彎曲半徑,該參數(shù)可以被傳遞到任何子類內(nèi),只需在設(shè)置頁面用腳本設(shè)置即可,具體如圖中所示。與使用其他仿真軟件類似,所有的設(shè)置盡量參數(shù)化(也就是盡量用自變量彎曲半徑來表達其他變量),這樣后續(xù)想要自變量時,其他內(nèi)容都會隨之改變,可以省去很多麻煩。
槽波導(dǎo)結(jié)構(gòu)是用圖中的90 degree bend結(jié)構(gòu)組定義的,其下嵌套三個子結(jié)構(gòu)組,分別代表中間彎曲波導(dǎo)、左側(cè)直波導(dǎo)和右側(cè)直波導(dǎo)三部分。變量bending_radius由父類定義,記錄波導(dǎo)的彎曲半徑。在設(shè)置頁面腳本內(nèi)定義波導(dǎo)的寬度為0.6um,槽寬度為0.3um,通過設(shè)置mesh order實現(xiàn)覆蓋開槽。
類似地,在存放監(jiān)視器的分析組IL_cal中,父類中定義過的變量bending radius可以直接調(diào)用,在設(shè)置頁面定義監(jiān)視器的參數(shù)。同時,在分析頁面調(diào)用監(jiān)視器FDTD計算得到的結(jié)果,給出計算插入損耗的定義,設(shè)置分析組返回插入損耗和波長兩個結(jié)果。這兩個返回值可以選擇返回到父類model中,統(tǒng)一管理方便調(diào)用,這個例子很簡單只有一個分析組,所以不返回。雖然在流程圖里沒有體現(xiàn),但分析頁面的作用也相當于自定義函數(shù),對于監(jiān)視器有限時域差分得到的結(jié)果,包括電場、磁場、時域頻域譜等,可以進行取相位,計算時延色散,以及很多對于計算結(jié)果的初步處理。
這樣項目樹部分就設(shè)置好了,其他不發(fā)生改變的部分例如襯底、包覆層、光源波長范圍、監(jiān)視器監(jiān)視內(nèi)容等,可以將其看成常量,直接設(shè)置即可。這里為了簡便我沒有特別設(shè)置網(wǎng)格,可以將網(wǎng)格的參數(shù)定義在父類model里隨其他參數(shù)變化,也可以直接手動定義,是具體情況而定。軟件里有三種組,布局組只有定義位置坐標的作用,結(jié)構(gòu)組可以實現(xiàn)繞xyz三個軸的任意角度旋轉(zhuǎn)。結(jié)構(gòu)組和分析組涉及到參數(shù)傳遞,可以進行父類到子類的繼承,可以選擇將這兩類的參數(shù)定義在父類model中進行統(tǒng)籌管理。只有分析組具有自定義函數(shù)的功能,通過在上面提到的在分析頁面中寫腳本,可以實現(xiàn)各種功能。
相信有些朋友也有這樣的感受:在草稿紙上計算大量點坐標,構(gòu)建了一個非常復(fù)雜的模型,滿懷期待地點擊運行之后,經(jīng)過長達十幾小時的等待,發(fā)現(xiàn)結(jié)果不盡人意,這時看著自己的模型,發(fā)現(xiàn)有些結(jié)構(gòu)上的坐標已經(jīng)忘記當時是怎么算的,想起來之后開始修改,發(fā)現(xiàn)牽一發(fā)而動全身,又得把所有點的坐標重新算一遍。所以,在整個設(shè)置過程中,能參數(shù)化的地方盡量參數(shù)化,包括comsol等類似的軟件,這會使整個工程自動化,后續(xù)不管是優(yōu)化掃描還是導(dǎo)出到python、matlab處理,都方便很多,修改參數(shù)的時候也非常省心。
完成了項目樹部分的設(shè)置,接下來進行器件設(shè)計中較常見的操作——參數(shù)掃描。軟件中將掃描、優(yōu)化、蒙特卡洛仿真和S參數(shù)提取放在了一個集合內(nèi),較常用的還是掃描。掃描可以多級嵌套,也可以作為子過程嵌套在優(yōu)化中。現(xiàn)在有比較成熟的python的接口,做優(yōu)化或者基于優(yōu)化進行逆設(shè)計都可以實現(xiàn)。這里只進行對自變量彎曲半徑的掃描,直接用腳本編輯器完成,如下圖所示。
當然手動設(shè)置也是可行的,掃描和優(yōu)化存在嵌套時可能手動設(shè)置還更省心一點。如果先不運行掃描,只執(zhí)行runsweep()函數(shù)之前的代碼,就在Optim-ization and Sweeps頁面得到掃描sweep_IL??梢钥吹剑瑓?shù)和結(jié)果均符合腳本編輯器中的設(shè)置。
執(zhí)行整個腳本,指令下達到Optimization and Sweeps,該函數(shù)循環(huán)十次,將父類中的變量bending_radius從小到大設(shè)置為從1um到20um的長度值,每次循環(huán)執(zhí)行一次FDTD仿真,計算當前彎曲半徑下的結(jié)果,并將每次的兩個結(jié)果返回值記錄在數(shù)組IL和lamda中。整個流程遵循本文在前面的動圖,實現(xiàn)對于不同彎曲半徑下波導(dǎo)插入損耗的計算,結(jié)尾處結(jié)果圖會直接彈出。這里再來看一下點擊運行腳本后,仿真區(qū)的變化過程。
除了FDTD以外,對于MODE,DEVICE,INTERCONNECT,本文提到的規(guī)律也有效,幾個軟件之間模型結(jié)構(gòu)是可以直接ctrl+c,ctrl+v的,處理數(shù)據(jù)的方式,寫腳本的語法,也基本一致。在仿真更加復(fù)雜的目標時,變量和監(jiān)視器繁多,搞清楚數(shù)據(jù)的傳遞方式會顯得更加重要。