Exemplo n.º 1
0
    def set_thermal_displacements(self,
                                  t_step=10,
                                  t_max=1000,
                                  t_min=0,
                                  temperatures=None,
                                  direction=None,
                                  cutoff_frequency=None):
        """
        cutoff_frequency:
          phonon modes that have frequencies below cutoff_frequency
          are ignored.

        direction:
          Projection direction in reduced coordinates (
        """
        self._thermal_displacements = None

        if self._mesh is not None:
            eigvecs = self._mesh.get_eigenvectors()
            mesh_nums = self._mesh.get_mesh_numbers()
            if eigvecs is None:
                print("Warning: Eigenvectors have to be calculated.")
                return False
            if np.prod(mesh_nums) != len(eigvecs):
                print("Warning: Sampling mesh must not be symmetrized.")
                return False

            iter_phonons = self._mesh
        else:
            if self._iter_mesh is not None:
                iter_phonons = self._iter_mesh
            else:
                print("Warning: \'set_mesh\' has to finish correctly "
                      "before \'set_thermal_displacements\'.")
                return False

        if direction is not None:
            projection_direction = np.dot(direction,
                                          self._primitive.get_cell())
            td = ThermalDisplacements(
                iter_phonons,
                self._primitive.get_masses(),
                projection_direction=projection_direction,
                cutoff_frequency=cutoff_frequency)
        else:
            td = ThermalDisplacements(iter_phonons,
                                      self._primitive.get_masses(),
                                      cutoff_frequency=cutoff_frequency)

        if temperatures is None:
            td.set_temperature_range(t_min, t_max, t_step)
        else:
            td.set_temperatures(temperatures)
        td.run()

        self._thermal_displacements = td
        return True
Exemplo n.º 2
0
 def _get_thermal_displacements(self, proj_dir):
     td = ThermalDisplacements(
         self._mesh_phonon,
         projection_direction=proj_dir,
         freq_min=self._fmin,
         freq_max=self._fmax,
     )
     td.temperatures = [self._T]
     td.run()
     return td.temperatures, td.thermal_displacements
Exemplo n.º 3
0
    def set_thermal_displacements( self,
                                   t_step=10,
                                   t_max=1000,
                                   t_min=0,
                                   projector=None,
                                   cutoff_eigenvalue=None ):
        """
        cutoff_eigenvalue:
          phonon modes that have frequencies below cutoff_eigenvalue
          are ignored.
          e.g. 0.1 (THz)
        """
        if self.__mesh==None:
            print "set_mesh has to be done before set_thermal_properties"
            sys.exit(1)
        if self.__mesh.get_eigenvectors() == None:
            print "Eigenvectors have to be calculated."
            sys.exit(1)

        td = ThermalDisplacements( self.__mesh.get_eigenvalues(),
                                   self.__mesh.get_eigenvectors(),
                                   self.__mesh.get_weights(),
                                   self.primitive.get_masses(),
                                   factor=self.factor,
                                   cutoff_eigenvalue=cutoff_eigenvalue )
        td.set_temperature_range( t_min, t_max, t_step )
        if not projector==None:
            td.project_eigenvectors( projector, self.primitive.get_cell() )
        td.set_thermal_displacements()
        
        self.__thermal_displacements = td
Exemplo n.º 4
0
 def _get_thermal_displacements(self, Q):
     td = ThermalDisplacements(self._mesh_phonon,
                               projection_direction=Q,
                               freq_min=self._fmin,
                               freq_max=self._fmax)
     td.set_temperatures([self._T])
     td.run()
     return td.get_thermal_displacements()
Exemplo n.º 5
0
    def set_thermal_displacements(self,
                                  t_step=10,
                                  t_max=1000,
                                  t_min=0,
                                  temperatures=None,
                                  direction=None,
                                  cutoff_frequency=None):
        """
        cutoff_frequency:
          phonon modes that have frequencies below cutoff_frequency
          are ignored.

        direction:
          Projection direction in reduced coordinates
        """
        self._thermal_displacements = None

        if self._mesh is None:
            print("Warning: \'set_mesh\' has to finish correctly "
                  "before \'set_thermal_displacements\'.")
            return False

        eigvecs = self._mesh.get_eigenvectors()
        frequencies = self._mesh.get_frequencies()
        mesh_nums = self._mesh.get_mesh_numbers()

        if self._mesh.get_eigenvectors() is None:
            print("Warning: Eigenvectors have to be calculated.")
            return False

        if np.prod(mesh_nums) != len(eigvecs):
            print("Warning: Sampling mesh must not be symmetrized.")
            return False

        td = ThermalDisplacements(frequencies,
                                  eigvecs,
                                  self._primitive.get_masses(),
                                  cutoff_frequency=cutoff_frequency)
        if temperatures is None:
            td.set_temperature_range(t_min, t_max, t_step)
        else:
            td.set_temperatures(temperatures)
        if direction is not None:
            td.project_eigenvectors(direction, self._primitive.get_cell())
        td.run()

        self._thermal_displacements = td
        return True
Exemplo n.º 6
0
 def _get_thermal_displacements(self, proj_dir):
     td = ThermalDisplacements(self._mesh_phonon,
                               projection_direction=proj_dir,
                               freq_min=self._fmin,
                               freq_max=self._fmax)
     td.set_temperatures([self._T])
     td.run()
     return td.get_thermal_displacements()
Exemplo n.º 7
0
    def set_thermal_displacements(self,
                                  t_step=10,
                                  t_max=1000,
                                  t_min=0,
                                  direction=None,
                                  cutoff_eigenvalue=None):
        """
        cutoff_eigenvalue:
          phonon modes that have frequencies below cutoff_eigenvalue
          are ignored.
          e.g. 0.1 (THz^2)

        direction:
          Projection direction in reduced coordinates
        """
        if self._mesh == None:
            print "set_mesh has to be done before set_thermal_properties"
            sys.exit(1)

        eigvecs = self._mesh.get_eigenvectors()
        frequencies = self._mesh.get_frequencies()
        mesh_nums = self._mesh.get_mesh_numbers()

        if self._mesh.get_eigenvectors() is None:
            print "Eigenvectors have to be calculated."
            sys.exit(1)

        if np.prod(mesh_nums) != len(eigvecs):
            print "Sampling mesh must not be symmetrized."
            sys.exit(1)

        td = ThermalDisplacements(frequencies,
                                  eigvecs,
                                  self._primitive.get_masses(),
                                  cutoff_eigenvalue=cutoff_eigenvalue)
        td.set_temperature_range(t_min, t_max, t_step)
        if direction is not None:
            td.project_eigenvectors(direction, self._primitive.get_cell())
        # td.run()
        td.run_mesh()

        self._thermal_displacements = td
Exemplo n.º 8
0
    def set_thermal_displacements(self,
                                  t_step=10,
                                  t_max=1000,
                                  t_min=0,
                                  direction=None,
                                  cutoff_eigenvalue=None):
        """
        cutoff_eigenvalue:
          phonon modes that have frequencies below cutoff_eigenvalue
          are ignored.
          e.g. 0.1 (THz^2)

        direction:
          Projection direction in reduced coordinates
        """
        if self._mesh==None:
            print "set_mesh has to be done before set_thermal_properties"
            sys.exit(1)

        eigvecs = self._mesh.get_eigenvectors()
        frequencies = self._mesh.get_frequencies()
        mesh_nums = self._mesh.get_mesh_numbers() 

        if self._mesh.get_eigenvectors() is None:
            print "Eigenvectors have to be calculated."
            sys.exit(1)
            
        if np.prod(mesh_nums) != len(eigvecs):
            print "Sampling mesh must not be symmetrized."
            sys.exit(1)

        td = ThermalDisplacements(frequencies,
                                  eigvecs,
                                  self._primitive.get_masses(),
                                  cutoff_eigenvalue=cutoff_eigenvalue)
        td.set_temperature_range(t_min, t_max, t_step)
        if direction is not None:
            td.project_eigenvectors(direction, self._primitive.get_cell())
        # td.run()
        td.run_mesh()

        self._thermal_displacements = td
Exemplo n.º 9
0
    def set_thermal_displacements(self,
                                  t_step=10,
                                  t_max=1000,
                                  t_min=0,
                                  temperatures=None,
                                  direction=None,
                                  freq_min=None,
                                  freq_max=None):
        """Prepare thermal displacements calculation

        Args:
            direction:
                Projection direction in reduced coordinates.
            freq_min: Phonons having frequency larger than this are included.
            freq_max: Phonons having frequency smaller than this are included.

        """
        self._thermal_displacements = None

        if self._mesh is not None:
            eigvecs = self._mesh.get_eigenvectors()
            mesh_nums = self._mesh.get_mesh_numbers()
            if eigvecs is None:
                print("Warning: Eigenvectors have to be calculated.")
                return False
            if np.prod(mesh_nums) != len(eigvecs):
                print("Warning: Sampling mesh must not be symmetrized.")
                return False

            iter_phonons = self._mesh
        else:
            if self._iter_mesh is not None:
                iter_phonons = self._iter_mesh
            else:
                print("Warning: \'set_mesh\' has to finish correctly "
                      "before \'set_thermal_displacements\'.")
                return False

        if direction is not None:
            projection_direction = np.dot(direction,
                                          self._primitive.get_cell())
            td = ThermalDisplacements(
                iter_phonons,
                self._primitive.get_masses(),
                projection_direction=projection_direction,
                freq_min=freq_min,
                freq_max=freq_max)
        else:
            td = ThermalDisplacements(iter_phonons,
                                      self._primitive.get_masses(),
                                      freq_min=freq_min,
                                      freq_max=freq_max)

        if temperatures is None:
            td.set_temperature_range(t_min, t_max, t_step)
        else:
            td.set_temperatures(temperatures)
        td.run()

        self._thermal_displacements = td
        return True