· 

WSLでpymeep(2)

まずはGUIを使えるようにする。

ここ(自分とこだけど)を参考に、VcXsrvの設定は終わっているので、WSLの環境内でやることをやっていく。

で、

sudo apt install  x11-apps x11-utils x11-xserver-utils dbus-x11

として、.profileに

export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0

を追加。

xeyesなどが動くことを確認する。

 

で、どうせ後から言われるのでwgetをインストール

sudo apt install wget

 

作業フォルダを作成する

mkdir work

mkdir work/meep

mkdir work/meep/study1

作業フォルダに移動する

cd work/meep/study1

VSCodeを起動する

code .

こんなこと聞いてくるので、最も信用できない自分を信頼することにする。

とりあえずmatplotlibが動くことを確認したいので、study1.pyを新規作成して内容は以前と同じ

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3.  
  4. t=np.arange(0,1,0.001)
  5. a=np.sin(2*np.pi*10*t)
  6.  
  7. plt.plot(t, a)
  8. plt.savefig('figure01.jpg')
  9. plt.show()

で、VSCodeに実行ボタンが出ない、すなわち拡張機能がインストールされていないので、インストールする。ついでに日本語PACKもインストールする。

で、ウィンドウの再読み込みを要求されるので言われるがままに、、、

で、左下のpythonなんちゃらをおして、上のほうで

python x.x.x 64bit('mp':conda)

を選択。

で、実行ボタンを押す。するとmatplotlibがないって言われるので、そのままターミナルで(プロンプトの左端が「(mp)」ってなっていることを確認して)、

conda install matplotlib

おわったら、再度、実行ボタンを押すと、プロットウィンドウが現れて、まずはめでたしめでたし。

 と思ったらコンソールにめっちゃエラー出ている。どうするか、、、

QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'

xkbcommon: ERROR: failed to add default include path /usr/share/X11/xkb

Qt: Failed to create XKB context!

Use QT_XKB_CONFIG_ROOT environmental variable to provide an additional search path, add ':' as separator to provide several search paths and/or make sure that XKB configuration data directory contains recent enough contents, to update please see http://cgit.freedesktop.org/xkeyboard-config/ .

libGL error: No matching fbConfigs or visuals found

libGL error: failed to load driver: swrast

 

まぁおいといて、

ここからアンテナ放射パターンを計算する例を持ってくる。

  1. from __future__ import division
  2.  
  3. import meep as mp
  4. import math
  5. import numpy as np
  6. import matplotlib.pyplot as plt
  7.  
  8. resolution = 50  # pixels/um
  9.  
  10. sxy = 4
  11. dpml = 1
  12. cell = mp.Vector3(sxy+2*dpml,sxy+2*dpml)
  13.  
  14. pml_layers = [mp.PML(dpml)]
  15.  
  16. fcen = 1.0
  17. df = 0.4
  18. src_cmpt = mp.Ez
  19. sources = [mp.Source(src=mp.GaussianSource(fcen,fwidth=df),
  20.                     center=mp.Vector3(),
  21.                     component=src_cmpt)]
  22.  
  23. if src_cmpt == mp.Ex:
  24.     symmetries = [mp.Mirror(mp.X,phase=-1),
  25.                   mp.Mirror(mp.Y,phase=+1)]
  26. elif src_cmpt == mp.Ey:
  27.     symmetries = [mp.Mirror(mp.X,phase=+1),
  28.                   mp.Mirror(mp.Y,phase=-1)]
  29. elif src_cmpt == mp.Ez:
  30.     symmetries = [mp.Mirror(mp.X,phase=+1),
  31.                   mp.Mirror(mp.Y,phase=+1)]
  32.  
  33. sim = mp.Simulation(cell_size=cell,
  34.                     resolution=resolution,
  35.                     sources=sources,
  36.                     symmetries=symmetries,
  37.                     boundary_layers=pml_layers)
  38.  
  39. nearfield_box = sim.add_near2far(fcen, 0, 1,
  40.                                  mp.Near2FarRegion(center=mp.Vector3(0,+0.5*sxy), size=mp.Vector3(sxy,0), weight=+1),
  41.                                  mp.Near2FarRegion(center=mp.Vector3(0,-0.5*sxy), size=mp.Vector3(sxy,0), weight=-1),
  42.                                  mp.Near2FarRegion(center=mp.Vector3(+0.5*sxy,0), size=mp.Vector3(0,sxy), weight=+1),
  43.                                  mp.Near2FarRegion(center=mp.Vector3(-0.5*sxy,0), size=mp.Vector3(0,sxy), weight=-1))
  44.  
  45. flux_box = sim.add_flux(fcen, 0, 1,
  46.                         mp.FluxRegion(center=mp.Vector3(0,+0.5*sxy), size=mp.Vector3(sxy,0), weight=+1),
  47.                         mp.FluxRegion(center=mp.Vector3(0,-0.5*sxy), size=mp.Vector3(sxy,0), weight=-1),
  48.                         mp.FluxRegion(center=mp.Vector3(+0.5*sxy,0), size=mp.Vector3(0,sxy), weight=+1),
  49.                         mp.FluxRegion(center=mp.Vector3(-0.5*sxy,0), size=mp.Vector3(0,sxy), weight=-1))
  50.  
  51. sim.run(until_after_sources=mp.stop_when_fields_decayed(50, src_cmpt, mp.Vector3(), 1e-8))
  52.  
  53. near_flux = mp.get_fluxes(flux_box)[0]
  54.  
  55. r = 1000/fcen      # half side length of far-field square box OR radius of far-field circle
  56. res_ff = 1         # resolution of far fields (points/μm)
  57. far_flux_box = (nearfield_box.flux(mp.Y, mp.Volume(center=mp.Vector3(y=r), size=mp.Vector3(2*r)), res_ff)[0]
  58.                - nearfield_box.flux(mp.Y, mp.Volume(center=mp.Vector3(y=-r), size=mp.Vector3(2*r)), res_ff)[0]
  59.                + nearfield_box.flux(mp.X, mp.Volume(center=mp.Vector3(r), size=mp.Vector3(y=2*r)), res_ff)[0]
  60.                - nearfield_box.flux(mp.X, mp.Volume(center=mp.Vector3(-r), size=mp.Vector3(y=2*r)), res_ff)[0])
  61.  
  62. npts = 100         # number of points in [0,2*pi) range of angles
  63. angles = 2*math.pi/npts*np.arange(npts)
  64.  
  65. E = np.zeros((npts,3),dtype=np.complex128)
  66. H = np.zeros((npts,3),dtype=np.complex128)
  67. for n in range(npts):
  68.     ff = sim.get_farfield(nearfield_box,
  69.                           mp.Vector3(r*math.cos(angles[n]),
  70.                                      r*math.sin(angles[n])))
  71.     E[n,:] = [np.conj(ff[j]) for j in range(3)]
  72.     H[n,:] = [ff[j+3] for j in range(3)]
  73.  
  74. Px = np.real(E[:,1]*H[:,2]-E[:,2]*H[:,1])
  75. Py = np.real(E[:,2]*H[:,0]-E[:,0]*H[:,2])
  76. Pr = np.sqrt(np.square(Px)+np.square(Py))
  77.  
  78. far_flux_circle = np.sum(Pr)*2*np.pi*r/len(Pr)
  79.  
  80. print("flux:, {:.6f}, {:.6f}, {:.6f}".format(near_flux,far_flux_box,far_flux_circle))
  81.  
  82. ax = plt.subplot(111, projection='polar')
  83. ax.plot(angles,Pr/max(Pr),'b-')
  84. ax.set_rmax(1)
  85. ax.set_rticks([0,0.5,1])
  86. ax.grid(True)
  87. ax.set_rlabel_position(22)
  88. plt.show()

まぁ、何も考えずに実行する。

ちなみに、ターミナルで、プロンプトの左端が(base)となっていても、Pythonインタープリタを('mp':conda)って選んでいれば conda activate mpは勝手にやってくれる。

ソースコードの18行目を

src_cmpt = mp.Ex

やら

src_cmpt = mp.Ey

やらやってみる

見たことあるやつになりました。