02. 밴드 구조와 DOS
챕터 01의 cumulene 계산에 밴드 경로와 PDOS 블록을 추가해 전자구조를 들여다본다. 목표는 두 가지다 — 등간격 carbon chain이 금속임을 밴드와 DOS로 확인하는 것, 그리고 그 금속 상태가 Peierls 불안정성 때문에 결합 길이 교대(BLA)를 가진 polyyne으로 넘어가려 한다는 것을 이해하는 것이다. 이 물리는 튜토리얼 마지막의 미니프로젝트(polyyne–cumulene 접합)의 토대가 된다.
학습 목표
BandLines/BandLinesScale로 1D 밴드 경로(Γ–Z)를 정의한다siesta.bands파일의 구조를 이해하고 python으로 직접 플롯한다%block ProjectedDensityOfStates로 DOS/PDOS를 계산한다- cumulene의 금속성(half-filled π 밴드)을 밴드·DOS에서 읽는다
- Peierls 불안정성과 polyyne gap의 관계를 설명한다
배경
1D Brillouin zone과 Γ–Z 경로
방향으로만 주기적인 시스템의 Brillouin zone은 1차원 구간 이다. 시간 반전 대칭 덕분에 절반만 보면 되고, 관례적으로 zone 중심을 Γ, 경계 를 Z라고 부른다. 밴드 경로는 Γ–Z 하나면 충분하다 — , 는 진공이라 분산이 없다.
cumulene은 왜 금속인가
탄소의 valence 전자 4개 중 2개는 사슬 방향의 sp 혼성 σ 결합에, 나머지 2개 는 사슬에 수직인 두 p 궤도(, )가 만드는 이중 축퇴 π 밴드에 들어간다. 등간격 사슬에서 이 π 밴드는 정확히 반만 채워진다(half-filling). 반만 찬 밴드는 Fermi 준위를 가로지르므로 cumulene은 금속이다.
한 가지 주의 — 등간격 사슬의 진짜 주기는 원자 1개( Å)인데 우리는 4원자 cell()을 쓰고 있다. Brillouin zone이 4분의 1로 줄면서 primitive cell의 밴드가 4겹으로 접혀(folding) 들어오고, half-filled π 밴드의 Fermi 교차점은 접힌 zone의 Γ 부근에 나타난다. 밴드 수가 많고 복잡해 보여도 물리는 같다.
Peierls 불안정성 — polyyne으로 가는 길
1D 금속은 격자 변형에 대해 본질적으로 불안정하다(Peierls 정리). 사슬이 이량체화(dimerization)하면 — 결합이 짧고 긴 것으로 교대하면(bond length alternation, BLA) — Fermi 교차점에 gap이 열리고, 점유 상태의 에너지가 내려가 전체 전자 에너지가 이득을 본다. carbon chain에서 이 왜곡된 상(相)이 polyyne(단일결합·삼중결합 교대, 예: 1.34/1.24 Å)이며, gap이 열린 반도체다.

그림 1. Peierls 불안정성의 밴드 개형(tight-binding 개념도) — 등간격 cumulene은 밴드가 zone 경계에서 를 가로지르는 금속이고, BLA가 생기면 그 자리에 gap 가 열린다.
즉 같은 원자, 같은 밀도의 사슬이 결합 길이 배열 하나로 금속(cumulene)과 반도체(polyyne)를 오간다. 이 대비는 미니프로젝트에서 두 상의 접합을 만들어 transport로 다시 확인한다.
DOS와 PDOS
상태 밀도는
로 정의되며, 실제 계산에서는 δ 함수를 유한한 폭(broadening)의 Gaussian으로 대체해 얻는다. PDOS(projected DOS)는 이것을 원자·궤도 성분으로 분해한 것으로, "Fermi 준위 근처 상태가 어느 궤도에서 오는가"에 답한다. cumulene이라면 근처가 C의 성분(π 밴드)으로 지배되는 것을 볼 수 있다.
입력 파일
챕터 01의 input.fdf를 그대로 두고 아래 블록을 파일 끝에 추가한다(시스템·기저·k-grid 설정은 동일 — 같은 시스템 재사용). 전체 파일은 예제 저장소의 code/ch02-bands에 있다.
# --- 밴드 구조: Gamma-Z ---
BandLinesScale ReciprocalLatticeVectors
%block BandLines
1 0.000 0.000 0.000 \Gamma
60 0.000 0.000 0.500 Z
%endblock BandLines
WriteEigenvalues T
# --- DOS / PDOS ---
%block ProjectedDensityOfStates
-20.00 10.00 0.100 2000 eV
%endblock ProjectedDensityOfStates
%block PDOS.kgrid_Monkhorst_Pack
1 0 0 0.0
0 1 0 0.0
0 0 128 0.0
%endblock PDOS.kgrid_Monkhorst_Pack
라인 해설
BandLinesScale ReciprocalLatticeVectors—BandLines의 k 좌표를 역격자 벡터 기준 분율로 해석한다. 가 곧 Z()다.%block BandLines— 각 줄이점 개수, k 좌표 3개, 라벨. 첫 줄의1은 경로의 시작점을 뜻하고, 둘째 줄의60은 Γ에서 Z까지 60개 점으로 잇는다는 뜻이다. 라벨\Gamma는siesta.bands파일에 그대로 기록되어 플롯 도구가 눈금 이름으로 쓴다.WriteEigenvalues T— SCF 샘플링 k-점의 고유값을 출력에 남긴다.%block ProjectedDensityOfStates—Emin Emax broadening 점수 단위순서다. eV에서 eV 구간을 0.1 eV Gaussian broadening, 2000개 에너지 점으로 계산한다. 에너지는 Fermi 준위 기준이 아니라 절대 스케일(고유값과 같은 기준)이므로, 플롯할 때 를 빼서 그린다.%block PDOS.kgrid_Monkhorst_Pack— PDOS 전용 k-grid. DOS는 밴드보다 k-수렴에 민감하므로 SCF grid(64)보다 조밀한 128을 따로 지정한다.
실행
챕터 01과 동일하다.
siesta < input.fdf > siesta.out
SCF가 수렴한 뒤 밴드 경로 계산과 PDOS 계산이 이어서 수행되고, siesta.bands와 siesta.PDOS(XML 형식)가 추가로 생성된다. 챕터 01의 siesta.DM이 남아 있는 디렉토리에서 돌리면 DM.UseSaveDM T 덕분에 SCF가 몇 번의 반복 만에 끝난다.
출력 분석

그림 2. TB 모델로 계산한 1D chain의 밴드와 DOS — 이 챕터의 SIESTA 계산이 주는 결과의 정성 형태다. 밴드 끝마다 DOS의 van Hove 봉우리가 선다. (TB 모델 실계산, _scripts/fig_examples_batch.py)
siesta.bands 파일 구조
siesta.bands는 고정된 구조의 텍스트 파일이다.
-4.591428 # 1행: Fermi energy (eV)
0.000000 0.322190 # 2행: 경로 좌표 최소/최대
-24.376912 8.914327 # 3행: 고유값 최소/최대 (eV)
52 1 61 # 4행: 밴드 수, 스핀 수, k-점 수
0.000000 -24.376912 -24.301523 ... # 이후: k좌표 + 고유값들
... # (한 k-점의 고유값이 여러 줄로 wrap됨)
2 # 끝: 라벨 수
0.000000 '\Gamma'
0.322190 'Z'
- 첫 줄의 Fermi energy를 읽어 두 축 기준 로 옮기는 것이 플롯의 첫 단계다.
- 밴드 수 52는 4원자 × DZP 궤도 13개에서 온다.
- k 좌표 열은 경로를 따라 누적된 거리다. 절대 단위는 플롯에 중요하지 않다 — 양 끝점에 Γ, Z 라벨만 달면 된다.
python으로 밴드 플롯
고유값이 여러 줄로 wrap되어 있어도 토큰 단위로 읽으면 파서가 간단해진다.
import numpy as np
import matplotlib.pyplot as plt
tokens = open("siesta.bands").read().split()
it = iter(tokens)
ef = float(next(it)) # Fermi energy
kmin, kmax = float(next(it)), float(next(it))
emin, emax = float(next(it)), float(next(it))
nb, ns, nk = int(next(it)), int(next(it)), int(next(it))
k = np.empty(nk)
E = np.empty((nk, nb * ns))
for ik in range(nk):
k[ik] = float(next(it))
E[ik] = [float(next(it)) for _ in range(nb * ns)]
plt.figure(figsize=(4, 6))
plt.plot(k, E - ef, color="C0", lw=1.2)
plt.axhline(0.0, color="k", ls="--", lw=0.8)
plt.xticks([k[0], k[-1]], [r"$\Gamma$", "Z"])
plt.xlim(k[0], k[-1])
plt.ylim(-10, 10)
plt.ylabel(r"$E - E_F$ (eV)")
plt.tight_layout()
plt.savefig("bands.png", dpi=300)
sisl을 쓰면 더 짧다 — sisl.get_sile("siesta.bands")로 파일 객체를 얻어 데이터를 읽을 수 있다. 다만 이 장에서는 파일 구조를 직접 이해하는 것이 목적이므로 수동 파서를 기본으로 한다.
밴드 해석
플롯에서 확인할 것:
- (그림의 0 eV)를 가로지르는 밴드가 있다 — 금속이다.
- Fermi 교차점 근처의 밴드는 이중 축퇴되어 있다(, π 밴드의 축퇴). 두 밴드가 정확히 겹쳐 있어 선이 하나로 보이지만, 파일에서 고유값을 확인하면 같은 값이 두 번 나타난다.
- 4원자 cell을 썼기 때문에 밴드가 접혀 들어와 있다. 배경 절에서 설명했듯 half-filled π 밴드의 교차점은 접힌 zone의 Γ 부근에 나타난다.
PDOS
siesta.PDOS는 XML 형식으로, 각 궤도의 projection이 에너지 함수로 기록되어 있다. sisl로 읽어 원하는 궤도 조합으로 합산할 수 있고, 총 DOS만 필요하면 모든 projection의 합이 곧 총 DOS다. 확인할 물리는 하나다 — 에서 DOS가 유한하고(금속), 그 성분이 C의 궤도(π 밴드)에서 온다는 것.
연습문제
-
polyyne 밴드 — 원자 좌표만 아래처럼 바꿔(결합 교대 1.24/1.34 Å, cell 길이는 5.16 Å 유지) 같은 계산을 반복하고 밴드를 겹쳐 그려라. Γ 부근의 Fermi 교차점이 사라지고 gap이 열리는 것을 확인하라. gap 크기(eV)를 밴드에서 읽고, 총에너지가 cumulene보다 낮아졌는지(원자당 몇 meV) 비교하라.
%block AtomicCoordinatesAndAtomicSpecies7.500000 7.500000 0.000000 17.500000 7.500000 1.240000 17.500000 7.500000 2.580000 17.500000 7.500000 3.820000 1%endblock AtomicCoordinatesAndAtomicSpecies -
folding 확인 — 원자 1개짜리 primitive cell( Å, k-grid는 )로 cumulene을 다시 계산해 밴드를 그려라. 4원자 cell의 밴드가 primitive 밴드를 4겹으로 접은 것과 일치하는지, Fermi 교차점이 primitive zone의 어디에 있는지() 확인하라.
-
broadening의 영향 — PDOS의 broadening을 0.05, 0.1, 0.3 eV로 바꿔 DOS를 겹쳐 그려라. broadening이 크면 1D 시스템 특유의 van Hove 특이점(밴드 끝의 뾰족한 봉우리)이 퍼져 흐려지는 것을 관찰하라.
구조가 에너지·밴드를 바꾸는 것을 확인했으니, 다음 장에서는 그 구조 자체를 어떻게 확정하는지 다룬다 — 챕터 03 — VASP으로 구조 최적화.