VASP is a density-functional theory code using pseudopotentials or the projector-augmented wave method and a plane wave basis set. This interface makes it possible to use VASP as a calculator in ASE, and also to use ASE as a post-processor for an already performed VASP calculation.

Environment variables

You need to write a script called containing something like this:

import os
exitcode = os.system('vasp')

The environment variable VASP_SCRIPT must point to that file.

A directory containing the pseudopotential directories potpaw (LDA XC) potpaw_GGA (PW91 XC) and potpaw_PBE (PBE XC) is also needed, and it is to be put in the environment variable VASP_PP_PATH.

Set both environment variables in your shell configuration file:

$ export VASP_SCRIPT=$HOME/vasp/
$ export VASP_PP_PATH=$HOME/vasp/mypps

VASP Calculator

The default setting used by the VASP interface is

class ase.calculators.vasp.Vasp(restart=None, xc='PW91', setups=None, kpts=(1, 1, 1), gamma=None)[source]

Below follows a list with a selection of parameters

keyword type default value description
restart bool None Restart old calculation or use ASE for post-processing
xc str 'PW91' XC-functional
setups str None Additional setup option
kpts seq \(\Gamma\)-point k-point sampling
gamma bool None \(\Gamma\)-point centered k-point sampling
reciprocal bool None Use reciprocal units if k-points are specified explicitly
prec str   Accuracy of calculation
encut float   Kinetic energy cutoff
ediff float   Convergence break condition for SC-loop.
nbands int   Number of bands
algo str   Electronic minimization algorithm
ismear int   Type of smearing
sigma float   Width of smearing
nelm int   Maximum number of SC-iterations

seq: A sequence of three int‘s.

For parameters in the list without default value given, VASP will set the default value. Most of the parameters used in the VASP INCAR file are allowed keywords. See the official VASP manual for more details.


Parameters can be changed after the calculator has been constructed by using the set() method:

>>> calc.set(prec='Accurate', ediff=1E-5)

This would set the precision to Accurate and the break condition for the electronic SC-loop to 1E-5 eV.

Spin-polarized calculation

If the atoms object has non-zero magnetic moments, a spin-polarized calculation will be performed by default.

Here follows an example how to calculate the total magnetic moment of a sodium chloride molecule.

from ase import Atoms, Atom
from ase.calculators.vasp import Vasp

a = [6.5, 6.5, 7.7]
d = 2.3608
NaCl = Atoms([Atom('Na', [0, 0, 0], magmom=1.928),
              Atom('Cl', [0, 0, d], magmom=0.75)],

calc = Vasp(prec='Accurate',


In this example the initial magnetic moments are assigned to the atoms when defining the Atoms object. The calculator will detect that at least one of the atoms has a non-zero magnetic moment and a spin-polarized calculation will automatically be performed. The ASE generated INCAR file will look like:

INCAR created by Atomic Simulation Environment
 PREC = Accurate
 ISPIN = 2
 MAGMOM = 1*1.9280 1*0.7500 


It is also possible to manually tell the calculator to perform a spin-polarized calculation:

>>> calc.set(ispin=2)

This can be useful for continuation jobs, where the initial magnetic moment is read from the WAVECAR file.

Restart old calculation

To continue an old calculation which has been performed without the interface use the restart parameter when constructing the calculator

>>> calc = Vasp(restart=True)

Then the calculator will read atomic positions from the CONTCAR file, physical quantities from the OUTCAR file, k-points from the KPOINTS file and parameters from the INCAR file.


Only Monkhorst-Pack and Gamma-centered k-point sampling are supported for restart at the moment. Some INCAR parameters may not be implemented for restart yet. Please report any problems to the ASE mailing list.

The restart parameter can be used , as the name suggest to continue a job from where a previous calculation finished. Furthermore, it can be used to extract data from an already performed calculation. For example, to get the total potential energy of the sodium chloride molecule in the previous section, without performing any additional calculations, in the directory of the previous calculation do:

>>> calc = Vasp(restart=True)
>>> atoms = calc.get_atoms()
>>> atoms.get_potential_energy()