VASP이란 무엇인가
VASP(Vienna Ab initio Simulation Package)은 plane-wave 기저와 PAW(projector augmented-wave) 방법에 기반한 DFT 코드다. 이 튜토리얼에서는 구조 확정(챕터 03)과 hybrid functional reference(챕터 11)를 담당한다. 이 장에서는 VASP의 입력·출력 구조를 개관한다.
VASP의 정체
- plane-wave + PAW 기반의 DFT 코드다. 기저가 원자에 붙어 있지 않아 cutoff 에너지(
ENCUT) 하나로 기저 품질을 체계적으로 수렴시킬 수 있다. - 상용 코드다. 사용하려면 라이선스가 필요하며, 코드와 PAW 데이터셋(POTCAR)의 재배포가 금지된다. 보통 연구 그룹·기관 단위로 라이선스를 보유한다.
- 그럼에도 고체 전자구조 분야에서 사실상의 표준처럼 쓰인다. 이유는 세 가지로 요약된다 — ① 원소 전반에 걸쳐 검증된 견고한 PAW 데이터셋이 코드와 함께 제공되고, ② 구조 최적화·MD·hybrid functional·다양한 후처리까지 기능 범위가 넓으며, ③ 수십 년간 축적된 문헌 덕에 결과를 기존 연구와 비교·검증하기 쉽다.
이 튜토리얼에서 VASP의 역할은 보조적이지만 중요하다 — LCAO 기저(SIESTA)와 독립적인 plane-wave 기저로 같은 구조를 계산해, 결과가 어느 한쪽 기저의 아티팩트가 아님을 확인한다. 두 코드의 비교 관점은 SIESTA란 무엇인가에서 정리했다.
4대 입력 파일
VASP은 SIESTA와 달리 입력 파일 이름이 고정되어 있다. 작업 디렉토리에 다음 네 파일을 두면 실행 준비가 끝난다.
| 파일 | 역할 |
|---|---|
INCAR | 계산 지시 — 무엇을 어떻게 계산할지 (태그 = 값) |
POSCAR | 구조 — 격자 벡터와 원자 좌표 |
KPOINTS | k-점 샘플링 |
POTCAR | 원소별 PAW pseudopotential |
INCAR — 계산 지시
태그 = 값 형식의 텍스트 파일이다. 태그가 수백 개 있지만, 대부분은 디폴트로 두고 아래 핵심 태그만 상황에 맞게 정한다.
| 태그 | 의미 | 비고 |
|---|---|---|
ENCUT | plane-wave cutoff (eV) | 기저 품질을 정하는 단일 파라미터. POTCAR가 권장 최소값(ENMAX)을 담고 있다 |
ISMEAR | 전자 점유 smearing 방식 | 0 = Gaussian(무난), = tetrahedron(DOS·정적 계산), 1·2 = Methfessel–Paxton(금속 relax) |
SIGMA | smearing 폭 (eV) | ISMEAR와 짝. 작을수록 smearing에 의한 에너지 오염이 줄어든다 |
EDIFF | 전자 SCF 수렴 기준 (eV) | 힘의 품질이 SCF 수렴에 직결되므로 relax에서는 타이트하게 |
EDIFFG | 이온 루프 종료 기준 | 음수면 힘 기준 — 예: 이면 모든 원자의 힘 크기가 0.01 eV/Å 미만일 때 종료 |
IBRION | 이온 이동 알고리즘 | = 이온 고정(단일점), 2 = conjugate gradient(relax) |
ISIF | 무엇을 relax할지 | 2 = 원자 위치만, 3 = 위치+cell 전부 |
NSW | 이온 스텝 최대 수 | 0이면 단일점 계산 |
ISPIN | 스핀 편극 | 1 = 비편극(디폴트), 2 = collinear 스핀 편극 |
LORBIT | 궤도 projection 출력 | 11이면 lm-분해 PDOS(DOSCAR)·PROCAR 생성 |
최소 예시 — 단일점 SCF라면 이 정도로 충분하다.
SYSTEM = C4 chain single point
ENCUT = 500
ISMEAR = 0
SIGMA = 0.05
EDIFF = 1E-8
relax용 INCAR 전체는 챕터 03에서 태그별로 해설한다.
POSCAR — 구조
포맷이 줄 위치로 고정되어 있다.
C4 chain <- 1행: 주석
1.0 <- 2행: 전체 스케일 인자
15.00 0.00 0.00 <- 3-5행: 격자 벡터 (Å)
0.00 15.00 0.00
0.00 0.00 5.16
C <- 6행: 원소 목록
4 <- 7행: 원소별 원자 수
Direct <- 8행: 좌표 형식
0.50 0.50 0.00 <- 9행부터: 원자 좌표
0.50 0.50 0.25
0.50 0.50 0.50
0.50 0.50 0.75
DirectvsCartesian—Direct(첫 글자D)는 격자 벡터 기준 분율 좌표,Cartesian(첫 글자C)은 Å 단위 직교 좌표다. 스케일 인자(2행)가 격자 벡터와 Cartesian 좌표 모두에 곱해진다는 점에 주의한다.- 6행의 원소 순서가 POTCAR 합성 순서를 결정한다. 이 대응이 어긋나면 원자에 엉뚱한 pseudopotential이 붙는다.
- Selective dynamics — 좌표 형식 줄 앞에
Selective dynamics한 줄을 추가하면, 각 원자 좌표 뒤에T T F같은 플래그로 방향별 이동 허용(T)/고정(F)을 지정할 수 있다. 표면 slab의 아래층을 고정하는 등 부분 relax에 쓴다.
KPOINTS — k-점 샘플링
Gamma-centered 1x1x32 (transport axis z only)
0
Gamma
1 1 32
0 0 0
- 1행 주석, 2행의
0은 "격자를 자동 생성하라"는 뜻이다. - 3행이 격자 유형 —
Gamma(첫 글자G)는 Γ점을 포함하는 Gamma-centered 격자,Monkhorst(첫 글자M)는 Monkhorst-Pack 격자다. 짝수 분할의 Monkhorst-Pack은 Γ점을 지나지 않아 두 방식의 결과가 다를 수 있다. hexagonal cell은 대칭성 때문에 Gamma-centered가 필수이고, 그 외에도 헷갈리면 Gamma-centered를 쓰는 것이 안전하다. - 4행이 각 방향 분할 수, 5행이 shift다.
POTCAR — PAW 데이터셋
원소별 PAW 파일을 POSCAR 6행의 원소 순서 그대로 이어붙여 만든다.
cat $POTCAR_DIR/C/POTCAR > POTCAR # 단일 원소
cat $POTCAR_DIR/Hf/POTCAR $POTCAR_DIR/Se/POTCAR > POTCAR # 다원소 - POSCAR 순서대로
grep TITEL POTCAR # 합성 결과의 원소 순서 확인
POTCAR는 VASP 라이선스에 묶인 자산이다. 공개 저장소에 올리거나 라이선스가 없는 사람에게 전달하는 것은 라이선스 위반이며, 이 사이트의 예제 저장소에도 POTCAR는 포함되어 있지 않다. 각자 소속 기관의 potpaw 데이터베이스에서 합성해 사용한다.
출력 파일 사전
| 파일 | 내용 | 언제 쓰나 |
|---|---|---|
OUTCAR | 전체 로그 — 에너지·힘·응력·고유값·타이밍 | 가장 상세한 1차 확인 대상 |
OSZICAR | step별 한 줄 요약 — 전자 스텝 dE, 이온 스텝 E0 | 수렴 진행을 빠르게 추적 |
CONTCAR | 최종(또는 최신) 구조 — POSCAR와 같은 포맷 | 재시작 — POSCAR로 복사해 이어 돌리기 |
vasprun.xml | 전 과정의 구조화된 XML | pymatgen·ASE 등 파싱 도구의 입력 |
CHGCAR | 전하 밀도 | 밀도 시각화, 재시작 초기 밀도 — 대용량·재생성 가능 |
WAVECAR | 파동함수 | 후속 계산 가속 — 대용량·재생성 가능, cell이 바뀌면 재사용 불가 |
DOSCAR | DOS (LORBIT 설정 시 PDOS 포함) | DOS/PDOS 플롯 |
EIGENVAL | k-점별 고유값 | 밴드 플롯 |
PROCAR | 궤도·원자별 projection (LORBIT = 11) | fat band, 궤도 성분 분석 |
LOCPOT | 국소 포텐셜 (LVTOT 등 출력 태그 필요) | 진공 준위 기준 정렬, work function |
IBZKPT | 기약 Brillouin zone k-점 목록 | 실제 사용된 k-점 확인 |
XDATCAR | 이온 스텝별 좌표 궤적 | relax·MD 궤적 시각화 |
용량이 큰 CHGCAR·WAVECAR는 같은 입력으로 다시 돌리면 재생성되므로, 결과를 옮길 때는 보통 제외한다. 반면 OUTCAR·OSZICAR·CONTCAR와 입력 4종은 반드시 함께 보관한다 — 이것이 없으면 나중에 그 계산이 무엇이었는지 재구성할 수 없다.
OSZICAR 읽는 법 — 전자 루프와 이온 루프
OSZICAR에는 두 종류의 줄이 섞여 있다. 아래는 형식을 보여 주기 위한 예시 발췌다.
N E dE d eps ncg rms rms(c)
DAV: 1 -0.221893285000E+02 -0.22189E+02 -0.75173E+02 128 0.428E+01
DAV: 2 -0.229235436000E+02 -0.73421E+00 -0.71877E+00 256 0.512E+00
...
DAV: 12 -0.230284578000E+02 -0.32115E-08 0.11201E-08 128 0.231E-04 0.412E-05
1 F= -.23028458E+02 E0= -.23028410E+02 d E =-.957337E-04
DAV:(또는RMM:)로 시작하는 줄이 전자 루프다 — 이온을 고정한 채 SCF를 반복하는 과정.E가 현재 에너지,dE가 직전 반복 대비 변화다.dE의 절대값이EDIFF아래로 내려가면 전자 루프가 끝난다.- 숫자로 시작하는 줄이 이온 루프의 요약이다 —
1 F= ... E0= ... d E = ...에서 앞의 숫자가 이온 스텝 번호,F는 smearing 엔트로피 항을 포함한 free energy,E0은 외삽 에너지(보고용 값),d E는 직전 이온 스텝 대비 변화다. - relax가 잘 진행되면 이온 스텝이 넘어갈수록 전자 루프가 짧아진다(직전 밀도에서 출발하므로). 반대로 스텝마다 전자 루프가 수십 회씩 이어진다면 SCF 설정을 점검할 신호다.
마지막 이온 스텝의 에너지만 보려면 grep "E0=" OSZICAR | tail -n 1이 한 줄 처방이다. 다만 relax의 종료 판정은 에너지가 아니라 힘으로 한다 — OUTCAR의 힘 블록(grep -A 6 "TOTAL-FORCE" OUTCAR)에서 모든 원자의 힘이 EDIFFG 기준 아래인지 확인하는 절차를 챕터 03에서 실습한다.
stdout을 파일로 남기는 습관
VASP은 OUTCAR에 방대한 로그를 남기지만, 런타임 에러는 stdout·stderr에만 찍히는 경우가 있다 — MPI 중단 메시지, 라이브러리 에러, 메모리 부족, 일부 수치 진단이 대표적이다. stdout을 버리고 실행하면 계산이 왜 중단되었는지 알 수 없게 되므로, 항상 파일로 리다이렉트한다.
mpirun -np 4 vasp_std > vasp.out 2>&1
2>&1(stderr 병합)의 의미는 Linux와 터미널 기초를 참조한다. 배치 스케줄러 환경에서는 스케줄러가 stdout을 잡 로그 파일로 받아 주지만, 그 파일이 어디 생기는지는 확인해 두어야 한다.
이 튜토리얼에서 VASP의 역할
정리하면, 이 튜토리얼에서 VASP은 두 장면에 등장한다.
- 구조 확정 — carbon chain의 relax를 VASP으로 수행하고, 결과 구조를 SIESTA와 교차 검증한다 (챕터 03).
- hybrid functional reference — DFT 준위 오차를 보정할 때 기준 전자구조를 제공한다 (챕터 11).
transport 계산 자체는 국소 궤도가 필요하므로 SIESTA/TranSIESTA가 담당한다. 두 코드의 역할 분담을 기억해 두면 뒤 챕터의 워크플로우가 자연스럽게 읽힌다.