입력 파일의 해부

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/CRI/RIJCOSX에 필요한 피팅 기저집합.
작업 유형(Runtype)Opt, Freq, EnGrad, NumFreq, NEB-TS단일점, 최적화, 진동수 등.
알고리즘 옵션RIJCOSX, RI-JK, UKS, UNO적분 근사, 스핀 처리 등.
수렴 임계값NormalSCF, TightSCF, VeryTightSCFSCF 수렴 기준의 엄격함.
적분 격자DefGrid1, DefGrid2, DefGrid3DFT 수치 적분 격자(기본 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

자주 보게 되는 블록만 추리면 이렇다.

블록역할
%scfSCF 수렴 관련 옵션(반복 횟수, DIIS, level shift 등).
%method함수, 작업 유형 등 메소드 일반.
%basis원자별 기저집합 변경, ECP 지정.
%geom최적화 옵션, 제약 조건, 표면 스캔.
%freq진동수 계산 옵션(증분, 양측 차분 등).
%cpcm음폐 용매 모델 세부 설정.
%tddft / %cisTD-DFT, CIS 들뜬 상태 옵션.
%mp2MP2 관련(DLPNO 임계값 등).
%mdciCoupled-cluster 옵션.
%casscf다중참조 활성공간 옵션.
%nebNudged 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로 주되 파일명을 생략하면, 직전 작업에서 최적화된 좌표가 그대로 넘어온다. 꽤 편한 기능이다.

한 단계 더 — Compound 모듈

반복 계산이나 조건 분기가 들어가는 복잡한 워크플로우는 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 … EndIfWhile … 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) 를 같이 펴 놓고 단순한 것부터 따라가는 걸 권한다.

여기까지 오면 입력 파일은 원하는 대로 짤 수 있다. 정작 매번 막히는 건 “그래서 그 키워드 이름이 뭐였더라”인데, 그건 다음 장에 사전처럼 모아 뒀다.