🌈
S4_pyextを用いたバイナリ格子のRCWA解析
S4_pyextでバイナリ格子のRCWA解析を試す。
はじめに
この記事では、RCWA解析光学シミュレータとして公開されているS4の新しいバージョンのインストールを行い、RCWA解析の例として、1次元バイナリ格子の解析結果を紹介します。
S4_pyextのインストール
S4_pyextのインストールは、基本的に
のREADMEを参照すればよいと思います。
に実際に、インストールした例があります。Windowsへのとありますが、WSL上のubuntuへのインストールと思われます。私は、ubuntu22.04で行いました。
バイナリ格子のRCWA解析
実行するためのpython入力ファイルrodis_01lambda_05depth.pyは以下の通りです。
実行スクリプト(rodis_01lambda_05depth.py)
rodis_01lambda_05depth.py
import S4
def run_sim(depth):
n2 = 2.04
wave = 1.55
multi = 1.0
Lambda = wave*multi
angle = 10.0
lpsi = 0.7071067811140325
S = S4.New( Lattice = Lambda, NumBasis = 99 )
# Material definition
S.AddMaterial(Name="FusedSilica", Epsilon=n2**2)
S.AddMaterial(Name="Vacuum", Epsilon=1)
S.AddLayer(Name='AirAbove', Thickness=0, Material='Vacuum')
S.AddLayer(Name='Grating', Thickness=depth*wave, Material='Vacuum')
S.SetRegionRectangle(Layer='Grating',
Material='FusedSilica',
Center=(0.5*Lambda,0),
Angle=0,
Halfwidths=(0.25*Lambda, 0))
S.AddLayer(Name='Substrate', Thickness=0, Material='FusedSilica')
# E polarized along the grating periodicity direction
S.SetExcitationPlanewave(IncidenceAngles=(angle,0), sAmplitude=1, pAmplitude=0)
S.SetFrequency(1.0/wave)
incident,backward = S.GetPowerFlux(Layer='AirAbove')
P = S.GetPowerFluxByOrder(Layer='Substrate')
de_TE = P[2][0].real/incident.real
# M polarized along the grating periodicity direction
S.SetExcitationPlanewave(IncidenceAngles=(angle,0), sAmplitude=0, pAmplitude=1)
S.SetFrequency(1.0/wave)
incident,backward = S.GetPowerFlux(Layer='AirAbove')
P = S.GetPowerFluxByOrder('Substrate', 0)
de_TM = P[2][0].real/incident.real
# Conical polarized along the grating periodicity direction
S.SetExcitationPlanewave(IncidenceAngles=(angle,30), sAmplitude=lpsi, pAmplitude=lpsi)
S.SetFrequency(1/wave)
incident,backward = S.GetPowerFlux(Layer='AirAbove')
P = S.GetPowerFluxByOrder(Layer='Substrate')
de_Conical = P[2][0].real/incident.real
return de_TE, de_TM, de_Conical
print('depth', 'TE', 'TM', 'Conical')
for i in range(99):
depth=0.0+i*0.05
(de_TE, de_TM, de_Conical)=run_sim(depth)
print(depth, de_TE, de_TM, de_Conical)
rodis_01lambda_05depth.gpl
set terminal png nocrop enhanced size 640,480 font "arial,12.0"
set output 'rodis_01lambda_05depth.png'
plot [0:5][0:1] "rodis_01lambda_05depth.dat" u 1:2 ti "TE" w linespoints lt 7 lc 'blue' lw 3.0,\
"" u 1:3 ti "TM" w linespoints lt 7 lc 'red' lw 3.0,\
"" u 1:4 ti "Conical" w linespoints lt 7 lc 'black' lw 3.0
実行するには以下のようにします。
python3 rodis_01lambda_05depth.py
gnuplot rodis_01lambda_05depth.gpl
rodis_01lambda_05depth.py の実行結果
rodis_01lambda_05depth.py の実行結果を以下に示します。
つぎに条件を変更したrodis_01lambda_50depth.pyとの差分を示します。
rodis_01lambda_05depth.py, rodis_01lambda_50depth.py
47c47
< depth=0.0+i*0.05
---
> depth=45.0+i*0.05
rodis_01lambda_50depth.gpl
set terminal png nocrop enhanced size 640,480 font "arial,12.0"
set output 'rodis_01lambda_50depth.png'
plot [45:50][0:1] "rodis_01lambda_50depth.dat" u 1:2 ti "TE" w linespoints lt 7 lc 'blue' lw 3.0, \
"" u 1:3 ti "TM" w linespoints lt 7 lc 'red' lw 3.0,\
"" u 1:4 ti "Conical" w linespoints lt 7 lc 'black' lw 3.0
実行するには以下のようにします。
python3 rodis_01lambda_50depth.py
gnuplot rodis_01lambda_50depth.gpl
rodis_01lambda_50depth.py の実行結果
rodis_01lambda_50depth.py の実行結果を以下に示します。
つぎに条件を変更したrodis_10lambda_05depth.pyとの差分を示します。
rodis_01lambda_05depth.py rodis_10lambda_05depth.py
6c6
< multi = 1.0
---
> multi = 10.0
rodis_10lambda_05depth.gpl
set terminal png nocrop enhanced size 640,480 font "arial,12.0"
set output 'rodis_10lambda_05depth.png'
plot [45:50][0:1] "rodis_01lambda_50depth.dat" u 1:2 ti "TE" w linespoints lt 7 lc 'blue' lw 3.0, \
"" u 1:3 ti "TM" w linespoints lt 7 lc 'red' lw 3.0,\
"" u 1:4 ti "Conical" w linespoints lt 7 lc 'black' lw 3.0
実行するには以下のようにします。
python3 rodis_10lambda_05depth.py
gnuplot rodis_10lambda_05depth.gpl
rodis_10lambda_05depth.py の実行結果
rodis_10lambda_05depth.py の実行結果を以下に示します。
つぎに条件を変更したrodis_10lambda_50depth.pyとの差分を示します。
rodis_01lambda_05depth.py rodis_10lambda_50depth.py
6c6
< multi = 1.0
---
> multi = 10.0
47c47
< depth=0.0+i*0.05
---
> depth=45.0+i*0.05
rodis_10lambda_50depth.gpl
set terminal png nocrop enhanced size 640,480 font "arial,12.0"
set output 'rodis_10lambda_50depth.png'
plot [45:50][0:1] "rodis_01lambda_50depth.dat" u 1:2 ti "TE" w linespoints lt 7 lc 'blue' lw 3.0, \
"" u 1:3 ti "TM" w linespoints lt 7 lc 'red' lw 3.0,\
"" u 1:4 ti "Conical" w linespoints lt 7 lc 'black' lw 3.0
実行するには以下のようにします。
python3 rodis_10lambda_50depth.py
gnuplot rodis_10lambda_50depth.gpl
rodis_10lambda_50depth.py の実行結果
rodis_10lambda_50depth.py の実行結果を以下に示します。
まとめ
- RCWA解析を可能とする光シミュレータのひとつであるS4_pyextのインストール方法の参照先を示しました。
- S4_pyextを用いてMoharamの論文の例題を実行し、解析結果を示しました。
- 解析結果は 1次元の格子に対して、TE,TMおよびConicalのそれぞれの光入射条件でMoharamの論文の特性をほぼ、再現しました。TMでは若干ずれが生じました。
参考文献
- M. G. Moharam, E. B. Grann, D. A. Pommet, and T. K. Gaylord, “Formulation for stable and efficient implementation of the rigorous coupled-wave analysis of binary gratings,” J. Opt. Soc. Am. A 12(5), pp. 1068–1076, 1995
Discussion