def __init__(self, parent, flow, **kwargs): """ Args: parent: Parent window. flow: `AbinitFlow` with the list of `Workflow` objects. """ if "title" not in kwargs: kwargs["title"] = self.codename super(FlowViewerFrame, self).__init__(parent, -1, **kwargs) # This combination of options for config seems to work on my Mac. self.config = wx.FileConfig(appName=self.codename, localFilename=self.codename + ".ini", style=wx.CONFIG_USE_LOCAL_FILE) # Build menu, toolbar and status bar. self.SetMenuBar(self.makeMenu()) self.makeToolBar() self.statusbar = self.CreateStatusBar() self.Centre() self.flow = flow # Disable launch mode if we already executing the flow with the scheduler. self.check_launcher_file() # Build UI self.panel = panel = wx.Panel(self, -1) self.main_sizer = main_sizer = wx.BoxSizer(wx.VERTICAL) # Here we create a panel and a notebook on the panel self.notebook = FlowNotebook(panel, self.flow) main_sizer.Add(self.notebook, 1, wx.EXPAND, 5) submit_button = wx.Button(panel, -1, label='Submit') submit_button.Bind(wx.EVT_BUTTON, self.OnSubmitButton) text = wx.StaticText(panel, -1, "Max nlaunch:") text.Wrap(-1) text.SetToolTipString("Maximum number of tasks that can be submitted. Use -1 for unlimited launches.") self.max_nlaunch = wx.SpinCtrl(panel, -1, value=str(get_ncpus()), min=-1) hsizer = wx.BoxSizer(wx.HORIZONTAL) hsizer.Add(submit_button, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 5) hsizer.Add(text, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 5) hsizer.Add(self.max_nlaunch, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 5) main_sizer.Add(hsizer, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 5) panel.SetSizerAndFit(main_sizer) # Register this event when the GUI is IDLE # Not used anymore since the Yaml parser # is very slow when we use the pure python version. self.last_refresh = time.time()
def anacompare_phdos(self, nqsmalls, asr=2, chneut=1, dipdip=1, dos_method="tetra", ngqpt=None, num_cpus=None, stream=sys.stdout): """ Args: nqsmalls: List of integers defining the q-mesh for the DOS. Each integer gives the number of divisions to be used to sample the smallest reciprocal lattice vector. asr, chneut, dipdp: Anaddb input variable. See official documentation. dos_method: Technique for DOS computation in Possible choices: "tetra", "gaussian" or "gaussian:0.001 eV". In the later case, the value 0.001 eV is used as gaussian broadening ngqpt: Number of divisions for the q-mesh in the DDB file. Auto-detected if None (default) num_cpus: Number of CPUs (threads) used to parallellize the calculation of the DOSes. Autodetected if None. stream: File-like object used for printing. Return: `namedtuple` with the following attributes: phdoses: List of :class:`PhononDos` objects plotter: :class:`PhononDosPlotter` object. Use plotter.plot() to visualize the results. """ num_cpus = get_ncpus() if num_cpus is None else num_cpus if num_cpus <= 0: num_cpus = 1 num_cpus = min(num_cpus, len(nqsmalls)) # TODO: anaget_phdos def do_work(nqsmall): _, phdos_file = self.anaget_phbst_and_phdos_files( nqsmall=nqsmall, ndivsm=1, asr=asr, chneut=chneut, dipdip=dipdip, dos_method=dos_method, ngqpt=ngqpt) return phdos_file.phdos if num_cpus == 1: # Sequential version phdoses = [do_work(nqs) for nqs in nqsmalls] else: # Threads print("Computing %d phonon DOS with %d threads" % (len(nqsmalls), num_cpus) ) phdoses = [None] * len(nqsmalls) def worker(): while True: nqsm, phdos_index = q.get() phdos = do_work(nqsm) phdoses[phdos_index] = phdos q.task_done() from threading import Thread try: from Queue import Queue # py2k except ImportError: from queue import Queue # py3k q = Queue() for i in range(num_cpus): t = Thread(target=worker) t.daemon = True t.start() for i, nqsmall in enumerate(nqsmalls): q.put((nqsmall, i)) # block until all tasks are done q.join() # Compute relative difference wrt last phonon DOS. Be careful because the DOSes may be defined # on different frequency meshes ==> spline on the mesh of the last DOS. last_mesh, converged = phdoses[-1].mesh, False for i, phdos in enumerate(phdoses[:-1]): splined_dos = phdos.spline_on_mesh(last_mesh) abs_diff = (splined_dos - phdoses[-1]).abs() print(" Delta(Phdos[%d] - Phdos[%d]) / Phdos[%d]: %f" % (i, len(phdoses)-1, len(phdoses)-1, abs_diff.integral().values[-1]), file=stream) # Fill the plotter. plotter = PhononDosPlotter() for nqsmall, phdos in zip(nqsmalls, phdoses): plotter.add_phdos(label="nqsmall %d" % nqsmall, phdos=phdos) return dict2namedtuple(phdoses=phdoses, plotter=plotter)
def test_get_ncpus(self): self.assertEqual(get_ncpus(), multiprocessing.cpu_count())