torchani.ase#

Calculator subclass, used for interfacing with the ASE library

The ASE library can be used to perform molecular dynamics. For more information consult the user guide.

Classes

Calculator

TorchANI calculator for ASE

class torchani.ase.Calculator(model, overwrite=False, stress_kind='scaling')[source]#

TorchANI calculator for ASE

ANI models can be converted to their ASE Calculator form by calling the ANI.ase method.

import torchani
model = torchani.models.ANI1x()
calc = model.ase()  # Convert model into its ASE Calculator form
Parameters:
  • model (torchani.arch.ANI) – neural network potential model that convert coordinates into energies.

  • overwrite (bool) – After wrapping atoms into central box, whether to replace the original positions stored in ase.Atoms object with the wrapped positions.

  • stress_kind (str) – Strategy to calculate stress, valid options are fdotr, scaling, and numerical. The fdotr approach does not need the cell’s box information and can be used for multiple domians when running parallel on multi-GPUs.

implemented_properties: List[str] = ['energy', 'free_energy', 'forces', 'stress']#

Properties calculator can handle (energy, forces, …)

calculate(atoms=None, properties=['energy'], system_changes=['positions', 'numbers', 'cell', 'pbc', 'initial_charges', 'initial_magmoms'])[source]#

Do the calculation.

properties: list of str

List of what needs to be calculated. Can be any combination of ‘energy’, ‘forces’, ‘stress’, ‘dipole’, ‘charges’, ‘magmom’ and ‘magmoms’.

system_changes: list of str

List of what has changed since last calculation. Can be any combination of these six: ‘positions’, ‘numbers’, ‘cell’, ‘pbc’, ‘initial_charges’ and ‘initial_magmoms’.

Subclasses need to implement this, but can ignore properties and system_changes if they want. Calculated properties should be inserted into results dictionary like shown in this dummy example:

self.results = {'energy': 0.0,
                'forces': np.zeros((len(atoms), 3)),
                'stress': np.zeros(6),
                'dipole': np.zeros(3),
                'charges': np.zeros(len(atoms)),
                'magmom': 0.0,
                'magmoms': np.zeros(len(atoms))}

The subclass implementation should first call this implementation to set the atoms attribute and create any missing directories.