Example #1
0
 def DFCASSCF(mf, ncas, nelecas, auxbasis=None, **kwargs):
     mf = _convert_to_rhf(mf, False)
     if mf.mol.symmetry:
         mc = mc1step_symm.CASSCF(mf, ncas, nelecas, **kwargs)
     else:
         mc = mc1step.CASSCF(mf, ncas, nelecas, **kwargs)
     return df.density_fit(mc, auxbasis)
Example #2
0
 def DFCASSCF(mf, ncas, nelecas, auxbasis=None, **kwargs):
     from pyscf import scf
     mf = scf.addons.convert_to_rhf(mf, convert_df=False)
     if mf.mol.symmetry:
         mc = mc1step_symm.CASSCF(mf, ncas, nelecas, **kwargs)
     else:
         mc = mc1step.CASSCF(mf, ncas, nelecas, **kwargs)
     return df.density_fit(mc, auxbasis)
Example #3
0
def DFCASSCF(mf, ncas, nelecas, auxbasis=None, ncore=None, frozen=None):
    from pyscf import scf
    mf = scf.addons.convert_to_rhf(mf, remove_df=False)
    if mf.mol.symmetry:
        mc = mc1step_symm.CASSCF(mf, ncas, nelecas, ncore, frozen)
    else:
        mc = mc1step.CASSCF(mf, ncas, nelecas, ncore, frozen)
    return df.density_fit(mc, auxbasis)
Example #4
0
def DFCASSCF(mf_or_mol, ncas, nelecas, auxbasis=None, ncore=None, frozen=None):
    from pyscf import gto
    from pyscf import scf
    if isinstance(mf_or_mol, gto.Mole):
        mf = scf.RHF(mf_or_mol).density_fit()
    else:
        mf = mf_or_mol

    if isinstance(mf, scf.uhf.UHF):
        mf = scf.addons.convert_to_rhf(mf, remove_df=False)

    if mf.mol.symmetry:
        mc = mc1step_symm.CASSCF(mf, ncas, nelecas, ncore, frozen)
    else:
        mc = mc1step.CASSCF(mf, ncas, nelecas, ncore, frozen)
    return df.density_fit(mc, auxbasis)
Example #5
0
def CASSCF(mf, ncas, nelecas, **kwargs):
    from pyscf import gto
    if isinstance(mf, gto.Mole):
        raise RuntimeError('''
You see this error message because of the API updates in pyscf v0.10.
In the new API, the first argument of CASSCF/CASCI class is HF objects.  e.g.
        mc = mcscf.CASSCF(mf, norb, nelec)
Please see   http://sunqm.net/pyscf/code-rule.html#api-rules   for the details
of API conventions''')

    mf = _convert_to_rhf(mf)
    if mf.mol.symmetry:
        mc = mc1step_symm.CASSCF(mf, ncas, nelecas, **kwargs)
    else:
        mc = mc1step.CASSCF(mf, ncas, nelecas, **kwargs)
    return mc
Example #6
0
 def make_fcasscf(self, casscf_attr={}, fcisolver_attr={}):
     ''' Make a fake CASSCF object for ostensible single-state calculations '''
     if isinstance(self.base, mc1step_symm.CASSCF):
         fcasscf = mc1step_symm.CASSCF(self.base._scf, self.base.ncas,
                                       self.base.nelecas)
     else:
         fcasscf = mc1step.CASSCF(self.base._scf, self.base.ncas,
                                  self.base.nelecas)
     fcasscf.__dict__.update(self.base.__dict__)
     if hasattr(self.base, 'weights'):
         fcasscf.fcisolver = self.base.fcisolver._base_class(self.base.mol)
         fcasscf.nroots = 1
         fcasscf.fcisolver.__dict__.update(self.base.fcisolver.__dict__)
     fcasscf.__dict__.update(casscf_attr)
     fcasscf.fcisolver.__dict__.update(fcisolver_attr)
     fcasscf.verbose, fcasscf.stdout = self.verbose, self.stdout
     return fcasscf
Example #7
0
def CASSCF(mf_or_mol, ncas, nelecas, ncore=None, frozen=None):
    from pyscf import gto
    from pyscf import scf
    if isinstance(mf_or_mol, gto.Mole):
        mf = scf.RHF(mf_or_mol)
    else:
        mf = mf_or_mol

    if isinstance(mf, scf.uhf.UHF):
        mf = scf.addons.convert_to_rhf(mf)
    if getattr(mf, 'with_df', None):
        return DFCASSCF(mf, ncas, nelecas, ncore, frozen)

    if mf.mol.symmetry:
        mc = mc1step_symm.CASSCF(mf, ncas, nelecas, ncore, frozen)
    else:
        mc = mc1step.CASSCF(mf, ncas, nelecas, ncore, frozen)
    return mc
Example #8
0
def CASSCF(mf, ncas, nelecas, ncore=None, frozen=None):
    from pyscf import gto
    from pyscf import scf
    if isinstance(mf, gto.Mole):
        raise RuntimeError('''
You see this error message because of the API updates in pyscf v0.10.
In the new API, the first argument of CASSCF/CASCI class is HF objects.  e.g.
        mc = mcscf.CASSCF(mf, norb, nelec)
Please see   http://sunqm.net/pyscf/code-rule.html#api-rules   for the details
of API conventions''')

    mf = scf.addons.convert_to_rhf(mf)
    if hasattr(mf, 'with_df') and mf.with_df:
        return DFCASSCF(mf, ncas, nelecas, ncore, frozen)

    if mf.mol.symmetry:
        mc = mc1step_symm.CASSCF(mf, ncas, nelecas, ncore, frozen)
    else:
        mc = mc1step.CASSCF(mf, ncas, nelecas, ncore, frozen)
    return mc
Example #9
0
        ['H', (0., -0.5, -1.)],
        ['H', (0., -0.5, -0.)],
        ['H', (0., -0., -1.)],
        ['H', (1., -0.5, 0.)],
        ['H', (0., 1., 1.)],
    ]

    mol.basis = {
        'H': 'sto-3g',
        'O': '6-31g',
    }
    mol.build()

    m = scf.RHF(mol)
    ehf = m.scf()
    emc = kernel(mc1step.CASSCF(m, 4, 4), m.mo_coeff, verbose=4)[1]
    print(ehf, emc, emc - ehf)
    print(emc - -3.22013929407)

    mol.atom = [
        ['O', (0., 0., 0.)],
        ['H', (0., -0.757, 0.587)],
        ['H', (0., 0.757, 0.587)],
    ]
    mol.basis = {
        'H': 'cc-pvdz',
        'O': 'cc-pvdz',
    }
    mol.build()

    m = scf.RHF(mol)
Example #10
0
    mol.output = None  #"out_h2o"
    mol.atom = [
        ['O', (0., 0., 0.)],
        ['H', (0., -0.757, 0.587)],
        ['H', (0., 0.757, 0.587)],
    ]
    mol.basis = {
        'H': 'cc-pvtz',
        'O': 'cc-pvtz',
    }
    mol.build()

    m = scf.RHF(mol)
    ehf = m.scf()

    mc = mc1step.CASSCF(m, 6, 4)
    mc.verbose = 4
    mo = m.mo_coeff.copy()

    eris0 = _ERIS(mc, mo, 'incore')
    eris1 = _ERIS(mc, mo, 'outcore')
    eris2 = _ERIS(mc, mo, 'outcore', level=1)
    eris3 = _ERIS(mc, mo, 'outcore', level=2)
    print('vhf_c', numpy.allclose(eris0.vhf_c, eris1.vhf_c))
    print('j_pc ', numpy.allclose(eris0.j_pc, eris1.j_pc))
    print('k_pc ', numpy.allclose(eris0.k_pc, eris1.k_pc))
    print('ppaa ', numpy.allclose(eris0.ppaa, eris1.ppaa))
    print('papa ', numpy.allclose(eris0.papa, eris1.papa))

    print('vhf_c', numpy.allclose(eris0.vhf_c, eris2.vhf_c))
    print('j_pc ', numpy.allclose(eris0.j_pc, eris2.j_pc))
Example #11
0
def gen_g_hop(casscf, mo, ci0, eris, verbose=None):
    # MRH: I'm just going to pass this to the newton_casscf version and average/weight/change to and from CSF's post facto!
    ncas = casscf.ncas
    ncore = casscf.ncore
    nocc = ncas + ncore
    nelecas = casscf.nelecas
    neleca, nelecb = _unpack_nelec(nelecas)
    nmo = mo.shape[1]
    nroot = len(ci0)
    ndet = ci0[0].size
    norb = mo.shape[-1]
    ngorb = np.count_nonzero(
        casscf.uniq_var_indices(norb, ncore, ncas, casscf.frozen))
    weights_2d = np.asarray(casscf.weights)[:, None]
    weights_3d = np.asarray(casscf.weights)[:, None, None]
    mc_fci = casscf.fcisolver
    is_csf = isinstance(mc_fci, (
        csf.FCISolver,
        csf_symm.FCISolver,
    ))
    if is_csf:
        if hasattr(mc_fci, 'wfnsym') and hasattr(mc_fci, 'confsym'):
            idx_sym = mc_fci.confsym[mc_fci.econf_csf_mask] == mc_fci.wfnsym
        else:
            idx_sym = None
        smult = mc_fci.smult

    fcasscf = mc1step.CASSCF(casscf._scf, ncas, nelecas)
    fcasscf.fcisolver = casscf.ss_fcisolver
    gh_roots = [
        newton_casscf.gen_g_hop(fcasscf, mo, ci0_i, eris, verbose=verbose)
        for ci0_i in ci0
    ]

    def avg_orb_wgt_ci(x_roots):
        x_orb = sum([
            x_iroot[:ngorb] * w for x_iroot, w in zip(x_roots, casscf.weights)
        ])
        x_ci = np.stack([
            x_iroot[ngorb:] * w for x_iroot, w in zip(x_roots, casscf.weights)
        ],
                        axis=0)
        if is_csf:
            x_ci = csf.pack_sym_ci(
                transform_civec_det2csf(x_ci,
                                        ncas,
                                        neleca,
                                        nelecb,
                                        smult,
                                        csd_mask=mc_fci.csd_mask,
                                        do_normalize=False)[0], idx_sym)
        x_all = np.append(x_orb, x_ci.ravel()).ravel()
        return x_all

    g_all = avg_orb_wgt_ci([gh_iroot[0] for gh_iroot in gh_roots])
    hdiag_all = avg_orb_wgt_ci([gh_iroot[3] for gh_iroot in gh_roots])

    def g_update(u, fcivec):
        return avg_orb_wgt_ci(
            [gh_iroot[1](u, ci) for gh_iroot, ci in zip(gh_roots, fcivec)])

    def h_op(x):
        x_orb = x[:ngorb]
        x_ci = x[ngorb:].reshape(nroot, -1)
        if is_csf:
            x_ci = transform_civec_csf2det(csf.unpack_sym_ci(x_ci, idx_sym),
                                           ncas,
                                           neleca,
                                           nelecb,
                                           smult,
                                           csd_mask=mc_fci.csd_mask,
                                           do_normalize=False)[0]
        return avg_orb_wgt_ci([
            gh_iroot[2](np.append(x_orb, x_ci_iroot))
            for gh_iroot, x_ci_iroot in zip(gh_roots, x_ci)
        ])

    return g_all, g_update, h_op, hdiag_all