본문으로 건너뛰기

07. TBtrans — T(E)와 DOS/PDOS

학습 목표

  • TBtrans가 TranSIESTA 수렴 결과로부터 transmission T(E)T(E)와 DOS를 계산하는 후처리 도구임을 이해한다.
  • 무거운 출력 옵션을 배제한 미니멀 TBtrans.fdf 를 작성할 수 있다.
  • 수치 broadening η\eta와 에너지 격자 간격 delta의 관계를 알고 함께 설정할 수 있다.
  • sisl로 trans.TBT.nc에서 T(E)T(E), DOS, PDOS를 추출하고 log 축으로 플롯할 수 있다.
  • Pristine chain의 정수 plateau와 N 치환이 만드는 dip을 물리적으로 해석할 수 있다.

배경: TBtrans는 SCF가 아니라 후처리다

챕터 06에서 TranSIESTA SCF가 수렴한 Hamiltonian(trans.TSHS)이 있으면, transmission은 Caroli 공식

T(E)=Tr ⁣[ΓL(E)G(E)ΓR(E)G(E)]T(E) = \mathrm{Tr}\!\left[\, \Gamma_L(E)\, G(E)\, \Gamma_R(E)\, G^{\dagger}(E) \,\right]

의 단순 평가다. 여기에 자기일관성은 없다 — TBtrans는 고정된 HH를 읽어 에너지 격자 위에서 G(E)G(E)T(E)T(E), DOS를 계산하는 후처리 도구다. 구현과 입력 형식은 Papior et al. [4]을 따른다. 그래서 에너지 범위·격자 간격은 SCF를 다시 돌리지 않고 바꿔 재실행할 수 있다.

DOS는 두 방식으로 나온다. Green function DOS(ImTr[GS]/π-\mathrm{Im}\,\mathrm{Tr}[G S]/\pi, TBT.DOS.Gf)는 device의 전체 상태를, spectral function DOS(TBT.DOS.A)는 특정 전극에서 주입되어 도달 가능한 상태만 담는다. 둘의 차이로 전극과 연결되지 않은 국소 상태(bound state)를 진단할 수 있다.

입력 파일: 미니멀 TBtrans.fdf

0bias/ 디렉토리에 다음 파일을 추가한다. 구조·전극 정의는 %include input.fdf로 재사용한다(input.fdf가 다시 TS.fdf를 include하므로 TS.Elecs 블록까지 함께 읽힌다).

0bias/TBtrans.fdf
# ------------------------------------------------------------
# 07. TBtrans — T(E) / DOS / PDOS (0 V)
# 미니멀 옵션 세트 — 무거운 출력 옵션은 의도적으로 배제
# ------------------------------------------------------------
%include input.fdf

TBT.Voltage 0.00000 eV
TBT.nc.write T

# ----- 출력 선택 -----
TBT.DOS.Gf T # Green function DOS
TBT.DOS.Elecs T # 전극 bulk DOS
TBT.DOS.A T # spectral function DOS
TBT.DOS.A.All T # 모든 전극의 spectral DOS
TBT.T.All T # 모든 전극 쌍의 transmission
TBT.PDOS T # orbital-projected DOS

# ----- Green function을 풀 영역 -----
%block TBT.Atoms.Device
atom [5 -- 16]
%endblock TBT.Atoms.Device

# ----- 에너지 격자와 broadening -----
TBT.Contours.Eta 0.001 eV

%block TBT.Contours
line
%endblock TBT.Contours

%block TBT.Contour.line
from -3.00 eV to 3.00 eV
delta 0.001 eV
method mid-rule
%endblock TBT.Contour.line
키워드의미
TBT.VoltageTBtrans가 가정하는 bias. 0 V 계산이므로 0. finite bias에서는 TranSIESTA 쪽 TS.Voltage와 반드시 같은 값이어야 한다(챕터 09)
TBT.nc.writesisl 후처리에 쓸 trans.TBT.nc 출력 강제
TBT.DOS.*, TBT.T.All, TBT.PDOStrans.TBT.nc에 저장할 물리량 선택
TBT.Atoms.DeviceGreen function을 실제로 푸는 원자 범위. 전극 복제 영역(1–4, 17–20)을 제외한 산란 영역 5–16만 지정하면 행렬이 작아져 계산이 가볍다
TBT.Contours.Etadevice Green function의 수치 broadening η\eta (아래 절)
TBT.Contour.line실수축 에너지 격자 — EFE_F 기준 3-3 eV에서 +3+3 eV까지 1 meV 간격
함정 1 — 무거운 출력 옵션을 넣지 않는다

TBT.T.Bulk, TBT.T.Eig, TBT.Current.Orb 같은 옵션은 nc 파일을 수 GB로 키우고 메모리 부족(OOM)을 부르기 쉽다. 특히 eigenchannel 정보는 텍스트 출력(TBT.T.Eig)이 없어도 trans.TBT.nc의 Green function/spectral function으로부터 sisl 후처리로 전부 얻을 수 있으므로(챕터 10), 여기 미니멀 세트에서 의도적으로 뺐다.

함정 2 — TBT.kgrid_Monkhorst_Pack의 위치

%block TBT.kgrid_Monkhorst_PackTBtrans.fdf 안에 넣으면 transport 방향 k가 1로 자동 축소된다. TBtrans의 k-grid를 직접 제어하려면 이 블록을 input.fdf의 맨 마지막에 두어야 한다. 이 예제는 xx, yy가 vacuum이라 k-grid가 사실상 Γ\Gamma 한 점이면 충분해 블록 자체가 필요 없지만, 횡방향으로 주기적인 bulk 전극 시스템에서는 이 위치 규칙을 지키지 않으면 k 수렴이 경고 없이 깨진다.

η와 delta는 동반 설정한다

η\eta는 Green function G=[(E+iη)SHΣLΣR]1G = [(E + i\eta)S - H - \Sigma_L - \Sigma_R]^{-1}의 허수부로 들어가는 수치 broadening이다. 모든 스펙트럼 구조가 폭 η\sim\eta의 Lorentzian으로 퍼지므로, η\eta가 과대하면 날카로운 공명이 인공적으로 낮아지고 T(E)T(E)가 억제된다. 반대로 η\eta보다 에너지 격자 간격 delta가 크면 폭 η\eta의 구조가 격자 사이로 빠져나간다. 따라서 delta는 η\eta보다 작거나 비슷하게(delta η\lesssim \eta) 잡는다. 이 예제는 η=1\eta = 1 meV, delta =1= 1 meV다. η\eta 선택이 결과에 미치는 영향은 Advanced 챕터에서 정량적으로 다룬다.

실행

전제: 0bias/에 챕터 06의 수렴 결과 trans.TSHS가 있어야 하고, 전극 ../01_electrode/Electrode.TSHS도 그대로 필요하다.

cd work/0bias
tbtrans TBtrans.fdf > tbtrans.stdout

출력 분석

TB 모델 T(E) 예시

그림 1. TB 모델 NEGF 실계산 — pristine chain의 T=1T=1 plateau(회색 점선)와, chain에 국소 준위(ϵ=+1.0\epsilon=+1.0 eV)가 결합된 device의 Fano antiresonance dip(파랑). 불순물 준위가 만드는 dip이라는 점에서 이 챕터의 C19N 계산이 주는 결과의 정성 형태다. (_scripts/fig_examples_batch.py)

tail -3 tbtrans.stdout
ls trans.TBT.nc

핵심 산출물은 trans.TBT.nc 하나다. NetCDF 컨테이너에 에너지 격자, T(E)T(E), DOS, orbital-resolved DOS가 모두 들어 있다.

sisl로 T(E)·DOS·PDOS 추출

텍스트 출력(AVTRANS 계열)을 파싱하는 방식은 에너지 격자 정렬·k 평균 처리가 불명확해 지양한다. trans.TBT.nc를 sisl로 읽는 것을 표준으로 한다. sisl은 에너지를 EEFE - E_F (eV)로 정렬해 주고 k 평균을 일관되게 적용한다.

plot_te.py
import numpy as np
import matplotlib.pyplot as plt
from sisl.io.tbtrans import tbtncSileTBtrans

t = tbtncSileTBtrans("trans.TBT.nc")

E = t.E # E - E_F (eV)
T = t.transmission(*t.elecs[:2]) # Left -> Right, k 평균 자동

fig, ax = plt.subplots(figsize=(7, 6))
ax.semilogy(E, T) # T(E)는 수 자릿수를 오가므로 log 축이 기본
ax.set_xlabel(r"$E - E_F$ (eV)")
ax.set_ylabel(r"$T(E)$")
fig.savefig("TE.png", dpi=300, bbox_inches="tight")

DOS와 PDOS도 같은 파일에서 나온다. sisl의 원자 인덱스는 0-based라는 점만 주의한다 — fdf의 11번 원자(N)는 sisl에서 10이다.

plot_dos.py
dos_gf = t.DOS() # Green function DOS (device 영역 전체)
ados_L = t.ADOS(t.elecs[0]) # Left 전극에서 주입된 spectral DOS

# 원자 projection — N 원자만 / 나머지 C 원자만
dos_N = t.DOS(atoms=[10])
dos_C = t.DOS(atoms=[a for a in range(4, 16) if a != 10])

dos_gfados 합(Left + Right)의 차이가 큰 에너지는 전극과 결합하지 않은 국소 상태의 신호다.

물리 해석: plateau와 dip

T(E)T(E)를 읽는 기준은 두 가지다.

  • Pristine chain의 정수 plateau. 결함이 없는 주기 chain이라면 T(E)T(E)는 그 에너지에서 transport 방향으로 열려 있는 밴드(채널)의 개수와 같다 — ballistic 한계에서 transmission은 열린 채널 수를 세는 것과 같다. 등간격 carbon chain은 EFE_F 근방에서 이중 축퇴 π\pi 밴드가 지나므로 T(EF)=2T(E_F) = 2 plateau가 기대된다.
  • N 치환이 만드는 dip. 치환 원자는 산란 퍼텐셜로 작용해 π\pi 채널에 backscattering을 일으킨다. T(E)T(E)는 plateau 아래로 내려앉고, N이 유도한 준국소 준위 근방에서는 공명–반공명 구조(날카로운 dip)가 나타난다. plateau에서 얼마나 깎였는지가 산란 세기의 직접적인 척도다.

pristine plateau와 N 치환 dip의 T(E) 개형

그림 2. T(E)T(E) 읽기의 두 기준(개념도, 계산 결과 아님) — pristine chain은 열린 채널 수를 세는 정수 plateau(EFE_F 근처 T=2T = 2)를 보이고, N 치환 device는 plateau 아래로 억제되며 N 준위 근방에 날카로운 antiresonance dip이 생긴다.

연습 삼아 N을 C로 되돌린 pristine device의 T(E)T(E)를 같은 축에 겹쳐 그리면 두 그림의 차이가 명확해진다.

연습문제

  1. delta를 0.001 eV에서 0.01 eV로 늘려 재실행하고, N dip의 깊이·폭이 어떻게 달라지는지 비교하라. delta와 η\eta의 관계로 결과를 설명하라.
  2. N을 C로 되돌린 pristine C20 device로 챕터 06–07을 반복하고, 두 T(E)T(E)를 겹쳐 그려 정수 plateau와 dip을 확인하라.
  3. TBT.Atoms.Device를 원자 1–20 전체로 넓혀 재실행해 보라. T(E)T(E)가 달라지는지, 계산 시간과 메모리는 어떻게 변하는지 관찰하고 그 이유를 설명하라.