def test_rotation_from_projection(rng): proj_nw = rng.rand(6, 4) assert orthonormality_error(proj_nw[:int(min(proj_nw.shape))]) > 1 U_ww, C_ul = rotation_from_projection(proj_nw, fixed=2, ortho=True) assert orthonormality_error(U_ww) < 1e-10, 'U_ww not unitary' assert orthogonality_error(C_ul.T) < 1e-10, 'C_ul columns not orthogonal' assert normalization_error(C_ul) < 1e-10, 'C_ul not normalized' U_ww, C_ul = rotation_from_projection(proj_nw, fixed=2, ortho=False) assert normalization_error(U_ww) < 1e-10, 'U_ww not normalized'
def initial_wannier(self, initialwannier, kpointgrid, fixedstates, edf, spin): """Initial guess for the shape of wannier functions. Use initial guess for wannier orbitals to determine rotation matrices U and C. """ if not self.wfs.gamma: raise NotImplementedError from ase.dft.wannier import rotation_from_projection proj_knw = self.get_projections(initialwannier, spin) U_ww, C_ul = rotation_from_projection(proj_knw[0], fixedstates[0], ortho=True) return [C_ul], U_ww[np.newaxis]
def initial_wannier(self, initialwannier, kpointgrid, fixedstates, edf, spin, nbands): """Initial guess for the shape of wannier functions. Use initial guess for wannier orbitals to determine rotation matrices U and C. """ from ase.dft.wannier import rotation_from_projection proj_knw = self.get_projections(initialwannier, spin) U_kww = [] C_kul = [] for fixed, proj_nw in zip(fixedstates, proj_knw): U_ww, C_ul = rotation_from_projection(proj_nw[:nbands], fixed, ortho=True) U_kww.append(U_ww) C_kul.append(C_ul) U_kww = np.asarray(U_kww) return C_kul, U_kww