def has_kpts(self, kpts): if kpts is None: return True else: kpts = numpy.asarray(kpts).reshape(-1,3) if self.kpts_band is None: return all((len(member(kpt, self.kpts))>0) for kpt in kpts) else: return all((len(member(kpt, self.kpts))>0 or len(member(kpt, self.kpts_band))>0) for kpt in kpts)
def aoR_loop(self, gs=None, kpts=None, kpts_band=None): cell = self.cell if gs is None: gs = self.gs self.gs = gs if kpts is None: kpts = self.kpts self.kpts = kpts if kpts_band is None: for k in range(len(kpts)): yield k, self.atomic_orbitals[k] else: where = [member(k, kpts) for k in kpts_band] where = [k_id[0] if len(k_id) > 0 else None for k_id in where] new_kpts = [k for k, w in zip(kpts_band, where) if w is None] coords = cell.gen_uniform_grids(gs) if len(new_kpts) > 0: new_ao = iter( self._numint.eval_ao(cell, coords, new_kpts, non0tab=self._numint.non0tab)) aoR = (self.atomic_orbitals[where[k]] if not where[k] is None else next(new_ao) for k in range(len(kpts_band))) if kpts_band.ndim == 1: yield 0, next(aoR) else: for k in range(len(kpts_band)): yield k, next(aoR)
def __enter__(self): self.feri = h5py.File(self.cderi, 'r') kpti_kptj = numpy.asarray(self.kpti_kptj) kptij_lst = self.feri['%s-kptij'%self.label].value k_id = member(kpti_kptj, kptij_lst) if len(k_id) > 0: dat = self.feri['%s/%d' % (self.label,k_id[0])] else: # swap ki,kj due to the hermiticity kptji = kpti_kptj[[1,0]] k_id = member(kptji, kptij_lst) if len(k_id) == 0: raise RuntimeError('%s for kpts %s is not initialized.\n' 'Reset attribute .kpts then call ' '.build() to initialize %s.' % (self.label, kpti_kptj, self.label)) dat = self.feri['%s/%d' % (self.label, k_id[0])] dat = _load_and_unpack(dat) return dat
def build(self, j_only=None, with_j3c=True, kpts_band=None): if self.kpts_band is not None: self.kpts_band = numpy.reshape(self.kpts_band, (-1, 3)) if kpts_band is not None: kpts_band = numpy.reshape(kpts_band, (-1, 3)) if self.kpts_band is None: self.kpts_band = kpts_band else: self.kpts_band = unique( numpy.vstack((self.kpts_band, kpts_band)))[0] self.check_sanity() self.dump_flags() self.auxcell = make_modrho_basis(self.cell, self.auxbasis, self.eta) if self.kpts_band is None: kpts = self.kpts kband_uniq = numpy.zeros((0, 3)) else: kpts = self.kpts kband_uniq = [ k for k in self.kpts_band if len(member(k, kpts)) == 0 ] if j_only is None: j_only = self._j_only if j_only: kall = numpy.vstack([kpts, kband_uniq]) kptij_lst = numpy.hstack((kall, kall)).reshape(-1, 2, 3) else: kptij_lst = [(ki, kpts[j]) for i, ki in enumerate(kpts) for j in range(i + 1)] kptij_lst.extend([(ki, kj) for ki in kband_uniq for kj in kpts]) kptij_lst.extend([(ki, ki) for ki in kband_uniq]) kptij_lst = numpy.asarray(kptij_lst) if with_j3c: if isinstance(self._cderi_to_save, str): cderi = self._cderi_to_save if isinstance(self._cderi, str): logger.warn( self, 'Value of _cderi is ignored. DF ' 'integrals will be saved in file %s .', cderi) else: cderi = self._cderi_to_save.name self._cderi = cderi t1 = (time.clock(), time.time()) self._make_j3c(self.cell, self.auxcell, kptij_lst, cderi) t1 = logger.timer_debug1(self, 'j3c', *t1) return self
def _ewald_exxdiv_for_G0(cell, kpts, dms, vk, kpts_band=None): s = cell.pbc_intor('int1e_ovlp_sph', hermi=1, kpts=kpts) madelung = tools.pbc.madelung(cell, kpts) if kpts is None: for i, dm in enumerate(dms): vk[i] += madelung * reduce(numpy.dot, (s, dm, s)) elif numpy.shape(kpts) == (3, ): if kpts_band is None or is_zero(kpts_band - kpts): for i, dm in enumerate(dms): vk[i] += madelung * reduce(numpy.dot, (s, dm, s)) else: # kpts.shape == (*,3) if kpts_band is None: for k in range(len(kpts)): for i, dm in enumerate(dms): vk[i, k] += madelung * reduce(numpy.dot, (s[k], dm[k], s[k])) else: kpts_band = kpts_band.reshape(-1, 3) for k, kpt in enumerate(kpts): for kp in member(kpt, kpts_band): for i, dm in enumerate(dms): vk[i, kp] += madelung * reduce(numpy.dot, (s[k], dm[k], s[k]))
def _ewald_exxdiv_for_G0(cell, kpts, dms, vk, kpts_band=None): s = cell.pbc_intor('int1e_ovlp_sph', hermi=1, kpts=kpts) madelung = tools.pbc.madelung(cell, kpts) if kpts is None: for i,dm in enumerate(dms): vk[i] += madelung * reduce(numpy.dot, (s, dm, s)) elif numpy.shape(kpts) == (3,): if kpts_band is None or is_zero(kpts_band-kpts): for i,dm in enumerate(dms): vk[i] += madelung * reduce(numpy.dot, (s, dm, s)) else: # kpts.shape == (*,3) if kpts_band is None: for k in range(len(kpts)): for i,dm in enumerate(dms): vk[i,k] += madelung * reduce(numpy.dot, (s[k], dm[k], s[k])) else: kpts_band = kpts_band.reshape(-1,3) for k, kpt in enumerate(kpts): for kp in member(kpt, kpts_band): for i,dm in enumerate(dms): vk[i,kp] += madelung * reduce(numpy.dot, (s[k], dm[k], s[k])) logger.debug2(cell, 'Total energy shift = -1/2 * Nelec*madelung/cell.vol = %.12g', madelung*cell.nelectron * -.5)