Ejemplo n.º 1
0
    def test_spin2spatial(self):
        t1g = addons.spatial2spin(myrcc.t1)
        t2g = addons.spatial2spin(myrcc.t2)
        orbspin = gmf.mo_coeff.orbspin
        t1a, t1b = addons.spin2spatial(t1g, orbspin)
        t2aa, t2ab, t2bb = addons.spin2spatial(t2g, orbspin)
        self.assertAlmostEqual(abs(myrcc.t1 - t1a).max(), 0, 12)
        self.assertAlmostEqual(abs(myrcc.t2 - t2ab).max(), 0, 12)

        self.assertAlmostEqual(abs(t1g - addons.spatial2spin((t1a,t1b), orbspin)).max(), 0, 12)
        self.assertAlmostEqual(abs(t2g - addons.spatial2spin((t2aa,t2ab,t2bb), orbspin)).max(), 0, 12)
Ejemplo n.º 2
0
def kernel(mycc,
           eris,
           t1=None,
           t2=None,
           l1=None,
           l2=None,
           max_cycle=50,
           tol=1e-8,
           verbose=logger.INFO):
    cput0 = (time.clock(), time.time())
    if isinstance(verbose, logger.Logger):
        log = verbose
    else:
        log = logger.Logger(mycc.stdout, verbose)

    eris = _eris_spatial2spin(mycc, eris)
    if t1 is None: t1 = mycc.t1
    if t2 is None: t2 = mycc.t2
    if not isinstance(t1, numpy.ndarray):
        t1 = spatial2spin(t1, eris.orbspin)
        t2 = spatial2spin(t2, eris.orbspin)
    if l1 is None: l1 = t1
    if l2 is None: l2 = t2

    imds = make_intermediates(mycc, t1, t2, eris)

    if mycc.diis:
        adiis = lib.diis.DIIS(mycc, mycc.diis_file)
        adiis.space = mycc.diis_space
    else:
        adiis = lambda t1, t2, *args: (t1, t2)
    cput0 = log.timer('UCCSD lambda initialization', *cput0)

    conv = False
    for istep in range(max_cycle):
        l1new, l2new = update_amps(mycc, t1, t2, l1, l2, eris, imds)
        normt = numpy.linalg.norm(l1new - l1) + numpy.linalg.norm(l2new - l2)
        l1, l2 = l1new, l2new
        l1new = l2new = None
        if mycc.diis:
            l1 = spin2spatial(l1, eris.orbspin)
            l2 = spin2spatial(l2, eris.orbspin)
            l1, l2 = mycc.diis(l1, l2, istep, normt, 0, adiis)
            l1 = spatial2spin(l1, eris.orbspin)
            l2 = spatial2spin(l2, eris.orbspin)
        log.info('cycle = %d  norm(lambda1,lambda2) = %.6g', istep + 1, normt)
        cput0 = log.timer('UCCSD iter', *cput0)
        if normt < tol:
            conv = True
            break
    l1 = spin2spatial(l1, eris.orbspin)
    l2 = spin2spatial(l2, eris.orbspin)
    return conv, l1, l2
Ejemplo n.º 3
0
    def test_spin2spatial(self):
        t1g = addons.spatial2spin(myrcc.t1)
        t2g = addons.spatial2spin(myrcc.t2)
        orbspin = gmf.mo_coeff.orbspin
        t1a, t1b = addons.spin2spatial(t1g, orbspin)
        t2aa, t2ab, t2bb = addons.spin2spatial(t2g, orbspin)
        self.assertAlmostEqual(abs(myrcc.t1 - t1a).max(), 0, 12)
        self.assertAlmostEqual(abs(myrcc.t2 - t2ab).max(), 0, 12)

        self.assertAlmostEqual(
            abs(t1g - addons.spatial2spin((t1a, t1b), orbspin)).max(), 0, 12)
        self.assertAlmostEqual(
            abs(t2g - addons.spatial2spin((t2aa, t2ab, t2bb), orbspin)).max(),
            0, 12)
Ejemplo n.º 4
0
    def test_update_lambda_real(self):
        numpy.random.seed(21)
        eris = mycc.ao2mo()
        gcc1 = gccsd.GCCSD(scf.addons.convert_to_ghf(mf))
        eri1 = gcc1.ao2mo()
        orbspin = eri1.orbspin

        nocc = mol.nelectron
        nvir = mol.nao_nr() * 2 - nocc

        t1r = numpy.random.random((nocc, nvir)) * .1
        t2r = numpy.random.random((nocc, nocc, nvir, nvir)) * .1
        t2r = t2r - t2r.transpose(1, 0, 2, 3)
        t2r = t2r - t2r.transpose(0, 1, 3, 2)
        l1r = numpy.random.random((nocc, nvir)) * .1
        l2r = numpy.random.random((nocc, nocc, nvir, nvir)) * .1
        l2r = l2r - l2r.transpose(1, 0, 2, 3)
        l2r = l2r - l2r.transpose(0, 1, 3, 2)
        t1r = addons.spin2spatial(t1r, orbspin)
        t2r = addons.spin2spatial(t2r, orbspin)
        t1r = addons.spatial2spin(t1r, orbspin)
        t2r = addons.spatial2spin(t2r, orbspin)
        l1r = addons.spin2spatial(l1r, orbspin)
        l2r = addons.spin2spatial(l2r, orbspin)
        l1r = addons.spatial2spin(l1r, orbspin)
        l2r = addons.spatial2spin(l2r, orbspin)
        imds = gccsd_lambda.make_intermediates(gcc1, t1r, t2r, eri1)
        l1ref, l2ref = gccsd_lambda.update_lambda(gcc1, t1r, t2r, l1r, l2r,
                                                  eri1, imds)

        t1 = addons.spin2spatial(t1r, orbspin)
        t2 = addons.spin2spatial(t2r, orbspin)
        l1 = addons.spin2spatial(l1r, orbspin)
        l2 = addons.spin2spatial(l2r, orbspin)
        imds = uccsd_lambda.make_intermediates(mycc, t1, t2, eris)
        l1, l2 = uccsd_lambda.update_lambda(mycc, t1, t2, l1, l2, eris, imds)
        self.assertAlmostEqual(
            float(abs(addons.spatial2spin(l1, orbspin) - l1ref).max()), 0, 8)
        self.assertAlmostEqual(
            float(abs(addons.spatial2spin(l2, orbspin) - l2ref).max()), 0, 8)

        l1ref = addons.spin2spatial(l1ref, orbspin)
        l2ref = addons.spin2spatial(l2ref, orbspin)
        self.assertAlmostEqual(abs(l1[0] - l1ref[0]).max(), 0, 8)
        self.assertAlmostEqual(abs(l1[1] - l1ref[1]).max(), 0, 8)
        self.assertAlmostEqual(abs(l2[0] - l2ref[0]).max(), 0, 8)
        self.assertAlmostEqual(abs(l2[1] - l2ref[1]).max(), 0, 8)
        self.assertAlmostEqual(abs(l2[2] - l2ref[2]).max(), 0, 8)
Ejemplo n.º 5
0
def to_ucisdvec(civec, nmo, nocc, orbspin):
    '''Convert the GCISD coefficient vector to UCISD coefficient vector'''
    c0, c1, c2 = cisdvec_to_amplitudes(civec, nmo, nocc)
    c1 = spin2spatial(c1, orbspin)
    c2 = spin2spatial(c2, orbspin)
    ucisdvec = ucisd.amplitudes_to_cisdvec(c0, c1, c2)
    unorm = numpy.linalg.norm(ucisdvec)
    if unorm < 1e-2:
        raise RuntimeError('GCISD vector corresponds to spin-flip excitation. '
                           'It cannot be converted to UCISD wfn.'
                           'norm(UCISD) = %s' % unorm)
    elif unorm < 0.99:
        warnings.warn('GCISD vector has spin-flip excitation. '
                      'They are ignored when converting to UCISD wfn. '
                      'norm(UCISD) = %s' % unorm)
    return ucisdvec
Ejemplo n.º 6
0
def to_ucisdvec(civec, nmo, nocc, orbspin):
    '''Convert the GCISD coefficient vector to UCISD coefficient vector'''
    c0, c1, c2 = cisdvec_to_amplitudes(civec, nmo, nocc)
    c1 = spin2spatial(c1, orbspin)
    c2 = spin2spatial(c2, orbspin)
    ucisdvec = ucisd.amplitudes_to_cisdvec(c0, c1, c2)
    unorm = numpy.linalg.norm(ucisdvec)
    if unorm < 1e-2:
        raise RuntimeError('GCISD vector corresponds to spin-flip excitation. '
                           'It cannot be converted to UCISD wfn.'
                           'norm(UCISD) = %s' % unorm)
    elif unorm < 0.99:
        warnings.warn('GCISD vector has spin-flip excitation. '
                      'They are ignored when converting to UCISD wfn. '
                      'norm(UCISD) = %s' % unorm)
    return ucisdvec
Ejemplo n.º 7
0
    def test_update_lambda_real(self):
        numpy.random.seed(21)
        eris = mycc.ao2mo()
        gcc1 = gccsd.GCCSD(scf.addons.convert_to_ghf(mf))
        eri1 = gcc1.ao2mo()
        orbspin = eri1.orbspin

        nocc = mol.nelectron
        nvir = mol.nao_nr()*2 - nocc

        t1r = numpy.random.random((nocc,nvir))*.1
        t2r = numpy.random.random((nocc,nocc,nvir,nvir))*.1
        t2r = t2r - t2r.transpose(1,0,2,3)
        t2r = t2r - t2r.transpose(0,1,3,2)
        l1r = numpy.random.random((nocc,nvir))*.1
        l2r = numpy.random.random((nocc,nocc,nvir,nvir))*.1
        l2r = l2r - l2r.transpose(1,0,2,3)
        l2r = l2r - l2r.transpose(0,1,3,2)
        t1r = addons.spin2spatial(t1r, orbspin)
        t2r = addons.spin2spatial(t2r, orbspin)
        t1r = addons.spatial2spin(t1r, orbspin)
        t2r = addons.spatial2spin(t2r, orbspin)
        l1r = addons.spin2spatial(l1r, orbspin)
        l2r = addons.spin2spatial(l2r, orbspin)
        l1r = addons.spatial2spin(l1r, orbspin)
        l2r = addons.spatial2spin(l2r, orbspin)
        imds = gccsd_lambda.make_intermediates(gcc1, t1r, t2r, eri1)
        l1ref, l2ref = gccsd_lambda.update_lambda(gcc1, t1r, t2r, l1r, l2r, eri1, imds)

        t1 = addons.spin2spatial(t1r, orbspin)
        t2 = addons.spin2spatial(t2r, orbspin)
        l1 = addons.spin2spatial(l1r, orbspin)
        l2 = addons.spin2spatial(l2r, orbspin)
        imds = uccsd_lambda.make_intermediates(mycc, t1, t2, eris)
        l1, l2 = uccsd_lambda.update_lambda(mycc, t1, t2, l1, l2, eris, imds)
        self.assertAlmostEqual(float(abs(addons.spatial2spin(l1, orbspin)-l1ref).max()), 0, 8)
        self.assertAlmostEqual(float(abs(addons.spatial2spin(l2, orbspin)-l2ref).max()), 0, 8)

        l1ref = addons.spin2spatial(l1ref, orbspin)
        l2ref = addons.spin2spatial(l2ref, orbspin)
        self.assertAlmostEqual(abs(l1[0]-l1ref[0]).max(), 0, 8)
        self.assertAlmostEqual(abs(l1[1]-l1ref[1]).max(), 0, 8)
        self.assertAlmostEqual(abs(l2[0]-l2ref[0]).max(), 0, 8)
        self.assertAlmostEqual(abs(l2[1]-l2ref[1]).max(), 0, 8)
        self.assertAlmostEqual(abs(l2[2]-l2ref[2]).max(), 0, 8)
Ejemplo n.º 8
0
 def spin2spatial(self, tx, orbspin=None):
     if orbspin is None:
         orbspin = getattr(self.mo_coeff, 'orbspin', None)
         if orbspin is not None:
             orbspin = orbspin[self.get_frozen_mask()]
     return spin2spatial(tx, orbspin)
Ejemplo n.º 9
0
 def spin2spatial(self, tx, orbspin=None):
     if orbspin is None:
         orbspin = getattr(self.mo_coeff, 'orbspin', None)
         if orbspin is not None:
             orbspin = orbspin[self.get_frozen_mask()]
     return spin2spatial(tx, orbspin)