コード例 #1
0
ファイル: df.py プロジェクト: cyniu220/pyscf
 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)
コード例 #2
0
ファイル: fft.py プロジェクト: pulkin/pyscf
    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)
コード例 #3
0
ファイル: df.py プロジェクト: cyniu220/pyscf
 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
コード例 #4
0
    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
コード例 #5
0
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]))
コード例 #6
0
ファイル: df_jk.py プロジェクト: pulkin/pyscf
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)