MPB : Photonic Band Structure

개요

PWE(Plane-Wave-Expansion) 계산은 MIT 그룹의 MPB를 이용해서 계산한다. MPB 프로그램은 이미 linux computer[정보]에 깔려 있다. 인스톨 방법은 MIT 그룹 홈페이지를 참조하도록 한다.

다양한 예제

MPB 계산할 때에는 확장자를 ctl 로 저장할

1차원 계산 예제

  • 유전체 박막 [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