예제 #1
0
    def _set_gruneisen(self):
        dV = self._volume_plus - self._volume_minus
        # dV1 = self._volume - self._volume_minus
        # dV2 = self._volume_plus - self._volume

        if self._is_band_connection:
            self._q_direction = self._qpoints[0] - self._qpoints[-1]

        dD = []
        # ddD = [] # For dg/dV
        eigvals = []
        for i, q in enumerate(self._qpoints):
            if (self._is_band_connection and self._dynmat.is_nac()):
                self._dynmat.set_dynamical_matrix(
                    q, q_direction=self._q_direction)
            else:
                self._dynmat.set_dynamical_matrix(q)

            dm = self._dynmat.get_dynamical_matrix()
            eigvals_at_q, eigvecs = np.linalg.eigh(dm)
            eigvals_at_q = eigvals_at_q.real

            dD_at_q = [
                np.vdot(
                    eig,
                    np.dot(
                        self._get_dD(q, self._dynmat_minus, self._dynmat_plus),
                        eig)).real for eig in eigvecs.T
            ]

            # dD_minus = self._get_dD(q, self._dynmat_minus, self._dynmat)
            # dD_plus = self._get_dD(q, self._dynmat, self._dynmat_plus)
            # ddD_at_q = [
            #     np.vdot(eig, np.dot(dD_plus / dV2 - dD_minus / dV1 , eig)).real
            #     for eig in eigvecs.T]

            if self._is_band_connection:
                if self._prev_eigvecs is not None:
                    self._band_order = estimate_band_connection(
                        self._prev_eigvecs, eigvecs, self._band_order)
                eigvals.append([eigvals_at_q[b] for b in self._band_order])
                dD.append([dD_at_q[b] for b in self._band_order])
                # ddD.append([ddD_at_q[b] for b in self._band_order])
                self._prev_eigvecs = eigvecs
            else:
                eigvals.append(eigvals_at_q)
                dD.append(dD_at_q)
                # ddD.append(ddD_at_q)

        dD = np.array(dD, dtype='double', order='C')
        # ddD = np.array(ddD, dtype='double', order='C')
        eigvals = np.array(eigvals, dtype='double', order='C')

        self._gruneisen = -dD / dV / eigvals * self._volume / 2
        # self._gamma_prime = -ddD / (dV / 2) / eigvals * self._volume ** 2 / 2
        self._eigenvalues = eigvals
예제 #2
0
파일: __init__.py 프로젝트: chueter/phonopy
    def _set_gruneisen(self):
        dV = self._volume_plus - self._volume_minus
        # dV1 = self._volume - self._volume_minus
        # dV2 = self._volume_plus - self._volume

        if self._is_band_connection:
            self._q_direction = self._qpoints[0] - self._qpoints[-1]

        dD = []
        # ddD = [] # For dg/dV
        eigvals = []
        for i, q in enumerate(self._qpoints):
            if (self._is_band_connection and
                self._dynmat.is_nac()):
                self._dynmat.set_dynamical_matrix(
                    q, q_direction=self._q_direction)
            else:
                self._dynmat.set_dynamical_matrix(q)

            dm = self._dynmat.get_dynamical_matrix()
            eigvals_at_q, eigvecs = np.linalg.eigh(dm)
            eigvals_at_q = eigvals_at_q.real

            dD_at_q = [np.vdot(eig, np.dot(
                self._get_dD(q, self._dynmat_minus, self._dynmat_plus), eig)
                           ).real for eig in eigvecs.T]

            # dD_minus = self._get_dD(q, self._dynmat_minus, self._dynmat)
            # dD_plus = self._get_dD(q, self._dynmat, self._dynmat_plus)
            # ddD_at_q = [
            #     np.vdot(eig, np.dot(dD_plus / dV2 - dD_minus / dV1 , eig)).real
            #     for eig in eigvecs.T]

            if self._is_band_connection:
                if self._prev_eigvecs is not None:
                    self._band_order = estimate_band_connection(
                        self._prev_eigvecs,
                        eigvecs,
                        self._band_order)
                eigvals.append([eigvals_at_q[b] for b in self._band_order])
                dD.append([dD_at_q[b] for b in self._band_order])
                # ddD.append([ddD_at_q[b] for b in self._band_order])
                self._prev_eigvecs = eigvecs
            else:
                eigvals.append(eigvals_at_q)
                dD.append(dD_at_q)
                # ddD.append(ddD_at_q)

        dD = np.array(dD, dtype='double', order='C')
        # ddD = np.array(ddD, dtype='double', order='C')
        eigvals = np.array(eigvals, dtype='double', order='C')
        
        self._gruneisen = -dD / dV / eigvals * self._volume / 2
        # self._gamma_prime = -ddD / (dV / 2) / eigvals * self._volume ** 2 / 2
        self._eigenvalues = eigvals
예제 #3
0
    def _set_band_connection(self):
        nqpoint, nband = self._frequencies.shape
        is_non_degenerate = np.all(self._degenerates == np.arange(nband), axis=1)
        connect_done = np.zeros(nqpoint, dtype='bool')
        start = np.where(is_non_degenerate)[0][0]

        while True:
            connect_done[start] = True
            neighbors = np.argsort(np.sum(np.abs(self._grid_address - self._grid_address[start]), axis=1))
            undone = np.extract(connect_done[neighbors]==False, neighbors)

            if not (len(undone) == 0 or (is_non_degenerate[undone] == False).all()):
                new = np.extract(is_non_degenerate[undone], undone)[0]
                new_neighbors = np.argsort(np.sum(np.abs(self._grid_address - self._grid_address[new]), axis=1))
                new_neighbor_done = np.extract(connect_done[new_neighbors], new_neighbors)[0]
                bo = estimate_band_connection(self._eigenvectors[new_neighbor_done],
                                              self._eigenvectors[new],
                                              np.arange(nband))
                if bo is not None:
                    self._frequencies[new] = (self._frequencies[new])[bo]
                    self._eigenvectors[new] = (self._eigenvectors[new].T)[bo].T
                    # Since all the phonons here are non-degenerate, the step is missed
                start = new

            else:
                break

        for new in undone:
            new_neighbors = np.argsort(np.sum(np.abs(self._grid_address - self._grid_address[new]), axis=1))
            new_neighbor_done = np.extract(connect_done[new_neighbors], new_neighbors)[0]
            deg = [np.where(self._degenerates[new] == j)[0] for j in np.unique(self._degenerates[new])]
            bo = estimate_band_connection(self._eigenvectors[new_neighbor_done],
                                          self._eigenvectors[new],
                                          np.arange(nband),
                                          degenerate_sets=deg)
            if bo is not None:
                self._frequencies[new] = (self._frequencies[new])[bo]
                self._eigenvectors[new] = (self._eigenvectors[new].T)[bo].T
                self._degenerates[new] = (self._degenerates[new])[bo].copy()
예제 #4
0
    def _set_gruneisen(self):
        dV = self._volume_plus - self._volume_minus

        if self._is_band_connection:
            self._q_direction = self._qpoints[0] - self._qpoints[-1]
            band_order = range(self._dynmat.get_dimension())
            prev_eigvecs = None

        edDe = [] # <e|dD|e>
        eigvals = []
        eigvecs = []
        for i, q in enumerate(self._qpoints):
            if self._is_band_connection and self._dynmat.is_nac():
                self._dynmat.set_dynamical_matrix(
                    q, q_direction=self._q_direction)
            else:
                self._dynmat.set_dynamical_matrix(q)

            dm = self._dynmat.get_dynamical_matrix()
            evals, evecs = np.linalg.eigh(dm)
            evals_at_q = evals.real
            dD = self._get_dD(q, self._dynmat_minus, self._dynmat_plus)
            evecs_at_q, edDe_at_q = rotate_eigenvectors(evals_at_q, evecs, dD)

            if self._is_band_connection:
                if prev_eigvecs is not None:
                    band_order = estimate_band_connection(
                        prev_eigvecs,
                        evecs_at_q,
                        band_order)
                eigvals.append(evals_at_q[band_order])
                eigvecs.append(evecs_at_q[:, band_order])
                edDe.append(edDe_at_q[band_order])
                prev_eigvecs = evecs_at_q
            else:
                eigvals.append(evals_at_q)
                eigvecs.append(evecs_at_q)
                edDe.append(edDe_at_q)

        edDe = np.array(edDe, dtype='double', order='C')
        self._eigenvalues = np.array(eigvals, dtype='double', order='C')
        itemsize = self._eigenvalues.itemsize
        self._eigenvectors = np.array(eigvecs,
                                      dtype=("c%d" % (itemsize * 2)), order='C')
        self._gruneisen = -edDe / dV / self._eigenvalues * self._volume / 2
예제 #5
0
파일: core.py 프로젝트: ladyteam/phonopy
    def _set_gruneisen(self):
        if self._is_band_connection:
            self._q_direction = self._qpoints[0] - self._qpoints[-1]
            band_order = range(len(self._dynmat.primitive) * 3)
            prev_eigvecs = None

        edDe = []  # <e|dD|e>
        eigvals = []
        eigvecs = []
        for i, q in enumerate(self._qpoints):
            if self._is_band_connection and self._dynmat.is_nac():
                self._dynmat.run(q, q_direction=self._q_direction)
            else:
                self._dynmat.run(q)

            dm = self._dynmat.dynamical_matrix
            evals, evecs = np.linalg.eigh(dm)
            evals_at_q = evals.real
            dD = self._get_dD(q, self._dynmat_minus, self._dynmat_plus)
            evecs_at_q, edDe_at_q = rotate_eigenvectors(evals_at_q, evecs, dD)

            if self._is_band_connection:
                if prev_eigvecs is not None:
                    band_order = estimate_band_connection(
                        prev_eigvecs, evecs_at_q, band_order
                    )
                eigvals.append(evals_at_q[band_order])
                eigvecs.append(evecs_at_q[:, band_order])
                edDe.append(edDe_at_q[band_order])
                prev_eigvecs = evecs_at_q
            else:
                eigvals.append(evals_at_q)
                eigvecs.append(evecs_at_q)
                edDe.append(edDe_at_q)

        edDe = np.array(edDe, dtype="double", order="C")
        self._eigenvalues = np.array(eigvals, dtype="double", order="C")
        itemsize = self._eigenvalues.itemsize
        self._eigenvectors = np.array(
            eigvecs, dtype=("c%d" % (itemsize * 2)), order="C"
        )
        self._gruneisen = -edDe / self._delta_strain / self._eigenvalues / 2
예제 #6
0
    def _set_gruneisen(self):
        if self._is_band_connection:
            self._q_direction = self._qpoints[0] - self._qpoints[-1]
        dD = []
        eigvals = []
        for i, q in enumerate(self._qpoints):
            if (self._is_band_connection and
                self._dynmat.is_nac()):
                self._dynmat.set_dynamical_matrix(
                    q, q_direction=self._q_direction)
            else:
                self._dynmat.set_dynamical_matrix(q)

            dm = self._dynmat.get_dynamical_matrix()
            eigvals_at_q, eigvecs = np.linalg.eigh(dm)
            eigvals_at_q = eigvals_at_q.real
            dD_at_q = [np.vdot(eig, np.dot(self._get_dD(q), eig)).real
                       for eig in eigvecs.T]

            if self._is_band_connection:
                if self._prev_eigvecs is not None:
                    self._band_order = estimate_band_connection(
                        self._prev_eigvecs,
                        eigvecs,
                        self._band_order)
                eigvals.append([eigvals_at_q[b] for b in self._band_order])
                dD.append([dD_at_q[b] for b in self._band_order])
                self._prev_eigvecs = eigvecs
            else:
                eigvals.append(eigvals_at_q)
                dD.append(dD_at_q)

        dD = np.array(dD)
        eigvals = np.array(eigvals)
            
        self._gruneisen = -dD / eigvals * self._volume  / self._dV / 2
        self._eigenvalues = eigvals