GROMACS
GROMACS (GROningen MAchine for Chemical Simulations) is one of the most widely used software packages for molecular dynamics simulations. It is free, open-source, and highly optimized for performance on both CPU and GPU hardware. On duhpc, GROMACS 2020.7 achieves 453 ns/day on the Tesla V100 GPU — a 59x speedup over CPU.
Template for GROMACS CPU Job (gromacsa_cpu.sh):
#!/bin/bash
#============================================================
# GROMACS CPU Job Template - duhpc Cluster
# Use for: energy minimization, NVT/NPT equilibration
# For production MD use gromacs_gpu.sh instead (much faster)
# Usage: sbatch gromacs_cpu.sh
#============================================================
#SBATCH --job-name=gmx_cpu # Job name (change this)
#SBATCH --partition=compute # CPU compute partition
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=16 # OpenMP threads (max 48)
#SBATCH --mem=16G
#SBATCH --time=3-00:00:00 # Max time (days-hours:min:sec)
#SBATCH --output=%x_%j.out
#SBATCH --error=%x_%j.err
#SBATCH --mail-type=BEGIN,END,FAIL
#SBATCH --mail-user=your@email.com # Change to your email
#------------------------------------------------------------
# USER SETTINGS - Edit these for your simulation
# Set RUN_* to "no" to skip that step
#------------------------------------------------------------
PRMTOP="topol.top" # Topology file
# STEP 1 - Energy Minimization
RUN_EM=yes
MDP_EM="em.mdp"
GRO_EM="solvated.gro" # Starting structure
OUTPUT_EM="em"
# STEP 2 - NVT Equilibration
RUN_NVT=yes
MDP_NVT="nvt.mdp"
GRO_NVT="em.gro" # From energy minimization
OUTPUT_NVT="nvt"
# STEP 3 - NPT Equilibration
RUN_NPT=yes
MDP_NPT="npt.mdp"
GRO_NPT="nvt.gro" # From NVT
CPT_NPT="nvt.cpt"
OUTPUT_NPT="npt"
#------------------------------------------------------------
echo "============================================="
echo "GROMACS CPU Job - duhpc Cluster"
echo "Job ID : $SLURM_JOBID"
echo "User : $USER"
echo "Node : $SLURMD_NODENAME"
echo "CPUs : $SLURM_CPUS_PER_TASK"
echo "Start : $(date)"
echo "============================================="
# ── Load GROMACS ──────────────────────────────────────────
source /scratch/apps/gromacs/bin/GMXRC.bash
CUDA10=/opt/ohpc/admin/spack/0.12.1/opt/spack/linux-centos7-x86_64/gcc-8.3.0/cuda-10.0.130-t6gcqrfrbeyep65wpy6erigjcovs7pjm/lib64
export LD_LIBRARY_PATH=$CUDA10:$LD_LIBRARY_PATH
echo "GROMACS : $(gmx --version 2>/dev/null | grep 'GROMACS version')"
echo ""
# ── STEP 1: Energy Minimization ───────────────────────────
if [ "$RUN_EM" = "yes" ]; then
echo "--- STEP 1: Energy Minimization ---"
for f in $MDP_EM $PRMTOP $GRO_EM; do
[ ! -f "$f" ] && echo "ERROR: Missing $f" && exit 1
done
START=$(date +%s)
# Create TPR
gmx grompp \
-f $MDP_EM -c $GRO_EM \
-p $PRMTOP -o ${OUTPUT_EM}.tpr \
-maxwarn 2
[ $? -ne 0 ] && echo "ERROR: grompp failed for EM!" && exit 1
# Run minimization
gmx mdrun \
-s ${OUTPUT_EM}.tpr \
-deffnm $OUTPUT_EM \
-ntmpi 1 -ntomp $SLURM_CPUS_PER_TASK \
-v
[ $? -ne 0 ] && echo "ERROR: Energy minimization failed!" && exit 1
echo "EM done in $(($(date +%s)-START)) seconds"
echo ""
fi
# ── STEP 2: NVT Equilibration ─────────────────────────────
if [ "$RUN_NVT" = "yes" ]; then
echo "--- STEP 2: NVT Equilibration ---"
for f in $MDP_NVT $PRMTOP $GRO_NVT; do
[ ! -f "$f" ] && echo "ERROR: Missing $f" && exit 1
done
START=$(date +%s)
gmx grompp \
-f $MDP_NVT -c $GRO_NVT \
-p $PRMTOP -o ${OUTPUT_NVT}.tpr \
-maxwarn 2
[ $? -ne 0 ] && echo "ERROR: grompp failed for NVT!" && exit 1
gmx mdrun \
-s ${OUTPUT_NVT}.tpr \
-deffnm $OUTPUT_NVT \
-ntmpi 1 -ntomp $SLURM_CPUS_PER_TASK \
-v
[ $? -ne 0 ] && echo "ERROR: NVT equilibration failed!" && exit 1
echo "NVT done in $(($(date +%s)-START)) seconds"
echo ""
fi
# ── STEP 3: NPT Equilibration ─────────────────────────────
if [ "$RUN_NPT" = "yes" ]; then
echo "--- STEP 3: NPT Equilibration ---"
for f in $MDP_NPT $PRMTOP $GRO_NPT; do
[ ! -f "$f" ] && echo "ERROR: Missing $f" && exit 1
done
START=$(date +%s)
# Include checkpoint if NVT was just run
CPT_OPT=""
[ -f "$CPT_NPT" ] && CPT_OPT="-t $CPT_NPT"
gmx grompp \
-f $MDP_NPT -c $GRO_NPT $CPT_OPT \
-p $PRMTOP -o ${OUTPUT_NPT}.tpr \
-maxwarn 2
[ $? -ne 0 ] && echo "ERROR: grompp failed for NPT!" && exit 1
gmx mdrun \
-s ${OUTPUT_NPT}.tpr \
-deffnm $OUTPUT_NPT \
-ntmpi 1 -ntomp $SLURM_CPUS_PER_TASK \
-v
[ $? -ne 0 ] && echo "ERROR: NPT equilibration failed!" && exit 1
echo "NPT done in $(($(date +%s)-START)) seconds"
echo ""
fi
echo "============================================="
echo "ALL STEPS COMPLETED SUCCESSFULLY"
echo ""
echo "Next step: create production TPR and submit GPU job"
echo " gmx grompp -f prod.mdp -c npt.gro -t npt.cpt -p topol.top -o production.tpr"
echo " sbatch gromacs_gpu.sh"
echo ""
echo "End time : $(date)"
echo "============================================="
Template for GROMACS GPU Job (gromacs_gpu.sh):
#!/bin/bash
#============================================================
# GROMACS GPU Job Template - duhpc Cluster
# For production MD simulation using Tesla V100 GPU
# Expected performance: ~453 ns/day
# Usage: sbatch gromacs_gpu.sh
#============================================================
#SBATCH --job-name=gmx_gpu # Job name (change this)
#SBATCH --partition=gpu # GPU partition - DO NOT CHANGE
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=8
#SBATCH --gres=gpu:1 # Request 1 GPU - DO NOT CHANGE
#SBATCH --mem=16G
#SBATCH --time=2-00:00:00 # Max time (days-hours:min:sec)
#SBATCH --output=%x_%j.out
#SBATCH --error=%x_%j.err
#SBATCH --mail-type=BEGIN,END,FAIL
#SBATCH --mail-user=your@email.com # Change to your email
#------------------------------------------------------------
# USER SETTINGS - Edit these for your simulation
#------------------------------------------------------------
TPR_FILE="production.tpr" # Input TPR file (create with gmx grompp)
OUTPUT="md_output" # Output prefix
#------------------------------------------------------------
echo "============================================="
echo "GROMACS GPU Job - duhpc Cluster"
echo "Job ID : $SLURM_JOBID"
echo "User : $USER"
echo "Node : $SLURMD_NODENAME"
echo "CPUs : $SLURM_CPUS_PER_TASK"
echo "Start : $(date)"
echo "============================================="
# ── Load GROMACS ──────────────────────────────────────────
source /scratch/apps/gromacs/bin/GMXRC.bash
CUDA10=/opt/ohpc/admin/spack/0.12.1/opt/spack/linux-centos7-x86_64/gcc-8.3.0/cuda-10.0.130-t6gcqrfrbeyep65wpy6erigjcovs7pjm/lib64
export LD_LIBRARY_PATH=$CUDA10:$LD_LIBRARY_PATH
# ── Verify environment ────────────────────────────────────
echo "GROMACS : $(gmx --version 2>/dev/null | grep 'GROMACS version')"
echo "GPU : $(nvidia-smi --query-gpu=name,memory.total --format=csv,noheader)"
echo ""
# ── Check input file ──────────────────────────────────────
if [ ! -f "$TPR_FILE" ]; then
echo "ERROR: TPR file not found: $TPR_FILE"
echo "Create it with: gmx grompp -f prod.mdp -c npt.gro -t npt.cpt -p topol.top -o production.tpr"
exit 1
fi
echo "TPR file : $TPR_FILE (OK)"
echo ""
# ── Run GPU MD ────────────────────────────────────────────
echo "--- Starting GPU MD ---"
START=$(date +%s)
gmx mdrun \
-s $TPR_FILE \
-deffnm $OUTPUT \
-gpu_id 0 \
-ntmpi 1 \
-ntomp $SLURM_CPUS_PER_TASK \
-nb gpu \
-pme gpu \
-v
EXIT=$?
END=$(date +%s)
# ── Performance Report ────────────────────────────────────
echo ""
echo "============================================="
echo "PERFORMANCE REPORT"
echo "============================================="
if [ $EXIT -eq 0 ]; then
echo "Status : SUCCESS"
echo "GPU : $(nvidia-smi --query-gpu=name --format=csv,noheader)"
echo "Wall time: $((END-START)) seconds"
echo ""
grep -E "Performance:|ns/day" ${OUTPUT}.log 2>/dev/null | tail -3
else
echo "Status : FAILED (exit code $EXIT)"
echo "Check ${OUTPUT}.log for details"
fi
echo "End time : $(date)"
echo "============================================="
Getting Support
- Email to Mr. Imran Ghani on ighani[at]ducc[dot]du[dot]ac[dot]in for any duhpc related information.
