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