まずは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を新規作成して内容は以前と同じ
- import matplotlib.pyplot as plt
- import numpy as np
- t=np.arange(0,1,0.001)
- a=np.sin(2*np.pi*10*t)
- plt.plot(t, a)
- plt.savefig('figure01.jpg')
- 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
まぁおいといて、
ここからアンテナ放射パターンを計算する例を持ってくる。
- from __future__ import division
- import meep as mp
- import math
- import numpy as np
- import matplotlib.pyplot as plt
- resolution = 50 # pixels/um
- sxy = 4
- dpml = 1
- cell = mp.Vector3(sxy+2*dpml,sxy+2*dpml)
- pml_layers = [mp.PML(dpml)]
- fcen = 1.0
- df = 0.4
- src_cmpt = mp.Ez
- sources = [mp.Source(src=mp.GaussianSource(fcen,fwidth=df),
- center=mp.Vector3(),
- component=src_cmpt)]
- if src_cmpt == mp.Ex:
- symmetries = [mp.Mirror(mp.X,phase=-1),
- mp.Mirror(mp.Y,phase=+1)]
- elif src_cmpt == mp.Ey:
- symmetries = [mp.Mirror(mp.X,phase=+1),
- mp.Mirror(mp.Y,phase=-1)]
- elif src_cmpt == mp.Ez:
- symmetries = [mp.Mirror(mp.X,phase=+1),
- mp.Mirror(mp.Y,phase=+1)]
- sim = mp.Simulation(cell_size=cell,
- resolution=resolution,
- sources=sources,
- symmetries=symmetries,
- boundary_layers=pml_layers)
- nearfield_box = sim.add_near2far(fcen, 0, 1,
- mp.Near2FarRegion(center=mp.Vector3(0,+0.5*sxy), size=mp.Vector3(sxy,0), weight=+1),
- mp.Near2FarRegion(center=mp.Vector3(0,-0.5*sxy), size=mp.Vector3(sxy,0), weight=-1),
- mp.Near2FarRegion(center=mp.Vector3(+0.5*sxy,0), size=mp.Vector3(0,sxy), weight=+1),
- mp.Near2FarRegion(center=mp.Vector3(-0.5*sxy,0), size=mp.Vector3(0,sxy), weight=-1))
- flux_box = sim.add_flux(fcen, 0, 1,
- mp.FluxRegion(center=mp.Vector3(0,+0.5*sxy), size=mp.Vector3(sxy,0), weight=+1),
- mp.FluxRegion(center=mp.Vector3(0,-0.5*sxy), size=mp.Vector3(sxy,0), weight=-1),
- mp.FluxRegion(center=mp.Vector3(+0.5*sxy,0), size=mp.Vector3(0,sxy), weight=+1),
- mp.FluxRegion(center=mp.Vector3(-0.5*sxy,0), size=mp.Vector3(0,sxy), weight=-1))
- sim.run(until_after_sources=mp.stop_when_fields_decayed(50, src_cmpt, mp.Vector3(), 1e-8))
- near_flux = mp.get_fluxes(flux_box)[0]
- r = 1000/fcen # half side length of far-field square box OR radius of far-field circle
- res_ff = 1 # resolution of far fields (points/μm)
- far_flux_box = (nearfield_box.flux(mp.Y, mp.Volume(center=mp.Vector3(y=r), size=mp.Vector3(2*r)), res_ff)[0]
- - nearfield_box.flux(mp.Y, mp.Volume(center=mp.Vector3(y=-r), size=mp.Vector3(2*r)), res_ff)[0]
- + nearfield_box.flux(mp.X, mp.Volume(center=mp.Vector3(r), size=mp.Vector3(y=2*r)), res_ff)[0]
- - nearfield_box.flux(mp.X, mp.Volume(center=mp.Vector3(-r), size=mp.Vector3(y=2*r)), res_ff)[0])
- npts = 100 # number of points in [0,2*pi) range of angles
- angles = 2*math.pi/npts*np.arange(npts)
- E = np.zeros((npts,3),dtype=np.complex128)
- H = np.zeros((npts,3),dtype=np.complex128)
- for n in range(npts):
- ff = sim.get_farfield(nearfield_box,
- mp.Vector3(r*math.cos(angles[n]),
- r*math.sin(angles[n])))
- E[n,:] = [np.conj(ff[j]) for j in range(3)]
- H[n,:] = [ff[j+3] for j in range(3)]
- Px = np.real(E[:,1]*H[:,2]-E[:,2]*H[:,1])
- Py = np.real(E[:,2]*H[:,0]-E[:,0]*H[:,2])
- Pr = np.sqrt(np.square(Px)+np.square(Py))
- far_flux_circle = np.sum(Pr)*2*np.pi*r/len(Pr)
- print("flux:, {:.6f}, {:.6f}, {:.6f}".format(near_flux,far_flux_box,far_flux_circle))
- ax = plt.subplot(111, projection='polar')
- ax.plot(angles,Pr/max(Pr),'b-')
- ax.set_rmax(1)
- ax.set_rticks([0,0.5,1])
- ax.grid(True)
- ax.set_rlabel_position(22)
- plt.show()
まぁ、何も考えずに実行する。
ちなみに、ターミナルで、プロンプトの左端が(base)となっていても、Pythonインタープリタを('mp':conda)って選んでいれば conda activate mpは勝手にやってくれる。
ソースコードの18行目を
src_cmpt = mp.Ex
やら
src_cmpt = mp.Ey
やらやってみる
見たことあるやつになりました。
コメントをお書きください