def _get_strained_cell_tasks(self, cell_orig): tasks = [] for i, cell in enumerate(get_strained_cells(cell_orig, self._strains)): tasks.append( self._get_equilibrium_task(index=1, cell=cell, max_iteration=3, min_iteration=1, directory="strain-%02d" % i)) return tasks
def _get_plus_minus_tasks(self, cell): cell_plus, cell_minus = get_strained_cells(cell, [0.01, -0.01]) plus = self._get_equilibrium_task(index=1, cell=cell_plus, max_iteration=3, min_iteration=1, directory="plus") minus = self._get_equilibrium_task(index=1, cell=cell_minus, max_iteration=3, min_iteration=1, directory="minus") return plus, minus
def _prepare_phonons(self): self._stage = 3 self._status = "phonons" if self._supercell_matrix is None: self._supercell_matrix = estimate_supercell_matrix( cell, max_num_atoms=self._max_num_atoms) if self._estimate_strain: self._strains = self._get_estimated_strains() cell = self.get_cell() cells = get_strained_cells(cell, self._strains) tasks = self._get_phonon_tasks(cells) self._all_tasks += tasks self._tasks = tasks
def next(self): if self._stage == 0: # Equilibrium if self._status == "next": if self._estimate_strain: self._prepare_electric_eos() return self._tasks else: self._prepare_phonons() return self._tasks elif (self._status == "terminate" and self._traverse == "restart"): self._traverse = False self._set_stage0() return self._tasks elif self._stage == 1: # EoS if self._status == "next": if self._estimate_strain: self._prepare_mode_gruneisen() return self._tasks elif (self._status == "terminate" and self._traverse == "restart"): self._traverse = False self._prepare_electric_eos() return self._tasks elif self._stage == 2: # Mode Gruneisen if self._status == "next": self._prepare_phonons() if self._tasks: return self._tasks elif (self._status == "terminate" and self._traverse == "restart"): self._traverse = False terminated = [] for i, task in enumerate(self._tasks): if task.get_status() == "terminate": terminated.append(i) cells = [task.get_cell() for task in self._all_tasks[1].get_all_tasks()[2:5]] tasks = self._get_phonon_tasks(cells, is_cell_relaxed=True) self._tasks = [] for i in terminated: self._tasks.append(tasks[i]) self._all_tasks[i + 2] = tasks[i] self._status = "mode_gruneisen" return self._tasks else: # QHA if self._status == "next": if self._calculate_quasiharmonic_phonon(): self._status = "done" else: self._status = "terminate" elif (self._status == "terminate" and self._traverse == "restart"): self._traverse = False terminated = [] for i, task in enumerate(self._tasks): if task.get_status() == "terminate": terminated.append(i) if len(terminated) > 0: self._tasks = [] cells = get_strained_cells(self.get_cell(), self._strains) tasks = self._get_phonon_tasks(cells) for i in terminated: self._tasks.append(tasks[i]) if self._estimate_strain: self._all_tasks[i + 5] = tasks[i] else: self._all_tasks[i + 2] = tasks[i] self._status = "phonons" return self._tasks self._tasks = [] self._write_yaml() raise StopIteration