Statistiques
| Révision :

root / ase / gui / energyforces.py @ 12

Historique | Voir | Annoter | Télécharger (3,06 ko)

1 1 tkerber
# encoding: utf-8
2 1 tkerber
3 1 tkerber
"Module for calculating energies and forces."
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
8 1 tkerber
9 1 tkerber
class OutputFieldMixin:
10 1 tkerber
    def makeoutputfield(self, box, label="Output:"):
11 1 tkerber
        frame = gtk.Frame(label)
12 1 tkerber
        if box is not None:
13 1 tkerber
            box.pack_start(frame, True, True, 0)
14 1 tkerber
        box2 = gtk.VBox()
15 1 tkerber
        frame.add(box2)
16 1 tkerber
        #pack(box, [gtk.Label("Output:")])
17 1 tkerber
        scrwin = gtk.ScrolledWindow()
18 1 tkerber
        scrwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
19 1 tkerber
        self.output = gtk.TextBuffer()
20 1 tkerber
        txtview = gtk.TextView(self.output)
21 1 tkerber
        txtview.set_editable(False)
22 1 tkerber
        scrwin.add(txtview)
23 1 tkerber
        scrwin.show_all()
24 1 tkerber
        box2.pack_start(scrwin, True, True, 0)
25 1 tkerber
        self.savebutton = gtk.Button(stock=gtk.STOCK_SAVE)
26 1 tkerber
        self.savebutton.connect('clicked', self.saveoutput)
27 1 tkerber
        self.savebutton.set_sensitive(False)
28 1 tkerber
        pack(box2, [self.savebutton])
29 1 tkerber
        box2.show()
30 1 tkerber
        frame.show()
31 1 tkerber
        return frame
32 1 tkerber
33 1 tkerber
    def activate_output(self):
34 1 tkerber
        self.savebutton.set_sensitive(True)
35 1 tkerber
36 1 tkerber
    def saveoutput(self, widget):
37 1 tkerber
        chooser = gtk.FileChooserDialog(
38 1 tkerber
            'Save output', None, gtk.FILE_CHOOSER_ACTION_SAVE,
39 1 tkerber
            (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
40 1 tkerber
             gtk.STOCK_SAVE, gtk.RESPONSE_OK))
41 1 tkerber
        ok = chooser.run()
42 1 tkerber
        if ok == gtk.RESPONSE_OK:
43 1 tkerber
            filename = chooser.get_filename()
44 1 tkerber
            txt = self.output.get_text(self.output.get_start_iter(),
45 1 tkerber
                                       self.output.get_end_iter())
46 1 tkerber
            f = open(filename, "w")
47 1 tkerber
            f.write(txt)
48 1 tkerber
            f.close()
49 1 tkerber
        chooser.destroy()
50 1 tkerber
51 1 tkerber
class EnergyForces(Simulation, OutputFieldMixin):
52 1 tkerber
    def __init__(self, gui):
53 1 tkerber
        Simulation.__init__(self, gui)
54 1 tkerber
55 1 tkerber
        self.set_default_size(-1, 300)
56 1 tkerber
        vbox = gtk.VBox()
57 1 tkerber
        self.packtext(vbox,
58 1 tkerber
                      "Calculate potential energy and the force on all atoms")
59 1 tkerber
        self.packimageselection(vbox)
60 1 tkerber
        pack(vbox, gtk.Label(""))
61 1 tkerber
        self.forces = gtk.CheckButton("Write forces on the atoms")
62 1 tkerber
        self.forces.set_active(True)
63 1 tkerber
        pack(vbox, [self.forces])
64 1 tkerber
        pack(vbox, [gtk.Label("")])
65 1 tkerber
        self.makeoutputfield(vbox)
66 1 tkerber
        pack(vbox, gtk.Label(""))
67 1 tkerber
        self.makebutbox(vbox)
68 1 tkerber
        vbox.show()
69 1 tkerber
        self.add(vbox)
70 1 tkerber
        self.show()
71 1 tkerber
        self.gui.register_vulnerable(self)
72 1 tkerber
73 1 tkerber
    def run(self, *args):
74 1 tkerber
        if not self.setup_atoms():
75 1 tkerber
            return
76 1 tkerber
        self.begin()
77 1 tkerber
        e = self.atoms.get_potential_energy()
78 1 tkerber
        txt = "Potential Energy:\n"
79 1 tkerber
        txt += "  %8.3f eV\n\n" % (e,)
80 1 tkerber
        if self.forces.get_active():
81 1 tkerber
            txt +="Forces:\n"
82 1 tkerber
            forces = self.atoms.get_forces()
83 1 tkerber
            for f in forces:
84 1 tkerber
                txt += "  %8.3f, %8.3f, %8.3f eV/Å\n" % tuple(f)
85 1 tkerber
        self.output.set_text(txt)
86 1 tkerber
        self.activate_output()
87 1 tkerber
        self.end()
88 1 tkerber
89 1 tkerber
    def notify_atoms_changed(self):
90 1 tkerber
        "When atoms have changed, check for the number of images."
91 1 tkerber
        self.setupimageselection()