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