ソースコードを書いて実行する
MEEPの簡単なソースコードを作成し、実行してみることで、大まかな流れをつかむ。
作業ディレクトリ
- 作業ディレクトリを作ることにする。
mkdir meep
- 作業ディレクトリに移動する。
cd meep
- このディレクトリで作業することにする。
エディタ
Linuxの基本的なエディタは「vi [ファイル名]」とコマンド入力すると起動できる。 しかし、LinuxにもCUI環境にもなれていないので、これは使わずにWindowsのVSCodeを使うことにする。
- WindowsへVSCodeをインストールする。
- VSCodeを開く。
- [File] > [Open folder...]をクリック。
- 上部の検索ボックスに\\wsl$と入力してエンター。
- [Ubuntu] > [home] > [ユーザー名] > [作業ディレクトリ]を開く。
これで、VSCodeでプログラミングして保存すれば、WSL内のディレクトリに保存される。
ソースコードを書く
以下のソースコードを書いて、test01.pyというファイル名で保存する。
import meep as mp
cell_size = mp.Vector3(5.00, 4.50, 4.25)
resolution = 20
boundary_layers = [mp.PML(1.00)]
dimensions = 3
geometry = [
mp.Block(size=mp.Vector3(1.00, 0.50, 0.25), center=mp.Vector3(0, 0, 0), material=mp.Medium(epsilon=13)),
mp.Cylinder(radius=0.2, height=mp.inf, center=mp.Vector3(0, 0, 0), material=mp.air)
]
sources = [
mp.Source(mp.GaussianSource(0.25, fwidth=0.20), component=mp.Ey, center=mp.Vector3(-0.5, 0, 0))
]
symmetries = [mp.Mirror(mp.Y,-1), mp.Mirror(mp.Z,+1)]
sim = mp.Simulation(
cell_size=cell_size,
resolution=resolution,
boundary_layers=boundary_layers,
dimensions=dimensions,
geometry=geometry,
sources=sources,
symmetries=symmetries
)
freg = mp.FluxRegion(size=mp.Vector3(0, 1.0, 0.5), center=mp.Vector3(0.5, 0, 0))
trans = sim.add_flux(0.25, 0.20, 100, freg)
sim.run(
mp.in_volume(
mp.Volume(center=mp.Vector3(0, 0, 0),
size=mp.Vector3(5.00, 4.50, 0)),
mp.at_end(mp.output_epsilon, mp.output_efield_y)),
mp.after_sources(mp.Harminv(mp.Ey, mp.Vector3(), 0.25, 0.2)),
until_after_sources=100
)
sim.display_fluxes(trans)
簡単にコードの内容を見る
座標や大きさは、MEEPのベクトルmp.Vector3(x, y, z)を用いて指定する。
計算領域と分解能、境界条件、次元を決めて、物体と光源を置いて、シミュレーションを実行している。
- cell_size(単位はμm)で計算領域を決める。
- resolution(単位は1μmあたりのピクセル数)で分解能を決める。
- boundary_layersで境界条件を決める。 mp.PML(1)だと厚さ1μmの完全吸収層を壁一面に置いたことになる。
- dimensionsで次元を決める。
- geometryで物体を置く。直方体はBlockで、円柱はCylinderで表す。 materialに空気を指定すると穴が開く。
- sourcesで光源を置く。周波数単位はμmの逆数。componentで偏光を指定する。 mp.Eyなら電場がy方向を向いている。
- symmetriesで対称性を指定する。 これを指定すると、結果は変わらないが、計算時間が短くなる。
- これらをmp.Simulationに設定して、シミュレーションを構成する。
- sim.add_fluxでシミュレーションに検出器を追加する。
- runでシミュレーションを実行する。どの時点を結果とするかを指定する。
- display_fluxesで検出器の結果を表示する。
下図のような状況を用意したことになる。
実行する
書いたコードを実行する。
python test01.py | tee test01.out
成功すれば、3つのファイル(***.out, ***.h5, ***.h5)が作成される。 outファイルにスペクトル情報が、h5ファイルに物体と電磁場の情報が保存されている。