· 

WSLでpymeep(3)

meepはまたしばらく封印です。十数年前、、、インターフェースがschemeとC++だけで、schemeはポーランド記法がめんどくさい(当時の私見です)し、C++は何となくめんどくさい(当時の私見です。昔はコンパイラは有料でした。Linuxだと無料だけど、環境を整えるのも大変でした。)というイメージがあって、解説も英語だけだったので断念してたけど、今はpythonが使えてgoogle翻訳も優秀なので、とっかかりやすくなったので、やってみたけど、やっぱり断念。なぜかというと、electromagneticsシミュレーションを謳っているのにexampleが光学系ばっかりで、ヒントが少なすぎるから。

例えば、導体として銅を用いたダイポールアンテナの近傍解っていうと

  1. # -*- coding: utf-8 -*-
  2.  
  3. # From the Meep tutorial: plotting permittivity and fields of a straight waveguide
  4. from __future__ import division
  5.  
  6. import meep as mp
  7. from meep.materials import Cu
  8.  
  9. cell = mp.Vector3(32,32,0)
  10.  
  11. elm1 = mp.Block(mp.Vector3(6,1,0),center=mp.Vector3(-3.5,0,0),material=Cu)
  12. elm2 =mp.Block(mp.Vector3(6,1,0),center=mp.Vector3(3.5,0,0),material=Cu)
  13. geometry=[elm1,elm2]
  14.  
  15.  
  16. sources = [mp.Source(mp.ContinuousSource(frequency=0.15),
  17.                      component=mp.Ex,
  18.                      center=mp.Vector3(0,0,0))]
  19.  
  20. pml_layers = [mp.PML(1.0)]
  21.  
  22. resolution = 16
  23.  
  24. sim = mp.Simulation(cell_size=cell,
  25.                     boundary_layers=pml_layers,
  26.                     geometry=geometry,
  27.                     sources=sources,
  28.                     resolution=resolution)
  29.  
  30. sim.run(until=200)
  31.  
  32. import numpy as np
  33. import matplotlib.pyplot as plt
  34.  
  35. fig = plt.figure()
  36.  
  37. eps_data = sim.get_array(center=mp.Vector3(), size=cell, component=mp.Dielectric)
  38. fig.add_subplot(2, 2, 1)
  39. plt.imshow(eps_data.transpose(), interpolation='spline36', cmap='binary')
  40. plt.axis('off')
  41.  
  42. ex_data = sim.get_array(center=mp.Vector3(), size=cell, component=mp.Ex)
  43. fig.add_subplot(2, 2, 2)
  44. plt.imshow(eps_data.transpose(), interpolation='spline36', cmap='binary')
  45. plt.imshow(ex_data.transpose(), interpolation='spline36', cmap='RdBu', alpha=0.9)
  46. plt.axis('off')
  47.  
  48. ey_data = sim.get_array(center=mp.Vector3(), size=cell, component=mp.Ey)
  49. fig.add_subplot(2, 2, 3)
  50. plt.imshow(eps_data.transpose(), interpolation='spline36', cmap='binary')
  51. plt.imshow(ey_data.transpose(), interpolation='spline36', cmap='RdBu', alpha=0.9)
  52. plt.axis('off')
  53.  
  54. ez_data = sim.get_array(center=mp.Vector3(), size=cell, component=mp.Ez)
  55. fig.add_subplot(2, 2, 4)
  56. plt.imshow(eps_data.transpose(), interpolation='spline36', cmap='binary')
  57. plt.imshow(ez_data.transpose(), interpolation='spline36', cmap='RdBu', alpha=0.9)
  58. plt.axis('off')
  59.  
  60. plt.show()

でいけそう(銅の棒をごく狭いギャップを以て配置してその間に電界を定義する、、、デルタギャップ給電と言うらしい)、、、なのに、、、

(mp) root@r822:~/work/meep/study1# /home/hoge/miniconda3/envs/mp/bin/python /home/hoge/work/meep/study1/dipole_near.py

-----------

Initializing structure...

time for choose_chunkdivision = 0.00114012 s

Working in 2D dimensions.

Computational cell is 32 x 32 x 0 with resolution 16

     block, center = (-3.5,0,0)

          size (6,1,0)

          axes (1,0,0), (0,1,0), (0,0,1)

          dielectric constant epsilon diagonal = (1,1,1)

     block, center = (3.5,0,0)

          size (6,1,0)

          axes (1,0,0), (0,1,0), (0,0,1)

          dielectric constant epsilon diagonal = (1,1,1)

time for set_epsilon = 0.747213 s

lorentzian susceptibility: frequency=9.01728, gamma=3.47222

lorentzian susceptibility: frequency=4.27474, gamma=2.59146

lorentzian susceptibility: frequency=2.38498, gamma=0.851721

lorentzian susceptibility: frequency=0.234707, gamma=0.304878

drude susceptibility: frequency=1e-10, gamma=0.0241966

-----------

Meep progress: 5.25/200.0 = 2.6% done in 4.0s, 148.9s to go

on time step 168 (time=5.25), 0.0238979 s/step

Traceback (most recent call last):

  File "/home/hoge/work/meep/study1/dipole_near.py", line 30, in <module>

    sim.run(until=200)

  File "/home/hoge/miniconda3/envs/mp/lib/python3.9/site-packages/meep/simulation.py", line 3647, in run

    self._run_until(until, step_funcs)

  File "/home/hoge/miniconda3/envs/mp/lib/python3.9/site-packages/meep/simulation.py", line 2196, in _run_until

    self.fields.step()

  File "/home/hoge/miniconda3/envs/mp/lib/python3.9/site-packages/meep/__init__.py", line 3948, in step

    return _meep.fields_step(self)

RuntimeError: meep: simulation fields are NaN or Inf

 

Elapsed run time = 6.7734 s

 

となって、エラーで終わります。どこかで誘電率を負の数にしてやっている例があったので

elm1 = mp.Block(mp.Vector3(6,1,0),center=mp.Vector3(-3.5,0,0),material=mp.Medium(epsilon=-1e12))

elm2 =mp.Block(mp.Vector3(6,1,0),center=mp.Vector3(3.5,0,0),material=mp.Medium(epsilon=-1e12))

でやってみると、

ってなる。なんかそれらしい結果が出るっちゃ出るんだけど、あってるかどうかを確認する術がない。何か例があってそれを発展させて自身の課題を調査するって進め方ができないと、なかなか自信をもって次のステップには進めないなぁってことで、今回もmeepは断念。

Meep is a free and open-source software package for electromagnetics simulation via the finite-difference time-domain (FDTD) method spanning a broad range of applications.

って言ってるんだからもう少し、電磁界解析の例を増やしてほしいですよまじで。