본문으로 건너뛰기

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)해진다.
  • 이 희소성 덕분에 선형 스케일링, 즉 O(N)O(N) 계산을 지향하는 설계가 가능했다 — 이름의 "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 에너지 하나로 체계적
큰 시스템유리 (희소 행렬, O(N)O(N) 지향)원자 수 증가에 비용이 빠르게 증가
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 계산은 다음 순서로 진행된다.

  1. 입력 읽기 — fdf 입력 파일과, 화학종별 pseudopotential 파일(C.psml 등)을 작업 디렉토리에서 읽는다.
  2. 기저 생성 — pseudopotential로부터 수치 원자궤도 기저를 생성한다(.ion 파일로 저장).
  3. SCF 루프 — 밀도 행렬이 자기일관(self-consistent)해질 때까지 반복한다.
  4. 출력 — 에너지·힘·요청한 물성(밴드, DOS 등)을 stdout과 파일들로 쓴다.

실행은 stdin/stdout 관례를 따른다 — 입력을 표준 입력으로 넣고 표준 출력을 파일로 받는다.

siesta < input.fdf > siesta.out
mpirun -np 4 siesta < input.fdf > siesta.out # MPI 병렬

최근 버전은 siesta input.fdf처럼 인자로도 받지만, 이 튜토리얼은 위의 stdin/stdout 관례로 통일한다. 리다이렉트의 의미는 Linux와 터미널 기초에서 설명했다.

pseudopotential 파일 — 계산의 또 다른 절반

fdf가 "무엇을 어떻게 계산할지"라면, pseudopotential은 "각 원소를 어떻게 표현할지"를 정한다. SIESTA는 .psml 또는 .psf 형식을 읽으며, 이 튜토리얼은 PseudoDojo 데이터베이스의 .psml(PBE, scalar-relativistic)을 쓴다. 두 가지를 항상 확인한다 — ① 파일 이름이 %block ChemicalSpeciesLabel의 라벨과 일치하는가(CC.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격자와 원자 좌표
기저·gridPAO.BasisSize, MeshCutoffLCAO 기저 크기, 실공간 grid 조밀도
교환-상관XC.Functional, XC.AuthorsXC functional (예: GGA/PBE)
k-점·SCF%block kgrid_Monkhorst_Pack, SCF.DM.Tolerance, MaxSCFIterationsBrillouin zone 샘플링, SCF 수렴 기준

각 키워드의 의미와 실제 값 선택은 챕터 01에서 라인 단위로 해설한다.

출력 파일 사전

SIESTA는 SystemLabel 값을 접두어로 하는 파일들을 만든다(아래는 SystemLabel siesta 기준). 처음에는 파일이 쏟아져 당황하기 쉬운데, 실제로 챙길 파일은 몇 개 안 된다.

파일내용언제 쓰나
siesta.outstdout 리다이렉트 — SCF 이력·에너지·힘·경고 전부모든 계산의 1차 확인 대상
siesta.DM밀도 행렬재시작DM.UseSaveDM T면 초기 밀도로 재사용
siesta.XV최종 원자 좌표+속도재시작 — relax 이어서 돌리기, 구조 이어받기
siesta.STRUCT_OUT최종 구조(격자+분율 좌표)구조 후처리·타 코드 변환
siesta.FA원자별 힘relax 수렴 판정
siesta.bands밴드 경로를 따라간 고유값밴드 플롯 (챕터 02)
siesta.EIG샘플링 k-점의 고유값 — 첫 줄이 Fermi energyDOS 계산, Fermi energy 확인
siesta.KP실제 사용된 k-점 목록과 가중치k-점 샘플링 확인
siesta.DOS, siesta.PDOS상태밀도 (PDOS는 xml 형식)DOS/PDOS 플롯
siesta.HSXHamiltonian·overlap 행렬 (희소 저장)sisl 등 후처리 도구의 입력
siesta.TSHSTranSIESTA용 Hamiltonian·overlap전극·device transport (챕터 05 이후)
C.ion, C.ion.xml생성된 basis orbital기저 확인, 후처리에서 궤도 재구성
MESSAGES경고·에러 요약비정상 종료 시 원인 확인
INPUT_TMP.*, fdf-*.log입력 echo 임시 파일디버깅 외 불필요
재시작의 최소 세트 — .DM과 .XV

계산을 이어 돌리거나 같은 시스템의 후속 계산을 시작할 때 필요한 최소 세트는 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 아래로 내려가면 수렴이다. EharrisE_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의 에너지 기준점(EEFE - E_F)으로 계속 쓰인다.

힘 블록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이란 무엇인가에서 이어 개관한다.