Skip to content


Using VASP on Improv

VASP can be loaded and unloaded with the following commands respectively (for these examples, I'm using vasp/6.4.2):

module load vasp/6.4.2
module unload vasp/6.4.2 

Below is a sample PBS script that can be used to run VASP on an Improv node with optimal performance. It will pack 8 VASP jobs onto 1 node to utilize all 128 cores.

  • The PBS directive -l select=1:mpiprocs=128 requests a single node (select=1) with 128 CPUs, where 128 MPI processes (mpiprocs=128) are to be launched.

#PBS -l select=1:mpiprocs=128
#PBS -l walltime=01:00:00

# Note that VASP was built with openmpi version 4.1.6.
# This method of assigning CPU affinities will not work with openmpi version 5.0.0 and above,
# or MPICH, MVAPICH or Intel-MPI.

module load vasp/6.4.2


# The following loop with spawn eight VASP jobs.
# Each mpi task spawned by this loop will run on a unique core.
# The output and input for each  VASP job will be in a unique subfolder.

for ii in {1..8}; do
  # Change to unique directory for this job.
  cd $ii
  # Define the first CPU for this jobi.
  let jj=(ii-1)*16
  # Define the last CPU for this job.
  let kk=$jj+15
  # The RANGE variable contains the list of cpus for this job to run on.
  export RANGE=$(eval echo {$jj..$kk} | xargs | sed -e 's/ /,/g')
  # The MPIOPT variable contains the MPIRUN directives defining the CPU affinities.
  export MPIOPT="--bind-to cpu-list:ordered --cpu-list $RANGE"
  # The ampersand at the end of the next command spawns a subprocess.
  # The --report-bindings directive is optional.
  mpirun $MPIOPT --report-bindings -np 16 vasp_gam &
  # Change back to PBS_O_WORKDIR.
  cd ..

# Wait for all the subprocesses to complete.