Source code for pyscf.grad.ucisd

#!/usr/bin/env python
# Copyright 2014-2019 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>
#

'''
UCISD analytical nuclear gradients
'''

import numpy
from pyscf import lib
from pyscf.lib import logger
from pyscf import ao2mo
from pyscf.ci import ucisd
from pyscf.grad import cisd as cisd_grad
from pyscf.grad import uccsd as uccsd_grad


[docs] def grad_elec(cigrad, civec=None, eris=None, atmlst=None, verbose=logger.INFO): myci = cigrad.base if civec is None: civec = myci.ci nocc = myci.nocc nmo = myci.nmo d1 = ucisd._gamma1_intermediates(myci, civec, nmo, nocc) d2 = ucisd._gamma2_intermediates(myci, civec, nmo, nocc) dovov, dovOV, dOVov, dOVOV = d2[0] dvvvv, dvvVV, dVVvv, dVVVV = d2[1] doooo, dooOO, dOOoo, dOOOO = d2[2] doovv, dooVV, dOOvv, dOOVV = d2[3] dovvo, dovVO, dOVvo, dOVVO = d2[4] dvvov, dvvOV, dVVov, dVVOV = d2[5] dovvv, dovVV, dOVvv, dOVVV = d2[6] dooov, dooOV, dOOov, dOOOV = d2[7] nocca, nvira, noccb, nvirb = dovOV.shape dvvvv = dvvvv + dvvvv.transpose(1,0,2,3) dvvvv = ao2mo.restore(4, dvvvv, nvira) * .5 dvvVV = dvvVV + dvvVV.transpose(1,0,2,3) dvvVV = lib.pack_tril(dvvVV[numpy.tril_indices(nvira)]) * .5 dVVVV = dVVVV + dVVVV.transpose(1,0,2,3) dVVVV = ao2mo.restore(4, dVVVV, nvirb) * .5 d2 = ((dovov, dovOV, dOVov, dOVOV), (dvvvv, dvvVV, dVVvv, dVVVV), (doooo, dooOO, dOOoo, dOOOO), (doovv, dooVV, dOOvv, dOOVV), (dovvo, dovVO, dOVvo, dOVVO), (dvvov, dvvOV, dVVov, dVVOV), (dovvv, dovVV, dOVvv, dOVVV), (dooov, dooOV, dOOov, dOOOV)) t1 = t2 = l1 = l2 = civec return uccsd_grad.grad_elec(cigrad, t1, t2, l1, l2, eris, atmlst, d1, d2, verbose)
[docs] class Gradients(cisd_grad.Gradients): grad_elec = grad_elec
Grad = Gradients ucisd.UCISD.Gradients = lib.class_as_method(Gradients)