밀도범함수 이론
밀도범함수 이론(Density functional theory, DFT)은 물질, 분자 내부에 전자가 들어있는 모양과 그 에너지를 양자 역학으로 계산하기 위한 이론의 하나이다. 이를 통해 어떤 분자가 세상에 존재할 수 있는지 없는지의 여부, 특정 분자의 모양과 성질 등등을 예측할 수 있다. 컴퓨터를 사용하는 과학 계산들 중에서, 가장 널리 쓰이는 양자 역학 계산 분야 중 하나이다.
그러나, 상사 구조를 갖는 다체 문제에 어디든 적용할 수 있으므로, 최근 전자구조와 별 상관 없는 많은 통계 물리학에 사용되기도 하다.
엔리코 페르미가 기본적인 이론을 도입하였다. 월터 콘(Walter Kohn) 등이 이를 개량하고 발전시켰다.[1][2] 콘은 이 공로로 1998년 노벨 화학상을 수상하였다.
물질의 성질을 공부하려면 {많은 원자핵}+{많은 전자}문제, 즉 다체 물제를 풀어야 한다. 그러나, 단순한 원자가 아닌 복잡한 분자 (혹은 고체, 등등)에 대한 문제를 풀기는 이론상 가능하지만 현실적으로는 불가능하므로 몇 개의 근사 방법이 필요하다. 첫 번째 근사는 보른-오펜하이머 근사(Born-Oppenheimer approximation)로 전자보다 수천배 이상 무거운 핵을 고정된 것으로 보고 핵에 의한 전기장 안에서 전자의 운동으로 표현하는 것이다. 즉, 많은 전자로 이루어진 시스템 문제를 푼다는 것이다.
밀도범함수이론에서는 많은 전자 문제를 단순히 전자들의 파동함수들대신 전자 밀도함수로 대체함으로 손쉽게 계산하도록 하고 있다. 다시 말하면, 공간상의 어떤 점에 전자가 있을 때 이 전자가 느끼는 퍼텐셜은 다른 모든 곳에서 오는 것을 밀도함수를 통한 평균장</b>으로 볼 수 있다.(Mean Field Theory/Approximation).
이때 전자의 밀도 함수는 전자의 파동 함수들을 절댓을 구해 제곱해서 채워진 준위까지 더해준 것으로 정의된다.
ρ ( x → ) = ∑ i ∈ O C C | ψ i ( x → ) | 2 {\displaystyle \rho ({\vec {x}})=\sum _{i\in {\rm {OCC}}}|\psi _{i}({\vec {x}})|^{2}}
밀도범함수의 출발은 원자핵+전자 시스템을 풀기위해 시작됐지만 이론상 많은 동일한 형태의 입자/장 상호작용을 하는 다체 문제면 적용할 수 있다고 할 수 있다.
이상의 논의로부터, 시스템의 퍼텐셜은
외부 요인에 의한 퍼텐셜(주로 원자핵 또는 이온이 전자에 어떻게 영향을 미치나를 기술한다 (혹은 그렇지 않을 수 도 있다). 원자핵+전자로 해서 모든 전자를 고려한다면 온전자(all electron)계산 이온+전자(보통 가전자)로 고려한 경우는 가짜 퍼텐셜(pseudopotential)계산</i>이 해당되겠다.) V e x t {\displaystyle V_{\rm {ext}}} , 전자들끼리의 정전기적 상호작용(하트리 퍼텐셜</i>이라 한다.),
V H ( x → ) = ∫ d 3 x ′ ρ ( x → ′ ) | x → − x → ′ | {\displaystyle V_{H}({\vec {x}})=\int d^{3}x'{\frac {\rho ({\vec {x}}')}{|{\vec {x}}-{\vec {x}}'|}}}
전자를 서로 교환했을 때 (순전히 양자 역학에서만) 나타나는 교환-상관(exchange-correlation) 퍼텐셜</i>이 있다. V x c {\displaystyle V_{\rm {xc}}}
이 중 마지막에 교환-상관 퍼텐셜은 아무도 정확히 어떤형태를 가지는지 모르고 보통의 경우 양자몬테카를로 계산값과 장론의 결과를 근사적으로 잘 맞추는 형태로 시도하게 된다.
그리고 국소 전자 밀도에만 의존하는 교환-상관 퍼텐셜 범함수를 사용하게 되면 국소 밀도 근사(local density approximation)라고 하고, 선형 근사를 쓰게 되면 일반화된 기울기 근사(generalized gradient approximation)이라고 한다. 많은 경우 국소 밀도 근사만으로 계를 잘 설명할 수 있지만, 전하 이동이 큰 계에서는 잘 맞지 않는다.
기술적으로, 공간상의 어떤 점에서 함수 값을 구할때 모든공간의 정보를 필요로한 경우 이를 논로컬(non-local)하다고 말하고 해당점의 정보만 필요한 경우를 국소적(local)이라고 한다. 위의 퍼텐셜에서는 외부요인에 의한 퍼텐셜은 local혹은 non-local할 수 있고, 하트리 퍼텐셜은 확실히 non-local하며, local density approximation을 사용했을때는 교환-상관 퍼텐셜은 local하고 generalized gradient approximation을 사용했을 경우, 즉, 1차미분 기여도를 포함했을 때에는 semi-local하다고 한다.
호헨버그(Hohenberg) 와 콘(Kohn)의 정리[1]:
해밀토니언이 주어지면 파동함수를 구할 수 있고 파동함수에서 밀도함수를 구할 수 있는데 (이론상) 밀도함수에서 파동함수를 구할 수도 있다. 즉, 파동 함수와 밀도 함수는 일대일 대응하고, 파동 함수와 해밀토니언또한 일대일 대응한다. 결국 밀도 함수와 해밀토니언은 일대일 대응한다. (invertibility): 계산 과정에서, 해밀토니안, 파동함수, 밀도함수는 같은 대상을 표현한 서로 다른 표현 방식에 지나지 않을 뿐, 같은 것이다. 변분 원리를 이용해서 정확한 바닥상태 에너지를 계산 할 수 있다. 외부에서 오는 퍼텐셜을 뺀 나머지는 언제나 같다. (universality)
콘-샴(Kohn-Sham) 정리:[2] 정확한 바닥 상태 밀도 함수는 콘-샴 방정식이라고 하는 슈뢰딩거 방정식과 흡사한 방정식을 풀면 구할 수 있다.
H ψ ( x → ) = E ψ ( x → ) {\displaystyle H\psi ({\vec {x}})=E\psi ({\vec {x}})}
여기에서 해밀토니언 H {\displaystyle H} 는
H = − ℏ 2 2 m ∇ 2 + V e x t ( x → ) + V H ( x → ) + V x c ( x → ) {\displaystyle H=-{\frac {\hbar ^{2}}{2m}}\nabla ^{2}+V_{\rm {ext}}({\vec {x}})+V_{\rm {H}}({\vec {x}})+V_{\rm {xc}}({\vec {x}})}
여기서 m {\displaystyle m} 은 전자 질량이다.
전자 밀도를 구하기 위해 전자의 파동 함수들을 이용하고 전자 밀도를 이용해 퍼텐셜을 계산한다. 주어진 퍼텐셜로부터 콘-샴 방정식을 푼다. 풀이 결과는 전자의 파동 함수이다.
보통 계산을 위해서는 처음에 밀접 결합 근사 등으로 "적당히" 파동 함수를 근사하고 1, 2, 3의 과정을 거치면 처음에 대입한 파동 함수보다 더 나은 파동 함수를 얻는다. 다시 이것을 초기 예상값으로 하여 재계산을 거듭한다. 실제에서는 적당히 (상당히 보수적으로) 이전 단계의 초기 예상값과 계산 결과값을 잘 섞어서 초기 예상값으로 사용한다. 즉 self-consistent 방법으로 풀이한다.
전자들이 돌아 다니는 분자들에서 전자들이 얼마나 불안하고 빨리 돌아다니고 있는지 그 에너지를 구하려면 양자 역학적으로 묘사해야 된다고 한다. 그런데 하나 이해하고 계산하려고 해도 머리가 지끈거리는 양자 역학 계산을 수십 개 수백 개 전자에 대해 하려 한다면(아주 단순한 분자인 부탄 가스 분자 2개만 있어도 전자 숫자가 백개에 이른다.) 그것은 너무나 긴 시간을 소모하는 일이다.
그래서 생각한 방법인 즉슨, 전자 하나 하나의 움직임을 쫓아가지 말고, 전자 무더기를 한 덩어리의 양으로 따져 보자는 것이다. 그래서 전자가 자주 출몰하는 지역에는 덩어리가 많이 쏠려 있고, 전자가 덜 출몰하는 지역에는 덩어리가 조금밖에 없는 울퉁불퉁한 도넛의 모양으로, 전자들의 떠돌아다니는 영혼의 서글픈 그림자만 그려보는 것이다. 전자 하나 하나를 따지지 않고, 도넛으로 된 전자 덩어리만 생각해도 에너지를 구하는 데 큰 문제가 없다고 하니까. 도넛으로 된 전자 덩어리의 모양과 에너지와의 관계를 표시하는 수식이 KS 방정식이다.
이 전자 덩어리의 모양을 구하는 방법이 self-consistent 방법인데, 이걸 설명해보자면 이렇다. 아무렇게나 도넛을 만들어 놓고, 방정식(전자들이 처한 상황에서 꼭 만족해야할 조건식)을 얼마나 만족시키는지 계산해 본다. 당연히 별로 안만족 시킬 것이다. 그러면 도넛의 어떤 부분을 주물럭주물럭해서 모양을 좀 바꾸어 본다. 잘 바꾸었다면, 아까보다는 좀 더 만족시킬 것이다. 이런 식으로 대강 점차 주물럭거리면서 모양을 바꾸어 조건식을 상당히 잘 맞출 때까지 바꾸어 보면, 어느 수준까지 주물럭거린 도넛은 우리가 원하는 전자 덩어리 모양과 꽤 비슷하다고 생각할 수 있다.
교환 에너지(exchange energy)
밀도범함수론에서 가장 신경 쓸 필요가 있는 교환 에너지(exchange energy)를 구하는 범함수란, 다음과 같은 것을 말한다. 왼쪽에 있는 전자 하나가 발에 땀나게 오른쪽으로 뛰어가고, 오른쪽에 있는 전자 하나가 열심히 뛰어서 왼쪽으로 가서 두 전자가 자리를 살짝 바꾼 경우를 따져 보자.
두 전자는 열심히 뛰어다녔음에도 불구하고, 두 전자가 정확히 자리를 바꾸기만 한 경우에는, 전자가 분명히 많이 움직여서 에너지를 갖고 있었다고는 하지만, 거국적으로 보았을 때는 아무런 변화가 없었던 것이고, 이것은 양자 역학에서는 전자가 움직이지 않았다는 말과 다를바 없게(!) 평가되어야 한다. 즉 이런 "자리만 바꾸기"가 많이 일어난다면, 움직였다고 한들 움직이지 않은 것이나 다를바 없는 것들이 많았으므로, 실제 에너지는 더 낮아져야만 한다. (양자 역학적으로, 그런 것은 움직인 것이 아니다.)
밀도범함수 이론은 전자들이 선풍기의 날개나 헬리콥터 날개처럼 매우 빨리 돌아다녀서 멀리서 보면 마치 덩어리처럼 보인다는 식으로 전자를 표현하고 있다. 따라서 전자끼리 자리만 바꾼 경우에는 움직이지 않은 것으로 치는 것을 따로 계산해 주어야 한다. 이런 자리만 바꾼 경우가 얼마나 있는지를 도넛의 모양을 대강 보고 짐작해 주어야 하며, 이 짐작을 하는 방법이 바로, "교환 에너지 범함수"라는 것이다. 실제로는 코릴레이션(상관성) 에너지 라는 것도 동시에 고려해 주므로, 교환 코릴레이션(상관성) (exchange correlation) 범함수라는 것을 사용하게 된다.
좋은 교환 코릴레이션 범함수를 구하는 방법은 딱히 정해져 있지 않다. 대강 만들어내는 것이고, 기존의 방법들에서 나온 결과를 참조시켜 작동하도록 하기도 한다. 최근에는 B3LYP라는 범함수가 대체로 모든 경우에 큰 오류가 없다고 평가받고 있다.
백 번 듣는 것보다 한 번 보는 게 낫고 백 번 보는 것보다 한 번 해 보는 게 좋다는 말이 있듯이 밀도범함수이론을 컴퓨터에서 돌려 볼 수 있다. 여기에는 대개 두 가지 방법을 생각할 수 있다. 첫째, 혼자서 또는 팀을 짜서 구현하는 것이고 두 번째 방법은 남이 짜 놓은 것을 가져다가 잘 쓰면 된다.
후자의 경우를 먼저 살펴 보면 에 자유 소프트웨어를 구할 수 있는 다수의 링크가 있다. (화학쪽 소프트웨어로는 NWChem[3] 과 GAMESS[4] 가 있다.) 대부분의 소프트웨어가 기본적으로 운영 체제는 유닉스나 리눅스로 가정하고 있고, 다른 많은 과학 소프트웨어 배포본이 그렇듯이 포트란 소스가 있고 이걸 컴파일해서 쓰는 형태이다. 꼭 그렇지는 않지만 상용 포트란 컴파일러가 필요할 것으로 생각할 수 있다. 분명히, BLAS나 LAPACK 같은 수학 라이브러리가 필요할텐데 에서 구할 수 있을 것이다. 다음에 컴파일된 프로그램을 돌리기 위해서는 작은 문제가 아니라면 슈퍼 컴퓨터나 리눅스 클러스터가 필요하다. 이는 다란 메모리가 필요하고 따라서 받아들이는 데에 오랜 시간이 걸리는 문제이기 때문에 N 순의 알고리즘이 적용되어 있지 않다면 O(N^3)만큼의 시간이 필요하다. 소스 코드를 수정하는 것은 쉽지는 않겠지만 읽는 것으로는 크게 문제 될 것이 없다.
다음에 전자의 경우를 살펴 보겠다. 구현하는 데 가장 중요한 사항은 기저를 결정하는 일이다. (기저는 힐베르트 공간을 생성하는 완전한 세트이기 때문에 기저가 바뀌면 representation, 쉽게 말해서 수식이 바뀌기 때문이다.) 흔히 쓰이는 기저집합은 평면파(plane wave)와 local orbital (가우시안을 사용한다 해서 가우시안-Gaussian-이라고 하는 유명한 소프트웨어가 있음.)가 있다. 그 다음 결정할 일은 all electron을 할 건지 pseudopotential을 쓸 것인지 또 교환상관 퍼텐셜은 어떤 것을 쓸 것인지를 결정한다. 이제 굵은 가지는 결정되었고 세부 사항으로 어떤 플랫폼에서 돌릴 것인지 어떤 수학 라이브러리를 쓸 것인지 결정하고 코드를 쓰면 되겠다. (숙련된 프로그래머라면 대략 몇 달 만에 겨우 돌아가는 코드를 짤 수 있을 것으로 여겨진다. 물론 그 코드가 쓸만하게 될 때까지는 수년~수십 년이 걸릴 것으로 생각된다.)