261{
262
263
264
265
266
267
268
269 if (Deriv0)
270 {
271 for (
unsigned int p = 0;
p < nq0; ++
p)
272 {
273 unsigned int cnt_kji = 0, cnt_kj = 0;
274 for (unsigned int k = 0; k < nq2; ++k)
275 {
276 for (unsigned int j = 0; j < nq1; ++j, ++cnt_kj)
277 {
278 simd_type prod_sum = 0.0;
279 for (unsigned int i = 0; i < nq0; ++i, ++cnt_kji)
280 {
281 simd_type v1 = D0[
p * nq0 + i];
282 simd_type v2 = in0[cnt_kji];
283
284 prod_sum.fma(v1, v2);
285 }
286 out[cnt_kj * nq0 +
p] *= simd_type(scale);
287 out[cnt_kj * nq0 +
p] += prod_sum;
288 }
289 }
290 }
291 }
292
293
294 if (Deriv1)
295 {
296 for (unsigned int block = 0; block < nq2; ++block)
297 {
298 unsigned int start = block * nq0 * nq1;
299
300 for (unsigned int i = 0; i < nq0; ++i)
301 {
302 for (unsigned int j = 0; j < nq1; ++j)
303 {
304 simd_type prod_sum = 0.0;
305 for (unsigned int k = 0; k < nq1; ++k)
306 {
307 simd_type v1 = in1[start + k * nq0 + i];
308 simd_type v2 = D1[j * nq1 + k];
309
310 prod_sum.fma(v1, v2);
311 }
312
313 out[start + j * nq0 + i] += prod_sum;
314 }
315 }
316 }
317 }
318
319
320 if (Deriv2)
321 {
322 unsigned int cnt_hi = 0;
323 for (unsigned int h = 0; h < nq1; ++h)
324 {
325 for (unsigned int i = 0; i < nq0; ++i, ++cnt_hi)
326 {
327 for (unsigned int j = 0; j < nq2; ++j)
328 {
329 simd_type prod_sum = 0.0;
330 for (unsigned int k = 0; k < nq2; ++k)
331 {
332 simd_type v1 = in2[k * nq0 * nq1 + cnt_hi];
333 simd_type v2 = D2[j * nq2 + k];
334
335 prod_sum.fma(v1, v2);
336 }
337
338 out[j * nq0 * nq1 + cnt_hi] += prod_sum;
339 }
340 }
341 }
342 }
343}
std::vector< double > p(NPUPPER)