def transform_wave_function(self, psit_G, k): """Transform wave function from IBZ to BZ. k is the index of the desired k-point in the full BZ.""" s = self.sym_k[k] time_reversal = self.time_reversal_k[k] op_cc = np.linalg.inv(self.symmetry.op_scc[s]).round().astype(int) # Identity if (np.abs(op_cc - np.eye(3, dtype=int)) < 1e-10).all(): if time_reversal: return psit_G.conj() else: return psit_G # Inversion symmetry elif (np.abs(op_cc + np.eye(3, dtype=int)) < 1e-10).all(): return psit_G.conj() # General point group symmetry else: ik = self.kibz_k[k] kibz_c = self.ibzk_kc[ik] kbz_c = self.bzk_kc[k] import _gpaw b_g = np.zeros_like(psit_G) if time_reversal: # assert abs(np.dot(op_cc, kibz_c) - -kbz_c) < tol _gpaw.symmetrize_wavefunction(psit_G, b_g, op_cc.copy(), kibz_c, -kbz_c) return b_g.conj() else: # assert abs(np.dot(op_cc, kibz_c) - kbz_c) < tol _gpaw.symmetrize_wavefunction(psit_G, b_g, op_cc.copy(), kibz_c, kbz_c) return b_g
def symmetrize_wavefunction(self, a_g, kibz_c, kbz_c, op_cc, time_reversal): """Generate Bloch function from symmetry related function in the IBZ. a_g: ndarray Array with Bloch function from the irreducible BZ. kibz_c: ndarray Corresponing k-point coordinates. kbz_c: ndarray K-point coordinates of the symmetry related k-point. op_cc: ndarray Point group operation connecting the two k-points. time-reversal: bool Time-reversal symmetry required in addition to the point group symmetry to connect the two k-points. """ # Identity if (np.abs(op_cc - np.eye(3, dtype=int)) < 1e-10).all(): if time_reversal: return a_g.conj() else: return a_g # Inversion symmetry elif (np.abs(op_cc + np.eye(3, dtype=int)) < 1e-10).all(): return a_g.conj() # General point group symmetry else: import _gpaw b_g = np.zeros_like(a_g) if time_reversal: # assert abs(np.dot(op_cc, kibz_c) - -kbz_c) < tol _gpaw.symmetrize_wavefunction(a_g, b_g, op_cc.T.copy(), kibz_c, -kbz_c) return b_g.conj() else: # assert abs(np.dot(op_cc, kibz_c) - kbz_c) < tol _gpaw.symmetrize_wavefunction(a_g, b_g, op_cc.T.copy(), kibz_c, kbz_c) return b_g
def transform_wave_function(self, psit_G, k, index_G=None, phase_G=None): """Transform wave function from IBZ to BZ. k is the index of the desired k-point in the full BZ. """ s = self.sym_k[k] time_reversal = self.time_reversal_k[k] op_cc = np.linalg.inv(self.symmetry.op_scc[s]).round().astype(int) # Identity if (np.abs(op_cc - np.eye(3, dtype=int)) < 1e-10).all(): if time_reversal: return psit_G.conj() else: return psit_G # General point group symmetry else: ik = self.bz2ibz_k[k] kibz_c = self.ibzk_kc[ik] b_g = np.zeros_like(psit_G) kbz_c = np.dot(self.symmetry.op_scc[s], kibz_c) if index_G is not None: assert index_G.shape == psit_G.shape == phase_G.shape,\ 'Shape mismatch %s vs %s vs %s' % (index_G.shape, psit_G.shape, phase_G.shape) _gpaw.symmetrize_with_index(psit_G, b_g, index_G, phase_G) else: _gpaw.symmetrize_wavefunction(psit_G, b_g, op_cc.copy(), np.ascontiguousarray(kibz_c), kbz_c) if time_reversal: return b_g.conj() else: return b_g