Пример #1
0
def aux_e2(mol,
           auxmol,
           intor='int3c2e',
           aosym='s1',
           comp=None,
           out=None,
           cintopt=None):
    '''3-center AO integrals (ij|L), where L is the auxiliary basis.

    Kwargs:
        cintopt : Libcint-3.14 and newer version support to compute int3c2e
            without the opt for the 3rd index.  It can be precomputed to
            reduce the overhead of cintopt initialization repeatedly.

            cintopt = gto.moleintor.make_cintopt(mol._atm, mol._bas, mol._env, 'int3c2e')
    '''
    shls_slice = (0, mol.nbas, 0, mol.nbas, mol.nbas, mol.nbas + auxmol.nbas)

    # Extract the call of the two lines below
    #  pmol = gto.mole.conc_mol(mol, auxmol)
    #  return pmol.intor(intor, comp, aosym=aosym, shls_slice=shls_slice, out=out)
    intor = mol._add_suffix(intor)
    hermi = 0
    ao_loc = None
    atm, bas, env = gto.mole.conc_env(mol._atm, mol._bas, mol._env,
                                      auxmol._atm, auxmol._bas, auxmol._env)
    return getints(intor, atm, bas, env, shls_slice, comp, hermi, aosym,
                   ao_loc, cintopt, out)
Пример #2
0
 def get_int3c(shls_slice=None):
     if shls_slice is None:
         shls_slice = (0, nbas, 0, nbas, nbas, pmol.nbas)
     else:
         shls_slice = shls_slice[:4] + (nbas+shls_slice[4], nbas+shls_slice[5])
     return getints(intor, pmol._atm, pmol._bas, pmol._env, shls_slice,
                    aosym=aosym, cintopt=opt)
Пример #3
0
def project_mo_r2r(mol1, mo1, mol2):
    nbas1 = len(mol1._bas)
    nbas2 = len(mol2._bas)
    atm, bas, env = mole.conc_env(mol2._atm, mol2._bas, mol2._env,
                                  mol1._atm, mol1._bas, mol1._env)
    bras = kets = range(nbas2)
    s22 = moleintor.getints('cint1e_ovlp', atm, bas, env,
                            bras, kets, comp=1, hermi=1)
    t22 = moleintor.getints('cint1e_spsp', atm, bas, env,
                            bras, kets, comp=1, hermi=1)
    bras = range(nbas2)
    kets = range(nbas2, nbas1+nbas2)
    s21 = moleintor.getints('cint1e_ovlp', atm, bas, env,
                            bras, kets, comp=1, hermi=0)
    t21 = moleintor.getints('cint1e_spsp', atm, bas, env,
                            bras, kets, comp=1, hermi=0)
    n2c = s21.shape[1]
    pl = numpy.linalg.solve(s22, s21)
    ps = numpy.linalg.solve(t22, t21)
    return numpy.vstack((numpy.dot(pl, mo1[:n2c]),
                         numpy.dot(ps, mo1[n2c:])))
Пример #4
0
def aux_e2(mol, auxmol, intor='int3c2e', aosym='s1', comp=None, out=None,
           cintopt=None):
    '''3-center AO integrals (ij|L), where L is the auxiliary basis.

    Kwargs:
        cintopt : Libcint-3.14 and newer version support to compute int3c2e
            without the opt for the 3rd index.  It can be precomputed to
            reduce the overhead of cintopt initialization repeatedly.

            cintopt = gto.moleintor.make_cintopt(mol._atm, mol._bas, mol._env, intor)
    '''
    from pyscf.gto.moleintor import getints, make_cintopt
    shls_slice = (0, mol.nbas, 0, mol.nbas, mol.nbas, mol.nbas+auxmol.nbas)

    # Extract the call of the two lines below
    #  pmol = gto.mole.conc_mol(mol, auxmol)
    #  return pmol.intor(intor, comp, aosym=aosym, shls_slice=shls_slice, out=out)
    intor = mol._add_suffix(intor)
    hermi = 0
    ao_loc = None
    atm, bas, env = gto.mole.conc_env(mol._atm, mol._bas, mol._env,
                                      auxmol._atm, auxmol._bas, auxmol._env)
    return getints(intor, atm, bas, env, shls_slice, comp, hermi, aosym,
                   ao_loc, cintopt, out)
Пример #5
0
def get_E1(eda):
    #atom_kinE = []
    mol = eda.mol
    #method = eda.method
    #dm = eda.dm
    nao = eda.nao
    bas2atm = eda.bas2atm  #get_bas2atm(atm2bas,nao,mol.natm)
    if eda.showinter:
        bas2frg = eda.bas2frg
        atm2frg = eda.atm2frg
    #print(bas2atm)
    kinmat = mol.intor_symmetric('int1e_kin')
    atom_kin = np.zeros(mol.natm)
    if eda.showinter:
        #kin1 = np.zeros(mol.natm)
        #kin2 = np.zeros((mol.natm, mol.natm))
        kin1 = np.zeros(eda.nfrag + 2)
        kin2 = np.zeros((eda.nfrag + 2, eda.nfrag + 2))
    naorange = range(nao)
    #if eda.exclude_cap:
    #    naorange -= eda.capbas_p
    for i in naorange:
        for j in naorange:
            #print(dm,kin)
            kin = eda.dm[i, j] * kinmat[i, j]
            a = bas2atm[i]
            b = bas2atm[j]
            atom_kin[a] = atom_kin[a] + kin
            atom_kin[b] = atom_kin[b] + kin
            if eda.showinter:
                aa = bas2frg[i]
                bb = bas2frg[j]
                if aa == bb:
                    kin1[aa - 1] += kin
                else:
                    kin2[aa - 1, bb - 1] += kin
                    kin2[bb - 1, aa - 1] += kin
    atom_kin = atom_kin / 2
    #with open(eda.output+'-eda.log','a') as f:
    logger.log(eda.stdout, "atom_kinE=", atom_kin)
    if eda.showinter:
        logger.log(eda.stdout_inter, "kin1", kin1)
        logger.log(eda.stdout_inter, "kin2", kin2)

    fakeatm = []
    for n in range(mol.natm):
        #if eda.exclude_cap and (n+1 in eda.capatoms):
        #    continue
        back = copy.copy(mol._atm)
        for i in range(mol.natm):
            if (i != n):
                back[i, 0] = 0
        fakeatm.append(back)
    #fakeatm = np.array(fakeatm)
    #print(mol._atm)
    #print(fakeatm)
    int1enuc = []
    for i in range(mol.natm):
        #if eda.exclude_cap and (n+1 in eda.capatoms):
        #    #int1en =
        #    continue
        if mol.cart:
            int1en = moleintor.getints("int1e_nuc_cart", fakeatm[i], mol._bas,
                                       mol._env)
        else:
            int1en = moleintor.getints("int1e_nuc_sph", fakeatm[i], mol._bas,
                                       mol._env)
        int1enuc.append(int1en)
    #e1 = 0.0
    #atom_h1E = np.zeros(atom_number)
    if eda.showinter:
        #print(atm2frg,mol.natm)
        #print(int1enuc[0][:3,:3])
        atom_1enuc, e1_1, e1_2, e1_3 = h1e_inter(eda.dm, bas2atm, bas2frg,
                                                 atm2frg, int1enuc, mol.natm,
                                                 nao, eda.nfrag + 2)
        atom_1enuc = np.asarray(atom_1enuc)[0:mol.natm]
        logger.log(eda.stdout, "e1n_1", e1_1)
        e1_1 = np.asarray(e1_1) + kin1
        #print(e1_2)
        #print(kin1,kin2)
        e1_2 = np.triu(np.asarray(e1_2) + kin2)
        #intersum = e1_1.sum() + e1_2.sum() + e1_3
        #e1_3 = np.asarray(e1_3)
        #print(e1_3)
        e1_3 = eda_inter.simp3(e1_3, eda.nfrag, eda.frag2layer)
    else:
        atom_1enuc = np.asarray(h1e(eda.dm, bas2atm, int1enuc, mol.natm,
                                    nao))[0:mol.natm]
    #with open(eda.output+'-eda.log','a') as f:
    logger.log(eda.stdout, "atom_1enuc=", atom_1enuc)
    atm_e1 = atom_kin + atom_1enuc
    logger.log(eda.stdout, "atom_e1=", atm_e1)
    if eda.showinter:
        logger.log(eda.stdout_inter, "e1_1", e1_1)
        logger.log(eda.stdout_inter, "e1_2", e1_2)
        logger.ilog(eda.stdout_inter, "e1_3 ", e1_3)
    #with open(eda.output+'-eda.log','a') as f:
    #anal = True
    if eda.anal and eda.showinter:
        tot_akin = atom_kin.sum()
        tot_kin = np.einsum('ij,ji', eda.dm, mol.intor_symmetric('int1e_kin'))
        tot_fkin = kin1.sum() + np.triu(kin2).sum()
        tot_a1enuc = atom_1enuc.sum()
        tot_1enuc = np.einsum(
            'ij,ji', eda.dm,
            moleintor.getints("int1e_nuc_sph", mol._atm, mol._bas, mol._env))
        tot_fe1 = e1_1.sum() + e1_2.sum() + sum(e1_3.energies())
        '''basis_range = range(53)
        dm1 = eda.dm[np.ix_(basis_range, basis_range)]
        inte1n1 = np.zeros((nao,nao))
        for i in range(7):
            inte1n1 += int1enuc[i]
        inte1n1 = inte1n1[np.ix_(basis_range, basis_range)]
        e1n1 = np.einsum('ij,ji', dm1, inte1n1)
        logger.mlog(eda.stdout, "old_e1_1", e1n1)'''

        logger.mlog(eda.stdout, "a_e1 ", tot_akin + tot_a1enuc)
        #logger.mlog(eda.stdout,"a_e1k ", tot_akin)
        #logger.mlog(eda.stdout,"a_e1n ", tot_a1enuc)
        logger.mlog(eda.stdout, "f_e1 ", tot_fe1)
        logger.mlog(eda.stdout, "t_e1", tot_kin + tot_1enuc)
    if eda.showinter: atm_e1 = atm_e1, e1_1, e1_2, e1_3
    return atm_e1