root / ase / gui / simulation.py @ 4
Historique | Voir | Annoter | Télécharger (4,77 ko)
| 1 | 1 | tkerber | "Base class for simulation windows"
|
|---|---|---|---|
| 2 | 1 | tkerber | |
| 3 | 1 | tkerber | import gtk |
| 4 | 1 | tkerber | from ase.gui.widgets import oops, pack |
| 5 | 1 | tkerber | from ase import Atoms |
| 6 | 1 | tkerber | |
| 7 | 1 | tkerber | class Simulation(gtk.Window): |
| 8 | 1 | tkerber | def __init__(self, gui): |
| 9 | 1 | tkerber | gtk.Window.__init__(self)
|
| 10 | 1 | tkerber | self.gui = gui
|
| 11 | 1 | tkerber | |
| 12 | 1 | tkerber | def packtext(self, vbox, text, label=None): |
| 13 | 1 | tkerber | "Pack an text frame into the window."
|
| 14 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 15 | 1 | tkerber | txtframe = gtk.Frame(label) |
| 16 | 1 | tkerber | txtlbl = gtk.Label(text) |
| 17 | 1 | tkerber | txtframe.add(txtlbl) |
| 18 | 1 | tkerber | txtlbl.show() |
| 19 | 1 | tkerber | pack(vbox, txtframe) |
| 20 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 21 | 1 | tkerber | |
| 22 | 1 | tkerber | def packimageselection(self, outerbox, txt1=" (rerun simulation)", |
| 23 | 1 | tkerber | txt2=" (continue simulation)"):
|
| 24 | 1 | tkerber | "Make the frame for selecting starting config if more than one."
|
| 25 | 1 | tkerber | self.startframe = gtk.Frame("Select starting configuration:") |
| 26 | 1 | tkerber | pack(outerbox, [self.startframe])
|
| 27 | 1 | tkerber | vbox = gtk.VBox() |
| 28 | 1 | tkerber | self.startframe.add(vbox)
|
| 29 | 1 | tkerber | vbox.show() |
| 30 | 1 | tkerber | self.numconfig_format = "There are currently %i configurations loaded." |
| 31 | 1 | tkerber | self.numconfig_label = gtk.Label("") |
| 32 | 1 | tkerber | pack(vbox, [self.numconfig_label])
|
| 33 | 1 | tkerber | lbl = gtk.Label("Choose which one to use as the initial configuration")
|
| 34 | 1 | tkerber | pack(vbox, [lbl]) |
| 35 | 1 | tkerber | self.start_radio_first = gtk.RadioButton(
|
| 36 | 1 | tkerber | None, "The first configuration"+txt1+".") |
| 37 | 1 | tkerber | pack(vbox, [self.start_radio_first])
|
| 38 | 1 | tkerber | self.start_radio_nth = gtk.RadioButton(self.start_radio_first, |
| 39 | 1 | tkerber | "Configuration number ")
|
| 40 | 1 | tkerber | self.start_nth_adj = gtk.Adjustment(0, 0, 1, 1) |
| 41 | 1 | tkerber | self.start_nth_spin = gtk.SpinButton(self.start_nth_adj, 0, 0) |
| 42 | 1 | tkerber | self.start_nth_spin.set_sensitive(False) |
| 43 | 1 | tkerber | pack(vbox, [self.start_radio_nth, self.start_nth_spin]) |
| 44 | 1 | tkerber | self.start_radio_last = gtk.RadioButton(self.start_radio_first, |
| 45 | 1 | tkerber | "The last configuration"+txt2+".") |
| 46 | 1 | tkerber | self.start_radio_last.set_active(True) |
| 47 | 1 | tkerber | pack(vbox, self.start_radio_last)
|
| 48 | 1 | tkerber | self.start_radio_nth.connect("toggled", self.start_radio_nth_toggled) |
| 49 | 1 | tkerber | self.setupimageselection()
|
| 50 | 1 | tkerber | |
| 51 | 1 | tkerber | def start_radio_nth_toggled(self, widget): |
| 52 | 1 | tkerber | self.start_nth_spin.set_sensitive(self.start_radio_nth.get_active()) |
| 53 | 1 | tkerber | |
| 54 | 1 | tkerber | def setupimageselection(self): |
| 55 | 1 | tkerber | "Decide if the start image selection frame should be shown."
|
| 56 | 1 | tkerber | n = self.gui.images.nimages
|
| 57 | 1 | tkerber | if n <= 1: |
| 58 | 1 | tkerber | self.startframe.hide()
|
| 59 | 1 | tkerber | else:
|
| 60 | 1 | tkerber | self.startframe.show()
|
| 61 | 1 | tkerber | if self.start_nth_adj.value >= n: |
| 62 | 1 | tkerber | self.start_nth_adj.value = n-1 |
| 63 | 1 | tkerber | self.start_nth_adj.upper = n-1 |
| 64 | 1 | tkerber | self.numconfig_label.set_text(self.numconfig_format % (n,)) |
| 65 | 1 | tkerber | |
| 66 | 1 | tkerber | def getimagenumber(self): |
| 67 | 1 | tkerber | "Get the image number selected in the start image frame."
|
| 68 | 1 | tkerber | nmax = self.gui.images.nimages
|
| 69 | 1 | tkerber | if nmax <= 1: |
| 70 | 1 | tkerber | return 0 |
| 71 | 1 | tkerber | elif self.start_radio_first.get_active(): |
| 72 | 1 | tkerber | return 0 |
| 73 | 1 | tkerber | elif self.start_radio_nth.get_active(): |
| 74 | 1 | tkerber | return self.start_nth_adj.value |
| 75 | 1 | tkerber | else:
|
| 76 | 1 | tkerber | assert self.start_radio_last.get_active() |
| 77 | 1 | tkerber | return nmax-1 |
| 78 | 1 | tkerber | |
| 79 | 1 | tkerber | def makebutbox(self, vbox): |
| 80 | 1 | tkerber | self.buttons = gtk.HButtonBox()
|
| 81 | 1 | tkerber | runbut = gtk.Button("Run")
|
| 82 | 1 | tkerber | runbut.connect('clicked', self.run) |
| 83 | 1 | tkerber | closebut = gtk.Button(stock=gtk.STOCK_CLOSE) |
| 84 | 1 | tkerber | closebut.connect('clicked', lambda x: self.destroy()) |
| 85 | 1 | tkerber | for w in (runbut, closebut): |
| 86 | 1 | tkerber | self.buttons.pack_start(w, 0, 0) |
| 87 | 1 | tkerber | w.show() |
| 88 | 1 | tkerber | pack(vbox, [self.buttons], end=True, bottom=True) |
| 89 | 1 | tkerber | |
| 90 | 1 | tkerber | def setup_atoms(self): |
| 91 | 1 | tkerber | self.atoms = self.get_atoms() |
| 92 | 1 | tkerber | if self.atoms is None: |
| 93 | 1 | tkerber | return False |
| 94 | 1 | tkerber | try:
|
| 95 | 1 | tkerber | self.calculator = self.gui.simulation['calc'] |
| 96 | 1 | tkerber | except KeyError: |
| 97 | 1 | tkerber | oops("No calculator: Use Calculate/Set Calculator on the menu.")
|
| 98 | 1 | tkerber | return False |
| 99 | 1 | tkerber | self.atoms.set_calculator(self.calculator()) |
| 100 | 1 | tkerber | return True |
| 101 | 1 | tkerber | |
| 102 | 1 | tkerber | def get_atoms(self): |
| 103 | 1 | tkerber | "Make an atoms object from the active image"
|
| 104 | 1 | tkerber | images = self.gui.images
|
| 105 | 1 | tkerber | if images.natoms < 1: |
| 106 | 1 | tkerber | oops("No atoms present")
|
| 107 | 1 | tkerber | return None |
| 108 | 1 | tkerber | n = self.getimagenumber()
|
| 109 | 1 | tkerber | return Atoms(positions=images.P[n], symbols=images.Z,
|
| 110 | 1 | tkerber | cell=images.A[n], pbc=images.pbc) |
| 111 | 1 | tkerber | |
| 112 | 1 | tkerber | def begin(self, **kwargs): |
| 113 | 1 | tkerber | if self.gui.simulation.has_key('progress'): |
| 114 | 1 | tkerber | self.gui.simulation['progress'].begin(**kwargs) |
| 115 | 1 | tkerber | |
| 116 | 1 | tkerber | def end(self): |
| 117 | 1 | tkerber | if self.gui.simulation.has_key('progress'): |
| 118 | 1 | tkerber | self.gui.simulation['progress'].end() |
| 119 | 1 | tkerber | |
| 120 | 1 | tkerber | def prepare_store_atoms(self): |
| 121 | 1 | tkerber | "Informs the gui that the next configuration should be the first."
|
| 122 | 1 | tkerber | self.gui.prepare_new_atoms()
|
| 123 | 1 | tkerber | self.count_steps = 0 |
| 124 | 1 | tkerber | |
| 125 | 1 | tkerber | def store_atoms(self): |
| 126 | 1 | tkerber | "Observes the minimization and stores the atoms in the gui."
|
| 127 | 1 | tkerber | self.gui.append_atoms(self.atoms) |
| 128 | 1 | tkerber | self.count_steps += 1 |