88 const Libint_t* inteval, LIBINT2_REALTYPE* target,
89 const LIBINT2_REALTYPE* src0,
const LIBINT2_REALTYPE* src1,
90 const LIBINT2_REALTYPE* src2,
const LIBINT2_REALTYPE* src3,
91 const LIBINT2_REALTYPE* src4,
const LIBINT2_REALTYPE* src5,
92 const LIBINT2_REALTYPE* src6,
const LIBINT2_REALTYPE* src7,
93 const LIBINT2_REALTYPE* src8,
const LIBINT2_REALTYPE* src9,
94 const LIBINT2_REALTYPE* src10,
const LIBINT2_REALTYPE* src11,
95 const LIBINT2_REALTYPE* src12,
const LIBINT2_REALTYPE* src13,
96 const LIBINT2_REALTYPE* src14,
const LIBINT2_REALTYPE* src15,
97 const LIBINT2_REALTYPE* src16,
const LIBINT2_REALTYPE* src17,
98 const LIBINT2_REALTYPE* src18,
const LIBINT2_REALTYPE* src19,
99 const LIBINT2_REALTYPE* src20,
const LIBINT2_REALTYPE* src21,
100 const LIBINT2_REALTYPE* src22) {
102 assert(not(La < 2 || Lc < 1));
104 const unsigned int veclen = vectorize ? inteval->veclen : 1;
106 const unsigned int Nc = INT_NCART(Lc);
107 const unsigned int NcV = Nc * veclen;
110 FOR_CART(ax, ay, az, La)
117 enum XYZ { x = 0, y = 1, z = 2 };
120 if (ay != 0) xyz = y;
121 if (ax != 0) xyz = x;
125 const LIBINT2_REALTYPE *PA, *WP;
128#if LIBINT2_DEFINED(eri, PA_x)
129 if (not unit_b) PA = inteval->PA_x;
134#if LIBINT2_DEFINED(eri, PA_y)
135 if (not unit_b) PA = inteval->PA_y;
140#if LIBINT2_DEFINED(eri, PA_z)
141 if (not unit_b) PA = inteval->PA_z;
147 const unsigned int iam1 = INT_CARTINDEX(La - 1, a[0], a[1]);
148 const unsigned int am10c0_offset = iam1 * NcV;
149 const LIBINT2_REALTYPE* src0_ptr = unit_b ? 0 : src0 + am10c0_offset;
150 const LIBINT2_REALTYPE* src1_ptr = src1 + am10c0_offset;
155 const unsigned int iam2 = INT_CARTINDEX(La - 2, a[0], a[1]);
156 const unsigned int am20c0_offset = iam2 * NcV;
158 const LIBINT2_REALTYPE* src2_ptr = src2 + am20c0_offset;
159 const LIBINT2_REALTYPE* src3_ptr = src3 + am20c0_offset;
160 const LIBINT2_REALTYPE axyz = (LIBINT2_REALTYPE)a[xyz];
163 for (
unsigned int c = 0; c < Nc; ++c) {
164 for (
unsigned int v = 0; v < veclen; ++v, ++cv) {
165 LIBINT2_REALTYPE value =
166 WP[v] * src1_ptr[cv] +
167 axyz * inteval->oo2z[v] *
168 (src2_ptr[cv] - inteval->roz[v] * src3_ptr[cv]);
169 if (not unit_b) value += PA[v] * src0_ptr[cv];
173#if LIBINT2_FLOP_COUNT
174 inteval->nflops[0] += (unit_b ? 6 : 8) * NcV;
179 for (
unsigned int c = 0; c < Nc; ++c) {
180 for (
unsigned int v = 0; v < veclen; ++v, ++cv) {
181 LIBINT2_REALTYPE value = WP[v] * src1_ptr[cv];
182 if (not unit_b) value += PA[v] * src0_ptr[cv];
186#if LIBINT2_FLOP_COUNT
187 inteval->nflops[0] += (unit_b ? 1 : 3) * NcV;
192 const unsigned int Ncm1 = INT_NCART(Lc - 1);
193 const unsigned int Ncm1V = Ncm1 * veclen;
194 const unsigned int am10cm10_offset = iam1 * Ncm1V;
195 const LIBINT2_REALTYPE* src4_ptr = src4 + am10cm10_offset;
199 FOR_CART(cx, cy, cz, Lc - 1)
207 const unsigned int cc = INT_CARTINDEX(Lc, c[0], c[1]);
208 const unsigned int cc_offset = cc * veclen;
209 LIBINT2_REALTYPE* tptr = target + cc_offset;
210 const LIBINT2_REALTYPE cxyz = (LIBINT2_REALTYPE)c[xyz];
211 for (
unsigned int v = 0; v < veclen; ++v) {
212 tptr[v] += cxyz * inteval->oo2ze[v] * src4_ptr[v];
214#if LIBINT2_FLOP_COUNT
215 inteval->nflops[0] += 3 * veclen;
223#define OSVRR_XS_XS_DERIV_DCONTR_A(target, srcA, srcB, id, ecoef1, ecoef2) \
225 const LIBINT2_REALTYPE* srcA_ptr = srcA + am10c0_offset; \
226 const LIBINT2_REALTYPE* srcB_ptr = srcB + am10c0_offset; \
227 const LIBINT2_REALTYPE di = (LIBINT2_REALTYPE)id; \
228 const LIBINT2_REALTYPE* c1 = inteval->ecoef1; \
229 const LIBINT2_REALTYPE* c2 = inteval->ecoef2; \
230 unsigned int cv = 0; \
231 bool has_unit = srcA == nullptr; \
233 for (unsigned int c = 0; c < Nc; ++c) { \
234 for (unsigned int v = 0; v < veclen; ++v, ++cv) { \
235 target[cv] -= di * (c1[v] * srcA_ptr[cv] + c2[v] * srcB_ptr[cv]); \
239 for (unsigned int c = 0; c < Nc; ++c) { \
240 for (unsigned int v = 0; v < veclen; ++v, ++cv) { \
241 target[cv] -= di * c2[v] * srcB_ptr[cv]; \
248#define OSVRR_XS_XS_DERIV_DCONTR_B(target, srcA, srcB, id, ecoef1, ecoef2) \
250 const LIBINT2_REALTYPE* srcA_ptr = srcA + am10c0_offset; \
251 const LIBINT2_REALTYPE* srcB_ptr = srcB + am10c0_offset; \
252 const LIBINT2_REALTYPE di = (LIBINT2_REALTYPE)id; \
253 const LIBINT2_REALTYPE* c1 = inteval->ecoef1; \
254 const LIBINT2_REALTYPE* c2 = inteval->ecoef2; \
255 unsigned int cv = 0; \
256 bool has_unit = srcA == nullptr; \
258 for (unsigned int c = 0; c < Nc; ++c) { \
259 for (unsigned int v = 0; v < veclen; ++v, ++cv) { \
260 target[cv] += di * (c1[v] * srcA_ptr[cv] - c2[v] * srcB_ptr[cv]); \
264 for (unsigned int c = 0; c < Nc; ++c) { \
265 for (unsigned int v = 0; v < veclen; ++v, ++cv) { \
266 target[cv] -= di * c2[v] * srcB_ptr[cv]; \
272#define OSVRR_XS_XS_DERIV_DCONTR_CD(target, srcA, id, ecoef1) \
274 const LIBINT2_REALTYPE* srcA_ptr = srcA + am10c0_offset; \
275 const LIBINT2_REALTYPE di = (LIBINT2_REALTYPE)id; \
276 const LIBINT2_REALTYPE* c1 = inteval->ecoef1; \
277 unsigned int cv = 0; \
278 for (unsigned int c = 0; c < Nc; ++c) { \
279 for (unsigned int v = 0; v < veclen; ++v, ++cv) { \
280 target[cv] += di * c1[v] * srcA_ptr[cv]; \
286#if LIBINT2_DEFINED(any, rho12_over_alpha1) && \
287 LIBINT2_DEFINED(any, alpha1_rho_over_zeta2)
288 if (Da_x > 0 && xyz == x) {
289 OSVRR_XS_XS_DERIV_DCONTR_A(target, src5, src6, Da_x, rho12_over_alpha1,
290 alpha1_rho_over_zeta2);
291#if LIBINT2_FLOP_COUNT
292 inteval->nflops[0] += (src5 ==
nullptr ? 3 : 5) * NcV;
295 if (Da_y > 0 && xyz == y) {
296 OSVRR_XS_XS_DERIV_DCONTR_A(target, src11, src12, Da_y, rho12_over_alpha1,
297 alpha1_rho_over_zeta2);
298#if LIBINT2_FLOP_COUNT
299 inteval->nflops[0] += (src11 ==
nullptr ? 3 : 5) * NcV;
302 if (Da_z > 0 && xyz == z) {
303 OSVRR_XS_XS_DERIV_DCONTR_A(target, src17, src18, Da_z, rho12_over_alpha1,
304 alpha1_rho_over_zeta2);
305#if LIBINT2_FLOP_COUNT
306 inteval->nflops[0] += (src17 ==
nullptr ? 3 : 5) * NcV;
312#if LIBINT2_DEFINED(any, rho12_over_alpha1) && \
313 LIBINT2_DEFINED(any, alpha2_rho_over_zeta2)
314 if (Db_x > 0 && xyz == x) {
315 OSVRR_XS_XS_DERIV_DCONTR_B(target, src7, src8, Db_x, rho12_over_alpha1,
316 alpha2_rho_over_zeta2);
317#if LIBINT2_FLOP_COUNT
318 inteval->nflops[0] += (src7 ==
nullptr ? 3 : 5) * NcV;
321 if (Db_y > 0 && xyz == y) {
322 OSVRR_XS_XS_DERIV_DCONTR_B(target, src13, src14, Db_y, rho12_over_alpha1,
323 alpha2_rho_over_zeta2);
324#if LIBINT2_FLOP_COUNT
325 inteval->nflops[0] += (src13 ==
nullptr ? 3 : 5) * NcV;
328 if (Db_z > 0 && xyz == z) {
329 OSVRR_XS_XS_DERIV_DCONTR_B(target, src19, src20, Db_z, rho12_over_alpha1,
330 alpha2_rho_over_zeta2);
331#if LIBINT2_FLOP_COUNT
332 inteval->nflops[0] += (src19 ==
nullptr ? 3 : 5) * NcV;
338#if LIBINT2_DEFINED(any, alpha3_over_zetapluseta)
339 if (Dc_x > 0 && xyz == x) {
340 OSVRR_XS_XS_DERIV_DCONTR_CD(target, src9, Dc_x, alpha3_over_zetapluseta);
341#if LIBINT2_FLOP_COUNT
342 inteval->nflops[0] += 3 * NcV;
345 if (Dc_y > 0 && xyz == y) {
346 OSVRR_XS_XS_DERIV_DCONTR_CD(target, src15, Dc_y, alpha3_over_zetapluseta);
347#if LIBINT2_FLOP_COUNT
348 inteval->nflops[0] += 3 * NcV;
351 if (Dc_z > 0 && xyz == z) {
352 OSVRR_XS_XS_DERIV_DCONTR_CD(target, src21, Dc_z, alpha3_over_zetapluseta);
353#if LIBINT2_FLOP_COUNT
354 inteval->nflops[0] += 3 * NcV;
359#if LIBINT2_DEFINED(any, alpha4_over_zetapluseta)
360 if (Dd_x > 0 && xyz == x) {
361 OSVRR_XS_XS_DERIV_DCONTR_CD(target, src10, Dd_x, alpha4_over_zetapluseta);
362#if LIBINT2_FLOP_COUNT
363 inteval->nflops[0] += 3 * NcV;
366 if (Dd_y > 0 && xyz == y) {
367 OSVRR_XS_XS_DERIV_DCONTR_CD(target, src16, Dd_y, alpha4_over_zetapluseta);
368#if LIBINT2_FLOP_COUNT
369 inteval->nflops[0] += 3 * NcV;
372 if (Dd_z > 0 && xyz == z) {
373 OSVRR_XS_XS_DERIV_DCONTR_CD(target, src22, Dd_z, alpha4_over_zetapluseta);
374#if LIBINT2_FLOP_COUNT
375 inteval->nflops[0] += 3 * NcV;