def greens_e_vector_ip_rhf(cc, p): nocc, nvir = cc.t1.shape vector1 = np.zeros((nocc), dtype=complex) vector2 = np.zeros((nocc, nocc, nvir), dtype=complex) if hasattr(cc, 'l1') and cc.l1 is not None: l1 = cc.l1 l2 = cc.l2 else: l1 = cc.t1 l2 = cc.t2 if p < nocc: vector1[p] = -1.0 vector1 += np.einsum('ia,a->i', l1, cc.t1[p, :]) vector1 += 2 * np.einsum('ilcd,lcd->i', l2, cc.t2[p, :, :, :]) vector1 -= np.einsum('ilcd,ldc->i', l2, cc.t2[p, :, :, :]) vector2[p, :, :] += -2. * l1 vector2[:, p, :] += l1 vector2 += 2 * np.einsum('c,ijcb->ijb', cc.t1[p, :], l2) vector2 -= np.einsum('c,jicb->ijb', cc.t1[p, :], l2) else: vector1 += -l1[:, p - nocc] vector2 += -2 * l2[:, :, p - nocc, :] + l2[:, :, :, p - nocc] return eom_rccsd.amplitudes_to_vector_ip(vector1, vector2)
def ipccsd_diag(eom, imds=None): if imds is None: imds = eom.make_imds() t1, t2 = imds.t1, imds.t2 dtype = np.result_type(t1, t2) nocc, nvir = t1.shape fock = imds.eris.fock foo = fock[:nocc, :nocc] fvv = fock[nocc:, nocc:] Hr1 = -np.diag(imds.Loo) Hr2 = np.zeros((nocc, nocc, nvir), dtype) for i in range(nocc): for j in range(nocc): for b in range(nvir): if eom.partition == 'mp': Hr2[i, j, b] += fvv[b, b] Hr2[i, j, b] += -foo[i, i] Hr2[i, j, b] += -foo[j, j] else: Hr2[i, j, b] += imds.Lvv[b, b] Hr2[i, j, b] += -imds.Loo[i, i] Hr2[i, j, b] += -imds.Loo[j, j] Hr2[i, j, b] += imds.Woooo[i, j, i, j] Hr2[i, j, b] += 2 * imds.Wovvo[j, b, b, j] Hr2[i, j, b] += -imds.Wovvo[i, b, b, i] * (i == j) Hr2[i, j, b] += -imds.Wovov[j, b, j, b] Hr2[i, j, b] += -imds.Wovov[i, b, i, b] Hr2[i, j, b] += -2 * np.dot(imds.Woovv[j, i, b, :], t2[i, j, :, b]) Hr2[i, j, b] += np.dot(imds.Woovv[i, j, b, :], t2[i, j, :, b]) vector = amplitudes_to_vector_ip(Hr1, Hr2) return vector
def ipccsd_matvec(eom, vector, imds=None, diag=None): # Ref: Nooijen and Snijders, J. Chem. Phys. 102, 1681 (1995) Eqs.(8)-(9) if imds is None: imds = eom.make_imds() nocc = eom.nocc nmo = eom.nmo r1, r2 = vector_to_amplitudes_ip(vector, nmo, nocc) occ_act = np.arange(nocc) vir_act = np.arange(eom.nvir_act) i_act = np.ix_(occ_act) ija_act = np.ix_(occ_act, occ_act, vir_act) # 1h-1h block Hr1 = -np.einsum('ki,k->i', imds.Loo, r1) #1h-2h1p block Hr1 += 2 * np.einsum('ld,ild->i', imds.Fov, r2) Hr1 += -np.einsum('kd,kid->i', imds.Fov, r2) Hr1 += -2 * np.einsum('klid,kld->i', imds.Wooov, r2) Hr1 += np.einsum('lkid,kld->i', imds.Wooov, r2) # 2h1p-2h1p block # first, do a diagonal (MP) update fock = imds.eris.fock foo = fock[:nocc, :nocc] fvv = fock[nocc:, nocc:] FVV_DIAG = False if FVV_DIAG: Hr2 = lib.einsum('bb,ijb->ijb', fvv, r2) else: Hr2 = lib.einsum('bd,ijd->ijb', fvv, r2) Hr2 += -lib.einsum('ki,kjb->ijb', foo, r2) Hr2 += -lib.einsum('lj,ilb->ijb', foo, r2) # then zero out the internal amplitudes, to start over Hr2[ija_act] = 0. # now do a full update of internal amplitudes SYM = True if SYM: r2_in = np.zeros_like(r2) r2_in[ija_act] = np.copy(r2)[ija_act] else: r2_in = np.copy(r2) Hr2[ija_act] += lib.einsum('bd,ijd->ijb', imds.Lvv, r2_in)[ija_act] Hr2[ija_act] += -lib.einsum('ki,kjb->ijb', imds.Loo, r2_in)[ija_act] Hr2[ija_act] += -lib.einsum('lj,ilb->ijb', imds.Loo, r2_in)[ija_act] Hr2[ija_act] += lib.einsum('klij,klb->ijb', imds.Woooo, r2_in)[ija_act] Hr2[ija_act] += 2 * lib.einsum('lbdj,ild->ijb', imds.Wovvo, r2_in)[ija_act] Hr2[ija_act] += -lib.einsum('kbdj,kid->ijb', imds.Wovvo, r2_in)[ija_act] Hr2[ija_act] += -lib.einsum('lbjd,ild->ijb', imds.Wovov, r2_in)[ija_act] #typo in Ref Hr2[ija_act] += -lib.einsum('kbid,kjd->ijb', imds.Wovov, r2_in)[ija_act] tmp = 2 * np.einsum('lkdc,kld->c', imds.Woovv, r2_in) tmp += -np.einsum('kldc,kld->c', imds.Woovv, r2_in) Hr2[ija_act] += -np.einsum('c,ijcb->ijb', tmp, imds.t2)[ija_act] # 2h1p-1h block Hr2 += -np.einsum('kbij,k->ijb', imds.Wovoo, r1) vector = amplitudes_to_vector_ip(Hr1, Hr2) return vector
def greens_b_vector_ip_rhf(cc, p): nocc, nvir = cc.t1.shape vector1 = np.zeros((nocc), dtype=complex) vector2 = np.zeros((nocc, nocc, nvir), dtype=complex) if p < nocc: vector1[p] = 1.0 else: vector1 += cc.t1[:, p - nocc] vector2 += cc.t2[:, :, :, p - nocc] return eom_rccsd.amplitudes_to_vector_ip(vector1, vector2)
def greens_e_vector_ip_rhf(cc, p, kp=None): nkpts, nocc, nvir = cc.t1.shape vector1 = np.zeros((nocc), dtype=complex) vector2 = np.zeros((nkpts, nkpts, nocc, nocc, nvir), dtype=complex) if hasattr(cc, 'l1') and cc.l1 is not None: l1 = cc.l1 l2 = cc.l2 else: l1 = np.conj(cc.t1) l2 = np.conj(cc.t2) if p < nocc: vector1[p] = -1.0 vector1 += np.einsum('ia,a->i', l1[kp], cc.t1[kp, p, :]) for kl in range(nkpts): for kc in range(nkpts): kconserv = kpts_helper.get_kconserv(cc._scf.cell, cc.kpts) kd = kconserv[kp, kl, kc] vector1 += 2 * np.einsum('ilcd,lcd->i', \ l2[kp,kl,kc], cc.t2[kp,kl,kc,p,:,:,:]) vector1 -= np.einsum('ilcd,ldc->i', \ l2[kp,kl,kc], cc.t2[kp,kl,kd,p,:,:,:]) for kj in range(nkpts): vector2[kp, kj, p, :, :] += -2 * l1[kj] for ki in range(nkpts): # kj == kk == kp, ki == kb vector2[ki, kp, :, p, :] += l1[ki] for kj in range(nkpts): # kc == kk == kp vector2[ki,kj] += 2*np.einsum('c,ijcb->ijb', \ cc.t1[kp,p,:], l2[ki,kj,kp,:,:,:,:]) vector2[ki,kj] -= np.einsum('c,jicb->ijb', \ cc.t1[kp,p,:], l2[kj,ki,kp,:,:,:,:]) else: vector1 += -l1[kp, :, p - nocc] for ki in range(nkpts): for kj in range(nkpts): vector2[ki, kj] += -2*l2[ki,kj,kp,:,:,p-nocc,:] + \ l2[ki,kj,kp,:,:,:,p-nocc] return eom_rccsd.amplitudes_to_vector_ip(vector1, vector2)
def greens_b_vector_ip_rhf(cc, p, kp=None): nkpts, nocc, nvir = cc.t1.shape #Changed dimensions to account for kpts. 3 kpt indices? # 1 nvir index only? # b(ki, kk, i, k) ki == kk == kp vector1 = np.zeros((nocc), dtype=complex) vector2 = np.zeros((nkpts, nkpts, nocc, nocc, nvir), dtype=complex) #Added kp index for p<nocc. In else added for loop summing new v1 kp #and over ki, kj, kp for v2 if p < nocc: vector1[p] = 1.0 else: vector1 += cc.t1[kp, :, p - nocc] for ki in range(nkpts): for kj in range(nkpts): vector2[ki, kj] += cc.t2[ki, kj, kp, :, :, :, p - nocc] return eom_rccsd.amplitudes_to_vector_ip(vector1, vector2)
def initial_ip_guess(cc): nocc, nvir = cc.t1.shape vector1 = np.zeros((nocc), dtype=complex) vector2 = np.zeros((nocc, nocc, nvir), dtype=complex) return eom_rccsd.amplitudes_to_vector_ip(vector1, vector2)
def initial_ip_guess(cc): nocc, nvir = cc.t1.shape vector1 = np.zeros((nocc,), dtype=complex) vector2 = np.zeros((nocc, nocc, nvir), dtype=complex) return amplitudes_to_vector_ip(vector1, vector2)
def greens_e_vector_ip_rhf(cc, p): return amplitudes_to_vector_ip( greens_e_singles_ip_rhf(cc.t1, cc.t2, cc.l1, cc.l2, p), greens_e_doubles_ip_rhf(cc.t1, cc.l1, cc.l2, p), )
def greens_b_vector_ip_rhf(cc, p): return amplitudes_to_vector_ip( greens_b_singles_ip_rhf(cc.t1, p), greens_b_doubles_ip_rhf(cc.t2, p), )