xtb

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

See also