87 const Libint_t* inteval, LIBINT2_REALTYPE* target,
88 const LIBINT2_REALTYPE* src0,
const LIBINT2_REALTYPE* src1,
89 const LIBINT2_REALTYPE* src2,
const LIBINT2_REALTYPE* src3,
90 const LIBINT2_REALTYPE* src4,
const LIBINT2_REALTYPE* src5,
91 const LIBINT2_REALTYPE* src6,
const LIBINT2_REALTYPE* src7,
92 const LIBINT2_REALTYPE* src8,
const LIBINT2_REALTYPE* src9,
93 const LIBINT2_REALTYPE* src10,
const LIBINT2_REALTYPE* src11,
94 const LIBINT2_REALTYPE* src12,
const LIBINT2_REALTYPE* src13,
95 const LIBINT2_REALTYPE* src14,
const LIBINT2_REALTYPE* src15,
96 const LIBINT2_REALTYPE* src16,
const LIBINT2_REALTYPE* src17,
97 const LIBINT2_REALTYPE* src18,
const LIBINT2_REALTYPE* src19,
98 const LIBINT2_REALTYPE* src20,
const LIBINT2_REALTYPE* src21,
99 const LIBINT2_REALTYPE* src22) {
101 assert(not(Lb < 2 || Ld < 1));
103 const unsigned int veclen = vectorize ? inteval->veclen : 1;
105 const unsigned int Nd = INT_NCART(Ld);
106 const unsigned int NdV = Nd * veclen;
109 FOR_CART(bx, by, bz, Lb)
116 enum XYZ { x = 0, y = 1, z = 2 };
119 if (by != 0) xyz = y;
120 if (bx != 0) xyz = x;
124 const LIBINT2_REALTYPE *PB, *WP;
127#if LIBINT2_DEFINED(eri, PB_x)
128 if (not unit_a) PB = inteval->PB_x;
133#if LIBINT2_DEFINED(eri, PB_y)
134 if (not unit_a) PB = inteval->PB_y;
139#if LIBINT2_DEFINED(eri, PB_z)
140 if (not unit_a) PB = inteval->PB_z;
146 const unsigned int ibm1 = INT_CARTINDEX(Lb - 1, b[0], b[1]);
147 const unsigned int bm10d0_offset = ibm1 * NdV;
148 const LIBINT2_REALTYPE* src0_ptr = (not unit_a) ? src0 + bm10d0_offset : 0;
149 const LIBINT2_REALTYPE* src1_ptr = src1 + bm10d0_offset;
154 const unsigned int ibm2 = INT_CARTINDEX(Lb - 2, b[0], b[1]);
155 const unsigned int bm20d0_offset = ibm2 * NdV;
157 const LIBINT2_REALTYPE* src2_ptr = src2 + bm20d0_offset;
158 const LIBINT2_REALTYPE* src3_ptr = src3 + bm20d0_offset;
159 const LIBINT2_REALTYPE bxyz = (LIBINT2_REALTYPE)b[xyz];
162 for (
unsigned int d = 0; d < Nd; ++d) {
163 for (
unsigned int v = 0; v < veclen; ++v, ++dv) {
164 LIBINT2_REALTYPE value =
165 WP[v] * src1_ptr[dv] +
166 bxyz * inteval->oo2z[v] *
167 (src2_ptr[dv] - inteval->roz[v] * src3_ptr[dv]);
168 if (not unit_a) value += PB[v] * src0_ptr[dv];
172#if LIBINT2_FLOP_COUNT
173 inteval->nflops[0] += (unit_a ? 6 : 8) * NdV;
178 for (
unsigned int d = 0; d < Nd; ++d) {
179 for (
unsigned int v = 0; v < veclen; ++v, ++dv) {
180 LIBINT2_REALTYPE value = WP[v] * src1_ptr[dv];
181 if (not unit_a) value += PB[v] * src0_ptr[dv];
185#if LIBINT2_FLOP_COUNT
186 inteval->nflops[0] += (unit_a ? 1 : 3) * NdV;
191 const unsigned int Ndm1 = INT_NCART(Ld - 1);
192 const unsigned int Ndm1V = Ndm1 * veclen;
193 const unsigned int bm10dm10_offset = ibm1 * Ndm1V;
194 const LIBINT2_REALTYPE* src4_ptr = src4 + bm10dm10_offset;
198 FOR_CART(dx, dy, dz, Ld - 1)
206 const unsigned int dc = INT_CARTINDEX(Ld, d[0], d[1]);
207 const unsigned int dc_offset = dc * veclen;
208 LIBINT2_REALTYPE* tptr = target + dc_offset;
209 const LIBINT2_REALTYPE dxyz = (LIBINT2_REALTYPE)d[xyz];
210 for (
unsigned int v = 0; v < veclen; ++v) {
211 tptr[v] += dxyz * inteval->oo2ze[v] * src4_ptr[v];
213#if LIBINT2_FLOP_COUNT
214 inteval->nflops[0] += 3 * veclen;
221#define OSVRR_SX_SX_DERIV_DCONTR_A(target, srcA, srcB, id, ecoef1, ecoef2) \
223 const LIBINT2_REALTYPE* srcA_ptr = srcA + bm10d0_offset; \
224 const LIBINT2_REALTYPE* srcB_ptr = srcB + bm10d0_offset; \
225 const LIBINT2_REALTYPE di = (LIBINT2_REALTYPE)id; \
226 const LIBINT2_REALTYPE* c1 = inteval->ecoef1; \
227 const LIBINT2_REALTYPE* c2 = inteval->ecoef2; \
228 unsigned int dv = 0; \
229 bool has_unit = srcA == nullptr; \
231 for (unsigned int d = 0; d < Nd; ++d) { \
232 for (unsigned int v = 0; v < veclen; ++v, ++dv) { \
233 target[dv] += di * (c1[v] * srcA_ptr[dv] - c2[v] * srcB_ptr[dv]); \
237 for (unsigned int d = 0; d < Nd; ++d) { \
238 for (unsigned int v = 0; v < veclen; ++v, ++dv) { \
239 target[dv] -= di * c2[v] * srcB_ptr[dv]); \
245#define OSVRR_SX_SX_DERIV_DCONTR_B(target, srcA, srcB, id, ecoef1, ecoef2) \
247 const LIBINT2_REALTYPE* srcA_ptr = srcA + bm10d0_offset; \
248 const LIBINT2_REALTYPE* srcB_ptr = srcB + bm10d0_offset; \
249 const LIBINT2_REALTYPE di = (LIBINT2_REALTYPE)id; \
250 const LIBINT2_REALTYPE* c1 = inteval->ecoef1; \
251 const LIBINT2_REALTYPE* c2 = inteval->ecoef2; \
252 unsigned int dv = 0; \
253 bool has_unit = srcA == nullptr; \
255 for (unsigned int d = 0; d < Nd; ++d) { \
256 for (unsigned int v = 0; v < veclen; ++v, ++dv) { \
257 target[dv] -= di * (c1[v] * srcA_ptr[dv] + c2[v] * srcB_ptr[dv]); \
261 for (unsigned int d = 0; d < Nd; ++d) { \
262 for (unsigned int v = 0; v < veclen; ++v, ++dv) { \
263 target[dv] -= di * c2[v] * srcB_ptr[dv]; \
269#define OSVRR_SX_SX_DERIV_DCONTR_CD(target, srcA, id, ecoef1) \
271 const LIBINT2_REALTYPE* srcA_ptr = srcA + bm10d0_offset; \
272 const LIBINT2_REALTYPE di = (LIBINT2_REALTYPE)id; \
273 const LIBINT2_REALTYPE* c1 = inteval->ecoef1; \
274 unsigned int dv = 0; \
275 for (unsigned int d = 0; d < Nd; ++d) { \
276 for (unsigned int v = 0; v < veclen; ++v, ++dv) { \
277 target[dv] += di * c1[v] * srcA_ptr[dv]; \
283#if LIBINT2_DEFINED(any, rho12_over_alpha2) && \
284 LIBINT2_DEFINED(any, alpha1_rho_over_zeta2)
285 if (Da_x > 0 && xyz == x) {
286 OSVRR_SX_SX_DERIV_DCONTR_A(target, src5, src6, Da_x, rho12_over_alpha2,
287 alpha1_rho_over_zeta2);
288#if LIBINT2_FLOP_COUNT
289 inteval->nflops[0] += (src5 ==
nullptr ? 3 : 5) * NdV;
292 if (Da_y > 0 && xyz == y) {
293 OSVRR_SX_SX_DERIV_DCONTR_A(target, src11, src12, Da_y, rho12_over_alpha2,
294 alpha1_rho_over_zeta2);
295#if LIBINT2_FLOP_COUNT
296 inteval->nflops[0] += (src11 ==
nullptr ? 3 : 5) * NdV;
299 if (Da_z > 0 && xyz == z) {
300 OSVRR_SX_SX_DERIV_DCONTR_A(target, src17, src18, Da_z, rho12_over_alpha2,
301 alpha1_rho_over_zeta2);
302#if LIBINT2_FLOP_COUNT
303 inteval->nflops[0] += (src17 ==
nullptr ? 3 : 5) * NdV;
309#if LIBINT2_DEFINED(any, rho12_over_alpha2) && \
310 LIBINT2_DEFINED(any, alpha2_rho_over_zeta2)
311 if (Db_x > 0 && xyz == x) {
312 OSVRR_SX_SX_DERIV_DCONTR_B(target, src7, src8, Db_x, rho12_over_alpha2,
313 alpha2_rho_over_zeta2);
314#if LIBINT2_FLOP_COUNT
315 inteval->nflops[0] += (src7 ==
nullptr ? 3 : 5) * NdV;
318 if (Db_y > 0 && xyz == y) {
319 OSVRR_SX_SX_DERIV_DCONTR_B(target, src13, src14, Db_y, rho12_over_alpha2,
320 alpha2_rho_over_zeta2);
321#if LIBINT2_FLOP_COUNT
322 inteval->nflops[0] += (src13 ==
nullptr ? 3 : 5) * NdV;
325 if (Db_z > 0 && xyz == z) {
326 OSVRR_SX_SX_DERIV_DCONTR_B(target, src19, src20, Db_z, rho12_over_alpha2,
327 alpha2_rho_over_zeta2);
328#if LIBINT2_FLOP_COUNT
329 inteval->nflops[0] += (src19 ==
nullptr ? 3 : 5) * NdV;
335#if LIBINT2_DEFINED(any, alpha3_over_zetapluseta)
336 if (Dc_x > 0 && xyz == x) {
337 OSVRR_SX_SX_DERIV_DCONTR_CD(target, src9, Dc_x, alpha3_over_zetapluseta);
338#if LIBINT2_FLOP_COUNT
339 inteval->nflops[0] += 3 * NdV;
342 if (Dc_y > 0 && xyz == y) {
343 OSVRR_SX_SX_DERIV_DCONTR_CD(target, src15, Dc_y, alpha3_over_zetapluseta);
344#if LIBINT2_FLOP_COUNT
345 inteval->nflops[0] += 3 * NdV;
348 if (Dc_z > 0 && xyz == z) {
349 OSVRR_SX_SX_DERIV_DCONTR_CD(target, src21, Dc_z, alpha3_over_zetapluseta);
350#if LIBINT2_FLOP_COUNT
351 inteval->nflops[0] += 3 * NdV;
356#if LIBINT2_DEFINED(any, alpha4_over_zetapluseta)
357 if (Dd_x > 0 && xyz == x) {
358 OSVRR_SX_SX_DERIV_DCONTR_CD(target, src10, Dd_x, alpha4_over_zetapluseta);
359#if LIBINT2_FLOP_COUNT
360 inteval->nflops[0] += 3 * NdV;
363 if (Dd_y > 0 && xyz == y) {
364 OSVRR_SX_SX_DERIV_DCONTR_CD(target, src16, Dd_y, alpha4_over_zetapluseta);
365#if LIBINT2_FLOP_COUNT
366 inteval->nflops[0] += 3 * NdV;
369 if (Dd_z > 0 && xyz == z) {
370 OSVRR_SX_SX_DERIV_DCONTR_CD(target, src22, Dd_z, alpha4_over_zetapluseta);
371#if LIBINT2_FLOP_COUNT
372 inteval->nflops[0] += 3 * NdV;