VASP
In this section:
Description
According to the documentation of VASP, VASP (Vienna Ab initio Simulation Package) is an ab initio quantum mechanical molecular simulation package using pseudopotentials and a plane-wave basis. It is widely used for electronic structure calculations and molecular dynamics in materials.
Available Versions
vasp/6.4.3 (default)
vasp/6.6.0
Loading the Module
# Load VASP
module load vasp/6.4.3
# Verify installation
vasp_std --version
# Different compilations
# vasp_std - standard version
# vasp_gam - gamma point only
# vasp_ncl - non-collinear (spin-orbit)
Serial Job Submission
submit_vasp_serial.sh
#!/bin/bash
#SBATCH -J vasp_serial
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 24:00:00
#SBATCH --mem=8G
export INPUT="INCAR POSCAR POTCAR KPOINTS"
export OUTPUT="OUTCAR OSZICAR vasprun.xml"
module load vasp/6.4.3
job-nanny vasp_std
MPI Job Submission
submit_vasp_mpi.sh
#!/bin/bash
#SBATCH -J vasp_mpi
#SBATCH -N 2
#SBATCH --ntasks-per-node=28
#SBATCH -t 72:00:00
#SBATCH --mem-per-cpu=2G
export INPUT="INCAR POSCAR POTCAR KPOINTS"
export OUTPUT="OUTCAR OSZICAR vasprun.xml"
module load vasp/6.4.3
job-nanny mpirun -np $SLURM_NTASKS vasp_std
Input Files
INCAR (calculation parameters)
INCAR
System = Si bulk calculation
ISTART = 0
ICHARG = 2
ENCUT = 400
ISMEAR = 0
SIGMA = 0.1
PREC = Accurate
LREAL = Auto
ALGO = Normal
NSW = 100
IBRION = 2
ISIF = 3
EDIFF = 1E-6
EDIFFG = -0.01
NELMIN = 5
NELM = 100
LPLANE = .TRUE.
NPAR = 4
POSCAR (structure)
POSCAR
Si bulk
1.0
5.430 0.000 0.000
0.000 5.430 0.000
0.000 0.000 5.430
Si
2
Direct
0.000 0.000 0.000
0.250 0.250 0.250
POTCAR (pseudopotentials)
# Concatenate pseudopotentials
cat potpaw_PBE/Si/POTCAR > POTCAR
KPOINTS (k-point mesh)
KPOINTS
Automatic mesh
0
Gamma
8 8 8
0 0 0
Geometry Optimization
submit_vasp_relax.sh
#!/bin/bash
#SBATCH -J vasp_relax
#SBATCH -N 2
#SBATCH --ntasks-per-node=28
#SBATCH -t 48:00:00
#SBATCH --mem-per-cpu=2G
export INPUT="INCAR POSCAR POTCAR KPOINTS"
export OUTPUT="OUTCAR OSZICAR CONTCAR"
module load vasp/6.4.3
job-nanny mpirun -np $SLURM_NTASKS vasp_std
# Save optimized geometry
cp CONTCAR POSCAR_optimized
Band Structure Calculation
submit_vasp_bands.sh
#!/bin/bash
#SBATCH -J vasp_bands
#SBATCH -N 2
#SBATCH --ntasks-per-node=28
#SBATCH -t 36:00:00
#SBATCH --mem-per-cpu=2G
export INPUT="INCAR POSCAR POTCAR KPOINTS_bands"
export OUTPUT="OUTCAR bands.dat"
module load vasp/6.4.3
# Step 1: SCF with dense mesh
cp KPOINTS_scf KPOINTS
job-nanny mpirun -np $SLURM_NTASKS vasp_std
# Step 2: Band calculation
cp KPOINTS_bands KPOINTS
cp CHGCAR CHGCAR
job-nanny mpirun -np $SLURM_NTASKS vasp_std
# Process bands
cat > process_bands.py << 'EOF'
import numpy as np
import matplotlib.pyplot as plt
# Read band data
data = np.loadtxt('bands.dat')
kpath = data[:,0]
eigenvalues = data[:,1:]
# Adjust to Fermi energy (usually from OUTCAR)
efermi = 5.0 # replace with actual value
eigenvalues -= efermi
# Plot
plt.figure(figsize=(8, 6))
for i in range(eigenvalues.shape[1]):
plt.plot(kpath, eigenvalues[:,i], 'b-', linewidth=1)
plt.xlabel('K-path')
plt.ylabel('E - E_F (eV)')
plt.title('Band structure')
plt.grid(True)
plt.axhline(y=0, color='r', linestyle='--', alpha=0.5)
plt.savefig('band_structure.png', dpi=150)
EOF
python process_bands.py
Density of States (DOS)
submit_vasp_dos.sh
#!/bin/bash
#SBATCH -J vasp_dos
#SBATCH -N 2
#SBATCH --ntasks-per-node=28
#SBATCH -t 36:00:00
#SBATCH --mem-per-cpu=2G
export INPUT="INCAR POSCAR POTCAR KPOINTS_dos"
export OUTPUT="OUTCAR DOSCAR"
module load vasp/6.4.3
# SCF calculation
cp KPOINTS_scf KPOINTS
job-nanny mpirun -np $SLURM_NTASKS vasp_std
# DOS calculation
cat > INCAR_dos << 'EOF'
System = Si DOS calculation
ISTART = 1
ICHARG = 11
ENCUT = 400
ISMEAR = -5
SIGMA = 0.05
PREC = Accurate
LORBIT = 11
NEDOS = 1000
EDIFF = 1E-6
LREAL = Auto
EOF
cp INCAR_dos INCAR
cp KPOINTS_dos KPOINTS
job-nanny mpirun -np $SLURM_NTASKS vasp_std
# Process DOS
cat > process_dos.py << 'EOF'
import numpy as np
import matplotlib.pyplot as plt
# Read DOS
dos_data = np.loadtxt('DOSCAR', skiprows=6)
energy = dos_data[:,0]
total_dos = dos_data[:,1]
# Find Fermi energy (from OUTCAR)
with open('OUTCAR') as f:
for line in f:
if 'E-fermi' in line:
efermi = float(line.split()[2])
break
plt.figure()
plt.plot(energy - efermi, total_dos, 'b-', linewidth=2)
plt.xlabel('E - E_F (eV)')
plt.ylabel('DOS (states/eV)')
plt.title('Density of states')
plt.grid(True)
plt.axvline(x=0, color='r', linestyle='--', alpha=0.5)
plt.savefig('dos.png', dpi=150)
EOF
python process_dos.py
Job Array for Parameter Scan
submit_vasp_array.sh
#!/bin/bash
#SBATCH -J vasp_array
#SBATCH --array=1-5
#SBATCH -N 1
#SBATCH -n 28
#SBATCH -t 24:00:00
#SBATCH --mem-per-cpu=2G
ECUT_VALUES=(300 350 400 450 500)
ECUT=${ECUT_VALUES[$SLURM_ARRAY_TASK_ID-1]}
export INPUT="INCAR POSCAR POTCAR KPOINTS"
export OUTPUT="ecut_${ECUT}/"
module load vasp/6.4.3
mkdir -p ecut_${ECUT}
cd ecut_${ECUT}
cp ../POSCAR .
cp ../POTCAR .
cp ../KPOINTS .
# Modify ENCUT in INCAR
sed "s/ENCUT = .*/ENCUT = $ECUT/" ../INCAR > INCAR
job-nanny vasp_std
# Extract total energy
grep "energy without entropy" OUTCAR | tail -1 >> ../energies.txt
Results Analysis
analyze_vasp.sh
#!/bin/bash
#SBATCH -J analyze_vasp
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 01:00:00
#SBATCH --mem=2G
# Extract total energy
grep "energy without entropy" */OUTCAR | awk '{print $5}' > energies.txt
# Extract forces
for dir in ecut_*/; do
echo "Forces in $dir" >> forces.txt
grep "TOTAL-FORCE" ${dir}OUTCAR -A 5 >> forces.txt
echo "" >> forces.txt
done
# Extract lattice parameters
grep "length of vectors" */OUTCAR > lattice_params.txt
# Plot convergence
cat > plot_convergence.py << 'EOF'
import numpy as np
import matplotlib.pyplot as plt
data = np.loadtxt('energies.txt')
ecut = data[:,0]
energy = data[:,1]
plt.figure()
plt.plot(ecut, energy, 'bo-')
plt.xlabel('ENCUT (eV)')
plt.ylabel('Energy (eV)')
plt.title('Energy convergence')
plt.grid(True)
plt.savefig('convergence.png')
EOF
python plot_convergence.py
References
Documentation: https://www.vasp.at/wiki/
Tutorials: https://www.vasp.at/tutorials/
See also
Quantum ESPRESSO - DFT with plane waves
CP2K - DFT with mixed bases
Siesta - DFT with localized bases
Running Simulations - How to submit jobs