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
def _set_mesh(self, distance=100): self._mesh = klength2mesh(distance, self._lattice)