SIESTA란 무엇인가
SIESTA는 이 튜토리얼의 주력 DFT 코드다. 이름은 Spanish Initiative for Electronic Simulations with Thousands of Atoms의 약자로, "수천 원자 규모의 전자구조 시뮬레이션"이라는 설계 목표가 이름에 그대로 들어 있다. 이 장에서는 SIESTA가 어떤 코드이고, 계산이 어떻게 흘러가며, 입력과 출력이 어떻게 생겼는지를 개관한다. 실제 손을 움직이는 실습은 챕터 01부터다.
SIESTA의 정체
- 수치 원자궤도(LCAO) 기저의 DFT 코드다. plane-wave 대신 각 원자에 붙은 국소 궤도(numerical atomic orbital)를 기저로 쓴다. 궤도가 원자 반경 바깥에서 정확히 0이 되도록 잘려 있어 Hamiltonian·overlap 행렬이 희소(sparse)해진다.
- 이 희소성 덕분에 선형 스케일링, 즉 계산을 지향하는 설계가 가능했다 — 이름의 "Thousands of Atoms"가 이 지점을 가리킨다. 표준 대각화 모드에서도 같은 정확도의 plane-wave 계산보다 기저 크기가 훨씬 작다.
- TranSIESTA와 TBtrans가 같은 배포에 포함된다. TranSIESTA는 NEGF(비평형 그린 함수) 기반의 open-boundary 계산을, TBtrans는 그 결과로부터 transmission·전류를 계산하는 후처리를 담당한다. 국소 궤도 기저는 시스템을 전극/산란 영역으로 공간 분할할 수 있게 해 주므로, transport 계산에는 사실상 LCAO 코드가 필요하다 — 이 튜토리얼이 SIESTA를 쓰는 근본 이유다.
- 오픈소스로 무료 공개된다. 과거에는 학술 라이선스 등록이 필요했으나 현재는 GPL 오픈소스로 누구나 소스를 받아 빌드할 수 있다. 설치는 설치 장에서 다뤘다.
plane-wave 코드와의 위치 비교
| 항목 | LCAO (SIESTA) | plane-wave (VASP, Quantum ESPRESSO) |
|---|---|---|
| 기저 함수 | 원자에 붙은 국소 궤도 | 공간 전체에 퍼진 평면파 |
| 기저 크기 | 원자당 수~수십 개 — 작다 | cutoff에 따라 수만~수십만 개 |
| 기저 수렴 제어 | 시스템 의존 — SZ/DZ/DZP 단계와 궤도 반경을 조정 | cutoff 에너지 하나로 체계적 |
| 큰 시스템 | 유리 (희소 행렬, 지향) | 원자 수 증가에 비용이 빠르게 증가 |
| transport (NEGF) | 가능 — 공간 분할이 자연스럽다 | 국소화 변환(Wannier 등) 없이는 곤란 |
| 진공 영역 | 궤도가 없는 곳은 비용 없음 | 진공도 평면파로 채워야 함 |
장점은 표의 왼쪽 열이 요약한다 — 큰 계에 유리하고, 국소 궤도라서 NEGF transport가 가능하다. 단점도 같은 국소성에서 나온다.
- basis 수렴이 시스템 의존적이다. plane-wave는 cutoff를 올리면 단조롭게 수렴하지만, LCAO는 기저 단계(SZ/DZ/DZP)와 궤도 반경이라는 여러 조절 파라미터가 있고 최적값이 시스템마다 다르다.
- BSSE(basis set superposition error)가 있다. 두 조각이 가까워지면 서로의 기저 함수를 "빌려 써서" 결합 에너지가 과대평가되는 오차로, 국소 기저 고유의 문제다. 흡착·결합 에너지를 다룰 때 주의해야 한다.
이 튜토리얼은 이 상보성을 그대로 활용한다 — 구조 확정은 plane-wave(VASP)로, transport는 LCAO(SIESTA/TranSIESTA)로. 챕터 03에서 두 코드의 교차 검증을 실습한다.
계산이 흘러가는 방식
한 번의 SIESTA 계산은 다음 순서로 진행된다.
- 입력 읽기 — fdf 입력 파일과, 화학종별 pseudopotential 파일(
C.psml등)을 작업 디렉토리에서 읽는다. - 기저 생성 — pseudopotential로부터 수치 원자궤도 기저를 생성한다(
.ion파일로 저장). - SCF 루프 — 밀도 행렬이 자기일관(self-consistent)해질 때까지 반복한다.
- 출력 — 에너지·힘·요청한 물성(밴드, DOS 등)을 stdout과 파일들로 쓴다.
실행은 stdin/stdout 관례를 따른 다 — 입력을 표준 입력으로 넣고 표준 출력을 파일로 받는다.
siesta < input.fdf > siesta.out
mpirun -np 4 siesta < input.fdf > siesta.out # MPI 병렬
최근 버전은 siesta input.fdf처럼 인자로도 받지만, 이 튜토리얼은 위의 stdin/stdout 관례로 통일한다. 리다이렉트의 의미는 Linux와 터미널 기초에서 설명했다.
fdf가 "무엇을 어떻게 계산할지"라면, pseudopotential은 "각 원소를 어떻게 표현할지"를 정한다. SIESTA는 .psml 또는 .psf 형식을 읽으며, 이 튜토리얼은 PseudoDojo 데이터베이스의 .psml(PBE, scalar-relativistic)을 쓴다. 두 가지를 항상 확인한다 — ① 파일 이름이 %block ChemicalSpeciesLabel의 라벨과 일치하는가(C → C.psml), ② pseudopotential이 생성된 XC functional이 입력의 XC.Functional/XC.Authors와 일치하는가. 후자가 어긋나도 계산은 돌아가지만 결과의 일관성이 깨진다.
입력 해부 — fdf
입력은 fdf(flexible data format) 텍스트 파일 하나다. 문법 요약:
- 키워드-값 쌍 한 줄씩:
MeshCutoff 300. Ry. 키워드는 대소문자를 구분하지 않고.,-,_를 무시한다. - 물리량에는 단위를 붙인다:
1.29 Ang,0.01 eV/Ang. - **여러 줄 데이터는
%block 이름...%endblock 이름**으로 감싼다 — 격자 벡터, 원자 좌표, k-grid. - **
%include 파일명**으로 입력을 분리할 수 있다 — 구조를struct.fdf로 떼어 두고 본 입력에서 불러오는 관례를 transport 챕터에서 쓴다. #뒤는 주석이다.
필수 입력은 다섯 그룹으로 정리된다.
| 그룹 | 대표 키워드 | 역할 |
|---|---|---|
| 시스템 정의 | SystemLabel, NumberOfAtoms, %block ChemicalSpeciesLabel | 출력 파일 접두어, 화학종과 pseudopotential 연결 |
| 구조 | LatticeConstant, %block LatticeVectors, %block AtomicCoordinatesAndAtomicSpecies | 격자와 원자 좌표 |
| 기저·grid | PAO.BasisSize, MeshCutoff | LCAO 기저 크기, 실공간 grid 조밀도 |
| 교환-상관 | XC.Functional, XC.Authors | XC functional (예: GGA/PBE) |
| k-점·SCF | %block kgrid_Monkhorst_Pack, SCF.DM.Tolerance, MaxSCFIterations | Brillouin zone 샘플링, SCF 수렴 기준 |
각 키워드의 의미와 실제 값 선택은 챕터 01에서 라인 단위로 해설한다.
출력 파일 사전
SIESTA는 SystemLabel 값을 접두어로 하는 파일들을 만든다(아래는 SystemLabel siesta 기준). 처음에는 파일이 쏟아져 당황 하기 쉬운데, 실제로 챙길 파일은 몇 개 안 된다.
| 파일 | 내용 | 언제 쓰나 |
|---|---|---|
siesta.out | stdout 리다이렉트 — SCF 이력·에너지·힘·경고 전부 | 모든 계산의 1차 확인 대상 |
siesta.DM | 밀도 행렬 | 재시작 — DM.UseSaveDM T면 초기 밀도로 재사용 |
siesta.XV | 최종 원자 좌표+속도 | 재시작 — relax 이어서 돌리기, 구조 이어받기 |
siesta.STRUCT_OUT | 최종 구조(격자+분율 좌표) | 구조 후처리·타 코드 변환 |
siesta.FA | 원자별 힘 | relax 수렴 판정 |
siesta.bands | 밴드 경로를 따라간 고유값 | 밴드 플롯 (챕터 02) |
siesta.EIG | 샘플링 k-점의 고유값 — 첫 줄이 Fermi energy | DOS 계산, Fermi energy 확인 |
siesta.KP | 실제 사용된 k-점 목록과 가중치 | k-점 샘플링 확인 |
siesta.DOS, siesta.PDOS | 상태밀도 (PDOS는 xml 형식) | DOS/PDOS 플롯 |
siesta.HSX | Hamiltonian·overlap 행렬 (희소 저장) | sisl 등 후처리 도구의 입력 |
siesta.TSHS | TranSIESTA용 Hamiltonian·overlap | 전극·device transport (챕터 05 이후) |
C.ion, C.ion.xml | 생성된 basis orbital | 기저 확인, 후처리에서 궤도 재구성 |
MESSAGES | 경고·에러 요약 | 비정상 종료 시 원인 확인 |
INPUT_TMP.*, fdf-*.log | 입력 echo 임시 파일 | 디버깅 외 불필요 |
계산을 이어 돌리거나 같은 시스템의 후속 계산을 시작할 때 필요한 최소 세트는 siesta.DM(수렴된 밀도)과 siesta.XV(최종 구조)다. 이 둘만 있으면 SCF를 수렴 상태 근처에서 다시 시작할 수 있어 반복 수가 크게 줄어든다. 서버에서 결과를 회수할 때 다른 파일은 몰라도 이 둘과 siesta.out, 입력 fdf는 반드시 챙긴다.
stdout에서 읽는 법
siesta.out은 헤더(버전·입력 echo) → 기저 생성 로그 → SCF 사이클 → 최종 에너지·힘 순서로 구성된다. 아래 발췌는 모두 형식을 보여 주기 위한 예시이며, 수치와 열 구성은 버전에 따라 조금 다르다.
SCF 사이클 표 — 반복마다 한 줄씩 찍힌다.
iscf Eharris(eV) E_KS(eV) FreeEng(eV) dDmax Ef(eV) dHmax(eV)
scf: 1 -621.383914 -598.130561 -598.152804 1.240718 -8.309820 4.879274
scf: 2 -600.560423 -611.238379 -611.260622 0.421559 -5.410181 1.680392
...
핵심 열은 dDmax(밀도 행렬의 반복 간 최대 변화)다. 이 값이 SCF.DM.Tolerance 아래로 내려가면 수렴이다. Eharris와 E_KS가 일치해 가는 것도 수렴의 감각적 척도다.
수렴 판정 라인 — 이 한 줄이 있어야 결과를 쓸 수 있다.
SCF cycle converged after 34 iterations
MaxSCFIterations에 걸려 멈춘 계산은 수렴한 것이 아니다. 수렴 실패 시에는 경고가 남으므로, grep -i converge siesta.out으로 항상 확인한다.
최종 에너지 블록 — 파일 후반의 요약.
siesta: Final energy (eV):
...
siesta: Total = -616.283719
siesta: Fermi = -4.591428
총에너지는 pseudopotential 기준 값이라 절대값 자체는 의미가 없고, 같은 조건 계산 간의 차이만 물리적 의미를 가진다. Fermi energy는 이후 밴드·transmission의 에너지 기준점()으로 계속 쓰인다.
힘 블록 — WriteForces T일 때 원자별 힘이 찍힌다.
siesta: Atomic forces (eV/Ang):
siesta: 1 -0.000000 0.000000 0.000214
siesta: 2 0.000000 -0.000000 -0.000198
...
relax 계산에서는 최대 힘이 MD.MaxForceTol 아래로 내려갔는지가 종료 판정 기준이다.
여기까지가 SIESTA의 큰 그림이다. 챕터 01에서 carbon chain으로 첫 SCF 계산을 직접 돌려 보고, plane-wave 진영의 대표 코드는 VASP이란 무엇인가에서 이어 개관한다.