root / ase / optimize / mdmin.py @ 2
Historique | Voir | Annoter | Télécharger (986 octet)
1 | 1 | tkerber | import numpy as np |
---|---|---|---|
2 | 1 | tkerber | |
3 | 1 | tkerber | from ase.optimize.optimize import Optimizer |
4 | 1 | tkerber | |
5 | 1 | tkerber | |
6 | 1 | tkerber | class MDMin(Optimizer): |
7 | 1 | tkerber | def __init__(self, atoms, restart=None, logfile='-', trajectory=None, |
8 | 1 | tkerber | dt=None):
|
9 | 1 | tkerber | Optimizer.__init__(self, atoms, restart, logfile, trajectory)
|
10 | 1 | tkerber | |
11 | 1 | tkerber | if dt is not None: |
12 | 1 | tkerber | self.dt = dt
|
13 | 1 | tkerber | |
14 | 1 | tkerber | def initialize(self): |
15 | 1 | tkerber | self.v = None |
16 | 1 | tkerber | self.dt = 0.2 |
17 | 1 | tkerber | |
18 | 1 | tkerber | def read(self): |
19 | 1 | tkerber | self.v, self.dt = self.load() |
20 | 1 | tkerber | |
21 | 1 | tkerber | def step(self, f): |
22 | 1 | tkerber | atoms = self.atoms
|
23 | 1 | tkerber | |
24 | 1 | tkerber | if self.v is None: |
25 | 1 | tkerber | self.v = np.zeros((len(atoms), 3)) |
26 | 1 | tkerber | else:
|
27 | 1 | tkerber | self.v += 0.5 * self.dt * f |
28 | 1 | tkerber | # Correct velocities:
|
29 | 1 | tkerber | vf = np.vdot(self.v, f)
|
30 | 1 | tkerber | if vf < 0.0: |
31 | 1 | tkerber | self.v[:] = 0.0 |
32 | 1 | tkerber | else:
|
33 | 1 | tkerber | self.v[:] = f * vf / np.vdot(f, f)
|
34 | 1 | tkerber | |
35 | 1 | tkerber | self.v += 0.5 * self.dt * f |
36 | 1 | tkerber | r = atoms.get_positions() |
37 | 1 | tkerber | atoms.set_positions(r + self.dt * self.v) |
38 | 1 | tkerber | self.dump((self.v, self.dt)) |