#!/usr/bin/env python
# Copyright 2014-2020 The PySCF Developers. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Author: Qiming Sun <osirpt.sun@gmail.com>
#
'''
Coupled cluster doubles
'''
import numpy
from pyscf.cc import ccsd
from pyscf.cc import ccsd_lambda
from pyscf.cc import ccsd_rdm
[docs]
class CCD(ccsd.CCSD):
[docs]
def update_amps(self, t1, t2, eris):
t1, t2 = ccsd.update_amps(self, t1, t2, eris)
return numpy.zeros_like(t1), t2
[docs]
def kernel(self, t2=None, eris=None):
nocc = self.nocc
nvir = self.nmo - nocc
t1 = numpy.zeros((nocc, nvir))
ccsd.CCSD.kernel(self, t1, t2, eris)
return self.e_corr, self.t2
[docs]
def solve_lambda(self, t2=None, l2=None, eris=None):
if t2 is None: t2 = self.t2
if eris is None: eris = self.ao2mo(self.mo_coeff)
nocc = self.nocc
nvir = self.nmo - nocc
l1 = t1 = numpy.zeros((nocc, nvir))
def update_lambda(mycc, t1, t2, l1, l2, eris=None, imds=None):
l1, l2 = ccsd_lambda.update_lambda(mycc, t1, t2, l1, l2, eris, imds)
return numpy.zeros_like(l1), l2
self.converged_lambda, self.l1, self.l2 = \
ccsd_lambda.kernel(self, eris, t1, t2, l1, l2,
max_cycle=self.max_cycle,
tol=self.conv_tol_normt,
verbose=self.verbose, fupdate=update_lambda)
return self.l2
[docs]
def make_rdm1(self, t2=None, l2=None, ao_repr=False):
'''Un-relaxed 1-particle density matrix in MO space'''
if t2 is None: t2 = self.t2
if l2 is None: l2 = self.l2
if l2 is None: l2 = self.solve_lambda(t2)
nocc = self.nocc
nvir = self.nmo - nocc
l1 = t1 = numpy.zeros((nocc, nvir))
return ccsd_rdm.make_rdm1(self, t1, t2, l1, l2, ao_repr=ao_repr)
[docs]
def make_rdm2(self, t1=None, t2=None, l1=None, l2=None, ao_repr=False):
'''2-particle density matrix in MO space. The density matrix is
stored as
dm2[p,r,q,s] = <p^+ q^+ s r>
'''
if t2 is None: t2 = self.t2
if l2 is None: l2 = self.l2
if l2 is None: l2 = self.solve_lambda(t2)
nocc = self.nocc
nvir = self.nmo - nocc
l1 = t1 = numpy.zeros((nocc, nvir))
return ccsd_rdm.make_rdm2(self, t1, t2, l1, l2, ao_repr=ao_repr)