MPB : Photonic Band Structure
유전체 박막 [1D.ctl]
(define EPS 4) ; dielectric constant = n*n
(define width 0.5)
(set! default-material air)
(set! geometry-lattice (make lattice (size 1 1 no-size)
(basis1 0.5 0)
(basis2 0 0.5)))
(set! geometry (list (make block
(material (make dielectric (epsilon EPS)))
(center 0 0 0) (size width infinity infinity))))
(set! k-points (list (vector3 -0.5 0 0)
(vector3 0.5 0 0)))
(set! k-points (interpolate 19 k-points))
(set! resolution 32)
(set! num-bands 10)
(run-te (output-at-kpoint (vector3 (/ -3) (/ 3) 0) output-hfield-z output-efield-x output-efield-y))
(run-tm (output-at-kpoint (vector3 0 0 0) output-efield-z output-hfield-x output-hfield-y))
2차원 계산 예제
2차원 사각격자 막대 구조 [Rect_rod.ctl]
(define-param EPS 11)
(define-param R-NORM 0.35)
(define MAT (make dielectric (epsilon EPS)))
(set! default-material air)
(set! geometry-lattice (make lattice (size 1 1 no-size) (basis1 0.5 0) (basis2 0 0.5)))
(set! geometry (list (make cylinder (center 0 0 0) (radius R-NORM) (height infinity) (material MAT))))
(set! k-points (list (vector3 0 0 0) (vector3 0.5 0 0) (vector3 0.5 0.5 0) (vector3 0 0 0)))
(set! k-points (interpolate 4 k-points))
(set! resolution 32)
(set! num-bands 10)
(run-te fix-hfield-phase output-hfield-z)
(run-tm fix-efield-phase output-efield-z)
2차원 삼각격자 구멍 구조 [Tri_air_hole.ctl]
(define-param EPS 11)
(define-param R-NORM 0.35)
(define MAT (make dielectric (epsilon EPS)))
(set! default-material MAT)
(set! geometry-lattice (make lattice (size 1 1 no-size)
(basis1 (/ (sqrt 3) 2) 0.5)
(basis2 (/ (sqrt 3) 2) -0.5)))
(set! geometry (list (make cylinder
(center 0 0 0) (radius R-NORM) (height infinity) (material air) )))
(set! k-points (list (vector3 0 0 0)
(vector3 0 0.5 0)
(vector3 (/ -3) (/ 3) 0)
(vector3 0 0 0)))
(set! k-points (interpolate 4 k-points))
(set! resolution 32)
(set! num-bands 10)
(run-te fix-hfield-phase output-hfield-z)
(run-tm fix-efield-phase output-efield-z)
3차원 계산 예제 (2차원 박막 구조)
2차원 삼각격자 광결정 박막 구조 밴드 계산 (TE-like 밴드) [3DTEtriangle.ctl]
(define SL-t 0.6) ; thickness of slab
(define MA (* 3.4 3.4)) ; dielectric constant of slab
(define r 0.4) ; radius of hole
(define SC-h 4) ; height of supercell
(define LOW 1) ; low index
(set! geometry-lattice (make lattice (size 1 1 SC-h)
(basis1 (/ (sqrt 3) 2) 0.5)
(basis2 (/ (sqrt 3) 2) -0.5)))
(set! geometry (append geometry(list
(make block
(material (make dielectric (epsilon MA)))
(center 0 0 0) (size 1 1 SL-t) ))))
(set! geometry (append geometry (list (make cylinder
(material air)
(center 0 0 0) (radius r) (height SL-t) ))))
(set! k-points (list (vector3 0 0 0) ; Gamma
(vector3 0 0.5 0) ; M
(vector3 (/ -3) (/ 3) 0) ; K
(vector3 0 0 0) )) ; Gamma
(set! k-points (interpolate 8 k-points))
(set! grid-size (vector3 32 32 (* 32 SC-h)))
(set! num-bands 15)
(set! eigensolver-block-size 1)
(run-zeven) ; for just band calculation
;(run-zeven (output-at-kpoint list output-hfield-z)) ; for field calculation
2차원 삼각격자 광결정 막대 구조 밴드 계산 (TM-like 밴드) [3DrTMsqure.ctl]
(define SL-t (/ 280 550)) ; thickness of slab
(define MA (* 3.2 3.2)) ; dielectric constant of slab
(define r 0.4) ; radius of hole
(define SC-h 4) ; height of supercell
(define LOW 1) ; low index
(set! geometry-lattice (make lattice (size 1 1 SC-h)
(basis1 0 0.5)
(basis2 0.5 0) ))
(set! geometry (append geometry (list (make cylinder
(material (make dielectric (epsilon MA)))
(center 0 0 0) (radius r) (height SL-t) ))))
(set! k-points (list (vector3 0 0 0) ; gamma
(vector3 0.5 0 0) ; X
(vector3 0.5 0.5 0) ; M
(vector3 0 0 0) )) ; gamma
(set! k-points (interpolate 9 k-points))
(set! grid-size (vector3 32 32 (* 32 SC-h)))
(set! num-bands 15)
(set! eigensolver-block-size 1)
(run-odd ; even for TE, odd for TM
(output-at-kpoint (vector3 0 0 0) output-dpwr) ; eE^2 at gamma
(output-at-kpoint (vector3 0.5 0 0) output-dpwr) ; eE^2 at X
(output-at-kpoint (vector3 0.5 0.5 0) output-dpwr) ; eE^2 at M
(output-at-kpoint (vector3 0 0 0) fix-efield-phase output-efield-z) ; Ez at gamma
(output-at-kpoint (vector3 0.5 0 0) fix-efield-phase output-efield-z) ; Ez at X
(output-at-kpoint (vector3 0.5 0.5 0) fix-efield-phase output-efield-z)) ; Ez at M
2차원 삼각격자 광결정 박막 구조 도파로 밴드 계산 [Line-defect-slab.ctl]
(define-param h 0.571) ; the thickness of the slab
(define-param eps 12.25) ; the dielectric constant of the slab
(define-param loweps 1.0) ; the dielectric constant of the clad
(define-param r 0.312) ; the radius of the holes
(define-param supercell-y 7) ; the (odd) number of lateral supercell periods
(define-param supercell-h 4) ; height of the supercell
; triangular lattice with supercell:
(set! geometry-lattice (make lattice (size 1 supercell-y supercell-h)
(basis1 (/ (sqrt 3) 2) 0.5)
(basis2 (/ (sqrt 3) 2) -0.5)))
(set! geometry
(list (make block (material (make dielectric (epsilon loweps)))
(center 0 0 (* 0.25 supercell-h))
(size infinity infinity (* 0.5 supercell-h)))
(make block (material (make dielectric (epsilon eps)))
(center 0) (size infinity infinity h))
(make cylinder (material air)
(center 0) (radius r) (height supercell-h))))
(set! geometry
(append
; duplicate the bulk crystal rods over the supercell:
(geometric-objects-lattice-duplicates geometry 1 1 4)
; add a rod of slab, to erase a row of air rods and form a waveguide:
(list
(make cylinder (center 0) (radius r) (height h)
(material (make dielectric (epsilon eps)))))))
(define Gamma (vector3 0 0 0 ))
(define K' (lattice->reciprocal (vector3 0.5 0 0))) ; edge of Brillouin zone.
(set! k-points (interpolate 4 (list Gamma K')))
(set! num-bands 20)
(set-param! resolution (vector3 16 16 8))
(run-zeven
(output-at-kpoint (list-ref k-points (quotient (length k-points) 2)) fix-hfield-phase output-hfield-z))
(display-eigensolver-stats)
1D 나노빔 구조 밴드 계산 [nanobeam.ctl]
(define-param r 0.28) ; radius of air hole
(define-param width 1.2) ; width of nanobeam
(define SL-t 0.625) ; thickness of slab
(define Sy 8) ; y-size of supercell
(define Sz 4) ; z-size of supercell
(define LOW 1) ; low index
(define MA (* 3.4 3.4)) ; dielectric constant of slab
(set! geometry-lattice (make lattice (size 1 Sy Sz)
(basis1 0 0.5)
(basis2 0.5 0) ))
(set! geometry (append geometry(list
(make block
(material (make dielectric (epsilon MA)))
(center 0 0 0) (size 1 width SL-t) ))))
(set! geometry (append geometry (list (make cylinder
(material air)
(center 0 0 0) (radius r) (height SL-t) ))))
(set! k-points (list (vector3 0.2 0 0)
(vector3 0.5 0 0) ))
(set! k-points (interpolate 31 k-points))
(set! grid-size (vector3 32 (* 32 Sy) (* 32 Sz)))
(set! num-bands 5)
(set! eigensolver-block-size 1)
(run-even) ;even TE odd:TM
mpb 실행
id@com:~/# mpb vector.ctl >& vector.out // running the program
id@com:~/# mpb vector.ctl >& vector.out & // background running the program
계산 결과 frequency 정보 얻기 (dispersion or bandgap position)
id@com:~/# grep freqs vector.out > freqs.dat // band structure
id@com:~/# grep Gap vector.out > gap.dat // finding gap
Band structure 결과
3D band structure map (square lattice)[1]
2D 계산에서 이미지 처리 명령어
계산 결과 데이터 확장
id@com:~/# mpb-data -m 3 -r -n 32 epsilon.h5
id@com:~/# mpb-data -m 3 -r -n 32 h.k*.b*.te.h5 // for TE
id@com:~/# mpb-data -m 3 -r -n 32 e.k*.b*.tm.h5 // for TM
참고 : mpb-data 옵션 정리.
-m 정수 : data array를 모든 방향으로 '정수'배 만큼 주기를 확대 (예: epsilon.h5 를 x, y, z 방향으로 정수배 만큼 확장
특정 방향으로 확장의 경우 m 대신 그 방향에 해당하는 X, Y, Z 사용 : -X 3 (x 방향으로만 3배)
-r : 삼각 격자를 직각 좌표계로 표현하도록 변환
-n 정수 : data mesh를 '정수'로 변환.
계산 결과 그림 얻기
id@com:~/# h5topng epsilon.h5:data-new
id@com:~/# h5topng -C epsilon.h5:data-new -c bluered -Z -d z.r-new h.k*.b*.te.h5 // for TE Hz field
id@com:~/# h5topng -C epsilon.h5:data-new -c bluered -Z -d z.r-new e.k*.b*.tm.h5 // for TM Ez field
만약 field intensity가 지글지글 나온다면 field의 real part 가 아닌 imaginary part를 봐야 함.
id@com:~/# h5topng -C epsilon.h5:data-new -c bluered -Z -d z.i-new h.k*.b*.te.h5 // for TE Hz field
id@com:~/# h5topng -C epsilon.h5:data-new -c bluered -Z -d z.i-new e.k*.b*.tm.h5 // for TM Ez field
3D 계산에서 명령어
계산 결과 데이터 확장
id@com:~/# mpb-data -m 3 -r -n 32 epsilon.h5 // multiple epsilon set
id@com:~/# mpb-data -m 3 -r -n 32 h.k*.b*.z.zeven.h5 // for TE-like Hz field
id@com:~/# mpb-data -m 3 -r -n 32 e.k*.b*.z.zodd.h5 // for TM-like Ez field
id@com:~/# mpb-data -m 3 -r -n 32 e.k*.b*.x.zeven.h5 // for TE-like Ex field
id@com:~/# mpb-data -m 3 -r -n 32 dpwr.k*.b*.zeven.h5 // for TE-like eE^2
계산 결과 그림 얻기
1. 구조 그림 얻기
id@com:~/# h5topng -0z0 -Zc bluered -d z.r-new epsilon.h5:data-new // draw epsilon structure
2. 여러 band-edge point에서 field를 얻으려면 ctl 코드 내에 아래쪽에 편집을 아래와 같이 한다
(run-even (output-at-kpoint (vector3 0 0 0) output-dpwr) ; gamma point
(output-at-kpoint (vector3 0.5 0 0) output-dpwr) ; X-point
(output-at-kpoint (vector3 0.5 0.5 0) output-dpwr)) ; M-point
(run-even (output-at-kpoint (vector3 0 0 0) fix-hfield-phase output-hfield-z) ; gamma point
(output-at-kpoint (vector3 0.5 0 0) fix-hfield-phase output-hfield-z) ; X-point
(output-at-kpoint (vector3 0.5 0.5 0) fix-hfield-phase output-hfield-z)) ; M-point
3. field 그림 얻기
Ex, Ey, Ez, Hz, Hy, Hz field 의 경우
id@com:~/# h5topng -C epsilon.h5:data-new -0z0 -Zc bluered -d z.r-new h.k*.b*.z.zeven.h5 // for TE-like Hz field
id@com:~/# h5topng -C epsilon.h5:data-new -0z0 -Zc bluered -d z.r-new e.k*.b*.z.zodd.h5 // for TM-like Ez field
id@com:~/# h5topng -C epsilon.h5:data-new -0z0 -Zc bluered -d x.r-new e.k*.b*.x.zeven.h5 // for TE-like Ex field
만약 field intensity가 지글지글 나온다면 field의 real part 가 아닌 imaginary part를 봐야 함.
id@com:~/# h5topng -C epsilon.h5:data-new -0z0 -Zc bluered -d z.i-new h.k*.b*.z.zeven.h5 // for TE-like Hz field
id@com:~/# h5topng -C epsilon.h5:data-new -0z0 -Zc bluered -d z.i-new e.k*.b*.z.zodd.h5 // for TM-like Ez field
참고 3D h5topng 옵션들
-S int : increase the size of data to int times
-C epsilon.h5 : compare to epsilon.h5 (to use the data epsilon.h5 for the background)
data-new : draw the newer data (in this multiplied data)
-0z0 : Shift the origin of the slice coordinates to the dataset center (자르는 방향 및 단면 위치)
so that e.g. -0 -x 0 or -0x0
returns the central x plane of the dataset instead of the edge x plane.
-c : colormap (ex. bluered or dkbluered for E- H- field, gray or hot for intensity, jet or hsv for log-scale data)
-Z : center color is made white
-d : field 성분 옵션 Hz의 real part 경우 z.r-new, Ex의 imaginary part의 경우 x.i-new로 표시
dpwr(eE2),hpwr(H2) 의 경우
id@com:~/# h5topng -C epsilon.h5:data-new -0z0 -c jet dpwr.k*.b*.zeven.h5 // draw field pattern
or-0y0
or-0x0
id@com:~/# h5topng -C epsilon.h5:data-new -0z0 -c jet hpwr.k*.b*.zeven.h5 // draw field pattern
or-0y0
or-0x0
유용한 사이트
관련 homepage : MIT MPB bands