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
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
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()
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
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
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