Jump to content

Requests for technical support from the VASP team should be posted in the VASP Forum.

PLUGINS/FORCE AND STRESS: Difference between revisions

From VASP Wiki
Schlipf (talk | contribs)
Schlipf (talk | contribs)
No edit summary
 
(12 intermediate revisions by 2 users not shown)
Line 5: Line 5:


When {{TAG|PLUGINS/FORCE_AND_STRESS}}=.TRUE., VASP calls the <code>force_and_stress</code> Python function at the end of each ionic relaxation step.  
When {{TAG|PLUGINS/FORCE_AND_STRESS}}=.TRUE., VASP calls the <code>force_and_stress</code> Python function at the end of each ionic relaxation step.  
The primary use-case of this tag is to modify forces and the stress tensor to be consistent with modifications to the potential performed with {{TAG|PLUGINS/LOCAL_POTENTIAL}}
You can use this tag to modify forces and the stress tensor to be consistent with modifications to the potential performed with {{TAG|PLUGINS/LOCAL_POTENTIAL}}.
Furthermore, you could implement new force corrections like van-der-Waals functionals or use it to run a machine-learned interatomic potential as the force engine in VASP.
Usually the forces and stress are added to ones obtained by VASP, but you can set {{TAG|PLUGINS/ML_MODE}} to overwrite them instead.


==Expected inputs==
==Expected inputs==
Line 12: Line 14:
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def force_and_stress(constants, additions):
def force_and_stress(constants, additions):
    ...
</syntaxhighlight>
</syntaxhighlight>
where <code>constants</code> and <code>additions</code> and [https://docs.python.org/3/library/dataclasses.html Python dataclasses].
where <code>constants</code> and <code>additions</code> and [https://docs.python.org/3/library/dataclasses.html Python dataclasses].
Line 32: Line 35:
     stress: DoubleArray
     stress: DoubleArray
     charge_density: Optional[DoubleArray] = None
     charge_density: Optional[DoubleArray] = None
    neighbor_list: List[Neighbors] = field(default_factory=list)
</syntaxhighlight>
</syntaxhighlight>
Note that the {{FILE|INCAR}} tags are capitalized.
Note that the {{FILE|INCAR}} tags are capitalized.
Line 41: Line 45:
<code>lattice_vectors</code> and <code>positions</code> contain the lattice vectors and positions of the current SCF step
<code>lattice_vectors</code> and <code>positions</code> contain the lattice vectors and positions of the current SCF step
<code>forces</code> and <code>stress</code> are the computed forces and stress tensor and <code>charge_density</code> contains the charge density on the real space grid.
<code>forces</code> and <code>stress</code> are the computed forces and stress tensor and <code>charge_density</code> contains the charge density on the real space grid.
<code>neighbor_list</code> contains a list of all neighbors near an atom up to a cutoff {{TAG|PLUGINS/NEIGHBOR_CUTOFF}}.


The <code>additions</code> dataclass consists of the following modifiable outputs
The <code>additions</code> dataclass consists of the following modifiable outputs
Line 58: Line 63:
     additions.forces += np.ones((constants.number_ions,3))
     additions.forces += np.ones((constants.number_ions,3))
</syntaxhighlight>
</syntaxhighlight>
{{NB| mind | You may not make modifications to quantities in <code>constants</code>}}
{{WARN_PLUGINS_CONSTANTS}}


----
We provide a special helper class if you want to interface ASE calculators with VASP.
<!--[[The_VASP_Manual|Contents]]-->
This class makes these use cases almost trivial


<!-- Link to categories like this: [[Category:INCAR]][[Category:Electronic Minimization]]  
<syntaxhighlight lang="python" line>
only comment it out when you want the page to show up on the category page, i.e., not when it is in the Construction namespace.-->
from vasp.force_field import AseForceField
 
def force_and_stress(constants, additions):
    calculator = ...  # setup your ASE calculator
    force_field = AseForceField(calculator)
    force_field.force_and_stress(constants, additions)
</syntaxhighlight>
 
== Related tags and articles ==
[[Plugins]],
{{TAG|PLUGINS/LOCAL_POTENTIAL}},
{{TAG|PLUGINS/OCCUPANCIES}},
{{TAG|PLUGINS/ML_MODE}},
{{TAG|PLUGINS/NEIGHBOR_CUTOFF}},
{{TAG|PLUGINS/STRUCTURE}}
 
{{sc|PLUGINS/FORCE_AND_STRESS|Examples|Examples that use this tag}}
 
[[Category:INCAR tag]]

Latest revision as of 10:06, 16 March 2026

PLUGINS/FORCE_AND_STRESS = .True. | .False.
Default: PLUGINS/FORCE_AND_STRESS = .False. 

Description: PLUGINS/FORCE_AND_STRESS calls the Python plugin for the force and stress interface for each ionic relaxation step


When PLUGINS/FORCE_AND_STRESS=.TRUE., VASP calls the force_and_stress Python function at the end of each ionic relaxation step. You can use this tag to modify forces and the stress tensor to be consistent with modifications to the potential performed with PLUGINS/LOCAL_POTENTIAL. Furthermore, you could implement new force corrections like van-der-Waals functionals or use it to run a machine-learned interatomic potential as the force engine in VASP. Usually the forces and stress are added to ones obtained by VASP, but you can set PLUGINS/ML_MODE to overwrite them instead.

Expected inputs

The force_and_stress Python function expects the following inputs,

def force_and_stress(constants, additions):
    ...

where constants and additions and Python dataclasses. The constants dataclass consists of the following inputs, listed here with their associated datatypes

@dataclass(frozen=True)
class ConstantsForceAndStress:
    ENCUT: float
    NELECT: float
    shape_grid: IntArray
    number_ions: int
    number_ion_types: int
    ion_types: IndexArray
    atomic_numbers: IntArray
    lattice_vectors: DoubleArray
    positions: DoubleArray
    ZVAL: DoubleArray
    POMASS: DoubleArray
    forces: DoubleArray
    stress: DoubleArray
    charge_density: Optional[DoubleArray] = None
    neighbor_list: List[Neighbors] = field(default_factory=list)

Note that the INCAR tags are capitalized. shape_grid is a three dimensional integer array which stores the shape of the real space grid, NGXF, NGYF and NGZF, number_ions is the total number of ions listed in the POSCAR file, number_ion_types is the number of ion corresponding to each ion type in the convention of the POSCAR file, ion_types stores the total number of ion types, atomic_numbers contains the atomic number for each atom type, lattice_vectors and positions contain the lattice vectors and positions of the current SCF step forces and stress are the computed forces and stress tensor and charge_density contains the charge density on the real space grid. neighbor_list contains a list of all neighbors near an atom up to a cutoff PLUGINS/NEIGHBOR_CUTOFF.

The additions dataclass consists of the following modifiable outputs

@dataclass
class AdditionsForceAndStress:
    total_energy: float
    forces: DoubleArray
    stress: DoubleArray

Modifying quantities

Modify the quantities listed in additions by adding to them. For example, if you wanted to add one to the forces

import numpy as np
def force_and_stress(constants, additions)
    additions.forces += np.ones((constants.number_ions,3))

We provide a special helper class if you want to interface ASE calculators with VASP. This class makes these use cases almost trivial

from vasp.force_field import AseForceField

def force_and_stress(constants, additions):
    calculator = ...  # setup your ASE calculator
    force_field = AseForceField(calculator)
    force_field.force_and_stress(constants, additions)

Related tags and articles

Plugins, PLUGINS/LOCAL_POTENTIAL, PLUGINS/OCCUPANCIES, PLUGINS/ML_MODE, PLUGINS/NEIGHBOR_CUTOFF, PLUGINS/STRUCTURE

Examples that use this tag