소자 시뮬레이션 속도 향상
많은 수의 시뮬레이션을 수행할 경우 각 시뮬레이션이 완료되는 속도가 매우 중요합니다. 본 페이지에서는 OghmaNano의 전기적 솔버의 실행 속도를 높이는 방법을 설명합니다. 유용한 설정들은 솔버가 실제로 어떤 작업을 수행하는지 이해한 후에야 의미를 갖으므로, 페이지의 전반부에서는 해결되는 방정식들과 그 해법에 관한 모델의 기초를 설명하고 후반부에서는 실행 시간을 단축하기 위한 솔버 튜닝 방법을 제시합니다. 이러한 설정들은 물리적 현상 자체에는 영향을 주지 않으며, 단지 수치적 해가 도출되는 속도만을 조절할 뿐입니다.
1. 모델의 기초
시뮬레이션 속도를 높이는 방법을 살펴보기에 앞서 OghmaNano가 실제로 어떤 계산을 수행하는지 이해하는 것이 중요합니다. 소자 내 전하 이동을 모사하기 위해 OghmaNano는 기본적인 드리프트-확산 방정식과 포아송 방정식(가우스 법칙)을 함께 풉니다. 이 계산들은 소자 전체에 걸쳐 유한차분 메쉬 상에서 수행되며, 이를 통해 한 전극에서 다른 전극으로의 전하 이동이 전도대(LUMO)와 가전자대(HOMO) 양쪽에서 모두 추적됩니다.
1.1 소자 내 전하 수송
포아송 방정식은 정전기적 전위와 자유 전하량 간의 관계를 나타내며, 두 개의 전류 방정식은 전자와 정공의 구동 항들 즉 드리프트-확산 현상을 기술합니다.
\[ \nabla \cdot \varepsilon_0 \varepsilon_r \nabla \phi = q\,(n - p) \] \[ J_n = q\,\mu_e\,n\,\nabla E_c + q\,D_n\,\nabla n \] \[ J_p = q\,\mu_h\,p\,\nabla E_v - q\,D_p\,\nabla p \]이러한 전류 밀도 값들은 전자 및 정공의 연속 방정식에 대입되는데, 이 방정식들은 전류의 흐름과 재결합 현상, 전하 포획 현상 및 자유 캐리어 농도의 시간적 변화율 간의 균형을 나타낸다.
\[ \nabla \cdot \mathbf{J}_n = q\left( R_n + T_n + \frac{\partial n_{\text{free}}}{\partial t} \right) \] \[ \nabla \cdot \mathbf{J}_p = -q\left( R_p + T_p + \frac{\partial p_{\text{free}}}{\partial t} \right) \]여기서 \( \phi \)은 정전위이며, \( n \)와 \( p \)는 자유 전자 및 정공 밀도, \( \mu_e \)와 \( \mu_h \)는 전하 캐리어 이동도, \( D_n \)와 \( D_p \)은 확산 계수, \( E_c \)과 \( E_v \)는 밴드 엣지, \( R \)은 재결합률, 그리고 \( T \)은 트랩에 전하 캐리어가 포획되는 순속도를 나타냅니다. 전체 유도 과정 및 부호 규칙은 MacKenzie 등이 작성한 J. Phys. Chem. C 논문(doi:10.1021/jp200234m)을 따릅니다.
1.2 전하 포획 및 재결합
전하 포획 및 재결합 현상은 유기 소자와 여러 다른 물질계에서 중요한 역할을 하므로 반드시 명시적으로 모델링되어야 한다. 일반적으로 오제 재결합(SRH) 현상은 해석이 용이하도록 단일 정상상태 식으로 단순화되곤 한다. 그러나 OghmaNano는 시간영역에서 방정식을 해석하는 것을 목표로 하므로, 유한차분 시간영역법(FDTD) 격자상의 각 메시 지점에서 SRH 포획 및 방출 속도에 관한 전체 방정식들을 모두 해석한다.
각 메시 포인트에서 ??에 나타난 상황이 계산된다. 위아래에 위치한 포물선들은 전자 및 정공의 이동도 경계에서의 자유 캐리어 에너지 대역을 나타낸다. 전자 트랩 경계에서 아래로 내려오는 \( E_e^d \)은 전자 트랩의 지수 분포(적색)이며, 정공 트랩 경계에서 위로 올라가는 \( E_h^d \)는 정공 트랩의 지수 분포(청색)이다. 이러한 분포 내에 존재하는 개별 에너지 준위 각각이 하나의 독립적인 트랩이며, 각각에 대해 오제 재결합에 관한 전체 포획 및 탈출률 방정식이 계산된다. 특정 준위에 포획된 전자 수의 변화량은 네 가지 반응률의 균형에 의해 결정된다.
\[ \frac{\partial n_t}{\partial t} = r_1 - r_2 - r_3 + r_4 \]여기서 \( r_1 \)은 전자 포획 과정, \( r_2 \)는 전자 방출 과정, \( r_3 \)은 정공 포획 과정, \( r_4 \)는 정공 방출 과정을 나타내며, 각각은 트랩 상태밀도, 전하 캐리어 밀도, 포획 단면적 및 열속도에 의해 결정되는 일반적인 포획/방출 방정식을 따릅니다(위의 참고문헌 참조). 모든 에너지 준위에서 세부적인 평형 상태가 유지됩니다. 트랩 분포 전반에 걸쳐 순 포획률을 합산하면 자유 전하 캐리어의 재결합률을 얻게 됩니다.
\[ R_n = \sum_{0}^{n_{\text{band}}} \left( r_1^{\,e} - r_2^{\,e} \right) \]이러한 과정이 시뮬레이션 속도에 미치는 영향은 다음과 같다. 위치 공간상의 각 지점에서 에너지 공간상의 트랩 분포를 계산함으로써 에너지와 위치 양쪽에 따른 전하 밀도 분포를 완벽하게 파악할 수 있다. 바로 이 점이 OghmaNano가 일반적인 정상상태 근사법 없이도 과도 상태 계산을 수행할 수 있게 해주는 요인이다. 반면 이로 인해 동시에 해결해야 할 연립 방정식의 수가 많아지게 되며, 그 결과 수치 해법의 선택 및 설정값이 실행 시간에 실질적인 영향을 미치게 된다.
2. 방정식의 해법: 뉴턴법
위에 제시된 모든 연립 방정식들은 아이작 뉴턴이 1671년에 저술한 『Method of Fluxions』에 기술된 뉴턴법을 이용해 해결됩니다. 이 방법은 이러한 유형의 연립 방정식을 풀기 위해 현재까지 알려진 가장 효율적이고 안정적인 기법 중 하나입니다. 수작업으로는 해결이 불가능한 방정식이라도 뉴턴법을 사용하면 거의 항상 정확한 해를 구할 수 있습니다.
2.1 근과 오차 함수
간단한 예제부터 시작해보겠습니다. 다음 방정식이 0이 되게 하는 x의 값은 무엇인가요?
\[ 0 = (x - 3)(x - 40) \]검토 결과 정답은 \( x = 3 \)와 \( x = 40 \)입니다. 이 값들이 바로 해당 방정식의 근입니다. 동일한 문제를 함수 형태로 표현할 수도 있습니다.
\[ f(x) = (x - 3)(x - 40), \]\( f(x) \)을 \( x \)에 대해 그래프로 그려보면, 그 근들은 곡선이 축과 교차하는 지점 즉 \( f(x) = 0 \)이 되는 지점들입니다. 방정식을 0이 되도록 수렴하는 오차 함수로 간주하는 것이 핵심 개념입니다. 반도체 소자 모델에서는 \( x \)가 전위 \( \phi \)와 전자 및 정공의 준페르미 준위인 \( E_{Fn} \) 및 \( E_{Fp} \)과 같은 물리적 미지수들로 대체되며, 이 변수들의 값은 \( f(x) = 0 \)이 되도록 조정됩니다.
근은 단순한 방정식의 경우에만 육안으로 쉽게 식별할 수 있다. 그보다는 다음을 고려해보자
\[ f(x) = \frac{(x^2 + 10x - 3)\,\cos^2(4x)}{\tan(x)}. \]이 함수의 근을 구하기 위해 그래프를 그리는 것은 매우 번거로운 작업이며, 반도체 소자 방정식의 경우 훨씬 더 복잡합니다. 바로 이 지점에서 뉴턴법이 유용하게 활용됩니다.
2.2 방법의 단계별 절차
구체적인 예시로 \( f(x) = x^2 + 10x - 3 \)을 들어보겠습니다. 뉴턴법의 수행 과정은 다음과 같습니다:
- 해당 방정식을 해를 구하려는 변수에 대해 미분하면 \( f'(x) = 2x + 10 \)이 됩니다.
- 근사를 통해 근을 추정해보자. 어떤 값을 사용해도 무방하니 \( x = 10 \)을 선택하겠습니다. 이 값은 부적절한 추정치입니다(\( f(10) = 197 \)이며 0과는 거리가 멀음). 하지만 이는 문제가 되지 않습니다.
- 추정값에서 함수와 그 도함수의 값을 계산합니다: \( f(10) = 197 \) 및 \( f'(10) = 30 \).
- 뉴턴 업데이트식을 이용하여 더 정확한 근사값을 계산합니다:
값들을 대입하면 더 정확한 추정값이 얻어지며, 이는 \( x_{+1} = 10 - 197/30 = 3.433 \)에 해당한다. 이후에는 이 과정을 단순히 반복하면 된다. 즉, 개선된 추정값을 다시 입력하여 재평가하고(\( f(3.433) = 43.115 \), \( f'(3.433) = 16.866 \)), 그 결과로 \( 0.877 \)에 대한 더욱 정확한 추정값을 얻게 된다. 이러한 반복 과정을 거치면서 오차 함수의 값은 0에 가까워지고 추정값은 실제 근에 점점 수렴하게 된다.
2.3 실제 예제
이 방법은 단 몇 줄의 코드로 구현됩니다. 아래 루프는 \( f(x) = x^2 + 10x - 3 \)에 대해 이 방법을 적용하여 각 반복 단계마다 현재 근사값과 오차 \( f(x) \)를 출력합니다.
x = 10; % our guess for the answer
for i = 1:10 % loop ten times
y = x*x + 10*x - 3; % f(x)
dy = 2*x + 10; % f'(x)
new_x = x - (y/dy); % calculate a better x
x = new_x; % update x
sprintf("%f %f", x, y) % print the estimate and the error
end % repeat
출력 결과는 매우 유용합니다. 근의 추정값이 \( 10 \rightarrow 3.433 \rightarrow 0.877 \rightarrow 0.321 \rightarrow 0.292 \rightarrow 0.291503 \)로 변경되며 오차 값도 \( 197 \rightarrow 43 \rightarrow 6.5 \rightarrow 0.31 \rightarrow 0.00085 \rightarrow 0 \)만큼 감소합니다. 각 반복 단계마다 정확한 소수 자릿수의 개수가 대략 두 배씩 증가하는 점에 주목하시기 바랍니다. 이 현상을 초선형 수렴이라고 하며, 바로 이 특성 덕분에 뉴턴법이 방정식의 근을 구하는 데 매우 효율적인 방법이 되는 것입니다.
2.4 행렬 형태로 표현된 동일한 개념
해당 소자는 단일 방정식이 아니라 수많은 연립 방정식으로 구성되어 있으며, 각 메쉬 지점에서의 전위, 전자 및 정공의 준페르미 준위, 그리고 트랩 점유도가 이에 해당합니다. 행렬 형태로 표현하면 뉴턴법은 다음과 같이 나타낼 수 있습니다:
\[ [J]\,[\Delta x] = -[f(x)] \]\( [J] \)은 모든 소자 방정식(포아송 방정식, 드리프트-확산 방정식, SRH 재결합 방정식)의 모든 미지수에 대한 도함수들로 구성된 야코비 행렬입니다. \( [f(x)] \)는 현재 추정값에 대한 방정식들의 오차를 나타내며, \( [\Delta x] \)은 그 결과로 얻어지는 업데이트 값으로서 전체 소자 내 전기장, 준페르미 준위 및 트랩 점유도의 개선분을 의미합니다. 이 업데이트 값은 현재 해에 더해집니다.
\[ [x] = [x] + [\Delta x], \]이 과정이 반복되다가 \( f(x) \approx 0 \)에 도달하면 장치 방정식들이 해결된다. 여기서 두 가지 사항이 이후의 솔버 튜닝에 직접적으로 적용된다. \( f(x) \)는 우리가 0으로 만들고자 하는 값이므로 수렴도를 측정하는 자연스러운 척도가 된다. 또한 초기 추정값이 더 정확할수록 솔버는 해에 더 가까운 지점에서 시작하게 되어 필요한 반복 횟수도 줄어든다.
3. 실제 시뮬레이션 속도 향상 방법
기본적인 원리가 확립된 후에는 실제 설정 방법도 자연스럽게 이해할 수 있다. 여기서 사용된 예시는 2차원 전계효과 트랜지스터(모든 전하 포획 중심을 포함한 2차원 소자)이지만 동일한 개념은 모든 시뮬레이션에 적용된다.
3.1 디스크 기록 기능 끄기
가장 간단하게 적용할 수 있는 방법은 디스크에 데이터를 과도하게 기록하는 행위를 중단하는 것입니다. 파일 기록 작업은 속도가 느리며, 대량의 출력 데이터가 생성되는 시뮬레이션에서는 실행 시간의 대부분을 차지할 수 있습니다. OghmaNano는 단 한 번의 클릭만으로 디스크에 기록되는 데이터량을 최소화하는 제어 기능을 제공합니다. 또한 출력 설정에서 각 개별 출력 파일 옵션(예: 시간영역 시뮬레이션 데이터의 기록)을 개별적으로 활성화하거나 비활성화할 수 있어 실제로 필요한 파일만 저장할 수 있습니다. 최대한 빠른 실행 속도를 원한다면 디스크에 기록되는 데이터량을 가능한 한 줄이는 것이 바람직합니다.
먼저 이 방법을 시도해 보십시오. 아래에 제시된 수치 설정들을 변경하기 전에 불필요한 출력 기능을 비활성화한 뒤 시뮬레이션을 다시 실행하십시오. 디스크 사용량이 많은 시뮬레이션의 경우 이 조치만으로도 가장 큰 속도 향상을 얻을 수 있으며, 물리적 모델이나 결과의 정확도에는 아무런 영향이 없습니다.
3.2 솔버의 수렴 과정 관찰하기
솔버를 조정하려면 먼저 솔버가 정상적으로 작동하는지 확인해야 합니다. OghmaNano는 각 반복 단계에서의 뉴턴 오차값을 출력할 수 있으며, 단락전압 단계별로 한 줄씩 출력하는 대신 수렴 이력 정보를 파일에 기록할 수도 있습니다. 뉴턴 오차 출력 기능과 수렴 로그 기록 기능을 활성화한 뒤 시뮬레이션을 다시 실행하십시오.
첫 번째 시뮬레이션 단계는 특별한 경우입니다. 모델이 시작될 때는 소자 상태에 대한 적절한 추정값이 존재하지 않으며, 전위나 준페르미 준위도 알 수 없으므로 해답과는 상당히 거리가 먼 상태에서 시작하게 됩니다. ??에서 오차 값은 매우 크게 나타나며(\( 10^{15} \) 수준), 여러 번의 반복 계산을 거쳐 \( 10^{-7} \)에서 \( 10^{-9} \) 사이의 수준까지 점차 감소하여 결국 연립 방정식들이 해결됩니다. 이러한 첫 번째 해법 과정이 해답과 크게 동떨어져 있기 때문에 두 가지 조치가 의도적으로 취해집니다. 첫째, 뉴턴 단계에 클램프가 적용되어 솔버가 갑작스럽게 붕괴될 가능성이 있는 위치로 이동하지 않고 천천히 안전하게 수렴하도록 합니다. 둘째, 수천 회에 달하는 반복 계산이 허용되어 솔버가 안정적으로 수렴할 충분한 기회를 얻게 됩니다.
평형 상태 해석이 완료된 후 모델은 지정된 전압값들을 순차적으로 적용합니다. 각 전압 단계마다 소자는 이전 해석 결과에서 약간 벗어나게 되므로 오차가 일시적으로 증가했다가 곧바로 다시 감소하게 되는데, 이 현상이 그래프 오른쪽에 나타나는 오차 스파이크 형태로 표현됩니다. 각 단계에서의 초기값이 이전 해석 결과와 가까우므로 이러한 해석 과정들은 매우 빠르게 수렴하게 됩니다.
3.3 솔버 튜닝
수렴성 그래프는 2절에서 설명된 오차 함수 \( f(x) \)와 정확히 일치하며, 튜닝의 목적은 이 그래프의 길이를 단축시켜 더 적은 반복 횟수로 수렴을 달성하는 것입니다. 솔버 설정에서 주요 제어 변수들은 다음과 같습니다:
- 첫 단계에서 허용되는 최대 반복 횟수입니다. 만약 400회 정도의 반복 후에 이미 해법이 수렴 상태에 도달했다면 천 번까지 반복을 수행할 필요가 없습니다. 이 한도를 낮추면(예: 1000회에서 600회로) 이미 수렴이 완료된 구간에서의 불필요한 계산이 생략됩니다. 이처럼 생략된 반복 횟수만큼 실제 계산 시간이 절약됩니다.
- 첫 번째 단계에서의 목표 오차값입니다. 첫 번째 해석 시에는 보통 \( 10^{-9} \)과 같은 매우 작은 오차 수준에 도달하도록 설정됩니다. 만약 결과가 \( 10^{-7} \) 시점에서 이미 충분히 수렴된 상태라면 목표값을 완화하는 것이 좋습니다. 즉, \( 10^{-9} \) 수준까지 오차를 줄이려 애쓰는 대신 \( 10^{-7} \)에서 계산을 중단하면 가장 느리게 수렴하는 마지막 단계를 생략할 수 있습니다.
- 클램프 기능. 클램프란 솔버가 취할 수 있는 전체 뉴턴 단계 크기의 비율을 의미한다 \( [\Delta x] \). 전체 단계는 야코비 행렬을 이용해 직접 계산되지만, 클램프 기능을 적용하면 그 중 일부만 사용하게 된다. 예를 들어 뉴턴 알고리즘이 특정 변수를 0.5만큼 이동시키도록 요구하더라도 클램프 설정에 따라 실제 이동량은 0.1로 제한될 수 있다. 클램프 값이 작을수록 수렴 속도는 느려지지만 솔버가 오류 상태에 빠질 가능성은 현저히 낮아진다. 반면 클램프 값이 클수록 수렴 속도는 빨라지지만 불안정성이 증가한다. 첫 단계에서는 보통 0.1 정도의 보수적인 클램프 값을 사용하며, 구조가 안정적일 경우 이 값을 0.2나 0.3 이상으로 높여 초기 수렴 속도를 크게 향상시킬 수 있다. 이후 단계에서도 기본값보다 클램프 값을 높일 수 있으나 지나치게 높일 경우 수렴 실패가 발생할 위험이 있다.
- 최소 뉴턴 반복 횟수: 이 값은 솔버가 종료되기 전에 반드시 수행해야 할 최소 반복 횟수를 지정하며, 이를 통해 솔버가 국소 최솟값에 갇히는 상황을 방지할 수 있다. 소수 회 정도의 값을 설정하는 것이 안전장치 역할을 하지만, 너무 높게 설정할 경우 이미 해가 구해진 후에도 불필요하게 반복 연산이 이루어져 시간만 낭비하게 된다.
- 최소 솔버 오차 및 최대 반복 횟수(기타 단계들은 동일하게 유지). 이 값들은 각 전압 단계에서의 목표 정확도와 반복 횟수 상한을 결정합니다. 이 값들은 첫 단계에서 설정한 값들과 동일한 방식으로 작동하며, 구조물의 수렴 속도를 파악한 뒤 보다 엄격하게 조정할 수 있습니다.
작업 흐름에 관해 설명하자면, 각 설정 변경 후에는 수렴성 결과 파일을 다시 그려보고 그래프가 어떻게 축소되는지 관찰해야 합니다. 첫 번째 해석 단계에서 나타나는 평탄한 꼬리 부분을 줄이고 첫 단계에서 지정한 오차 목표값을 완화한 뒤 클램프 값을 높여 수렴 곡선의 기울기를 증가시키면 됩니다. 예시 장치의 경우 이러한 조정들을 종합적으로 적용했을 때 계산 시간이 약 15초에서 8초 수준으로 단축되었으며 최종 결과값에는 변화가 없었습니다. 모델과 함께 제공되는 입력 파일들은 보수적인 값들을 사용하고 있으므로 사용자 고유의 구조물에 대해서도 이 값들을 더 높여 조정할 여지가 충분합니다.
절약된 시간을 계산 정확도 향상에 활용하십시오. 솔버가 적절히 튜닝된 후에는 그로 인해 확보된 시간을 보다 복잡한 문제 해결에 재투자할 수 있습니다. 예를 들어 메시 점의 수를 늘리는 것이 가능해집니다. 잘 튜닝된 뉴턴 방식 설정이야말로 보다 크고 세밀하며 연립 방정식 간 결합이 강한 반도체 소자들을 합리적인 시간 내에 해석할 수 있게 해주는 핵심 요소입니다.
흔히 발생하는 문제점들
- 클램프 값을 지나치게 크게 설정하면 솔버의 속도는 빨라지지만 충돌이 발생하거나 수렴에 실패할 가능성이 커집니다. 클램프 값을 점진적으로 높여가며 시뮬레이션이 정상적으로 완료되는지 확인해야 합니다.
- 최소 반복 횟수를 지나치게 높게 설정하면 솔버가 이미 수렴한 상태에서도 계속 실행되게 되어, 결과적으로 절약하려는 시간을 낭비하게 됩니다.
- 목표 오차값을 지나치게 완화하면 실제로 해가 충분히 수렴되지 않은 상태로 남을 수 있습니다. 오직 수렴 곡선이 명확하게 수치적 노이즈 수준으로 평탄해진 경우에만 오차값을 완화해야 합니다.
- 각 구조별로 최적의 설정값은 상이합니다. 한 소자에 적합한 값이 다른 소자에는 지나치게 엄격할 수 있으므로 구조를 변경할 때마다 반드시 수렴성 그래프를 재확인해야 합니다.
요약 및 다음 단계
- OghmaNano는 메쉬 상에서 드리프트-확산 방정식, 포아송 방정식 및 전체 오제 재결합에 따른 포획/탈출 방정식을 해석하여 에너지 공간과 위치 공간 양쪽에서 전하 캐리어의 분포를 산출한다.
- 이러한 연립 방정식들은 뉴턴법을 이용해 해결되는데, 이는 오차 함수 \( f(x) \)를 0으로 수렴시키는 반선형 수렴 특성을 지닌 반복적 알고리즘입니다. 행렬 형태로 표현하면 \( [J][\Delta x] = -[f(x)] \)와 같습니다.
- 수렴성 그래프에서는 초기에 평형 상태를 찾기 위한 해석 과정이 수행된 후 각 전압 단계에서 신속한 해석이 이루어지는 모습을 확인할 수 있다.
- 속도 향상을 위해 디스크 쓰기 횟수를 줄이고 초기 단계 반복 횟수 제한을 완화하며 목표 오차값을 완화하십시오. 또한 클램프 값을 신중히 상향 조정하고, 잘못된 최솟값에 빠지는 것을 방지하기 위해 최소 반복 횟수를 소정 수준으로 설정하십시오.
- 파라미터 조정을 통해 절약된 시간은 보다 정밀한 메쉬 생성이나 더 복잡한 문제 해결에 재활용될 수 있습니다.
다음으로는 이 방정식들에 사용되는 물질 파라미터들이 어떻게 정의되는지 알아보려면 재료 데이터베이스를 참조하십시오.