root / ase / calculators / singlepoint.py @ 2
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)) |