def setylm(self): ''' Calculate the real spherical harmonics for a set of G-grid points up to LMAX. ''' lmax = np.max([p.proj_l.max() for p in self.pawpp]) self.ylm = [] for l in range(lmax + 1): self.ylm.append(sph_r(self.Gk, l))
def calc_rproj(self): ''' Nonlocal projector for each elements ''' self.rproj_atoms = [] for iatom in range(self.natoms): ntype = self.element_idx[iatom] pp = self.pawpp[ntype] # number of grid points in the sphere irmax = self.ion_grid_distance[iatom].shape[0] tmp = np.zeros((pp.lmmax, irmax)) rproj_ylm = [ sph_r(self.ion_grid_direction[iatom], l).T for l in range(pp.proj_l.max() + 1) ] # np.savetxt('pj.{}'.format(pp.symbol), np.c_[pp.proj_rgrid, pp.rprojs.T]) # xxx = np.zeros((pp.lmmax + 1, irmax)) # xxx[0] = self.ion_grid_distance[iatom] # ii = 1 iL = 0 for l, spl_r in zip(pp.proj_l, pp.spl_rproj): TLP1 = 2 * l + 1 rproj_radial = spl_r(self.ion_grid_distance[iatom]) tmp[iL:iL + TLP1, :] = rproj_radial * rproj_ylm[l] iL += TLP1 # xxx[ii] = rproj_radial # ii += 1 # np.savetxt('pj.csp.{}{}'.format(pp.symbol, iatom), xxx.T) # For reciprocal space projectors, the factor is sqrt(1 / Omega) tmp *= np.sqrt(self.atoms.get_volume()) self.rproj_atoms.append(tmp)