1 #include "simint/boys/boys.h"
2 #include "simint/ostei/gen/ostei_generated.h"
3 #include "simint/vectorization/vectorization.h"
4 #include <math.h>
5 #include <string.h>
6 
7 
ostei_k_i_g_s(struct simint_multi_shellpair const P,struct simint_multi_shellpair const Q,double screen_tol,double * const restrict work,double * const restrict INT__k_i_g_s)8 int ostei_k_i_g_s(struct simint_multi_shellpair const P,
9                   struct simint_multi_shellpair const Q,
10                   double screen_tol,
11                   double * const restrict work,
12                   double * const restrict INT__k_i_g_s)
13 {
14 
15     SIMINT_ASSUME_ALIGN_DBL(work);
16     SIMINT_ASSUME_ALIGN_DBL(INT__k_i_g_s);
17     int ab, cd, abcd;
18     int istart, jstart;
19     int iprimcd, nprim_icd, icd;
20     const int check_screen = (screen_tol > 0.0);
21     int i, j;
22     int n;
23     int not_screened;
24     int real_abcd;
25     int iket;
26 
27     // partition workspace
28     double * const INT__k_s_g_s = work + (SIMINT_NSHELL_SIMD * 0);
29     double * const INT__l_s_g_s = work + (SIMINT_NSHELL_SIMD * 540);
30     double * const INT__m_s_g_s = work + (SIMINT_NSHELL_SIMD * 1215);
31     double * const INT__n_s_g_s = work + (SIMINT_NSHELL_SIMD * 2040);
32     double * const INT__o_s_g_s = work + (SIMINT_NSHELL_SIMD * 3030);
33     double * const INT__q_s_g_s = work + (SIMINT_NSHELL_SIMD * 4200);
34     double * const INT__r_s_g_s = work + (SIMINT_NSHELL_SIMD * 5565);
35     SIMINT_DBLTYPE * const primwork = (SIMINT_DBLTYPE *)(work + SIMINT_NSHELL_SIMD*7140);
36     SIMINT_DBLTYPE * const restrict PRIM_INT__s_s_s_s = primwork + 0;
37     SIMINT_DBLTYPE * const restrict PRIM_INT__p_s_s_s = primwork + 18;
38     SIMINT_DBLTYPE * const restrict PRIM_INT__d_s_s_s = primwork + 69;
39     SIMINT_DBLTYPE * const restrict PRIM_INT__f_s_s_s = primwork + 165;
40     SIMINT_DBLTYPE * const restrict PRIM_INT__g_s_s_s = primwork + 315;
41     SIMINT_DBLTYPE * const restrict PRIM_INT__g_s_p_s = primwork + 525;
42     SIMINT_DBLTYPE * const restrict PRIM_INT__h_s_s_s = primwork + 705;
43     SIMINT_DBLTYPE * const restrict PRIM_INT__h_s_p_s = primwork + 978;
44     SIMINT_DBLTYPE * const restrict PRIM_INT__h_s_d_s = primwork + 1230;
45     SIMINT_DBLTYPE * const restrict PRIM_INT__i_s_s_s = primwork + 1608;
46     SIMINT_DBLTYPE * const restrict PRIM_INT__i_s_p_s = primwork + 1944;
47     SIMINT_DBLTYPE * const restrict PRIM_INT__i_s_d_s = primwork + 2280;
48     SIMINT_DBLTYPE * const restrict PRIM_INT__i_s_f_s = primwork + 2784;
49     SIMINT_DBLTYPE * const restrict PRIM_INT__k_s_s_s = primwork + 3344;
50     SIMINT_DBLTYPE * const restrict PRIM_INT__k_s_p_s = primwork + 3740;
51     SIMINT_DBLTYPE * const restrict PRIM_INT__k_s_d_s = primwork + 4172;
52     SIMINT_DBLTYPE * const restrict PRIM_INT__k_s_f_s = primwork + 4820;
53     SIMINT_DBLTYPE * const restrict PRIM_INT__k_s_g_s = primwork + 5540;
54     SIMINT_DBLTYPE * const restrict PRIM_INT__l_s_s_s = primwork + 6080;
55     SIMINT_DBLTYPE * const restrict PRIM_INT__l_s_p_s = primwork + 6530;
56     SIMINT_DBLTYPE * const restrict PRIM_INT__l_s_d_s = primwork + 7070;
57     SIMINT_DBLTYPE * const restrict PRIM_INT__l_s_f_s = primwork + 7880;
58     SIMINT_DBLTYPE * const restrict PRIM_INT__l_s_g_s = primwork + 8780;
59     SIMINT_DBLTYPE * const restrict PRIM_INT__m_s_s_s = primwork + 9455;
60     SIMINT_DBLTYPE * const restrict PRIM_INT__m_s_p_s = primwork + 9950;
61     SIMINT_DBLTYPE * const restrict PRIM_INT__m_s_d_s = primwork + 10610;
62     SIMINT_DBLTYPE * const restrict PRIM_INT__m_s_f_s = primwork + 11600;
63     SIMINT_DBLTYPE * const restrict PRIM_INT__m_s_g_s = primwork + 12700;
64     SIMINT_DBLTYPE * const restrict PRIM_INT__n_s_s_s = primwork + 13525;
65     SIMINT_DBLTYPE * const restrict PRIM_INT__n_s_p_s = primwork + 14053;
66     SIMINT_DBLTYPE * const restrict PRIM_INT__n_s_d_s = primwork + 14845;
67     SIMINT_DBLTYPE * const restrict PRIM_INT__n_s_f_s = primwork + 16033;
68     SIMINT_DBLTYPE * const restrict PRIM_INT__n_s_g_s = primwork + 17353;
69     SIMINT_DBLTYPE * const restrict PRIM_INT__o_s_s_s = primwork + 18343;
70     SIMINT_DBLTYPE * const restrict PRIM_INT__o_s_p_s = primwork + 18889;
71     SIMINT_DBLTYPE * const restrict PRIM_INT__o_s_d_s = primwork + 19825;
72     SIMINT_DBLTYPE * const restrict PRIM_INT__o_s_f_s = primwork + 21229;
73     SIMINT_DBLTYPE * const restrict PRIM_INT__o_s_g_s = primwork + 22789;
74     SIMINT_DBLTYPE * const restrict PRIM_INT__q_s_s_s = primwork + 23959;
75     SIMINT_DBLTYPE * const restrict PRIM_INT__q_s_p_s = primwork + 24505;
76     SIMINT_DBLTYPE * const restrict PRIM_INT__q_s_d_s = primwork + 25597;
77     SIMINT_DBLTYPE * const restrict PRIM_INT__q_s_f_s = primwork + 27235;
78     SIMINT_DBLTYPE * const restrict PRIM_INT__q_s_g_s = primwork + 29055;
79     SIMINT_DBLTYPE * const restrict PRIM_INT__r_s_s_s = primwork + 30420;
80     SIMINT_DBLTYPE * const restrict PRIM_INT__r_s_p_s = primwork + 30945;
81     SIMINT_DBLTYPE * const restrict PRIM_INT__r_s_d_s = primwork + 32205;
82     SIMINT_DBLTYPE * const restrict PRIM_INT__r_s_f_s = primwork + 34095;
83     SIMINT_DBLTYPE * const restrict PRIM_INT__r_s_g_s = primwork + 36195;
84     double * const hrrwork = (double *)(primwork + 37770);
85     double * const HRR_INT__k_p_g_s = hrrwork + 0;
86     double * const HRR_INT__k_d_g_s = hrrwork + 1620;
87     double * const HRR_INT__k_f_g_s = hrrwork + 4860;
88     double * const HRR_INT__k_g_g_s = hrrwork + 10260;
89     double * const HRR_INT__k_h_g_s = hrrwork + 18360;
90     double * const HRR_INT__l_p_g_s = hrrwork + 29700;
91     double * const HRR_INT__l_d_g_s = hrrwork + 31725;
92     double * const HRR_INT__l_f_g_s = hrrwork + 35775;
93     double * const HRR_INT__l_g_g_s = hrrwork + 42525;
94     double * const HRR_INT__l_h_g_s = hrrwork + 52650;
95     double * const HRR_INT__m_p_g_s = hrrwork + 66825;
96     double * const HRR_INT__m_d_g_s = hrrwork + 69300;
97     double * const HRR_INT__m_f_g_s = hrrwork + 74250;
98     double * const HRR_INT__m_g_g_s = hrrwork + 82500;
99     double * const HRR_INT__n_p_g_s = hrrwork + 94875;
100     double * const HRR_INT__n_d_g_s = hrrwork + 97845;
101     double * const HRR_INT__n_f_g_s = hrrwork + 103785;
102     double * const HRR_INT__o_p_g_s = hrrwork + 113685;
103     double * const HRR_INT__o_d_g_s = hrrwork + 117195;
104     double * const HRR_INT__q_p_g_s = hrrwork + 124215;
105 
106 
107     // Create constants
108     const SIMINT_DBLTYPE const_1 = SIMINT_DBLSET1(1);
109     const SIMINT_DBLTYPE const_10 = SIMINT_DBLSET1(10);
110     const SIMINT_DBLTYPE const_11 = SIMINT_DBLSET1(11);
111     const SIMINT_DBLTYPE const_12 = SIMINT_DBLSET1(12);
112     const SIMINT_DBLTYPE const_13 = SIMINT_DBLSET1(13);
113     const SIMINT_DBLTYPE const_2 = SIMINT_DBLSET1(2);
114     const SIMINT_DBLTYPE const_3 = SIMINT_DBLSET1(3);
115     const SIMINT_DBLTYPE const_4 = SIMINT_DBLSET1(4);
116     const SIMINT_DBLTYPE const_5 = SIMINT_DBLSET1(5);
117     const SIMINT_DBLTYPE const_6 = SIMINT_DBLSET1(6);
118     const SIMINT_DBLTYPE const_7 = SIMINT_DBLSET1(7);
119     const SIMINT_DBLTYPE const_8 = SIMINT_DBLSET1(8);
120     const SIMINT_DBLTYPE const_9 = SIMINT_DBLSET1(9);
121     const SIMINT_DBLTYPE one_half = SIMINT_DBLSET1(0.5);
122 
123 
124     ////////////////////////////////////////
125     // Loop over shells and primitives
126     ////////////////////////////////////////
127 
128     real_abcd = 0;
129     istart = 0;
130     for(ab = 0; ab < P.nshell12_clip; ++ab)
131     {
132         const int iend = istart + P.nprim12[ab];
133 
134         cd = 0;
135         jstart = 0;
136 
137         for(cd = 0; cd < Q.nshell12_clip; cd += SIMINT_NSHELL_SIMD)
138         {
139             const int nshellbatch = ((cd + SIMINT_NSHELL_SIMD) > Q.nshell12_clip) ? Q.nshell12_clip - cd : SIMINT_NSHELL_SIMD;
140             int jend = jstart;
141             for(i = 0; i < nshellbatch; i++)
142                 jend += Q.nprim12[cd+i];
143 
144             // Clear the beginning of the workspace (where we are accumulating integrals)
145             memset(work, 0, SIMINT_NSHELL_SIMD * 7140 * sizeof(double));
146             abcd = 0;
147 
148 
149             for(i = istart; i < iend; ++i)
150             {
151                 SIMINT_DBLTYPE bra_screen_max;  // only used if check_screen
152 
153                 if(check_screen)
154                 {
155                     // Skip this whole thing if always insignificant
156                     if((P.screen[i] * Q.screen_max) < screen_tol)
157                         continue;
158                     bra_screen_max = SIMINT_DBLSET1(P.screen[i]);
159                 }
160 
161                 icd = 0;
162                 iprimcd = 0;
163                 nprim_icd = Q.nprim12[cd];
164                 double * restrict PRIM_PTR_INT__k_s_g_s = INT__k_s_g_s + abcd * 540;
165                 double * restrict PRIM_PTR_INT__l_s_g_s = INT__l_s_g_s + abcd * 675;
166                 double * restrict PRIM_PTR_INT__m_s_g_s = INT__m_s_g_s + abcd * 825;
167                 double * restrict PRIM_PTR_INT__n_s_g_s = INT__n_s_g_s + abcd * 990;
168                 double * restrict PRIM_PTR_INT__o_s_g_s = INT__o_s_g_s + abcd * 1170;
169                 double * restrict PRIM_PTR_INT__q_s_g_s = INT__q_s_g_s + abcd * 1365;
170                 double * restrict PRIM_PTR_INT__r_s_g_s = INT__r_s_g_s + abcd * 1575;
171 
172 
173 
174                 // Load these one per loop over i
175                 const SIMINT_DBLTYPE P_alpha = SIMINT_DBLSET1(P.alpha[i]);
176                 const SIMINT_DBLTYPE P_prefac = SIMINT_DBLSET1(P.prefac[i]);
177                 const SIMINT_DBLTYPE Pxyz[3] = { SIMINT_DBLSET1(P.x[i]), SIMINT_DBLSET1(P.y[i]), SIMINT_DBLSET1(P.z[i]) };
178 
179                 const SIMINT_DBLTYPE P_PA[3] = { SIMINT_DBLSET1(P.PA_x[i]), SIMINT_DBLSET1(P.PA_y[i]), SIMINT_DBLSET1(P.PA_z[i]) };
180 
181                 for(j = jstart; j < jend; j += SIMINT_SIMD_LEN)
182                 {
183                     // calculate the shell offsets
184                     // these are the offset from the shell pointed to by cd
185                     // for each element
186                     int shelloffsets[SIMINT_SIMD_LEN] = {0};
187                     int lastoffset = 0;
188                     const int nlane = ( ((j + SIMINT_SIMD_LEN) < jend) ? SIMINT_SIMD_LEN : (jend - j));
189 
190                     if((iprimcd + SIMINT_SIMD_LEN) >= nprim_icd)
191                     {
192                         // Handle if the first element of the vector is a new shell
193                         if(iprimcd >= nprim_icd && ((icd+1) < nshellbatch))
194                         {
195                             nprim_icd += Q.nprim12[cd + (++icd)];
196                             PRIM_PTR_INT__k_s_g_s += 540;
197                             PRIM_PTR_INT__l_s_g_s += 675;
198                             PRIM_PTR_INT__m_s_g_s += 825;
199                             PRIM_PTR_INT__n_s_g_s += 990;
200                             PRIM_PTR_INT__o_s_g_s += 1170;
201                             PRIM_PTR_INT__q_s_g_s += 1365;
202                             PRIM_PTR_INT__r_s_g_s += 1575;
203                         }
204                         iprimcd++;
205                         for(n = 1; n < SIMINT_SIMD_LEN; ++n)
206                         {
207                             if(iprimcd >= nprim_icd && ((icd+1) < nshellbatch))
208                             {
209                                 shelloffsets[n] = shelloffsets[n-1] + 1;
210                                 lastoffset++;
211                                 nprim_icd += Q.nprim12[cd + (++icd)];
212                             }
213                             else
214                                 shelloffsets[n] = shelloffsets[n-1];
215                             iprimcd++;
216                         }
217                     }
218                     else
219                         iprimcd += SIMINT_SIMD_LEN;
220 
221                     // Do we have to compute this vector (or has it been screened out)?
222                     // (not_screened != 0 means we have to do this vector)
223                     if(check_screen)
224                     {
225                         const double vmax = vector_max(SIMINT_MUL(bra_screen_max, SIMINT_DBLLOAD(Q.screen, j)));
226                         if(vmax < screen_tol)
227                         {
228                             PRIM_PTR_INT__k_s_g_s += lastoffset*540;
229                             PRIM_PTR_INT__l_s_g_s += lastoffset*675;
230                             PRIM_PTR_INT__m_s_g_s += lastoffset*825;
231                             PRIM_PTR_INT__n_s_g_s += lastoffset*990;
232                             PRIM_PTR_INT__o_s_g_s += lastoffset*1170;
233                             PRIM_PTR_INT__q_s_g_s += lastoffset*1365;
234                             PRIM_PTR_INT__r_s_g_s += lastoffset*1575;
235                             continue;
236                         }
237                     }
238 
239                     const SIMINT_DBLTYPE Q_alpha = SIMINT_DBLLOAD(Q.alpha, j);
240                     const SIMINT_DBLTYPE PQalpha_mul = SIMINT_MUL(P_alpha, Q_alpha);
241                     const SIMINT_DBLTYPE PQalpha_sum = SIMINT_ADD(P_alpha, Q_alpha);
242                     const SIMINT_DBLTYPE one_over_PQalpha_sum = SIMINT_DIV(const_1, PQalpha_sum);
243 
244 
245                     /* construct R2 = (Px - Qx)**2 + (Py - Qy)**2 + (Pz -Qz)**2 */
246                     SIMINT_DBLTYPE PQ[3];
247                     PQ[0] = SIMINT_SUB(Pxyz[0], SIMINT_DBLLOAD(Q.x, j));
248                     PQ[1] = SIMINT_SUB(Pxyz[1], SIMINT_DBLLOAD(Q.y, j));
249                     PQ[2] = SIMINT_SUB(Pxyz[2], SIMINT_DBLLOAD(Q.z, j));
250                     SIMINT_DBLTYPE R2 = SIMINT_MUL(PQ[0], PQ[0]);
251                     R2 = SIMINT_FMADD(PQ[1], PQ[1], R2);
252                     R2 = SIMINT_FMADD(PQ[2], PQ[2], R2);
253 
254                     const SIMINT_DBLTYPE alpha = SIMINT_MUL(PQalpha_mul, one_over_PQalpha_sum); // alpha from MEST
255                     const SIMINT_DBLTYPE one_over_p = SIMINT_DIV(const_1, P_alpha);
256                     const SIMINT_DBLTYPE one_over_q = SIMINT_DIV(const_1, Q_alpha);
257                     const SIMINT_DBLTYPE one_over_2p = SIMINT_MUL(one_half, one_over_p);
258                     const SIMINT_DBLTYPE one_over_2q = SIMINT_MUL(one_half, one_over_q);
259                     const SIMINT_DBLTYPE one_over_2pq = SIMINT_MUL(one_half, one_over_PQalpha_sum);
260                     const SIMINT_DBLTYPE Q_PA[3] = { SIMINT_DBLLOAD(Q.PA_x, j), SIMINT_DBLLOAD(Q.PA_y, j), SIMINT_DBLLOAD(Q.PA_z, j) };
261 
262                     // NOTE: Minus sign!
263                     const SIMINT_DBLTYPE a_over_p = SIMINT_MUL(SIMINT_NEG(alpha), one_over_p);
264                     SIMINT_DBLTYPE aop_PQ[3];
265                     aop_PQ[0] = SIMINT_MUL(a_over_p, PQ[0]);
266                     aop_PQ[1] = SIMINT_MUL(a_over_p, PQ[1]);
267                     aop_PQ[2] = SIMINT_MUL(a_over_p, PQ[2]);
268 
269                     SIMINT_DBLTYPE a_over_q = SIMINT_MUL(alpha, one_over_q);
270                     SIMINT_DBLTYPE aoq_PQ[3];
271                     aoq_PQ[0] = SIMINT_MUL(a_over_q, PQ[0]);
272                     aoq_PQ[1] = SIMINT_MUL(a_over_q, PQ[1]);
273                     aoq_PQ[2] = SIMINT_MUL(a_over_q, PQ[2]);
274                     // Put a minus sign here so we don't have to in RR routines
275                     a_over_q = SIMINT_NEG(a_over_q);
276 
277 
278                     //////////////////////////////////////////////
279                     // Fjt function section
280                     // Maximum v value: 17
281                     //////////////////////////////////////////////
282                     // The parameter to the Fjt function
283                     const SIMINT_DBLTYPE F_x = SIMINT_MUL(R2, alpha);
284 
285 
286                     const SIMINT_DBLTYPE Q_prefac = mask_load(nlane, Q.prefac + j);
287 
288 
289                     boys_F_split(PRIM_INT__s_s_s_s, F_x, 17);
290                     SIMINT_DBLTYPE prefac = SIMINT_SQRT(one_over_PQalpha_sum);
291                     prefac = SIMINT_MUL(SIMINT_MUL(P_prefac, Q_prefac), prefac);
292                     for(n = 0; n <= 17; n++)
293                         PRIM_INT__s_s_s_s[n] = SIMINT_MUL(PRIM_INT__s_s_s_s[n], prefac);
294 
295                     //////////////////////////////////////////////
296                     // Primitive integrals: Vertical recurrance
297                     //////////////////////////////////////////////
298 
299                     const SIMINT_DBLTYPE vrr_const_1_over_2p = one_over_2p;
300                     const SIMINT_DBLTYPE vrr_const_2_over_2p = SIMINT_MUL(const_2, one_over_2p);
301                     const SIMINT_DBLTYPE vrr_const_3_over_2p = SIMINT_MUL(const_3, one_over_2p);
302                     const SIMINT_DBLTYPE vrr_const_4_over_2p = SIMINT_MUL(const_4, one_over_2p);
303                     const SIMINT_DBLTYPE vrr_const_5_over_2p = SIMINT_MUL(const_5, one_over_2p);
304                     const SIMINT_DBLTYPE vrr_const_6_over_2p = SIMINT_MUL(const_6, one_over_2p);
305                     const SIMINT_DBLTYPE vrr_const_7_over_2p = SIMINT_MUL(const_7, one_over_2p);
306                     const SIMINT_DBLTYPE vrr_const_8_over_2p = SIMINT_MUL(const_8, one_over_2p);
307                     const SIMINT_DBLTYPE vrr_const_9_over_2p = SIMINT_MUL(const_9, one_over_2p);
308                     const SIMINT_DBLTYPE vrr_const_10_over_2p = SIMINT_MUL(const_10, one_over_2p);
309                     const SIMINT_DBLTYPE vrr_const_11_over_2p = SIMINT_MUL(const_11, one_over_2p);
310                     const SIMINT_DBLTYPE vrr_const_12_over_2p = SIMINT_MUL(const_12, one_over_2p);
311                     const SIMINT_DBLTYPE vrr_const_1_over_2q = one_over_2q;
312                     const SIMINT_DBLTYPE vrr_const_2_over_2q = SIMINT_MUL(const_2, one_over_2q);
313                     const SIMINT_DBLTYPE vrr_const_3_over_2q = SIMINT_MUL(const_3, one_over_2q);
314                     const SIMINT_DBLTYPE vrr_const_1_over_2pq = one_over_2pq;
315                     const SIMINT_DBLTYPE vrr_const_2_over_2pq = SIMINT_MUL(const_2, one_over_2pq);
316                     const SIMINT_DBLTYPE vrr_const_3_over_2pq = SIMINT_MUL(const_3, one_over_2pq);
317                     const SIMINT_DBLTYPE vrr_const_4_over_2pq = SIMINT_MUL(const_4, one_over_2pq);
318                     const SIMINT_DBLTYPE vrr_const_5_over_2pq = SIMINT_MUL(const_5, one_over_2pq);
319                     const SIMINT_DBLTYPE vrr_const_6_over_2pq = SIMINT_MUL(const_6, one_over_2pq);
320                     const SIMINT_DBLTYPE vrr_const_7_over_2pq = SIMINT_MUL(const_7, one_over_2pq);
321                     const SIMINT_DBLTYPE vrr_const_8_over_2pq = SIMINT_MUL(const_8, one_over_2pq);
322                     const SIMINT_DBLTYPE vrr_const_9_over_2pq = SIMINT_MUL(const_9, one_over_2pq);
323                     const SIMINT_DBLTYPE vrr_const_10_over_2pq = SIMINT_MUL(const_10, one_over_2pq);
324                     const SIMINT_DBLTYPE vrr_const_11_over_2pq = SIMINT_MUL(const_11, one_over_2pq);
325                     const SIMINT_DBLTYPE vrr_const_12_over_2pq = SIMINT_MUL(const_12, one_over_2pq);
326                     const SIMINT_DBLTYPE vrr_const_13_over_2pq = SIMINT_MUL(const_13, one_over_2pq);
327 
328 
329 
330                     // Forming PRIM_INT__p_s_s_s[17 * 3];
331                     for(n = 0; n < 17; ++n)  // loop over orders of auxiliary function
332                     {
333 
334                         PRIM_INT__p_s_s_s[n * 3 + 0] = SIMINT_MUL(P_PA[0], PRIM_INT__s_s_s_s[n * 1 + 0]);
335                         PRIM_INT__p_s_s_s[n * 3 + 0] = SIMINT_FMADD( aop_PQ[0], PRIM_INT__s_s_s_s[(n+1) * 1 + 0], PRIM_INT__p_s_s_s[n * 3 + 0]);
336 
337                         PRIM_INT__p_s_s_s[n * 3 + 1] = SIMINT_MUL(P_PA[1], PRIM_INT__s_s_s_s[n * 1 + 0]);
338                         PRIM_INT__p_s_s_s[n * 3 + 1] = SIMINT_FMADD( aop_PQ[1], PRIM_INT__s_s_s_s[(n+1) * 1 + 0], PRIM_INT__p_s_s_s[n * 3 + 1]);
339 
340                         PRIM_INT__p_s_s_s[n * 3 + 2] = SIMINT_MUL(P_PA[2], PRIM_INT__s_s_s_s[n * 1 + 0]);
341                         PRIM_INT__p_s_s_s[n * 3 + 2] = SIMINT_FMADD( aop_PQ[2], PRIM_INT__s_s_s_s[(n+1) * 1 + 0], PRIM_INT__p_s_s_s[n * 3 + 2]);
342 
343                     }
344 
345 
346 
347                     // Forming PRIM_INT__d_s_s_s[16 * 6];
348                     for(n = 0; n < 16; ++n)  // loop over orders of auxiliary function
349                     {
350 
351                         PRIM_INT__d_s_s_s[n * 6 + 0] = SIMINT_MUL(P_PA[0], PRIM_INT__p_s_s_s[n * 3 + 0]);
352                         PRIM_INT__d_s_s_s[n * 6 + 0] = SIMINT_FMADD( aop_PQ[0], PRIM_INT__p_s_s_s[(n+1) * 3 + 0], PRIM_INT__d_s_s_s[n * 6 + 0]);
353                         PRIM_INT__d_s_s_s[n * 6 + 0] = SIMINT_FMADD( vrr_const_1_over_2p, SIMINT_FMADD(a_over_p, PRIM_INT__s_s_s_s[(n+1) * 1 + 0], PRIM_INT__s_s_s_s[n * 1 + 0]), PRIM_INT__d_s_s_s[n * 6 + 0]);
354 
355                         PRIM_INT__d_s_s_s[n * 6 + 1] = SIMINT_MUL(P_PA[1], PRIM_INT__p_s_s_s[n * 3 + 0]);
356                         PRIM_INT__d_s_s_s[n * 6 + 1] = SIMINT_FMADD( aop_PQ[1], PRIM_INT__p_s_s_s[(n+1) * 3 + 0], PRIM_INT__d_s_s_s[n * 6 + 1]);
357 
358                         PRIM_INT__d_s_s_s[n * 6 + 3] = SIMINT_MUL(P_PA[1], PRIM_INT__p_s_s_s[n * 3 + 1]);
359                         PRIM_INT__d_s_s_s[n * 6 + 3] = SIMINT_FMADD( aop_PQ[1], PRIM_INT__p_s_s_s[(n+1) * 3 + 1], PRIM_INT__d_s_s_s[n * 6 + 3]);
360                         PRIM_INT__d_s_s_s[n * 6 + 3] = SIMINT_FMADD( vrr_const_1_over_2p, SIMINT_FMADD(a_over_p, PRIM_INT__s_s_s_s[(n+1) * 1 + 0], PRIM_INT__s_s_s_s[n * 1 + 0]), PRIM_INT__d_s_s_s[n * 6 + 3]);
361 
362                         PRIM_INT__d_s_s_s[n * 6 + 5] = SIMINT_MUL(P_PA[2], PRIM_INT__p_s_s_s[n * 3 + 2]);
363                         PRIM_INT__d_s_s_s[n * 6 + 5] = SIMINT_FMADD( aop_PQ[2], PRIM_INT__p_s_s_s[(n+1) * 3 + 2], PRIM_INT__d_s_s_s[n * 6 + 5]);
364                         PRIM_INT__d_s_s_s[n * 6 + 5] = SIMINT_FMADD( vrr_const_1_over_2p, SIMINT_FMADD(a_over_p, PRIM_INT__s_s_s_s[(n+1) * 1 + 0], PRIM_INT__s_s_s_s[n * 1 + 0]), PRIM_INT__d_s_s_s[n * 6 + 5]);
365 
366                     }
367 
368 
369 
370                     // Forming PRIM_INT__f_s_s_s[15 * 10];
371                     for(n = 0; n < 15; ++n)  // loop over orders of auxiliary function
372                     {
373 
374                         PRIM_INT__f_s_s_s[n * 10 + 0] = SIMINT_MUL(P_PA[0], PRIM_INT__d_s_s_s[n * 6 + 0]);
375                         PRIM_INT__f_s_s_s[n * 10 + 0] = SIMINT_FMADD( aop_PQ[0], PRIM_INT__d_s_s_s[(n+1) * 6 + 0], PRIM_INT__f_s_s_s[n * 10 + 0]);
376                         PRIM_INT__f_s_s_s[n * 10 + 0] = SIMINT_FMADD( vrr_const_2_over_2p, SIMINT_FMADD(a_over_p, PRIM_INT__p_s_s_s[(n+1) * 3 + 0], PRIM_INT__p_s_s_s[n * 3 + 0]), PRIM_INT__f_s_s_s[n * 10 + 0]);
377 
378                         PRIM_INT__f_s_s_s[n * 10 + 1] = SIMINT_MUL(P_PA[1], PRIM_INT__d_s_s_s[n * 6 + 0]);
379                         PRIM_INT__f_s_s_s[n * 10 + 1] = SIMINT_FMADD( aop_PQ[1], PRIM_INT__d_s_s_s[(n+1) * 6 + 0], PRIM_INT__f_s_s_s[n * 10 + 1]);
380 
381                         PRIM_INT__f_s_s_s[n * 10 + 2] = SIMINT_MUL(P_PA[2], PRIM_INT__d_s_s_s[n * 6 + 0]);
382                         PRIM_INT__f_s_s_s[n * 10 + 2] = SIMINT_FMADD( aop_PQ[2], PRIM_INT__d_s_s_s[(n+1) * 6 + 0], PRIM_INT__f_s_s_s[n * 10 + 2]);
383 
384                         PRIM_INT__f_s_s_s[n * 10 + 3] = SIMINT_MUL(P_PA[0], PRIM_INT__d_s_s_s[n * 6 + 3]);
385                         PRIM_INT__f_s_s_s[n * 10 + 3] = SIMINT_FMADD( aop_PQ[0], PRIM_INT__d_s_s_s[(n+1) * 6 + 3], PRIM_INT__f_s_s_s[n * 10 + 3]);
386 
387                         PRIM_INT__f_s_s_s[n * 10 + 4] = SIMINT_MUL(P_PA[2], PRIM_INT__d_s_s_s[n * 6 + 1]);
388                         PRIM_INT__f_s_s_s[n * 10 + 4] = SIMINT_FMADD( aop_PQ[2], PRIM_INT__d_s_s_s[(n+1) * 6 + 1], PRIM_INT__f_s_s_s[n * 10 + 4]);
389 
390                         PRIM_INT__f_s_s_s[n * 10 + 5] = SIMINT_MUL(P_PA[0], PRIM_INT__d_s_s_s[n * 6 + 5]);
391                         PRIM_INT__f_s_s_s[n * 10 + 5] = SIMINT_FMADD( aop_PQ[0], PRIM_INT__d_s_s_s[(n+1) * 6 + 5], PRIM_INT__f_s_s_s[n * 10 + 5]);
392 
393                         PRIM_INT__f_s_s_s[n * 10 + 6] = SIMINT_MUL(P_PA[1], PRIM_INT__d_s_s_s[n * 6 + 3]);
394                         PRIM_INT__f_s_s_s[n * 10 + 6] = SIMINT_FMADD( aop_PQ[1], PRIM_INT__d_s_s_s[(n+1) * 6 + 3], PRIM_INT__f_s_s_s[n * 10 + 6]);
395                         PRIM_INT__f_s_s_s[n * 10 + 6] = SIMINT_FMADD( vrr_const_2_over_2p, SIMINT_FMADD(a_over_p, PRIM_INT__p_s_s_s[(n+1) * 3 + 1], PRIM_INT__p_s_s_s[n * 3 + 1]), PRIM_INT__f_s_s_s[n * 10 + 6]);
396 
397                         PRIM_INT__f_s_s_s[n * 10 + 7] = SIMINT_MUL(P_PA[2], PRIM_INT__d_s_s_s[n * 6 + 3]);
398                         PRIM_INT__f_s_s_s[n * 10 + 7] = SIMINT_FMADD( aop_PQ[2], PRIM_INT__d_s_s_s[(n+1) * 6 + 3], PRIM_INT__f_s_s_s[n * 10 + 7]);
399 
400                         PRIM_INT__f_s_s_s[n * 10 + 8] = SIMINT_MUL(P_PA[1], PRIM_INT__d_s_s_s[n * 6 + 5]);
401                         PRIM_INT__f_s_s_s[n * 10 + 8] = SIMINT_FMADD( aop_PQ[1], PRIM_INT__d_s_s_s[(n+1) * 6 + 5], PRIM_INT__f_s_s_s[n * 10 + 8]);
402 
403                         PRIM_INT__f_s_s_s[n * 10 + 9] = SIMINT_MUL(P_PA[2], PRIM_INT__d_s_s_s[n * 6 + 5]);
404                         PRIM_INT__f_s_s_s[n * 10 + 9] = SIMINT_FMADD( aop_PQ[2], PRIM_INT__d_s_s_s[(n+1) * 6 + 5], PRIM_INT__f_s_s_s[n * 10 + 9]);
405                         PRIM_INT__f_s_s_s[n * 10 + 9] = SIMINT_FMADD( vrr_const_2_over_2p, SIMINT_FMADD(a_over_p, PRIM_INT__p_s_s_s[(n+1) * 3 + 2], PRIM_INT__p_s_s_s[n * 3 + 2]), PRIM_INT__f_s_s_s[n * 10 + 9]);
406 
407                     }
408 
409 
410                     VRR_I_g_s_s_s(
411                             PRIM_INT__g_s_s_s,
412                             PRIM_INT__f_s_s_s,
413                             PRIM_INT__d_s_s_s,
414                             P_PA,
415                             a_over_p,
416                             aop_PQ,
417                             one_over_2p,
418                             14);
419 
420 
421                     VRR_I_h_s_s_s(
422                             PRIM_INT__h_s_s_s,
423                             PRIM_INT__g_s_s_s,
424                             PRIM_INT__f_s_s_s,
425                             P_PA,
426                             a_over_p,
427                             aop_PQ,
428                             one_over_2p,
429                             13);
430 
431 
432                     ostei_general_vrr1_I(6, 12,
433                             one_over_2p, a_over_p, aop_PQ, P_PA,
434                             PRIM_INT__h_s_s_s, PRIM_INT__g_s_s_s, PRIM_INT__i_s_s_s);
435 
436 
437                     ostei_general_vrr1_I(7, 11,
438                             one_over_2p, a_over_p, aop_PQ, P_PA,
439                             PRIM_INT__i_s_s_s, PRIM_INT__h_s_s_s, PRIM_INT__k_s_s_s);
440 
441 
442                     ostei_general_vrr_K(7, 0, 1, 0, 4,
443                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
444                             PRIM_INT__k_s_s_s, NULL, NULL, PRIM_INT__i_s_s_s, NULL, PRIM_INT__k_s_p_s);
445 
446 
447                     ostei_general_vrr_K(6, 0, 1, 0, 4,
448                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
449                             PRIM_INT__i_s_s_s, NULL, NULL, PRIM_INT__h_s_s_s, NULL, PRIM_INT__i_s_p_s);
450 
451 
452                     ostei_general_vrr_K(7, 0, 2, 0, 3,
453                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
454                             PRIM_INT__k_s_p_s, PRIM_INT__k_s_s_s, NULL, PRIM_INT__i_s_p_s, NULL, PRIM_INT__k_s_d_s);
455 
456 
457                     ostei_general_vrr_K(5, 0, 1, 0, 4,
458                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
459                             PRIM_INT__h_s_s_s, NULL, NULL, PRIM_INT__g_s_s_s, NULL, PRIM_INT__h_s_p_s);
460 
461 
462                     ostei_general_vrr_K(6, 0, 2, 0, 3,
463                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
464                             PRIM_INT__i_s_p_s, PRIM_INT__i_s_s_s, NULL, PRIM_INT__h_s_p_s, NULL, PRIM_INT__i_s_d_s);
465 
466 
467                     ostei_general_vrr_K(7, 0, 3, 0, 2,
468                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
469                             PRIM_INT__k_s_d_s, PRIM_INT__k_s_p_s, NULL, PRIM_INT__i_s_d_s, NULL, PRIM_INT__k_s_f_s);
470 
471 
472                     VRR_K_g_s_p_s(
473                             PRIM_INT__g_s_p_s,
474                             PRIM_INT__g_s_s_s,
475                             PRIM_INT__f_s_s_s,
476                             Q_PA,
477                             aoq_PQ,
478                             one_over_2pq,
479                             4);
480 
481 
482                     ostei_general_vrr_K(5, 0, 2, 0, 3,
483                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
484                             PRIM_INT__h_s_p_s, PRIM_INT__h_s_s_s, NULL, PRIM_INT__g_s_p_s, NULL, PRIM_INT__h_s_d_s);
485 
486 
487                     ostei_general_vrr_K(6, 0, 3, 0, 2,
488                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
489                             PRIM_INT__i_s_d_s, PRIM_INT__i_s_p_s, NULL, PRIM_INT__h_s_d_s, NULL, PRIM_INT__i_s_f_s);
490 
491 
492                     ostei_general_vrr_K(7, 0, 4, 0, 1,
493                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
494                             PRIM_INT__k_s_f_s, PRIM_INT__k_s_d_s, NULL, PRIM_INT__i_s_f_s, NULL, PRIM_INT__k_s_g_s);
495 
496 
497                     ostei_general_vrr1_I(8, 10,
498                             one_over_2p, a_over_p, aop_PQ, P_PA,
499                             PRIM_INT__k_s_s_s, PRIM_INT__i_s_s_s, PRIM_INT__l_s_s_s);
500 
501 
502                     ostei_general_vrr_K(8, 0, 1, 0, 4,
503                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
504                             PRIM_INT__l_s_s_s, NULL, NULL, PRIM_INT__k_s_s_s, NULL, PRIM_INT__l_s_p_s);
505 
506 
507                     ostei_general_vrr_K(8, 0, 2, 0, 3,
508                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
509                             PRIM_INT__l_s_p_s, PRIM_INT__l_s_s_s, NULL, PRIM_INT__k_s_p_s, NULL, PRIM_INT__l_s_d_s);
510 
511 
512                     ostei_general_vrr_K(8, 0, 3, 0, 2,
513                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
514                             PRIM_INT__l_s_d_s, PRIM_INT__l_s_p_s, NULL, PRIM_INT__k_s_d_s, NULL, PRIM_INT__l_s_f_s);
515 
516 
517                     ostei_general_vrr_K(8, 0, 4, 0, 1,
518                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
519                             PRIM_INT__l_s_f_s, PRIM_INT__l_s_d_s, NULL, PRIM_INT__k_s_f_s, NULL, PRIM_INT__l_s_g_s);
520 
521 
522                     ostei_general_vrr1_I(9, 9,
523                             one_over_2p, a_over_p, aop_PQ, P_PA,
524                             PRIM_INT__l_s_s_s, PRIM_INT__k_s_s_s, PRIM_INT__m_s_s_s);
525 
526 
527                     ostei_general_vrr_K(9, 0, 1, 0, 4,
528                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
529                             PRIM_INT__m_s_s_s, NULL, NULL, PRIM_INT__l_s_s_s, NULL, PRIM_INT__m_s_p_s);
530 
531 
532                     ostei_general_vrr_K(9, 0, 2, 0, 3,
533                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
534                             PRIM_INT__m_s_p_s, PRIM_INT__m_s_s_s, NULL, PRIM_INT__l_s_p_s, NULL, PRIM_INT__m_s_d_s);
535 
536 
537                     ostei_general_vrr_K(9, 0, 3, 0, 2,
538                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
539                             PRIM_INT__m_s_d_s, PRIM_INT__m_s_p_s, NULL, PRIM_INT__l_s_d_s, NULL, PRIM_INT__m_s_f_s);
540 
541 
542                     ostei_general_vrr_K(9, 0, 4, 0, 1,
543                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
544                             PRIM_INT__m_s_f_s, PRIM_INT__m_s_d_s, NULL, PRIM_INT__l_s_f_s, NULL, PRIM_INT__m_s_g_s);
545 
546 
547                     ostei_general_vrr1_I(10, 8,
548                             one_over_2p, a_over_p, aop_PQ, P_PA,
549                             PRIM_INT__m_s_s_s, PRIM_INT__l_s_s_s, PRIM_INT__n_s_s_s);
550 
551 
552                     ostei_general_vrr_K(10, 0, 1, 0, 4,
553                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
554                             PRIM_INT__n_s_s_s, NULL, NULL, PRIM_INT__m_s_s_s, NULL, PRIM_INT__n_s_p_s);
555 
556 
557                     ostei_general_vrr_K(10, 0, 2, 0, 3,
558                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
559                             PRIM_INT__n_s_p_s, PRIM_INT__n_s_s_s, NULL, PRIM_INT__m_s_p_s, NULL, PRIM_INT__n_s_d_s);
560 
561 
562                     ostei_general_vrr_K(10, 0, 3, 0, 2,
563                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
564                             PRIM_INT__n_s_d_s, PRIM_INT__n_s_p_s, NULL, PRIM_INT__m_s_d_s, NULL, PRIM_INT__n_s_f_s);
565 
566 
567                     ostei_general_vrr_K(10, 0, 4, 0, 1,
568                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
569                             PRIM_INT__n_s_f_s, PRIM_INT__n_s_d_s, NULL, PRIM_INT__m_s_f_s, NULL, PRIM_INT__n_s_g_s);
570 
571 
572                     ostei_general_vrr1_I(11, 7,
573                             one_over_2p, a_over_p, aop_PQ, P_PA,
574                             PRIM_INT__n_s_s_s, PRIM_INT__m_s_s_s, PRIM_INT__o_s_s_s);
575 
576 
577                     ostei_general_vrr_K(11, 0, 1, 0, 4,
578                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
579                             PRIM_INT__o_s_s_s, NULL, NULL, PRIM_INT__n_s_s_s, NULL, PRIM_INT__o_s_p_s);
580 
581 
582                     ostei_general_vrr_K(11, 0, 2, 0, 3,
583                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
584                             PRIM_INT__o_s_p_s, PRIM_INT__o_s_s_s, NULL, PRIM_INT__n_s_p_s, NULL, PRIM_INT__o_s_d_s);
585 
586 
587                     ostei_general_vrr_K(11, 0, 3, 0, 2,
588                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
589                             PRIM_INT__o_s_d_s, PRIM_INT__o_s_p_s, NULL, PRIM_INT__n_s_d_s, NULL, PRIM_INT__o_s_f_s);
590 
591 
592                     ostei_general_vrr_K(11, 0, 4, 0, 1,
593                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
594                             PRIM_INT__o_s_f_s, PRIM_INT__o_s_d_s, NULL, PRIM_INT__n_s_f_s, NULL, PRIM_INT__o_s_g_s);
595 
596 
597                     ostei_general_vrr1_I(12, 6,
598                             one_over_2p, a_over_p, aop_PQ, P_PA,
599                             PRIM_INT__o_s_s_s, PRIM_INT__n_s_s_s, PRIM_INT__q_s_s_s);
600 
601 
602                     ostei_general_vrr_K(12, 0, 1, 0, 4,
603                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
604                             PRIM_INT__q_s_s_s, NULL, NULL, PRIM_INT__o_s_s_s, NULL, PRIM_INT__q_s_p_s);
605 
606 
607                     ostei_general_vrr_K(12, 0, 2, 0, 3,
608                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
609                             PRIM_INT__q_s_p_s, PRIM_INT__q_s_s_s, NULL, PRIM_INT__o_s_p_s, NULL, PRIM_INT__q_s_d_s);
610 
611 
612                     ostei_general_vrr_K(12, 0, 3, 0, 2,
613                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
614                             PRIM_INT__q_s_d_s, PRIM_INT__q_s_p_s, NULL, PRIM_INT__o_s_d_s, NULL, PRIM_INT__q_s_f_s);
615 
616 
617                     ostei_general_vrr_K(12, 0, 4, 0, 1,
618                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
619                             PRIM_INT__q_s_f_s, PRIM_INT__q_s_d_s, NULL, PRIM_INT__o_s_f_s, NULL, PRIM_INT__q_s_g_s);
620 
621 
622                     ostei_general_vrr1_I(13, 5,
623                             one_over_2p, a_over_p, aop_PQ, P_PA,
624                             PRIM_INT__q_s_s_s, PRIM_INT__o_s_s_s, PRIM_INT__r_s_s_s);
625 
626 
627                     ostei_general_vrr_K(13, 0, 1, 0, 4,
628                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
629                             PRIM_INT__r_s_s_s, NULL, NULL, PRIM_INT__q_s_s_s, NULL, PRIM_INT__r_s_p_s);
630 
631 
632                     ostei_general_vrr_K(13, 0, 2, 0, 3,
633                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
634                             PRIM_INT__r_s_p_s, PRIM_INT__r_s_s_s, NULL, PRIM_INT__q_s_p_s, NULL, PRIM_INT__r_s_d_s);
635 
636 
637                     ostei_general_vrr_K(13, 0, 3, 0, 2,
638                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
639                             PRIM_INT__r_s_d_s, PRIM_INT__r_s_p_s, NULL, PRIM_INT__q_s_d_s, NULL, PRIM_INT__r_s_f_s);
640 
641 
642                     ostei_general_vrr_K(13, 0, 4, 0, 1,
643                             one_over_2q, a_over_q, one_over_2pq, aoq_PQ, Q_PA,
644                             PRIM_INT__r_s_f_s, PRIM_INT__r_s_d_s, NULL, PRIM_INT__q_s_f_s, NULL, PRIM_INT__r_s_g_s);
645 
646 
647 
648 
649                     ////////////////////////////////////
650                     // Accumulate contracted integrals
651                     ////////////////////////////////////
652                     if(lastoffset == 0)
653                     {
654                         contract_all(540, PRIM_INT__k_s_g_s, PRIM_PTR_INT__k_s_g_s);
655                         contract_all(675, PRIM_INT__l_s_g_s, PRIM_PTR_INT__l_s_g_s);
656                         contract_all(825, PRIM_INT__m_s_g_s, PRIM_PTR_INT__m_s_g_s);
657                         contract_all(990, PRIM_INT__n_s_g_s, PRIM_PTR_INT__n_s_g_s);
658                         contract_all(1170, PRIM_INT__o_s_g_s, PRIM_PTR_INT__o_s_g_s);
659                         contract_all(1365, PRIM_INT__q_s_g_s, PRIM_PTR_INT__q_s_g_s);
660                         contract_all(1575, PRIM_INT__r_s_g_s, PRIM_PTR_INT__r_s_g_s);
661                     }
662                     else
663                     {
664                         contract(540, shelloffsets, PRIM_INT__k_s_g_s, PRIM_PTR_INT__k_s_g_s);
665                         contract(675, shelloffsets, PRIM_INT__l_s_g_s, PRIM_PTR_INT__l_s_g_s);
666                         contract(825, shelloffsets, PRIM_INT__m_s_g_s, PRIM_PTR_INT__m_s_g_s);
667                         contract(990, shelloffsets, PRIM_INT__n_s_g_s, PRIM_PTR_INT__n_s_g_s);
668                         contract(1170, shelloffsets, PRIM_INT__o_s_g_s, PRIM_PTR_INT__o_s_g_s);
669                         contract(1365, shelloffsets, PRIM_INT__q_s_g_s, PRIM_PTR_INT__q_s_g_s);
670                         contract(1575, shelloffsets, PRIM_INT__r_s_g_s, PRIM_PTR_INT__r_s_g_s);
671                         PRIM_PTR_INT__k_s_g_s += lastoffset*540;
672                         PRIM_PTR_INT__l_s_g_s += lastoffset*675;
673                         PRIM_PTR_INT__m_s_g_s += lastoffset*825;
674                         PRIM_PTR_INT__n_s_g_s += lastoffset*990;
675                         PRIM_PTR_INT__o_s_g_s += lastoffset*1170;
676                         PRIM_PTR_INT__q_s_g_s += lastoffset*1365;
677                         PRIM_PTR_INT__r_s_g_s += lastoffset*1575;
678                     }
679 
680                 }  // close loop over j
681             }  // close loop over i
682 
683             //Advance to the next batch
684             jstart = SIMINT_SIMD_ROUND(jend);
685 
686             //////////////////////////////////////////////
687             // Contracted integrals: Horizontal recurrance
688             //////////////////////////////////////////////
689 
690 
691             const double hAB[3] = { P.AB_x[ab], P.AB_y[ab], P.AB_z[ab] };
692 
693 
694             for(abcd = 0; abcd < nshellbatch; ++abcd, ++real_abcd)
695             {
696 
697                 // set up HRR pointers
698                 double const * restrict HRR_INT__k_s_g_s = INT__k_s_g_s + abcd * 540;
699                 double const * restrict HRR_INT__l_s_g_s = INT__l_s_g_s + abcd * 675;
700                 double const * restrict HRR_INT__m_s_g_s = INT__m_s_g_s + abcd * 825;
701                 double const * restrict HRR_INT__n_s_g_s = INT__n_s_g_s + abcd * 990;
702                 double const * restrict HRR_INT__o_s_g_s = INT__o_s_g_s + abcd * 1170;
703                 double const * restrict HRR_INT__q_s_g_s = INT__q_s_g_s + abcd * 1365;
704                 double const * restrict HRR_INT__r_s_g_s = INT__r_s_g_s + abcd * 1575;
705                 double * restrict HRR_INT__k_i_g_s = INT__k_i_g_s + real_abcd * 15120;
706 
707                 // form INT__k_p_g_s
708                 ostei_general_hrr_J(7, 1, 4, 0, hAB, HRR_INT__l_s_g_s, HRR_INT__k_s_g_s, HRR_INT__k_p_g_s);
709 
710                 // form INT__l_p_g_s
711                 ostei_general_hrr_J(8, 1, 4, 0, hAB, HRR_INT__m_s_g_s, HRR_INT__l_s_g_s, HRR_INT__l_p_g_s);
712 
713                 // form INT__m_p_g_s
714                 ostei_general_hrr_J(9, 1, 4, 0, hAB, HRR_INT__n_s_g_s, HRR_INT__m_s_g_s, HRR_INT__m_p_g_s);
715 
716                 // form INT__n_p_g_s
717                 ostei_general_hrr_J(10, 1, 4, 0, hAB, HRR_INT__o_s_g_s, HRR_INT__n_s_g_s, HRR_INT__n_p_g_s);
718 
719                 // form INT__o_p_g_s
720                 ostei_general_hrr_J(11, 1, 4, 0, hAB, HRR_INT__q_s_g_s, HRR_INT__o_s_g_s, HRR_INT__o_p_g_s);
721 
722                 // form INT__q_p_g_s
723                 ostei_general_hrr_J(12, 1, 4, 0, hAB, HRR_INT__r_s_g_s, HRR_INT__q_s_g_s, HRR_INT__q_p_g_s);
724 
725                 // form INT__k_d_g_s
726                 ostei_general_hrr_J(7, 2, 4, 0, hAB, HRR_INT__l_p_g_s, HRR_INT__k_p_g_s, HRR_INT__k_d_g_s);
727 
728                 // form INT__l_d_g_s
729                 ostei_general_hrr_J(8, 2, 4, 0, hAB, HRR_INT__m_p_g_s, HRR_INT__l_p_g_s, HRR_INT__l_d_g_s);
730 
731                 // form INT__m_d_g_s
732                 ostei_general_hrr_J(9, 2, 4, 0, hAB, HRR_INT__n_p_g_s, HRR_INT__m_p_g_s, HRR_INT__m_d_g_s);
733 
734                 // form INT__n_d_g_s
735                 ostei_general_hrr_J(10, 2, 4, 0, hAB, HRR_INT__o_p_g_s, HRR_INT__n_p_g_s, HRR_INT__n_d_g_s);
736 
737                 // form INT__o_d_g_s
738                 ostei_general_hrr_J(11, 2, 4, 0, hAB, HRR_INT__q_p_g_s, HRR_INT__o_p_g_s, HRR_INT__o_d_g_s);
739 
740                 // form INT__k_f_g_s
741                 ostei_general_hrr_J(7, 3, 4, 0, hAB, HRR_INT__l_d_g_s, HRR_INT__k_d_g_s, HRR_INT__k_f_g_s);
742 
743                 // form INT__l_f_g_s
744                 ostei_general_hrr_J(8, 3, 4, 0, hAB, HRR_INT__m_d_g_s, HRR_INT__l_d_g_s, HRR_INT__l_f_g_s);
745 
746                 // form INT__m_f_g_s
747                 ostei_general_hrr_J(9, 3, 4, 0, hAB, HRR_INT__n_d_g_s, HRR_INT__m_d_g_s, HRR_INT__m_f_g_s);
748 
749                 // form INT__n_f_g_s
750                 ostei_general_hrr_J(10, 3, 4, 0, hAB, HRR_INT__o_d_g_s, HRR_INT__n_d_g_s, HRR_INT__n_f_g_s);
751 
752                 // form INT__k_g_g_s
753                 ostei_general_hrr_J(7, 4, 4, 0, hAB, HRR_INT__l_f_g_s, HRR_INT__k_f_g_s, HRR_INT__k_g_g_s);
754 
755                 // form INT__l_g_g_s
756                 ostei_general_hrr_J(8, 4, 4, 0, hAB, HRR_INT__m_f_g_s, HRR_INT__l_f_g_s, HRR_INT__l_g_g_s);
757 
758                 // form INT__m_g_g_s
759                 ostei_general_hrr_J(9, 4, 4, 0, hAB, HRR_INT__n_f_g_s, HRR_INT__m_f_g_s, HRR_INT__m_g_g_s);
760 
761                 // form INT__k_h_g_s
762                 ostei_general_hrr_J(7, 5, 4, 0, hAB, HRR_INT__l_g_g_s, HRR_INT__k_g_g_s, HRR_INT__k_h_g_s);
763 
764                 // form INT__l_h_g_s
765                 ostei_general_hrr_J(8, 5, 4, 0, hAB, HRR_INT__m_g_g_s, HRR_INT__l_g_g_s, HRR_INT__l_h_g_s);
766 
767                 // form INT__k_i_g_s
768                 ostei_general_hrr_J(7, 6, 4, 0, hAB, HRR_INT__l_h_g_s, HRR_INT__k_h_g_s, HRR_INT__k_i_g_s);
769 
770 
771             }  // close HRR loop
772 
773 
774         }   // close loop cdbatch
775 
776         istart = iend;
777     }  // close loop over ab
778 
779     return P.nshell12_clip * Q.nshell12_clip;
780 }
781 
ostei_i_k_g_s(struct simint_multi_shellpair const P,struct simint_multi_shellpair const Q,double screen_tol,double * const restrict work,double * const restrict INT__i_k_g_s)782 int ostei_i_k_g_s(struct simint_multi_shellpair const P,
783                   struct simint_multi_shellpair const Q,
784                   double screen_tol,
785                   double * const restrict work,
786                   double * const restrict INT__i_k_g_s)
787 {
788     double P_AB[3*P.nshell12];
789     struct simint_multi_shellpair P_tmp = P;
790     P_tmp.PA_x = P.PB_x;  P_tmp.PA_y = P.PB_y;  P_tmp.PA_z = P.PB_z;
791     P_tmp.PB_x = P.PA_x;  P_tmp.PB_y = P.PA_y;  P_tmp.PB_z = P.PA_z;
792     P_tmp.AB_x = P_AB;
793     P_tmp.AB_y = P_AB + P.nshell12;
794     P_tmp.AB_z = P_AB + 2*P.nshell12;
795 
796     for(int i = 0; i < P.nshell12; i++)
797     {
798         P_tmp.AB_x[i] = -P.AB_x[i];
799         P_tmp.AB_y[i] = -P.AB_y[i];
800         P_tmp.AB_z[i] = -P.AB_z[i];
801     }
802 
803     int ret = ostei_k_i_g_s(P_tmp, Q, screen_tol, work, INT__i_k_g_s);
804     double buffer[15120] SIMINT_ALIGN_ARRAY_DBL;
805 
806     for(int q = 0; q < ret; q++)
807     {
808         int idx = 0;
809         for(int a = 0; a < 28; ++a)
810         for(int b = 0; b < 36; ++b)
811         for(int c = 0; c < 15; ++c)
812         for(int d = 0; d < 1; ++d)
813             buffer[idx++] = INT__i_k_g_s[q*15120+b*420+a*15+c*1+d];
814 
815         memcpy(INT__i_k_g_s+q*15120, buffer, 15120*sizeof(double));
816     }
817 
818     return ret;
819 }
820 
ostei_k_i_s_g(struct simint_multi_shellpair const P,struct simint_multi_shellpair const Q,double screen_tol,double * const restrict work,double * const restrict INT__k_i_s_g)821 int ostei_k_i_s_g(struct simint_multi_shellpair const P,
822                   struct simint_multi_shellpair const Q,
823                   double screen_tol,
824                   double * const restrict work,
825                   double * const restrict INT__k_i_s_g)
826 {
827     double Q_AB[3*Q.nshell12];
828     struct simint_multi_shellpair Q_tmp = Q;
829     Q_tmp.PA_x = Q.PB_x;  Q_tmp.PA_y = Q.PB_y;  Q_tmp.PA_z = Q.PB_z;
830     Q_tmp.PB_x = Q.PA_x;  Q_tmp.PB_y = Q.PA_y;  Q_tmp.PB_z = Q.PA_z;
831     Q_tmp.AB_x = Q_AB;
832     Q_tmp.AB_y = Q_AB + Q.nshell12;
833     Q_tmp.AB_z = Q_AB + 2*Q.nshell12;
834 
835     for(int i = 0; i < Q.nshell12; i++)
836     {
837         Q_tmp.AB_x[i] = -Q.AB_x[i];
838         Q_tmp.AB_y[i] = -Q.AB_y[i];
839         Q_tmp.AB_z[i] = -Q.AB_z[i];
840     }
841 
842     int ret = ostei_k_i_g_s(P, Q_tmp, screen_tol, work, INT__k_i_s_g);
843     double buffer[15120] SIMINT_ALIGN_ARRAY_DBL;
844 
845     for(int q = 0; q < ret; q++)
846     {
847         int idx = 0;
848         for(int a = 0; a < 36; ++a)
849         for(int b = 0; b < 28; ++b)
850         for(int c = 0; c < 1; ++c)
851         for(int d = 0; d < 15; ++d)
852             buffer[idx++] = INT__k_i_s_g[q*15120+a*420+b*15+d*1+c];
853 
854         memcpy(INT__k_i_s_g+q*15120, buffer, 15120*sizeof(double));
855     }
856 
857     return ret;
858 }
859 
ostei_i_k_s_g(struct simint_multi_shellpair const P,struct simint_multi_shellpair const Q,double screen_tol,double * const restrict work,double * const restrict INT__i_k_s_g)860 int ostei_i_k_s_g(struct simint_multi_shellpair const P,
861                   struct simint_multi_shellpair const Q,
862                   double screen_tol,
863                   double * const restrict work,
864                   double * const restrict INT__i_k_s_g)
865 {
866     double P_AB[3*P.nshell12];
867     struct simint_multi_shellpair P_tmp = P;
868     P_tmp.PA_x = P.PB_x;  P_tmp.PA_y = P.PB_y;  P_tmp.PA_z = P.PB_z;
869     P_tmp.PB_x = P.PA_x;  P_tmp.PB_y = P.PA_y;  P_tmp.PB_z = P.PA_z;
870     P_tmp.AB_x = P_AB;
871     P_tmp.AB_y = P_AB + P.nshell12;
872     P_tmp.AB_z = P_AB + 2*P.nshell12;
873 
874     for(int i = 0; i < P.nshell12; i++)
875     {
876         P_tmp.AB_x[i] = -P.AB_x[i];
877         P_tmp.AB_y[i] = -P.AB_y[i];
878         P_tmp.AB_z[i] = -P.AB_z[i];
879     }
880 
881     double Q_AB[3*Q.nshell12];
882     struct simint_multi_shellpair Q_tmp = Q;
883     Q_tmp.PA_x = Q.PB_x;  Q_tmp.PA_y = Q.PB_y;  Q_tmp.PA_z = Q.PB_z;
884     Q_tmp.PB_x = Q.PA_x;  Q_tmp.PB_y = Q.PA_y;  Q_tmp.PB_z = Q.PA_z;
885     Q_tmp.AB_x = Q_AB;
886     Q_tmp.AB_y = Q_AB + Q.nshell12;
887     Q_tmp.AB_z = Q_AB + 2*Q.nshell12;
888 
889     for(int i = 0; i < Q.nshell12; i++)
890     {
891         Q_tmp.AB_x[i] = -Q.AB_x[i];
892         Q_tmp.AB_y[i] = -Q.AB_y[i];
893         Q_tmp.AB_z[i] = -Q.AB_z[i];
894     }
895 
896     int ret = ostei_k_i_g_s(P_tmp, Q_tmp, screen_tol, work, INT__i_k_s_g);
897     double buffer[15120] SIMINT_ALIGN_ARRAY_DBL;
898 
899     for(int q = 0; q < ret; q++)
900     {
901         int idx = 0;
902         for(int a = 0; a < 28; ++a)
903         for(int b = 0; b < 36; ++b)
904         for(int c = 0; c < 1; ++c)
905         for(int d = 0; d < 15; ++d)
906             buffer[idx++] = INT__i_k_s_g[q*15120+b*420+a*15+d*1+c];
907 
908         memcpy(INT__i_k_s_g+q*15120, buffer, 15120*sizeof(double));
909     }
910 
911     return ret;
912 }
913 
914