/usr/include/libint2/GenericGaussDeriv.impl.h is in libint2-dev 2.3.0~beta3-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | /*
* This file is a part of Libint.
* Copyright (C) 2004-2014 Edward F. Valeev
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License, version 2,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*
*/
#ifndef _libint2_src_lib_libint_genericgaussderivimpl_h_
#define _libint2_src_lib_libint_genericgaussderivimpl_h_
#include <GenericGaussDeriv.h>
namespace libint2 {
/** builds ( ... d a / d r_dir ... )
src0 = ( ... a+1 ... )
src1 = ( ... a-1 ... )
**/
template <int L, //!< the angular momentum of this shell (i.e. the shell being differentiated)
bool vectorize>
void
GenericGaussDeriv<L,vectorize>::compute(const Libint_t* inteval,
LIBINT2_REALTYPE* target,
const LIBINT2_REALTYPE* src0,
const LIBINT2_REALTYPE* src1,
unsigned int highdim, //!< number of functions more significant than this shell
unsigned int lowdim, //!< number of functions less significant than this shell
unsigned int dir, //!< Cartesian direction of the derivative (0, 1, 2)
const LIBINT2_REALTYPE (&two_alpha)[LIBINT2_MAX_VECLEN] //!< The gaussian exponent of the function being differentiated)
)
{
const unsigned int veclen = vectorize ? inteval->veclen : 1;
const unsigned int lveclen = lowdim * veclen;
const unsigned int N = INT_NCART(L);
const unsigned int Np1 = INT_NCART(L+1);
const unsigned int Nm1 = L > 0 ? INT_NCART(L-1) : 0; // L == 0 case will not use Nm1
for(unsigned int h=0, target_idx=0; h<highdim; ++h) {
const unsigned int hNp1 = h * Np1;
const unsigned int hNm1 = h * Nm1;
int ax, ay, az;
FOR_CART(ax, ay, az, L)
int a[3]; a[0] = ax; a[1] = ay; a[2] = az;
// d |a) / dRi = 2 alpha a+1_i
++a[dir];
const unsigned int iap1 = INT_CARTINDEX(L+1,a[0],a[1]);
const unsigned int ap1_offset = (hNp1 + iap1) * lveclen;
const LIBINT2_REALTYPE* src0_ptr = src0 + ap1_offset;
--a[dir];
const bool have_am1 = (a[dir] > 0);
// d |a) / dRi -= a_i a-1_i
unsigned int iam1;
unsigned int am1_offset;
const LIBINT2_REALTYPE* src1_ptr;
if (have_am1) {
--a[dir];
iam1 = INT_CARTINDEX(L-1,a[0],a[1]);
am1_offset = (hNm1 + iam1) * lveclen;
src1_ptr = src1 + am1_offset;
++a[dir];
}
LIBINT2_REALTYPE adir_real = LIBINT2_REALTYPE(a[dir]);
if (have_am1)
for(unsigned int l = 0, lv=0; l < lowdim; ++l) {
for(unsigned int v=0; v<veclen; ++v, ++lv, ++target_idx) {
target[target_idx] = two_alpha[v] * src0_ptr[lv] - adir_real * src1_ptr[lv];
}
}
else
for(unsigned int l = 0, lv=0; l < lowdim; ++l) {
for(unsigned int v=0; v<veclen; ++v, ++lv, ++target_idx) {
target[target_idx] = two_alpha[v] * src0_ptr[lv];
}
}
#if LIBINT2_FLOP_COUNT
inteval->nflops[0] += (have_am1 ? 3 : 1) * lveclen;
#endif
END_FOR_CART // end of loop over a
}
}
}; // namespace libint2
#endif // header guard
|