xtb
In this section:
Description
According to the documentation of xtb, xtb is a semi-empirical quantum chemistry program implementing GFN (Geometry, Frequency, Noncovalent) methods and other semi-empirical methods for fast calculations of molecular structures, properties, and spectra.
Available Versions
xtb/6.6.1 (default)
Loading the Module
# Load xtb
module load xtb/6.6.1
# Verify installation
xtb --version
Simple Energy Calculation
submit_xtb_energy.sh
#!/bin/bash
#SBATCH -J xtb_energy
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 02:00:00
#SBATCH --mem=4G
export INPUT="mol.xyz"
export OUTPUT="energy.out"
module load xtb/6.6.1
job-nanny xtb mol.xyz --sp > energy.out
Geometry Optimization
submit_xtb_opt.sh
#!/bin/bash
#SBATCH -J xtb_opt
#SBATCH -N 1
#SBATCH -c 4
#SBATCH -t 12:00:00
#SBATCH --mem=8G
export INPUT="start.xyz"
export OUTPUT="opt.xyz opt.out"
module load xtb/6.6.1
job-nanny xtb start.xyz --opt --parallel $SLURM_CPUS_PER_TASK > opt.out
Frequency Calculation
submit_xtb_freq.sh
#!/bin/bash
#SBATCH -J xtb_freq
#SBATCH -N 1
#SBATCH -c 4
#SBATCH -t 24:00:00
#SBATCH --mem=8G
export INPUT="optimized.xyz"
export OUTPUT="freq.out freq.modes"
module load xtb/6.6.1
job-nanny xtb optimized.xyz --hess --parallel $SLURM_CPUS_PER_TASK > freq.out
# Extract frequencies
grep "freq:" freq.out > frequencies.txt
Simple MD (meta-dynamics)
submit_xtb_md.sh
#!/bin/bash
#SBATCH -J xtb_md
#SBATCH -N 1
#SBATCH -c 4
#SBATCH -t 48:00:00
#SBATCH --mem=8G
export INPUT="start.xyz"
export OUTPUT="md_traj.xyz md.out"
module load xtb/6.6.1
job-nanny xtb start.xyz --md --time 10 --parallel $SLURM_CPUS_PER_TASK > md.out
Solvent Screening (GBSA)
submit_xtb_solvent.sh
#!/bin/bash
#SBATCH -J xtb_solvent
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 06:00:00
#SBATCH --mem=4G
export INPUT="mol.xyz"
export OUTPUT="solv.out"
module load xtb/6.6.1
# Implicit solvent (GBSA)
job-nanny xtb mol.xyz --sp --gbsa water > solv.out
# With different solvents
for solvent in water methanol ethanol acetone; do
job-nanny xtb mol.xyz --sp --gbsa $solvent > ${solvent}.out
done
Electronic Properties
submit_xtb_props.sh
#!/bin/bash
#SBATCH -J xtb_props
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 06:00:00
#SBATCH --mem=4G
export INPUT="mol.xyz"
export OUTPUT="props.out"
module load xtb/6.6.1
# Molecular orbitals
job-nanny xtb mol.xyz --sp --mo > mo.out
# Charges
job-nanny xtb mol.xyz --sp --pop > charges.out
# Dipole
grep "dipole" *.out > dipole.txt
Coordinate Scan
submit_xtb_scan.sh
#!/bin/bash
#SBATCH -J xtb_scan
#SBATCH -N 1
#SBATCH -c 4
#SBATCH -t 24:00:00
#SBATCH --mem=8G
export INPUT="start.xyz"
export OUTPUT="scan.log scan.xyz"
module load xtb/6.6.1
job-nanny xtb start.xyz --input scan.inp > scan.log
scan.inp
$scan
mode=1
start=1.0
end=3.0
steps=20
$end
Job Array for Multiple Molecules
submit_xtb_array.sh
#!/bin/bash
#SBATCH -J xtb_array
#SBATCH --array=1-10
#SBATCH -N 1
#SBATCH -c 4
#SBATCH -t 12:00:00
#SBATCH --mem=8G
MOLECULES=($(ls *.xyz))
MOL=${MOLECULES[$SLURM_ARRAY_TASK_ID-1]}
BASE=$(basename "$MOL" .xyz)
export INPUT="$MOL"
export OUTPUT="${BASE}_results/"
module load xtb/6.6.1
mkdir -p ${BASE}_results
cd ${BASE}_results
cp ../$MOL .
# Optimization
job-nanny xtb $MOL --opt --parallel $SLURM_CPUS_PER_TASK > opt.out
# Single point energy
job-nanny xtb $MOL --sp > sp.out
# Extract energy
grep "TOTAL ENERGY" sp.out >> ../all_energies.txt
Results Analysis
analyze_xtb.sh
#!/bin/bash
#SBATCH -J analyze_xtb
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 01:00:00
#SBATCH --mem=2G
# Collect energies
echo "Molecule,Energy" > energies.csv
for dir in *_results/; do
mol=$(basename $dir _results)
if [ -f "${dir}sp.out" ]; then
energy=$(grep "TOTAL ENERGY" ${dir}sp.out | awk '{print $4}')
echo "$mol,$energy" >> energies.csv
fi
done
# Collect frequencies (if any)
for dir in *_results/; do
mol=$(basename $dir _results)
if [ -f "${dir}freq.out" ]; then
echo "Frequencies for $mol:" >> frequencies.txt
grep "freq:" ${dir}freq.out >> frequencies.txt
echo "" >> frequencies.txt
fi
done
# Plot with Python
cat > plot_energies.py << 'EOF'
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('energies.csv')
df = df.sort_values('Energy')
plt.figure(figsize=(10, 6))
sns.barplot(data=df, x='Molecule', y='Energy')
plt.xticks(rotation=45, ha='right')
plt.title('Energies calculated with xtb')
plt.tight_layout()
plt.savefig('energy_comparison.png')
EOF
python plot_energies.py
References
Documentation: https://xtb-docs.readthedocs.io/
Publication: https://onlinelibrary.wiley.com/doi/abs/10.1002/jcc.24760
See also
ORCA - Ab initio quantum chemistry
MOPAC - Semi-empirical quantum chemistry
Running Simulations - How to submit jobs