CP2K

Description

According to the documentation of CP2K, CP2K is a quantum chemistry and solid state physics software package that can perform atomistic simulations of solid state, liquid, molecular, periodic, material, crystal, and biological systems.

Available Versions

  • cp2k/2023.1 (default)

  • cp2k/2026.1

  • cp2k/2026.1.gpu (with GPU support)

Note

To check the available versions:

module avail cp2k

Loading the Module

# Default version (CPU)
module load cp2k/2026.1

# GPU-enabled version
module load cp2k/2026.1.gpu

# Verify installation
cp2k --version

# Available environment variables
echo $CP2K_DATA   # Directory with basis sets and potentials

Serial Job Submission

submit_cp2k_serial.sh
#!/bin/bash
#SBATCH -J cp2k_serial
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 5-00:00:00
#SBATCH --mem=8G

export INPUT="h2o.inp"
export OUTPUT="h2o.out"

module load cp2k/2026.1

job-nanny cp2k.popt -i h2o.inp -o h2o.out

MPI Job Submission

submit_cp2k_mpi.sh
#!/bin/bash
#SBATCH -J cp2k_mpi
#SBATCH -N 2
#SBATCH --ntasks-per-node=28
#SBATCH -t 7-00:00:00
#SBATCH --mem-per-cpu=2G

export INPUT="h2o.inp"
export OUTPUT="h2o.out"

module load cp2k/2026.1

job-nanny mpirun -n 56 cp2k.popt -i h2o.inp -o h2o.out

OpenMP Job Submission

submit_cp2k_omp.sh
#!/bin/bash
#SBATCH -J cp2k_omp
#SBATCH -N 1
#SBATCH -c 28
#SBATCH -t 5-00:00:00
#SBATCH --mem=64G

export INPUT="h2o.inp"
export OUTPUT="h2o.out"
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK

module load cp2k/2026.1

job-nanny cp2k.psmp -i h2o.inp -o h2o.out

Hybrid Job Submission (MPI+OpenMP)

submit_cp2k_hybrid.sh
#!/bin/bash
#SBATCH -J cp2k_hybrid
#SBATCH -N 2
#SBATCH --ntasks-per-node=4
#SBATCH -c 7
#SBATCH -t 7-00:00:00
#SBATCH --mem-per-cpu=2G

export INPUT="h2o.inp"
export OUTPUT="h2o.out"
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK

module load cp2k/2026.1

job-nanny mpirun -n 8 cp2k.psmp -i h2o.inp -o h2o.out

GPU Job Submission (version 2026.1.gpu)

The GPU-enabled version of CP2K offers significant acceleration for DFT calculations and other computationally intensive methods.

submit_cp2k_gpu.sh
#!/bin/bash
#SBATCH -J cp2k_gpu
#SBATCH -p gpu
#SBATCH --gres=gpu:1
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -c 8
#SBATCH -t 48:00:00
#SBATCH --mem=32G

export INPUT="h2o.inp"
export OUTPUT="h2o.out"

module load cp2k/2026.1.gpu

# CP2K automatically detects available GPUs
job-nanny cp2k.psmp -i h2o.inp -o h2o.out

Multi-GPU Job Submission

submit_cp2k_multi_gpu.sh
#!/bin/bash
#SBATCH -J cp2k_multi_gpu
#SBATCH -p gpu
#SBATCH --gres=gpu:4
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -c 16
#SBATCH -t 72:00:00
#SBATCH --mem=64G

export INPUT="large_system.inp"
export OUTPUT="large_system.out"

module load cp2k/2026.1.gpu

# Multiple GPUs for heavier calculations
job-nanny cp2k.psmp -i large_system.inp -o large_system.out

Hybrid Job Submission (MPI + GPU)

For very large systems, combine MPI parallelization between nodes with GPU acceleration within each node:

submit_cp2k_mpi_gpu.sh
#!/bin/bash
#SBATCH -J cp2k_mpi_gpu
#SBATCH -p gpu
#SBATCH --gres=gpu:2
#SBATCH -N 2
#SBATCH --ntasks-per-node=4
#SBATCH -c 7
#SBATCH -t 96:00:00
#SBATCH --mem-per-cpu=4G

export INPUT="very_large.inp"
export OUTPUT="very_large.out"

module load cp2k/2026.1.gpu

job-nanny mpirun cp2k.psmp -i very_large.inp -o very_large.out

Environment Variables

When loading the CP2K module, the variable CP2K_DATA is defined:

module load cp2k/2026.1
echo $CP2K_DATA   # /opt/gridunesp/dist/cp2k/2026.1/cp2k/data/

This variable points to the directory containing basis sets and potentials.

Example Input File

h2o.inp
&GLOBAL
  PROJECT H2O
  RUN_TYPE ENERGY
  PRINT_LEVEL LOW
&END GLOBAL

&FORCE_EVAL
  METHOD Quickstep
  &DFT
    BASIS_SET_FILE_NAME $CP2K_DATA/BASIS_MOLOPT
    POTENTIAL_FILE_NAME $CP2K_DATA/POTENTIAL
    &MGRID
      CUTOFF 400
      REL_CUTOFF 50
    &END MGRID
    &QS
      METHOD GPW
    &END QS
    &SCF
      SCF_GUESS ATOMIC
      EPS_SCF 1.0E-6
      MAX_SCF 200
    &END SCF
    &XC
      &XC_FUNCTIONAL PBE
      &END XC_FUNCTIONAL
    &END XC
  &END DFT

  &SUBSYS
    &CELL
      ABC 10.0 10.0 10.0
    &END CELL
    &COORD
      O   5.0   5.0   5.0
      H   5.0   5.7   5.0
      H   5.7   5.0   5.0
    &END COORD
    &KIND H
      BASIS_SET DZVP-MOLOPT-GTH
      POTENTIAL GTH-PBE
    &END KIND
    &KIND O
      BASIS_SET DZVP-MOLOPT-GTH
      POTENTIAL GTH-PBE
    &END KIND
  &END SUBSYS
&END FORCE_EVAL

Example Input File with GPU Configuration

To take advantage of GPUs, some optimizations can be added to the input file:

h2o_gpu.inp
&GLOBAL
  PROJECT H2O_GPU
  RUN_TYPE ENERGY
  PRINT_LEVEL LOW
&END GLOBAL

&FORCE_EVAL
  METHOD Quickstep
  &DFT
    BASIS_SET_FILE_NAME $CP2K_DATA/BASIS_MOLOPT
    POTENTIAL_FILE_NAME $CP2K_DATA/POTENTIAL
    &MGRID
      CUTOFF 400
      REL_CUTOFF 50
    &END MGRID
    &QS
      METHOD GPW
      EPS_DEFAULT 1.0E-12
    &END QS
    &SCF
      SCF_GUESS ATOMIC
      EPS_SCF 1.0E-6
      MAX_SCF 200
      &OT ON
        MINIMIZER CG
        PRECONDITIONER FULL_ALL
      &END OT
    &END SCF
    &XC
      &XC_FUNCTIONAL PBE
      &END XC_FUNCTIONAL
    &END XC
    &PRINT
      &PROGRAM_RUN_INFO ON
      &END PROGRAM_RUN_INFO
    &END PRINT
  &END DFT

  &SUBSYS
    &CELL
      ABC 10.0 10.0 10.0
    &END CELL
    &COORD
      O   5.0   5.0   5.0
      H   5.0   5.7   5.0
      H   5.7   5.0   5.0
    &END COORD
    &KIND H
      BASIS_SET DZVP-MOLOPT-GTH
      POTENTIAL GTH-PBE
    &END KIND
    &KIND O
      BASIS_SET DZVP-MOLOPT-GTH
      POTENTIAL GTH-PBE
    &END KIND
  &END SUBSYS
&END FORCE_EVAL

Job Array for Parameter Scan

submit_cp2k_array.sh
#!/bin/bash
#SBATCH -J cp2k_array
#SBATCH --array=1-5
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 24:00:00
#SBATCH --mem=8G

export INPUT="template.inp"
export OUTPUT="run_${SLURM_ARRAY_TASK_ID}/"

module load cp2k/2026.1

# Parameters for scan
CUTOFF_VALUES=(200 300 400 500 600)
CUTOFF=${CUTOFF_VALUES[$SLURM_ARRAY_TASK_ID-1]}

mkdir -p run_${SLURM_ARRAY_TASK_ID}
cd run_${SLURM_ARRAY_TASK_ID}

# Modify input file
sed "s/CUTOFF_VALUE/$CUTOFF/g" ../template.inp > input.inp

job-nanny cp2k.popt -i input.inp -o output.out

Job Array for Parameter Scan with GPU

submit_cp2k_gpu_array.sh
#!/bin/bash
#SBATCH -J cp2k_gpu_array
#SBATCH --array=1-4
#SBATCH -p gpu
#SBATCH --gres=gpu:1
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -c 8
#SBATCH -t 48:00:00
#SBATCH --mem=32G

# Different numbers of GPUs per job
GPU_VALUES=(1 2 3 4)
GPU_COUNT=${GPU_VALUES[$SLURM_ARRAY_TASK_ID-1]}

export INPUT="template.inp"
export OUTPUT="gpu_${GPU_COUNT}/"

module load cp2k/2026.1.gpu

mkdir -p gpu_${GPU_COUNT}
cd gpu_${GPU_COUNT}
cp ../template.inp input.inp

# Request specific number of GPUs
#SBATCH --gres=gpu:${GPU_COUNT}

job-nanny cp2k.psmp -i input.inp -o output.out

GPU Performance Optimization

To get the best performance with the GPU version of CP2K:

  1. Use the appropriate version of CP2K for your workload

  2. Balance CPUs and GPUs - Too many tasks can overload the GPU

  3. Adjust SCF parameters in the input file for faster convergence

Tip

For small problems, the GPU overhead may not be worth it. Test different configurations to find the best balance.

Performance Comparison

Version

Recommended Use

Relative Performance

cp2k.popt (serial)

Tests, small jobs

1x

cp2k.psmp (OpenMP)

Single node, up to 28 threads

2-5x

cp2k.popt with MPI

Multiple nodes

10-50x

cp2k.psmp with GPU

High performance, large systems

20-100x

References

See also