09. Finite bias — TS.Voltage와 bias chain
학습 목표
- Zero-bias 근사와 self-consistent finite-bias 계산의 차이를 설명하고, 언제 후자가 필수인지 판단할 수 있다.
- Bias chain(0 V에서 목표 전압까지 순차 진행)의 파일 이어받기 규칙 — 복사 필수 / 복사 금지 — 을 적용할 수 있다.
- 각 bias 디렉토리에서
TS.Voltage와TBT.Voltage를 둘 다 설정하고 grep으로 검증할 수 있다. - 화학 퍼텐셜 규약( 대칭)과 contour의
V심볼 참조 구조를 이해한다. - Bias별 비교와 stdout
Currents블록에서 전류를 읽을 수 있다.
배경: bias는 T(E) 자체를 바꾼다

그림 1. finite bias의 전위 프로파일 — 양쪽 전극은 bulk 경계조건()에 고정되고, 전압 강하는 산란 영역 안에서 일어난다. TranSIESTA가 self-consistent하게 결정하는 것이 바로 이 프로파일이다. (개념도)
챕터 08의 zero-bias 근사는 0 V에서 계산한 을 bias window로 적분해 전류를 어림한다.
이 근사는 bias가 전자 구조를 바꾸지 않는다고 가정한다. 그러나 실제로는 전압이 걸리면 산란 영역에 potential drop이 생기고, 준위들이 밀려나며, 자체가 의 함수 로 변형된다. Self-consistent finite-bias 계산은 각 전압에서 NEGF SCF를 다시 풀어
를 평가한다. 두 결과의 차이가 본질적인 대표 사례가 정류(rectification)와 부성 미분 저항(NDC)이다. 정류는 비대칭 구조에서 potential drop이 비대칭이 되어 와 가 달라지는 현상이고, NDC는 bias가 공명 준위들을 서로 어긋나게 밀어 전압을 올렸는데 전류가 줄어드는 현상이다. 둘 다 만으로는 원리적으로 재현할 수 없다.
Finite bias에서 TranSIESTA는 bias window 안의 비평형 밀도를 실수축 근 방 contour(챕터 06의 TS.Contours.nEq)로 적분한다. 0 V에서 미리 정의해 둔 그 블록이 여기서 실제로 쓰인다.
Bias chain: 0 V에서 순차적으로 올라간다
목표 전압을 한 번에 걸면 SCF가 발산하기 쉽다. 표준 절차는 직전 bias의 수렴 상태를 이어받아 전압을 단계적으로 올리는 bias chain이다. 이 예제는 0 V → 0.25 V → 0.5 V로 두 단계를 밟는다(음의 bias chain은 0 V에서 따로 분기한다).
work/
├── 01_electrode/ # 전극 정본 — 모든 bias가 경로 참조로 공유
├── 0bias/ # 챕터 06–07 완료 상태
├── 0.25bias/ # 0bias의 TSDE/DM/XV를 이어받아 시작
└── 0.5bias/ # 0.25bias의 TSDE/DM/XV를 이어받아 시작
파일 이어받기 규칙
새 bias 디렉토리에는 입력 파일과 함께 직전 bias의 수렴 상태 파일만 가져온다.
| 파일 | 처리 | 이유 |
|---|---|---|
trans.TSDE | 복사 필수 | DM + energy DM. 없으면 finite-bias 계산이 시작 즉시 에러로 중단된다 |
trans.DM | 복사 필수 | SCF initial guess — 수렴 가속 |
trans.XV | 복사 필수 | 구조. bias 간 geometry가 동일함을 보장 |
*.ion, *.ion.nc, *.ion.xml | 선택 | basis orbital 캐시 — 초기화 시간 약간 절약 |
trans.TSGFLeft, trans.TSGFRight | 복사 금지 | 전극 self-energy 캐시 — bias별로 다르다. 가져오면 header mismatch로 크래시 |
trans.TSCCEQ-*, trans.TSCCNEQ-* | 복사 금지 | contour checkpoint — bias별 캐시 |
trans.KP, trans.TS.KP | 복사 금지 | bias별 k-point 목록 |
H_MIXED*, trans.TSHS | 복사 금지 | 새 bias에서 자동 재생성된다 |
Electrode.TSHS | 복사하지 않음 | ../01_electrode/ 경로 참조 공유 — 챕터 05 |
TSDE 없이 finite bias를 시작하면 다음 에러로 즉 시 중단된다.
You have to calculate the 0 V and re-use the TSDE
디렉토리를 새로 만들어 필요한 파일만 복사하는 위 방식이 기본이다. 반대로 기존 디렉토리를 통째로 복제해서 쓰는 경우라면, 복사 금지 목록의 캐시 파일과 이전 계산의 stale 출력(stdout, MESSAGES, trans.STRUCT_OUT 등)을 반드시 지우고 시작해야 한다.
전압 설정 — 두 파일을 함께 고친다
새 bias 디렉토리에서 고칠 값은 두 곳이다.
TS.fdf의TS.Voltage→ 해당 bias (TranSIESTA SCF용)TBtrans.fdf의TBT.Voltage→ 해당 bias (TBtrans용)
fdf는 같은 키워드가 중복 정의되면 한쪽만 유효하다. input.fdf에 TS.Voltage 0.25 eV를 새로 써 넣어도 TS.fdf에 남아 있는 TS.Voltage 0.00000 eV가 그대로 유효하면 계산 전체가 0 V로 돌아간다 — 잡은 정상 종료하므로 나중에 결과를 보기 전까지 알아채기 어렵다. 반드시 TS.fdf와 TBtrans.fdf의 원래 정의 자리를 직접 고치고, 세팅 직후 grep으로 검증한다.
grep -i voltage TS.fdf TBtrans.fdf input.fdf
기대 출력 — TS.fdf와 TBtrans.fdf에만 해당 bias 값이 있고 input.fdf에는 없어야 한다.
TS.fdf:TS.Voltage 0.25000 eV
TBtrans.fdf:TBT.Voltage 0.25000 eV
mu와 contour는 자동으로 따라온다
챕터 06의 TS.fdf에서 화학 퍼텐셜은 대칭 규약 , 로 정의했고(한쪽을 0에 고정하고 반대쪽만 로 내리는 규약도 동등하다 — potential 기준점만 다르다), 평형·비평형 contour의 경계도 전부 V/2, |V|/2 같은 TS.Voltage 심볼 참조로 쓰여 있다. 따라서 TS.Voltage 한 줄만 바꾸면 과 모든 적분 경로가 자동으로 새 bias에 맞춰진다. mu 값이나 contour 경계를 bias마다 숫자로 다시 쓰는 실수를 구조적으로 차단하는 설계다.
실행
0.25 V 단계의 전체 절차다.
cd work
mkdir 0.25bias
# 입력 + pseudopotential
cp 0bias/input.fdf 0bias/TS.fdf 0bias/TBtrans.fdf 0.25bias/
cp 0bias/C.psml 0bias/N.psml 0.25bias/
# 직전 bias의 수렴 상태 (복사 필수 3종만)
cp 0bias/trans.TSDE 0bias/trans.DM 0bias/trans.XV 0.25bias/
cd 0.25bias
# TS.fdf: TS.Voltage 0.25000 eV 로 수정
# TBtrans.fdf: TBT.Voltage 0.25000 eV 로 수정
grep -i voltage TS.fdf TBtrans.fdf input.fdf # 검증 후 진행
siesta < input.fdf > siesta.stdout
tbtrans TBtrans.fdf > tbtrans.stdout
0.5 V는 같은 절차를 반복하되 0.25bias에서 TSDE/DM/XV를 가져온다 — 항상 직전 bias가 출발점이다. 전압 간격은 이 예제의 0.25 V처럼 수백 mV 이하로 잡는 것이 안전하고, SCF가 수렴에 애를 먹으면 간격을 더 잘게 쪼갠다.
출력 분석
전류 — stdout Currents 블록
Bias window가 열려 있으면 tbtrans stdout 끝부분의 Currents 블록에 전극 쌍별 전류가 출력된다.
grep -A3 -i "currents" tbtrans.stdout
# (모식 예시 — 정확한 형식·수치는 버전과 시스템에 따라 다르다)
Currents:
Left -> Right: V = 0.25 V ; I = 1.2E-05 A
교차 검증으로, 같은 bias의 trans.TBT.nc에서 를 직접 적분해 볼 수 있다. 저온 한계에서 전류는 bias window 구간의 적분이다.
import numpy as np
from scipy.constants import e, h
from sisl.io.tbtrans import tbtncSileTBtrans
def current(path, V):
t = tbtncSileTBtrans(path)
E = np.asarray(t.E) # E - E_F (eV)
T = np.asarray(t.transmission(*t.elecs[:2]))
mu_L, mu_R = +0.5 * V, -0.5 * V
mask = (E >= mu_R) & (E <= mu_L)
integral = np.trapz(T[mask], E[mask]) # eV 단위
return (2 * e / h) * integral * e # A
print(current("0.25bias/trans.TBT.nc", 0.25))
stdout 값은 유한 온도 Fermi 함수 가중이 포함되므로 저온 적분과 미세하게 다를 수 있다.
Bias별 T(E) 비교
Bias chain의 핵심 산출물은 의 변형 그 자체다. 세 bias의 를 겹쳐 그린다.
import matplotlib.pyplot as plt
from sisl.io.tbtrans import tbtncSileTBtrans
cases = {"0 V": "0bias/trans.TBT.nc",
"0.25 V": "0.25bias/trans.TBT.nc",
"0.5 V": "0.5bias/trans.TBT.nc"}
fig, ax = plt.subplots(figsize=(7, 6))
for label, path in cases.items():
t = tbtncSileTBtrans(path)
ax.semilogy(t.E, t.transmission(*t.elecs[:2]), label=label)
ax.axvspan(-0.25, 0.25, alpha=0.1) # 0.5 V bias window
ax.set_xlabel(r"$E - E_F$ (eV)")
ax.set_ylabel(r"$T(E)$")
ax.legend()
fig.savefig("TE_bias_compare.png", dpi=300, bbox_inches="tight")
읽는 포인트는 두 가지다. 첫째, bias window 안에서 가 0 V 곡선에서 얼마나 벗어나는가 — 벗어남이 작으면 zero-bias 근사(챕터 08)가 이 시스템·이 전압 범위에서 정당하다는 사후 검증이 된다. 둘째, N dip 같은 공명 구조가 bias에 따라 이동·변형되는가 — 이것이 NDC와 정류의 미시적 기원이다.
연습문제
trans.TSDE없이 새 디렉토리에서 0.5 V를 바로 시작해 보고, 본문의 에러 메시지를 stdout에서 확인하라. 그 다음 TSDE를 복사해 재실행하고 차이를 기록하라.- 0.25 V를 건너뛰고 0 V의 TSDE로 0.5 V를 직접 계산해 보라. 0.25 V를 거친 chain과 비교해 SCF iteration 수가 어떻게 달라지는지, 최종 결과는 일치하는지 확인하라.
- 챕터 06 연습문제 1의 비대칭 device(N을 8번 원자에 배치)로 V를 계산하고, 정류비 를 구하라. 와 의 차이로 결과를 해석하라.