def __init__(self, cell, kpts=numpy.zeros((1, 3))): self.cell = cell self.stdout = cell.stdout self.verbose = cell.verbose self.max_memory = cell.max_memory self.kpts = kpts # default is gamma point self.kpts_band = None self.auxbasis = None if cell.dimension == 0: self.eta = 0.2 self.gs = cell.gs else: ke_cutoff = tools.gs_to_cutoff(cell.lattice_vectors(), cell.gs) ke_cutoff = ke_cutoff[:cell.dimension].min() self.eta = min( aft.estimate_eta_for_ke_cutoff(cell, ke_cutoff, cell.precision), estimate_eta(cell, cell.precision)) ke_cutoff = aft.estimate_ke_cutoff_for_eta(cell, self.eta, cell.precision) self.gs = tools.cutoff_to_gs(cell.lattice_vectors(), ke_cutoff) self.gs[cell.dimension:] = cell.gs[cell.dimension:] # Not input options self.exxdiv = None # to mimic KRHF/KUHF object in function get_coulG self.auxcell = None self.blockdim = 240 self.linear_dep_threshold = LINEAR_DEP_THR self._j_only = False # If _cderi_to_save is specified, the 3C-integral tensor will be saved in this file. self._cderi_to_save = tempfile.NamedTemporaryFile(dir=lib.param.TMPDIR) # If _cderi is specified, the 3C-integral tensor will be read from this file self._cderi = None self._keys = set(self.__dict__.keys())
def __init__(self, cell, kpts=numpy.zeros((1, 3))): self.cell = cell self.stdout = cell.stdout self.verbose = cell.verbose self.max_memory = cell.max_memory self.kpts = kpts # default is gamma point self.kpts_band = None self._auxbasis = None # Search for optimized eta and mesh here. if cell.dimension == 0: self.eta = 0.2 self.mesh = cell.mesh else: ke_cutoff = tools.mesh_to_cutoff(cell.lattice_vectors(), cell.mesh) ke_cutoff = ke_cutoff[:cell.dimension].min() eta_cell = aft.estimate_eta_for_ke_cutoff(cell, ke_cutoff, cell.precision) eta_guess = estimate_eta(cell, cell.precision) if eta_cell < eta_guess: self.eta = eta_cell # TODO? Round off mesh to the nearest odd numbers. # Odd number of grids is preferred because even number of # grids may break the conjugation symmetry between the # k-points k and -k. #?self.mesh = [(n//2)*2+1 for n in cell.mesh] self.mesh = cell.mesh else: self.eta = eta_guess ke_cutoff = aft.estimate_ke_cutoff_for_eta( cell, self.eta, cell.precision) self.mesh = tools.cutoff_to_mesh(cell.lattice_vectors(), ke_cutoff) if cell.dimension < 2 or cell.low_dim_ft_type == 'inf_vacuum': self.mesh[cell.dimension:] = cell.mesh[cell.dimension:] # exp_to_discard to remove diffused fitting functions. The diffused # fitting functions may cause linear dependency in DF metric. Removing # the fitting functions whose exponents are smaller than exp_to_discard # can improve the linear dependency issue. However, this parameter # affects the quality of the auxiliary basis. The default value of # this parameter was set to 0.2 in v1.5.1 or older and was changed to # 0 since v1.5.2. self.exp_to_discard = cell.exp_to_discard # The following attributes are not input options. self.exxdiv = None # to mimic KRHF/KUHF object in function get_coulG self.auxcell = None self.blockdim = getattr(__config__, 'pbc_df_df_DF_blockdim', 240) self.linear_dep_threshold = LINEAR_DEP_THR self._j_only = False # If _cderi_to_save is specified, the 3C-integral tensor will be saved in this file. self._cderi_to_save = tempfile.NamedTemporaryFile(dir=lib.param.TMPDIR) # If _cderi is specified, the 3C-integral tensor will be read from this file self._cderi = None self._keys = set(self.__dict__.keys())
def __init__(self, cell, kpts=numpy.zeros((1,3))): self.cell = cell self.stdout = cell.stdout self.verbose = cell.verbose self.max_memory = cell.max_memory self.kpts = kpts # default is gamma point self.kpts_band = None self._auxbasis = None # Search for optimized eta and mesh here. if cell.dimension == 0: self.eta = 0.2 self.mesh = cell.mesh else: ke_cutoff = tools.mesh_to_cutoff(cell.lattice_vectors(), cell.mesh) ke_cutoff = ke_cutoff[:cell.dimension].min() eta_cell = aft.estimate_eta_for_ke_cutoff(cell, ke_cutoff, cell.precision) eta_guess = estimate_eta(cell, cell.precision) if eta_cell < eta_guess: self.eta = eta_cell # TODO? Round off mesh to the nearest odd numbers. # Odd number of grids is preferred because even number of # grids may break the conjugation symmetry between the # k-points k and -k. #?self.mesh = [(n//2)*2+1 for n in cell.mesh] self.mesh = cell.mesh else: self.eta = eta_guess ke_cutoff = aft.estimate_ke_cutoff_for_eta(cell, self.eta, cell.precision) self.mesh = tools.cutoff_to_mesh(cell.lattice_vectors(), ke_cutoff) if cell.dimension < 2 or cell.low_dim_ft_type == 'inf_vacuum': self.mesh[cell.dimension:] = cell.mesh[cell.dimension:] # exp_to_discard to remove diffused fitting functions. The diffused # fitting functions may cause linear dependency in DF metric. Removing # the fitting functions whose exponents are smaller than exp_to_discard # can improve the linear dependency issue. However, this parameter # affects the quality of the auxiliary basis. The default value of # this parameter was set to 0.2 in v1.5.1 or older and was changed to # 0 since v1.5.2. self.exp_to_discard = cell.exp_to_discard # The following attributes are not input options. self.exxdiv = None # to mimic KRHF/KUHF object in function get_coulG self.auxcell = None self.blockdim = getattr(__config__, 'pbc_df_df_DF_blockdim', 240) self.linear_dep_threshold = LINEAR_DEP_THR self._j_only = False # If _cderi_to_save is specified, the 3C-integral tensor will be saved in this file. self._cderi_to_save = tempfile.NamedTemporaryFile(dir=lib.param.TMPDIR) # If _cderi is specified, the 3C-integral tensor will be read from this file self._cderi = None self._keys = set(self.__dict__.keys())
def get_pbc_pvxp(cell, kpts=None): import numpy import copy import time from pyscf import lib from pyscf.lib import logger from pyscf.pbc import tools from pyscf.gto import mole from pyscf.pbc.df import ft_ao from pyscf.pbc.df import aft_jk from pyscf.pbc.df import aft if kpts is None: kpts_lst = numpy.zeros((1,3)) else: kpts_lst = numpy.reshape(kpts, (-1,3)) log = logger.Logger(cell.stdout, cell.verbose) t1 = t0 = (time.clock(), time.time()) mydf = aft.AFTDF(cell, kpts) mydf.eta = 0.2 ke_guess = aft.estimate_ke_cutoff_for_eta(cell, mydf.eta, cell.precision) mydf.mesh = tools.cutoff_to_mesh(cell.lattice_vectors(), ke_guess) log.debug('mydf.mesh %s', mydf.mesh) nkpts = len(kpts_lst) nao = cell.nao_nr() nao_pair = nao * (nao+1) // 2 Gv, Gvbase, kws = cell.get_Gv_weights(mydf.mesh) charge = -cell.atom_charges() # Apply Koseki effective charge? kpt_allow = numpy.zeros(3) coulG = tools.get_coulG(cell, kpt_allow, mesh=mydf.mesh, Gv=Gv) coulG *= kws if mydf.eta == 0: soc_mat = numpy.zeros((nkpts,3,nao*nao), dtype=numpy.complex128) SI = cell.get_SI(Gv) vG = numpy.einsum('i,ix->x', charge, SI) * coulG else: nuccell = copy.copy(cell) half_sph_norm = .5/numpy.sqrt(numpy.pi) norm = half_sph_norm/mole.gaussian_int(2, mydf.eta) chg_env = [mydf.eta, norm] ptr_eta = cell._env.size ptr_norm = ptr_eta + 1 chg_bas = [[ia, 0, 1, 1, 0, ptr_eta, ptr_norm, 0] for ia in range(cell.natm)] nuccell._atm = cell._atm nuccell._bas = numpy.asarray(chg_bas, dtype=numpy.int32) nuccell._env = numpy.hstack((cell._env, chg_env)) soc_mat = mydf._int_nuc_vloc(nuccell, kpts_lst, 'int3c2e_pvxp1_sph', aosym='s1', comp=3) soc_mat = numpy.asarray(soc_mat).reshape(nkpts,3,nao**2) t1 = log.timer_debug1('pnucp pass1: analytic int', *t1) aoaux = ft_ao.ft_ao(nuccell, Gv) vG = numpy.einsum('i,xi->x', charge, aoaux) * coulG max_memory = max(2000, mydf.max_memory-lib.current_memory()[0]) for aoaoks, p0, p1 in mydf.ft_loop(mydf.mesh, kpt_allow, kpts_lst, max_memory=max_memory, aosym='s1', intor='GTO_ft_pxp_sph', comp=3): for k, aoao in enumerate(aoaoks): aoao = aoao.reshape(3,-1,nao**2) if aft_jk.gamma_point(kpts_lst[k]): soc_mat[k] += numpy.einsum('k,ckx->cx', vG[p0:p1].real, aoao.real) soc_mat[k] += numpy.einsum('k,ckx->cx', vG[p0:p1].imag, aoao.imag) else: soc_mat[k] += numpy.einsum('k,ckx->cx', vG[p0:p1].conj(), aoao) t1 = log.timer_debug1('contracting pnucp', *t1) soc_mat_kpts = [] for k, kpt in enumerate(kpts_lst): if aft_jk.gamma_point(kpt): soc_mat_kpts.append(soc_mat[k].real.reshape(3,nao,nao)) else: soc_mat_kpts.append(soc_mat[k].reshape(3,nao,nao)) if kpts is None or numpy.shape(kpts) == (3,): soc_mat_kpts = soc_mat_kpts[0] return numpy.asarray(soc_mat_kpts)