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