VASP

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

See also