Beispiel #1
0
    def _get_estimated_strains(self):
        t_max = 1500
        t_step = 10
        t_min = 0

        cell = self.get_cell()
        lattice = cell.lattice

        if self._sampling_mesh is None:
            self._sampling_mesh = klength2mesh(self._grid_spacing, lattice)
            self._is_gamma_center = True

        phonons = [task.get_phonon() for task in self._all_tasks[2:5]]
        if None in phonons:
            self._log += ("[quasiharmonic_phonon]\n"
                          "Phonon calculation failed in mode Gruneisen "
                          "parameter calculation.\n")
            self._status = "phonon_for_gruneisen_failed"
            return []

        if phonons[0].set_mesh(self._sampling_mesh, self._is_gamma_center):
            self._imaginary_ratio = self._check_imaginary(phonons[0], lattice)
        else:
            self._log += ("[quasiharmonic_phonon]\n"
                          "Phonon calculation failed in mode Gruneisen "
                          "parameter calculation.\n")
            self._status = "phonon_for_gruneisen_failed"
            return []

        if self._imaginary_ratio > 0.01:
            self._log += ("[quasiharmonic_phonon]\n"
                          "Imaginary modes are found in one point phonon "
                          "calculation.\n")
            self._status = "imaginary_modes"
            return []

        gruneisen = PhonopyGruneisen(phonons[1], phonons[0], phonons[2])

        if not gruneisen.set_mesh(self._sampling_mesh,
                                  is_gamma_center=self._is_gamma_center):
            self._log += ("[quasiharmonic_phonon]\n"
                          "Phonon calculation failed in mode Gruneisen "
                          "parameter calculation.\n")
            self._status = "phonon_for_gruneisen_failed"
            return []

        vol = np.linalg.det(lattice)
        volumes = [vol * (1 + strain) for strain in _eos_strains]
        eos = self._all_tasks[1].get_equation_of_state()
        energies = [eos(v) for v in volumes]

        with open("estimated_e-v.dat", 'w') as w:
            w.write("#   cell volume        energy of cell "
                    "other than phonon\n")
            for e, v in zip(energies, volumes):
                w.write("%20.13f %20.13f\n" % (v, e))

        gruneisen.set_thermal_properties(volumes,
                                         t_step=t_step,
                                         t_max=t_max + t_step * 3.5,
                                         t_min=t_min,
                                         cutoff_frequency=0.1)
        gruneisen.write_yaml_thermal_properties(
            filename="estimated_thermal_props")
        gruneisen_tp = gruneisen.get_thermal_properties()
        thermal_properties = [tp.get_thermal_properties()
                              for tp in gruneisen_tp.get_thermal_properties()]
        qha = self._get_quasiharmonic_phonon(energies,
                                             volumes,
                                             thermal_properties,
                                             t_max)

        if qha is None:
            self._log += ("[quasiharmonic_phonon]\n"
                          "Approximated QHA from mode Grunsein parameter "
                          "failed.\n")
            self._status = "strain_estimation_difficulty"
            return []

        equi_volumes = qha.get_volume_temperature()
        #           0K 1000K
        # |---|---|-o-|-o-|---|---|---|---|---|
        # 0   1   2   3   4   5   6   7   8   9
        #
        d_v = (equi_volumes[100] - equi_volumes[0])
        d_left = equi_volumes[0] - d_v * 2.5
        d_right = equi_volumes[100] + d_v * 5.5
        strains = [v / vol - 1 for v in np.linspace(d_left, d_right, 10)]
        return strains
Beispiel #2
0
 def _set_mesh(self, distance=100):
     self._mesh = klength2mesh(distance, self._lattice)