기본 사용법

구조 최적화는 키워드 라인에 Opt만 더하면 된다. 아래는 포름알데히드(HCHO)를 B3LYP/SV(P) 수준에서 최적화하는 예다.

! B3LYP D4 def2-SVP Opt

* int 0 1
  C 0 0 0   0.000     0.000     0.00
  O 1 0 0   1.203     0.000     0.00
  H 1 2 0   1.107   122.016     0.00
  H 1 2 3   1.107   122.016   180.00
*

순수 GGA 함수(예: BP86)에서는 RI 근사가 기본으로 켜지니 따로 옵션이 필요 없다. 하이브리드 함수라면 RIJCOSX def2/J를 같이 켜는 게 표준이다.

# RI + BP86 — 매우 빠른 최적화
! BP86 D4 def2-SVP Opt

# 하이브리드는 RIJCOSX와 함께
! B3LYP D4 def2-TZVP RIJCOSX def2/J Opt

좌표계 — 데카르트와 redundant internal

ORCA 6의 Opt 키워드는 기본으로 redundant internal coordinates를 쓴다. 이 좌표계는 화학적으로 의미 있는 결합 길이·각도·이면각의 조합이라, 대개 가장 빨리 수렴한다.

데카르트 좌표를 강제할 수도 있는데, 아래 같은 특수한 경우에만 권한다.

키워드좌표계사용 시점
OptRedundant internal대부분의 분자 — 기본 선택.
COptCartesian큰 시스템, 단편(fragment) 최적화, 매우 평탄한 표면.

수렴 임계값 읽기

최적화는 단계마다 수렴 지표 5개를 평가한다. 다섯 개가 모두 임계값 아래로 떨어지면 “converged”로 판정한다.

            *********************HURRAY********************
            ***        THE OPTIMIZATION HAS CONVERGED     ***
            *************************************************

------------------------|Geometry convergence|---------------------------
Item                value                   Tolerance       Converged
---------------------------------------------------------------------------
Energy change       -0.0000001234 Eh        0.0000050000      YES
RMS gradient         0.0000234567 Eh/bohr   0.0001000000      YES
MAX gradient         0.0000456789 Eh/bohr   0.0003000000      YES
RMS step             0.0001234567 bohr      0.0020000000      YES
MAX step             0.0002345678 bohr      0.0040000000      YES
---------------------------------------------------------------------------

임계값은 NormalOpt(기본) → TightOptVeryTightOpt로 단계를 올릴 수 있다.

지표NormalOptTightOptVeryTightOpt
Energy change (Eh)5e-61e-62e-7
Max gradient (Eh/bohr)3e-41e-43e-5
RMS gradient1e-43e-51e-5
Max step (bohr)4e-32e-36e-4
RMS step2e-31e-33e-4
진동수 계산 전에는 TightOpt

진동수 계산을 뒤에 붙일 거라면 최적화를 TightOpt 이상으로 수렴시키는 게 좋다. 안 그러면 평형에서 살짝 벗어난 점에서 진동수를 계산하게 돼, 엉뚱한 허수 진동수가 튀어나올 수 있다.

제약 조건 최적화

반응 경로 일부를 고정하거나 특정 결합·각도를 묶어 두고 싶을 때 쓴다. %geom Constraints 블록에 아래 문법으로 적는다.

! B3LYP D4 def2-SVP Opt

%geom Constraints
   { B 0 1 1.25 C }       # 0-1 결합 길이를 1.25 Å로 고정
   { A 2 0 3 120.0 C }   # 2-0-3 각도를 120°로 고정
   { D 3 1 0 2 180.0 C } # 3-1-0-2 이면각 180°로 고정
   { C 5 C }              # 5번 원자 데카르트 좌표 전체 고정
end
end

* xyzfile 0 1 mol.xyz

중괄호 안 첫 글자가 제약 종류를 정한다.

유형문법의미
결합 길이{ B N1 N2 값 C }원자 N1-N2 사이 거리를 “값”(Å)으로 고정.
결합 각도{ A N1 N2 N3 값 C }N1-N2-N3 각도를 “값”(°)으로 고정.
이면각{ D N1 N2 N3 N4 값 C }네 원자의 이면각을 고정.
데카르트{ C N1 C }원자 N1의 (x,y,z)를 모두 고정.
중요한 세부 사항

“값”은 선택이다. 생략하면 입력 구조의 현재 값이 그대로 고정된다. 데카르트 제약에는 값을 줄 수 없고 늘 초기 위치가 쓰인다. 원자 번호는 0부터 센다(좌표 입력의 “int” 모드와 정반대니 헷갈리지 말 것).

와일드카드와 범위

여러 좌표를 한 번에 묶을 수도 있다.

%geom Constraints
   { B 3 * C }        # 3번 원자가 관여하는 모든 결합 길이
   { B * * C }        # 모든 결합 길이
   { A * 5 * C }      # 5번이 중앙인 모든 각도
   { C 10:17 C }       # 10~17번 원자의 데카르트 고정
end
end

역제약(InvertConstraints)

좌표 몇 개만 풀고 나머지를 전부 고정하고 싶으면, 풀 좌표를 적은 뒤 invertConstraints true를 더한다.

%geom Constraints
   { B 0 1 C }
end
   invertConstraints true   # C-O 거리만 최적화하고 나머지는 모두 고정
end

수소만 최적화 · 부분 최적화

큰 단백질 활성자리나 X-선 구조에서 수소만 따로 최적화하고 싶을 때 쓴다.

%geom optimizehydrogens true
end

완화 표면 스캔 (Relaxed Scan)

한 좌표를 한 값에서 다른 값까지 조금씩 바꿔 가며, 각 점에서 나머지를 전부 최적화하는 작업이다. 반응 좌표나 컨포머 변화를 훑을 때 가장 자주 쓴다.

# H2O2의 H-O-O-H 이면각을 0°에서 180°까지 19점으로 스캔
! B3LYP D4 def2-SVP Opt

%geom Scan
   D 0 1 2 3 = 0.0, 180.0, 19   # 이면각 0 → 180, 19개 점
end
end

* xyz 0 1
  H   0.000   0.872   0.873
  O   0.000   0.625  -0.085
  O   0.000  -0.625  -0.085
  H   0.000  -0.872   0.873
*

스캔이 끝나면 ORCA가 basename.relaxscanact.dat에 각 점의 (좌표값, 에너지) 쌍을 찍어 준다. 중간 구조도 전부 basename_trj.xyz에 쌓이니 그대로 시각화에 쓸 수 있다.

바깥에서 안쪽으로 스캔하기

반응 좌표 스캔은 “안에서 밖으로(짧은 거리 → 긴 거리)”보다 “밖에서 안으로(긴 거리 → 짧은 거리)”가 더 매끄럽게 풀리는 경우가 많다. 긴 거리에서 시작하면 이미 구조가 어느 정도 풀린 상태에서 출발하는 셈이라, 국소 최소에 잘 안 갇힌다.

다차원 스캔

두 좌표를 동시에 스캔하면 표면이 만들어진다.

%geom Scan
   B 0 1 = 3.0, 1.0, 15
   B 1 2 = 1.0, 3.0, 15
end
end

기본적으로 위 두 스캔은 “격자(grid)”로 엮여 총 15 × 15 = 225개 점이 계산된다. 두 스캔을 같은 인덱스끼리 짝지어(15점만) 동시에 돌리고 싶으면 Simul_Scan true를 더한다.

초기 헤시안 선택

최적화 알고리즘은 단계마다 헤시안(2차 미분 행렬)의 근사가 필요하다. 기본값은 모델 헤시안(Almloef)이고, 웬만한 유기 분자에서는 이걸로 충분하다. 까다로운 시스템이면 아래 옵션을 시도해 볼 수 있다.

%geom
   InHess Almloef      # 기본값. 안정적.
end
옵션설명
Almloef기본값. Almlöf 모델.
LindhLindh 모델. 평탄한 표면에 효과적.
SwartSwart 모델. 전이금속에서 안정적.
SchlegelSchlegel 모델. 일반 유기.
Unit단위 행렬. 매우 어려운 경우의 마지막 보루.
Read이전 진동수 계산의 .hess 파일을 읽음.

이전 헤시안 읽어 오기

싼 방법(예: 준경험적)으로 헤시안을 미리 구해 두면, 까다로운 최적화에서 큰 도움이 된다.

# 1단계: XTB로 헤시안 빠르게 계산
! XTB2 NumFreq
* xyzfile 0 1 mol.xyz

$new_job

# 2단계: 위 헤시안을 초기값으로 사용한 정밀 최적화
! B3LYP D4 def2-TZVP Opt TightSCF
%geom
   InHess     Read
   InHessName "mol_job1.hess"
end
* xyzfile 0 1

잘 풀리지 않을 때

최적화가 발산하거나 진동할 때 꺼내 볼 카드들이다.

  • 최대 반복 횟수 늘리기: %geom MaxIter 500 end로 늘려 본다.
  • 최대 step 크기 줄이기: %geom MaxStep 0.1 end (bohr 단위).
  • 데카르트 좌표로 전환: !COpt를 시도해 볼 만하다.
  • 초기 헤시안을 정밀하게: 위에서 설명한 InHess Read 패턴.
  • 좌표 입력 점검: 결합 길이가 비현실적으로 짧거나 길지 않은지, 원자가 겹쳐 있지 않은지 확인한다.

안정점을 찾았으면, 그 점이 정말 최소인지(허수 진동수가 없는지)는 진동수 계산으로 확인할 차례다.