Statistiques
| Révision :

root / ase / optimize / fire.py @ 1

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

1
import numpy as np
2

    
3
from ase.optimize.optimize import Optimizer
4

    
5

    
6
class FIRE(Optimizer):
7
    def __init__(self, atoms, restart=None, logfile='-', trajectory=None,
8
                 dt=0.1, maxmove=0.2, dtmax=1.0, Nmin=5, finc=1.1, fdec=0.5,
9
                 astart=0.1, fa=0.99, a=0.1):
10
        Optimizer.__init__(self, atoms, restart, logfile, trajectory)
11

    
12
        self.dt = dt
13
        self.Nsteps = 0
14
        self.maxmove = maxmove
15
        self.dtmax = dtmax
16
        self.Nmin = Nmin
17
        self.finc = finc
18
        self.fdec = fdec
19
        self.astart = astart
20
        self.fa = fa
21
        self.a = a
22

    
23
    def initialize(self):
24
        self.v = None
25

    
26
    def read(self):
27
        self.v, self.dt = self.load()
28
       
29
    def step(self,f):
30
        atoms = self.atoms
31
        if self.v is None:
32
            self.v = np.zeros((len(atoms), 3))
33
        else:
34
            vf = np.vdot(f, self.v)
35
            if vf > 0.0:
36
                self.v = (1.0 - self.a) * self.v + self.a * f / np.sqrt(
37
                    np.vdot(f, f)) * np.sqrt(np.vdot(self.v, self.v))
38
                if self.Nsteps > self.Nmin:
39
                    self.dt = min(self.dt * self.finc, self.dtmax)
40
                    self.a *= self.fa
41
                self.Nsteps += 1
42
            else:
43
                self.v[:] *= 0.0
44
                self.a = self.astart
45
                self.dt *= self.fdec
46
                self.Nsteps = 0
47
#            if vf < 0.0:
48
#                self.v[:] = 0.0
49
#                self.a = self.astart
50
#                self.dt *= self.fdec
51
#                self.Nsteps = 0
52
#            else:
53
#                self.v = (1.0 - self.a) * self.v + self.a * f * np.sqrt(
54
#                    np.vdot(f, f) / np.vdot(self.v, self.v))
55
#                if self.Nsteps > self.Nmin:
56
#                    dt = min(dt * self.finc, dtmax)
57
#                    self.a *= self.fa
58
#                    self.Nsteps += 1
59

    
60
            self.v += self.dt * f
61
            dr = self.dt * self.v
62
            normdr = np.sqrt(np.vdot(dr, dr))
63
            if normdr > self.maxmove:
64
                dr = self.maxmove * dr / normdr
65
            r = atoms.get_positions()
66
            atoms.set_positions(r + dr)
67
            self.dump((self.v, self.dt))