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
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)
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