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_f_p_i_i(struct simint_multi_shellpair const P,struct simint_multi_shellpair const Q,double screen_tol,double * const restrict work,double * const restrict INT__f_p_i_i)8 int ostei_f_p_i_i(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__f_p_i_i)
13 {
14 
15     SIMINT_ASSUME_ALIGN_DBL(work);
16     SIMINT_ASSUME_ALIGN_DBL(INT__f_p_i_i);
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     int ibra;
27 
28     // partition workspace
29     double * const INT__f_s_i_s = work + (SIMINT_NSHELL_SIMD * 0);
30     double * const INT__f_s_k_s = work + (SIMINT_NSHELL_SIMD * 280);
31     double * const INT__f_s_l_s = work + (SIMINT_NSHELL_SIMD * 640);
32     double * const INT__f_s_m_s = work + (SIMINT_NSHELL_SIMD * 1090);
33     double * const INT__f_s_n_s = work + (SIMINT_NSHELL_SIMD * 1640);
34     double * const INT__f_s_o_s = work + (SIMINT_NSHELL_SIMD * 2300);
35     double * const INT__f_s_q_s = work + (SIMINT_NSHELL_SIMD * 3080);
36     double * const INT__g_s_i_s = work + (SIMINT_NSHELL_SIMD * 3990);
37     double * const INT__g_s_k_s = work + (SIMINT_NSHELL_SIMD * 4410);
38     double * const INT__g_s_l_s = work + (SIMINT_NSHELL_SIMD * 4950);
39     double * const INT__g_s_m_s = work + (SIMINT_NSHELL_SIMD * 5625);
40     double * const INT__g_s_n_s = work + (SIMINT_NSHELL_SIMD * 6450);
41     double * const INT__g_s_o_s = work + (SIMINT_NSHELL_SIMD * 7440);
42     double * const INT__g_s_q_s = work + (SIMINT_NSHELL_SIMD * 8610);
43     SIMINT_DBLTYPE * const primwork = (SIMINT_DBLTYPE *)(work + SIMINT_NSHELL_SIMD*9975);
44     SIMINT_DBLTYPE * const restrict PRIM_INT__s_s_s_s = primwork + 0;
45     SIMINT_DBLTYPE * const restrict PRIM_INT__s_s_p_s = primwork + 17;
46     SIMINT_DBLTYPE * const restrict PRIM_INT__s_s_d_s = primwork + 65;
47     SIMINT_DBLTYPE * const restrict PRIM_INT__s_s_f_s = primwork + 155;
48     SIMINT_DBLTYPE * const restrict PRIM_INT__s_s_g_s = primwork + 295;
49     SIMINT_DBLTYPE * const restrict PRIM_INT__s_s_h_s = primwork + 490;
50     SIMINT_DBLTYPE * const restrict PRIM_INT__s_s_i_s = primwork + 742;
51     SIMINT_DBLTYPE * const restrict PRIM_INT__s_s_k_s = primwork + 1050;
52     SIMINT_DBLTYPE * const restrict PRIM_INT__s_s_l_s = primwork + 1410;
53     SIMINT_DBLTYPE * const restrict PRIM_INT__s_s_m_s = primwork + 1815;
54     SIMINT_DBLTYPE * const restrict PRIM_INT__s_s_n_s = primwork + 2255;
55     SIMINT_DBLTYPE * const restrict PRIM_INT__s_s_o_s = primwork + 2717;
56     SIMINT_DBLTYPE * const restrict PRIM_INT__s_s_q_s = primwork + 3185;
57     SIMINT_DBLTYPE * const restrict PRIM_INT__p_s_f_s = primwork + 3640;
58     SIMINT_DBLTYPE * const restrict PRIM_INT__p_s_g_s = primwork + 3760;
59     SIMINT_DBLTYPE * const restrict PRIM_INT__p_s_h_s = primwork + 3940;
60     SIMINT_DBLTYPE * const restrict PRIM_INT__p_s_i_s = primwork + 4192;
61     SIMINT_DBLTYPE * const restrict PRIM_INT__p_s_k_s = primwork + 4528;
62     SIMINT_DBLTYPE * const restrict PRIM_INT__p_s_l_s = primwork + 4960;
63     SIMINT_DBLTYPE * const restrict PRIM_INT__p_s_m_s = primwork + 5500;
64     SIMINT_DBLTYPE * const restrict PRIM_INT__p_s_n_s = primwork + 6160;
65     SIMINT_DBLTYPE * const restrict PRIM_INT__p_s_o_s = primwork + 6952;
66     SIMINT_DBLTYPE * const restrict PRIM_INT__p_s_q_s = primwork + 7888;
67     SIMINT_DBLTYPE * const restrict PRIM_INT__d_s_g_s = primwork + 8980;
68     SIMINT_DBLTYPE * const restrict PRIM_INT__d_s_h_s = primwork + 9250;
69     SIMINT_DBLTYPE * const restrict PRIM_INT__d_s_i_s = primwork + 9628;
70     SIMINT_DBLTYPE * const restrict PRIM_INT__d_s_k_s = primwork + 10132;
71     SIMINT_DBLTYPE * const restrict PRIM_INT__d_s_l_s = primwork + 10780;
72     SIMINT_DBLTYPE * const restrict PRIM_INT__d_s_m_s = primwork + 11590;
73     SIMINT_DBLTYPE * const restrict PRIM_INT__d_s_n_s = primwork + 12580;
74     SIMINT_DBLTYPE * const restrict PRIM_INT__d_s_o_s = primwork + 13768;
75     SIMINT_DBLTYPE * const restrict PRIM_INT__d_s_q_s = primwork + 15172;
76     SIMINT_DBLTYPE * const restrict PRIM_INT__f_s_h_s = primwork + 16810;
77     SIMINT_DBLTYPE * const restrict PRIM_INT__f_s_i_s = primwork + 17230;
78     SIMINT_DBLTYPE * const restrict PRIM_INT__f_s_k_s = primwork + 17790;
79     SIMINT_DBLTYPE * const restrict PRIM_INT__f_s_l_s = primwork + 18510;
80     SIMINT_DBLTYPE * const restrict PRIM_INT__f_s_m_s = primwork + 19410;
81     SIMINT_DBLTYPE * const restrict PRIM_INT__f_s_n_s = primwork + 20510;
82     SIMINT_DBLTYPE * const restrict PRIM_INT__f_s_o_s = primwork + 21830;
83     SIMINT_DBLTYPE * const restrict PRIM_INT__f_s_q_s = primwork + 23390;
84     SIMINT_DBLTYPE * const restrict PRIM_INT__g_s_i_s = primwork + 25210;
85     SIMINT_DBLTYPE * const restrict PRIM_INT__g_s_k_s = primwork + 25630;
86     SIMINT_DBLTYPE * const restrict PRIM_INT__g_s_l_s = primwork + 26170;
87     SIMINT_DBLTYPE * const restrict PRIM_INT__g_s_m_s = primwork + 26845;
88     SIMINT_DBLTYPE * const restrict PRIM_INT__g_s_n_s = primwork + 27670;
89     SIMINT_DBLTYPE * const restrict PRIM_INT__g_s_o_s = primwork + 28660;
90     SIMINT_DBLTYPE * const restrict PRIM_INT__g_s_q_s = primwork + 29830;
91     double * const hrrwork = (double *)(primwork + 31195);
92     double * const HRR_INT__f_p_i_s = hrrwork + 0;
93     double * const HRR_INT__f_p_i_p = hrrwork + 840;
94     double * const HRR_INT__f_p_i_d = hrrwork + 3360;
95     double * const HRR_INT__f_p_i_f = hrrwork + 8400;
96     double * const HRR_INT__f_p_i_g = hrrwork + 16800;
97     double * const HRR_INT__f_p_i_h = hrrwork + 29400;
98     double * const HRR_INT__f_p_k_s = hrrwork + 47040;
99     double * const HRR_INT__f_p_k_p = hrrwork + 48120;
100     double * const HRR_INT__f_p_k_d = hrrwork + 51360;
101     double * const HRR_INT__f_p_k_f = hrrwork + 57840;
102     double * const HRR_INT__f_p_k_g = hrrwork + 68640;
103     double * const HRR_INT__f_p_k_h = hrrwork + 84840;
104     double * const HRR_INT__f_p_l_s = hrrwork + 107520;
105     double * const HRR_INT__f_p_l_p = hrrwork + 108870;
106     double * const HRR_INT__f_p_l_d = hrrwork + 112920;
107     double * const HRR_INT__f_p_l_f = hrrwork + 121020;
108     double * const HRR_INT__f_p_l_g = hrrwork + 134520;
109     double * const HRR_INT__f_p_m_s = hrrwork + 154770;
110     double * const HRR_INT__f_p_m_p = hrrwork + 156420;
111     double * const HRR_INT__f_p_m_d = hrrwork + 161370;
112     double * const HRR_INT__f_p_m_f = hrrwork + 171270;
113     double * const HRR_INT__f_p_n_s = hrrwork + 187770;
114     double * const HRR_INT__f_p_n_p = hrrwork + 189750;
115     double * const HRR_INT__f_p_n_d = hrrwork + 195690;
116     double * const HRR_INT__f_p_o_s = hrrwork + 207570;
117     double * const HRR_INT__f_p_o_p = hrrwork + 209910;
118     double * const HRR_INT__f_p_q_s = hrrwork + 216930;
119 
120 
121     // Create constants
122     const SIMINT_DBLTYPE const_1 = SIMINT_DBLSET1(1);
123     const SIMINT_DBLTYPE const_10 = SIMINT_DBLSET1(10);
124     const SIMINT_DBLTYPE const_11 = SIMINT_DBLSET1(11);
125     const SIMINT_DBLTYPE const_12 = SIMINT_DBLSET1(12);
126     const SIMINT_DBLTYPE const_2 = SIMINT_DBLSET1(2);
127     const SIMINT_DBLTYPE const_3 = SIMINT_DBLSET1(3);
128     const SIMINT_DBLTYPE const_4 = SIMINT_DBLSET1(4);
129     const SIMINT_DBLTYPE const_5 = SIMINT_DBLSET1(5);
130     const SIMINT_DBLTYPE const_6 = SIMINT_DBLSET1(6);
131     const SIMINT_DBLTYPE const_7 = SIMINT_DBLSET1(7);
132     const SIMINT_DBLTYPE const_8 = SIMINT_DBLSET1(8);
133     const SIMINT_DBLTYPE const_9 = SIMINT_DBLSET1(9);
134     const SIMINT_DBLTYPE one_half = SIMINT_DBLSET1(0.5);
135 
136 
137     ////////////////////////////////////////
138     // Loop over shells and primitives
139     ////////////////////////////////////////
140 
141     real_abcd = 0;
142     istart = 0;
143     for(ab = 0; ab < P.nshell12_clip; ++ab)
144     {
145         const int iend = istart + P.nprim12[ab];
146 
147         cd = 0;
148         jstart = 0;
149 
150         for(cd = 0; cd < Q.nshell12_clip; cd += SIMINT_NSHELL_SIMD)
151         {
152             const int nshellbatch = ((cd + SIMINT_NSHELL_SIMD) > Q.nshell12_clip) ? Q.nshell12_clip - cd : SIMINT_NSHELL_SIMD;
153             int jend = jstart;
154             for(i = 0; i < nshellbatch; i++)
155                 jend += Q.nprim12[cd+i];
156 
157             // Clear the beginning of the workspace (where we are accumulating integrals)
158             memset(work, 0, SIMINT_NSHELL_SIMD * 9975 * sizeof(double));
159             abcd = 0;
160 
161 
162             for(i = istart; i < iend; ++i)
163             {
164                 SIMINT_DBLTYPE bra_screen_max;  // only used if check_screen
165 
166                 if(check_screen)
167                 {
168                     // Skip this whole thing if always insignificant
169                     if((P.screen[i] * Q.screen_max) < screen_tol)
170                         continue;
171                     bra_screen_max = SIMINT_DBLSET1(P.screen[i]);
172                 }
173 
174                 icd = 0;
175                 iprimcd = 0;
176                 nprim_icd = Q.nprim12[cd];
177                 double * restrict PRIM_PTR_INT__f_s_i_s = INT__f_s_i_s + abcd * 280;
178                 double * restrict PRIM_PTR_INT__f_s_k_s = INT__f_s_k_s + abcd * 360;
179                 double * restrict PRIM_PTR_INT__f_s_l_s = INT__f_s_l_s + abcd * 450;
180                 double * restrict PRIM_PTR_INT__f_s_m_s = INT__f_s_m_s + abcd * 550;
181                 double * restrict PRIM_PTR_INT__f_s_n_s = INT__f_s_n_s + abcd * 660;
182                 double * restrict PRIM_PTR_INT__f_s_o_s = INT__f_s_o_s + abcd * 780;
183                 double * restrict PRIM_PTR_INT__f_s_q_s = INT__f_s_q_s + abcd * 910;
184                 double * restrict PRIM_PTR_INT__g_s_i_s = INT__g_s_i_s + abcd * 420;
185                 double * restrict PRIM_PTR_INT__g_s_k_s = INT__g_s_k_s + abcd * 540;
186                 double * restrict PRIM_PTR_INT__g_s_l_s = INT__g_s_l_s + abcd * 675;
187                 double * restrict PRIM_PTR_INT__g_s_m_s = INT__g_s_m_s + abcd * 825;
188                 double * restrict PRIM_PTR_INT__g_s_n_s = INT__g_s_n_s + abcd * 990;
189                 double * restrict PRIM_PTR_INT__g_s_o_s = INT__g_s_o_s + abcd * 1170;
190                 double * restrict PRIM_PTR_INT__g_s_q_s = INT__g_s_q_s + abcd * 1365;
191 
192 
193 
194                 // Load these one per loop over i
195                 const SIMINT_DBLTYPE P_alpha = SIMINT_DBLSET1(P.alpha[i]);
196                 const SIMINT_DBLTYPE P_prefac = SIMINT_DBLSET1(P.prefac[i]);
197                 const SIMINT_DBLTYPE Pxyz[3] = { SIMINT_DBLSET1(P.x[i]), SIMINT_DBLSET1(P.y[i]), SIMINT_DBLSET1(P.z[i]) };
198 
199                 const SIMINT_DBLTYPE P_PA[3] = { SIMINT_DBLSET1(P.PA_x[i]), SIMINT_DBLSET1(P.PA_y[i]), SIMINT_DBLSET1(P.PA_z[i]) };
200 
201                 for(j = jstart; j < jend; j += SIMINT_SIMD_LEN)
202                 {
203                     // calculate the shell offsets
204                     // these are the offset from the shell pointed to by cd
205                     // for each element
206                     int shelloffsets[SIMINT_SIMD_LEN] = {0};
207                     int lastoffset = 0;
208                     const int nlane = ( ((j + SIMINT_SIMD_LEN) < jend) ? SIMINT_SIMD_LEN : (jend - j));
209 
210                     if((iprimcd + SIMINT_SIMD_LEN) >= nprim_icd)
211                     {
212                         // Handle if the first element of the vector is a new shell
213                         if(iprimcd >= nprim_icd && ((icd+1) < nshellbatch))
214                         {
215                             nprim_icd += Q.nprim12[cd + (++icd)];
216                             PRIM_PTR_INT__f_s_i_s += 280;
217                             PRIM_PTR_INT__f_s_k_s += 360;
218                             PRIM_PTR_INT__f_s_l_s += 450;
219                             PRIM_PTR_INT__f_s_m_s += 550;
220                             PRIM_PTR_INT__f_s_n_s += 660;
221                             PRIM_PTR_INT__f_s_o_s += 780;
222                             PRIM_PTR_INT__f_s_q_s += 910;
223                             PRIM_PTR_INT__g_s_i_s += 420;
224                             PRIM_PTR_INT__g_s_k_s += 540;
225                             PRIM_PTR_INT__g_s_l_s += 675;
226                             PRIM_PTR_INT__g_s_m_s += 825;
227                             PRIM_PTR_INT__g_s_n_s += 990;
228                             PRIM_PTR_INT__g_s_o_s += 1170;
229                             PRIM_PTR_INT__g_s_q_s += 1365;
230                         }
231                         iprimcd++;
232                         for(n = 1; n < SIMINT_SIMD_LEN; ++n)
233                         {
234                             if(iprimcd >= nprim_icd && ((icd+1) < nshellbatch))
235                             {
236                                 shelloffsets[n] = shelloffsets[n-1] + 1;
237                                 lastoffset++;
238                                 nprim_icd += Q.nprim12[cd + (++icd)];
239                             }
240                             else
241                                 shelloffsets[n] = shelloffsets[n-1];
242                             iprimcd++;
243                         }
244                     }
245                     else
246                         iprimcd += SIMINT_SIMD_LEN;
247 
248                     // Do we have to compute this vector (or has it been screened out)?
249                     // (not_screened != 0 means we have to do this vector)
250                     if(check_screen)
251                     {
252                         const double vmax = vector_max(SIMINT_MUL(bra_screen_max, SIMINT_DBLLOAD(Q.screen, j)));
253                         if(vmax < screen_tol)
254                         {
255                             PRIM_PTR_INT__f_s_i_s += lastoffset*280;
256                             PRIM_PTR_INT__f_s_k_s += lastoffset*360;
257                             PRIM_PTR_INT__f_s_l_s += lastoffset*450;
258                             PRIM_PTR_INT__f_s_m_s += lastoffset*550;
259                             PRIM_PTR_INT__f_s_n_s += lastoffset*660;
260                             PRIM_PTR_INT__f_s_o_s += lastoffset*780;
261                             PRIM_PTR_INT__f_s_q_s += lastoffset*910;
262                             PRIM_PTR_INT__g_s_i_s += lastoffset*420;
263                             PRIM_PTR_INT__g_s_k_s += lastoffset*540;
264                             PRIM_PTR_INT__g_s_l_s += lastoffset*675;
265                             PRIM_PTR_INT__g_s_m_s += lastoffset*825;
266                             PRIM_PTR_INT__g_s_n_s += lastoffset*990;
267                             PRIM_PTR_INT__g_s_o_s += lastoffset*1170;
268                             PRIM_PTR_INT__g_s_q_s += lastoffset*1365;
269                             continue;
270                         }
271                     }
272 
273                     const SIMINT_DBLTYPE Q_alpha = SIMINT_DBLLOAD(Q.alpha, j);
274                     const SIMINT_DBLTYPE PQalpha_mul = SIMINT_MUL(P_alpha, Q_alpha);
275                     const SIMINT_DBLTYPE PQalpha_sum = SIMINT_ADD(P_alpha, Q_alpha);
276                     const SIMINT_DBLTYPE one_over_PQalpha_sum = SIMINT_DIV(const_1, PQalpha_sum);
277 
278 
279                     /* construct R2 = (Px - Qx)**2 + (Py - Qy)**2 + (Pz -Qz)**2 */
280                     SIMINT_DBLTYPE PQ[3];
281                     PQ[0] = SIMINT_SUB(Pxyz[0], SIMINT_DBLLOAD(Q.x, j));
282                     PQ[1] = SIMINT_SUB(Pxyz[1], SIMINT_DBLLOAD(Q.y, j));
283                     PQ[2] = SIMINT_SUB(Pxyz[2], SIMINT_DBLLOAD(Q.z, j));
284                     SIMINT_DBLTYPE R2 = SIMINT_MUL(PQ[0], PQ[0]);
285                     R2 = SIMINT_FMADD(PQ[1], PQ[1], R2);
286                     R2 = SIMINT_FMADD(PQ[2], PQ[2], R2);
287 
288                     const SIMINT_DBLTYPE alpha = SIMINT_MUL(PQalpha_mul, one_over_PQalpha_sum); // alpha from MEST
289                     const SIMINT_DBLTYPE one_over_p = SIMINT_DIV(const_1, P_alpha);
290                     const SIMINT_DBLTYPE one_over_q = SIMINT_DIV(const_1, Q_alpha);
291                     const SIMINT_DBLTYPE one_over_2p = SIMINT_MUL(one_half, one_over_p);
292                     const SIMINT_DBLTYPE one_over_2q = SIMINT_MUL(one_half, one_over_q);
293                     const SIMINT_DBLTYPE one_over_2pq = SIMINT_MUL(one_half, one_over_PQalpha_sum);
294                     const SIMINT_DBLTYPE Q_PA[3] = { SIMINT_DBLLOAD(Q.PA_x, j), SIMINT_DBLLOAD(Q.PA_y, j), SIMINT_DBLLOAD(Q.PA_z, j) };
295 
296                     // NOTE: Minus sign!
297                     const SIMINT_DBLTYPE a_over_p = SIMINT_MUL(SIMINT_NEG(alpha), one_over_p);
298                     SIMINT_DBLTYPE aop_PQ[3];
299                     aop_PQ[0] = SIMINT_MUL(a_over_p, PQ[0]);
300                     aop_PQ[1] = SIMINT_MUL(a_over_p, PQ[1]);
301                     aop_PQ[2] = SIMINT_MUL(a_over_p, PQ[2]);
302 
303                     SIMINT_DBLTYPE a_over_q = SIMINT_MUL(alpha, one_over_q);
304                     SIMINT_DBLTYPE aoq_PQ[3];
305                     aoq_PQ[0] = SIMINT_MUL(a_over_q, PQ[0]);
306                     aoq_PQ[1] = SIMINT_MUL(a_over_q, PQ[1]);
307                     aoq_PQ[2] = SIMINT_MUL(a_over_q, PQ[2]);
308                     // Put a minus sign here so we don't have to in RR routines
309                     a_over_q = SIMINT_NEG(a_over_q);
310 
311 
312                     //////////////////////////////////////////////
313                     // Fjt function section
314                     // Maximum v value: 16
315                     //////////////////////////////////////////////
316                     // The parameter to the Fjt function
317                     const SIMINT_DBLTYPE F_x = SIMINT_MUL(R2, alpha);
318 
319 
320                     const SIMINT_DBLTYPE Q_prefac = mask_load(nlane, Q.prefac + j);
321 
322 
323                     boys_F_split(PRIM_INT__s_s_s_s, F_x, 16);
324                     SIMINT_DBLTYPE prefac = SIMINT_SQRT(one_over_PQalpha_sum);
325                     prefac = SIMINT_MUL(SIMINT_MUL(P_prefac, Q_prefac), prefac);
326                     for(n = 0; n <= 16; n++)
327                         PRIM_INT__s_s_s_s[n] = SIMINT_MUL(PRIM_INT__s_s_s_s[n], prefac);
328 
329                     //////////////////////////////////////////////
330                     // Primitive integrals: Vertical recurrance
331                     //////////////////////////////////////////////
332 
333                     const SIMINT_DBLTYPE vrr_const_1_over_2p = one_over_2p;
334                     const SIMINT_DBLTYPE vrr_const_2_over_2p = SIMINT_MUL(const_2, one_over_2p);
335                     const SIMINT_DBLTYPE vrr_const_3_over_2p = SIMINT_MUL(const_3, one_over_2p);
336                     const SIMINT_DBLTYPE vrr_const_1_over_2q = one_over_2q;
337                     const SIMINT_DBLTYPE vrr_const_2_over_2q = SIMINT_MUL(const_2, one_over_2q);
338                     const SIMINT_DBLTYPE vrr_const_3_over_2q = SIMINT_MUL(const_3, one_over_2q);
339                     const SIMINT_DBLTYPE vrr_const_4_over_2q = SIMINT_MUL(const_4, one_over_2q);
340                     const SIMINT_DBLTYPE vrr_const_5_over_2q = SIMINT_MUL(const_5, one_over_2q);
341                     const SIMINT_DBLTYPE vrr_const_6_over_2q = SIMINT_MUL(const_6, one_over_2q);
342                     const SIMINT_DBLTYPE vrr_const_7_over_2q = SIMINT_MUL(const_7, one_over_2q);
343                     const SIMINT_DBLTYPE vrr_const_8_over_2q = SIMINT_MUL(const_8, one_over_2q);
344                     const SIMINT_DBLTYPE vrr_const_9_over_2q = SIMINT_MUL(const_9, one_over_2q);
345                     const SIMINT_DBLTYPE vrr_const_10_over_2q = SIMINT_MUL(const_10, one_over_2q);
346                     const SIMINT_DBLTYPE vrr_const_11_over_2q = SIMINT_MUL(const_11, one_over_2q);
347                     const SIMINT_DBLTYPE vrr_const_1_over_2pq = one_over_2pq;
348                     const SIMINT_DBLTYPE vrr_const_2_over_2pq = SIMINT_MUL(const_2, one_over_2pq);
349                     const SIMINT_DBLTYPE vrr_const_3_over_2pq = SIMINT_MUL(const_3, one_over_2pq);
350                     const SIMINT_DBLTYPE vrr_const_4_over_2pq = SIMINT_MUL(const_4, one_over_2pq);
351                     const SIMINT_DBLTYPE vrr_const_5_over_2pq = SIMINT_MUL(const_5, one_over_2pq);
352                     const SIMINT_DBLTYPE vrr_const_6_over_2pq = SIMINT_MUL(const_6, one_over_2pq);
353                     const SIMINT_DBLTYPE vrr_const_7_over_2pq = SIMINT_MUL(const_7, one_over_2pq);
354                     const SIMINT_DBLTYPE vrr_const_8_over_2pq = SIMINT_MUL(const_8, one_over_2pq);
355                     const SIMINT_DBLTYPE vrr_const_9_over_2pq = SIMINT_MUL(const_9, one_over_2pq);
356                     const SIMINT_DBLTYPE vrr_const_10_over_2pq = SIMINT_MUL(const_10, one_over_2pq);
357                     const SIMINT_DBLTYPE vrr_const_11_over_2pq = SIMINT_MUL(const_11, one_over_2pq);
358                     const SIMINT_DBLTYPE vrr_const_12_over_2pq = SIMINT_MUL(const_12, one_over_2pq);
359 
360 
361 
362                     // Forming PRIM_INT__s_s_p_s[16 * 3];
363                     for(n = 0; n < 16; ++n)  // loop over orders of auxiliary function
364                     {
365 
366                         PRIM_INT__s_s_p_s[n * 3 + 0] = SIMINT_MUL(Q_PA[0], PRIM_INT__s_s_s_s[n * 1 + 0]);
367                         PRIM_INT__s_s_p_s[n * 3 + 0] = SIMINT_FMADD( aoq_PQ[0], PRIM_INT__s_s_s_s[(n+1) * 1 + 0], PRIM_INT__s_s_p_s[n * 3 + 0]);
368 
369                         PRIM_INT__s_s_p_s[n * 3 + 1] = SIMINT_MUL(Q_PA[1], PRIM_INT__s_s_s_s[n * 1 + 0]);
370                         PRIM_INT__s_s_p_s[n * 3 + 1] = SIMINT_FMADD( aoq_PQ[1], PRIM_INT__s_s_s_s[(n+1) * 1 + 0], PRIM_INT__s_s_p_s[n * 3 + 1]);
371 
372                         PRIM_INT__s_s_p_s[n * 3 + 2] = SIMINT_MUL(Q_PA[2], PRIM_INT__s_s_s_s[n * 1 + 0]);
373                         PRIM_INT__s_s_p_s[n * 3 + 2] = SIMINT_FMADD( aoq_PQ[2], PRIM_INT__s_s_s_s[(n+1) * 1 + 0], PRIM_INT__s_s_p_s[n * 3 + 2]);
374 
375                     }
376 
377 
378 
379                     // Forming PRIM_INT__s_s_d_s[15 * 6];
380                     for(n = 0; n < 15; ++n)  // loop over orders of auxiliary function
381                     {
382 
383                         PRIM_INT__s_s_d_s[n * 6 + 0] = SIMINT_MUL(Q_PA[0], PRIM_INT__s_s_p_s[n * 3 + 0]);
384                         PRIM_INT__s_s_d_s[n * 6 + 0] = SIMINT_FMADD( aoq_PQ[0], PRIM_INT__s_s_p_s[(n+1) * 3 + 0], PRIM_INT__s_s_d_s[n * 6 + 0]);
385                         PRIM_INT__s_s_d_s[n * 6 + 0] = SIMINT_FMADD( vrr_const_1_over_2q, SIMINT_FMADD(a_over_q, PRIM_INT__s_s_s_s[(n+1) * 1 + 0], PRIM_INT__s_s_s_s[n * 1 + 0]), PRIM_INT__s_s_d_s[n * 6 + 0]);
386 
387                         PRIM_INT__s_s_d_s[n * 6 + 1] = SIMINT_MUL(Q_PA[1], PRIM_INT__s_s_p_s[n * 3 + 0]);
388                         PRIM_INT__s_s_d_s[n * 6 + 1] = SIMINT_FMADD( aoq_PQ[1], PRIM_INT__s_s_p_s[(n+1) * 3 + 0], PRIM_INT__s_s_d_s[n * 6 + 1]);
389 
390                         PRIM_INT__s_s_d_s[n * 6 + 2] = SIMINT_MUL(Q_PA[2], PRIM_INT__s_s_p_s[n * 3 + 0]);
391                         PRIM_INT__s_s_d_s[n * 6 + 2] = SIMINT_FMADD( aoq_PQ[2], PRIM_INT__s_s_p_s[(n+1) * 3 + 0], PRIM_INT__s_s_d_s[n * 6 + 2]);
392 
393                         PRIM_INT__s_s_d_s[n * 6 + 3] = SIMINT_MUL(Q_PA[1], PRIM_INT__s_s_p_s[n * 3 + 1]);
394                         PRIM_INT__s_s_d_s[n * 6 + 3] = SIMINT_FMADD( aoq_PQ[1], PRIM_INT__s_s_p_s[(n+1) * 3 + 1], PRIM_INT__s_s_d_s[n * 6 + 3]);
395                         PRIM_INT__s_s_d_s[n * 6 + 3] = SIMINT_FMADD( vrr_const_1_over_2q, SIMINT_FMADD(a_over_q, PRIM_INT__s_s_s_s[(n+1) * 1 + 0], PRIM_INT__s_s_s_s[n * 1 + 0]), PRIM_INT__s_s_d_s[n * 6 + 3]);
396 
397                         PRIM_INT__s_s_d_s[n * 6 + 4] = SIMINT_MUL(Q_PA[2], PRIM_INT__s_s_p_s[n * 3 + 1]);
398                         PRIM_INT__s_s_d_s[n * 6 + 4] = SIMINT_FMADD( aoq_PQ[2], PRIM_INT__s_s_p_s[(n+1) * 3 + 1], PRIM_INT__s_s_d_s[n * 6 + 4]);
399 
400                         PRIM_INT__s_s_d_s[n * 6 + 5] = SIMINT_MUL(Q_PA[2], PRIM_INT__s_s_p_s[n * 3 + 2]);
401                         PRIM_INT__s_s_d_s[n * 6 + 5] = SIMINT_FMADD( aoq_PQ[2], PRIM_INT__s_s_p_s[(n+1) * 3 + 2], PRIM_INT__s_s_d_s[n * 6 + 5]);
402                         PRIM_INT__s_s_d_s[n * 6 + 5] = SIMINT_FMADD( vrr_const_1_over_2q, SIMINT_FMADD(a_over_q, PRIM_INT__s_s_s_s[(n+1) * 1 + 0], PRIM_INT__s_s_s_s[n * 1 + 0]), PRIM_INT__s_s_d_s[n * 6 + 5]);
403 
404                     }
405 
406 
407 
408                     // Forming PRIM_INT__s_s_f_s[14 * 10];
409                     for(n = 0; n < 14; ++n)  // loop over orders of auxiliary function
410                     {
411 
412                         PRIM_INT__s_s_f_s[n * 10 + 0] = SIMINT_MUL(Q_PA[0], PRIM_INT__s_s_d_s[n * 6 + 0]);
413                         PRIM_INT__s_s_f_s[n * 10 + 0] = SIMINT_FMADD( aoq_PQ[0], PRIM_INT__s_s_d_s[(n+1) * 6 + 0], PRIM_INT__s_s_f_s[n * 10 + 0]);
414                         PRIM_INT__s_s_f_s[n * 10 + 0] = SIMINT_FMADD( vrr_const_2_over_2q, SIMINT_FMADD(a_over_q, PRIM_INT__s_s_p_s[(n+1) * 3 + 0], PRIM_INT__s_s_p_s[n * 3 + 0]), PRIM_INT__s_s_f_s[n * 10 + 0]);
415 
416                         PRIM_INT__s_s_f_s[n * 10 + 1] = SIMINT_MUL(Q_PA[1], PRIM_INT__s_s_d_s[n * 6 + 0]);
417                         PRIM_INT__s_s_f_s[n * 10 + 1] = SIMINT_FMADD( aoq_PQ[1], PRIM_INT__s_s_d_s[(n+1) * 6 + 0], PRIM_INT__s_s_f_s[n * 10 + 1]);
418 
419                         PRIM_INT__s_s_f_s[n * 10 + 2] = SIMINT_MUL(Q_PA[2], PRIM_INT__s_s_d_s[n * 6 + 0]);
420                         PRIM_INT__s_s_f_s[n * 10 + 2] = SIMINT_FMADD( aoq_PQ[2], PRIM_INT__s_s_d_s[(n+1) * 6 + 0], PRIM_INT__s_s_f_s[n * 10 + 2]);
421 
422                         PRIM_INT__s_s_f_s[n * 10 + 3] = SIMINT_MUL(Q_PA[0], PRIM_INT__s_s_d_s[n * 6 + 3]);
423                         PRIM_INT__s_s_f_s[n * 10 + 3] = SIMINT_FMADD( aoq_PQ[0], PRIM_INT__s_s_d_s[(n+1) * 6 + 3], PRIM_INT__s_s_f_s[n * 10 + 3]);
424 
425                         PRIM_INT__s_s_f_s[n * 10 + 4] = SIMINT_MUL(Q_PA[2], PRIM_INT__s_s_d_s[n * 6 + 1]);
426                         PRIM_INT__s_s_f_s[n * 10 + 4] = SIMINT_FMADD( aoq_PQ[2], PRIM_INT__s_s_d_s[(n+1) * 6 + 1], PRIM_INT__s_s_f_s[n * 10 + 4]);
427 
428                         PRIM_INT__s_s_f_s[n * 10 + 5] = SIMINT_MUL(Q_PA[0], PRIM_INT__s_s_d_s[n * 6 + 5]);
429                         PRIM_INT__s_s_f_s[n * 10 + 5] = SIMINT_FMADD( aoq_PQ[0], PRIM_INT__s_s_d_s[(n+1) * 6 + 5], PRIM_INT__s_s_f_s[n * 10 + 5]);
430 
431                         PRIM_INT__s_s_f_s[n * 10 + 6] = SIMINT_MUL(Q_PA[1], PRIM_INT__s_s_d_s[n * 6 + 3]);
432                         PRIM_INT__s_s_f_s[n * 10 + 6] = SIMINT_FMADD( aoq_PQ[1], PRIM_INT__s_s_d_s[(n+1) * 6 + 3], PRIM_INT__s_s_f_s[n * 10 + 6]);
433                         PRIM_INT__s_s_f_s[n * 10 + 6] = SIMINT_FMADD( vrr_const_2_over_2q, SIMINT_FMADD(a_over_q, PRIM_INT__s_s_p_s[(n+1) * 3 + 1], PRIM_INT__s_s_p_s[n * 3 + 1]), PRIM_INT__s_s_f_s[n * 10 + 6]);
434 
435                         PRIM_INT__s_s_f_s[n * 10 + 7] = SIMINT_MUL(Q_PA[2], PRIM_INT__s_s_d_s[n * 6 + 3]);
436                         PRIM_INT__s_s_f_s[n * 10 + 7] = SIMINT_FMADD( aoq_PQ[2], PRIM_INT__s_s_d_s[(n+1) * 6 + 3], PRIM_INT__s_s_f_s[n * 10 + 7]);
437 
438                         PRIM_INT__s_s_f_s[n * 10 + 8] = SIMINT_MUL(Q_PA[1], PRIM_INT__s_s_d_s[n * 6 + 5]);
439                         PRIM_INT__s_s_f_s[n * 10 + 8] = SIMINT_FMADD( aoq_PQ[1], PRIM_INT__s_s_d_s[(n+1) * 6 + 5], PRIM_INT__s_s_f_s[n * 10 + 8]);
440 
441                         PRIM_INT__s_s_f_s[n * 10 + 9] = SIMINT_MUL(Q_PA[2], PRIM_INT__s_s_d_s[n * 6 + 5]);
442                         PRIM_INT__s_s_f_s[n * 10 + 9] = SIMINT_FMADD( aoq_PQ[2], PRIM_INT__s_s_d_s[(n+1) * 6 + 5], PRIM_INT__s_s_f_s[n * 10 + 9]);
443                         PRIM_INT__s_s_f_s[n * 10 + 9] = SIMINT_FMADD( vrr_const_2_over_2q, SIMINT_FMADD(a_over_q, PRIM_INT__s_s_p_s[(n+1) * 3 + 2], PRIM_INT__s_s_p_s[n * 3 + 2]), PRIM_INT__s_s_f_s[n * 10 + 9]);
444 
445                     }
446 
447 
448                     VRR_K_s_s_g_s(
449                             PRIM_INT__s_s_g_s,
450                             PRIM_INT__s_s_f_s,
451                             PRIM_INT__s_s_d_s,
452                             Q_PA,
453                             a_over_q,
454                             aoq_PQ,
455                             one_over_2q,
456                             13);
457 
458 
459                     VRR_K_s_s_h_s(
460                             PRIM_INT__s_s_h_s,
461                             PRIM_INT__s_s_g_s,
462                             PRIM_INT__s_s_f_s,
463                             Q_PA,
464                             a_over_q,
465                             aoq_PQ,
466                             one_over_2q,
467                             12);
468 
469 
470                     ostei_general_vrr1_K(6, 11,
471                             one_over_2q, a_over_q, aoq_PQ, Q_PA,
472                             PRIM_INT__s_s_h_s, PRIM_INT__s_s_g_s, PRIM_INT__s_s_i_s);
473 
474 
475                     ostei_general_vrr_I(1, 0, 6, 0, 4,
476                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
477                             PRIM_INT__s_s_i_s, NULL, NULL, PRIM_INT__s_s_h_s, NULL, PRIM_INT__p_s_i_s);
478 
479 
480                     ostei_general_vrr_I(1, 0, 5, 0, 4,
481                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
482                             PRIM_INT__s_s_h_s, NULL, NULL, PRIM_INT__s_s_g_s, NULL, PRIM_INT__p_s_h_s);
483 
484 
485                     ostei_general_vrr_I(2, 0, 6, 0, 3,
486                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
487                             PRIM_INT__p_s_i_s, PRIM_INT__s_s_i_s, NULL, PRIM_INT__p_s_h_s, NULL, PRIM_INT__d_s_i_s);
488 
489 
490                     VRR_I_p_s_g_s(
491                             PRIM_INT__p_s_g_s,
492                             PRIM_INT__s_s_g_s,
493                             PRIM_INT__s_s_f_s,
494                             P_PA,
495                             aop_PQ,
496                             one_over_2pq,
497                             4);
498 
499 
500                     ostei_general_vrr_I(2, 0, 5, 0, 3,
501                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
502                             PRIM_INT__p_s_h_s, PRIM_INT__s_s_h_s, NULL, PRIM_INT__p_s_g_s, NULL, PRIM_INT__d_s_h_s);
503 
504 
505                     ostei_general_vrr_I(3, 0, 6, 0, 2,
506                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
507                             PRIM_INT__d_s_i_s, PRIM_INT__p_s_i_s, NULL, PRIM_INT__d_s_h_s, NULL, PRIM_INT__f_s_i_s);
508 
509 
510                     ostei_general_vrr1_K(7, 10,
511                             one_over_2q, a_over_q, aoq_PQ, Q_PA,
512                             PRIM_INT__s_s_i_s, PRIM_INT__s_s_h_s, PRIM_INT__s_s_k_s);
513 
514 
515                     ostei_general_vrr_I(1, 0, 7, 0, 4,
516                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
517                             PRIM_INT__s_s_k_s, NULL, NULL, PRIM_INT__s_s_i_s, NULL, PRIM_INT__p_s_k_s);
518 
519 
520                     ostei_general_vrr_I(2, 0, 7, 0, 3,
521                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
522                             PRIM_INT__p_s_k_s, PRIM_INT__s_s_k_s, NULL, PRIM_INT__p_s_i_s, NULL, PRIM_INT__d_s_k_s);
523 
524 
525                     ostei_general_vrr_I(3, 0, 7, 0, 2,
526                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
527                             PRIM_INT__d_s_k_s, PRIM_INT__p_s_k_s, NULL, PRIM_INT__d_s_i_s, NULL, PRIM_INT__f_s_k_s);
528 
529 
530                     VRR_I_p_s_f_s(
531                             PRIM_INT__p_s_f_s,
532                             PRIM_INT__s_s_f_s,
533                             PRIM_INT__s_s_d_s,
534                             P_PA,
535                             aop_PQ,
536                             one_over_2pq,
537                             4);
538 
539 
540                     ostei_general_vrr_I(2, 0, 4, 0, 3,
541                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
542                             PRIM_INT__p_s_g_s, PRIM_INT__s_s_g_s, NULL, PRIM_INT__p_s_f_s, NULL, PRIM_INT__d_s_g_s);
543 
544 
545                     ostei_general_vrr_I(3, 0, 5, 0, 2,
546                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
547                             PRIM_INT__d_s_h_s, PRIM_INT__p_s_h_s, NULL, PRIM_INT__d_s_g_s, NULL, PRIM_INT__f_s_h_s);
548 
549 
550                     ostei_general_vrr_I(4, 0, 6, 0, 1,
551                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
552                             PRIM_INT__f_s_i_s, PRIM_INT__d_s_i_s, NULL, PRIM_INT__f_s_h_s, NULL, PRIM_INT__g_s_i_s);
553 
554 
555                     ostei_general_vrr1_K(8, 9,
556                             one_over_2q, a_over_q, aoq_PQ, Q_PA,
557                             PRIM_INT__s_s_k_s, PRIM_INT__s_s_i_s, PRIM_INT__s_s_l_s);
558 
559 
560                     ostei_general_vrr_I(1, 0, 8, 0, 4,
561                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
562                             PRIM_INT__s_s_l_s, NULL, NULL, PRIM_INT__s_s_k_s, NULL, PRIM_INT__p_s_l_s);
563 
564 
565                     ostei_general_vrr_I(2, 0, 8, 0, 3,
566                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
567                             PRIM_INT__p_s_l_s, PRIM_INT__s_s_l_s, NULL, PRIM_INT__p_s_k_s, NULL, PRIM_INT__d_s_l_s);
568 
569 
570                     ostei_general_vrr_I(3, 0, 8, 0, 2,
571                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
572                             PRIM_INT__d_s_l_s, PRIM_INT__p_s_l_s, NULL, PRIM_INT__d_s_k_s, NULL, PRIM_INT__f_s_l_s);
573 
574 
575                     ostei_general_vrr_I(4, 0, 7, 0, 1,
576                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
577                             PRIM_INT__f_s_k_s, PRIM_INT__d_s_k_s, NULL, PRIM_INT__f_s_i_s, NULL, PRIM_INT__g_s_k_s);
578 
579 
580                     ostei_general_vrr1_K(9, 8,
581                             one_over_2q, a_over_q, aoq_PQ, Q_PA,
582                             PRIM_INT__s_s_l_s, PRIM_INT__s_s_k_s, PRIM_INT__s_s_m_s);
583 
584 
585                     ostei_general_vrr_I(1, 0, 9, 0, 4,
586                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
587                             PRIM_INT__s_s_m_s, NULL, NULL, PRIM_INT__s_s_l_s, NULL, PRIM_INT__p_s_m_s);
588 
589 
590                     ostei_general_vrr_I(2, 0, 9, 0, 3,
591                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
592                             PRIM_INT__p_s_m_s, PRIM_INT__s_s_m_s, NULL, PRIM_INT__p_s_l_s, NULL, PRIM_INT__d_s_m_s);
593 
594 
595                     ostei_general_vrr_I(3, 0, 9, 0, 2,
596                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
597                             PRIM_INT__d_s_m_s, PRIM_INT__p_s_m_s, NULL, PRIM_INT__d_s_l_s, NULL, PRIM_INT__f_s_m_s);
598 
599 
600                     ostei_general_vrr_I(4, 0, 8, 0, 1,
601                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
602                             PRIM_INT__f_s_l_s, PRIM_INT__d_s_l_s, NULL, PRIM_INT__f_s_k_s, NULL, PRIM_INT__g_s_l_s);
603 
604 
605                     ostei_general_vrr1_K(10, 7,
606                             one_over_2q, a_over_q, aoq_PQ, Q_PA,
607                             PRIM_INT__s_s_m_s, PRIM_INT__s_s_l_s, PRIM_INT__s_s_n_s);
608 
609 
610                     ostei_general_vrr_I(1, 0, 10, 0, 4,
611                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
612                             PRIM_INT__s_s_n_s, NULL, NULL, PRIM_INT__s_s_m_s, NULL, PRIM_INT__p_s_n_s);
613 
614 
615                     ostei_general_vrr_I(2, 0, 10, 0, 3,
616                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
617                             PRIM_INT__p_s_n_s, PRIM_INT__s_s_n_s, NULL, PRIM_INT__p_s_m_s, NULL, PRIM_INT__d_s_n_s);
618 
619 
620                     ostei_general_vrr_I(3, 0, 10, 0, 2,
621                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
622                             PRIM_INT__d_s_n_s, PRIM_INT__p_s_n_s, NULL, PRIM_INT__d_s_m_s, NULL, PRIM_INT__f_s_n_s);
623 
624 
625                     ostei_general_vrr_I(4, 0, 9, 0, 1,
626                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
627                             PRIM_INT__f_s_m_s, PRIM_INT__d_s_m_s, NULL, PRIM_INT__f_s_l_s, NULL, PRIM_INT__g_s_m_s);
628 
629 
630                     ostei_general_vrr1_K(11, 6,
631                             one_over_2q, a_over_q, aoq_PQ, Q_PA,
632                             PRIM_INT__s_s_n_s, PRIM_INT__s_s_m_s, PRIM_INT__s_s_o_s);
633 
634 
635                     ostei_general_vrr_I(1, 0, 11, 0, 4,
636                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
637                             PRIM_INT__s_s_o_s, NULL, NULL, PRIM_INT__s_s_n_s, NULL, PRIM_INT__p_s_o_s);
638 
639 
640                     ostei_general_vrr_I(2, 0, 11, 0, 3,
641                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
642                             PRIM_INT__p_s_o_s, PRIM_INT__s_s_o_s, NULL, PRIM_INT__p_s_n_s, NULL, PRIM_INT__d_s_o_s);
643 
644 
645                     ostei_general_vrr_I(3, 0, 11, 0, 2,
646                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
647                             PRIM_INT__d_s_o_s, PRIM_INT__p_s_o_s, NULL, PRIM_INT__d_s_n_s, NULL, PRIM_INT__f_s_o_s);
648 
649 
650                     ostei_general_vrr_I(4, 0, 10, 0, 1,
651                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
652                             PRIM_INT__f_s_n_s, PRIM_INT__d_s_n_s, NULL, PRIM_INT__f_s_m_s, NULL, PRIM_INT__g_s_n_s);
653 
654 
655                     ostei_general_vrr1_K(12, 5,
656                             one_over_2q, a_over_q, aoq_PQ, Q_PA,
657                             PRIM_INT__s_s_o_s, PRIM_INT__s_s_n_s, PRIM_INT__s_s_q_s);
658 
659 
660                     ostei_general_vrr_I(1, 0, 12, 0, 4,
661                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
662                             PRIM_INT__s_s_q_s, NULL, NULL, PRIM_INT__s_s_o_s, NULL, PRIM_INT__p_s_q_s);
663 
664 
665                     ostei_general_vrr_I(2, 0, 12, 0, 3,
666                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
667                             PRIM_INT__p_s_q_s, PRIM_INT__s_s_q_s, NULL, PRIM_INT__p_s_o_s, NULL, PRIM_INT__d_s_q_s);
668 
669 
670                     ostei_general_vrr_I(3, 0, 12, 0, 2,
671                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
672                             PRIM_INT__d_s_q_s, PRIM_INT__p_s_q_s, NULL, PRIM_INT__d_s_o_s, NULL, PRIM_INT__f_s_q_s);
673 
674 
675                     ostei_general_vrr_I(4, 0, 11, 0, 1,
676                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
677                             PRIM_INT__f_s_o_s, PRIM_INT__d_s_o_s, NULL, PRIM_INT__f_s_n_s, NULL, PRIM_INT__g_s_o_s);
678 
679 
680                     ostei_general_vrr_I(4, 0, 12, 0, 1,
681                             one_over_2p, a_over_p, one_over_2pq, aop_PQ, P_PA,
682                             PRIM_INT__f_s_q_s, PRIM_INT__d_s_q_s, NULL, PRIM_INT__f_s_o_s, NULL, PRIM_INT__g_s_q_s);
683 
684 
685 
686 
687                     ////////////////////////////////////
688                     // Accumulate contracted integrals
689                     ////////////////////////////////////
690                     if(lastoffset == 0)
691                     {
692                         contract_all(280, PRIM_INT__f_s_i_s, PRIM_PTR_INT__f_s_i_s);
693                         contract_all(360, PRIM_INT__f_s_k_s, PRIM_PTR_INT__f_s_k_s);
694                         contract_all(450, PRIM_INT__f_s_l_s, PRIM_PTR_INT__f_s_l_s);
695                         contract_all(550, PRIM_INT__f_s_m_s, PRIM_PTR_INT__f_s_m_s);
696                         contract_all(660, PRIM_INT__f_s_n_s, PRIM_PTR_INT__f_s_n_s);
697                         contract_all(780, PRIM_INT__f_s_o_s, PRIM_PTR_INT__f_s_o_s);
698                         contract_all(910, PRIM_INT__f_s_q_s, PRIM_PTR_INT__f_s_q_s);
699                         contract_all(420, PRIM_INT__g_s_i_s, PRIM_PTR_INT__g_s_i_s);
700                         contract_all(540, PRIM_INT__g_s_k_s, PRIM_PTR_INT__g_s_k_s);
701                         contract_all(675, PRIM_INT__g_s_l_s, PRIM_PTR_INT__g_s_l_s);
702                         contract_all(825, PRIM_INT__g_s_m_s, PRIM_PTR_INT__g_s_m_s);
703                         contract_all(990, PRIM_INT__g_s_n_s, PRIM_PTR_INT__g_s_n_s);
704                         contract_all(1170, PRIM_INT__g_s_o_s, PRIM_PTR_INT__g_s_o_s);
705                         contract_all(1365, PRIM_INT__g_s_q_s, PRIM_PTR_INT__g_s_q_s);
706                     }
707                     else
708                     {
709                         contract(280, shelloffsets, PRIM_INT__f_s_i_s, PRIM_PTR_INT__f_s_i_s);
710                         contract(360, shelloffsets, PRIM_INT__f_s_k_s, PRIM_PTR_INT__f_s_k_s);
711                         contract(450, shelloffsets, PRIM_INT__f_s_l_s, PRIM_PTR_INT__f_s_l_s);
712                         contract(550, shelloffsets, PRIM_INT__f_s_m_s, PRIM_PTR_INT__f_s_m_s);
713                         contract(660, shelloffsets, PRIM_INT__f_s_n_s, PRIM_PTR_INT__f_s_n_s);
714                         contract(780, shelloffsets, PRIM_INT__f_s_o_s, PRIM_PTR_INT__f_s_o_s);
715                         contract(910, shelloffsets, PRIM_INT__f_s_q_s, PRIM_PTR_INT__f_s_q_s);
716                         contract(420, shelloffsets, PRIM_INT__g_s_i_s, PRIM_PTR_INT__g_s_i_s);
717                         contract(540, shelloffsets, PRIM_INT__g_s_k_s, PRIM_PTR_INT__g_s_k_s);
718                         contract(675, shelloffsets, PRIM_INT__g_s_l_s, PRIM_PTR_INT__g_s_l_s);
719                         contract(825, shelloffsets, PRIM_INT__g_s_m_s, PRIM_PTR_INT__g_s_m_s);
720                         contract(990, shelloffsets, PRIM_INT__g_s_n_s, PRIM_PTR_INT__g_s_n_s);
721                         contract(1170, shelloffsets, PRIM_INT__g_s_o_s, PRIM_PTR_INT__g_s_o_s);
722                         contract(1365, shelloffsets, PRIM_INT__g_s_q_s, PRIM_PTR_INT__g_s_q_s);
723                         PRIM_PTR_INT__f_s_i_s += lastoffset*280;
724                         PRIM_PTR_INT__f_s_k_s += lastoffset*360;
725                         PRIM_PTR_INT__f_s_l_s += lastoffset*450;
726                         PRIM_PTR_INT__f_s_m_s += lastoffset*550;
727                         PRIM_PTR_INT__f_s_n_s += lastoffset*660;
728                         PRIM_PTR_INT__f_s_o_s += lastoffset*780;
729                         PRIM_PTR_INT__f_s_q_s += lastoffset*910;
730                         PRIM_PTR_INT__g_s_i_s += lastoffset*420;
731                         PRIM_PTR_INT__g_s_k_s += lastoffset*540;
732                         PRIM_PTR_INT__g_s_l_s += lastoffset*675;
733                         PRIM_PTR_INT__g_s_m_s += lastoffset*825;
734                         PRIM_PTR_INT__g_s_n_s += lastoffset*990;
735                         PRIM_PTR_INT__g_s_o_s += lastoffset*1170;
736                         PRIM_PTR_INT__g_s_q_s += lastoffset*1365;
737                     }
738 
739                 }  // close loop over j
740             }  // close loop over i
741 
742             //Advance to the next batch
743             jstart = SIMINT_SIMD_ROUND(jend);
744 
745             //////////////////////////////////////////////
746             // Contracted integrals: Horizontal recurrance
747             //////////////////////////////////////////////
748 
749 
750             const double hAB[3] = { P.AB_x[ab], P.AB_y[ab], P.AB_z[ab] };
751 
752 
753             for(abcd = 0; abcd < nshellbatch; ++abcd, ++real_abcd)
754             {
755                 const double hCD[3] = { Q.AB_x[cd+abcd], Q.AB_y[cd+abcd], Q.AB_z[cd+abcd] };
756 
757                 // set up HRR pointers
758                 double const * restrict HRR_INT__f_s_i_s = INT__f_s_i_s + abcd * 280;
759                 double const * restrict HRR_INT__f_s_k_s = INT__f_s_k_s + abcd * 360;
760                 double const * restrict HRR_INT__f_s_l_s = INT__f_s_l_s + abcd * 450;
761                 double const * restrict HRR_INT__f_s_m_s = INT__f_s_m_s + abcd * 550;
762                 double const * restrict HRR_INT__f_s_n_s = INT__f_s_n_s + abcd * 660;
763                 double const * restrict HRR_INT__f_s_o_s = INT__f_s_o_s + abcd * 780;
764                 double const * restrict HRR_INT__f_s_q_s = INT__f_s_q_s + abcd * 910;
765                 double const * restrict HRR_INT__g_s_i_s = INT__g_s_i_s + abcd * 420;
766                 double const * restrict HRR_INT__g_s_k_s = INT__g_s_k_s + abcd * 540;
767                 double const * restrict HRR_INT__g_s_l_s = INT__g_s_l_s + abcd * 675;
768                 double const * restrict HRR_INT__g_s_m_s = INT__g_s_m_s + abcd * 825;
769                 double const * restrict HRR_INT__g_s_n_s = INT__g_s_n_s + abcd * 990;
770                 double const * restrict HRR_INT__g_s_o_s = INT__g_s_o_s + abcd * 1170;
771                 double const * restrict HRR_INT__g_s_q_s = INT__g_s_q_s + abcd * 1365;
772                 double * restrict HRR_INT__f_p_i_i = INT__f_p_i_i + real_abcd * 23520;
773 
774                 // form INT__f_p_i_s
775                 HRR_J_f_p(
776                     HRR_INT__f_p_i_s,
777                     HRR_INT__f_s_i_s,
778                     HRR_INT__g_s_i_s,
779                     hAB, 28);
780 
781                 // form INT__f_p_k_s
782                 HRR_J_f_p(
783                     HRR_INT__f_p_k_s,
784                     HRR_INT__f_s_k_s,
785                     HRR_INT__g_s_k_s,
786                     hAB, 36);
787 
788                 // form INT__f_p_l_s
789                 HRR_J_f_p(
790                     HRR_INT__f_p_l_s,
791                     HRR_INT__f_s_l_s,
792                     HRR_INT__g_s_l_s,
793                     hAB, 45);
794 
795                 // form INT__f_p_m_s
796                 HRR_J_f_p(
797                     HRR_INT__f_p_m_s,
798                     HRR_INT__f_s_m_s,
799                     HRR_INT__g_s_m_s,
800                     hAB, 55);
801 
802                 // form INT__f_p_n_s
803                 HRR_J_f_p(
804                     HRR_INT__f_p_n_s,
805                     HRR_INT__f_s_n_s,
806                     HRR_INT__g_s_n_s,
807                     hAB, 66);
808 
809                 // form INT__f_p_o_s
810                 HRR_J_f_p(
811                     HRR_INT__f_p_o_s,
812                     HRR_INT__f_s_o_s,
813                     HRR_INT__g_s_o_s,
814                     hAB, 78);
815 
816                 // form INT__f_p_q_s
817                 HRR_J_f_p(
818                     HRR_INT__f_p_q_s,
819                     HRR_INT__f_s_q_s,
820                     HRR_INT__g_s_q_s,
821                     hAB, 91);
822 
823                 // form INT__f_p_i_p
824                 ostei_general_hrr_L(3, 1, 6, 1, hCD, HRR_INT__f_p_k_s, HRR_INT__f_p_i_s, HRR_INT__f_p_i_p);
825 
826                 // form INT__f_p_k_p
827                 ostei_general_hrr_L(3, 1, 7, 1, hCD, HRR_INT__f_p_l_s, HRR_INT__f_p_k_s, HRR_INT__f_p_k_p);
828 
829                 // form INT__f_p_l_p
830                 ostei_general_hrr_L(3, 1, 8, 1, hCD, HRR_INT__f_p_m_s, HRR_INT__f_p_l_s, HRR_INT__f_p_l_p);
831 
832                 // form INT__f_p_m_p
833                 ostei_general_hrr_L(3, 1, 9, 1, hCD, HRR_INT__f_p_n_s, HRR_INT__f_p_m_s, HRR_INT__f_p_m_p);
834 
835                 // form INT__f_p_n_p
836                 ostei_general_hrr_L(3, 1, 10, 1, hCD, HRR_INT__f_p_o_s, HRR_INT__f_p_n_s, HRR_INT__f_p_n_p);
837 
838                 // form INT__f_p_o_p
839                 ostei_general_hrr_L(3, 1, 11, 1, hCD, HRR_INT__f_p_q_s, HRR_INT__f_p_o_s, HRR_INT__f_p_o_p);
840 
841                 // form INT__f_p_i_d
842                 ostei_general_hrr_L(3, 1, 6, 2, hCD, HRR_INT__f_p_k_p, HRR_INT__f_p_i_p, HRR_INT__f_p_i_d);
843 
844                 // form INT__f_p_k_d
845                 ostei_general_hrr_L(3, 1, 7, 2, hCD, HRR_INT__f_p_l_p, HRR_INT__f_p_k_p, HRR_INT__f_p_k_d);
846 
847                 // form INT__f_p_l_d
848                 ostei_general_hrr_L(3, 1, 8, 2, hCD, HRR_INT__f_p_m_p, HRR_INT__f_p_l_p, HRR_INT__f_p_l_d);
849 
850                 // form INT__f_p_m_d
851                 ostei_general_hrr_L(3, 1, 9, 2, hCD, HRR_INT__f_p_n_p, HRR_INT__f_p_m_p, HRR_INT__f_p_m_d);
852 
853                 // form INT__f_p_n_d
854                 ostei_general_hrr_L(3, 1, 10, 2, hCD, HRR_INT__f_p_o_p, HRR_INT__f_p_n_p, HRR_INT__f_p_n_d);
855 
856                 // form INT__f_p_i_f
857                 ostei_general_hrr_L(3, 1, 6, 3, hCD, HRR_INT__f_p_k_d, HRR_INT__f_p_i_d, HRR_INT__f_p_i_f);
858 
859                 // form INT__f_p_k_f
860                 ostei_general_hrr_L(3, 1, 7, 3, hCD, HRR_INT__f_p_l_d, HRR_INT__f_p_k_d, HRR_INT__f_p_k_f);
861 
862                 // form INT__f_p_l_f
863                 ostei_general_hrr_L(3, 1, 8, 3, hCD, HRR_INT__f_p_m_d, HRR_INT__f_p_l_d, HRR_INT__f_p_l_f);
864 
865                 // form INT__f_p_m_f
866                 ostei_general_hrr_L(3, 1, 9, 3, hCD, HRR_INT__f_p_n_d, HRR_INT__f_p_m_d, HRR_INT__f_p_m_f);
867 
868                 // form INT__f_p_i_g
869                 ostei_general_hrr_L(3, 1, 6, 4, hCD, HRR_INT__f_p_k_f, HRR_INT__f_p_i_f, HRR_INT__f_p_i_g);
870 
871                 // form INT__f_p_k_g
872                 ostei_general_hrr_L(3, 1, 7, 4, hCD, HRR_INT__f_p_l_f, HRR_INT__f_p_k_f, HRR_INT__f_p_k_g);
873 
874                 // form INT__f_p_l_g
875                 ostei_general_hrr_L(3, 1, 8, 4, hCD, HRR_INT__f_p_m_f, HRR_INT__f_p_l_f, HRR_INT__f_p_l_g);
876 
877                 // form INT__f_p_i_h
878                 ostei_general_hrr_L(3, 1, 6, 5, hCD, HRR_INT__f_p_k_g, HRR_INT__f_p_i_g, HRR_INT__f_p_i_h);
879 
880                 // form INT__f_p_k_h
881                 ostei_general_hrr_L(3, 1, 7, 5, hCD, HRR_INT__f_p_l_g, HRR_INT__f_p_k_g, HRR_INT__f_p_k_h);
882 
883                 // form INT__f_p_i_i
884                 ostei_general_hrr_L(3, 1, 6, 6, hCD, HRR_INT__f_p_k_h, HRR_INT__f_p_i_h, HRR_INT__f_p_i_i);
885 
886 
887             }  // close HRR loop
888 
889 
890         }   // close loop cdbatch
891 
892         istart = iend;
893     }  // close loop over ab
894 
895     return P.nshell12_clip * Q.nshell12_clip;
896 }
897 
ostei_p_f_i_i(struct simint_multi_shellpair const P,struct simint_multi_shellpair const Q,double screen_tol,double * const restrict work,double * const restrict INT__p_f_i_i)898 int ostei_p_f_i_i(struct simint_multi_shellpair const P,
899                   struct simint_multi_shellpair const Q,
900                   double screen_tol,
901                   double * const restrict work,
902                   double * const restrict INT__p_f_i_i)
903 {
904     double P_AB[3*P.nshell12];
905     struct simint_multi_shellpair P_tmp = P;
906     P_tmp.PA_x = P.PB_x;  P_tmp.PA_y = P.PB_y;  P_tmp.PA_z = P.PB_z;
907     P_tmp.PB_x = P.PA_x;  P_tmp.PB_y = P.PA_y;  P_tmp.PB_z = P.PA_z;
908     P_tmp.AB_x = P_AB;
909     P_tmp.AB_y = P_AB + P.nshell12;
910     P_tmp.AB_z = P_AB + 2*P.nshell12;
911 
912     for(int i = 0; i < P.nshell12; i++)
913     {
914         P_tmp.AB_x[i] = -P.AB_x[i];
915         P_tmp.AB_y[i] = -P.AB_y[i];
916         P_tmp.AB_z[i] = -P.AB_z[i];
917     }
918 
919     int ret = ostei_f_p_i_i(P_tmp, Q, screen_tol, work, INT__p_f_i_i);
920     double buffer[23520] SIMINT_ALIGN_ARRAY_DBL;
921 
922     for(int q = 0; q < ret; q++)
923     {
924         int idx = 0;
925         for(int a = 0; a < 3; ++a)
926         for(int b = 0; b < 10; ++b)
927         for(int c = 0; c < 28; ++c)
928         for(int d = 0; d < 28; ++d)
929             buffer[idx++] = INT__p_f_i_i[q*23520+b*2352+a*784+c*28+d];
930 
931         memcpy(INT__p_f_i_i+q*23520, buffer, 23520*sizeof(double));
932     }
933 
934     return ret;
935 }
936 
937