Exemplo n.º 1
0
def solver(mol, singlet=True, symm=None):
    if symm is None:
        symm = mol.symmetry
    if symm:
        if singlet:
            return direct_spin0_symm.FCISolver(mol)
        else:
            return direct_spin1_symm.FCISolver(mol)
    else:
        if singlet:
            return direct_spin0.FCISolver(mol)
        else:
            return direct_spin1.FCISolver(mol)
Exemplo n.º 2
0
def solver(mol=None, singlet=False, symm=None):
    if mol and symm is None:
        symm = mol.symmetry
    if symm:
        if singlet:
            return direct_spin0_symm.FCISolver(mol)
        else:
            return direct_spin1_symm.FCISolver(mol)
    else:
        if singlet:
            # The code for singlet direct_spin0 sometimes gets error of 
            # "State not singlet x.xxxxxxe-06" due to numerical issues.
            # Calling direct_spin1 is slightly slower but more robust than
            # direct_spin0 especially when combining to energy penalty method
            # (:func:`fix_spin_`)
            return direct_spin0.FCISolver(mol)
        else:
            return direct_spin1.FCISolver(mol)
Exemplo n.º 3
0
        for i in range(dm2abba.shape[0]):
            dm2abba[:, i, i, :] += dm1b
        dm2baab = dm2abba

        if reorder:
            spinfree_2 = dm2aa + dm2bb + 2 * dm2ab
            one_sf, two_sf = find_full_casscf_12rdm(mc.fcisolver, mf.mo_coeff,
                                                    'spinfree_TwoRDM.1', norb,
                                                    nelec)
            assert (numpy.allclose(
                two_sf[:n_occorbs, :n_occorbs, :n_occorbs, :n_occorbs],
                spinfree_2))

    mc2 = mcscf.CASCI(mf, 6, 6)
    #    mc2.canonicalization = False
    mc2.fcisolver = direct_spin1.FCISolver(mol)
    emc2, e_cas2, fcivec2 = mc2.kernel()[:3]
    #ss_tot = spin_op.spin_square(fcivec2, norb, nelec)[0]
    #    print 'ss_tot exact: ',ss_tot
    (dm1a_, dm1b_), (dm2aa_, dm2ab_,
                     dm2bb_) = direct_spin1.make_rdm12s(fcivec2,
                                                        norb,
                                                        nelec,
                                                        reorder=False)

    #f_dbg = dbg_ss_frac(dm1, dm2, norb, mo_cas, ovlp)
    # dm2baab(pq,rs) = <p(beta)* q(alpha) r(alpha)* s(beta)
    dm2baab_ = spin_op._make_rdm2_baab(fcivec2, norb, nelec)
    # dm2abba(pq,rs) = <q(alpha)* p(beta) s(beta)* r(alpha)
    dm2abba_ = spin_op._make_rdm2_abba(fcivec2, norb, nelec)
    ss_tot = spin_op.spin_square(fcivec2, norb, nelec)[0]