コピペコード
Windowsで使うMEEP入門

ソースコードを書いて実行する

MEEPの簡単なソースコードを作成し、実行してみることで、大まかな流れをつかむ。

作業ディレクトリ

  1. 作業ディレクトリを作ることにする。 mkdir meep
  2. 作業ディレクトリに移動する。 cd meep
  3. このディレクトリで作業することにする。

エディタ

Linuxの基本的なエディタは「vi [ファイル名]」とコマンド入力すると起動できる。 しかし、LinuxにもCUI環境にもなれていないので、これは使わずにWindowsのVSCodeを使うことにする。

  1. WindowsへVSCodeをインストールする。
  2. VSCodeを開く。
  3. [File] > [Open folder...]をクリック。
  4. 上部の検索ボックスに\\wsl$と入力してエンター。
  5. [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)を用いて指定する。

計算領域と分解能、境界条件、次元を決めて、物体と光源を置いて、シミュレーションを実行している。

  1. cell_size(単位はμm)で計算領域を決める。
  2. resolution(単位は1μmあたりのピクセル数)で分解能を決める。
  3. boundary_layersで境界条件を決める。 mp.PML(1)だと厚さ1μmの完全吸収層を壁一面に置いたことになる。
  4. dimensionsで次元を決める。
  5. geometryで物体を置く。直方体はBlockで、円柱はCylinderで表す。 materialに空気を指定すると穴が開く。
  6. sourcesで光源を置く。周波数単位はμmの逆数。componentで偏光を指定する。 mp.Eyなら電場がy方向を向いている。
  7. symmetriesで対称性を指定する。 これを指定すると、結果は変わらないが、計算時間が短くなる。
  8. これらをmp.Simulationに設定して、シミュレーションを構成する。
  9. sim.add_fluxでシミュレーションに検出器を追加する。
  10. runでシミュレーションを実行する。どの時点を結果とするかを指定する。
  11. display_fluxesで検出器の結果を表示する。

下図のような状況を用意したことになる。

実行する

書いたコードを実行する。

python test01.py | tee test01.out

成功すれば、3つのファイル(***.out, ***.h5, ***.h5)が作成される。 outファイルにスペクトル情報が、h5ファイルに物体と電磁場の情報が保存されている。