Yee Cell
Finite-difference time-domain (FDTD) 란 수치 해석법으로 컴퓨터로 전자기학을 해석하는 방법이다. 즉 미분 방정식의 근사 해답을 찾는 방법이다. 시간영역에서 수치적 접근을 한다는 측면에서 FDTD 해석은 한번의 실행으로 넓은 범위의 주파수 영역을 다룰 수 있고, 비선형 물질도 다룰 수 있다.
FDTD 방법은 그리드(grid) 기반 시간영역 미분 수치 모델 기법 중 하나이다. 시간의존성이 있는 맥스웰 방정식(편미분방정식 형태)은 중앙-차이 근사를 이용하여 시간-공간에 관한 미분 형태로 시공간을 쪼갠다. 그 결과 얻어지는 유한-차이 방정식(그리드로 쪼개어진 시공간의 미분 방정식의 수치해석 방정식)을 leapfrog(등짚고 뛰어넘기) 방식(즉, 순차적인 스텝-턴 방식)으로 소프트웨어나 하드웨어를 이용하여 풀이한다. 즉 특정 시간 그리드 순간에 공간상의 전기장 벡터 성분을 풀이한 후, 연속되는 다음 그리드 순간에서는 풀이된 전기장 벡터 성분을 기반으로 자기장 벡터 성분을 얻는다. 이러한 순차적인 수치해석적 방법을 원하는 시간 순간 혹은 평형상태의 전자기장 수준이 될 때 까지 반복한다. 특히 Yee 알고리즘을 이용하여 위의 순차적 계산을 쉽게 이룰 수 있다. 따라서 FEM 기법의 PWE 방식과는 다른 접근 법이다.
1. 강력하고 직관적인 맥스웰 방정식 풀이
2. 한번의 실행으로 넓은 스펙트럼 특성을 얻을 수 있어 공진 특성이 모호한 시스템에 유리
3. 시간영역 순차적 실행 결과 얻어지는 전기장 혹은 자기장을 애니메이션으로 만들 수 있어서 광학 특성 이해에 유리
4. 다양한 특성(선형, 비선형, 금속 등)의 물질을 동시에 고려하여 시뮬레이션 할 수 있음.
1. 구조를 파장보다 작게 쪼개진 그리드를 고려하여야 하므로 큰 시스템의 경우 계산 크기가 커지고 따라서 컴퓨터 메모리가 커지고 계산 시간이 길어진다.
2. 위의 문제를 해결하기 위해 되도록 유한 크기를 이용해 무한대의 구조를 시뮬레이션을 구현해야 하는데, 이를 위해 사용되는 가장자리 흡수층의 조건에 따라 계산의 신뢰도가 변화한다.
Kongju National University Lecture for new lab member
FDDTD introduction - 1 파일:FDTDintro1.pdf
FDDTD introduction - 2 파일:FDTDintro2.pdf
KAIST FDTD Lecture 파일:FDTDlect.pdf
http://en.wikipedia.org/wiki/Finite-difference_time-domain_method
Book
Presentation
(참고 : install&setting)
grid unit = q [m]
if nonuniform grid : dx(q), dy(q), dz(q) 간격이 다름.
speed of light = c = 3x10^8 [m/s]
time unit = time step = dt [s] = 1 update
1 update = 1/(cS) --> c = (1/S)[q/update] {in FDTD}
in real world : dt = 1/(cS(q^-1)),
참고 : Courant stability factor (수치 안정화 계수) S[q^-1] = 2 > sqrt( 1/dx^2 + 1/dy^2 + 1/dz^2)
의미 : FDTD 계산에서 빛의 속도보다 빨리 전자기파가 전달될 수 없음.
normalized frequency (규격화 주파수) omega_n = lattice[q] / wavelength [q] {in FDTD} = lattice[m]/lambda[m] {in real world}
wavelength lambda = lattice / omega_n = lattice[q]/omega_n {in FDTD} = lattice[m]/omega_n {in real world}
Optical period = T = 2*pi/omega_n = S*lattice[q]*1[update]/omega_n {in FDTD} = lattice[m]/(c*omega_n)
만약 omega_n = 0.4, lattice = 20q, S=2 q^-1 라면, T = 2*20/0.4= 100 [update]
Q - factor : 품위값
정의 : (내부 저장 에너지)/(빠져나가는 에너지 during 1-optical cycle)
1% loss 의 Fabry-Perot 공진기 > Q = 1/1% = 100
{in FDTD} Q = 2*pi*omega_n*tau_decay/(S*lattice)
tau_decay : FDTD 상에서 E^2 이나 H^2 값이 update 시간에 따라 줄어드는 양상을 자연로그로 그린 후 linear fitting으로 얻은 직선의 기울기 역수
FDTD Ez나 Hz 값에서부터 Q 값 얻기 파일:Q factor calculation.pdf
FDM 방식을 이용하여 harminv 함수로 field monitoring data로부터 바로 얻을 수 있음. (아래 "mode frequency 얻는 방법" 참조)
1. top view SEM image를 photoshop으로 읽는다.
2. 주기가 몇 nm인지 SEM image에 있는 ruler (눈금자)를 통해 환산해서 알아둔다.
3. 원하는 패턴 영역만 잘라 낸다.
4. 주기가 몇 pixel인지, 전체 몇 pixel인지 계산한다. (이때 pixel은 짝수가 되도록 한다.)
5. black-white로 image 변환 한 뒤 tif 형식으로 저장하고, (물질이 black, 공기가 white)
6. transform 프로그램으로 읽는다.
7. origin을 실행한다.
8. 6에서 transform으로 읽은 그 데이터를 copy 해서 origin에 data-sheet에 paste 한다.
9. origin data-sheet를 matrix로 변형한다.
10. matrix 형태 데이터를 export 한다.
(이때 데이터간 간격은 tab 으로 설정, 데이터 이름에 전체 grid 수 및 1a 수 표시 하도록)
예 10번 샘플의 contour data로 pixel size 가 400 pixel x 300 pixel 이고 1a=17.5 grids 라면 --> 'S10-400x300a17p5.dat')
11. contour FDTD를 수행할때 코드 내부 input_object 에서 전체 pixel size 및 1a grid 정보를 잘 넣도록 한다.
예: [MPIFDTD_KNU_v141 패키지 이용시] input_object("contour","S10-400x300a17p5.dat",200,150,shift,100,T,(float)imesh/17.5,n*n,0);
structure 이미지 얻는 방법
id@nanolaser$ txttoh5 epsilon.*
id@nanolaser$ h5topng -c bluered epsilon.z.h5 -T
field 이미지 얻는 방법
id@nanolaser$ txttoh5 epsilon.* *z.Hz // 모든 .LogE2 파일을 이용해 h5 파일 생성
id@nanolaser$ h5topng -C epsilon.z.h5 -T -ZRc dkbluered *.z.Hz.h5 // h5 파일로부터 png 이미지 파일 생성
id@nanolaser$ h5topng -C epsilon.z.h5 -T -c dkbluered -m -0.001 -M 0.001 *.z.Hz.h5 // h5 파일로부터 png 이미지 파일 생성
id@nanolaser$ convert -delay 20 *.Hz.png Hz.z.gif // png 파일을 순서대로 묶어서 애니메이션 생성 delay옵션은 파일간 시간 간격
intensity 이미지 얻는 방법
id@nanolaser$ txttoh5 epsilon.* *z.LogE2 // 모든 .LogE2 파일을 이용해 h5 파일 생성
id@nanolaser$ h5topng -C epsilon.z.h5 -T -c jet -m -5 -M 0 *z.LogE2.h5 // log scale로 -5 ~ 0 까지를 최소,최고 색으로 그리기
id@nanolaser$ convert -delay 20 *.LogE2.png LogE2.z.gif // png 파일을 순서대로 묶어서 애니메이션 생성 delay옵션은 파일간 시간 간격
h5topng --help 를 하면 명령어에 대한 옵션 설명을 볼 수 있어요.
-C : 테두리로 덧그리기
-T : transpose (x와 y 바꾸기)
-Z : 그림 스케일에서 중간색을 0으로 강제함.
-R : 여러 h5 파일을 한꺼번에 그림파일로 만들때, 여러 데이터의 최고값과 최저값을 찾아 그 스케일로 그림 생성
-c : 컬러 선택 dkbluered : darkblue-blue-white-red-darkred jet : blue-cyan-yellow-red hot : black-red-yellow-white, gray : white-gray-black
그밖에 h5util 관련 설명이라든지 밴드갭 계산 혹은 open FDTD code에 관한 정보는 여기에서 얻을 수 있습니다.
Origin 프로그램을 이용한 fft 예제
fortran code를 이용한 fft Fortran fft
harminv 방법을 이용
(예를 들어 a = 20 grid 일 경우 normalized frequency 0.4 부근에 source를 준 경우 cavity Q 값 얻는 법)
id@com:~$ harminv -t 0.025 0.2-0.5 < mode.dat
-t : 1 FDTD time step의 normalized time. 1/(S*a) = 1/(2*20) = 0.025. 이때 S 는 Stability factor로 보통 2이다.
0.2-0.5 : scan 하려는 frequency range
mode.dat : mode.dat는 기록된 E field 혹은 H field 값으로 Hz 혹은 Ex, Ey 등이다.
다른 옵션 : -s * : sorting by *. ex) " -s Q " : show the highest Q mode
-a *.* : show the mode more than *.* ex) -a 1.0 : show only max amplitude mode
other : please type " harminv --help"
data 파일이 여러개 있을 경우 harminv로 Q값과 frequency 얻기
이름이 "mode.0000.dat" 에서 "mode.1414.dat" 까지 총 15x15개의 데이터가 있을 경우
1. 데이터 파일이 있는 곳에 slice.sh와 harminv.sh 파일을 만는다.
미디어:slice.txt와 미디어:harminv.txt를 다운받아 확장자를 바꾼후 데이터 파일 있는 곳에 복사한다.
2. 데이터 파일의 line 수를 파악한다. (예 : 1d@com~$ wc mode.00.dat 을 하면 첫번째 결과가 라인 수에 해당됨)
3. vi 편집기로 slice.sh 파일을 수정한다.
3.1 harminv로 처리할 FDTD time 구간 설정 : 총 131072 time step 중 80000~130000 까지 50000 time step 사용한다면
at 7 line : nh = 130000 (끝 라인 설정)
at 8 line : nt = 50000 (첫 라인 설정)
3.2 총 데이터 수 수정 : for 문의 i, j 의 값을 변경
4. slice.sh을 실행파일로 변경한다.
id@com~$ chmod 700 slice.sh
5. 실행한 결과를 data.dat 파일로 출력한다.
id@com~$ ./slice.sh > data.dat
6. 결과는 각 파일(좌표로 표시됨)에서의 harminv 결과가 나오는데 이 중에서 좌표외의 데이터 값만 취한다.
id@com~$ chmod 700 harminv.sh
id@com~$ ./harminv.sh
7. 결과로 나오는 findQ.dat 를 다운받아 origin 으로 열어서 amp(col#3)가 가장 크면서 error(col#4)가 가장 작은 값 중 높은 Q 값을 취해 single mode를 띄운다.
만약 findQ.dat 가 origin에서 열리지 않으면 grep로 frequency 영역만 골라 다시 데이터를 얻는다.
id@com~$ grep 0. < findQ.dat > newfindQ.dat
이름이 "mode.0000.dat" 에서 "mode.3030.dat" 까지 총 31x31개의 데이터가 있을 경우
앞의 과정 중 3.2 에서 총 데이터 수를 14에서 31까지로 변경
1. 우선 첨부 파일 중 파일:Check fractions.c 파일을 데이터가 있는 리눅스 컴퓨터의 디렉토리로 옮긴다.
2. 파일을 컴파일한다.
id@com~$ gcc -O4 -lm check_fractions.c -o ff.out
참고 : 여기서 '-o ff.out' 을 붙이지 않으면 a.out 이라는 실행파일이 생긴다. 만약 ff.out 대신에 frac.out 을 쓰면 이 이름의 실행파일이 생긴다.
3. 생성된 ff.out을 이용하여 체크하려는 곳(epsilon.z 파일이 있는 곳)으로 옮겨간다. 만약 데이터 이름이 다르면 'epsilon.z'로 바꿔준다.
4. 실행파일을 실행하여 filling fraction이 얼마인지 확인한다.
id@com~$ ./ff.out
이때 결과가 아래와 같이 나오는데 처음 filling fraction 높은 유전체의 filling fraction이다.
fill factor = 0.167562
air portion =0.076664
material portion = 0.694569
1. 흰색 바탕의 검은 원의 tif 파일을 얻는다.
(일반적으로 SEM 파일은 tif 확장자임. 아닐 경우 photoshop 같은 프로그램으로 전환)
(만약 epsilon.dat 파일이라면 png 파일을 얻어 photoshop에서 처리. 혹은 transform에서 전환)
2. 이를 transform에서 열어 data file을 txt 확장자로 저장한다.
3. txt 확장자 파일을 오리진으로 열어 원하는 영역 데이터를 스크롤하고 dat 확장자로 export한다. 이때 구분은 tab으로 한다.
4. 마지막으로 check_area.c 파일(파일:Check area.c)와 함께 linux 로 옮겨 gcc로 컴파일 하고 dat 파일을 input.dat 파일로 바꾼 후 실행한다.
(png 파일 얻을 때 jet colormap을 쓰면 좋다.)
관련홈페이지 : S. H. Kim @ Caltech