설치

가장 간단한 방법은 conda-forge다. 관리자 권한 없이 홈 디렉터리에 설치되므로 클러스터에서도 그대로 쓸 수 있다.

# miniforge가 없다면 먼저 설치
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh
bash Miniforge3-Linux-x86_64.sh -b -p $HOME/miniforge3
source $HOME/miniforge3/etc/profile.d/conda.sh

# xtb와 crest를 한 환경에
conda create -n xtb -c conda-forge xtb crest
conda activate xtb
xtb --version
crest --version

GitHub 릴리스(grimme-lab/xtb, crest-lab/crest)에서 정적 링크된 실행 파일을 받아 PATH에 넣어도 된다. ORCA가 부르는 otool_xtb도 이 실행 파일이다. ORCA 안에서 쓰기 위한 준비는 ORCA 가이드 16장에 있다.

첫 계산

입력은 xyz 파일 하나면 된다. 옵션 없이 부르면 GFN2-xTB 단일점 에너지를 계산한다.

xtb ala.xyz > sp.out

출력 끝부분에 요약 상자가 나온다. 아래는 이 가이드의 알라닌 다이펩타이드 출발 구조에서 나온 실제 출력이다.

         :::::::::::::::::::::::::::::::::::::::::::::::::::::
         ::                     SUMMARY                     ::
         :::::::::::::::::::::::::::::::::::::::::::::::::::::
         :: total energy             -32.968780800655 Eh    ::
         :: gradient norm              0.060736909638 Eh/a0 ::
         :: HOMO-LUMO gap              4.201966619930 eV    ::
         ::.................................................::
         :: SCC energy               -33.334018569053 Eh    ::
         :: -> isotropic ES            0.076928930387 Eh    ::
         :: -> anisotropic ES          0.004824182260 Eh    ::
         :: -> anisotropic XC          0.011329018690 Eh    ::
         :: -> dispersion             -0.015484427685 Eh    ::
         :: repulsion energy           0.365237768398 Eh    ::
         :: add. restraining           0.000000000000 Eh    ::
         :: total charge              -0.000000000000 e     ::
         :::::::::::::::::::::::::::::::::::::::::::::::::::::

--opt를 붙이면 이 상자가 두 번 나온다. 처음 것은 출발 구조의 단일점이고, 마지막 것이 최적화된 구조의 값이다. 같은 구조를 --opt tight로 최적화하면 전체 에너지는 −32.975847892266 Eh, 기울기 노름은 0.00016 Eh/a0로 내려간다.

xtb는 결과 파일을 현재 디렉터리에 고정된 이름으로 쓴다. 계산마다 디렉터리를 따로 만들지 않으면 다음 계산이 앞의 결과를 덮어쓴다.

출력 파일

파일내용
xtbopt.xyz최적화된 구조 (--opt)
xtbopt.log최적화 경로. 여러 프레임 xyz라 시각화 프로그램으로 바로 연다.
charges, wbo원자 부분 전하, Wiberg 결합 차수
vibspectrum, hessian, g98.out진동수 결과 (--hess, --ohess). g98.out은 진동 모드 애니메이션용
xtb.trjMD 궤적 (--md)
xtbrestart다음 계산의 초기 추정으로 읽히는 파동함수. 다른 분자를 계산할 때는 지운다.
남은 xtbrestart

같은 디렉터리에 다른 분자의 xtbrestart가 남아 있으면 xtb가 그것을 읽으려 한다. 원자 수가 달라 무시되는 경우가 대부분이지만, 계산마다 디렉터리를 나누면 이런 일을 신경 쓸 필요가 없다.

병렬 설정

xtb는 OpenMP로 병렬화된다. 코어 수와 스택 크기를 환경 변수로 준다.

export OMP_NUM_THREADS=8,1
export OMP_STACKSIZE=4G
export OPENBLAS_NUM_THREADS=1
ulimit -s unlimited

xtb ala.xyz --opt -P 8 > opt.out

스택 크기가 작으면 큰 분자에서 이유 없이 segfault가 난다. 수십 원자짜리 분자는 코어를 많이 줘도 빨라지지 않으니, 여러 계산을 동시에 돌릴 때는 계산당 코어를 적게 잡는 편이 전체 처리량이 높다.

OPENBLAS_NUM_THREADS=1

conda-forge의 xtb는 OpenBLAS에 링크돼 있다. OpenBLAS는 MKL_NUM_THREADS를 무시하고 OpenMP 스레드마다 자기 스레드를 따로 띄우기 때문에, 이 변수를 두지 않으면 할당받은 코어보다 훨씬 많은 스레드가 서로 코어를 다툰다. 이 가이드의 예제를 NUS HPC 계산 노드(8코어)에서 처음 돌렸을 때 기체상 최적화가 20.2초(CPU 시간 159.6초) 걸렸고, 100 ps MD는 4시간 제한 안에 끝나지 않을 속도였다. OPENBLAS_NUM_THREADS=1을 넣고 다시 돌리자 같은 최적화가 0.52초로 줄었다. 결과가 틀리게 나오지는 않고 느려지기만 하므로, 알아채기 어렵다.

클러스터 작업 스크립트

이 가이드의 예제는 NUS HPC의 Vanda 클러스터(PBS Pro)에서 xtb 6.7.1과 CREST 3.0.2(conda-forge)로 돌렸다. 아래는 그때 쓴 스크립트의 뼈대다.

#!/bin/bash
#PBS -N xtb-opt
#PBS -l select=1:ncpus=8:mem=16gb
#PBS -l walltime=04:00:00
#PBS -j oe
#PBS -q auto_free
cd $PBS_O_WORKDIR
source $HOME/miniforge3/etc/profile.d/conda.sh
conda activate xtb
export OMP_NUM_THREADS=$NCPUS,1 OMP_STACKSIZE=4G
export OPENBLAS_NUM_THREADS=1
ulimit -s unlimited

mkdir -p opt && cd opt
xtb ../ala.xyz --opt tight > opt.out

#PBS -q 줄은 클러스터마다 다르다. Vanda에서는 실행 큐에 직접 제출할 수 없고 라우팅 큐를 거쳐야 해서, -q cpu_parallel처럼 쓰면 Access to queue is denied로 거절된다. 여기서는 auto_free에 넣었고, 8코어 요청이라 cpu_parallel로 넘어가 바로 시작됐다. 다른 클러스터는 qstat -Q와 사이트 문서에서 큐 이름을 확인한다. 기본 큐가 있는 곳이면 이 줄을 빼도 된다.