GROMACS

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.
back to chemistry.du.ac.in/hpcc