def test_field_gradients(self): mol = gto.M( atom= 'H1 0.5 -0.6 0.4; H2 -0.5, 0.4, -0.3; H -0.4 -0.3 0.5; H 0.3 0.5 -0.6', unit='B', basis={ 'H': [[0, [2., 1]]], 'H1': [[1, [.5, 1]]], 'H2': [[1, [1, 1]]] }) grids = dft.gen_grid.Grids(mol) grids.build() ao = mol.eval_gto('GTOval', grids.coords) r0 = mol.atom_coord(0) dr = grids.coords - r0 dd = numpy.linalg.norm(dr, axis=1) rr = 3 * numpy.einsum('ix,iy->ixy', dr, dr) for i in range(3): rr[:, i, i] -= dd**2 h1ref = lib.einsum('i,ixy,ip,iq->xypq', grids.weights / dd**5, rr, ao, ao) h1ao = rhf_ssc._get_integrals_fcsd(mol, 0) h1ao[numpy.diag_indices(3)] += rhf_ssc._get_integrals_fc(mol, 0) self.assertAlmostEqual(abs(h1ref - h1ao).max(), 0, 5)
def test_field_gradients(self): mol = gto.M(atom='H1 0.5 -0.6 0.4; H2 -0.5, 0.4, -0.3; H -0.4 -0.3 0.5; H 0.3 0.5 -0.6', unit='B', basis={'H': [[0,[2., 1]]], 'H1':[[1,[.5, 1]]], 'H2':[[1,[1,1]]]}) grids = dft.gen_grid.Grids(mol) grids.build() ao = mol.eval_gto('GTOval', grids.coords) r0 = mol.atom_coord(0) dr = grids.coords - r0 dd = numpy.linalg.norm(dr, axis=1) rr = 3 * numpy.einsum('ix,iy->ixy', dr, dr) for i in range(3): rr[:,i,i] -= dd**2 h1ref = lib.einsum('i,ixy,ip,iq->xypq', grids.weights/dd**5, rr, ao, ao) h1ao = rhf_ssc._get_integrals_fcsd(mol, 0) h1ao[numpy.diag_indices(3)] += rhf_ssc._get_integrals_fc(mol, 0) self.assertAlmostEqual(abs(h1ref - h1ao).max(), 0, 5)
def make_h1_fcsd(mol, mo_coeff, mo_occ, atmlst): '''FC + SD''' orboa = mo_coeff[0][:,mo_occ[0]> 0] orbva = mo_coeff[0][:,mo_occ[0]==0] orbob = mo_coeff[1][:,mo_occ[1]> 0] orbvb = mo_coeff[1][:,mo_occ[1]==0] h1aa = [] h1ab = [] h1ba = [] h1bb = [] for ia in atmlst: h1ao = rhf_ssc._get_integrals_fcsd(mol, ia) # *.5 due to s = 1/2 * pauli-matrix h1aa.append(lib.einsum('xypq,pi,qj->xyij', h1ao, orbva.conj(), orboa) * .5) h1ab.append(lib.einsum('xypq,pi,qj->xyij', h1ao, orbva.conj(), orbob) * .5) h1ba.append(lib.einsum('xypq,pi,qj->xyij', h1ao, orbvb.conj(), orboa) * .5) h1bb.append(lib.einsum('xypq,pi,qj->xyij', h1ao, orbvb.conj(), orbob) *-.5) return (lib.asarray(h1aa), lib.asarray(h1ab), lib.asarray(h1ba), lib.asarray(h1bb))
def make_h1_fcsd(mol, mo_coeff, mo_occ, atmlst): '''FC + SD''' orboa = mo_coeff[0][:,mo_occ[0]> 0] orbva = mo_coeff[0][:,mo_occ[0]==0] orbob = mo_coeff[1][:,mo_occ[1]> 0] orbvb = mo_coeff[1][:,mo_occ[1]==0] nao = mo_coeff[0].shape[0] h1aa = [] h1ab = [] h1ba = [] h1bb = [] for ia in atmlst: h1ao = rhf_ssc._get_integrals_fcsd(mol, ia) # *.5 due to s = 1/2 * pauli-matrix h1aa.append(lib.einsum('xypq,pi,qj->xyij', h1ao, orbva.conj(), orboa) * .5) h1ab.append(lib.einsum('xypq,pi,qj->xyij', h1ao, orbva.conj(), orbob) * .5) h1ba.append(lib.einsum('xypq,pi,qj->xyij', h1ao, orbvb.conj(), orboa) * .5) h1bb.append(lib.einsum('xypq,pi,qj->xyij', h1ao, orbvb.conj(), orbob) *-.5) return (lib.asarray(h1aa), lib.asarray(h1ab), lib.asarray(h1ba), lib.asarray(h1bb))