Example #1
0
    def test_polarizability_with_freq(self):
        mol = gto.M(atom='''O      0.   0.       0.
                            H      0.  -0.757    0.587
                            H      0.   0.757    0.587''',
                    basis='6-31g')
        mf = scf.RHF(mol).run(conv_tol=1e-14)

        mo_coeff = mf.mo_coeff
        occidx = mf.mo_occ > 0
        orbo = mo_coeff[:, occidx]
        orbv = mo_coeff[:,~occidx]
        nocc = orbo.shape[1]
        nvir = orbv.shape[1]
        nov = nocc*nvir

        charges = mol.atom_charges()
        coords  = mol.atom_coords()
        charge_center = numpy.einsum('i,ix->x', charges, coords) / charges.sum()
        with mol.with_common_orig(charge_center):
            int_r = mol.intor_symmetric('int1e_r', comp=3)
        h1 = lib.einsum('xpq,pi,qj->xij', int_r, mo_coeff.conj(), orbo)
        v1 = h1[:,nocc:].transpose(2,1,0).reshape(nov,-1)
        v = numpy.vstack((v1,v1))

        a, b = get_ab(mf)
        a = a.reshape(nov,nov)
        b = b.reshape(nov,nov)
        mat = numpy.bmat(((a,b),(b,a)))
        freq = 0.1
        mat[:nov,:nov] -= numpy.eye(nov)*freq
        mat[nov:,nov:] += numpy.eye(nov)*freq

        # frequency-dependent property
        u1 = numpy.linalg.solve(mat, v)
        ref = numpy.einsum('px,py->xy', v, u1)*2
        val = rhf.Polarizability(mf).polarizability_with_freq(freq)
        # errors mainly due to krylov solver
        self.assertAlmostEqual(abs(ref-val).max(), 0, 2)

        # static property
        ref = numpy.einsum('px,py->xy', v1, numpy.linalg.solve(a+b, v1))*4
        val = rhf.Polarizability(mf).polarizability()
        self.assertAlmostEqual(abs(ref-val).max(), 0, 7)

        val = rhf.Polarizability(mf).polarizability_with_freq(freq=0)
        # errors mainly due to krylov solver
        self.assertAlmostEqual(abs(ref-val).max(), 0, 3)
Example #2
0
    def test_ab_lda(self):
        mf = mf_lda
        a, b = rhf.get_ab(mf)
        ftda = rhf.gen_tda_operation(mf, singlet=True)[0]
        ftdhf = rhf.gen_tdhf_operation(mf, singlet=True)[0]
        nocc = numpy.count_nonzero(mf.mo_occ == 2)
        nvir = numpy.count_nonzero(mf.mo_occ == 0)
        numpy.random.seed(2)
        x, y = xy = numpy.random.random((2,nocc,nvir))
        ax = numpy.einsum('iajb,jb->ia', a, x)
        self.assertAlmostEqual(abs(ax - ftda([x]).reshape(nocc,nvir)).max(), 0, 9)

        ab1 = ax + numpy.einsum('iajb,jb->ia', b, y)
        ab2 =-numpy.einsum('iajb,jb->ia', b, x)
        ab2-= numpy.einsum('iajb,jb->ia', a, y)
        abxy_ref = ftdhf([xy]).reshape(2,nocc,nvir)
        self.assertAlmostEqual(abs(ab1 - abxy_ref[0]).max(), 0, 9)
        self.assertAlmostEqual(abs(ab2 - abxy_ref[1]).max(), 0, 9)
Example #3
0
    def test_ab_lda(self):
        mf = mf_lda
        a, b = rhf.get_ab(mf)
        ftda = rhf.gen_tda_operation(mf, singlet=True)[0]
        ftdhf = rhf.gen_tdhf_operation(mf, singlet=True)[0]
        nocc = numpy.count_nonzero(mf.mo_occ == 2)
        nvir = numpy.count_nonzero(mf.mo_occ == 0)
        numpy.random.seed(2)
        x, y = xy = numpy.random.random((2,nocc,nvir))
        ax = numpy.einsum('iajb,jb->ia', a, x)
        self.assertAlmostEqual(abs(ax - ftda([x]).reshape(nocc,nvir)).max(), 0, 9)

        ab1 = ax + numpy.einsum('iajb,jb->ia', b, y)
        ab2 =-numpy.einsum('iajb,jb->ia', b, x)
        ab2-= numpy.einsum('iajb,jb->ia', a, y)
        abxy_ref = ftdhf([xy]).reshape(2,nocc,nvir)
        self.assertAlmostEqual(abs(ab1 - abxy_ref[0]).max(), 0, 9)
        self.assertAlmostEqual(abs(ab2 - abxy_ref[1]).max(), 0, 9)