Statistiques
| Révision :

root / ase / gui / minimize.py @ 3

Historique | Voir | Annoter | Télécharger (4,39 ko)

1 1 tkerber
# encoding: utf-8
2 1 tkerber
3 1 tkerber
"Module for performing energy minimization."
4 1 tkerber
5 1 tkerber
import gtk
6 1 tkerber
from ase.gui.simulation import Simulation
7 1 tkerber
from ase.gui.widgets import oops, pack, AseGuiCancelException
8 1 tkerber
import ase
9 1 tkerber
import numpy as np
10 1 tkerber
11 1 tkerber
class MinimizeMixin:
12 1 tkerber
    minimizers = ('BFGS', 'BFGSLineSearch', 'LBFGS', 'LBFGSLineSearch', 'MDMin', 'FIRE')
13 1 tkerber
    def make_minimize_gui(self, box):
14 1 tkerber
        self.algo = gtk.combo_box_new_text()
15 1 tkerber
        for m in self.minimizers:
16 1 tkerber
            self.algo.append_text(m)
17 1 tkerber
        self.algo.set_active(0)
18 1 tkerber
        pack(box, [gtk.Label("Algorithm: "), self.algo])
19 1 tkerber
20 1 tkerber
        self.fmax = gtk.Adjustment(0.05, 0.00, 10.0, 0.01)
21 1 tkerber
        self.fmax_spin = gtk.SpinButton(self.fmax, 0, 3)
22 1 tkerber
        lbl = gtk.Label()
23 1 tkerber
        lbl.set_markup("Convergence criterion: F<sub>max</sub> = ")
24 1 tkerber
        pack(box, [lbl, self.fmax_spin])
25 1 tkerber
26 1 tkerber
        self.steps = gtk.Adjustment(100, 1, 1000000, 1)
27 1 tkerber
        self.steps_spin = gtk.SpinButton(self.steps, 0, 0)
28 1 tkerber
        pack(box, [gtk.Label("Max. number of steps: "), self.steps_spin])
29 1 tkerber
30 1 tkerber
class Minimize(Simulation, MinimizeMixin):
31 1 tkerber
    "Window for performing energy minimization."
32 1 tkerber
33 1 tkerber
    def __init__(self, gui):
34 1 tkerber
        Simulation.__init__(self, gui)
35 1 tkerber
        self.set_title("Energy minimization")
36 1 tkerber
37 1 tkerber
        vbox = gtk.VBox()
38 1 tkerber
        self.packtext(vbox,
39 1 tkerber
                      "Minimize the energy with respect to the positions.")
40 1 tkerber
        self.packimageselection(vbox)
41 1 tkerber
        pack(vbox, gtk.Label(""))
42 1 tkerber
43 1 tkerber
        self.make_minimize_gui(vbox)
44 1 tkerber
45 1 tkerber
        pack(vbox, gtk.Label(""))
46 1 tkerber
        self.status_label = gtk.Label("")
47 1 tkerber
        pack(vbox, [self.status_label])
48 1 tkerber
        self.makebutbox(vbox)
49 1 tkerber
        vbox.show()
50 1 tkerber
        self.add(vbox)
51 1 tkerber
        self.show()
52 1 tkerber
        self.gui.register_vulnerable(self)
53 1 tkerber
54 1 tkerber
    def run(self, *args):
55 1 tkerber
        "User has pressed [Run]: run the minimization."
56 1 tkerber
        if not self.setup_atoms():
57 1 tkerber
            return
58 1 tkerber
        fmax = self.fmax.value
59 1 tkerber
        steps = self.steps.value
60 1 tkerber
        mininame = self.minimizers[self.algo.get_active()]
61 1 tkerber
        self.begin(mode="min", algo=mininame, fmax=fmax, steps=steps)
62 1 tkerber
        algo = getattr(ase.optimize, mininame)
63 1 tkerber
        try:
64 1 tkerber
            logger_func = self.gui.simulation['progress'].get_logger_stream
65 1 tkerber
        except (KeyError, AttributeError):
66 1 tkerber
            logger = None
67 1 tkerber
        else:
68 1 tkerber
            logger = logger_func()  # Don't catch errors in the function.
69 1 tkerber
70 1 tkerber
        # Display status message
71 1 tkerber
        self.status_label.set_text("Running ...")
72 1 tkerber
        self.status_label.modify_fg(gtk.STATE_NORMAL,
73 1 tkerber
                                    gtk.gdk.color_parse('#AA0000'))
74 1 tkerber
        while gtk.events_pending():
75 1 tkerber
            gtk.main_iteration()
76 1 tkerber
77 1 tkerber
        self.prepare_store_atoms()
78 1 tkerber
        minimizer = algo(self.atoms, logfile=logger)
79 1 tkerber
        minimizer.attach(self.store_atoms)
80 1 tkerber
        try:
81 1 tkerber
            minimizer.run(fmax=fmax, steps=steps)
82 1 tkerber
        except AseGuiCancelException:
83 1 tkerber
            # Update display to reflect cancellation of simulation.
84 1 tkerber
            self.status_label.set_text("Minimization CANCELLED after %i steps."
85 1 tkerber
                                       % (self.count_steps,))
86 1 tkerber
            self.status_label.modify_fg(gtk.STATE_NORMAL,
87 1 tkerber
                                        gtk.gdk.color_parse('#AA4000'))
88 1 tkerber
        except MemoryError:
89 1 tkerber
            self.status_label.set_text("Out of memory, consider using LBFGS instead")
90 1 tkerber
            self.status_label.modify_fg(gtk.STATE_NORMAL,
91 1 tkerber
                                        gtk.gdk.color_parse('#AA4000'))
92 1 tkerber
93 1 tkerber
        else:
94 1 tkerber
            # Update display to reflect succesful end of simulation.
95 1 tkerber
            self.status_label.set_text("Minimization completed in %i steps."
96 1 tkerber
                                       % (self.count_steps,))
97 1 tkerber
            self.status_label.modify_fg(gtk.STATE_NORMAL,
98 1 tkerber
                                        gtk.gdk.color_parse('#007700'))
99 1 tkerber
100 1 tkerber
        self.end()
101 1 tkerber
        if self.count_steps:
102 1 tkerber
            # Notify other windows that atoms have changed.
103 1 tkerber
            # This also notifies this window!
104 1 tkerber
            self.gui.notify_vulnerable()
105 1 tkerber
106 1 tkerber
        # Open movie window and energy graph
107 1 tkerber
        if self.gui.images.nimages > 1:
108 1 tkerber
            self.gui.movie()
109 1 tkerber
            assert not np.isnan(self.gui.images.E[0])
110 1 tkerber
            if not self.gui.plot_graphs_newatoms():
111 1 tkerber
                expr = 'i, e - E[-1]'
112 1 tkerber
                self.gui.plot_graphs(expr=expr)
113 1 tkerber
114 1 tkerber
    def notify_atoms_changed(self):
115 1 tkerber
        "When atoms have changed, check for the number of images."
116 1 tkerber
        self.setupimageselection()