Statistiques
| Révision :

root / ase / calculators / singlepoint.py @ 5

Historique | Voir | Annoter | Télécharger (2,16 ko)

1 1 tkerber
import numpy as np
2 1 tkerber
3 1 tkerber
4 1 tkerber
class SinglePointCalculator:
5 1 tkerber
    """Special calculator for a single configuration.
6 1 tkerber

7 1 tkerber
    Used to remember the energy, force and stress for a given
8 1 tkerber
    configuration.  If the positions, atomic numbers, unit cell, or
9 1 tkerber
    boundary conditions are changed, then asking for
10 1 tkerber
    energy/forces/stress will raise an exception."""
11 1 tkerber
12 1 tkerber
    def __init__(self, energy, forces, stress, magmoms, atoms):
13 1 tkerber
        """Save energy, forces and stresses for the current configuration."""
14 1 tkerber
        self.energy = energy
15 1 tkerber
        if forces is not None:
16 1 tkerber
            forces = np.array(forces, float)
17 1 tkerber
        self.forces = forces
18 1 tkerber
        if stress is not None:
19 1 tkerber
            stress = np.array(stress, float)
20 1 tkerber
        self.stress = stress
21 1 tkerber
        if magmoms is not None:
22 1 tkerber
            magmoms = np.array(magmoms, float)
23 1 tkerber
        self.magmoms = magmoms
24 1 tkerber
        self.atoms = atoms.copy()
25 1 tkerber
26 1 tkerber
    def calculation_required(self, atoms, quantities):
27 1 tkerber
        ok = self.atoms == atoms
28 1 tkerber
        return ('forces' in quantities and (self.forces is None or not ok) or
29 1 tkerber
                'energy' in quantities and (self.energy is None or not ok) or
30 1 tkerber
                'stress' in quantities and (self.stress is None or not ok) or
31 1 tkerber
                'magmoms' in quantities and (self.magmoms is None or not ok))
32 1 tkerber
33 1 tkerber
    def update(self, atoms):
34 1 tkerber
        if self.atoms != atoms:
35 1 tkerber
            raise RuntimeError('Energy, forces and stress no longer correct.')
36 1 tkerber
37 1 tkerber
    def get_potential_energy(self, atoms):
38 1 tkerber
        self.update(atoms)
39 1 tkerber
        if self.energy is None:
40 1 tkerber
            raise RuntimeError('No energy.')
41 1 tkerber
        return self.energy
42 1 tkerber
43 1 tkerber
    def get_forces(self, atoms):
44 1 tkerber
        self.update(atoms)
45 1 tkerber
        if self.forces is None:
46 1 tkerber
            raise RuntimeError('No forces.')
47 1 tkerber
        return self.forces
48 1 tkerber
49 1 tkerber
    def get_stress(self, atoms):
50 1 tkerber
        self.update(atoms)
51 1 tkerber
        if self.stress is None:
52 1 tkerber
            raise NotImplementedError
53 1 tkerber
        return self.stress
54 1 tkerber
55 1 tkerber
    def get_spin_polarized(self):
56 1 tkerber
        return self.magmoms is not None and self.magmoms.any()
57 1 tkerber
58 1 tkerber
    def get_magnetic_moments(self, atoms):
59 1 tkerber
        self.update(atoms)
60 1 tkerber
        if self.magmoms is not None:
61 1 tkerber
            return self.magmoms
62 1 tkerber
        else:
63 1 tkerber
            return np.zeros(len(self.positions))