def get_veff(ks, cell=None, dm=None, dm_last=0, vhf_last=0, hermi=1, kpts=None, kpts_band=None): """ Coulomb + XC functional + (Hubbard - double counting) for KUKSpU. """ if cell is None: cell = ks.cell if dm is None: dm = ks.make_rdm1() if kpts is None: kpts = ks.kpts # J + V_xc vxc = kuks.get_veff(ks, cell=cell, dm=dm, dm_last=dm_last, vhf_last=vhf_last, hermi=hermi, kpts=kpts, kpts_band=kpts_band) # V_U C_ao_lo = ks.C_ao_lo ovlp = ks.get_ovlp() nkpts = len(kpts) nlo = C_ao_lo.shape[-1] rdm1_lo = np.zeros((2, nkpts, nlo, nlo), dtype=np.complex128) for s in range(2): for k in range(nkpts): C_inv = np.dot(C_ao_lo[s, k].conj().T, ovlp[k]) rdm1_lo[s, k] = mdot(C_inv, dm[s][k], C_inv.conj().T) E_U = 0.0 weight = 1.0 / nkpts logger.info(ks, "-" * 79) with np.printoptions(precision=5, suppress=True, linewidth=1000): for idx, val, lab in zip(ks.U_idx, ks.U_val, ks.U_lab): lab_string = " " for l in lab: lab_string += "%9s" %(l.split()[-1]) lab_sp = lab[0].split() logger.info(ks, "local rdm1 of atom %s: ", " ".join(lab_sp[:2]) + " " + lab_sp[2][:2]) U_mesh = np.ix_(idx, idx) for s in range(2): P_loc = 0.0 for k in range(nkpts): S_k = ovlp[k] C_k = C_ao_lo[s, k][:, idx] P_k = rdm1_lo[s, k][U_mesh] SC = np.dot(S_k, C_k) vxc[s, k] += mdot(SC, (np.eye(P_k.shape[-1]) - P_k * 2.0) * (val * 0.5), SC.conj().T) E_U += (val * 0.5) * (P_k.trace() - np.dot(P_k, P_k).trace()) P_loc += P_k P_loc = P_loc.real / nkpts logger.info(ks, "spin %s\n%s\n%s", s, lab_string, P_loc) logger.info(ks, "-" * 79) E_U *= weight if E_U.real < 0.0 and all(np.asarray(ks.U_val) > 0): logger.warn(ks, "E_U (%s) is negative...", E_U.real) vxc = lib.tag_array(vxc, E_U=E_U) return vxc
def get_veff(ks, cell=None, dm=None, dm_last=0, vhf_last=0, hermi=1, kpts=None, kpts_band=None): if getattr(dm, 'mo_coeff', None) is not None: mo_coeff = dm.mo_coeff mo_occ_a = [(x > 0).astype(np.double) for x in dm.mo_occ] mo_occ_b = [(x ==2).astype(np.double) for x in dm.mo_occ] dm = lib.tag_array(dm, mo_coeff=(mo_coeff,mo_coeff), mo_occ=(mo_occ_a,mo_occ_b)) return kuks.get_veff(ks, cell, dm, dm_last, vhf_last, hermi, kpts, kpts_band)