root / ase / gui / calculator.py @ 4
Historique | Voir | Annoter | Télécharger (67,5 ko)
| 1 | 1 | tkerber | # encoding: utf-8
|
|---|---|---|---|
| 2 | 1 | tkerber | "calculator.py - module for choosing a calculator."
|
| 3 | 1 | tkerber | |
| 4 | 1 | tkerber | import gtk |
| 5 | 1 | tkerber | import os |
| 6 | 1 | tkerber | import numpy as np |
| 7 | 1 | tkerber | from copy import copy |
| 8 | 1 | tkerber | from ase.gui.setupwindow import SetupWindow |
| 9 | 1 | tkerber | from ase.gui.progress import DefaultProgressIndicator, GpawProgressIndicator |
| 10 | 1 | tkerber | from ase.gui.widgets import pack, oops, cancel_apply_ok |
| 11 | 1 | tkerber | from ase import Atoms |
| 12 | 1 | tkerber | from ase.data import chemical_symbols |
| 13 | 1 | tkerber | import ase |
| 14 | 1 | tkerber | |
| 15 | 1 | tkerber | # Asap and GPAW may be imported if selected.
|
| 16 | 1 | tkerber | |
| 17 | 1 | tkerber | introtext = """\
|
| 18 | 1 | tkerber | To make most calculations on the atoms, a Calculator object must first
|
| 19 | 1 | tkerber | be associated with it. ASE supports a number of calculators, supporting
|
| 20 | 1 | tkerber | different elements, and implementing different physical models for the
|
| 21 | 1 | tkerber | interatomic interactions.\
|
| 22 | 1 | tkerber | """
|
| 23 | 1 | tkerber | |
| 24 | 1 | tkerber | # Informational text about the calculators
|
| 25 | 1 | tkerber | lj_info_txt = """\
|
| 26 | 1 | tkerber | The Lennard-Jones pair potential is one of the simplest
|
| 27 | 1 | tkerber | possible models for interatomic interactions, mostly
|
| 28 | 1 | tkerber | suitable for noble gasses and model systems.
|
| 29 | 1 | tkerber |
|
| 30 | 1 | tkerber | Interactions are described by an interaction length and an
|
| 31 | 1 | tkerber | interaction strength.\
|
| 32 | 1 | tkerber | """
|
| 33 | 1 | tkerber | |
| 34 | 1 | tkerber | emt_info_txt = """\
|
| 35 | 1 | tkerber | The EMT potential is a many-body potential, giving a
|
| 36 | 1 | tkerber | good description of the late transition metals crystalling
|
| 37 | 1 | tkerber | in the FCC crystal structure. The elements described by the
|
| 38 | 1 | tkerber | main set of EMT parameters are Al, Ni, Cu, Pd, Ag, Pt, and
|
| 39 | 1 | tkerber | Au, the Al potential is however not suitable for materials
|
| 40 | 1 | tkerber | science application, as the stacking fault energy is wrong.
|
| 41 | 1 | tkerber |
|
| 42 | 1 | tkerber | A number of parameter sets are provided.
|
| 43 | 1 | tkerber |
|
| 44 | 1 | tkerber | <b>Default parameters:</b>
|
| 45 | 1 | tkerber |
|
| 46 | 1 | tkerber | The default EMT parameters, as published in K. W. Jacobsen,
|
| 47 | 1 | tkerber | P. Stoltze and J. K. Nørskov, <i>Surf. Sci.</i> <b>366</b>, 394 (1996).
|
| 48 | 1 | tkerber |
|
| 49 | 1 | tkerber | <b>Alternative Cu, Ag and Au:</b>
|
| 50 | 1 | tkerber |
|
| 51 | 1 | tkerber | An alternative set of parameters for Cu, Ag and Au,
|
| 52 | 1 | tkerber | reoptimized to experimental data including the stacking
|
| 53 | 1 | tkerber | fault energies by Torben Rasmussen (partly unpublished).
|
| 54 | 1 | tkerber |
|
| 55 | 1 | tkerber | <b>Ruthenium:</b>
|
| 56 | 1 | tkerber |
|
| 57 | 1 | tkerber | Parameters for Ruthenium, as published in J. Gavnholt and
|
| 58 | 1 | tkerber | J. Schiøtz, <i>Phys. Rev. B</i> <b>77</b>, 035404 (2008).
|
| 59 | 1 | tkerber |
|
| 60 | 1 | tkerber | <b>Metallic glasses:</b>
|
| 61 | 1 | tkerber |
|
| 62 | 1 | tkerber | Parameters for MgCu and CuZr metallic glasses. MgCu
|
| 63 | 1 | tkerber | parameters are in N. P. Bailey, J. Schiøtz and
|
| 64 | 1 | tkerber | K. W. Jacobsen, <i>Phys. Rev. B</i> <b>69</b>, 144205 (2004).
|
| 65 | 1 | tkerber | CuZr in A. Paduraru, A. Kenoufi, N. P. Bailey and
|
| 66 | 1 | tkerber | J. Schiøtz, <i>Adv. Eng. Mater.</i> <b>9</b>, 505 (2007).
|
| 67 | 1 | tkerber | """
|
| 68 | 1 | tkerber | |
| 69 | 1 | tkerber | aseemt_info_txt = """\
|
| 70 | 1 | tkerber | The EMT potential is a many-body potential, giving a
|
| 71 | 1 | tkerber | good description of the late transition metals crystalling
|
| 72 | 1 | tkerber | in the FCC crystal structure. The elements described by the
|
| 73 | 1 | tkerber | main set of EMT parameters are Al, Ni, Cu, Pd, Ag, Pt, and
|
| 74 | 1 | tkerber | Au. In addition, this implementation allows for the use of
|
| 75 | 1 | tkerber | H, N, O and C adatoms, although the description of these is
|
| 76 | 1 | tkerber | most likely not very good.
|
| 77 | 1 | tkerber |
|
| 78 | 1 | tkerber | <b>This is the ASE implementation of EMT.</b> For large
|
| 79 | 1 | tkerber | simulations the ASAP implementation is more suitable; this
|
| 80 | 1 | tkerber | implementation is mainly to make EMT available when ASAP is
|
| 81 | 1 | tkerber | not installed.
|
| 82 | 1 | tkerber | """
|
| 83 | 1 | tkerber | |
| 84 | 1 | tkerber | brenner_info_txt = """\
|
| 85 | 1 | tkerber | The Brenner potential is a reactive bond-order potential for
|
| 86 | 1 | tkerber | carbon and hydrocarbons. As a bond-order potential, it takes
|
| 87 | 1 | tkerber | into account that carbon orbitals can hybridize in different
|
| 88 | 1 | tkerber | ways, and that carbon can form single, double and triple
|
| 89 | 1 | tkerber | bonds. That the potential is reactive means that it can
|
| 90 | 1 | tkerber | handle gradual changes in the bond order as chemical bonds
|
| 91 | 1 | tkerber | are formed or broken.
|
| 92 | 1 | tkerber |
|
| 93 | 1 | tkerber | The Brenner potential is implemented in Asap, based on a
|
| 94 | 1 | tkerber | C implentation published at http://www.rahul.net/pcm/brenner/ .
|
| 95 | 1 | tkerber |
|
| 96 | 1 | tkerber | The potential is documented here:
|
| 97 | 1 | tkerber | Donald W Brenner, Olga A Shenderova, Judith A Harrison,
|
| 98 | 1 | tkerber | Steven J Stuart, Boris Ni and Susan B Sinnott:
|
| 99 | 1 | tkerber | "A second-generation reactive empirical bond order (REBO)
|
| 100 | 1 | tkerber | potential energy expression for hydrocarbons",
|
| 101 | 1 | tkerber | J. Phys.: Condens. Matter 14 (2002) 783-802.
|
| 102 | 1 | tkerber | doi: 10.1088/0953-8984/14/4/312
|
| 103 | 1 | tkerber | """
|
| 104 | 1 | tkerber | |
| 105 | 1 | tkerber | |
| 106 | 1 | tkerber | gpaw_info_txt = """\
|
| 107 | 1 | tkerber | GPAW implements Density Functional Theory using a
|
| 108 | 1 | tkerber | <b>G</b>rid-based real-space representation of the wave
|
| 109 | 1 | tkerber | functions, and the <b>P</b>rojector <b>A</b>ugmented <b>W</b>ave
|
| 110 | 1 | tkerber | method for handling the core regions.
|
| 111 | 1 | tkerber | """
|
| 112 | 1 | tkerber | |
| 113 | 1 | tkerber | aims_info_txt = """\
|
| 114 | 1 | tkerber | FHI-aims is an external package implementing density
|
| 115 | 1 | tkerber | functional theory and quantum chemical methods using
|
| 116 | 1 | tkerber | all-electron methods and a numeric local orbital basis set.
|
| 117 | 1 | tkerber | For full details, see http://www.fhi-berlin.mpg.de/aims/
|
| 118 | 1 | tkerber | or Comp. Phys. Comm. v180 2175 (2009). The ASE
|
| 119 | 1 | tkerber | documentation contains information on the keywords and
|
| 120 | 1 | tkerber | functionalities available within this interface.
|
| 121 | 1 | tkerber | """
|
| 122 | 1 | tkerber | |
| 123 | 1 | tkerber | aims_pbc_warning_text = """\
|
| 124 | 1 | tkerber | WARNING:
|
| 125 | 1 | tkerber | Your system seems to have more than zero but less than
|
| 126 | 1 | tkerber | three periodic dimensions. Please check that this is
|
| 127 | 1 | tkerber | really what you want to compute. Assuming full
|
| 128 | 1 | tkerber | 3D periodicity for this calculator."""
|
| 129 | 1 | tkerber | |
| 130 | 1 | tkerber | vasp_info_txt = """\
|
| 131 | 1 | tkerber | VASP is an external package implementing density
|
| 132 | 1 | tkerber | functional functional theory using pseudopotentials
|
| 133 | 1 | tkerber | or the projector-augmented wave method together
|
| 134 | 1 | tkerber | with a plane wave basis set. For full details, see
|
| 135 | 1 | tkerber | http://cms.mpi.univie.ac.at/vasp/vasp/
|
| 136 | 1 | tkerber | """
|
| 137 | 1 | tkerber | |
| 138 | 1 | tkerber | emt_parameters = ( |
| 139 | 1 | tkerber | ("Default (Al, Ni, Cu, Pd, Ag, Pt, Au)", None), |
| 140 | 1 | tkerber | ("Alternative Cu, Ag and Au", "EMTRasmussenParameters"), |
| 141 | 1 | tkerber | ("Ruthenium", "EMThcpParameters"), |
| 142 | 1 | tkerber | ("CuMg and CuZr metallic glass", "EMTMetalGlassParameters") |
| 143 | 1 | tkerber | ) |
| 144 | 1 | tkerber | |
| 145 | 1 | tkerber | class SetCalculator(SetupWindow): |
| 146 | 1 | tkerber | "Window for selecting a calculator."
|
| 147 | 1 | tkerber | |
| 148 | 1 | tkerber | # List the names of the radio button attributes
|
| 149 | 1 | tkerber | radios = ("none", "lj", "emt", "aseemt", "brenner", "gpaw", "aims", "vasp") |
| 150 | 1 | tkerber | # List the names of the parameter dictionaries
|
| 151 | 1 | tkerber | paramdicts = ("lj_parameters",)
|
| 152 | 1 | tkerber | # The name used to store parameters on the gui object
|
| 153 | 1 | tkerber | classname = "SetCalculator"
|
| 154 | 1 | tkerber | |
| 155 | 1 | tkerber | def __init__(self, gui): |
| 156 | 1 | tkerber | SetupWindow.__init__(self)
|
| 157 | 1 | tkerber | self.set_title("Select calculator") |
| 158 | 1 | tkerber | vbox = gtk.VBox() |
| 159 | 1 | tkerber | |
| 160 | 1 | tkerber | # Intoductory text
|
| 161 | 1 | tkerber | self.packtext(vbox, introtext)
|
| 162 | 1 | tkerber | |
| 163 | 1 | tkerber | pack(vbox, [gtk.Label("Calculator:")])
|
| 164 | 1 | tkerber | |
| 165 | 1 | tkerber | # No calculator (the default)
|
| 166 | 1 | tkerber | self.none_radio = gtk.RadioButton(None, "None") |
| 167 | 1 | tkerber | pack(vbox, [self.none_radio])
|
| 168 | 1 | tkerber | |
| 169 | 1 | tkerber | # Lennard-Jones
|
| 170 | 1 | tkerber | self.lj_radio = gtk.RadioButton(self.none_radio, "Lennard-Jones (ASAP)") |
| 171 | 1 | tkerber | self.lj_setup = gtk.Button("Setup") |
| 172 | 1 | tkerber | self.lj_info = InfoButton(lj_info_txt)
|
| 173 | 1 | tkerber | self.lj_setup.connect("clicked", self.lj_setup_window) |
| 174 | 1 | tkerber | self.pack_line(vbox, self.lj_radio, self.lj_setup, self.lj_info) |
| 175 | 1 | tkerber | |
| 176 | 1 | tkerber | # EMT
|
| 177 | 1 | tkerber | self.emt_radio = gtk.RadioButton(
|
| 178 | 1 | tkerber | self.none_radio, "EMT - Effective Medium Theory (ASAP)") |
| 179 | 1 | tkerber | self.emt_setup = gtk.combo_box_new_text()
|
| 180 | 1 | tkerber | self.emt_param_info = {}
|
| 181 | 1 | tkerber | for p in emt_parameters: |
| 182 | 1 | tkerber | self.emt_setup.append_text(p[0]) |
| 183 | 1 | tkerber | self.emt_param_info[p[0]] = p[1] |
| 184 | 1 | tkerber | self.emt_setup.set_active(0) |
| 185 | 1 | tkerber | self.emt_info = InfoButton(emt_info_txt)
|
| 186 | 1 | tkerber | self.pack_line(vbox, self.emt_radio, self.emt_setup, self.emt_info) |
| 187 | 1 | tkerber | |
| 188 | 1 | tkerber | # EMT (ASE implementation)
|
| 189 | 1 | tkerber | self.aseemt_radio = gtk.RadioButton(
|
| 190 | 1 | tkerber | self.none_radio, "EMT - Effective Medium Theory (ASE)") |
| 191 | 1 | tkerber | self.aseemt_info = InfoButton(aseemt_info_txt)
|
| 192 | 1 | tkerber | self.pack_line(vbox, self.aseemt_radio, None, self.aseemt_info) |
| 193 | 1 | tkerber | |
| 194 | 1 | tkerber | # Brenner potential
|
| 195 | 1 | tkerber | self.brenner_radio = gtk.RadioButton(
|
| 196 | 1 | tkerber | self.none_radio, "Brenner Potential (ASAP)") |
| 197 | 1 | tkerber | self.brenner_info = InfoButton(brenner_info_txt)
|
| 198 | 1 | tkerber | self.pack_line(vbox, self.brenner_radio, None, self.brenner_info) |
| 199 | 1 | tkerber | |
| 200 | 1 | tkerber | # GPAW
|
| 201 | 1 | tkerber | self.gpaw_radio = gtk.RadioButton(self.none_radio, |
| 202 | 1 | tkerber | "Density Functional Theory (GPAW)")
|
| 203 | 1 | tkerber | self.gpaw_setup = gtk.Button("Setup") |
| 204 | 1 | tkerber | self.gpaw_info = InfoButton(gpaw_info_txt)
|
| 205 | 1 | tkerber | self.gpaw_setup.connect("clicked", self.gpaw_setup_window) |
| 206 | 1 | tkerber | self.pack_line(vbox, self.gpaw_radio, self.gpaw_setup, self.gpaw_info) |
| 207 | 1 | tkerber | |
| 208 | 1 | tkerber | # FHI-aims
|
| 209 | 1 | tkerber | self.aims_radio = gtk.RadioButton(self.none_radio, |
| 210 | 1 | tkerber | "Density Functional Theory (FHI-aims)")
|
| 211 | 1 | tkerber | self.aims_setup = gtk.Button("Setup") |
| 212 | 1 | tkerber | self.aims_info = InfoButton(aims_info_txt)
|
| 213 | 1 | tkerber | self.aims_setup.connect("clicked", self.aims_setup_window) |
| 214 | 1 | tkerber | self.pack_line(vbox, self.aims_radio, self.aims_setup, self.aims_info) |
| 215 | 1 | tkerber | |
| 216 | 1 | tkerber | # VASP
|
| 217 | 1 | tkerber | self.vasp_radio = gtk.RadioButton(self.none_radio, |
| 218 | 1 | tkerber | "Density Functional Theory (VASP)")
|
| 219 | 1 | tkerber | self.vasp_setup = gtk.Button("Setup") |
| 220 | 1 | tkerber | self.vasp_info = InfoButton(vasp_info_txt)
|
| 221 | 1 | tkerber | self.vasp_setup.connect("clicked", self.vasp_setup_window) |
| 222 | 1 | tkerber | self.pack_line(vbox, self.vasp_radio, self.vasp_setup, self.vasp_info) |
| 223 | 1 | tkerber | |
| 224 | 1 | tkerber | # Buttons etc.
|
| 225 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 226 | 1 | tkerber | buts = cancel_apply_ok(cancel=lambda widget: self.destroy(), |
| 227 | 1 | tkerber | apply=self.apply,
|
| 228 | 1 | tkerber | ok=self.ok)
|
| 229 | 1 | tkerber | pack(vbox, [buts], end=True, bottom=True) |
| 230 | 1 | tkerber | self.check = gtk.CheckButton("Check that the calculator is reasonable.") |
| 231 | 1 | tkerber | self.check.set_active(True) |
| 232 | 1 | tkerber | fr = gtk.Frame() |
| 233 | 1 | tkerber | fr.add(self.check)
|
| 234 | 1 | tkerber | fr.show_all() |
| 235 | 1 | tkerber | pack(vbox, [fr], end=True, bottom=True) |
| 236 | 1 | tkerber | |
| 237 | 1 | tkerber | # Finalize setup
|
| 238 | 1 | tkerber | self.add(vbox)
|
| 239 | 1 | tkerber | vbox.show() |
| 240 | 1 | tkerber | self.show()
|
| 241 | 1 | tkerber | self.gui = gui
|
| 242 | 1 | tkerber | self.load_state()
|
| 243 | 1 | tkerber | |
| 244 | 1 | tkerber | def pack_line(self, box, radio, setup, info): |
| 245 | 1 | tkerber | hbox = gtk.HBox() |
| 246 | 1 | tkerber | hbox.pack_start(radio, 0, 0) |
| 247 | 1 | tkerber | hbox.pack_start(gtk.Label(" "), 0, 0) |
| 248 | 1 | tkerber | hbox.pack_end(info, 0, 0) |
| 249 | 1 | tkerber | if setup is not None: |
| 250 | 1 | tkerber | radio.connect("toggled", self.radio_toggled, setup) |
| 251 | 1 | tkerber | setup.set_sensitive(False)
|
| 252 | 1 | tkerber | hbox.pack_end(setup, 0, 0) |
| 253 | 1 | tkerber | hbox.show_all() |
| 254 | 1 | tkerber | box.pack_start(hbox, 0, 0) |
| 255 | 1 | tkerber | |
| 256 | 1 | tkerber | def radio_toggled(self, radio, button): |
| 257 | 1 | tkerber | button.set_sensitive(radio.get_active()) |
| 258 | 1 | tkerber | |
| 259 | 1 | tkerber | def lj_setup_window(self, widget): |
| 260 | 1 | tkerber | if not self.get_atoms(): |
| 261 | 1 | tkerber | return
|
| 262 | 1 | tkerber | lj_param = getattr(self, "lj_parameters", None) |
| 263 | 1 | tkerber | LJ_Window(self, lj_param, "lj_parameters") |
| 264 | 1 | tkerber | # When control is retuned, self.lj_parameters has been set.
|
| 265 | 1 | tkerber | |
| 266 | 1 | tkerber | def gpaw_setup_window(self, widget): |
| 267 | 1 | tkerber | if not self.get_atoms(): |
| 268 | 1 | tkerber | return
|
| 269 | 1 | tkerber | gpaw_param = getattr(self, "gpaw_parameters", None) |
| 270 | 1 | tkerber | GPAW_Window(self, gpaw_param, "gpaw_parameters") |
| 271 | 1 | tkerber | # When control is retuned, self.gpaw_parameters has been set.
|
| 272 | 1 | tkerber | |
| 273 | 1 | tkerber | def aims_setup_window(self, widget): |
| 274 | 1 | tkerber | if not self.get_atoms(): |
| 275 | 1 | tkerber | return
|
| 276 | 1 | tkerber | aims_param = getattr(self, "aims_parameters", None) |
| 277 | 1 | tkerber | AIMS_Window(self, aims_param, "aims_parameters") |
| 278 | 1 | tkerber | # When control is retuned, self.aims_parameters has been set.
|
| 279 | 1 | tkerber | |
| 280 | 1 | tkerber | def vasp_setup_window(self, widget): |
| 281 | 1 | tkerber | if not self.get_atoms(): |
| 282 | 1 | tkerber | return
|
| 283 | 1 | tkerber | vasp_param = getattr(self, "vasp_parameters", None) |
| 284 | 1 | tkerber | VASP_Window(self, vasp_param, "vasp_parameters") |
| 285 | 1 | tkerber | # When control is retuned, self.vasp_parameters has been set.
|
| 286 | 1 | tkerber | |
| 287 | 1 | tkerber | def get_atoms(self): |
| 288 | 1 | tkerber | "Make an atoms object from the active image"
|
| 289 | 1 | tkerber | images = self.gui.images
|
| 290 | 1 | tkerber | if images.natoms < 1: |
| 291 | 1 | tkerber | oops("No atoms present")
|
| 292 | 1 | tkerber | return False |
| 293 | 1 | tkerber | self.atoms = Atoms(positions=images.P[0], symbols=images.Z, |
| 294 | 1 | tkerber | cell=images.A[0], pbc=images.pbc)
|
| 295 | 1 | tkerber | if not images.dynamic.all(): |
| 296 | 1 | tkerber | from ase.constraints import FixAtoms |
| 297 | 1 | tkerber | self.atoms.set_constraint(FixAtoms(mask=1-images.dynamic)) |
| 298 | 1 | tkerber | return True |
| 299 | 1 | tkerber | |
| 300 | 1 | tkerber | def apply(self, *widget): |
| 301 | 1 | tkerber | if self.do_apply(): |
| 302 | 1 | tkerber | self.save_state()
|
| 303 | 1 | tkerber | return True |
| 304 | 1 | tkerber | else:
|
| 305 | 1 | tkerber | return False |
| 306 | 1 | tkerber | |
| 307 | 1 | tkerber | def do_apply(self): |
| 308 | 1 | tkerber | nochk = not self.check.get_active() |
| 309 | 1 | tkerber | self.gui.simulation["progress"] = DefaultProgressIndicator() |
| 310 | 1 | tkerber | if self.none_radio.get_active(): |
| 311 | 1 | tkerber | self.gui.simulation['calc'] = None |
| 312 | 1 | tkerber | return True |
| 313 | 1 | tkerber | elif self.lj_radio.get_active(): |
| 314 | 1 | tkerber | if nochk or self.lj_check(): |
| 315 | 1 | tkerber | self.choose_lj()
|
| 316 | 1 | tkerber | return True |
| 317 | 1 | tkerber | elif self.emt_radio.get_active(): |
| 318 | 1 | tkerber | if nochk or self.emt_check(): |
| 319 | 1 | tkerber | self.choose_emt()
|
| 320 | 1 | tkerber | return True |
| 321 | 1 | tkerber | elif self.aseemt_radio.get_active(): |
| 322 | 1 | tkerber | if nochk or self.aseemt_check(): |
| 323 | 1 | tkerber | self.choose_aseemt()
|
| 324 | 1 | tkerber | return True |
| 325 | 1 | tkerber | elif self.brenner_radio.get_active(): |
| 326 | 1 | tkerber | if nochk or self.brenner_check(): |
| 327 | 1 | tkerber | self.choose_brenner()
|
| 328 | 1 | tkerber | return True |
| 329 | 1 | tkerber | elif self.gpaw_radio.get_active(): |
| 330 | 1 | tkerber | if nochk or self.gpaw_check(): |
| 331 | 1 | tkerber | self.choose_gpaw()
|
| 332 | 1 | tkerber | return True |
| 333 | 1 | tkerber | elif self.aims_radio.get_active(): |
| 334 | 1 | tkerber | if nochk or self.aims_check(): |
| 335 | 1 | tkerber | self.choose_aims()
|
| 336 | 1 | tkerber | return True |
| 337 | 1 | tkerber | elif self.vasp_radio.get_active(): |
| 338 | 1 | tkerber | if nochk or self.vasp_check(): |
| 339 | 1 | tkerber | self.choose_vasp()
|
| 340 | 1 | tkerber | return True |
| 341 | 1 | tkerber | return False |
| 342 | 1 | tkerber | |
| 343 | 1 | tkerber | def ok(self, *widget): |
| 344 | 1 | tkerber | if self.apply(): |
| 345 | 1 | tkerber | self.destroy()
|
| 346 | 1 | tkerber | |
| 347 | 1 | tkerber | def save_state(self): |
| 348 | 1 | tkerber | state = {}
|
| 349 | 1 | tkerber | for r in self.radios: |
| 350 | 1 | tkerber | radiobutton = getattr(self, r+"_radio") |
| 351 | 1 | tkerber | if radiobutton.get_active():
|
| 352 | 1 | tkerber | state["radio"] = r
|
| 353 | 1 | tkerber | state["emtsetup"] = self.emt_setup.get_active() |
| 354 | 1 | tkerber | state["check"] = self.check.get_active() |
| 355 | 1 | tkerber | for p in self.paramdicts: |
| 356 | 1 | tkerber | if hasattr(self, p): |
| 357 | 1 | tkerber | state[p] = getattr(self, p) |
| 358 | 1 | tkerber | self.gui.module_state[self.classname] = state |
| 359 | 1 | tkerber | |
| 360 | 1 | tkerber | def load_state(self): |
| 361 | 1 | tkerber | try:
|
| 362 | 1 | tkerber | state = self.gui.module_state[self.classname] |
| 363 | 1 | tkerber | except KeyError: |
| 364 | 1 | tkerber | return
|
| 365 | 1 | tkerber | r = state["radio"]
|
| 366 | 1 | tkerber | radiobutton = getattr(self, r+"_radio") |
| 367 | 1 | tkerber | radiobutton.set_active(True)
|
| 368 | 1 | tkerber | self.emt_setup.set_active(state["emtsetup"]) |
| 369 | 1 | tkerber | self.check.set_active(state["check"]) |
| 370 | 1 | tkerber | for p in self.paramdicts: |
| 371 | 1 | tkerber | if state.has_key(p):
|
| 372 | 1 | tkerber | setattr(self, p, state[p]) |
| 373 | 1 | tkerber | |
| 374 | 1 | tkerber | def lj_check(self): |
| 375 | 1 | tkerber | try:
|
| 376 | 1 | tkerber | import asap3 |
| 377 | 1 | tkerber | except ImportError: |
| 378 | 1 | tkerber | oops("ASAP is not installed. (Failed to import asap3)")
|
| 379 | 1 | tkerber | return False |
| 380 | 1 | tkerber | if not hasattr(self, "lj_parameters"): |
| 381 | 1 | tkerber | oops("You must set up the Lennard-Jones parameters")
|
| 382 | 1 | tkerber | return False |
| 383 | 1 | tkerber | try:
|
| 384 | 1 | tkerber | self.atoms.set_calculator(asap3.LennardJones(**self.lj_parameters)) |
| 385 | 1 | tkerber | except (asap3.AsapError, TypeError, ValueError), e: |
| 386 | 1 | tkerber | oops("Could not create useful Lennard-Jones calculator.",
|
| 387 | 1 | tkerber | str(e))
|
| 388 | 1 | tkerber | return False |
| 389 | 1 | tkerber | return True |
| 390 | 1 | tkerber | |
| 391 | 1 | tkerber | def choose_lj(self): |
| 392 | 1 | tkerber | # Define a function on the fly!
|
| 393 | 1 | tkerber | import asap3 |
| 394 | 1 | tkerber | def lj_factory(p=self.lj_parameters, lj=asap3.LennardJones): |
| 395 | 1 | tkerber | return lj(**p)
|
| 396 | 1 | tkerber | self.gui.simulation["calc"] = lj_factory |
| 397 | 1 | tkerber | |
| 398 | 1 | tkerber | def emt_get(self): |
| 399 | 1 | tkerber | import asap3 |
| 400 | 1 | tkerber | provider_name = self.emt_setup.get_active_text()
|
| 401 | 1 | tkerber | provider = self.emt_param_info[provider_name]
|
| 402 | 1 | tkerber | if provider is not None: |
| 403 | 1 | tkerber | provider = getattr(asap3, provider)
|
| 404 | 1 | tkerber | return (asap3.EMT, provider, asap3)
|
| 405 | 1 | tkerber | |
| 406 | 1 | tkerber | def emt_check(self): |
| 407 | 1 | tkerber | if not self.get_atoms(): |
| 408 | 1 | tkerber | return False |
| 409 | 1 | tkerber | try:
|
| 410 | 1 | tkerber | emt, provider, asap3 = self.emt_get()
|
| 411 | 1 | tkerber | except ImportError: |
| 412 | 1 | tkerber | oops("ASAP is not installed. (Failed to import asap3)")
|
| 413 | 1 | tkerber | return False |
| 414 | 1 | tkerber | try:
|
| 415 | 1 | tkerber | if provider is not None: |
| 416 | 1 | tkerber | self.atoms.set_calculator(emt(provider()))
|
| 417 | 1 | tkerber | else:
|
| 418 | 1 | tkerber | self.atoms.set_calculator(emt())
|
| 419 | 1 | tkerber | except (asap3.AsapError, TypeError, ValueError), e: |
| 420 | 1 | tkerber | oops("Could not attach EMT calculator to the atoms.",
|
| 421 | 1 | tkerber | str(e))
|
| 422 | 1 | tkerber | return False |
| 423 | 1 | tkerber | return True |
| 424 | 1 | tkerber | |
| 425 | 1 | tkerber | def choose_emt(self): |
| 426 | 1 | tkerber | emt, provider, asap3 = self.emt_get()
|
| 427 | 1 | tkerber | if provider is None: |
| 428 | 1 | tkerber | emt_factory = emt |
| 429 | 1 | tkerber | else:
|
| 430 | 1 | tkerber | def emt_factory(emt=emt, prov=provider): |
| 431 | 1 | tkerber | return emt(prov())
|
| 432 | 1 | tkerber | self.gui.simulation["calc"] = emt_factory |
| 433 | 1 | tkerber | |
| 434 | 1 | tkerber | def aseemt_check(self): |
| 435 | 1 | tkerber | return self.element_check("ASE EMT", ['H', 'Al', 'Cu', 'Ag', 'Au', |
| 436 | 1 | tkerber | 'Ni', 'Pd', 'Pt', 'C', 'N', 'O']) |
| 437 | 1 | tkerber | |
| 438 | 1 | tkerber | def choose_aseemt(self): |
| 439 | 1 | tkerber | self.gui.simulation["calc"] = ase.EMT |
| 440 | 1 | tkerber | ase.EMT.disabled = False # In case Asap has been imported. |
| 441 | 1 | tkerber | |
| 442 | 1 | tkerber | def brenner_check(self): |
| 443 | 1 | tkerber | try:
|
| 444 | 1 | tkerber | import asap3 |
| 445 | 1 | tkerber | except ImportError: |
| 446 | 1 | tkerber | oops("ASAP is not installed. (Failed to import asap3)")
|
| 447 | 1 | tkerber | return False |
| 448 | 1 | tkerber | return self.element_check("Brenner potential", ['H', 'C', 'Si']) |
| 449 | 1 | tkerber | |
| 450 | 1 | tkerber | def choose_brenner(self): |
| 451 | 1 | tkerber | import asap3 |
| 452 | 1 | tkerber | self.gui.simulation["calc"] = asap3.BrennerPotential |
| 453 | 1 | tkerber | |
| 454 | 1 | tkerber | def choose_aseemt(self): |
| 455 | 1 | tkerber | self.gui.simulation["calc"] = ase.EMT |
| 456 | 1 | tkerber | ase.EMT.disabled = False # In case Asap has been imported. |
| 457 | 1 | tkerber | |
| 458 | 1 | tkerber | def gpaw_check(self): |
| 459 | 1 | tkerber | try:
|
| 460 | 1 | tkerber | import gpaw |
| 461 | 1 | tkerber | except ImportError: |
| 462 | 1 | tkerber | oops("GPAW is not installed. (Failed to import gpaw)")
|
| 463 | 1 | tkerber | return False |
| 464 | 1 | tkerber | if not hasattr(self, "gpaw_parameters"): |
| 465 | 1 | tkerber | oops("You must set up the GPAW parameters")
|
| 466 | 1 | tkerber | return False |
| 467 | 1 | tkerber | return True |
| 468 | 1 | tkerber | |
| 469 | 1 | tkerber | def choose_gpaw(self): |
| 470 | 1 | tkerber | # This reuses the same GPAW object.
|
| 471 | 1 | tkerber | try:
|
| 472 | 1 | tkerber | import gpaw |
| 473 | 1 | tkerber | except ImportError: |
| 474 | 1 | tkerber | oops("GPAW is not installed. (Failed to import gpaw)")
|
| 475 | 1 | tkerber | return False |
| 476 | 1 | tkerber | p = self.gpaw_parameters
|
| 477 | 1 | tkerber | use = ["xc", "kpts", "mode"] |
| 478 | 1 | tkerber | if p["use_h"]: |
| 479 | 1 | tkerber | use.append("h")
|
| 480 | 1 | tkerber | else:
|
| 481 | 1 | tkerber | use.append("gpts")
|
| 482 | 1 | tkerber | if p["mode"] == "lcao": |
| 483 | 1 | tkerber | use.append("basis")
|
| 484 | 1 | tkerber | gpaw_param = {}
|
| 485 | 1 | tkerber | for s in use: |
| 486 | 1 | tkerber | gpaw_param[s] = p[s] |
| 487 | 1 | tkerber | if p["use mixer"]: |
| 488 | 1 | tkerber | mx = getattr(gpaw, p["mixer"]) |
| 489 | 1 | tkerber | mx_args = {}
|
| 490 | 1 | tkerber | mx_arg_n = ["beta", "nmaxold", "weight"] |
| 491 | 1 | tkerber | if p["mixer"] == "MixerDiff": |
| 492 | 1 | tkerber | mx_arg_n.extend(["beta_m", "nmaxold_m", "weight_m"]) |
| 493 | 1 | tkerber | for s in mx_arg_n: |
| 494 | 1 | tkerber | mx_args[s] = p[s] |
| 495 | 1 | tkerber | gpaw_param["mixer"] = mx(**mx_args)
|
| 496 | 1 | tkerber | progress = GpawProgressIndicator() |
| 497 | 1 | tkerber | self.gui.simulation["progress"] = progress |
| 498 | 1 | tkerber | gpaw_param["txt"] = progress.get_gpaw_stream()
|
| 499 | 1 | tkerber | gpaw_calc = gpaw.GPAW(**gpaw_param) |
| 500 | 1 | tkerber | def gpaw_factory(calc = gpaw_calc): |
| 501 | 1 | tkerber | return calc
|
| 502 | 1 | tkerber | self.gui.simulation["calc"] = gpaw_factory |
| 503 | 1 | tkerber | |
| 504 | 1 | tkerber | def aims_check(self): |
| 505 | 1 | tkerber | if not hasattr(self, "aims_parameters"): |
| 506 | 1 | tkerber | oops("You must set up the FHI-aims parameters")
|
| 507 | 1 | tkerber | return False |
| 508 | 1 | tkerber | return True |
| 509 | 1 | tkerber | |
| 510 | 1 | tkerber | def choose_aims(self): |
| 511 | 1 | tkerber | param = self.aims_parameters
|
| 512 | 1 | tkerber | from ase.calculators.aims import Aims |
| 513 | 1 | tkerber | calc_aims = Aims(**param) |
| 514 | 1 | tkerber | def aims_factory(calc = calc_aims): |
| 515 | 1 | tkerber | return calc
|
| 516 | 1 | tkerber | self.gui.simulation["calc"] = aims_factory |
| 517 | 1 | tkerber | |
| 518 | 1 | tkerber | def vasp_check(self): |
| 519 | 1 | tkerber | if not hasattr(self, "vasp_parameters"): |
| 520 | 1 | tkerber | oops("You must set up the VASP parameters")
|
| 521 | 1 | tkerber | return False |
| 522 | 1 | tkerber | return True |
| 523 | 1 | tkerber | |
| 524 | 1 | tkerber | def choose_vasp(self): |
| 525 | 1 | tkerber | param = self.vasp_parameters
|
| 526 | 1 | tkerber | from ase.calculators.vasp import Vasp |
| 527 | 1 | tkerber | calc_vasp = Vasp(**param) |
| 528 | 1 | tkerber | def vasp_factory(calc = calc_vasp): |
| 529 | 1 | tkerber | return calc
|
| 530 | 1 | tkerber | self.gui.simulation["calc"] = vasp_factory |
| 531 | 1 | tkerber | |
| 532 | 1 | tkerber | def element_check(self, name, elements): |
| 533 | 1 | tkerber | "Check that all atoms are allowed"
|
| 534 | 1 | tkerber | elements = [ase.data.atomic_numbers[s] for s in elements] |
| 535 | 1 | tkerber | elements_dict = {}
|
| 536 | 1 | tkerber | for e in elements: |
| 537 | 1 | tkerber | elements_dict[e] = True
|
| 538 | 1 | tkerber | if not self.get_atoms(): |
| 539 | 1 | tkerber | return False |
| 540 | 1 | tkerber | try:
|
| 541 | 1 | tkerber | for e in self.atoms.get_atomic_numbers(): |
| 542 | 1 | tkerber | elements_dict[e] |
| 543 | 1 | tkerber | except KeyError: |
| 544 | 1 | tkerber | oops("Element %s is not allowed by the '%s' calculator"
|
| 545 | 1 | tkerber | % (ase.data.chemical_symbols[e], name)) |
| 546 | 1 | tkerber | return False |
| 547 | 1 | tkerber | return True |
| 548 | 1 | tkerber | |
| 549 | 1 | tkerber | class InfoButton(gtk.Button): |
| 550 | 1 | tkerber | def __init__(self, txt): |
| 551 | 1 | tkerber | gtk.Button.__init__(self, "Info") |
| 552 | 1 | tkerber | self.txt = txt
|
| 553 | 1 | tkerber | self.connect('clicked', self.run) |
| 554 | 1 | tkerber | |
| 555 | 1 | tkerber | def run(self, widget): |
| 556 | 1 | tkerber | dialog = gtk.MessageDialog(flags=gtk.DIALOG_MODAL, |
| 557 | 1 | tkerber | type=gtk.MESSAGE_INFO, |
| 558 | 1 | tkerber | buttons=gtk.BUTTONS_CLOSE) |
| 559 | 1 | tkerber | dialog.set_markup(self.txt)
|
| 560 | 1 | tkerber | dialog.connect('response', lambda x, y: dialog.destroy()) |
| 561 | 1 | tkerber | dialog.show() |
| 562 | 1 | tkerber | |
| 563 | 1 | tkerber | |
| 564 | 1 | tkerber | class LJ_Window(gtk.Window): |
| 565 | 1 | tkerber | def __init__(self, owner, param, attrname): |
| 566 | 1 | tkerber | gtk.Window.__init__(self)
|
| 567 | 1 | tkerber | self.set_title("Lennard-Jones parameters") |
| 568 | 1 | tkerber | self.owner = owner
|
| 569 | 1 | tkerber | self.attrname = attrname
|
| 570 | 1 | tkerber | atoms = owner.atoms |
| 571 | 1 | tkerber | atnos = atoms.get_atomic_numbers() |
| 572 | 1 | tkerber | found = {}
|
| 573 | 1 | tkerber | for z in atnos: |
| 574 | 1 | tkerber | found[z] = True
|
| 575 | 1 | tkerber | self.present = found.keys()
|
| 576 | 1 | tkerber | self.present.sort() # Sorted list of atomic numbers |
| 577 | 1 | tkerber | nelem = len(self.present) |
| 578 | 1 | tkerber | vbox = gtk.VBox() |
| 579 | 1 | tkerber | label = gtk.Label("Specify the Lennard-Jones parameters here")
|
| 580 | 1 | tkerber | pack(vbox, [label]) |
| 581 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 582 | 1 | tkerber | pack(vbox, [gtk.Label("Epsilon (eV):")])
|
| 583 | 1 | tkerber | tbl, self.epsilon_adj = self.makematrix(self.present) |
| 584 | 1 | tkerber | pack(vbox, [tbl]) |
| 585 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 586 | 1 | tkerber | pack(vbox, [gtk.Label("Sigma (Å):")])
|
| 587 | 1 | tkerber | tbl, self.sigma_adj = self.makematrix(self.present) |
| 588 | 1 | tkerber | pack(vbox, [tbl]) |
| 589 | 1 | tkerber | self.modif = gtk.CheckButton("Shift to make smooth at cutoff") |
| 590 | 1 | tkerber | self.modif.set_active(True) |
| 591 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 592 | 1 | tkerber | pack(vbox, self.modif)
|
| 593 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 594 | 1 | tkerber | butbox = gtk.HButtonBox() |
| 595 | 1 | tkerber | cancel_but = gtk.Button(stock=gtk.STOCK_CANCEL) |
| 596 | 1 | tkerber | cancel_but.connect('clicked', lambda widget: self.destroy()) |
| 597 | 1 | tkerber | ok_but = gtk.Button(stock=gtk.STOCK_OK) |
| 598 | 1 | tkerber | ok_but.connect('clicked', self.ok) |
| 599 | 1 | tkerber | butbox.pack_start(cancel_but, 0, 0) |
| 600 | 1 | tkerber | butbox.pack_start(ok_but, 0, 0) |
| 601 | 1 | tkerber | butbox.show_all() |
| 602 | 1 | tkerber | pack(vbox, [butbox], end=True, bottom=True) |
| 603 | 1 | tkerber | vbox.show() |
| 604 | 1 | tkerber | self.add(vbox)
|
| 605 | 1 | tkerber | |
| 606 | 1 | tkerber | # Now, set the parameters
|
| 607 | 1 | tkerber | if param and param['elements'] == self.present: |
| 608 | 1 | tkerber | self.set_param(self.epsilon_adj, param["epsilon"], nelem) |
| 609 | 1 | tkerber | self.set_param(self.sigma_adj, param["sigma"], nelem) |
| 610 | 1 | tkerber | self.modif.set_active(param["modified"]) |
| 611 | 1 | tkerber | |
| 612 | 1 | tkerber | self.show()
|
| 613 | 1 | tkerber | self.grab_add() # Lock all other windows |
| 614 | 1 | tkerber | |
| 615 | 1 | tkerber | def makematrix(self, present): |
| 616 | 1 | tkerber | nelem = len(present)
|
| 617 | 1 | tkerber | adjdict = {}
|
| 618 | 1 | tkerber | tbl = gtk.Table(2+nelem, 2+nelem) |
| 619 | 1 | tkerber | for i in range(nelem): |
| 620 | 1 | tkerber | s = chemical_symbols[present[i]] |
| 621 | 1 | tkerber | tbl.attach(gtk.Label(" " + str(present[i])), 0, 1, i, i+1) |
| 622 | 1 | tkerber | tbl.attach(gtk.Label(" "+s+" "), 1, 2, i, i+1) |
| 623 | 1 | tkerber | tbl.attach(gtk.Label(str(present[i])), i+2, i+3, 1+nelem, 2+nelem) |
| 624 | 1 | tkerber | tbl.attach(gtk.Label(s), i+2, i+3, nelem, 1+nelem) |
| 625 | 1 | tkerber | for j in range(i+1): |
| 626 | 1 | tkerber | adj = gtk.Adjustment(1.0, 0.0, 100.0, 0.1) |
| 627 | 1 | tkerber | spin = gtk.SpinButton(adj, 0.1, 3) |
| 628 | 1 | tkerber | tbl.attach(spin, 2+j, 3+j, i, i+1) |
| 629 | 1 | tkerber | adjdict[(i,j)] = adj |
| 630 | 1 | tkerber | tbl.show_all() |
| 631 | 1 | tkerber | return tbl, adjdict
|
| 632 | 1 | tkerber | |
| 633 | 1 | tkerber | def set_param(self, adj, params, n): |
| 634 | 1 | tkerber | for i in range(n): |
| 635 | 1 | tkerber | for j in range(n): |
| 636 | 1 | tkerber | if j <= i:
|
| 637 | 1 | tkerber | adj[(i,j)].value = params[i,j] |
| 638 | 1 | tkerber | |
| 639 | 1 | tkerber | def get_param(self, adj, params, n): |
| 640 | 1 | tkerber | for i in range(n): |
| 641 | 1 | tkerber | for j in range(n): |
| 642 | 1 | tkerber | if j <= i:
|
| 643 | 1 | tkerber | params[i,j] = params[j,i] = adj[(i,j)].value |
| 644 | 1 | tkerber | |
| 645 | 1 | tkerber | |
| 646 | 1 | tkerber | def destroy(self): |
| 647 | 1 | tkerber | self.grab_remove()
|
| 648 | 1 | tkerber | gtk.Window.destroy(self)
|
| 649 | 1 | tkerber | |
| 650 | 1 | tkerber | def ok(self, *args): |
| 651 | 1 | tkerber | params = {}
|
| 652 | 1 | tkerber | params["elements"] = copy(self.present) |
| 653 | 1 | tkerber | n = len(self.present) |
| 654 | 1 | tkerber | eps = np.zeros((n,n)) |
| 655 | 1 | tkerber | self.get_param(self.epsilon_adj, eps, n) |
| 656 | 1 | tkerber | sigma = np.zeros((n,n)) |
| 657 | 1 | tkerber | self.get_param(self.sigma_adj, sigma, n) |
| 658 | 1 | tkerber | params["epsilon"] = eps
|
| 659 | 1 | tkerber | params["sigma"] = sigma
|
| 660 | 1 | tkerber | params["modified"] = self.modif.get_active() |
| 661 | 1 | tkerber | setattr(self.owner, self.attrname, params) |
| 662 | 1 | tkerber | self.destroy()
|
| 663 | 1 | tkerber | |
| 664 | 1 | tkerber | |
| 665 | 1 | tkerber | class GPAW_Window(gtk.Window): |
| 666 | 1 | tkerber | gpaw_xc_list = ['LDA', 'PBE', 'RPBE', 'revPBE'] |
| 667 | 1 | tkerber | gpaw_xc_default = 'PBE'
|
| 668 | 1 | tkerber | def __init__(self, owner, param, attrname): |
| 669 | 1 | tkerber | gtk.Window.__init__(self)
|
| 670 | 1 | tkerber | self.set_title("GPAW parameters") |
| 671 | 1 | tkerber | self.owner = owner
|
| 672 | 1 | tkerber | self.attrname = attrname
|
| 673 | 1 | tkerber | atoms = owner.atoms |
| 674 | 1 | tkerber | self.ucell = atoms.get_cell()
|
| 675 | 1 | tkerber | self.size = tuple([self.ucell[i,i] for i in range(3)]) |
| 676 | 1 | tkerber | self.pbc = atoms.get_pbc()
|
| 677 | 1 | tkerber | self.orthogonal = self.isorthogonal(self.ucell) |
| 678 | 1 | tkerber | self.natoms = len(atoms) |
| 679 | 1 | tkerber | |
| 680 | 1 | tkerber | vbox = gtk.VBox() |
| 681 | 1 | tkerber | #label = gtk.Label("Specify the GPAW parameters here")
|
| 682 | 1 | tkerber | #pack(vbox, [label])
|
| 683 | 1 | tkerber | |
| 684 | 1 | tkerber | # Print some info
|
| 685 | 1 | tkerber | txt = "%i atoms.\n" % (self.natoms,) |
| 686 | 1 | tkerber | if self.orthogonal: |
| 687 | 1 | tkerber | txt += "Orthogonal unit cell: %.2f x %.2f x %.2f Å." % self.size |
| 688 | 1 | tkerber | else:
|
| 689 | 1 | tkerber | txt += "Non-orthogonal unit cell:\n"
|
| 690 | 1 | tkerber | txt += str(self.ucell) |
| 691 | 1 | tkerber | pack(vbox, [gtk.Label(txt)]) |
| 692 | 1 | tkerber | |
| 693 | 1 | tkerber | # XC potential
|
| 694 | 1 | tkerber | self.xc = gtk.combo_box_new_text()
|
| 695 | 1 | tkerber | for i, x in enumerate(self.gpaw_xc_list): |
| 696 | 1 | tkerber | self.xc.append_text(x)
|
| 697 | 1 | tkerber | if x == self.gpaw_xc_default: |
| 698 | 1 | tkerber | self.xc.set_active(i)
|
| 699 | 1 | tkerber | pack(vbox, [gtk.Label("Exchange-correlation functional: "),
|
| 700 | 1 | tkerber | self.xc])
|
| 701 | 1 | tkerber | |
| 702 | 1 | tkerber | # Grid spacing
|
| 703 | 1 | tkerber | self.radio_h = gtk.RadioButton(None, "Grid spacing") |
| 704 | 1 | tkerber | self.h = gtk.Adjustment(0.18, 0.0, 1.0, 0.01) |
| 705 | 1 | tkerber | self.h_spin = gtk.SpinButton(self.h, 0, 2) |
| 706 | 1 | tkerber | pack(vbox, [self.radio_h, gtk.Label(" h = "), self.h_spin, |
| 707 | 1 | tkerber | gtk.Label("Å")])
|
| 708 | 1 | tkerber | self.radio_gpts = gtk.RadioButton(self.radio_h, "Grid points") |
| 709 | 1 | tkerber | self.gpts = []
|
| 710 | 1 | tkerber | self.gpts_spin = []
|
| 711 | 1 | tkerber | for i in range(3): |
| 712 | 1 | tkerber | g = gtk.Adjustment(4, 4, 1000, 4) |
| 713 | 1 | tkerber | s = gtk.SpinButton(g, 0, 0) |
| 714 | 1 | tkerber | self.gpts.append(g)
|
| 715 | 1 | tkerber | self.gpts_spin.append(s)
|
| 716 | 1 | tkerber | self.gpts_hlabel = gtk.Label("") |
| 717 | 1 | tkerber | self.gpts_hlabel_format = "h<sub>eff</sub> = (%.3f, %.3f, %.3f) Å" |
| 718 | 1 | tkerber | pack(vbox, [self.radio_gpts, gtk.Label(" gpts = ("), self.gpts_spin[0], |
| 719 | 1 | tkerber | gtk.Label(", "), self.gpts_spin[1], gtk.Label(", "), |
| 720 | 1 | tkerber | self.gpts_spin[2], gtk.Label(") "), self.gpts_hlabel]) |
| 721 | 1 | tkerber | self.radio_h.connect("toggled", self.radio_grid_toggled) |
| 722 | 1 | tkerber | self.radio_gpts.connect("toggled", self.radio_grid_toggled) |
| 723 | 1 | tkerber | self.radio_grid_toggled(None) |
| 724 | 1 | tkerber | for g in self.gpts: |
| 725 | 1 | tkerber | g.connect("value-changed", self.gpts_changed) |
| 726 | 1 | tkerber | self.h.connect("value-changed", self.h_changed) |
| 727 | 1 | tkerber | |
| 728 | 1 | tkerber | # K-points
|
| 729 | 1 | tkerber | self.kpts = []
|
| 730 | 1 | tkerber | self.kpts_spin = []
|
| 731 | 1 | tkerber | for i in range(3): |
| 732 | 1 | tkerber | if self.pbc[i] and self.orthogonal: |
| 733 | 1 | tkerber | default = np.ceil(20.0 / self.size[i]) |
| 734 | 1 | tkerber | else:
|
| 735 | 1 | tkerber | default = 1
|
| 736 | 1 | tkerber | g = gtk.Adjustment(default, 1, 100, 1) |
| 737 | 1 | tkerber | s = gtk.SpinButton(g, 0, 0) |
| 738 | 1 | tkerber | self.kpts.append(g)
|
| 739 | 1 | tkerber | self.kpts_spin.append(s)
|
| 740 | 1 | tkerber | if not self.pbc[i]: |
| 741 | 1 | tkerber | s.set_sensitive(False)
|
| 742 | 1 | tkerber | g.connect("value-changed", self.k_changed) |
| 743 | 1 | tkerber | pack(vbox, [gtk.Label("k-points k = ("), self.kpts_spin[0], |
| 744 | 1 | tkerber | gtk.Label(", "), self.kpts_spin[1], gtk.Label(", "), |
| 745 | 1 | tkerber | self.kpts_spin[2], gtk.Label(")")]) |
| 746 | 1 | tkerber | self.kpts_label = gtk.Label("") |
| 747 | 1 | tkerber | self.kpts_label_format = "k-points x size: (%.1f, %.1f, %.1f) Å" |
| 748 | 1 | tkerber | pack(vbox, [self.kpts_label])
|
| 749 | 1 | tkerber | self.k_changed()
|
| 750 | 1 | tkerber | |
| 751 | 1 | tkerber | # Spin polarized
|
| 752 | 1 | tkerber | self.spinpol = gtk.CheckButton("Spin polarized") |
| 753 | 1 | tkerber | pack(vbox, [self.spinpol])
|
| 754 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 755 | 1 | tkerber | |
| 756 | 1 | tkerber | # Mode and basis functions
|
| 757 | 1 | tkerber | self.mode = gtk.combo_box_new_text()
|
| 758 | 1 | tkerber | self.mode.append_text("FD - Finite Difference (grid) mode") |
| 759 | 1 | tkerber | self.mode.append_text("LCAO - Linear Combination of Atomic Orbitals") |
| 760 | 1 | tkerber | self.mode.set_active(0) |
| 761 | 1 | tkerber | pack(vbox, [gtk.Label("Mode: "), self.mode]) |
| 762 | 1 | tkerber | self.basis = gtk.combo_box_new_text()
|
| 763 | 1 | tkerber | self.basis.append_text("sz - Single Zeta") |
| 764 | 1 | tkerber | self.basis.append_text("szp - Single Zeta polarized") |
| 765 | 1 | tkerber | self.basis.append_text("dzp - Double Zeta polarized") |
| 766 | 1 | tkerber | self.basis.set_active(2) # dzp |
| 767 | 1 | tkerber | pack(vbox, [gtk.Label("Basis functions: "), self.basis]) |
| 768 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 769 | 1 | tkerber | self.mode.connect("changed", self.mode_changed) |
| 770 | 1 | tkerber | self.mode_changed()
|
| 771 | 1 | tkerber | |
| 772 | 1 | tkerber | # Mixer
|
| 773 | 1 | tkerber | self.use_mixer = gtk.CheckButton("Non-standard mixer parameters") |
| 774 | 1 | tkerber | pack(vbox, [self.use_mixer])
|
| 775 | 1 | tkerber | self.radio_mixer = gtk.RadioButton(None, "Mixer ") |
| 776 | 1 | tkerber | self.radio_mixersum = gtk.RadioButton(self.radio_mixer, "MixerSum ") |
| 777 | 1 | tkerber | self.radio_mixerdiff = gtk.RadioButton(self.radio_mixer, "MixerDiff") |
| 778 | 1 | tkerber | pack(vbox, [self.radio_mixer, self.radio_mixersum, |
| 779 | 1 | tkerber | self.radio_mixerdiff])
|
| 780 | 1 | tkerber | self.beta_adj = gtk.Adjustment(0.25, 0.0, 1.0, 0.05) |
| 781 | 1 | tkerber | self.beta_spin = gtk.SpinButton(self.beta_adj, 0, 2) |
| 782 | 1 | tkerber | self.nmaxold_adj = gtk.Adjustment(3, 1, 10, 1) |
| 783 | 1 | tkerber | self.nmaxold_spin = gtk.SpinButton(self.nmaxold_adj, 0, 0) |
| 784 | 1 | tkerber | self.weight_adj = gtk.Adjustment(50, 1, 500, 1) |
| 785 | 1 | tkerber | self.weight_spin = gtk.SpinButton(self.weight_adj, 0, 0) |
| 786 | 1 | tkerber | pack(vbox, [gtk.Label("beta = "), self.beta_spin, |
| 787 | 1 | tkerber | gtk.Label(" nmaxold = "), self.nmaxold_spin, |
| 788 | 1 | tkerber | gtk.Label(" weight = "), self.weight_spin]) |
| 789 | 1 | tkerber | self.beta_m_adj = gtk.Adjustment(0.70, 0.0, 1.0, 0.05) |
| 790 | 1 | tkerber | self.beta_m_spin = gtk.SpinButton(self.beta_m_adj, 0, 2) |
| 791 | 1 | tkerber | self.nmaxold_m_adj = gtk.Adjustment(2, 1, 10, 1) |
| 792 | 1 | tkerber | self.nmaxold_m_spin = gtk.SpinButton(self.nmaxold_m_adj, 0, 0) |
| 793 | 1 | tkerber | self.weight_m_adj = gtk.Adjustment(10, 1, 500, 1) |
| 794 | 1 | tkerber | self.weight_m_spin = gtk.SpinButton(self.weight_m_adj, 0, 0) |
| 795 | 1 | tkerber | pack(vbox, [gtk.Label("beta_m = "), self.beta_m_spin, |
| 796 | 1 | tkerber | gtk.Label(" nmaxold_m = "), self.nmaxold_m_spin, |
| 797 | 1 | tkerber | gtk.Label(" weight_m = "), self.weight_m_spin]) |
| 798 | 1 | tkerber | for but in (self.spinpol, self.use_mixer, self.radio_mixer, |
| 799 | 1 | tkerber | self.radio_mixersum, self.radio_mixerdiff): |
| 800 | 1 | tkerber | but.connect("clicked", self.mixer_changed) |
| 801 | 1 | tkerber | self.mixer_changed()
|
| 802 | 1 | tkerber | |
| 803 | 1 | tkerber | # Eigensolver
|
| 804 | 1 | tkerber | # Poisson-solver
|
| 805 | 1 | tkerber | |
| 806 | 1 | tkerber | vbox.show() |
| 807 | 1 | tkerber | self.add(vbox)
|
| 808 | 1 | tkerber | |
| 809 | 1 | tkerber | # Buttons at the bottom
|
| 810 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 811 | 1 | tkerber | butbox = gtk.HButtonBox() |
| 812 | 1 | tkerber | cancel_but = gtk.Button(stock=gtk.STOCK_CANCEL) |
| 813 | 1 | tkerber | cancel_but.connect('clicked', lambda widget: self.destroy()) |
| 814 | 1 | tkerber | ok_but = gtk.Button(stock=gtk.STOCK_OK) |
| 815 | 1 | tkerber | ok_but.connect('clicked', self.ok) |
| 816 | 1 | tkerber | butbox.pack_start(cancel_but, 0, 0) |
| 817 | 1 | tkerber | butbox.pack_start(ok_but, 0, 0) |
| 818 | 1 | tkerber | butbox.show_all() |
| 819 | 1 | tkerber | pack(vbox, [butbox], end=True, bottom=True) |
| 820 | 1 | tkerber | |
| 821 | 1 | tkerber | # Set stored parameters
|
| 822 | 1 | tkerber | if param:
|
| 823 | 1 | tkerber | self.xc.set_active(param["xc#"]) |
| 824 | 1 | tkerber | if param["use_h"]: |
| 825 | 1 | tkerber | self.radio_h.set_active(True) |
| 826 | 1 | tkerber | else:
|
| 827 | 1 | tkerber | self.radio_gpts.set_active(True) |
| 828 | 1 | tkerber | for i in range(3): |
| 829 | 1 | tkerber | self.gpts[i].value = param["gpts"][i] |
| 830 | 1 | tkerber | self.kpts[i].value = param["kpts"][i] |
| 831 | 1 | tkerber | self.spinpol.set_active(param["spinpol"]) |
| 832 | 1 | tkerber | self.mode.set_active(param["mode#"]) |
| 833 | 1 | tkerber | self.basis.set_active(param["basis#"]) |
| 834 | 1 | tkerber | self.use_mixer.set_active(param["use mixer"]) |
| 835 | 1 | tkerber | getattr(self, "radio_"+param["mixer"].lower()).set_active(True) |
| 836 | 1 | tkerber | for t in ("beta", "nmaxold", "weight", "beta_m", "nmaxold_m", |
| 837 | 1 | tkerber | "weight_m"):
|
| 838 | 1 | tkerber | getattr(self, t+"_adj").value = param[t] |
| 839 | 1 | tkerber | |
| 840 | 1 | tkerber | self.show()
|
| 841 | 1 | tkerber | self.grab_add() # Lock all other windows |
| 842 | 1 | tkerber | |
| 843 | 1 | tkerber | def radio_grid_toggled(self, widget): |
| 844 | 1 | tkerber | hmode = self.radio_h.get_active()
|
| 845 | 1 | tkerber | self.h_spin.set_sensitive(hmode)
|
| 846 | 1 | tkerber | for s in self.gpts_spin: |
| 847 | 1 | tkerber | s.set_sensitive(not hmode)
|
| 848 | 1 | tkerber | self.gpts_changed()
|
| 849 | 1 | tkerber | |
| 850 | 1 | tkerber | def gpts_changed(self, *args): |
| 851 | 1 | tkerber | if self.radio_gpts.get_active(): |
| 852 | 1 | tkerber | g = np.array([int(g.value) for g in self.gpts]) |
| 853 | 1 | tkerber | size = np.array([self.ucell[i,i] for i in range(3)]) |
| 854 | 1 | tkerber | txt = self.gpts_hlabel_format % tuple(size / g) |
| 855 | 1 | tkerber | self.gpts_hlabel.set_markup(txt)
|
| 856 | 1 | tkerber | else:
|
| 857 | 1 | tkerber | self.gpts_hlabel.set_markup("") |
| 858 | 1 | tkerber | |
| 859 | 1 | tkerber | def h_changed(self, *args): |
| 860 | 1 | tkerber | h = self.h.value
|
| 861 | 1 | tkerber | for i in range(3): |
| 862 | 1 | tkerber | g = 4 * round(self.ucell[i,i] / (4*h)) |
| 863 | 1 | tkerber | self.gpts[i].value = g
|
| 864 | 1 | tkerber | |
| 865 | 1 | tkerber | def k_changed(self, *args): |
| 866 | 1 | tkerber | if self.orthogonal: |
| 867 | 1 | tkerber | size = [self.kpts[i].value * self.size[i] for i in range(3)] |
| 868 | 1 | tkerber | self.kpts_label.set_text(self.kpts_label_format % tuple(size)) |
| 869 | 1 | tkerber | |
| 870 | 1 | tkerber | def mode_changed(self, *args): |
| 871 | 1 | tkerber | self.basis.set_sensitive(self.mode.get_active() == 1) |
| 872 | 1 | tkerber | |
| 873 | 1 | tkerber | def mixer_changed(self, *args): |
| 874 | 1 | tkerber | radios = (self.radio_mixer, self.radio_mixersum, self.radio_mixerdiff) |
| 875 | 1 | tkerber | spin1 = (self.beta_spin, self.nmaxold_spin, self.weight_spin) |
| 876 | 1 | tkerber | spin2 = (self.beta_m_spin, self.nmaxold_m_spin, self.weight_m_spin) |
| 877 | 1 | tkerber | if self.use_mixer.get_active(): |
| 878 | 1 | tkerber | # Mixer parameters can be specified.
|
| 879 | 1 | tkerber | if self.spinpol.get_active(): |
| 880 | 1 | tkerber | self.radio_mixer.set_sensitive(False) |
| 881 | 1 | tkerber | self.radio_mixersum.set_sensitive(True) |
| 882 | 1 | tkerber | self.radio_mixerdiff.set_sensitive(True) |
| 883 | 1 | tkerber | if self.radio_mixer.get_active(): |
| 884 | 1 | tkerber | self.radio_mixersum.set_active(True) |
| 885 | 1 | tkerber | else:
|
| 886 | 1 | tkerber | self.radio_mixer.set_sensitive(True) |
| 887 | 1 | tkerber | self.radio_mixersum.set_sensitive(False) |
| 888 | 1 | tkerber | self.radio_mixerdiff.set_sensitive(False) |
| 889 | 1 | tkerber | self.radio_mixer.set_active(True) |
| 890 | 1 | tkerber | if self.radio_mixerdiff.get_active(): |
| 891 | 1 | tkerber | active = spin1 + spin2 |
| 892 | 1 | tkerber | passive = () |
| 893 | 1 | tkerber | else:
|
| 894 | 1 | tkerber | active = spin1 |
| 895 | 1 | tkerber | passive = spin2 |
| 896 | 1 | tkerber | for widget in active: |
| 897 | 1 | tkerber | widget.set_sensitive(True)
|
| 898 | 1 | tkerber | for widget in passive: |
| 899 | 1 | tkerber | widget.set_sensitive(False)
|
| 900 | 1 | tkerber | else:
|
| 901 | 1 | tkerber | # No mixer parameters
|
| 902 | 1 | tkerber | for widget in radios + spin1 + spin2: |
| 903 | 1 | tkerber | widget.set_sensitive(False)
|
| 904 | 1 | tkerber | |
| 905 | 1 | tkerber | def isorthogonal(self, matrix): |
| 906 | 1 | tkerber | ortho = True
|
| 907 | 1 | tkerber | for i in range(3): |
| 908 | 1 | tkerber | for j in range(3): |
| 909 | 1 | tkerber | if i != j and matrix[i][j] != 0.0: |
| 910 | 1 | tkerber | ortho = False
|
| 911 | 1 | tkerber | return ortho
|
| 912 | 1 | tkerber | |
| 913 | 1 | tkerber | def ok(self, *args): |
| 914 | 1 | tkerber | param = {}
|
| 915 | 1 | tkerber | param["xc"] = self.xc.get_active_text() |
| 916 | 1 | tkerber | param["xc#"] = self.xc.get_active() |
| 917 | 1 | tkerber | param["use_h"] = self.radio_h.get_active() |
| 918 | 1 | tkerber | param["h"] = self.h.value |
| 919 | 1 | tkerber | param["gpts"] = [int(g.value) for g in self.gpts] |
| 920 | 1 | tkerber | param["kpts"] = [int(k.value) for k in self.kpts] |
| 921 | 1 | tkerber | param["spinpol"] = self.spinpol.get_active() |
| 922 | 1 | tkerber | param["mode"] = self.mode.get_active_text().split()[0].lower() |
| 923 | 1 | tkerber | param["mode#"] = self.mode.get_active() |
| 924 | 1 | tkerber | param["basis"] = self.basis.get_active_text().split()[0].lower() |
| 925 | 1 | tkerber | param["basis#"] = self.basis.get_active() |
| 926 | 1 | tkerber | param["use mixer"] = self.use_mixer.get_active() |
| 927 | 1 | tkerber | if self.radio_mixer.get_active(): |
| 928 | 1 | tkerber | m = "Mixer"
|
| 929 | 1 | tkerber | elif self.radio_mixersum.get_active(): |
| 930 | 1 | tkerber | m = "MixerSum"
|
| 931 | 1 | tkerber | else:
|
| 932 | 1 | tkerber | assert self.radio_mixerdiff.get_active() |
| 933 | 1 | tkerber | m = "MixerDiff"
|
| 934 | 1 | tkerber | param["mixer"] = m
|
| 935 | 1 | tkerber | for t in ("beta", "nmaxold", "weight", "beta_m", "nmaxold_m", |
| 936 | 1 | tkerber | "weight_m"):
|
| 937 | 1 | tkerber | param[t] = getattr(self, t+"_adj").value |
| 938 | 1 | tkerber | setattr(self.owner, self.attrname, param) |
| 939 | 1 | tkerber | self.destroy()
|
| 940 | 1 | tkerber | |
| 941 | 1 | tkerber | class AIMS_Window(gtk.Window): |
| 942 | 1 | tkerber | aims_xc_cluster = ['pw-lda','pz-lda','pbe','pbesol','rpbe','revpbe', |
| 943 | 1 | tkerber | 'blyp','am05','b3lyp','hse03','hse06','pbe0','pbesol0', |
| 944 | 1 | tkerber | 'hf','mp2'] |
| 945 | 1 | tkerber | aims_xc_periodic = ['pw-lda','pz-lda','pbe','pbesol','rpbe','revpbe', |
| 946 | 1 | tkerber | 'blyp','am05'] |
| 947 | 1 | tkerber | aims_xc_default = 'pbe'
|
| 948 | 1 | tkerber | aims_relativity_list = ['none','atomic_zora','zora'] |
| 949 | 1 | tkerber | aims_keyword_gui_list = ['xc','vdw_correction_hirshfeld','k_grid','spin','charge','relativistic', |
| 950 | 1 | tkerber | 'sc_accuracy_etot','sc_accuracy_eev','sc_accuracy_rho','sc_accuracy_forces', |
| 951 | 1 | tkerber | 'compute_forces','run_command','species_dir'] |
| 952 | 1 | tkerber | def __init__(self, owner, param, attrname): |
| 953 | 1 | tkerber | self.owner = owner
|
| 954 | 1 | tkerber | self.attrname = attrname
|
| 955 | 1 | tkerber | atoms = owner.atoms |
| 956 | 1 | tkerber | self.periodic = atoms.get_pbc().all()
|
| 957 | 1 | tkerber | if not self.periodic and atoms.get_pbc().any(): |
| 958 | 1 | tkerber | aims_periodic_warning = True
|
| 959 | 1 | tkerber | self.periodic = True |
| 960 | 1 | tkerber | else:
|
| 961 | 1 | tkerber | aims_periodic_warning = False
|
| 962 | 1 | tkerber | from ase.calculators.aims import float_keys,exp_keys,string_keys,int_keys,bool_keys,list_keys,input_keys |
| 963 | 1 | tkerber | self.aims_keyword_list =float_keys+exp_keys+string_keys+int_keys+bool_keys+list_keys+input_keys
|
| 964 | 1 | tkerber | self.expert_keywords = []
|
| 965 | 1 | tkerber | |
| 966 | 1 | tkerber | natoms = len(atoms)
|
| 967 | 1 | tkerber | gtk.Window.__init__(self)
|
| 968 | 1 | tkerber | self.set_title("FHI-aims parameters") |
| 969 | 1 | tkerber | vbox = gtk.VBox() |
| 970 | 1 | tkerber | # Print some info
|
| 971 | 1 | tkerber | txt = "%i atoms.\n" % (natoms)
|
| 972 | 1 | tkerber | if self.periodic: |
| 973 | 1 | tkerber | self.ucell = atoms.get_cell()
|
| 974 | 1 | tkerber | txt += "Periodic geometry, unit cell is: \n"
|
| 975 | 1 | tkerber | for i in range(3): |
| 976 | 1 | tkerber | txt += "(%8.3f %8.3f %8.3f)\n" % (self.ucell[i][0], self.ucell[i][1], self.ucell[i][2]) |
| 977 | 1 | tkerber | self.xc_list = self.aims_xc_periodic |
| 978 | 1 | tkerber | else:
|
| 979 | 1 | tkerber | txt += "Non-periodic geometry. \n"
|
| 980 | 1 | tkerber | self.xc_list = self.aims_xc_cluster |
| 981 | 1 | tkerber | pack(vbox, [gtk.Label(txt)]) |
| 982 | 1 | tkerber | |
| 983 | 1 | tkerber | # XC functional & dispersion correction
|
| 984 | 1 | tkerber | self.xc = gtk.combo_box_new_text()
|
| 985 | 1 | tkerber | self.xc_setup = False |
| 986 | 1 | tkerber | self.TS = gtk.CheckButton("Hirshfeld-based dispersion correction") |
| 987 | 1 | tkerber | pack(vbox, [gtk.Label("Exchange-correlation functional: "),self.xc]) |
| 988 | 1 | tkerber | pack(vbox, [self.TS])
|
| 989 | 1 | tkerber | pack(vbox, [gtk.Label("")])
|
| 990 | 1 | tkerber | |
| 991 | 1 | tkerber | # k-grid?
|
| 992 | 1 | tkerber | if self.periodic: |
| 993 | 1 | tkerber | self.kpts = []
|
| 994 | 1 | tkerber | self.kpts_spin = []
|
| 995 | 1 | tkerber | for i in range(3): |
| 996 | 1 | tkerber | default = np.ceil(20.0 / np.sqrt(np.vdot(self.ucell[i],self.ucell[i]))) |
| 997 | 1 | tkerber | g = gtk.Adjustment(default, 1, 100, 1) |
| 998 | 1 | tkerber | s = gtk.SpinButton(g, 0, 0) |
| 999 | 1 | tkerber | self.kpts.append(g)
|
| 1000 | 1 | tkerber | self.kpts_spin.append(s)
|
| 1001 | 1 | tkerber | g.connect("value-changed", self.k_changed) |
| 1002 | 1 | tkerber | pack(vbox, [gtk.Label("k-points k = ("), self.kpts_spin[0], |
| 1003 | 1 | tkerber | gtk.Label(", "), self.kpts_spin[1], gtk.Label(", "), |
| 1004 | 1 | tkerber | self.kpts_spin[2], gtk.Label(")")]) |
| 1005 | 1 | tkerber | self.kpts_label = gtk.Label("") |
| 1006 | 1 | tkerber | self.kpts_label_format = "k-points x size: (%.1f, %.1f, %.1f) Å" |
| 1007 | 1 | tkerber | pack(vbox, [self.kpts_label])
|
| 1008 | 1 | tkerber | self.k_changed()
|
| 1009 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 1010 | 1 | tkerber | |
| 1011 | 1 | tkerber | # Spin polarized, charge, relativity
|
| 1012 | 1 | tkerber | self.spinpol = gtk.CheckButton("Spin polarized") |
| 1013 | 1 | tkerber | self.charge = gtk.Adjustment(0,-100,100,0.1) |
| 1014 | 1 | tkerber | self.charge_spin = gtk.SpinButton(self.charge, 0, 0) |
| 1015 | 1 | tkerber | self.charge_spin.set_digits(2) |
| 1016 | 1 | tkerber | self.relativity_type = gtk.combo_box_new_text()
|
| 1017 | 1 | tkerber | for i, x in enumerate(self.aims_relativity_list): |
| 1018 | 1 | tkerber | self.relativity_type.append_text(x)
|
| 1019 | 1 | tkerber | self.relativity_type.connect('changed',self.relativity_changed) |
| 1020 | 1 | tkerber | self.relativity_threshold = gtk.Entry(max=8) |
| 1021 | 1 | tkerber | self.relativity_threshold.set_text('1.00e-12') |
| 1022 | 1 | tkerber | self.relativity_threshold.set_sensitive(False) |
| 1023 | 1 | tkerber | pack(vbox, [self.spinpol,
|
| 1024 | 1 | tkerber | gtk.Label(" Charge"),
|
| 1025 | 1 | tkerber | self.charge_spin,
|
| 1026 | 1 | tkerber | gtk.Label(" Relativity"),
|
| 1027 | 1 | tkerber | self.relativity_type,
|
| 1028 | 1 | tkerber | gtk.Label(" Threshold"),
|
| 1029 | 1 | tkerber | self.relativity_threshold])
|
| 1030 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 1031 | 1 | tkerber | |
| 1032 | 1 | tkerber | # self-consistency criteria
|
| 1033 | 1 | tkerber | pack(vbox,[gtk.Label("Self-consistency convergence:")])
|
| 1034 | 1 | tkerber | self.sc_tot_energy = gtk.Adjustment(1e-6, 1e-6, 1e0, 1e-6) |
| 1035 | 1 | tkerber | self.sc_tot_energy_spin = gtk.SpinButton(self.sc_tot_energy, 0, 0) |
| 1036 | 1 | tkerber | self.sc_tot_energy_spin.set_digits(6) |
| 1037 | 1 | tkerber | self.sc_tot_energy_spin.set_numeric(True) |
| 1038 | 1 | tkerber | self.sc_sum_eigenvalue = gtk.Adjustment(1e-3, 1e-6, 1e0, 1e-6) |
| 1039 | 1 | tkerber | self.sc_sum_eigenvalue_spin = gtk.SpinButton(self.sc_sum_eigenvalue, 0, 0) |
| 1040 | 1 | tkerber | self.sc_sum_eigenvalue_spin.set_digits(6) |
| 1041 | 1 | tkerber | self.sc_sum_eigenvalue_spin.set_numeric(True) |
| 1042 | 1 | tkerber | self.sc_density = gtk.Adjustment(1e-4, 1e-6, 1e0, 1e-6) |
| 1043 | 1 | tkerber | self.sc_density_spin = gtk.SpinButton(self.sc_density, 0, 0) |
| 1044 | 1 | tkerber | self.sc_density_spin.set_digits(6) |
| 1045 | 1 | tkerber | self.sc_density_spin.set_numeric(True) |
| 1046 | 1 | tkerber | self.compute_forces = gtk.CheckButton("Compute forces") |
| 1047 | 1 | tkerber | self.compute_forces.set_active(True) |
| 1048 | 1 | tkerber | self.compute_forces.connect("toggled", self.compute_forces_toggled,"") |
| 1049 | 1 | tkerber | self.sc_forces = gtk.Adjustment(1e-4, 1e-6, 1e0, 1e-6) |
| 1050 | 1 | tkerber | self.sc_forces_spin = gtk.SpinButton(self.sc_forces, 0, 0) |
| 1051 | 1 | tkerber | self.sc_forces_spin.set_numeric(True) |
| 1052 | 1 | tkerber | self.sc_forces_spin.set_digits(6) |
| 1053 | 1 | tkerber | pack(vbox, [gtk.Label("Energy: "),
|
| 1054 | 1 | tkerber | self.sc_tot_energy_spin,
|
| 1055 | 1 | tkerber | gtk.Label(" eV Sum of eigenvalues: "),
|
| 1056 | 1 | tkerber | self.sc_sum_eigenvalue_spin,
|
| 1057 | 1 | tkerber | gtk.Label(" eV")])
|
| 1058 | 1 | tkerber | pack(vbox, [gtk.Label("Electron density: "),
|
| 1059 | 1 | tkerber | self.sc_density_spin,
|
| 1060 | 1 | tkerber | gtk.Label(" Force convergence: "),
|
| 1061 | 1 | tkerber | self.sc_forces_spin,
|
| 1062 | 1 | tkerber | gtk.Label(" eV/Ang ")])
|
| 1063 | 1 | tkerber | |
| 1064 | 1 | tkerber | pack(vbox, [self.compute_forces])
|
| 1065 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 1066 | 1 | tkerber | |
| 1067 | 1 | tkerber | self.expert_keyword_set = gtk.Entry(max = 55) |
| 1068 | 1 | tkerber | self.expert_keyword_add = gtk.Button(stock = gtk.STOCK_ADD)
|
| 1069 | 1 | tkerber | self.expert_keyword_add.connect("clicked", self.expert_keyword_import) |
| 1070 | 1 | tkerber | self.expert_keyword_set.connect("activate", self.expert_keyword_import) |
| 1071 | 1 | tkerber | pack(vbox,[gtk.Label("Additional keywords: "),
|
| 1072 | 1 | tkerber | self.expert_keyword_set,
|
| 1073 | 1 | tkerber | self.expert_keyword_add])
|
| 1074 | 1 | tkerber | self.expert_vbox = gtk.VBox()
|
| 1075 | 1 | tkerber | pack(vbox, self.expert_vbox)
|
| 1076 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 1077 | 1 | tkerber | |
| 1078 | 1 | tkerber | # run command and species defaults:
|
| 1079 | 1 | tkerber | pack(vbox, gtk.Label('FHI-aims execution command: '))
|
| 1080 | 1 | tkerber | self.run_command = pack(vbox, gtk.Entry(max=0)) |
| 1081 | 1 | tkerber | pack(vbox, gtk.Label('Directory for species defaults: '))
|
| 1082 | 1 | tkerber | self.species_defaults = pack(vbox, gtk.Entry(max=0)) |
| 1083 | 1 | tkerber | |
| 1084 | 1 | tkerber | # set defaults from previous instance of the calculator, if applicable:
|
| 1085 | 1 | tkerber | if param is not None: |
| 1086 | 1 | tkerber | self.set_param(param)
|
| 1087 | 1 | tkerber | else:
|
| 1088 | 1 | tkerber | self.set_defaults()
|
| 1089 | 1 | tkerber | |
| 1090 | 1 | tkerber | # Buttons at the bottom
|
| 1091 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 1092 | 1 | tkerber | butbox = gtk.HButtonBox() |
| 1093 | 1 | tkerber | default_but = gtk.Button("Set Defaults")
|
| 1094 | 1 | tkerber | default_but.connect("clicked",self.set_defaults) |
| 1095 | 1 | tkerber | import_control_but = gtk.Button("Import control.in")
|
| 1096 | 1 | tkerber | import_control_but.connect("clicked",self.import_control) |
| 1097 | 1 | tkerber | export_control_but = gtk.Button("Export control.in")
|
| 1098 | 1 | tkerber | export_control_but.connect("clicked", self.export_control) |
| 1099 | 1 | tkerber | cancel_but = gtk.Button(stock=gtk.STOCK_CANCEL) |
| 1100 | 1 | tkerber | cancel_but.connect('clicked', lambda widget: self.destroy()) |
| 1101 | 1 | tkerber | ok_but = gtk.Button(stock=gtk.STOCK_OK) |
| 1102 | 1 | tkerber | ok_but.connect('clicked', self.ok) |
| 1103 | 1 | tkerber | butbox.pack_start(default_but, 0, 0) |
| 1104 | 1 | tkerber | butbox.pack_start(import_control_but, 0, 0) |
| 1105 | 1 | tkerber | butbox.pack_start(export_control_but, 0, 0) |
| 1106 | 1 | tkerber | butbox.pack_start(cancel_but, 0, 0) |
| 1107 | 1 | tkerber | butbox.pack_start(ok_but, 0, 0) |
| 1108 | 1 | tkerber | butbox.show_all() |
| 1109 | 1 | tkerber | pack(vbox, [butbox], end=True, bottom=True) |
| 1110 | 1 | tkerber | self.expert_vbox.show()
|
| 1111 | 1 | tkerber | vbox.show() |
| 1112 | 1 | tkerber | self.add(vbox)
|
| 1113 | 1 | tkerber | self.show()
|
| 1114 | 1 | tkerber | self.grab_add()
|
| 1115 | 1 | tkerber | if aims_periodic_warning:
|
| 1116 | 1 | tkerber | oops(aims_pbc_warning_text) |
| 1117 | 1 | tkerber | |
| 1118 | 1 | tkerber | def set_defaults(self, *args): |
| 1119 | 1 | tkerber | atoms = self.owner.atoms.copy()
|
| 1120 | 1 | tkerber | if not self.xc_setup: |
| 1121 | 1 | tkerber | self.xc_setup = True |
| 1122 | 1 | tkerber | for i, x in enumerate(self.xc_list): |
| 1123 | 1 | tkerber | self.xc.append_text(x)
|
| 1124 | 1 | tkerber | for i, x in enumerate(self.xc_list): |
| 1125 | 1 | tkerber | if x == self.aims_xc_default: |
| 1126 | 1 | tkerber | self.xc.set_active(i)
|
| 1127 | 1 | tkerber | self.TS.set_active(False) |
| 1128 | 1 | tkerber | if self.periodic: |
| 1129 | 1 | tkerber | self.ucell = atoms.get_cell()
|
| 1130 | 1 | tkerber | for i in range(3): |
| 1131 | 1 | tkerber | default = np.ceil(20.0 / np.sqrt(np.vdot(self.ucell[i],self.ucell[i]))) |
| 1132 | 1 | tkerber | self.kpts_spin[i].set_value(default)
|
| 1133 | 1 | tkerber | self.spinpol.set_active(False) |
| 1134 | 1 | tkerber | self.charge.set_value(0) |
| 1135 | 1 | tkerber | aims_relativity_default = 'none'
|
| 1136 | 1 | tkerber | for a in atoms: |
| 1137 | 1 | tkerber | if a.get_atomic_number() > 20: |
| 1138 | 1 | tkerber | aims_relativity_default = 'atomic_zora'
|
| 1139 | 1 | tkerber | for i, x in enumerate(self.aims_relativity_list): |
| 1140 | 1 | tkerber | if x == aims_relativity_default:
|
| 1141 | 1 | tkerber | self.relativity_type.set_active(i)
|
| 1142 | 1 | tkerber | self.sc_tot_energy.set_value(1e-6) |
| 1143 | 1 | tkerber | self.sc_sum_eigenvalue.set_value(1e-3) |
| 1144 | 1 | tkerber | self.sc_density.set_value(1e-4) |
| 1145 | 1 | tkerber | self.sc_forces.set_value(1e-4) |
| 1146 | 1 | tkerber | for key in self.expert_keywords: |
| 1147 | 1 | tkerber | key[0].destroy()
|
| 1148 | 1 | tkerber | key[1].destroy()
|
| 1149 | 1 | tkerber | key[2].destroy()
|
| 1150 | 1 | tkerber | key[3] = False |
| 1151 | 1 | tkerber | if os.environ.has_key('AIMS_COMMAND'): |
| 1152 | 1 | tkerber | text = os.environ['AIMS_COMMAND']
|
| 1153 | 1 | tkerber | else:
|
| 1154 | 1 | tkerber | text = ""
|
| 1155 | 1 | tkerber | self.run_command.set_text(text)
|
| 1156 | 1 | tkerber | if os.environ.has_key('AIMS_SPECIES_DIR'): |
| 1157 | 1 | tkerber | text = os.environ['AIMS_SPECIES_DIR']
|
| 1158 | 1 | tkerber | else:
|
| 1159 | 1 | tkerber | text = ""
|
| 1160 | 1 | tkerber | self.species_defaults.set_text(text)
|
| 1161 | 1 | tkerber | |
| 1162 | 1 | tkerber | def set_attributes(self, *args): |
| 1163 | 1 | tkerber | param = {}
|
| 1164 | 1 | tkerber | param["xc"] = self.xc.get_active_text() |
| 1165 | 1 | tkerber | if self.periodic: |
| 1166 | 1 | tkerber | param["k_grid"] = (int(self.kpts[0].value), |
| 1167 | 1 | tkerber | int(self.kpts[1].value), |
| 1168 | 1 | tkerber | int(self.kpts[2].value)) |
| 1169 | 1 | tkerber | if self.spinpol.get_active(): |
| 1170 | 1 | tkerber | param["spin"] = "collinear" |
| 1171 | 1 | tkerber | else:
|
| 1172 | 1 | tkerber | param["spin"] = "none" |
| 1173 | 1 | tkerber | param["vdw_correction_hirshfeld"] = self.TS.get_active() |
| 1174 | 1 | tkerber | param["charge"] = self.charge.value |
| 1175 | 1 | tkerber | param["relativistic"] = self.relativity_type.get_active_text() |
| 1176 | 1 | tkerber | if param["relativistic"] == 'atomic_zora': |
| 1177 | 1 | tkerber | param["relativistic"] += " scalar " |
| 1178 | 1 | tkerber | if param["relativistic"] == 'zora': |
| 1179 | 1 | tkerber | param["relativistic"] += " scalar "+self.relativity_threshold.get_text() |
| 1180 | 1 | tkerber | param["sc_accuracy_etot"] = self.sc_tot_energy.value |
| 1181 | 1 | tkerber | param["sc_accuracy_eev"] = self.sc_sum_eigenvalue.value |
| 1182 | 1 | tkerber | param["sc_accuracy_rho"] = self.sc_density.value |
| 1183 | 1 | tkerber | param["compute_forces"] = self.compute_forces.get_active() |
| 1184 | 1 | tkerber | param["sc_accuracy_forces"] = self.sc_forces.value |
| 1185 | 1 | tkerber | param["run_command"] = self.run_command.get_text() |
| 1186 | 1 | tkerber | param["species_dir"] = self.species_defaults.get_text() |
| 1187 | 1 | tkerber | from ase.calculators.aims import float_keys,exp_keys,string_keys,int_keys,bool_keys,list_keys,input_keys |
| 1188 | 1 | tkerber | for option in self.expert_keywords: |
| 1189 | 1 | tkerber | if option[3]: # set type of parameter accoding to which list it is in |
| 1190 | 1 | tkerber | key = option[0].get_text().strip()
|
| 1191 | 1 | tkerber | val = option[1].get_text().strip()
|
| 1192 | 1 | tkerber | if key == 'output': |
| 1193 | 1 | tkerber | if param.has_key('output'): |
| 1194 | 1 | tkerber | param[key] += [val] |
| 1195 | 1 | tkerber | else:
|
| 1196 | 1 | tkerber | param[key] = [val] |
| 1197 | 1 | tkerber | elif key in float_keys or key in exp_keys: |
| 1198 | 1 | tkerber | param[key] = float(val)
|
| 1199 | 1 | tkerber | elif key in list_keys or key in string_keys or key in input_keys: |
| 1200 | 1 | tkerber | param[key] = val |
| 1201 | 1 | tkerber | elif key in int_keys: |
| 1202 | 1 | tkerber | param[key] = int(val)
|
| 1203 | 1 | tkerber | elif key in bool_keys: |
| 1204 | 1 | tkerber | param[key] = bool(val)
|
| 1205 | 1 | tkerber | setattr(self.owner, self.attrname, param) |
| 1206 | 1 | tkerber | |
| 1207 | 1 | tkerber | def set_param(self, param): |
| 1208 | 1 | tkerber | if param["xc"] is not None: |
| 1209 | 1 | tkerber | for i, x in enumerate(self.xc_list): |
| 1210 | 1 | tkerber | if x == param["xc"]: |
| 1211 | 1 | tkerber | self.xc.set_active(i)
|
| 1212 | 1 | tkerber | if isinstance(param["vdw_correction_hirshfeld"],bool): |
| 1213 | 1 | tkerber | self.TS.set_active(param["vdw_correction_hirshfeld"]) |
| 1214 | 1 | tkerber | if self.periodic and param["k_grid"] is not None: |
| 1215 | 1 | tkerber | self.kpts[0].value = int(param["k_grid"][0]) |
| 1216 | 1 | tkerber | self.kpts[1].value = int(param["k_grid"][1]) |
| 1217 | 1 | tkerber | self.kpts[2].value = int(param["k_grid"][2]) |
| 1218 | 1 | tkerber | if param["spin"] is not None: |
| 1219 | 1 | tkerber | self.spinpol.set_active(param["spin"] == "collinear") |
| 1220 | 1 | tkerber | if param["charge"] is not None: |
| 1221 | 1 | tkerber | self.charge.value = param["charge"] |
| 1222 | 1 | tkerber | if param["relativistic"] is not None: |
| 1223 | 1 | tkerber | if isinstance(param["relativistic"],(tuple,list)): |
| 1224 | 1 | tkerber | rel = param["relativistic"]
|
| 1225 | 1 | tkerber | else:
|
| 1226 | 1 | tkerber | rel = param["relativistic"].split()
|
| 1227 | 1 | tkerber | for i, x in enumerate(self.aims_relativity_list): |
| 1228 | 1 | tkerber | if x == rel[0]: |
| 1229 | 1 | tkerber | self.relativity_type.set_active(i)
|
| 1230 | 1 | tkerber | if x == 'zora': |
| 1231 | 1 | tkerber | self.relativity_threshold.set_text(rel[2]) |
| 1232 | 1 | tkerber | self.relativity_threshold.set_sensitive(True) |
| 1233 | 1 | tkerber | if param["sc_accuracy_etot"] is not None: |
| 1234 | 1 | tkerber | self.sc_tot_energy.value = param["sc_accuracy_etot"] |
| 1235 | 1 | tkerber | if param["sc_accuracy_eev"] is not None: |
| 1236 | 1 | tkerber | self.sc_sum_eigenvalue.value = param["sc_accuracy_eev"] |
| 1237 | 1 | tkerber | if param["sc_accuracy_rho"] is not None: |
| 1238 | 1 | tkerber | self.sc_density.value = param["sc_accuracy_rho"] |
| 1239 | 1 | tkerber | if param["compute_forces"] is not None: |
| 1240 | 1 | tkerber | if param["compute_forces"]: |
| 1241 | 1 | tkerber | if param["sc_accuracy_forces"] is not None: |
| 1242 | 1 | tkerber | self.sc_forces.value = param["sc_accuracy_forces"] |
| 1243 | 1 | tkerber | self.compute_forces.set_active(param["compute_forces"]) |
| 1244 | 1 | tkerber | else:
|
| 1245 | 1 | tkerber | self.compute_forces.set_active(False) |
| 1246 | 1 | tkerber | if param["run_command"] is not None: |
| 1247 | 1 | tkerber | self.run_command.set_text(param["run_command"]) |
| 1248 | 1 | tkerber | if param["species_dir"] is not None: |
| 1249 | 1 | tkerber | self.species_defaults.set_text(param["species_dir"]) |
| 1250 | 1 | tkerber | for (key,val) in param.items(): |
| 1251 | 1 | tkerber | if key in self.aims_keyword_list and key not in self.aims_keyword_gui_list: |
| 1252 | 1 | tkerber | if val is not None: # = existing "expert keyword" |
| 1253 | 1 | tkerber | if key == 'output': # 'output' can be used more than once |
| 1254 | 1 | tkerber | options = val |
| 1255 | 1 | tkerber | if isinstance(options,str): options = [options] |
| 1256 | 1 | tkerber | for arg in options: |
| 1257 | 1 | tkerber | self.expert_keyword_create([key]+[arg])
|
| 1258 | 1 | tkerber | else:
|
| 1259 | 1 | tkerber | if isinstance(val,str): |
| 1260 | 1 | tkerber | arg = [key]+val.split() |
| 1261 | 1 | tkerber | elif isinstance(val,(tuple,list)): |
| 1262 | 1 | tkerber | arg = [key]+[str(a) for a in val] |
| 1263 | 1 | tkerber | else:
|
| 1264 | 1 | tkerber | arg = [key]+[str(val)]
|
| 1265 | 1 | tkerber | self.expert_keyword_create(arg)
|
| 1266 | 1 | tkerber | |
| 1267 | 1 | tkerber | def ok(self, *args): |
| 1268 | 1 | tkerber | self.set_attributes(*args)
|
| 1269 | 1 | tkerber | self.destroy()
|
| 1270 | 1 | tkerber | |
| 1271 | 1 | tkerber | def export_control(self, *args): |
| 1272 | 1 | tkerber | filename = "control.in"
|
| 1273 | 1 | tkerber | chooser = gtk.FileChooserDialog( |
| 1274 | 1 | tkerber | 'Export parameters ... ', None, gtk.FILE_CHOOSER_ACTION_SAVE, |
| 1275 | 1 | tkerber | (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, |
| 1276 | 1 | tkerber | gtk.STOCK_SAVE, gtk.RESPONSE_OK)) |
| 1277 | 1 | tkerber | chooser.set_filename(filename) |
| 1278 | 1 | tkerber | save = chooser.run() |
| 1279 | 1 | tkerber | if save == gtk.RESPONSE_OK or save == gtk.RESPONSE_SAVE: |
| 1280 | 1 | tkerber | filename = chooser.get_filename() |
| 1281 | 1 | tkerber | self.set_attributes(*args)
|
| 1282 | 1 | tkerber | param = getattr(self.owner, "aims_parameters") |
| 1283 | 1 | tkerber | from ase.calculators.aims import Aims |
| 1284 | 1 | tkerber | calc_temp = Aims(**param) |
| 1285 | 1 | tkerber | atoms_temp = self.owner.atoms.copy()
|
| 1286 | 1 | tkerber | atoms_temp.set_calculator(calc_temp) |
| 1287 | 1 | tkerber | atoms_temp.calc.write_control(file = filename) |
| 1288 | 1 | tkerber | atoms_temp.calc.write_species(file = filename) |
| 1289 | 1 | tkerber | chooser.destroy() |
| 1290 | 1 | tkerber | |
| 1291 | 1 | tkerber | def import_control(self, *args): |
| 1292 | 1 | tkerber | filename = "control.in"
|
| 1293 | 1 | tkerber | chooser = gtk.FileChooserDialog( |
| 1294 | 1 | tkerber | 'Import control.in file ... ', None, gtk.FILE_CHOOSER_ACTION_SAVE, |
| 1295 | 1 | tkerber | (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, |
| 1296 | 1 | tkerber | gtk.STOCK_SAVE, gtk.RESPONSE_OK)) |
| 1297 | 1 | tkerber | chooser.set_filename(filename) |
| 1298 | 1 | tkerber | save = chooser.run() |
| 1299 | 1 | tkerber | if save == gtk.RESPONSE_OK:
|
| 1300 | 1 | tkerber | self.set_defaults()
|
| 1301 | 1 | tkerber | filename = chooser.get_filename() |
| 1302 | 1 | tkerber | control = open(filename,'r') |
| 1303 | 1 | tkerber | while True: |
| 1304 | 1 | tkerber | line = control.readline() |
| 1305 | 1 | tkerber | if not line: |
| 1306 | 1 | tkerber | break
|
| 1307 | 1 | tkerber | if "List of parameters used to initialize the calculator:" in line: |
| 1308 | 1 | tkerber | control.readline() |
| 1309 | 1 | tkerber | from ase.io.aims import read_aims_calculator |
| 1310 | 1 | tkerber | calc = read_aims_calculator(control) |
| 1311 | 1 | tkerber | found_aims_calculator = True
|
| 1312 | 1 | tkerber | control.close() |
| 1313 | 1 | tkerber | if found_aims_calculator:
|
| 1314 | 1 | tkerber | param = calc.float_params |
| 1315 | 1 | tkerber | for key in calc.exp_params: |
| 1316 | 1 | tkerber | param[key] = calc.exp_params[key] |
| 1317 | 1 | tkerber | for key in calc.string_params: |
| 1318 | 1 | tkerber | param[key] = calc.string_params[key] |
| 1319 | 1 | tkerber | for key in calc.int_params: |
| 1320 | 1 | tkerber | param[key] = calc.int_params[key] |
| 1321 | 1 | tkerber | for key in calc.bool_params: |
| 1322 | 1 | tkerber | param[key] = calc.bool_params[key] |
| 1323 | 1 | tkerber | for key in calc.list_params: |
| 1324 | 1 | tkerber | param[key] = calc.list_params[key] |
| 1325 | 1 | tkerber | for key in calc.input_parameters: |
| 1326 | 1 | tkerber | param[key] = calc.input_parameters[key] |
| 1327 | 1 | tkerber | self.set_defaults()
|
| 1328 | 1 | tkerber | self.set_param(param)
|
| 1329 | 1 | tkerber | chooser.destroy() |
| 1330 | 1 | tkerber | |
| 1331 | 1 | tkerber | def k_changed(self, *args): |
| 1332 | 1 | tkerber | size = [self.kpts[i].value * np.sqrt(np.vdot(self.ucell[i],self.ucell[i])) for i in range(3)] |
| 1333 | 1 | tkerber | self.kpts_label.set_text(self.kpts_label_format % tuple(size)) |
| 1334 | 1 | tkerber | |
| 1335 | 1 | tkerber | def compute_forces_toggled(self, *args): |
| 1336 | 1 | tkerber | self.sc_forces_spin.set_sensitive(self.compute_forces.get_active()) |
| 1337 | 1 | tkerber | |
| 1338 | 1 | tkerber | def relativity_changed(self, *args): |
| 1339 | 1 | tkerber | self.relativity_threshold.set_sensitive(self.relativity_type.get_active() == 2) |
| 1340 | 1 | tkerber | |
| 1341 | 1 | tkerber | def expert_keyword_import(self, *args): |
| 1342 | 1 | tkerber | command = self.expert_keyword_set.get_text().split()
|
| 1343 | 1 | tkerber | if len(command) > 0 and command[0] in self.aims_keyword_list and not command[0] in self.aims_keyword_gui_list: |
| 1344 | 1 | tkerber | self.expert_keyword_create(command)
|
| 1345 | 1 | tkerber | elif command[0] in self.aims_keyword_gui_list: |
| 1346 | 1 | tkerber | oops("Please use the facilities provided in this window to manipulate "+
|
| 1347 | 1 | tkerber | "the keyword:" + command[0] + "!") |
| 1348 | 1 | tkerber | else:
|
| 1349 | 1 | tkerber | oops("Don't know this keyword:" + command[0] |
| 1350 | 1 | tkerber | + "\nPlease check!\n\n"
|
| 1351 | 1 | tkerber | + "If you really think it should be available, "
|
| 1352 | 1 | tkerber | + "please add it to the top of ase/calculators/aims.py.")
|
| 1353 | 1 | tkerber | self.expert_keyword_set.set_text("") |
| 1354 | 1 | tkerber | |
| 1355 | 1 | tkerber | def expert_keyword_create(self, command): |
| 1356 | 1 | tkerber | key = command[0]
|
| 1357 | 1 | tkerber | argument = command[1]
|
| 1358 | 1 | tkerber | if len(command) > 2: |
| 1359 | 1 | tkerber | for a in command[2:]: |
| 1360 | 1 | tkerber | argument += ' '+a
|
| 1361 | 1 | tkerber | index = len(self.expert_keywords) |
| 1362 | 1 | tkerber | self.expert_keywords += [[gtk.Label(" " +key+" "), |
| 1363 | 1 | tkerber | gtk.Entry(max=45),
|
| 1364 | 1 | tkerber | ExpertDeleteButton(index), |
| 1365 | 1 | tkerber | True]]
|
| 1366 | 1 | tkerber | self.expert_keywords[index][1].set_text(argument) |
| 1367 | 1 | tkerber | self.expert_keywords[index][2].connect('clicked',self.expert_keyword_delete) |
| 1368 | 1 | tkerber | pack(self.expert_vbox, [self.expert_keywords[index][0], |
| 1369 | 1 | tkerber | self.expert_keywords[index][1], |
| 1370 | 1 | tkerber | self.expert_keywords[index][2]]) |
| 1371 | 1 | tkerber | |
| 1372 | 1 | tkerber | def expert_keyword_delete(self, button, *args): |
| 1373 | 1 | tkerber | index = button.index # which one to kill
|
| 1374 | 1 | tkerber | for i in [0,1,2]: |
| 1375 | 1 | tkerber | self.expert_keywords[index][i].destroy()
|
| 1376 | 1 | tkerber | self.expert_keywords[index][3] = False |
| 1377 | 1 | tkerber | |
| 1378 | 1 | tkerber | |
| 1379 | 1 | tkerber | class ExpertDeleteButton(gtk.Button): |
| 1380 | 1 | tkerber | def __init__(self, index): |
| 1381 | 1 | tkerber | gtk.Button.__init__(self, stock=gtk.STOCK_DELETE)
|
| 1382 | 1 | tkerber | alignment = self.get_children()[0] |
| 1383 | 1 | tkerber | hbox = alignment.get_children()[0]
|
| 1384 | 1 | tkerber | image, label = hbox.get_children() |
| 1385 | 1 | tkerber | if image is not None: |
| 1386 | 1 | tkerber | label.set_text('')
|
| 1387 | 1 | tkerber | self.index = index
|
| 1388 | 1 | tkerber | |
| 1389 | 1 | tkerber | |
| 1390 | 1 | tkerber | class VASP_Window(gtk.Window): |
| 1391 | 1 | tkerber | vasp_xc_list = ['PW91', 'PBE', 'LDA'] |
| 1392 | 1 | tkerber | vasp_xc_default = 'PBE'
|
| 1393 | 1 | tkerber | vasp_prec_default = 'Normal'
|
| 1394 | 1 | tkerber | def __init__(self, owner, param, attrname): |
| 1395 | 1 | tkerber | self.owner = owner
|
| 1396 | 1 | tkerber | self.attrname = attrname
|
| 1397 | 1 | tkerber | atoms = owner.atoms |
| 1398 | 1 | tkerber | self.periodic = atoms.get_pbc().all()
|
| 1399 | 1 | tkerber | self.vasp_keyword_gui_list = ['ediff','encut', 'ismear', 'ispin', 'prec', 'sigma'] |
| 1400 | 1 | tkerber | from ase.calculators.vasp import float_keys,exp_keys,string_keys,int_keys,bool_keys,list_keys,special_keys |
| 1401 | 1 | tkerber | self.vasp_keyword_list = float_keys+exp_keys+string_keys+int_keys+bool_keys+list_keys+special_keys
|
| 1402 | 1 | tkerber | self.expert_keywords = []
|
| 1403 | 1 | tkerber | natoms = len(atoms)
|
| 1404 | 1 | tkerber | gtk.Window.__init__(self)
|
| 1405 | 1 | tkerber | self.set_title("VASP parameters") |
| 1406 | 1 | tkerber | vbox = gtk.VBox() |
| 1407 | 1 | tkerber | # Print some info
|
| 1408 | 1 | tkerber | txt = "%i atoms.\n" % (natoms)
|
| 1409 | 1 | tkerber | self.ucell = atoms.get_cell()
|
| 1410 | 1 | tkerber | txt += "Periodic geometry, unit cell is: \n"
|
| 1411 | 1 | tkerber | for i in range(3): |
| 1412 | 1 | tkerber | txt += "(%8.3f %8.3f %8.3f)\n" % (self.ucell[i][0], self.ucell[i][1], self.ucell[i][2]) |
| 1413 | 1 | tkerber | pack(vbox, [gtk.Label(txt)]) |
| 1414 | 1 | tkerber | |
| 1415 | 1 | tkerber | # XC functional ()
|
| 1416 | 1 | tkerber | self.xc = gtk.combo_box_new_text()
|
| 1417 | 1 | tkerber | for i, x in enumerate(self.vasp_xc_list): |
| 1418 | 1 | tkerber | self.xc.append_text(x)
|
| 1419 | 1 | tkerber | if x == self.vasp_xc_default: |
| 1420 | 1 | tkerber | self.xc.set_active(i)
|
| 1421 | 1 | tkerber | |
| 1422 | 1 | tkerber | # Spin polarized
|
| 1423 | 1 | tkerber | self.spinpol = gtk.CheckButton("Spin polarized") |
| 1424 | 1 | tkerber | |
| 1425 | 1 | tkerber | pack(vbox, [gtk.Label("Exchange-correlation functional: "),
|
| 1426 | 1 | tkerber | self.xc,
|
| 1427 | 1 | tkerber | gtk.Label(" "),
|
| 1428 | 1 | tkerber | self.spinpol])
|
| 1429 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 1430 | 1 | tkerber | |
| 1431 | 1 | tkerber | # k-grid
|
| 1432 | 1 | tkerber | self.kpts = []
|
| 1433 | 1 | tkerber | self.kpts_spin = []
|
| 1434 | 1 | tkerber | for i in range(3): |
| 1435 | 1 | tkerber | default = np.ceil(20.0 / np.sqrt(np.vdot(self.ucell[i],self.ucell[i]))) |
| 1436 | 1 | tkerber | g = gtk.Adjustment(default, 1, 100, 1) |
| 1437 | 1 | tkerber | s = gtk.SpinButton(g, 0, 0) |
| 1438 | 1 | tkerber | self.kpts.append(g)
|
| 1439 | 1 | tkerber | self.kpts_spin.append(s)
|
| 1440 | 1 | tkerber | g.connect("value-changed", self.k_changed) |
| 1441 | 1 | tkerber | |
| 1442 | 1 | tkerber | # Precision of calculation
|
| 1443 | 1 | tkerber | self.prec = gtk.combo_box_new_text()
|
| 1444 | 1 | tkerber | for i, x in enumerate(['Low', 'Normal', 'Accurate']): |
| 1445 | 1 | tkerber | self.prec.append_text(x)
|
| 1446 | 1 | tkerber | if x == self.vasp_prec_default: |
| 1447 | 1 | tkerber | self.prec.set_active(i)
|
| 1448 | 1 | tkerber | |
| 1449 | 1 | tkerber | # cutoff energy
|
| 1450 | 1 | tkerber | if os.environ.has_key('VASP_PP_PATH'): |
| 1451 | 1 | tkerber | self.encut_min_default, self.encut_max_default = self.get_min_max_cutoff() |
| 1452 | 1 | tkerber | else:
|
| 1453 | 1 | tkerber | self.encut_max_default = 400.0 |
| 1454 | 1 | tkerber | self.encut_min_default = 100.0 |
| 1455 | 1 | tkerber | self.encut = gtk.Adjustment(self.encut_max_default, 0, 9999, 10) |
| 1456 | 1 | tkerber | self.encut_spin = gtk.SpinButton(self.encut, 0, 0) |
| 1457 | 1 | tkerber | self.encut_spin.set_digits(2) |
| 1458 | 1 | tkerber | self.encut_spin.connect("value-changed",self.check_encut_warning) |
| 1459 | 1 | tkerber | self.encut_warning = gtk.Label("") |
| 1460 | 1 | tkerber | |
| 1461 | 1 | tkerber | pack(vbox, [gtk.Label("k-points k = ("), self.kpts_spin[0], |
| 1462 | 1 | tkerber | gtk.Label(", "), self.kpts_spin[1], gtk.Label(", "), |
| 1463 | 1 | tkerber | self.kpts_spin[2], |
| 1464 | 1 | tkerber | gtk.Label(") Cutoff: "),self.encut_spin, |
| 1465 | 1 | tkerber | gtk.Label(" Precision: "),self.prec]) |
| 1466 | 1 | tkerber | self.kpts_label = gtk.Label("") |
| 1467 | 1 | tkerber | self.kpts_label_format = "k-points x size: (%.1f, %.1f, %.1f) Å " |
| 1468 | 1 | tkerber | pack(vbox, [self.kpts_label, self.encut_warning]) |
| 1469 | 1 | tkerber | self.k_changed()
|
| 1470 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 1471 | 1 | tkerber | |
| 1472 | 1 | tkerber | self.ismear = gtk.combo_box_new_text()
|
| 1473 | 1 | tkerber | for x in ['Fermi', 'Gauss', 'Methfessel-Paxton']: |
| 1474 | 1 | tkerber | self.ismear.append_text(x)
|
| 1475 | 1 | tkerber | self.ismear.set_active(2) |
| 1476 | 1 | tkerber | self.smearing_order = gtk.Adjustment(2,0,9,1) |
| 1477 | 1 | tkerber | self.smearing_order_spin = gtk.SpinButton(self.smearing_order,0,0) |
| 1478 | 1 | tkerber | self.smearing_order_spin.set_digits(0) |
| 1479 | 1 | tkerber | self.ismear.connect("changed", self.check_ismear_changed) |
| 1480 | 1 | tkerber | self.sigma = gtk.Adjustment(0.1, 0.001, 9.0, 0.1) |
| 1481 | 1 | tkerber | self.sigma_spin = gtk.SpinButton(self.sigma,0,0) |
| 1482 | 1 | tkerber | self.sigma_spin.set_digits(3) |
| 1483 | 1 | tkerber | pack(vbox, [gtk.Label("Smearing: "),
|
| 1484 | 1 | tkerber | self.ismear,
|
| 1485 | 1 | tkerber | gtk.Label(" order: "),
|
| 1486 | 1 | tkerber | self.smearing_order_spin,
|
| 1487 | 1 | tkerber | gtk.Label(" width: "),
|
| 1488 | 1 | tkerber | self.sigma_spin])
|
| 1489 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 1490 | 1 | tkerber | |
| 1491 | 1 | tkerber | self.ediff = gtk.Adjustment(1e-4, 1e-6, 1e0, 1e-4) |
| 1492 | 1 | tkerber | self.ediff_spin = gtk.SpinButton(self.ediff, 0, 0) |
| 1493 | 1 | tkerber | self.ediff_spin.set_digits(6) |
| 1494 | 1 | tkerber | pack(vbox,[gtk.Label("Self-consistency convergence: "),
|
| 1495 | 1 | tkerber | self.ediff_spin,
|
| 1496 | 1 | tkerber | gtk.Label(" eV")])
|
| 1497 | 1 | tkerber | pack(vbox,gtk.Label(""))
|
| 1498 | 1 | tkerber | |
| 1499 | 1 | tkerber | self.expert_keyword_set = gtk.Entry(max = 55) |
| 1500 | 1 | tkerber | self.expert_keyword_add = gtk.Button(stock = gtk.STOCK_ADD)
|
| 1501 | 1 | tkerber | self.expert_keyword_add.connect("clicked", self.expert_keyword_import) |
| 1502 | 1 | tkerber | self.expert_keyword_set.connect("activate", self.expert_keyword_import) |
| 1503 | 1 | tkerber | pack(vbox,[gtk.Label("Additional keywords: "),
|
| 1504 | 1 | tkerber | self.expert_keyword_set,
|
| 1505 | 1 | tkerber | self.expert_keyword_add])
|
| 1506 | 1 | tkerber | self.expert_vbox = gtk.VBox()
|
| 1507 | 1 | tkerber | pack(vbox, self.expert_vbox)
|
| 1508 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 1509 | 1 | tkerber | |
| 1510 | 1 | tkerber | # run command and location of POTCAR files:
|
| 1511 | 1 | tkerber | pack(vbox, gtk.Label('VASP execution command: '))
|
| 1512 | 1 | tkerber | self.run_command = pack(vbox, gtk.Entry(max=0)) |
| 1513 | 1 | tkerber | if os.environ.has_key('VASP_COMMAND'): |
| 1514 | 1 | tkerber | self.run_command.set_text(os.environ['VASP_COMMAND']) |
| 1515 | 1 | tkerber | pack(vbox, gtk.Label('Directory for species defaults: '))
|
| 1516 | 1 | tkerber | self.pp_path = pack(vbox, gtk.Entry(max=0)) |
| 1517 | 1 | tkerber | if os.environ.has_key('VASP_PP_PATH'): |
| 1518 | 1 | tkerber | self.pp_path.set_text(os.environ['VASP_PP_PATH']) |
| 1519 | 1 | tkerber | |
| 1520 | 1 | tkerber | # Buttons at the bottom
|
| 1521 | 1 | tkerber | pack(vbox, gtk.Label(""))
|
| 1522 | 1 | tkerber | butbox = gtk.HButtonBox() |
| 1523 | 1 | tkerber | export_vasp_but = gtk.Button("Export VASP files")
|
| 1524 | 1 | tkerber | export_vasp_but.connect("clicked", self.export_vasp_files) |
| 1525 | 1 | tkerber | cancel_but = gtk.Button(stock=gtk.STOCK_CANCEL) |
| 1526 | 1 | tkerber | cancel_but.connect('clicked', lambda widget: self.destroy()) |
| 1527 | 1 | tkerber | ok_but = gtk.Button(stock=gtk.STOCK_OK) |
| 1528 | 1 | tkerber | ok_but.connect('clicked', self.ok) |
| 1529 | 1 | tkerber | butbox.pack_start(export_vasp_but, 0, 0) |
| 1530 | 1 | tkerber | butbox.pack_start(cancel_but, 0, 0) |
| 1531 | 1 | tkerber | butbox.pack_start(ok_but, 0, 0) |
| 1532 | 1 | tkerber | butbox.show_all() |
| 1533 | 1 | tkerber | pack(vbox, [butbox], end=True, bottom=True) |
| 1534 | 1 | tkerber | vbox.show() |
| 1535 | 1 | tkerber | self.add(vbox)
|
| 1536 | 1 | tkerber | self.show()
|
| 1537 | 1 | tkerber | self.grab_add() # Lock all other windows |
| 1538 | 1 | tkerber | |
| 1539 | 1 | tkerber | def set_attributes(self, *args): |
| 1540 | 1 | tkerber | self.param = {}
|
| 1541 | 1 | tkerber | self.param["xc"] = self.xc.get_active_text() |
| 1542 | 1 | tkerber | self.param["prec"] = self.prec.get_active_text() |
| 1543 | 1 | tkerber | self.param["kpts"] = (int(self.kpts[0].value), |
| 1544 | 1 | tkerber | int(self.kpts[1].value), |
| 1545 | 1 | tkerber | int(self.kpts[2].value)) |
| 1546 | 1 | tkerber | self.param["encut"] = self.encut.value |
| 1547 | 1 | tkerber | self.param["ediff"] = self.ediff.value |
| 1548 | 1 | tkerber | self.param["ismear"] = self.get_ismear() |
| 1549 | 1 | tkerber | self.param["sigma"] = self.sigma.value |
| 1550 | 1 | tkerber | if self.spinpol.get_active(): |
| 1551 | 1 | tkerber | self.param["ispin"] = 2 |
| 1552 | 1 | tkerber | else:
|
| 1553 | 1 | tkerber | self.param["ispin"] = 1 |
| 1554 | 1 | tkerber | from ase.calculators.vasp import float_keys,exp_keys,string_keys,int_keys,bool_keys,list_keys,special_keys |
| 1555 | 1 | tkerber | for option in self.expert_keywords: |
| 1556 | 1 | tkerber | if option[3]: # set type of parameter accoding to which list it is in |
| 1557 | 1 | tkerber | key = option[0].get_text().strip()
|
| 1558 | 1 | tkerber | val = option[1].get_text().strip()
|
| 1559 | 1 | tkerber | if key in float_keys or key in exp_keys: |
| 1560 | 1 | tkerber | self.param[key] = float(val) |
| 1561 | 1 | tkerber | elif key in list_keys or key in string_keys: |
| 1562 | 1 | tkerber | self.param[key] = val
|
| 1563 | 1 | tkerber | elif key in int_keys: |
| 1564 | 1 | tkerber | self.param[key] = int(val) |
| 1565 | 1 | tkerber | elif key in bool_keys: |
| 1566 | 1 | tkerber | self.param[key] = bool(val) |
| 1567 | 1 | tkerber | setattr(self.owner, self.attrname, self.param) |
| 1568 | 1 | tkerber | os.environ['VASP_COMMAND'] = self.run_command.get_text() |
| 1569 | 1 | tkerber | os.environ['VASP_PP_PATH'] = self.pp_path.get_text() |
| 1570 | 1 | tkerber | |
| 1571 | 1 | tkerber | def ok(self, *args): |
| 1572 | 1 | tkerber | self.set_attributes(*args)
|
| 1573 | 1 | tkerber | self.destroy()
|
| 1574 | 1 | tkerber | |
| 1575 | 1 | tkerber | def get_min_max_cutoff(self, *args): |
| 1576 | 1 | tkerber | # determine the recommended energy cutoff limits
|
| 1577 | 1 | tkerber | from ase.calculators.vasp import Vasp |
| 1578 | 1 | tkerber | calc_temp = Vasp() |
| 1579 | 1 | tkerber | atoms_temp = self.owner.atoms.copy()
|
| 1580 | 1 | tkerber | calc_temp.initialize(atoms_temp) |
| 1581 | 1 | tkerber | calc_temp.write_potcar(suffix = '.check_energy_cutoff')
|
| 1582 | 1 | tkerber | enmin = -1e6
|
| 1583 | 1 | tkerber | enmax = -1e6
|
| 1584 | 1 | tkerber | for line in open("POTCAR.check_energy_cutoff",'r').readlines(): |
| 1585 | 1 | tkerber | if "ENMIN" in line: |
| 1586 | 1 | tkerber | enmax = max(enmax,float(line.split()[2].split(';')[0])) |
| 1587 | 1 | tkerber | enmin = max(enmin,float(line.split()[5])) |
| 1588 | 1 | tkerber | from os import system |
| 1589 | 1 | tkerber | system("rm POTCAR.check_energy_cutoff")
|
| 1590 | 1 | tkerber | return enmin, enmax
|
| 1591 | 1 | tkerber | |
| 1592 | 1 | tkerber | def k_changed(self, *args): |
| 1593 | 1 | tkerber | size = [self.kpts[i].value * np.sqrt(np.vdot(self.ucell[i],self.ucell[i])) for i in range(3)] |
| 1594 | 1 | tkerber | self.kpts_label.set_text(self.kpts_label_format % tuple(size)) |
| 1595 | 1 | tkerber | |
| 1596 | 1 | tkerber | def check_encut_warning(self,*args): |
| 1597 | 1 | tkerber | if self.encut.value < self.encut_min_default: |
| 1598 | 1 | tkerber | self.encut_warning.set_markup("<b>WARNING:</b> cutoff energy is lower than recommended minimum!") |
| 1599 | 1 | tkerber | else:
|
| 1600 | 1 | tkerber | self.encut_warning.set_markup("") |
| 1601 | 1 | tkerber | |
| 1602 | 1 | tkerber | def check_ismear_changed(self,*args): |
| 1603 | 1 | tkerber | if self.ismear.get_active_text() == 'Methfessel-Paxton': |
| 1604 | 1 | tkerber | self.smearing_order_spin.set_sensitive(True) |
| 1605 | 1 | tkerber | else:
|
| 1606 | 1 | tkerber | self.smearing_order_spin.set_sensitive(False) |
| 1607 | 1 | tkerber | |
| 1608 | 1 | tkerber | def get_ismear(self,*args): |
| 1609 | 1 | tkerber | type = self.ismear.get_active_text()
|
| 1610 | 1 | tkerber | if type == 'Methfessel-Paxton': |
| 1611 | 1 | tkerber | ismear_value = self.smearing_order.value
|
| 1612 | 1 | tkerber | elif type == 'Fermi': |
| 1613 | 1 | tkerber | ismear_value = -1
|
| 1614 | 1 | tkerber | else:
|
| 1615 | 1 | tkerber | ismear_value = 0
|
| 1616 | 1 | tkerber | return ismear_value
|
| 1617 | 1 | tkerber | |
| 1618 | 1 | tkerber | def destroy(self): |
| 1619 | 1 | tkerber | self.grab_remove()
|
| 1620 | 1 | tkerber | gtk.Window.destroy(self)
|
| 1621 | 1 | tkerber | |
| 1622 | 1 | tkerber | def export_vasp_files(self, *args): |
| 1623 | 1 | tkerber | filename = ""
|
| 1624 | 1 | tkerber | chooser = gtk.FileChooserDialog( |
| 1625 | 1 | tkerber | 'Export VASP input files: choose directory ... ',
|
| 1626 | 1 | tkerber | None, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
|
| 1627 | 1 | tkerber | (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, |
| 1628 | 1 | tkerber | gtk.STOCK_SAVE, gtk.RESPONSE_OK)) |
| 1629 | 1 | tkerber | chooser.set_filename(filename) |
| 1630 | 1 | tkerber | save = chooser.run() |
| 1631 | 1 | tkerber | if save == gtk.RESPONSE_OK or save == gtk.RESPONSE_SAVE: |
| 1632 | 1 | tkerber | filename = chooser.get_filename() |
| 1633 | 1 | tkerber | from os import chdir |
| 1634 | 1 | tkerber | chdir(filename) |
| 1635 | 1 | tkerber | self.set_attributes(*args)
|
| 1636 | 1 | tkerber | param = getattr(self.owner, "vasp_parameters") |
| 1637 | 1 | tkerber | from ase.calculators.vasp import Vasp |
| 1638 | 1 | tkerber | calc_temp = Vasp(**param) |
| 1639 | 1 | tkerber | atoms_temp = self.owner.atoms.copy()
|
| 1640 | 1 | tkerber | atoms_temp.set_calculator(calc_temp) |
| 1641 | 1 | tkerber | calc_temp.initialize(atoms_temp) |
| 1642 | 1 | tkerber | calc_temp.write_incar(atoms_temp) |
| 1643 | 1 | tkerber | calc_temp.write_potcar() |
| 1644 | 1 | tkerber | calc_temp.write_kpoints() |
| 1645 | 1 | tkerber | calc_temp.write_sort_file() |
| 1646 | 1 | tkerber | from ase.io.vasp import write_vasp |
| 1647 | 1 | tkerber | write_vasp('POSCAR', calc_temp.atoms_sorted, symbol_count = calc_temp.symbol_count)
|
| 1648 | 1 | tkerber | chooser.destroy() |
| 1649 | 1 | tkerber | |
| 1650 | 1 | tkerber | def expert_keyword_import(self, *args): |
| 1651 | 1 | tkerber | command = self.expert_keyword_set.get_text().split()
|
| 1652 | 1 | tkerber | if len(command) > 0 and command[0] in self.vasp_keyword_list and not command[0] in self.vasp_keyword_gui_list: |
| 1653 | 1 | tkerber | self.expert_keyword_create(command)
|
| 1654 | 1 | tkerber | elif command[0] in self.vasp_keyword_gui_list: |
| 1655 | 1 | tkerber | oops("Please use the facilities provided in this window to manipulate "+
|
| 1656 | 1 | tkerber | "the keyword: " + command[0] + "!") |
| 1657 | 1 | tkerber | else:
|
| 1658 | 1 | tkerber | oops("Don't know this keyword: " + command[0] |
| 1659 | 1 | tkerber | + "\nPlease check!\n\n"
|
| 1660 | 1 | tkerber | + "If you really think it should be available, "
|
| 1661 | 1 | tkerber | + "please add it to the top of ase/calculators/vasp.py.")
|
| 1662 | 1 | tkerber | self.expert_keyword_set.set_text("") |
| 1663 | 1 | tkerber | |
| 1664 | 1 | tkerber | def expert_keyword_create(self, command): |
| 1665 | 1 | tkerber | key = command[0]
|
| 1666 | 1 | tkerber | if command[1] == "=": |
| 1667 | 1 | tkerber | command.remove("=")
|
| 1668 | 1 | tkerber | argument = command[1]
|
| 1669 | 1 | tkerber | if len(command) > 2: |
| 1670 | 1 | tkerber | for a in command[2:]: |
| 1671 | 1 | tkerber | argument += ' '+a
|
| 1672 | 1 | tkerber | index = len(self.expert_keywords) |
| 1673 | 1 | tkerber | self.expert_keywords += [[gtk.Label(" " +key+" = "), |
| 1674 | 1 | tkerber | gtk.Entry(max=45),
|
| 1675 | 1 | tkerber | ExpertDeleteButton(index), |
| 1676 | 1 | tkerber | True]]
|
| 1677 | 1 | tkerber | self.expert_keywords[index][1].set_text(argument) |
| 1678 | 1 | tkerber | self.expert_keywords[index][2].connect('clicked',self.expert_keyword_delete) |
| 1679 | 1 | tkerber | pack(self.expert_vbox, [self.expert_keywords[index][0], |
| 1680 | 1 | tkerber | self.expert_keywords[index][1], |
| 1681 | 1 | tkerber | self.expert_keywords[index][2]]) |
| 1682 | 1 | tkerber | |
| 1683 | 1 | tkerber | def expert_keyword_delete(self, button, *args): |
| 1684 | 1 | tkerber | index = button.index # which one to kill
|
| 1685 | 1 | tkerber | for i in [0,1,2]: |
| 1686 | 1 | tkerber | self.expert_keywords[index][i].destroy()
|
| 1687 | 1 | tkerber | self.expert_keywords[index][3] = False |