Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def amplitudes_to_vector_singlet(r1, r2, kconserv):
'''Transform 3- and 7-dimensional arrays, r1 and r2, to a 1-dimensional
array with unique indices.
For example:
r1: t_{i k_i}^{a k_a}
r2: t_{i k_i, j k_j}^{a k_a, b k_b}
return: a vector with all r1 elements, and r2 elements whose indices
satisfy (i k_i a k_a) >= (j k_j b k_b)
'''
cput0 = (time.clock(), time.time())
log = logger.Logger(sys.stdout, logger.DEBUG)
# r1 indices: k_i, i, a
nkpts, nocc, nvir = np.asarray(r1.shape)[[0, 1, 2]]
nov = nocc * nvir
# r2 indices (old): k_i, k_J, k_a, i, J, a, B
# r2 indices (new): (k_i, k_a), (k_J), (i, a), (J, B)
r2 = r2.transpose(0,2,1,3,5,4,6).reshape(nkpts**2, nkpts, nov, nov)
idx, idy = np.tril_indices(nov)
nov2_tril = nov * (nov + 1) // 2
nov2 = nov * nov
vector = np.empty(r2.size, dtype=r2.dtype)
offset = 0
for ki, ka, kj in kpts_helper.loop_kkk(nkpts):
kb = kconserv[ki, ka, kj]
def kernel(self, mo_coeff=None, ci0=None):
if mo_coeff is None:
mo_coeff = self.mo_coeff
else:
self.mo_coeff = mo_coeff
if ci0 is None:
ci0 = self.ci
if self.verbose >= logger.WARN:
self.check_sanity()
self.dump_flags()
self.e_tot, self.e_cas, self.ci = \
kernel(self, mo_coeff, ci0=ci0, verbose=self.verbose)
log = logger.Logger(self.stdout, self.verbose)
if self.canonicalization:
if isinstance(self.e_cas, (float, numpy.number)):
self.canonicalize_(mo_coeff, self.ci,
cas_natorb=self.natorb, verbose=log)
else:
self.canonicalize_(mo_coeff, self.ci[0],
cas_natorb=self.natorb, verbose=log)
if log.verbose >= logger.NOTE and hasattr(self.fcisolver, 'spin_square'):
if isinstance(self.e_cas, (float, numpy.number)):
ss = self.fcisolver.spin_square(self.ci, self.ncas, self.nelecas)
log.note('CASCI E = %.15g E(CI) = %.15g S^2 = %.7f',
self.e_tot, self.e_cas, ss[0])
else:
for i, e in enumerate(self.e_cas):
def kernel(casscf, mo_coeff, tol=1e-7, conv_tol_grad=None,
ci0=None, callback=None, verbose=None, dump_chk=True):
if verbose is None:
verbose = casscf.verbose
if callback is None:
callback = casscf.callback
log = logger.Logger(casscf.stdout, verbose)
cput0 = (time.clock(), time.time())
log.debug('Start 2-step CASSCF')
mo = mo_coeff
nmo = mo.shape[1]
eris = casscf.ao2mo(mo)
e_tot, e_ci, fcivec = casscf.casci(mo, ci0, eris, log, locals())
if casscf.ncas == nmo and not casscf.internal_rotation:
if casscf.canonicalization:
log.debug('CASSCF canonicalization')
mo, fcivec, mo_energy = casscf.canonicalize(mo, fcivec, eris, False,
casscf.natorb, verbose=log)
return True, e_tot, e_ci, fcivec, mo
if conv_tol_grad is None:
conv_tol_grad = numpy.sqrt(tol)
def eaccsd_star_contract(eom, eaccsd_evals, eaccsd_evecs, leaccsd_evecs, imds=None):
"""
Returns:
e_star (list of float):
The EA-CCSD* energy.
Notes:
See `ipccsd_star_contract` for description of arguments.
Reference:
Saeh, Stanton "...energy surfaces of radicals" JCP 111, 8275 (1999)
"""
assert (eom.partition == None)
cpu1 = cpu0 = (time.clock(), time.time())
log = logger.Logger(eom.stdout, eom.verbose)
if imds is None:
imds = eom.make_imds()
t1, t2 = imds.t1, imds.t2
eris = imds.eris
assert (isinstance(eris, gccsd._PhysicistsERIs))
fock = eris.fock
nocc, nvir = t1.shape
nmo = nocc + nvir
fov = fock[:nocc, nocc:].diagonal()
foo = fock[:nocc, :nocc].diagonal()
fvv = fock[nocc:, nocc:].diagonal()
vvvv = _cp(eris.vvvv)
oovv = _cp(eris.oovv)
ovvv = _cp(eris.ovvv)
def mulliken_pop(mol, dm, s=None, verbose=logger.DEBUG):
r'''Mulliken population analysis
.. math:: M_{ij} = D_{ij} S_{ji}
Mulliken charges
.. math:: \delta_i = \sum_j M_{ij}
'''
if s is None:
s = get_ovlp(mol)
if isinstance(verbose, logger.Logger):
log = verbose
else:
log = logger.Logger(mol.stdout, verbose)
if isinstance(dm, numpy.ndarray) and dm.ndim == 2:
pop = numpy.einsum('ij,ji->i', dm, s).real
else: # ROHF
pop = numpy.einsum('ij,ji->i', dm[0]+dm[1], s).real
label = mol.ao_labels(fmt=None)
log.note(' ** Mulliken pop **')
for i, s in enumerate(label):
log.note('pop of %s %10.5f', '%d%s %s%-4s'%s, pop[i])
log.note(' ** Mulliken atomic charges **')
chg = numpy.zeros(mol.natm)
for i, s in enumerate(label):
chg[s[0]] += pop[i]
for ia in range(mol.natm):
symb = mol.atom_symbol(ia)
def analyze(mf, verbose=logger.DEBUG, **kwargs):
'''Analyze the given SCF object: print orbital energies, occupancies;
print orbital coefficients; Mulliken population analysis; Diople moment.
'''
from pyscf.lo import orth
from pyscf.tools import dump_mat
mo_energy = mf.mo_energy
mo_occ = mf.mo_occ
mo_coeff = mf.mo_coeff
if isinstance(verbose, logger.Logger):
log = verbose
else:
log = logger.Logger(mf.stdout, verbose)
log.note('**** MO energy ****')
for i,c in enumerate(mo_occ):
log.note('MO #%-3d energy= %-18.15g occ= %g', i+1, mo_energy[i], c)
ovlp_ao = mf.get_ovlp()
if verbose >= logger.DEBUG:
log.debug(' ** MO coefficients (expansion on meta-Lowdin AOs) **')
label = mf.mol.spheric_labels(True)
orth_coeff = orth.orth_ao(mf.mol, 'meta_lowdin', s=ovlp_ao)
c = reduce(numpy.dot, (orth_coeff.T, ovlp_ao, mo_coeff))
dump_mat.dump_rec(mf.stdout, c, label, start=1, **kwargs)
dm = mf.make_rdm1(mo_coeff, mo_occ)
return (mf.mulliken_meta(mf.mol, dm, s=ovlp_ao, verbose=log),
mf.dip_moment(mf.mol, dm, verbose=log))
where `L` denotes DF auxiliary basis functions and `p` and `q` canonical
crystalline orbitals. Note that `p` and `q` contain kpt indices `kp` and `kq`,
and the third kpt index `kL` is determined by the conservation of momentum.
Arguments:
cis {KCIS} -- A KCIS instance
eris {_CIS_ERIS} -- A _CIS_ERIS instance to which we want to add 3c ints
Returns:
_CIS_ERIS -- A _CIS_ERIS instance with 3c ints
"""
from pyscf.pbc.df import df
from pyscf.ao2mo import _ao2mo
from pyscf.pbc.lib.kpts_helper import gamma_point
log = logger.Logger(cis.stdout, cis.verbose)
if cis._scf.with_df._cderi is None:
cis._scf.with_df.build()
cell = cis._scf.cell
if cell.dimension == 2:
# 2D ERIs are not positive definite. The 3-index tensors are stored in
# two part. One corresponds to the positive part and one corresponds
# to the negative part. The negative part is not considered in the
# DF-driven CCSD implementation.
raise NotImplementedError
nocc = cis.nocc
nmo = cis.nmo
nao = cell.nao_nr()
def analyze(mf, verbose=logger.DEBUG, **kwargs):
from pyscf.lo import orth
from pyscf.tools import dump_mat
mol = mf.mol
if not mol.symmetry:
return uhf.analyze(mf, verbose, **kwargs)
mo_energy = mf.mo_energy
mo_occ = mf.mo_occ
mo_coeff = mf.mo_coeff
log = logger.Logger(mf.stdout, verbose)
nirrep = len(mol.irrep_id)
ovlp_ao = mf.get_ovlp()
orbsyma = symm.label_orb_symm(mol, mol.irrep_id, mol.symm_orb,
mo_coeff[0], ovlp_ao, False)
orbsymb = symm.label_orb_symm(mol, mol.irrep_id, mol.symm_orb,
mo_coeff[1], ovlp_ao, False)
orbsyma = numpy.array(orbsyma)
orbsymb = numpy.array(orbsymb)
tot_sym = 0
noccsa = [sum(orbsyma[mo_occ[0]>0]==ir) for ir in mol.irrep_id]
noccsb = [sum(orbsymb[mo_occ[1]>0]==ir) for ir in mol.irrep_id]
for i, ir in enumerate(mol.irrep_id):
if (noccsa[i]+noccsb[i]) % 2:
tot_sym ^= ir
if mol.groupname in ('Dooh', 'Coov', 'SO3'):
log.note('TODO: total symmetry for %s', mol.groupname)
Sort natural orbitals wrt the occupancy. Be careful with this
option since the resultant natural orbitals might have the
different symmetry to the irreps indicated by CASSCF.orbsym
Returns:
A tuple, the first item is natural orbitals, the second is updated CI
coefficients, the third is the natural occupancy associated to the
natural orbitals.
'''
from pyscf.lo import orth
from pyscf.tools import dump_mat
from pyscf.tools.mo_mapping import mo_1to1map
if isinstance(verbose, logger.Logger):
log = verbose
else:
log = logger.Logger(mc.stdout, mc.verbose)
if mo_coeff is None: mo_coeff = mc.mo_coeff
if ci is None: ci = mc.ci
ncore = mc.ncore
ncas = mc.ncas
nocc = ncore + ncas
nelecas = mc.nelecas
if casdm1 is None:
casdm1 = mc.fcisolver.make_rdm1(ci, ncas, nelecas)
# orbital symmetry is reserved in this _eig call
occ, ucas = mc._eig(-casdm1, ncore, nocc)
if sort:
idx = numpy.argsort(occ)
occ = occ[idx]
ucas = ucas[:,idx]
# restore phase
# where_natorb gives the location of the natural orbital for the input cas
def update_lambda(mycc, t1, t2, l1, l2, eris, imds):
time0 = time.clock(), time.time()
log = logger.Logger(mycc.stdout, mycc.verbose)
t1a, t1b = t1
t2aa, t2ab, t2bb = t2
l1a, l1b = l1
l2aa, l2ab, l2bb = l2
nocca, nvira = t1a.shape
noccb, nvirb = t1b.shape
u1a = numpy.zeros_like(l1a)
u1b = numpy.zeros_like(l1b)
u2aa = numpy.zeros_like(l2aa)
u2ab = numpy.zeros_like(l2ab)
u2bb = numpy.zeros_like(l2bb)
mo_ea_o = eris.mo_energy[0][:nocca]
mo_ea_v = eris.mo_energy[0][nocca:] + mycc.level_shift
mo_eb_o = eris.mo_energy[1][:noccb]
mo_eb_v = eris.mo_energy[1][noccb:] + mycc.level_shift