PLUGINS/FORCE AND STRESS
PLUGINS/FORCE_AND_STRESS = .TRUE. | .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.
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 PLUGINS/LOCAL_POTENTIAL
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
ENCUT: float NELECT: float shape_grid: NDArray[np.int32] number_ions: int number_ion_types: int ion_types: NDArray[np.int32] atomic_numbers: NDArray[np.int32] lattice_vectors: NDArray[np.float64] positions: NDArray[np.float64] ZVAL: NDArray[np.float64] POMASS: NDArray[np.float64] forces: NDArray[np.float64] stress: NDArray[np.float64] charge_density: NDArray[np.float64]
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.
The additions
dataclass consists of the following modifiable outputs
total_energy: float forces: NDArray[np.float64] stress: NDArray[np.float64]
Modifying quantities
Modify the quantities listed in additions by adding to them. For example, if you wanted to add one to the forces
def force_and_stress(constants, additions) additions.forces += np.ones((constants.number_ions,3))
Mind: You may not make modifications to quantities in constants
|