fcc Si
Based on the VASP wiki example in this link
Task: Run a self-consistent calculation for fcc Si. Thereafter, optimize the lattice constant. Use some basic tools and scripts.
An introductory example for working with VASP
In general, examples are chosen for fast calculation
Use different job scripts, submit to the Slurm job scheduler on Tetralith or LEONARDO
Use VASP, gnuplot, python, ASE
bash shell scripts
System-specific instructions
Select instructions for the system you are using:
Instructions for use on the NAISS cluster Tetralith (NSC)
Instructions for use on the EuroHPC cluster LEONARDO
First, copy the example folder which contains the input files INCAR, POSCAR, KPOINTS and some useful scripts
cp -r /software/sse2/tetralith_el9/manual/vasp/training/ws2024/fcc_Si .
cd fcc_Si
also copy the latest POTCAR (PBE GGA) file for Si
cp /software/sse2/tetralith_el9/manual/vasp/POTCARs/PBE/2024-03-19/Si/POTCAR .
cp -r /leonardo_scratch/fast/EUHPC_TD02_030/vasp_ws2024/examples/fcc_Si .
cd fcc_Si
also copy the latest POTCAR (PBE GGA) file for Si
cp /leonardo_scratch/fast/EUHPC_TD02_030/vasp_ws2024/potpaw_PBE.64/Si/POTCAR .
Input files
POSCAR
fcc Si
3.9
0.5 0.5 0.0
0.0 0.5 0.5
0.5 0.0 0.5
Si
1
cartesian
0 0 0
Fcc Si lattice constant a=3.9 Å
“Si” on line 6 isn’t needed for the run, but for viewing e.g. using VESTA and practical as a reminder if you have several elements. Note that POTCAR decides the actual order of the elements in POSCAR, check with
grep PAW POTCAR
1 atom in the cell
INCAR
System = fcc Si
ISTART = 0
ICHARG = 2
ENCUT = 240
ISMEAR = 0
SIGMA = 0.1
ISMEAR determines the partial occupancies of each orbital. For band gap systems -5 (tetrahedron method with Blöchl corrections) or 0 (Gaussian smearing) are suitable.
For very accurate total energy calculations or DOS, use ISMEAR = -5
KPOINTS
k-points
0
Monkhorst Pack
11 11 11
0 0 0
Face-centered-cubic structure, so use an equally spaced k-mesh
Odd number of k-points in each direction -> Gamma centered mesh
Alternatively, use the Gamma centered k-mesh, replacing the line “Monkhorst Pack” (M) with “Gamma” (G)
POTCAR
PAW_PBE Si 05Jan2001
4.00000000000000
parameters from PSCTR are:
VRHFIN =Si: s2p2
LEXCH = PE
EATOM = 103.0669 eV, 7.5752 Ry
TITEL = PAW_PBE Si 05Jan2001
LULTRA = F use ultrasoft PP ?
IUNSCR = 1 unscreen: 0-lin 1-nonlin 2-no
RPACOR = 1.500 partial core radius
POMASS = 28.085; ZVAL = 4.000 mass and valenz
RCORE = 1.900 outmost cutoff radius
RWIGS = 2.480; RWIGS = 1.312 wigner-seitz radius (au A)
ENMAX = 245.345; ENMIN = 184.009 eV
ICORE = 2 local potential
LCOR = T correct aug charges
LPAW = T paw PP
EAUG = 322.069
DEXC = 0.000
RMAX = 1.950 core radius for proj-oper
RAUG = 1.300 factor for augmentation sphere
RDEP = 1.993 radius for radial grids
RDEPT = 1.837 core radius for aug-charge
Atomic configuration
6 entries
n l j E occ.
1 0 0.50 -1785.8828 2.0000
2 0 0.50 -139.4969 2.0000
2 1 1.50 -95.5546 6.0000
3 0 0.50 -10.8127 2.0000
3 1 0.50 -4.0811 2.0000
3 2 1.50 -4.0817 0.0000
...
The top lines of the POTCAR file
Never (almost) edit
Check that correct POTCARs are used and the ENMAX values for setting ENCUT in INCAR
grep PAW POTCAR
grep ENMAX POTCAR
1. Calculation
A first static calculation for Si with the lattice constant 3.9 Å. Create a new folder “scf0”, move the input files + job script, copy the folder to “scf1” (we will use it later) and go to “scf0”
mkdir scf0
mv INCAR POSCAR KPOINTS POTCAR run.sh scf0
cp -r scf0 scf1
cd scf0
Submit the job script “run.sh” to the job queue with
sbatch run.sh
The job script looks like below
#!/bin/bash
#SBATCH -A naiss2024-22-241
#SBATCH -t 0:30:00
#SBATCH -n 4
#SBATCH -J vaspjob
module load VASP/6.4.3.19032024-omp-hpc1-intel-2023a-eb
mpprun vasp_std
#!/bin/bash
#SBATCH -A EUHPC_TD02_030
#SBATCH -p boost_usr_prod
#SBATCH --qos=boost_qos_dbg
#SBATCH --time 00:15:00
#SBATCH -n 8
#SBATCH --ntasks-per-node=8
#SBATCH --cpus-per-task=1
#SBATCH --job-name=vaspjob
module use /leonardo_scratch/fast/EUHPC_TD02_030/vasp_ws2024/modules
module load VASP/6.4.3-cpu1
module load intel-oneapi-compilers/2023.2.1
module load intel-oneapi-mpi/2021.10.0
module load intel-oneapi-mkl/2023.2.0
module load hdf5/1.14.3--intel-oneapi-mpi--2021.10.0--oneapi--2023.2.0
export SRUN_CPUS_PER_TASK=$SLURM_CPUS_PER_TASK
export OMP_NUM_THREADS=1
srun vasp_std
The job should finish quite quickly. Check the status of the job (if submitted to the queue) with
squeue -u USERNAME
it might already have finished, in that case it’ll not be shown. Among the output files in particular note
OUTCAR
OSZICAR
slurm-JOBID.out
in which JOBID
is a string of numbers. Note that
Some warning messages will only show in the standard output of the job,
slurm-JOBID.out
if submitted to the queue. Therefore, also carefully check the output when running interactively.
You can quickly check the iteration steps and convergence with “cat”
cat OSZICAR
For checking into the main output file OUTCAR and other large files, it’s convenient to use the fast and safe (no writing) text viewer “less”
less OUTCAR
“less” can be quit with pressing q
.
2. Total energy vs volume calculation
Go back to the main folder “fcc_Si” with
cd ..
pwd
“pwd” shows the present folder, confirm that you’re back in “fcc_Si”, otherwise use “cd” to go there.
In this part we will calculate the total energies of fcc Si between 3.5 and 4.3 Å. To do this a bit quicker, a special job script “run-vol.sh” is prepared (bash shell script):
#!/bin/bash
#SBATCH -A naiss2024-22-241
#SBATCH -t 0:30:00
#SBATCH -n 4
#SBATCH -J vaspjob
module load VASP/6.4.3.19032024-omp-hpc1-intel-2023a-eb
for i in 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3 ; do
mkdir -p $i
cd $i
cp /software/sse2/tetralith_el9/manual/vasp/POTCARs/PBE/2024-03-19/Si/POTCAR .
cp /software/sse2/tetralith_el9/manual/vasp/training/ws2024/fcc_Si/INCAR .
cp /software/sse2/tetralith_el9/manual/vasp/training/ws2024/fcc_Si/KPOINTS .
cat >POSCAR <<EOF
fcc:
$i
0.5 0.5 0.0
0.0 0.5 0.5
0.5 0.0 0.5
Si
1
cartesian
0 0 0
EOF
mpprun vasp_std
E=`awk '/F=/ {print $0}' OSZICAR` ; echo $i $E >>../SUMMARY.fcc
cd ..
done
#!/bin/bash
#SBATCH -A EUHPC_TD02_030
#SBATCH -p boost_usr_prod
#SBATCH --qos=boost_qos_dbg
#SBATCH --time 00:15:00
#SBATCH -n 8
#SBATCH --ntasks-per-node=8
#SBATCH --cpus-per-task=1
#SBATCH --job-name=vaspjob
module use /leonardo_scratch/fast/EUHPC_TD02_030/vasp_ws2024/modules
module load VASP/6.4.3-cpu1
module load intel-oneapi-compilers/2023.2.1
module load intel-oneapi-mpi/2021.10.0
module load intel-oneapi-mkl/2023.2.0
module load hdf5/1.14.3--intel-oneapi-mpi--2021.10.0--oneapi--2023.2.0
export SRUN_CPUS_PER_TASK=$SLURM_CPUS_PER_TASK
export OMP_NUM_THREADS=1
for i in 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3 ; do
mkdir -p $i
cd $i
cp /leonardo_scratch/fast/EUHPC_TD02_030/vasp_ws2024/potpaw_PBE.64/Si/POTCAR .
cp /leonardo_scratch/fast/EUHPC_TD02_030/vasp_ws2024/examples/fcc_Si/INCAR .
cp /leonardo_scratch/fast/EUHPC_TD02_030/vasp_ws2024/examples/fcc_Si/KPOINTS .
cat >POSCAR <<!
fcc:
$i
0.5 0.5 0.0
0.0 0.5 0.5
0.5 0.0 0.5
Si
1
cartesian
0 0 0
!
srun vasp_std
E=`awk '/F=/ {print $0}' OSZICAR` ; echo $i $E >>../SUMMARY.fcc
cd ..
done
In brief, the above script creates a new folder with the same name as the lattice constant, copying POTCAR, INCAR and KPOINTS, while creating a new POSCAR file. It also collects the total energies from all OSZICAR files into a new file “SUMMARY.fcc”.
Now, submit the job script “run-vol.sh” to the queue
sbatch run-vol.sh
After a successful run, there should now be folders 3.5 - 4.3 with the different calculations and a file SUMMARY.fcc which can be checked e.g. with “less” or “cat”
3.5 1 F= -.44256909E+01 E0= -.44234194E+01 d E =-.454310E-02
3.6 1 F= -.46614931E+01 E0= -.46600638E+01 d E =-.285864E-02
3.7 1 F= -.47980122E+01 E0= -.47959555E+01 d E =-.411323E-02
3.8 1 F= -.48645323E+01 E0= -.48630343E+01 d E =-.299612E-02
3.9 1 F= -.48774144E+01 E0= -.48758835E+01 d E =-.306173E-02
4.0 1 F= -.48487753E+01 E0= -.48481407E+01 d E =-.126921E-02
4.1 1 F= -.47852971E+01 E0= -.47845193E+01 d E =-.155573E-02
4.2 1 F= -.46937300E+01 E0= -.46922884E+01 d E =-.288335E-02
4.3 1 F= -.45831536E+01 E0= -.45812206E+01 d E =-.386597E-02
You can make a quick plot of the total energy as a function of the lattice constant, e.g. by using gnuplot, start it with
gnuplot
thereafter, at the “gnuplot>” prompt type
plot "SUMMARY.fcc" using ($1):($4) w lp
set term png
set output "SUMMARY.fcc.png"
plot "SUMMARY.fcc" using ($1):($4) w lp
Thereafter, copy the file SUMMARY.fcc.png
to your local computer
From the plot we can see that the equilibrium lattice constant is around 3.9 Å.
To find a more exact value, we can use an equation of state method. For example, a popular method is Birch-Murnaghan. To quickly check, you can try a python script which uses functions from the Atomic Simulation Environment (ASE) collection of tools based on Python3.
First, we need to load ASE and a suitable Python3 module,
module load ASE/3.22.1-hpc1-python
module load Python/3.10.4-env-hpc1-gcc-2022a-eb
Here, a Python environment has been prepared for the workshop, which includes ASE, py4vasp, numpy etc. It can be activated by loading the module:
module use /leonardo_scratch/fast/EUHPC_TD02_030/vasp_ws2024/modules
module load pythonws-env/1.0-hpc1
To check all packages included with the Python environment, one can e.g. type:
pip list
To confirm use of the “correct” python, one can type:
which python
As input a file with volume (Å^3) and total energy (eV) is needed. To save some time, there is a script which can be used, so run:
./get-vol-etot.sh
The bash script “get-vol-etot.sh” looks like
#!/bin/bash
for i in 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3 ; do
#V = `grep volume $i/vasprun.xml | head -1 | awk '{print $3}'`
cd $i
V=`awk '/volume/ {print $3; exit}' vasprun.xml`
E=`awk '/F=/ {print $3}' OSZICAR`
echo $V $E >>../vol_etot.dat
cd ..
done
and produces the file “vol_etot.dat”. We will use a small python script “eqos.py” which uses ASE and looks like
import numpy
from ase.units import GPa
from ase.eos import EquationOfState
# Read data
volumes,energies = numpy.loadtxt('vol_etot.dat', unpack=True)
# Fit EOS
eos = EquationOfState(volumes,energies, eos='birchmurnaghan')
# There are several other choices for eos, see doc at:
# https://wiki.fysik.dtu.dk/ase/ase/eos.html
# set eos to e.g. birchmurnaghan, sjeos (ASE default), p3
v0,e0,B = eos.fit()
print ()
print ("Equation of state:")
print ("-------------------")
print ("E0: %2.6f eV" % (e0))
print ("V0: %2.6f A^3" % (v0))
print ("B: %2.6f GPa" % (B/GPa))
print ()
run it to calculate the equilibrium volume using an equation of state (first loading the modules or activating the environment, as described above)
python eqos.py
the output might look like
Equation of state:
-------------------
E0: -4.880229 eV
V0: 14.546730 A^3
B: 84.365350 GPa
The EOS methods are expected to work better closer to the equilibrium. The chosen method can be changed by editing eos='birchmurnaghan'
in the line
eos = EquationOfState(volumes,energies, eos='birchmurnaghan')
Note that the volume V0 is for a single atom, so to obtain the lattice constant a, one needs to calculate (since there are 4 atoms per fcc cell)
a = (4 x V0)^1/3
To quickly compute a, you might e.g. use python directly in the terminal
python
and input at the “>>>” prompt
(4*14.546730) ** (1./3.)
and exit with ctrl d
(what happens adding 0.7 + 0.6 using python?).
3. Calculation
A second static calculation, now using the obtained equilibrium volume. Go to the folder “scf1” which was created previously
cd scf1
and insert the lattice parameter a obtained in 2. by editing POSCAR, e.g. with
vi POSCAR
or use your favourite text editor (emacs
, nano
, gedit
, …). Finally, submit the job
sbatch run.sh
and compare the total energy with previous results. For example, try
grep "free energy" OUTCAR
grep "free energy" OUTCAR
grep F= OSZICAR
cat OSZICAR
grep F= slurm-JOBID.out
cat slurm-JOBID.out
Comparing with the EOS result, does it look reasonable?
Extra tasks
Try different methods to compute the equilibrium by editing the script “eqos.py”
Compute the equilibrium volumes for a less dense k-mesh
5 5 5
in KPOINTS and with ENCUT set to ENMIN from POTCAR, and (2) for a denser k-mesh29 29 29
and with ENCUT = ENMAX x 1.3. Suggestion: create new folders, copy and edit the “run_vol.sh” job script