Пример #1
0
 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
Пример #2
0
 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
Пример #3
0
    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
Пример #4
0
    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