Source code for pyscf.adc.uadc_ao2mo

# Copyright 2014-2022 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: Abdelrahman Ahmed <>
#         Samragni Banerjee <samragnibanerjee4@gmail.com>
#         James Serna <jamcar456@gmail.com>
#         Terrence Stahl <>
#         Alexander Sokolov <alexander.y.sokolov@gmail.com>
#

import numpy as np
import pyscf.ao2mo as ao2mo
from pyscf import lib
from pyscf.lib import logger
from pyscf.adc import radc_ao2mo

### Integral transformation for integrals in Chemists' notation###
[docs] def transform_integrals_incore(myadc): cput0 = (logger.process_clock(), logger.perf_counter()) log = logger.Logger(myadc.stdout, myadc.verbose) occ_a = myadc.mo_coeff[0][:,:myadc._nocc[0]] occ_b = myadc.mo_coeff[1][:,:myadc._nocc[1]] vir_a = myadc.mo_coeff[0][:,myadc._nocc[0]:] vir_b = myadc.mo_coeff[1][:,myadc._nocc[1]:] nocc_a = occ_a.shape[1] nocc_b = occ_b.shape[1] nvir_a = vir_a.shape[1] nvir_b = vir_b.shape[1] ind_vv_g = np.tril_indices(nvir_a, k=-1) ind_VV_g = np.tril_indices(nvir_b, k=-1) eris = lambda: None eris.oooo = ao2mo.general(myadc._scf._eri, (occ_a, occ_a, occ_a, occ_a), compact=False).reshape(nocc_a, nocc_a, nocc_a, nocc_a).copy() # noqa: E501 eris.ovoo = ao2mo.general(myadc._scf._eri, (occ_a, vir_a, occ_a, occ_a), compact=False).reshape(nocc_a, nvir_a, nocc_a, nocc_a).copy() # noqa: E501 eris.ovvo = ao2mo.general(myadc._scf._eri, (occ_a, vir_a, vir_a, occ_a), compact=False).reshape(nocc_a, nvir_a, nvir_a, nocc_a).copy() # noqa: E501 eris.oovv = ao2mo.general(myadc._scf._eri, (occ_a, occ_a, vir_a, vir_a), compact=False).reshape(nocc_a, nocc_a, nvir_a, nvir_a).copy() # noqa: E501 eris.ovvv = ao2mo.general(myadc._scf._eri, (occ_a, vir_a, vir_a, vir_a), compact=True).reshape(nocc_a, nvir_a, -1).copy() # noqa: E501 eris.OOOO = ao2mo.general(myadc._scf._eri, (occ_b, occ_b, occ_b, occ_b), compact=False).reshape(nocc_b, nocc_b, nocc_b, nocc_b).copy() # noqa: E501 eris.OVOO = ao2mo.general(myadc._scf._eri, (occ_b, vir_b, occ_b, occ_b), compact=False).reshape(nocc_b, nvir_b, nocc_b, nocc_b).copy() # noqa: E501 eris.OOVV = ao2mo.general(myadc._scf._eri, (occ_b, occ_b, vir_b, vir_b), compact=False).reshape(nocc_b, nocc_b, nvir_b, nvir_b).copy() # noqa: E501 eris.OVVO = ao2mo.general(myadc._scf._eri, (occ_b, vir_b, vir_b, occ_b), compact=False).reshape(nocc_b, nvir_b, nvir_b, nocc_b).copy() # noqa: E501 eris.OVVV = ao2mo.general(myadc._scf._eri, (occ_b, vir_b, vir_b, vir_b), compact=True).reshape(nocc_b, nvir_b, -1).copy() # noqa: E501 eris.ooOO = ao2mo.general(myadc._scf._eri, (occ_a, occ_a, occ_b, occ_b), compact=False).reshape(nocc_a, nocc_a, nocc_b, nocc_b).copy() # noqa: E501 eris.ovOO = ao2mo.general(myadc._scf._eri, (occ_a, vir_a, occ_b, occ_b), compact=False).reshape(nocc_a, nvir_a, nocc_b, nocc_b).copy() # noqa: E501 eris.ooVV = ao2mo.general(myadc._scf._eri, (occ_a, occ_a, vir_b, vir_b), compact=False).reshape(nocc_a, nocc_a, nvir_b, nvir_b).copy() # noqa: E501 eris.ovVO = ao2mo.general(myadc._scf._eri, (occ_a, vir_a, vir_b, occ_b), compact=False).reshape(nocc_a, nvir_a, nvir_b, nocc_b).copy() # noqa: E501 eris.ovVV = ao2mo.general(myadc._scf._eri, (occ_a, vir_a, vir_b, vir_b), compact=True).reshape(nocc_a, nvir_a, -1).copy() # noqa: E501 eris.OVoo = ao2mo.general(myadc._scf._eri, (occ_b, vir_b, occ_a, occ_a), compact=False).reshape(nocc_b, nvir_b, nocc_a, nocc_a).copy() # noqa: E501 eris.OOvv = ao2mo.general(myadc._scf._eri, (occ_b, occ_b, vir_a, vir_a), compact=False).reshape(nocc_b, nocc_b, nvir_a, nvir_a).copy() # noqa: E501 eris.OVvo = ao2mo.general(myadc._scf._eri, (occ_b, vir_b, vir_a, occ_a), compact=False).reshape(nocc_b, nvir_b, nvir_a, nocc_a).copy() # noqa: E501 eris.OVvv = ao2mo.general(myadc._scf._eri, (occ_b, vir_b, vir_a, vir_a), compact=True).reshape(nocc_b, nvir_b, -1).copy() # noqa: E501 if (myadc.method == "adc(2)-x" and myadc.approx_trans_moments is False) or (myadc.method == "adc(3)"): eris.vvvv_p = ao2mo.general(myadc._scf._eri, (vir_a, vir_a, vir_a, vir_a), compact=False).reshape(nvir_a, nvir_a, nvir_a, nvir_a) eris.vvvv_p = eris.vvvv_p.transpose(0,2,1,3) eris.vvvv_p -= eris.vvvv_p.transpose(0,1,3,2) eris.vvvv_p = eris.vvvv_p[:, :, ind_vv_g[0], ind_vv_g[1]] eris.vvvv_p = eris.vvvv_p[ind_vv_g[0], ind_vv_g[1]].copy() eris.VVVV_p = ao2mo.general(myadc._scf._eri, (vir_b, vir_b, vir_b, vir_b), compact=False).reshape(nvir_b, nvir_b, nvir_b, nvir_b) eris.VVVV_p = eris.VVVV_p.transpose(0,2,1,3) eris.VVVV_p -= eris.VVVV_p.transpose(0,1,3,2) eris.VVVV_p = eris.VVVV_p[:, :, ind_VV_g[0], ind_VV_g[1]] eris.VVVV_p = eris.VVVV_p[ind_VV_g[0], ind_VV_g[1]].copy() eris.vVvV_p = ao2mo.general(myadc._scf._eri, (vir_a, vir_a, vir_b, vir_b), compact=False).reshape(nvir_a, nvir_a, nvir_b, nvir_b) eris.vVvV_p = np.ascontiguousarray(eris.vVvV_p.transpose(0,2,1,3)) eris.vVvV_p = eris.vVvV_p.reshape(nvir_a*nvir_b, nvir_a*nvir_b) log.timer('ADC incore integral transformation', *cput0) return eris
[docs] def transform_integrals_outcore(myadc): cput0 = (logger.process_clock(), logger.perf_counter()) log = logger.Logger(myadc.stdout, myadc.verbose) mo_a = myadc.mo_coeff[0] mo_b = myadc.mo_coeff[1] nmo_a = mo_a.shape[1] nmo_b = mo_b.shape[1] occ_a = myadc.mo_coeff[0][:,:myadc._nocc[0]] occ_b = myadc.mo_coeff[1][:,:myadc._nocc[1]] vir_a = myadc.mo_coeff[0][:,myadc._nocc[0]:] vir_b = myadc.mo_coeff[1][:,myadc._nocc[1]:] nocc_a = occ_a.shape[1] nocc_b = occ_b.shape[1] nvir_a = vir_a.shape[1] nvir_b = vir_b.shape[1] nvpair_a = nvir_a * (nvir_a+1) // 2 nvpair_b = nvir_b * (nvir_b+1) // 2 eris = lambda:None eris.feri1 = lib.H5TmpFile() eris.oooo = eris.feri1.create_dataset('oooo', (nocc_a,nocc_a,nocc_a,nocc_a), 'f8') eris.oovv = eris.feri1.create_dataset( 'oovv', (nocc_a,nocc_a,nvir_a,nvir_a), 'f8', chunks=(nocc_a,nocc_a,1,nvir_a)) eris.ovoo = eris.feri1.create_dataset( 'ovoo', (nocc_a,nvir_a,nocc_a,nocc_a), 'f8', chunks=(nocc_a,1,nocc_a,nocc_a)) eris.ovvo = eris.feri1.create_dataset( 'ovvo', (nocc_a,nvir_a,nvir_a,nocc_a), 'f8', chunks=(nocc_a,1,nvir_a,nocc_a)) eris.ovvv = eris.feri1.create_dataset('ovvv', (nocc_a,nvir_a,nvpair_a), 'f8') eris.OOOO = eris.feri1.create_dataset('OOOO', (nocc_b,nocc_b,nocc_b,nocc_b), 'f8') eris.OOVV = eris.feri1.create_dataset( 'OOVV', (nocc_b,nocc_b,nvir_b,nvir_b), 'f8', chunks=(nocc_b,nocc_b,1,nvir_b)) eris.OVOO = eris.feri1.create_dataset( 'OVOO', (nocc_b,nvir_b,nocc_b,nocc_b), 'f8', chunks=(nocc_b,1,nocc_b,nocc_b)) eris.OVVO = eris.feri1.create_dataset( 'OVVO', (nocc_b,nvir_b,nvir_b,nocc_b), 'f8', chunks=(nocc_b,1,nvir_b,nocc_b)) eris.OVVV = eris.feri1.create_dataset('OVVV', (nocc_b,nvir_b,nvpair_b), 'f8') eris.ooOO = eris.feri1.create_dataset('ooOO', (nocc_a,nocc_a,nocc_b,nocc_b), 'f8') eris.ooVV = eris.feri1.create_dataset( 'ooVV', (nocc_a,nocc_a,nvir_b,nvir_b), 'f8', chunks=(nocc_a,nocc_a,1,nvir_b)) eris.ovOO = eris.feri1.create_dataset( 'ovOO', (nocc_a,nvir_a,nocc_b,nocc_b), 'f8', chunks=(nocc_a,1,nocc_b,nocc_b)) eris.ovVO = eris.feri1.create_dataset( 'ovVO', (nocc_a,nvir_a,nvir_b,nocc_b), 'f8', chunks=(nocc_a,1,nvir_b,nocc_b)) eris.ovVV = eris.feri1.create_dataset('ovVV', (nocc_a,nvir_a,nvpair_b), 'f8') eris.OOvv = eris.feri1.create_dataset( 'OOvv', (nocc_b,nocc_b,nvir_a,nvir_a), 'f8', chunks=(nocc_b,nocc_b,1,nvir_a)) eris.OVoo = eris.feri1.create_dataset( 'OVoo', (nocc_b,nvir_b,nocc_a,nocc_a), 'f8', chunks=(nocc_b,1,nocc_a,nocc_a)) eris.OVvo = eris.feri1.create_dataset( 'OVvo', (nocc_b,nvir_b,nvir_a,nocc_a), 'f8', chunks=(nocc_b,1,nvir_a,nocc_a)) eris.OVvv = eris.feri1.create_dataset('OVvv', (nocc_b,nvir_b,nvpair_a), 'f8') cput1 = logger.process_clock(), logger.perf_counter() mol = myadc.mol tmpf = lib.H5TmpFile() if nocc_a > 0: ao2mo.general(mol, (occ_a,mo_a,mo_a,mo_a), tmpf, 'aa') buf = np.empty((nmo_a,nmo_a,nmo_a)) for i in range(nocc_a): lib.unpack_tril(tmpf['aa'][i*nmo_a:(i+1)*nmo_a], out=buf) eris.oooo[i] = buf[:nocc_a,:nocc_a,:nocc_a] eris.ovoo[i] = buf[nocc_a:,:nocc_a,:nocc_a] eris.oovv[i] = buf[:nocc_a,nocc_a:,nocc_a:] eris.ovvo[i] = buf[nocc_a:,nocc_a:,:nocc_a] eris.ovvv[i] = lib.pack_tril(buf[nocc_a:,nocc_a:,nocc_a:]) del (tmpf['aa']) if nocc_b > 0: buf = np.empty((nmo_b,nmo_b,nmo_b)) ao2mo.general(mol, (occ_b,mo_b,mo_b,mo_b), tmpf, 'bb') for i in range(nocc_b): lib.unpack_tril(tmpf['bb'][i*nmo_b:(i+1)*nmo_b], out=buf) eris.OOOO[i] = buf[:nocc_b,:nocc_b,:nocc_b] eris.OVOO[i] = buf[nocc_b:,:nocc_b,:nocc_b] eris.OOVV[i] = buf[:nocc_b,nocc_b:,nocc_b:] eris.OVVO[i] = buf[nocc_b:,nocc_b:,:nocc_b] eris.OVVV[i] = lib.pack_tril(buf[nocc_b:,nocc_b:,nocc_b:]) del (tmpf['bb']) if nocc_a > 0: buf = np.empty((nmo_a,nmo_b,nmo_b)) ao2mo.general(mol, (occ_a,mo_a,mo_b,mo_b), tmpf, 'ab') for i in range(nocc_a): lib.unpack_tril(tmpf['ab'][i*nmo_a:(i+1)*nmo_a], out=buf) eris.ooOO[i] = buf[:nocc_a,:nocc_b,:nocc_b] eris.ovOO[i] = buf[nocc_a:,:nocc_b,:nocc_b] eris.ooVV[i] = buf[:nocc_a,nocc_b:,nocc_b:] eris.ovVO[i] = buf[nocc_a:,nocc_b:,:nocc_b] eris.ovVV[i] = lib.pack_tril(buf[nocc_a:,nocc_b:,nocc_b:]) del (tmpf['ab']) if nocc_b > 0: buf = np.empty((nmo_b,nmo_a,nmo_a)) ao2mo.general(mol, (occ_b,mo_b,mo_a,mo_a), tmpf, 'ba') for i in range(nocc_b): lib.unpack_tril(tmpf['ba'][i*nmo_b:(i+1)*nmo_b], out=buf) eris.OVoo[i] = buf[nocc_b:,:nocc_a,:nocc_a] eris.OOvv[i] = buf[:nocc_b,nocc_a:,nocc_a:] eris.OVvo[i] = buf[nocc_b:,nocc_a:,:nocc_a] eris.OVvv[i] = lib.pack_tril(buf[nocc_b:,nocc_a:,nocc_a:]) del(tmpf['ba']) buf = None cput1 = logger.timer_debug1(myadc, 'transforming oopq, ovpq', *cput1) ############### forming eris_vvvv ######################################## if (myadc.method == "adc(2)-x" and myadc.approx_trans_moments is False) or (myadc.method == "adc(3)"): cput2 = logger.process_clock(), logger.perf_counter() ind_vv_g = np.tril_indices(nvir_a, k=-1) ind_VV_g = np.tril_indices(nvir_b, k=-1) eris.vvvv_p = [] eris.VVVV_p = [] eris.vVvV_p = [] eris.VvVv_p = [] avail_mem = (myadc.max_memory - lib.current_memory()[0]) * 0.25 vvv_mem = (nvir_a**3) * 8/1e6 chnk_size = int(avail_mem/vvv_mem) if chnk_size <= 0 : chnk_size = 1 # Cache vvvv data in an unlinked h5 temporary file. h5cache_vvvv = eris._h5cache_vvvv = lib.H5TmpFile() for p in range(0,vir_a.shape[1],chnk_size): if chnk_size < vir_a.shape[1] : orb_slice = vir_a[:, p:p+chnk_size] else: orb_slice = vir_a[:, p:] with lib.H5TmpFile() as tmpf: ao2mo.outcore.general(mol, (orb_slice, vir_a, vir_a, vir_a), tmpf, max_memory=avail_mem, ioblk_size=100, compact=False) vvvv = tmpf['eri_mo'][:] vvvv = vvvv.reshape(orb_slice.shape[1], vir_a.shape[1], vir_a.shape[1], vir_a.shape[1]) vvvv = np.ascontiguousarray(vvvv.transpose(0,2,1,3)) vvvv -= np.ascontiguousarray(vvvv.transpose(0,1,3,2)) vvvv = vvvv[:, :, ind_vv_g[0], ind_vv_g[1]] vvvv_p = h5cache_vvvv.create_dataset(f'a-{p}', data=vvvv) eris.vvvv_p.append(vvvv_p) vvvv = None for p in range(0,vir_b.shape[1],chnk_size): if chnk_size < vir_b.shape[1] : orb_slice = vir_b[:, p:p+chnk_size] else: orb_slice = vir_b[:, p:] with lib.H5TmpFile() as tmpf: ao2mo.outcore.general(mol, (orb_slice, vir_b, vir_b, vir_b), tmpf, max_memory=avail_mem, ioblk_size=100, compact=False) VVVV = tmpf['eri_mo'][:] VVVV = VVVV.reshape(orb_slice.shape[1], vir_b.shape[1], vir_b.shape[1], vir_b.shape[1]) VVVV = np.ascontiguousarray(VVVV.transpose(0,2,1,3)) VVVV -= np.ascontiguousarray(VVVV.transpose(0,1,3,2)) VVVV = VVVV[:, :, ind_VV_g[0], ind_VV_g[1]] VVVV_p = h5cache_vvvv.create_dataset(f'b-{p}', data=VVVV) eris.VVVV_p.append(VVVV_p) vvvv = None for p in range(0,vir_a.shape[1],chnk_size): if chnk_size < vir_a.shape[1] : orb_slice = vir_a[:, p:p+chnk_size] else: orb_slice = vir_a[:, p:] with lib.H5TmpFile() as tmpf: ao2mo.outcore.general(mol, (orb_slice, vir_a, vir_b, vir_b), tmpf, max_memory=avail_mem, ioblk_size=100, compact=False) vVvV = tmpf['eri_mo'][:] vVvV = vVvV.reshape(orb_slice.shape[1], vir_a.shape[1], vir_b.shape[1], vir_b.shape[1]) vVvV = np.ascontiguousarray(vVvV.transpose(0,2,1,3)) vVvV = vVvV.reshape(-1, vir_b.shape[1], vir_a.shape[1] * vir_b.shape[1]) vVvV_p = h5cache_vvvv.create_dataset(f'ab-{p}', data=vVvV) eris.vVvV_p.append(vVvV_p) vVvV = None for p in range(0,vir_b.shape[1],chnk_size): if chnk_size < vir_b.shape[1] : orb_slice = vir_b[:, p:p+chnk_size] else: orb_slice = vir_b[:, p:] with lib.H5TmpFile() as tmpf: ao2mo.outcore.general(mol, (orb_slice, vir_b, vir_a, vir_a), tmpf, max_memory=avail_mem, ioblk_size=100, compact=False) VvVv = tmpf['eri_mo'][:] VvVv = VvVv.reshape(orb_slice.shape[1], vir_b.shape[1], vir_a.shape[1], vir_a.shape[1]) VvVv = np.ascontiguousarray(VvVv.transpose(0,2,1,3)) VvVv = VvVv.reshape(-1, vir_a.shape[1], vir_b.shape[1] * vir_a.shape[1]) VvVv_p = h5cache_vvvv.create_dataset(f'ba-{p}', data=VvVv) eris.VvVv_p.append(VvVv_p) VvVv = None cput2 = logger.timer_debug1(myadc, 'transforming vvvv', *cput2) log.timer('ADC outcore integral transformation', *cput0) return eris
[docs] def transform_integrals_df(myadc): cput0 = (logger.process_clock(), logger.perf_counter()) log = logger.Logger(myadc.stdout, myadc.verbose) mo_coeff_a = np.asarray(myadc.mo_coeff[0], order='F') mo_coeff_b = np.asarray(myadc.mo_coeff[1], order='F') mo_a = myadc.mo_coeff[0] mo_b = myadc.mo_coeff[1] nmo_a = mo_a.shape[1] nmo_b = mo_b.shape[1] occ_a = myadc.mo_coeff[0][:,:myadc._nocc[0]] occ_b = myadc.mo_coeff[1][:,:myadc._nocc[1]] vir_a = myadc.mo_coeff[0][:,myadc._nocc[0]:] vir_b = myadc.mo_coeff[1][:,myadc._nocc[1]:] nocc_a = occ_a.shape[1] nocc_b = occ_b.shape[1] nvir_a = vir_a.shape[1] nvir_b = vir_b.shape[1] eris = lambda:None eris.vvvv = None with_df = myadc.with_df naux = with_df.get_naoaux() Loo = np.empty((naux,nocc_a,nocc_a)) Lvo = np.empty((naux,nvir_a,nocc_a)) LOO = np.empty((naux,nocc_b,nocc_b)) LVO = np.empty((naux,nvir_b,nocc_b)) eris.Lov = np.empty((naux,nocc_a,nvir_a)) eris.LOV = np.empty((naux,nocc_b,nvir_b)) eris.Lvv = np.empty((naux,nvir_a,nvir_a)) eris.LVV = np.empty((naux,nvir_b,nvir_b)) if not isinstance(myadc.ncvs, type(None)) and myadc.ncvs > 0: ncvs = myadc.ncvs eris.Lce = np.empty((naux,ncvs,nvir_a)) eris.LCE = np.empty((naux,ncvs,nvir_b)) eris.Lee = eris.Lvv eris.LEE = eris.LVV ijslice = (0, nmo_a, 0, nmo_a) Lpq = None p1 = 0 for eri1 in myadc.with_df.loop(): Lpq = ao2mo._ao2mo.nr_e2(eri1, mo_coeff_a, ijslice, aosym='s2', out=Lpq).reshape(-1,nmo_a,nmo_a) p0, p1 = p1, p1 + Lpq.shape[0] Loo[p0:p1] = Lpq[:,:nocc_a,:nocc_a] eris.Lov[p0:p1] = Lpq[:,:nocc_a,nocc_a:] Lvo[p0:p1] = Lpq[:,nocc_a:,:nocc_a] eris.Lvv[p0:p1] = Lpq[:,nocc_a:,nocc_a:] if not isinstance(myadc.ncvs, type(None)) and myadc.ncvs > 0: eris.Lce[p0:p1] = Lpq[:,:myadc.ncvs,nocc_a:] eris.Lee = eris.Lvv ijslice = (0, nmo_b, 0, nmo_b) Lpq = None p1 = 0 for eri1 in myadc.with_df.loop(): Lpq = ao2mo._ao2mo.nr_e2(eri1, mo_coeff_b, ijslice, aosym='s2', out=Lpq).reshape(-1,nmo_b,nmo_b) p0, p1 = p1, p1 + Lpq.shape[0] LOO[p0:p1] = Lpq[:,:nocc_b,:nocc_b] eris.LOV[p0:p1] = Lpq[:,:nocc_b,nocc_b:] LVO[p0:p1] = Lpq[:,nocc_b:,:nocc_b] eris.LVV[p0:p1] = Lpq[:,nocc_b:,nocc_b:] if not isinstance(myadc.ncvs, type(None)) and myadc.ncvs > 0: eris.LCE[p0:p1] = Lpq[:,:myadc.ncvs,nocc_b:] eris.LEE = eris.LVV Loo = Loo.reshape(naux,nocc_a*nocc_a) eris.Lov = eris.Lov.reshape(naux,nocc_a*nvir_a) Lvo = Lvo.reshape(naux,nocc_a*nvir_a) LOO = LOO.reshape(naux,nocc_b*nocc_b) eris.LOV = eris.LOV.reshape(naux,nocc_b*nvir_b) LVO = LVO.reshape(naux,nocc_b*nvir_b) if not isinstance(myadc.ncvs, type(None)) and myadc.ncvs > 0: eris.Lce = eris.Lce.reshape(naux,ncvs*nvir_a) eris.LCE = eris.LCE.reshape(naux,ncvs*nvir_b) eris.Lee_p = Lvv_p = lib.pack_tril(eris.Lvv) eris.LEE_p = LVV_p = lib.pack_tril(eris.LVV) eris.vvvv_p = None eris.VVVV_p = None eris.vVvV_p = None eris.VvVv_p = None eris.ovvv = None eris.OVVV = None eris.OVVV = None eris.ovVV = None eris.OVvv = None eris.ceee = None eris.CEEE = None eris.ceEE = None eris.CEee = None eris.feri1 = lib.H5TmpFile() eris.oooo = eris.feri1.create_dataset('oooo', (nocc_a,nocc_a,nocc_a,nocc_a), 'f8') eris.oovv = eris.feri1.create_dataset( 'oovv', (nocc_a,nocc_a,nvir_a,nvir_a), 'f8', chunks=(nocc_a,nocc_a,1,nvir_a)) eris.ovoo = eris.feri1.create_dataset( 'ovoo', (nocc_a,nvir_a,nocc_a,nocc_a), 'f8', chunks=(nocc_a,1,nocc_a,nocc_a)) eris.ovvo = eris.feri1.create_dataset( 'ovvo', (nocc_a,nvir_a,nvir_a,nocc_a), 'f8', chunks=(nocc_a,1,nvir_a,nocc_a)) eris.oooo[:] = lib.ddot(Loo.T, Loo).reshape(nocc_a,nocc_a,nocc_a,nocc_a) eris.ovoo[:] = lib.ddot(eris.Lov.T, Loo).reshape(nocc_a,nvir_a,nocc_a,nocc_a) eris.oovv[:] = lib.unpack_tril(lib.ddot(Loo.T, Lvv_p)).reshape(nocc_a,nocc_a,nvir_a,nvir_a) eris.ovvo[:] = lib.ddot(eris.Lov.T, Lvo).reshape(nocc_a,nvir_a,nvir_a,nocc_a) eris.OOOO = eris.feri1.create_dataset('OOOO', (nocc_b,nocc_b,nocc_b,nocc_b), 'f8') eris.OOVV = eris.feri1.create_dataset( 'OOVV', (nocc_b,nocc_b,nvir_b,nvir_b), 'f8', chunks=(nocc_b,nocc_b,1,nvir_b)) eris.OVOO = eris.feri1.create_dataset( 'OVOO', (nocc_b,nvir_b,nocc_b,nocc_b), 'f8', chunks=(nocc_b,1,nocc_b,nocc_b)) eris.OVVO = eris.feri1.create_dataset( 'OVVO', (nocc_b,nvir_b,nvir_b,nocc_b), 'f8', chunks=(nocc_b,1,nvir_b,nocc_b)) eris.OOOO[:] = lib.ddot(LOO.T, LOO).reshape(nocc_b,nocc_b,nocc_b,nocc_b) eris.OVOO[:] = lib.ddot(eris.LOV.T, LOO).reshape(nocc_b,nvir_b,nocc_b,nocc_b) eris.OOVV[:] = lib.unpack_tril(lib.ddot(LOO.T, LVV_p)).reshape(nocc_b,nocc_b,nvir_b,nvir_b) eris.OVVO[:] = lib.ddot(eris.LOV.T, LVO).reshape(nocc_b,nvir_b,nvir_b,nocc_b) eris.ooOO = eris.feri1.create_dataset('ooOO', (nocc_a,nocc_a,nocc_b,nocc_b), 'f8') eris.ooVV = eris.feri1.create_dataset( 'ooVV', (nocc_a,nocc_a,nvir_b,nvir_b), 'f8', chunks=(nocc_a,nocc_a,1,nvir_b)) eris.ovOO = eris.feri1.create_dataset( 'ovOO', (nocc_a,nvir_a,nocc_b,nocc_b), 'f8', chunks=(nocc_a,1,nocc_b,nocc_b)) eris.ovVO = eris.feri1.create_dataset( 'ovVO', (nocc_a,nvir_a,nvir_b,nocc_b), 'f8', chunks=(nocc_a,1,nvir_b,nocc_b)) eris.ooOO[:] = lib.ddot(Loo.T, LOO).reshape(nocc_a,nocc_a,nocc_b,nocc_b) eris.ooVV[:] = lib.unpack_tril(lib.ddot(Loo.T, LVV_p)).reshape(nocc_a,nocc_a,nvir_b,nvir_b) eris.ovOO[:] = lib.ddot(eris.Lov.T, LOO).reshape(nocc_a,nvir_a,nocc_b,nocc_b) eris.ovVO[:] = lib.ddot(eris.Lov.T, LVO).reshape(nocc_a,nvir_a,nvir_b,nocc_b) eris.OOvv = eris.feri1.create_dataset( 'OOvv', (nocc_b,nocc_b,nvir_a,nvir_a), 'f8', chunks=(nocc_b,nocc_b,1,nvir_a)) eris.OVoo = eris.feri1.create_dataset( 'OVoo', (nocc_b,nvir_b,nocc_a,nocc_a), 'f8', chunks=(nocc_b,1,nocc_a,nocc_a)) eris.OVvo = eris.feri1.create_dataset( 'OVvo', (nocc_b,nvir_b,nvir_a,nocc_a), 'f8', chunks=(nocc_b,1,nvir_a,nocc_a)) eris.OOvv[:] = lib.unpack_tril(lib.ddot(LOO.T, Lvv_p)).reshape(nocc_b,nocc_b,nvir_a,nvir_a) eris.OVoo[:] = lib.ddot(eris.LOV.T, Loo).reshape(nocc_b,nvir_b,nocc_a,nocc_a) eris.OVvo[:] = lib.ddot(eris.LOV.T, Lvo).reshape(nocc_b,nvir_b,nvir_a,nocc_a) eris.Lov = eris.Lov.reshape(naux,nocc_a,nvir_a) eris.LOV = eris.LOV.reshape(naux,nocc_b,nvir_b) eris.Lvv = eris.Lvv.reshape(naux,nvir_a,nvir_a) eris.LVV = eris.LVV.reshape(naux,nvir_b,nvir_b) log.timer('DF-ADC integral transformation', *cput0) return eris
[docs] def unpack_eri_1(eri, norb): n_oo = norb * (norb + 1) // 2 ind_oo = np.tril_indices(norb) eri_ = None if len(eri.shape) == 3: if (eri.shape[0] == n_oo): eri_ = np.zeros((norb, norb, eri.shape[1], eri.shape[2])) eri_[ind_oo[0], ind_oo[1]] = eri eri_[ind_oo[1], ind_oo[0]] = eri elif (eri.shape[2] == n_oo): eri_ = np.zeros((eri.shape[0], eri.shape[1], norb, norb)) eri_[:, :, ind_oo[0], ind_oo[1]] = eri eri_[:, :, ind_oo[1], ind_oo[0]] = eri else: raise TypeError("ERI dimensions don't match") else: raise RuntimeError("ERI does not have a correct dimension") return eri_
[docs] def calculate_chunk_size(myadc): avail_mem = (myadc.max_memory - lib.current_memory()[0]) * 0.25 vvv_mem = (myadc._nvir[0]**3) * 8/1e6 chnk_size = int(avail_mem/vvv_mem) if chnk_size <= 0 : chnk_size = 1 return chnk_size