Calculations with Periodic Boundary Conditions

This short exercise illustrates the property of periodic boundary conditions and at the same time gives you some ideas/skeletons on how to create useful bash scripts. The files you need for this are:

A geometry file for a H2O molecule:

h2o.xyz
3
Atom    X   Y   Z
O   0.0000000   0.0000000   0.1194180
H   0.0000000   0.7654990   -0.4776700
H   0.0000000   -0.7654990  -0.4776700

A CP2K input file to run a calculation with it:

h2o_pbc.inp
&GLOBAL
  PROJECT h2o_pbc
  RUN_TYPE ENERGY 
  PRINT_LEVEL MEDIUM
&END GLOBAL

&FORCE_EVAL
  METHOD Quickstep              ! Electronic structure method (DFT,...)
  &DFT
    BASIS_SET_FILE_NAME  BASIS_MOLOPT
    POTENTIAL_FILE_NAME  POTENTIAL

    &POISSON                    ! Solver requested for non periodic calculations
      PERIODIC XYZ
    &END POISSON
    &SCF                        ! Parameters controlling the convergence of the SCF. This section should not be changed. 
      SCF_GUESS ATOMIC
      EPS_SCF 1.0E-6
      MAX_SCF 300
    &END SCF
    &XC                         ! Parameters needed to compute the electronic exchange potential 
      &XC_FUNCTIONAL PBE
      &END XC_FUNCTIONAL
    &END XC
  &END DFT

  &SUBSYS
    &CELL
      ABC 10. 10. 10.
      PERIODIC XYZ
    &END CELL
    &TOPOLOGY                    ! Section used to center the atomic coordinates in the given box. Useful for big molecules
      COORD_FILE_FORMAT xyz
      COORD_FILE_NAME  ./h2o.xyz
      &CENTER_COORDINATES
        CENTER_POINT 5. 5. 5.
      &END
    &END
    &KIND H
      ELEMENT H
      BASIS_SET TZVP-MOLOPT-GTH
      POTENTIAL GTH-PBE-q1
    &END KIND
    &KIND O
      ELEMENT O
      BASIS_SET TZVP-MOLOPT-GTH
      POTENTIAL GTH-PBE-q6
    &END KIND
  &END SUBSYS
&END FORCE_EVAL

And a script to run it:

run.sh
#!/bin/bash

set -o errexit
set -o nounset
set -o pipefail

xseq=$(seq 5 0.1 6)

for x in $xseq; do
    rm -f "h2o_pbc_x-${x}.out"

    sed \
        -e "s|h2o_pbc|h2o_pbc_x-$x|" \
        -e "s|CENTER_POINT .*|CENTER_POINT $x 5. 5.|" \
        h2o_pbc.inp > "h2o_pbc_x-${x}.inp"

    cp2k.sopt -i "h2o_pbc_x-${x}.inp" -o "h2o_pbc_x-${x}.out" &
done

for job in $(jobs -p) ; do
    wait $job
done

# create or truncate the file named "energies"
:>| energies

for x in $xseq; do
    energy=$(awk '/Total FORCE_EVAL/ { print $9 }' "h2o_pbc_x-${x}.out")
    echo "$x $energy" >> energies
done

You have to mark the script as an executable after creating it, using:

$ chmod +x run.sh

Create a plot

Run the script after loading the CP2K module:

$ ./run.sh

Besides various input and output files, you should get a file named energies.

Make the script your own