def get_veff(ks, cell=None, dm=None, dm_last=0, vhf_last=0, hermi=1, kpts=None, kpts_band=None): '''Coulomb + XC functional for UKS. See pyscf/pbc/dft/uks.py :func:`get_veff` fore more details. ''' if cell is None: cell = ks.cell if dm is None: dm = ks.make_rdm1() if kpts is None: kpts = ks.kpts t0 = (time.clock(), time.time()) if ks.grids.coords is None: ks.grids.build() small_rho_cutoff = ks.small_rho_cutoff t0 = logger.timer(ks, 'setting up grids', *t0) else: small_rho_cutoff = 0 dm = np.asarray(dm) nao = dm.shape[-1] # ndim = 4 : dm.shape = (alpha_beta, nkpts, nao, nao) ground_state = (dm.ndim == 4 and kpts_band is None) nkpts = len(kpts) if hermi == 2: # because rho = 0 n, ks._exc, vx = 0, 0, 0 else: n, ks._exc, vx = ks._numint.nr_uks(cell, ks.grids, ks.xc, dm, 1, kpts, kpts_band) logger.debug(ks, 'nelec by numeric integration = %s', n) t0 = logger.timer(ks, 'vxc', *t0) hyb = ks._numint.hybrid_coeff(ks.xc, spin=(cell.spin>0)+1) if abs(hyb) < 1e-10: vj = ks.get_j(cell, dm, hermi, kpts, kpts_band) vhf = lib.asarray([vj[0]+vj[1]] * 2) else: vj, vk = ks.get_jk(cell, dm, hermi, kpts, kpts_band) vhf = pbcuhf._makevhf(vj, vk*hyb) if ground_state: ks._exc -= (np.einsum('Kij,Kji', dm[0], vk[0]) + np.einsum('Kij,Kji', dm[1], vk[1])).real * .5 * hyb * (1./nkpts) if ground_state: ks._ecoul = np.einsum('Kij,Kji', dm[0]+dm[1], vj[0]+vj[1]).real * .5 * (1./nkpts) if small_rho_cutoff > 1e-20 and ground_state: # Filter grids the first time setup grids idx = ks._numint.large_rho_indices(cell, dm, ks.grids, small_rho_cutoff, kpts) logger.debug(ks, 'Drop grids %d', ks.grids.weights.size - np.count_nonzero(idx)) ks.grids.coords = np.asarray(ks.grids.coords [idx], order='C') ks.grids.weights = np.asarray(ks.grids.weights[idx], order='C') ks._numint.non0tab = None return vhf + vx
def get_veff(ks, cell=None, dm=None, dm_last=0, vhf_last=0, hermi=1, kpts=None, kpt_band=None): '''Coulomb + XC functional for UKS. See pyscf/pbc/dft/uks.py :func:`get_veff` fore more details. ''' if cell is None: cell = ks.cell if dm is None: dm = ks.make_rdm1() if kpts is None: kpts = ks.kpts t0 = (time.clock(), time.time()) if ks.grids.coords is None: ks.grids.build() small_rho_cutoff = ks.small_rho_cutoff t0 = logger.timer(ks, 'setting up grids', *t0) else: small_rho_cutoff = 0 dm = np.asarray(dm) nao = dm.shape[-1] # ndim = 4 : dm.shape = (alpha_beta, nkpts, nao, nao) ground_state = (dm.ndim == 4 and kpt_band is None) nkpts = len(kpts) if hermi == 2: # because rho = 0 n, ks._exc, vx = 0, 0, 0 else: n, ks._exc, vx = ks._numint.nr_uks(cell, ks.grids, ks.xc, dm, 1, kpts, kpt_band) logger.debug(ks, 'nelec by numeric integration = %s', n) t0 = logger.timer(ks, 'vxc', *t0) hyb = ks._numint.hybrid_coeff(ks.xc, spin=(cell.spin>0)+1) if abs(hyb) < 1e-10: vj = ks.get_j(cell, dm, hermi, kpts, kpt_band) vhf = lib.asarray([vj[0]+vj[1]] * 2) else: vj, vk = ks.get_jk(cell, dm, hermi, kpts, kpt_band) vhf = pbcuhf._makevhf(vj, vk*hyb) if ground_state: ks._exc -= (np.einsum('Kij,Kji', dm[0], vk[0]) + np.einsum('Kij,Kji', dm[1], vk[1])).real * .5 * hyb * (1./nkpts) if ground_state: ks._ecoul = np.einsum('Kij,Kji', dm[0]+dm[1], vj[0]+vj[1]).real * .5 * (1./nkpts) if small_rho_cutoff > 1e-20 and ground_state: # Filter grids the first time setup grids idx = ks._numint.large_rho_indices(cell, dm, ks.grids, small_rho_cutoff, kpts) logger.debug(ks, 'Drop grids %d', ks.grids.weights.size - np.count_nonzero(idx)) ks.grids.coords = np.asarray(ks.grids.coords [idx], order='C') ks.grids.weights = np.asarray(ks.grids.weights[idx], order='C') ks._numint.non0tab = None return vhf + vx
def get_veff(ks, cell=None, dm=None, dm_last=0, vhf_last=0, hermi=1, kpt=None, kpt_band=None): '''Coulomb + XC functional for UKS. See pyscf/pbc/dft/uks.py :func:`get_veff` fore more details. ''' if cell is None: cell = ks.cell if dm is None: dm = ks.make_rdm1() if kpt is None: kpt = ks.kpt t0 = (time.clock(), time.time()) if ks.grids.coords is None: ks.grids.build(with_non0tab=True) small_rho_cutoff = ks.small_rho_cutoff t0 = logger.timer(ks, 'setting up grids', *t0) else: small_rho_cutoff = 0 if not isinstance(dm, numpy.ndarray): dm = numpy.asarray(dm) if dm.ndim == 2: # RHF DM dm = numpy.asarray((dm * .5, dm * .5)) if hermi == 2: # because rho = 0 n, ks._exc, vx = (0, 0), 0, 0 else: n, ks._exc, vx = ks._numint.nr_uks(cell, ks.grids, ks.xc, dm, 0, kpt, kpt_band) logger.debug(ks, 'nelec by numeric integration = %s', n) t0 = logger.timer(ks, 'vxc', *t0) # ndim = 3 : dm.shape = ([alpha,beta], nao, nao) ground_state = (dm.ndim == 3 and dm.shape[0] == 2) hyb = ks._numint.hybrid_coeff(ks.xc, spin=cell.spin) if abs(hyb) < 1e-10: vj = ks.get_j(cell, dm, hermi, kpt, kpt_band) vhf = lib.asarray([vj[0] + vj[1]] * 2) else: vj, vk = ks.get_jk(cell, dm, hermi, kpt, kpt_band) vhf = pbcuhf._makevhf(vj, vk * hyb) if ground_state: ks._exc -= (numpy.einsum('ij,ji', dm[0], vk[0]) + numpy.einsum('ij,ji', dm[1], vk[1])).real * .5 * hyb if ground_state: ks._ecoul = numpy.einsum('ij,ji', dm[0] + dm[1], vj[0] + vj[1]).real * .5 nelec = cell.nelec if (small_rho_cutoff > 1e-20 and ground_state and abs(n[0] - nelec[0]) < 0.01 * n[0] and abs(n[1] - nelec[1]) < 0.01 * n[1]): # Filter grids the first time setup grids idx = ks._numint.large_rho_indices(cell, dm, ks.grids, small_rho_cutoff, kpt) logger.debug(ks, 'Drop grids %d', ks.grids.weights.size - numpy.count_nonzero(idx)) ks.grids.coords = numpy.asarray(ks.grids.coords[idx], order='C') ks.grids.weights = numpy.asarray(ks.grids.weights[idx], order='C') ks.grids.non0tab = ks.grids.make_mask(cell, ks.grids.coords) return vhf + vx