Пример #1
0
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)
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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)
Пример #5
0
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)
Пример #6
0
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)
Пример #7
0
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)
Пример #8
0
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)
Пример #9
0
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),
    )
Пример #10
0
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),
    )