예제 #1
0
def casci_grad_with_ccsd_solver(mc,
                                mo_coeff=None,
                                ci=None,
                                atmlst=None,
                                mf_grad=None,
                                verbose=None):
    if mo_coeff is None: mo_coeff = mc._scf.mo_coeff
    if ci is None: ci = mc.ci
    if mf_grad is None: mf_grad = mc._scf.nuc_grad_method()

    mol = mc.mol
    ncore = mc.ncore
    ncas = mc.ncas
    nocc = ncore + ncas
    nelecas = mc.nelecas
    nao, nmo = mo_coeff.shape
    nao_pair = nao * (nao + 1) // 2

    mo_occ = mo_coeff[:, :nocc]
    mo_core = mo_coeff[:, :ncore]
    mo_cas = mo_coeff[:, ncore:nocc]

    casdm1, casdm2 = mc.fcisolver.make_rdm12(mc.ci, ncas, nelecas)
    no = mc.nelecas[0]
    for i in range(no):
        casdm1[i, i] -= 2
    for i in range(no):
        for j in range(no):
            casdm2[i, i, j, j] -= 4
            casdm2[i, j, j, i] += 2
    for i in range(no):
        casdm2[i, i, :, :] -= casdm1 * 2
        casdm2[:, :, i, i] -= casdm1 * 2
        casdm2[:, i, i, :] += casdm1
        casdm2[i, :, :, i] += casdm1

    mc.mo_occ = mc._scf.mo_occ
    mask = numpy.zeros(nmo, dtype=bool)
    mask[ncore:nocc] = True
    mc.frozen = numpy.where(~mask)[0]
    mc.get_frozen_mask = lambda *args: mask
    d1 = (casdm1[:no, :no] * .5, casdm1[:no, no:] * .5, casdm1[no:, :no] * .5,
          casdm1[no:, no:] * .5)
    casdm2 = (casdm2 + casdm2.transpose(1, 0, 2, 3)) * .5
    vvvv = casdm2[no:, no:, no:, no:]
    d2 = (casdm2[:no, no:, :no, no:] * .5, ao2mo.restore(4, vvvv, ncas - no) *
          .25, casdm2[:no, :no, :no, :no] * .25,
          casdm2[:no, :no, no:, no:] * .5, casdm2[:no, no:, no:, :no] * .5,
          casdm2, casdm2[:no, no:, no:, no:], casdm2[:no, :no, :no, no:])
    mc.mo_coeff = mo_coeff
    t1 = t2 = l1 = l2 = ci
    de = ccsd_grad.grad_elec(mc.Gradients(), t1, t2, l1, l2, None, atmlst, d1,
                             d2, verbose)
    de += rhf_grad.grad_nuc(mol)
    return de
예제 #2
0
파일: cisd.py 프로젝트: wmizukami/pyscf
def grad_elec(cigrad, civec=None, eris=None, atmlst=None, verbose=logger.INFO):
    myci = cigrad.base
    if civec is None: civec = myci.ci
    assert(not isinstance(civec, (list, tuple)))
    nocc = myci.nocc
    nmo = myci.nmo
    d1 = cisd._gamma1_intermediates(myci, civec, nmo, nocc)
    fd2intermediate = lib.H5TmpFile()
    d2 = cisd._gamma2_outcore(myci, civec, nmo, nocc, fd2intermediate, True)
    t1 = t2 = l1 = l2 = civec
    return ccsd_grad.grad_elec(cigrad, t1, t2, l1, l2, eris, atmlst, d1, d2, verbose)
예제 #3
0
파일: ccsd_t.py 프로젝트: zhcui/pyscf
def grad_elec(cc_grad, t1=None, t2=None, l1=None, l2=None, eris=None, atmlst=None,
              verbose=lib.logger.INFO):
    mycc = cc_grad.base
    if t1 is None: t1 = mycc.t1
    if t2 is None: t2 = mycc.t2
    if l1 is None: l1 = mycc.l1
    if l2 is None: l2 = mycc.l2
    if eris is None: eris = mycc.ao2mo()
    d1 = ccsd_t_rdm._gamma1_intermediates(mycc, t1, t2, l1, l2, eris,
                                          for_grad=True)
    fd2intermediate = lib.H5TmpFile()
    d2 = ccsd_t_rdm._gamma2_outcore(mycc, t1, t2, l1, l2, eris,
                                    fd2intermediate, True)
    cc_grad = ccsd_grad.Gradients(mycc)
    de = ccsd_grad.grad_elec(cc_grad, t1, t2, l1, l2, eris, atmlst,
                             d1, d2, verbose)
    return de