[Started by Maruoka, 2018/10/24]
[Updated by Maruoka, 2018/12/29]
 
*index [#e16fd6bb]
#contents

*How to install [#ldc78cdd]
First of all, let's install Anaconda.
From [[The websit of Anaconda:https://www.anaconda.com/download/]], please download the installer of the series of Python3.x .
Since the installer is of the file of .sh, execute it as below.
 $ bash [download-folder]/Anaconda3-5.2.0-Linux-x86_64.sh
Then, let's install pymeep ([https://meep.readthedocs.io/en/latest/Installation/ ref] )
Execute the command below.
 $ conda create -n mp -c chogan -c conda-forge pymeep
All setup is finished.
*How to execute [#padb0b5f]
Activate the system as below.
 $ source activate mp
Execute the file as below.Please rename hogehoge.py as what you name it.
 (mp) $ python hogehoge.py
You can get sample source from Github.[https://github.com/stevengj/meep/blob/master/python/examples/wvg-src.py example]
If you want to deactivate the system, do as below.
 (mp) $ source deactivate

*parallelization of MEEP [#h659d054]
***installation([https://meep.readthedocs.io/en/latest/Installation/#mpi ref]) [#v7b0b7df]
In order to install pymeep which support parallel calculation, execute the following command.
 $ conda create -n pmp -c chogan -c conda-forge pymeep-parallel
***Execution [#ld3fff3a]
Activate pymeep which support parallel calculation by following command
 $ source activate pmp
Programs run with following command.
 $ mpirun -np 4 python <script_name>
"-np" indicate how many processors will run. In this case, 4 processors run simultaneously.


*How to edit the HDF5 file ? [#qe50ab81]
The h5py package can be used for editing HDF5 file in python.
Install it by the following command.
 apt-get install python-h5py
h5py is already installed on flex and tubes.

On maruoka's WSL,
 pip install h5py
doesn't work saying
 ImportError: No module named h5py


*source for incident light [#r32309cc]
**left-handed circularly polarized light[#u95702e4]
We can modify the phase of source by the amplitude.

 (set! sources
       (list
        (make source
          (src (make continuous-src (frequency (/ 1 7))))
          (component Ex)
          (center 0 0 8)
          (size 50 50 0)
          )
        (make source
          (src (make continuous-src (frequency (/ 1 7))))
          (component Ey)
          (center 0 0 8)
          (size 50 50 0)
          (amplitude (exp (* 0+1i 1.570796327)))
          )
        )
       )



**right-handed circularly polarized light [#u95702e4]

 (set! sources
       (list
        (make source
          (src (make continuous-src (frequency (/ 1 7))))
          (component Ey)
          (center 0 0 8)
          (size 50 50 0)
          )
        (make source
          (src (make continuous-src (frequency (/ 1 7))))
          (component Ex)
          (center 0 0 8)
          (size 50 50 0)
          (amplitude (exp (* 0+1i 1.570796327)))
          )
        )
       )


**the light linearly polarized at x radian[#u95702e4]

 (set! sources
       (list
        (make source
          (src (make continuous-src (frequency (/ 1 7))))
          (component Ex)
          (center 0 0 8)
          (size 50 50 0)
          (amplitude (cos x))
          )
        (make source
          (src (make continuous-src (frequency (/ 1 7))))
          (component Ey)
          (center 0 0 8)
          (size 50 50 0)
          (amplitude (sin x))
          )
        )
       )
**the light at oblique incident angle [#y9a5c654]
There are three ways to implement oblique incident light.

***Bloch's periodic boundary with modifying phase of the source[#s8084013]
TM wave just before total internal reflection.
 (define (pw-amp k x0) (lambda (x)
                        (exp (* 0+1i (vector3-dot k (vector3+ x x0))))))
 (define-param theta-deg 48)
 (define theta-rad (deg->rad theta-deg))
 (define epsilon1  2.25)
 (define epsilon2 1.25)
 (define-param fcen 0.8) ; pulse center frequency
 (define-param df 0.02) ; turn-on bandwidth
 (define-param kdir (vector3 (sin theta-rad) 0 (cos theta-rad))) ; direction of k (length is irrelevant)
 (define k (vector3-scale (* 2 pi fcen (sqrt epsilon1))
                         (unit-vector3 kdir))) ; k with correct length
 (set! pml-layers (list (make pml (thickness 2)(direction Z))))
 (set! k-point (vector3* (* fcen (sqrt epsilon1) ) (vector3 (sin theta-rad) 0 (cos theta-rad))))
 (set! geometry
       (list
        (make block
          (center 0 0 -2.5)
          (size 10 infinity 5)
          (material (make dielectric(epsilon epsilon1)))
          )
        (make block
          (center 0 0 2.5)
          (size 10 infinity 5)
          (material (make dielectric(epsilon epsilon2)))
          )
        )
       )
 (set! sources
       (list
        (make source
          (src (make continuous-src (frequency fcen) (fwidth df)))
          (component Ez) (center 0 0 -3) (size 10 0 0)
          (amp-func (pw-amp k (vector3 0 0 -3))))))
 (define-param T 40) ; run time
 (run-until T
            (to-appended "ez" (at-every 0.1 output-efield-z))
            (to-appended "ex" (at-every 0.1 output-efield-x))
            )
[http://flex.phys.tohoku.ac.jp/~maru/drive-open/pukiwiki/oblique-incident/main-ez.gif plot of Ez]




***two sources with modifying phase [#d178c899]
 ; This example creates an approximate Ez-polarized planewave in vacuum
 ; propagating at a 45-degree angle, by using a couple of current sources
 ; with amplitude exp(ikx) corresponding to the desired planewave.
 (define-param s 11) ; the size of the computational cell, not including PML
 (define-param dpml 1) ; thickness of PML layers
 (define sxy (+ s (* 2 dpml))) ; cell size, including PML
 (set! geometry-lattice (make lattice (size sxy sxy no-size)))
 (set! pml-layers (list (make pml (thickness dpml))))
 (set-param! resolution 10)
 ; pw-amp is a function that returns the amplitude exp(ik(x+x0)) at a
 ; given point x.  (We need the x0 because current amplitude functions
 ; in Meep are defined relative to the center of the current source,
 ; whereas we want a fixed origin.)  Actually, it is a function of k
 ; and x0 that returns a function of x ...
 (define (pw-amp k x0) (lambda (x)
   (exp (* 0+1i (vector3-dot k (vector3+ x x0))))))
 (define-param fcen 0.8) ; pulse center frequency
 (define-param df 0.02) ; turn-on bandwidth
 (define-param kdir (vector3 1 1)) ; direction of k (length is irrelevant)
 (define-param n 1) ; refractive index of material containing the source
 (define k (vector3-scale (* 2 pi fcen n)
                          (unit-vector3 kdir))) ; k with correct length
 (set! sources
       (list
        ; left
        (make source
 	 (src (make continuous-src (frequency fcen) (fwidth df)))
 	 (component Ez) (center (* -0.5 s) 0) (size 0 s)
 	 (amp-func (pw-amp k (vector3 (* -0.5 s) 0))))
        ; bottom
        (make source
 	 (src (make continuous-src (frequency fcen) (fwidth df)))
 	 (component Ez) (center 0 (* -0.5 s)) (size s 0)
 	 (amp-func (pw-amp k (vector3 0 (* -0.5 s)))))
        ))
 (define-param T 400) ; run time
 (run-until T (at-end output-efield-z))
[https://github.com/stevengj/meep/blob/master/scheme/examples/pw-source.ctl ref]

[http://flex.phys.tohoku.ac.jp/~maru/drive-open/pukiwiki/oblique-incident/double-sources/pw-source-ez.gif plot of Ez]

[http://flex.phys.tohoku.ac.jp/~maru/drive-open/pukiwiki/oblique-incident/double-sources/pw-source-single-ez.gif why we need two sources(plot of Ez when there is only one source)]

***array many point-sources [#bb9694c1]
http://article.gmane.org/gmane.comp.science.electromagnetism.meep.general/3058
 (define-param pi 3.14159265)
 (define-param dpml 3.0)
 (define-param len (+ 20 dpml))
 (define-param wid (+ 20 dpml))
 (set! geometry-lattice (make lattice (size len wid no-size))) 
 (define-param beam-waist 2.5) ; beam sigma (gaussian beam width)
 (define-param rotation-angle (* (/ 22.5 360) 2 pi)) ; Degrees if you like them
 (define-param source-points 60) ; should be a big number
 (define-param source-size (* 4 beam-waist)) ; should be bigger than beam-waist
 (define-param src_list (list ))
 (do
     ((
       r_0
       (/ source-size -2)
       (+ r_0 (/ source-size (- source-points 1)))
       ))
     ((> r_0 (/ source-size 2)))
                                         ;for r_0 = -source-size/2 : source- size/source-points : source-size/2
   (set! src_list (append src_list
                           (list (make source
                                  (src (make gaussian-src
                                         (wavelength 1)
                                         (width 3)
                                         ))
                                  (amplitude (exp (- 0 (/ (* r_0 r_0) (* 2 beam-waist beam-waist)))))
                                  (component Ez)
                                  (center (* r_0 (sin rotation-angle)) (* r_0 (cos rotation-angle)))
                                  ))
                          ))
   )
 (set! sources src_list)
 (set! pml-layers (list (make pml
                          (thickness dpml)
                          )))
 (set! resolution 10)
 (use-output-directory)
 (run-until (* 2 len)
            (to-appended "ez" (at-every 0.1 output-efield-z))
            )

[http://flex.phys.tohoku.ac.jp/~maru/drive-open/pukiwiki/oblique-incident/array.gif plot of Ez]

*material library [#ba28d968]
To use material library, add
 (include "/home/students/maru/meep/scheme/materials.scm")
at the beginning of your program.
This library only works at tube61, 62, 63.
For how to use the material library, check https://meep.readthedocs.io/en/latest/Materials/

You need to specify unit to use material library.
The default is 1000 micro meter.
In order to change the unit to  100 micro meter, add 
 (set! um-scale (* um-scale 0.05))

*Q&A [#b8d898d0]
**How thick PML should be ?[#l8406a8a]
In the document of PML by one of the the author of MEEP(http://math.mit.edu/~stevenj/18.369/pml.pdf)
 With PML, however, the constant factor is very good to start with, so experience shows that a simple quadratic or cubic turn-on of the PML absorption usually produces negligible refections for a PML layer of only half a wavelength or thinner [1,21]. 
 (Increasing the resolution also increases the resolution alos increase the effectiveness of the PML, because it approaches the exact wave equation.)

However, when the light coming at oblique incident angle, PML should be thicker.
The reflectivity of PML for incident angle at X can be represented as 
e^{-2*k*d*cos(X)*G}
for some constant G. d is the thickness of PML. k is the wavenumber.(Please check https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=477075 for details).
If X approaches to 90 degree, the efficiency of the absorbance of PML becomes really bad.


**PML shows reflectance. [#o360c5d3]
If you put dielectrics touching to the PML, please confirm you overlap the dielectrics and PML. Otherwise, PML is useless because PML is defined for the boundary of vaccum to absorb the light not for dielectrics.
It is implemented by just multiplying tensors on dielectric constants. So you need to overlap PML and dielectrics.  (Please check https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=477075 for details).

[http://flex.phys.tohoku.ac.jp/~maru/drive-open/pukiwiki/dielectrics_and_pml_touch_each_other.mp4 PML and Dielectrics touch each other but do not overlap]

[http://flex.phys.tohoku.ac.jp/~maru/drive-open/pukiwiki/dielectrics_and_pml_touch_each_other.ctl code]


** ERROR: Unbound variable: E-susceptibilities [#qd0361a8]
Following error occurs, when you try to use material library at FLEX or Tube60. 
 ERROR: Unbound variable: E-susceptibilities
Material library only works at tube61, 62, 63. 
Please go to tube61, 62, 63.

Front page   New Page list Search Recent changes   Help   RSS of recent changes