PLUGINS/STRUCTURE: Difference between revisions

From VASP Wiki
(Created page with "{{TAGDEF|PLUGINS/STRUCTURE| .True. {{!}} .False.|.False.}} Description: {{TAG|PLUGINS/STRUCTURE}} calls the Python plugin for the structure interface for each ionic relaxation step ---- When {{TAG|PLUGINS/STRUCTURE}}=.TRUE., VASP calls the <code>structure</code> Python function at the end of each ionic relaxation step. The primary use-case of this tag is to modify the structure based on the computed energy, force and stress tensor. ==Expected inputs== The <code>stru...")
 
No edit summary
 
(7 intermediate revisions by 2 users not shown)
Line 10: Line 10:


The <code>structure</code> Python function expects the following inputs,
The <code>structure</code> Python function expects the following inputs,
    def structure(constants, additions):
<syntaxhighlight lang="python" line>
def structure(constants, additions):
</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].
The <code>constants</code> dataclass consists of the following inputs, listed here with their associated [https://numpy.org/doc/stable/user/basics.types.html datatypes]
The <code>constants</code> dataclass consists of the following inputs, listed here with their associated [https://numpy.org/doc/stable/user/basics.types.html datatypes]
<syntaxhighlight lang="python" line>
@dataclass(frozen=True)
class ConstantsStructure:
     number_ions: int
     number_ions: int
     number_ion_types: int
     number_ion_types: int
     ion_types: NDArray[np.int32]
     ion_types: IndexArray
     atomic_numbers: NDArray[np.int32]
     atomic_numbers: IntArray
     lattice_vectors: NDArray[np.float64]
     lattice_vectors: DoubleArray
     positions: NDArray[np.float64]
     positions: DoubleArray
     {{TAGBL|POMASS}}: NDArray[np.float64]
     POMASS: DoubleArray
     total_energy: float
     total_energy: float
     forces: NDArray[np.float64]
     forces: DoubleArray
     stress: NDArray[np.float64]
     stress: DoubleArray
     shape_grid: NDArray[np.float64]
     shape_grid: IntArray
     charge_density: NDArray[np.float64]
     charge_density: DoubleArray
</syntaxhighlight>
Note that the {{FILE|INCAR}} tags are capitalized.
Note that the {{FILE|INCAR}} tags are capitalized.
<code>number_ions</code> is the total number of ions listed in the {{FILE|POSCAR}} file,
<code>number_ions</code> is the total number of ions listed in the {{FILE|POSCAR}} file,
Line 32: Line 38:
<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>shape_grid</code> is a three dimensional integer array which stores the shape of the real space grid, {{TAG|NGXF}}, {{TAG|NGYF}} and {{TAG|NGZF}} and <code>charge_density</code> is the charge density on this 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>shape_grid</code> is a three dimensional integer array which stores the shape of the real space grid, {{TAG|NGXF}}, {{TAG|NGYF}} and {{TAG|NGZF}} and <code>charge_density</code> is the charge density on this real space grid.
The <code>additions</code> dataclass consists of the following modifiable outputs
The <code>additions</code> dataclass consists of the following modifiable outputs
     lattice_vectors: NDArray[np.float64]
<syntaxhighlight lang="python" line>
     positions: NDArray[np.float64]
@dataclass
class AdditionsStructure:
     lattice_vectors: DoubleArray
     positions: DoubleArray
</syntaxhighlight>


==Modifying quantities==
==Modifying quantities==
Modify the quantities listed in additions by adding to them.
Modify the quantities listed in additions by adding to them.
    def structure(constants, additions)
<syntaxhighlight lang="python" line>
        additions.positions += np.ones((constants.number_ions,3))
def structure(constants, additions)
{{NB| mind | You may not make modifications to quantities in <code>constants</code>}}
    additions.positions += np.ones((constants.number_ions,3))
</syntaxhighlight>
{{WARN_PLUGINS_CONSTANTS}}


----
== Related tags and articles ==
<!--[[The_VASP_Manual|Contents]]-->
[[Plugins]],
{{TAG|PLUGINS/FORCE_AND_STRESS}},
{{TAG|PLUGINS/LOCAL_POTENTIAL}},
{{TAG|PLUGINS/MACHINE_LEARNING}}


<!-- Link to categories like this: [[Category:INCAR]][[Category:Electronic Minimization]]
[[Category:INCAR tag]]
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.-->

Latest revision as of 15:29, 18 December 2024

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

Description: PLUGINS/STRUCTURE calls the Python plugin for the structure interface for each ionic relaxation step


When PLUGINS/STRUCTURE=.TRUE., VASP calls the structure Python function at the end of each ionic relaxation step. The primary use-case of this tag is to modify the structure based on the computed energy, force and stress tensor.

Expected inputs

The structure Python function expects the following inputs,

def structure(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 ConstantsStructure:
    number_ions: int
    number_ion_types: int
    ion_types: IndexArray
    atomic_numbers: IntArray
    lattice_vectors: DoubleArray
    positions: DoubleArray
    POMASS: DoubleArray
    total_energy: float
    forces: DoubleArray
    stress: DoubleArray
    shape_grid: IntArray
    charge_density: DoubleArray

Note that the INCAR tags are capitalized. 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. shape_grid is a three dimensional integer array which stores the shape of the real space grid, NGXF, NGYF and NGZF and charge_density is the charge density on this real space grid.

The additions dataclass consists of the following modifiable outputs

@dataclass
class AdditionsStructure:
    lattice_vectors: DoubleArray
    positions: DoubleArray

Modifying quantities

Modify the quantities listed in additions by adding to them.

def structure(constants, additions)
    additions.positions += np.ones((constants.number_ions,3))
Warning: You should not make modifications to quantities in constants. We implemented some safeguards to prevent accidental modifications. Intentional changes will lead to erratic behavior because we may change the VASP code assuming these quantities are constant.

Related tags and articles

Plugins, PLUGINS/FORCE_AND_STRESS, PLUGINS/LOCAL_POTENTIAL, PLUGINS/MACHINE_LEARNING