pyxtal_ff.calculator

class pyxtal_ff.calculator.PyXtalFFCalculator(style='ase', **kwargs)[source]

Bases: ase.calculators.calculator.Calculator

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.

implemented_properties = ['energy', 'forces', 'stress']
nolabel = True
print_all()[source]
print_energy()[source]
print_forces()[source]
print_stresses()[source]
pyxtal_ff.calculator.elastic_properties(C)[source]
pyxtal_ff.calculator.optimize(atoms, sym=True, box=False, P=0.0, method='FIRE', fmax=0.01, steps=1000, logfile='ase.log')[source]

Geometry relaxation

Parameters:
  • Atoms – ase atoms
  • sym – whether or not fix symmetry
  • box – whether or not relax box
  • P – external pressure in GPa
  • method – optimization method
  • fmax – toleration force
  • steps – maximum number of steps
  • logfile – output of the log file