51 static void compute(
const Libint_t* inteval, LIBINT2_REALTYPE* target,
52 const LIBINT2_REALTYPE* src0,
53 const LIBINT2_REALTYPE* src1,
54 const LIBINT2_REALTYPE* src2,
55 const LIBINT2_REALTYPE* src3,
56 const LIBINT2_REALTYPE* src4) {
58 assert(not(La < 2 || Lc < 1));
60 const unsigned int veclen = vectorize ? inteval->veclen : 1;
62 const unsigned int Nc = INT_NCART(Lc);
63 const unsigned int NcV = Nc * veclen;
66 FOR_CART(ax, ay, az, La)
73 enum XYZ { x = 0, y = 1, z = 2 };
81 const LIBINT2_REALTYPE *PA, *WP;
84#if LIBINT2_DEFINED(eri, PA_x)
85 if (not unit_b) PA = inteval->PA_x;
90#if LIBINT2_DEFINED(eri, PA_y)
91 if (not unit_b) PA = inteval->PA_y;
96#if LIBINT2_DEFINED(eri, PA_z)
97 if (not unit_b) PA = inteval->PA_z;
103 const unsigned int iam1 = INT_CARTINDEX(La - 1, a[0], a[1]);
104 const unsigned int am10c0_offset = iam1 * NcV;
105 const LIBINT2_REALTYPE* src0_ptr = unit_b ? 0 : src0 + am10c0_offset;
106 const LIBINT2_REALTYPE* src1_ptr = src1 + am10c0_offset;
111 const unsigned int iam2 = INT_CARTINDEX(La - 2, a[0], a[1]);
112 const unsigned int am20c0_offset = iam2 * NcV;
114 const LIBINT2_REALTYPE* src2_ptr = src2 + am20c0_offset;
115 const LIBINT2_REALTYPE* src3_ptr = src3 + am20c0_offset;
116 const LIBINT2_REALTYPE axyz = (LIBINT2_REALTYPE)a[xyz];
119 for (
unsigned int c = 0; c < Nc; ++c) {
120 for (
unsigned int v = 0; v < veclen; ++v, ++cv) {
121 LIBINT2_REALTYPE value =
122 WP[v] * src1_ptr[cv] +
123 axyz * inteval->oo2z[v] *
124 (src2_ptr[cv] - inteval->roz[v] * src3_ptr[cv]);
125 if (not unit_b) value += PA[v] * src0_ptr[cv];
129#if LIBINT2_FLOP_COUNT
130 inteval->nflops[0] += (unit_b ? 6 : 8) * NcV;
135 for (
unsigned int c = 0; c < Nc; ++c) {
136 for (
unsigned int v = 0; v < veclen; ++v, ++cv) {
137 LIBINT2_REALTYPE value = WP[v] * src1_ptr[cv];
138 if (not unit_b) value += PA[v] * src0_ptr[cv];
142#if LIBINT2_FLOP_COUNT
143 inteval->nflops[0] += (unit_b ? 1 : 3) * NcV;
148 const unsigned int Ncm1 = INT_NCART(Lc - 1);
149 const unsigned int Ncm1V = Ncm1 * veclen;
150 const unsigned int am10cm10_offset = iam1 * Ncm1V;
151 const LIBINT2_REALTYPE* src4_ptr = src4 + am10cm10_offset;
155 FOR_CART(cx, cy, cz, Lc - 1)
163 const unsigned int cc = INT_CARTINDEX(Lc, c[0], c[1]);
164 const unsigned int cc_offset = cc * veclen;
165 LIBINT2_REALTYPE* tptr = target + cc_offset;
166 const LIBINT2_REALTYPE cxyz = (LIBINT2_REALTYPE)c[xyz];
167 for (
unsigned int v = 0; v < veclen; ++v) {
168 tptr[v] += cxyz * inteval->oo2ze[v] * src4_ptr[v];
170#if LIBINT2_FLOP_COUNT
171 inteval->nflops[0] += 3 * veclen;