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