Statistiques
| Révision :

root / ase / optimize / fire.py

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

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 FIRE(Optimizer):
7 1 tkerber
    def __init__(self, atoms, restart=None, logfile='-', trajectory=None,
8 1 tkerber
                 dt=0.1, maxmove=0.2, dtmax=1.0, Nmin=5, finc=1.1, fdec=0.5,
9 1 tkerber
                 astart=0.1, fa=0.99, a=0.1):
10 1 tkerber
        Optimizer.__init__(self, atoms, restart, logfile, trajectory)
11 1 tkerber
12 1 tkerber
        self.dt = dt
13 1 tkerber
        self.Nsteps = 0
14 1 tkerber
        self.maxmove = maxmove
15 1 tkerber
        self.dtmax = dtmax
16 1 tkerber
        self.Nmin = Nmin
17 1 tkerber
        self.finc = finc
18 1 tkerber
        self.fdec = fdec
19 1 tkerber
        self.astart = astart
20 1 tkerber
        self.fa = fa
21 1 tkerber
        self.a = a
22 1 tkerber
23 1 tkerber
    def initialize(self):
24 1 tkerber
        self.v = None
25 1 tkerber
26 1 tkerber
    def read(self):
27 1 tkerber
        self.v, self.dt = self.load()
28 1 tkerber
29 1 tkerber
    def step(self,f):
30 1 tkerber
        atoms = self.atoms
31 1 tkerber
        if self.v is None:
32 1 tkerber
            self.v = np.zeros((len(atoms), 3))
33 1 tkerber
        else:
34 1 tkerber
            vf = np.vdot(f, self.v)
35 1 tkerber
            if vf > 0.0:
36 1 tkerber
                self.v = (1.0 - self.a) * self.v + self.a * f / np.sqrt(
37 1 tkerber
                    np.vdot(f, f)) * np.sqrt(np.vdot(self.v, self.v))
38 1 tkerber
                if self.Nsteps > self.Nmin:
39 1 tkerber
                    self.dt = min(self.dt * self.finc, self.dtmax)
40 1 tkerber
                    self.a *= self.fa
41 1 tkerber
                self.Nsteps += 1
42 1 tkerber
            else:
43 1 tkerber
                self.v[:] *= 0.0
44 1 tkerber
                self.a = self.astart
45 1 tkerber
                self.dt *= self.fdec
46 1 tkerber
                self.Nsteps = 0
47 1 tkerber
#            if vf < 0.0:
48 1 tkerber
#                self.v[:] = 0.0
49 1 tkerber
#                self.a = self.astart
50 1 tkerber
#                self.dt *= self.fdec
51 1 tkerber
#                self.Nsteps = 0
52 1 tkerber
#            else:
53 1 tkerber
#                self.v = (1.0 - self.a) * self.v + self.a * f * np.sqrt(
54 1 tkerber
#                    np.vdot(f, f) / np.vdot(self.v, self.v))
55 1 tkerber
#                if self.Nsteps > self.Nmin:
56 1 tkerber
#                    dt = min(dt * self.finc, dtmax)
57 1 tkerber
#                    self.a *= self.fa
58 1 tkerber
#                    self.Nsteps += 1
59 1 tkerber
60 1 tkerber
            self.v += self.dt * f
61 1 tkerber
            dr = self.dt * self.v
62 1 tkerber
            normdr = np.sqrt(np.vdot(dr, dr))
63 1 tkerber
            if normdr > self.maxmove:
64 1 tkerber
                dr = self.maxmove * dr / normdr
65 1 tkerber
            r = atoms.get_positions()
66 1 tkerber
            atoms.set_positions(r + dr)
67 1 tkerber
            self.dump((self.v, self.dt))