입력 파일의 해부
ORCA 입력 파일은 자유 형식(free format) ASCII다. 들여쓰기는 마음대로 해도 되고, 대소문자도 가리지 않는다(파일 이름은 예외). 구성은 크게 세 덩어리다.
# ① 키워드 라인 — 한 줄로 주요 설정을 끝낸다
! B3LYP def2-TZVP TightSCF Opt
# ② 블록 — 세부 옵션을 상세히 지정한다
%scf
MaxIter 200
end
# ③ 좌표 입력
* xyz 0 1
O 0.000 0.000 0.119
H 0.000 0.763 -0.477
H 0.000 -0.763 -0.477
*
이 셋만 알면 웬만한 계산은 다 할 수 있다. 하나씩 뜯어보자.
키워드 라인 !
느낌표(!)로 시작하는 줄을 “단순 입력(simple input)”이라고 부른다.
원래라면 여러 블록에 흩어져야 할 설정을 한 줄로 압축해 주는 셈이다. 줄을 여러 개 둬도 되고,
공백으로 구분해 한 줄에 몰아 적어도 된다.
# 두 형식 모두 동등
! B3LYP def2-TZVP TightSCF
! RIJCOSX def2/J Opt Freq
# 한 줄에 적어도 동일
! B3LYP def2-TZVP TightSCF RIJCOSX def2/J Opt Freq
키워드는 대략 이런 범주로 나뉜다.
| 범주 | 예시 | 의미 |
|---|---|---|
| 방법(메소드) | HF, B3LYP, MP2, CCSD(T), DLPNO-CCSD(T) | 전자 구조 이론의 선택. |
| 기저집합 | def2-SVP, def2-TZVP, cc-pVTZ | 원자 궤도 기저집합. |
| 보조 기저집합 | def2/J, def2-TZVP/C | RI/RIJCOSX에 필요한 피팅 기저집합. |
| 작업 유형(Runtype) | Opt, Freq, EnGrad, NumFreq, NEB-TS | 단일점, 최적화, 진동수 등. |
| 알고리즘 옵션 | RIJCOSX, RI-JK, UKS, UNO | 적분 근사, 스핀 처리 등. |
| 수렴 임계값 | NormalSCF, TightSCF, VeryTightSCF | SCF 수렴 기준의 엄격함. |
| 적분 격자 | DefGrid1, DefGrid2, DefGrid3 | DFT 수치 적분 격자(기본 DefGrid2). |
| 용매 효과 | CPCM(water), SMD(ethanol) | 음폐 용매 모델. |
| 병렬 | PAL4, PAL8, ..., PAL64 | 코어 개수 지정. |
! B3LYP def2-TZVP Opt와 ! Opt def2-TZVP B3LYP는 완전히 같다.
다만 읽기 좋으라고 보통 방법 → 기저집합 → 보조 기저집합 → 작업 유형 → 옵션 순서로 적는다.
블록 입력 %...end
더 세밀하게 건드려야 할 때는 블록 입력을 쓴다. %로 시작해 end로 끝나고,
안쪽에는 “변수 = 값” 꼴로 옵션을 적는다.
# SCF 수렴 관련 세부 설정
%scf
MaxIter 300 # 최대 반복 횟수
ConvForced 1 # 비수렴 시에도 강제 진행
DIIS true # DIIS 가속 사용
SOSCF true # SOSCF 사용
end
# DFT 함수의 세부 설정
%method
Functional B3LYP
RunTyp Opt
end
# 최적화 옵션
%geom
MaxIter 200
Constraints
{ B 0 1 1.25 C } # 1-2 결합 길이 1.25 Å로 고정
end
end
자주 보게 되는 블록만 추리면 이렇다.
| 블록 | 역할 |
|---|---|
%scf | SCF 수렴 관련 옵션(반복 횟수, DIIS, level shift 등). |
%method | 함수, 작업 유형 등 메소드 일반. |
%basis | 원자별 기저집합 변경, ECP 지정. |
%geom | 최적화 옵션, 제약 조건, 표면 스캔. |
%freq | 진동수 계산 옵션(증분, 양측 차분 등). |
%cpcm | 음폐 용매 모델 세부 설정. |
%tddft / %cis | TD-DFT, CIS 들뜬 상태 옵션. |
%mp2 | MP2 관련(DLPNO 임계값 등). |
%mdci | Coupled-cluster 옵션. |
%casscf | 다중참조 활성공간 옵션. |
%neb | Nudged Elastic Band 설정. |
%pal | 병렬 프로세스 설정. |
%maxcore | 코어당 메모리(MB). |
%output | 출력 상세 수준 제어. |
좌표 입력 방식
좌표는 * ... *로 둘러싼 블록에 적는다. 형식은 세 가지다.
① 데카르트 좌표 (xyz)
가장 흔하고 무난한 방식이다. 단위는 기본이 옹스트롬(Å)이다.
* xyz 0 1 # 전하 0, 다중도 1 (싱글릿)
C 0.000000 0.000000 0.000000
O 0.000000 0.000000 1.130000
*
전하와 다중도 표기는 익숙해져 둘 필요가 있다. 예를 들어 양이온 라디칼 CO+(전자가 하나 빠진 도플렛)는 이렇게 적는다.
* xyz 1 2 # 전하 +1, 다중도 2 (도플렛, S = 1/2)
C 0.0 0.0 0.0
O 0.0 0.0 1.1105
*
다중도(multiplicity)는 2S + 1로 구한다. 짝 없는 전자 수에 따라
싱글릿 = 1, 도플렛 = 2, 트리플렛 = 3 식이다.
홀수 전자 시스템이면 ! UKS(또는 ! UHF)를 같이 붙여 주는 게 좋다.
② 내부 좌표 (Z-matrix)
int 키워드를 쓰면 결합 길이·각도·이면각으로 좌표를 줄 수 있다.
작은 분자거나, 최적화에서 특정 결합 길이를 직접 쥐고 싶을 때 편하다.
* int 0 1
C 0 0 0 0.0 0.0 0.0
O 1 0 0 1.2 0.0 0.0 # C와 1.2 Å 결합
H 1 2 0 1.1 120.0 0.0 # C-H 1.1, OCH 각도 120°
H 1 2 3 1.1 120.0 180.0 # 이면각 180°
*
연결 규칙은 이렇다.
- NA: 현재 원자와 거리(RN)를 공유하는 원자.
- NB: 현재 원자가 NA·NB와 각도(AN)를 이루는 원자.
- NC: 이면각(DN)을 구성하는 네 번째 원자. NA-NB 축을 따라 내려다본 각도다.
각도는 전부 도(degree) 단위고, 원자 번호는 1부터 센다(드문 예외 중 하나다).
③ Gaussian Z-matrix (gzmt)
Gaussian이 쓰는 Z-matrix와 같은 형식이다. Gabedit, Avogadro, Molden 같은 GUI 도구가 이 형식으로 자주 내보낸다.
* gzmt 0 1
C
O 1 1.200
H 1 1.100 2 120.0
H 1 1.100 2 120.0 3 180.0
*
외부 파일에서 좌표 읽기
좌표를 따로 파일로 빼면 입력 파일이 깔끔해진다. 가장 흔한 형식은 표준 .xyz다.
# mycoords.xyz 파일에서 좌표를 읽음
! B3LYP def2-SVP Opt
* xyzfile 0 1 mycoords.xyz
.xyz 파일의 표준 형식은 이렇다.
3
Water molecule, optimized at B3LYP/def2-TZVP
O 0.000000 0.000000 0.119262
H 0.000000 0.763239 -0.477047
H 0.000000 -0.763239 -0.477047
첫 줄은 원자 개수, 둘째 줄은 주석(아무 내용이나 무방), 셋째 줄부터 좌표다.
Gaussian Z-matrix 파일은 * gzmtfile 0 1 file.gzmt로 읽는다.
특수 원자 — 가짜 원자, 점전하, 동위원소
| 표기 | 의미 |
|---|---|
DA, X, Xx | 더미 원자(dummy atom). 좌표 정의용 가상 원자. |
O: (콜론) | 고스트 원자. 기저집합만 두고 원자는 없음(BSSE 보정용). |
Q | 점전하. 뒤에 전하값을 적는다. |
O> (꺾쇠) | 매장 포텐셜(embedding potential). |
M = 2.014 | 비표준 동위원소 질량 지정. |
Z = 5.5 | 핵 전하 변경(분수 가능). |
0.5$ | 좌표 뒤에 $를 붙이면 그 성분이 고정된다. |
아래는 HD(중수소화 수소)의 진동수 계산 예다. 두 번째 수소를 중수소로 지정했다.
! B3LYP def2-TZVP Opt Freq
* xyz 0 1
H 0.0 0.0 0.000
H 0.0 0.0 0.741 M = 2.014
*
하나의 파일에 여러 작업 — $new_job
ORCA는 입력 파일 하나에 여러 작업을 차례로 태울 수 있다. “싼 방법으로 구조 최적화 → 정밀한 방법으로 단일점 에너지” 같은 패턴이 흔하다.
# Step 1: BP86/def2-SVP 수준으로 구조 최적화
! BP86 def2-SVP def2/J Opt
* xyz 0 1
O 0.0 0.0 0.119
H 0.0 0.763 -0.477
H 0.0 -0.763 -0.477
*
$new_job
# Step 2: 위 최적화 구조에 대해 B3LYP/def2-TZVPP 단일점
! B3LYP def2-TZVPP RIJCOSX def2/J TightSCF
* xyzfile 0 1
$new_job 뒤에서 좌표를 xyzfile로 주되 파일명을 생략하면,
직전 작업에서 최적화된 좌표가 그대로 넘어온다. 꽤 편한 기능이다.
반복 계산이나 조건 분기가 들어가는 복잡한 워크플로우는 ORCA 6의 Compound 모듈로 자동화할 수 있다.
%compound 블록 안에서 변수·반복문·조건문·출력 포맷을 직접 짠다.
매뉴얼 7.59절과 GitHub 공식 스크립트 저장소(ORCAQuantumChemistry/CompoundScripts)에 예제가 많다.
자동화 한 발 더 — Compound 모듈로 결합 해리 곡선
$new_job 만으로도 여러 단계를 한 입력에 묶을 수 있지만,
“좌표 하나만 바꿔 가며 같은 계산 20번” 같은 건 손으로 풀어 쓰면 입력이
금방 수백 줄로 불어난다. Compound 모듈은 이런 반복을 변수와 for-loop로
줄여 준다.
예제 ① — H2 결합 해리 곡선
수소 분자의 H-H 거리를 0.5 Å에서 3.0 Å까지 26점으로 스캔하면서
B3LYP/def2-TZVP 단일점 에너지를 한 입력으로 뽑는 예다. 결과는
scan.dat에 표로 떨어진다.
%compound
Variable R, E, step;
Variable Rmin = 0.5;
Variable Rmax = 3.0;
Variable N = 26;
Variable outFile = "scan.dat";
Write_File(outFile, "# R/A E/Eh\n");
For step From 0 To N Do
R = Rmin + step * (Rmax - Rmin) / N;
New_Step
! UKS B3LYP D4 def2-TZVP TightSCF
* xyz 0 1
H 0.0 0.0 0.0
H 0.0 0.0 &{R}
*
Step_End
E = SCF_Energy;
Write_File(outFile, "%6.3f %16.10f\n", R, E);
EndFor
end
핵심 문법만 짚어 보자.
| 요소 | 역할 |
|---|---|
Variable X; | 스칼라 변수 선언. 초기값을 같은 줄에 줄 수도 있음 (Variable R = 0.5;). |
&{R} | 좌표·키워드 내부에서 변수를 “인라인”으로 펼치는 placeholder. |
New_Step ... Step_End | 일반 ORCA 입력 블록을 그대로 감쌈. 그 안에서는 평소처럼 ! 키워드 라인과 * 좌표 블록을 쓴다. |
SCF_Energy | 직전 step 의 최종 SCF 에너지. OPT_Energy, MP2_Energy, CCSD_T_Energy 등 메소드별 변수 다수. |
Write_File(name, fmt, …) | C-style printf 포맷으로 결과 파일에 한 줄씩 누적. 첫 호출에서 파일이 만들어지고 이후로는 append 된다. |
For X From a To b Do … EndFor | 이산 카운터 루프. If … EndIf 와 While … EndWhile 도 지원. |
예제 ② — 반응물 + 전이 상태 + 생성물 자동 계산
분자 셋의 깁스 자유에너지를 같은 레벨로 한 번에 얻고, ΔG와 ΔG‡ 까지 계산해 찍어 주는 좀 더 실용적인 예다.
%compound
Variable Gr, Gts, Gp;
Variable dG, dGdag;
Read_File("reactant.xyz") As XYZ_File;
New_Step
! B3LYP D4 def2-TZVP RIJCOSX def2/J TightOpt Freq
Step_End
Gr = Final_Gibbs_Free_Energy;
Read_File("ts.xyz") As XYZ_File;
New_Step
! B3LYP D4 def2-TZVP RIJCOSX def2/J OptTS Freq
Step_End
Gts = Final_Gibbs_Free_Energy;
Read_File("product.xyz") As XYZ_File;
New_Step
! B3LYP D4 def2-TZVP RIJCOSX def2/J TightOpt Freq
Step_End
Gp = Final_Gibbs_Free_Energy;
dG = (Gp - Gr) * 627.5095; # Hartree → kcal/mol
dGdag = (Gts - Gr) * 627.5095;
Print("Reaction free energy: %8.2f kcal/mol\n", dG);
Print("Activation free energy: %8.2f kcal/mol\n", dGdag);
end
여기 적은 키워드 (Variable, For, If,
New_Step, Write_File, Final_Gibbs_Free_Energy
등) 는 ORCA 6.0.0 Compound 모듈 표기를 따르지만, 세부 syntax (변수 선언 방식,
print format 등) 는 minor release 마다 조금씩 달라질 수 있다. 처음이라면
매뉴얼 §7.59 와 공식 예제
(ORCAQuantumChemistry/CompoundScripts)
를 같이 펴 놓고 단순한 것부터 따라가는 걸 권한다.
여기까지 오면 입력 파일은 원하는 대로 짤 수 있다. 정작 매번 막히는 건 “그래서 그 키워드 이름이 뭐였더라”인데, 그건 다음 장에 사전처럼 모아 뒀다.