35template <
typename simd_type>
37 const unsigned int nq0,
38 const simd_type *basis0,
42 for (
unsigned int i = 0; i < nq0; ++i)
44 simd_type tmp = in[0] * basis0[i];
46 for (
unsigned int p = 1; p < nm0; ++p)
48 tmp.fma(in[p], basis0[p * nq0 + i]);
55template <
typename simd_type>
57 const unsigned int nm0,
const unsigned int nm1,
const unsigned int nq0,
58 const unsigned int nq1,
const bool isModified,
const simd_type *basis0,
59 const simd_type *basis1, simd_type *p_sums,
const simd_type *in,
62 for (
unsigned int eta1 = 0, eta_idx = 0; eta1 < nq1; ++eta1)
64 for (
unsigned int p = 0, mode = 0; p < nm0; ++p)
66 simd_type p_sum = 0.0;
68 for (
unsigned int q = 0; q < (nm1 - p); ++q, ++mode)
70 p_sum.fma(basis1[mode * nq1 + eta1], in[mode]);
79 for (
unsigned int eta0 = 0; eta0 < nq0; ++eta0, ++eta_idx)
81 simd_type p_sum = 0.0;
82 for (
unsigned int p = 0; p < nm0; ++p)
84 p_sum.fma(p_sums[p], basis0[p * nq0 + eta0]);
90 p_sum.fma(in[1] * basis0[nq0 + eta0], basis1[nq1 + eta1]);
98template <
typename simd_type>
100 const unsigned int nm0,
const unsigned int nm1,
const unsigned int nq0,
101 const unsigned int nq1,
const simd_type *basis0,
const simd_type *basis1,
102 simd_type *wsp,
const simd_type *in, simd_type *out)
104 for (
unsigned int i = 0, cnt_iq = 0; i < nq0; ++i)
106 for (
unsigned int q = 0, cnt_pq = 0; q < nm1; ++q, ++cnt_iq)
108 simd_type tmp = in[cnt_pq] * basis0[i];
110 for (
unsigned int p = 1; p < nm0; ++p, ++cnt_pq)
112 tmp.fma(in[cnt_pq], basis0[p * nq0 + i]);
118 for (
unsigned int j = 0, cnt_ij = 0; j < nq1; ++j)
120 for (
unsigned int i = 0, cnt_iq = 0; i < nq0; ++i, ++cnt_ij)
122 simd_type tmp = wsp[cnt_iq] * basis1[j];
124 for (
unsigned int q = 1; q < nm1; ++q, ++cnt_iq)
126 tmp.fma(wsp[cnt_iq], basis1[q * nq1 + j]);
133template <
typename simd_type>
135 const unsigned int nm0,
const unsigned int nm1,
const unsigned int nm2,
136 const unsigned int nq0,
const unsigned int nq1,
const unsigned int nq2,
137 const simd_type *basis0,
const simd_type *basis1,
const simd_type *basis2,
140 const simd_type *in, simd_type *out)
142 for (
unsigned int i = 0, cnt_irq = 0; i < nq0; ++i)
144 for (
unsigned int r = 0, cnt_rqp = 0; r < nm2; ++r)
146 for (
unsigned int q = 0; q < nm1; ++q, ++cnt_irq)
148 simd_type tmp = in[cnt_rqp] * basis0[i];
151 for (
unsigned int p = 1; p < nm0; ++p, ++cnt_rqp)
153 tmp.fma(in[cnt_rqp], basis0[p * nq0 + i]);
156 sum_irq[cnt_irq] = tmp;
161 for (
unsigned int j = 0, cnt_jir = 0; j < nq1; ++j)
163 for (
unsigned int i = 0, cnt_irq = 0; i < nq0; ++i)
165 for (
unsigned int r = 0; r < nm2; ++r, ++cnt_jir)
167 simd_type tmp = sum_irq[cnt_irq] * basis1[j];
170 for (
unsigned int q = 1; q < nm1; ++q)
172 tmp.fma(sum_irq[cnt_irq++], basis1[q * nq1 + j]);
175 sum_jir[cnt_jir] = tmp;
180 for (
unsigned int k = 0, cnt_kji = 0; k < nq2; ++k)
182 for (
unsigned int j = 0, cnt_jir = 0; j < nq1; ++j)
184 for (
unsigned int i = 0; i < nq0; ++i, ++cnt_kji)
186 simd_type tmp = sum_jir[cnt_jir] * basis2[k];
189 for (
unsigned int r = 1; r < nm2; ++r)
191 tmp.fma(sum_jir[cnt_jir++], basis2[r * nq2 + k]);
200template <
typename simd_type>
202 const unsigned int nm0,
const unsigned int nm1,
const unsigned int nm2,
203 const unsigned int nq0,
const unsigned int nq1,
const unsigned int nq2,
204 const bool isModified,
const simd_type *basis0,
const simd_type *basis1,
205 const simd_type *basis2,
208 const simd_type *in, simd_type *out)
210 for (
unsigned int k = 0, cnt_kji = 0; k < nq2; ++k)
212 unsigned int cnt_pq = 0, cnt_pqr = 0, mode = 0;
213 for (
unsigned int p = 0; p < nm0; ++p)
215 for (
unsigned int q = 0; q < nm1 - p; ++q, ++cnt_pq)
218 in[cnt_pqr] * basis2[k + nq2 * mode];
222 for (
unsigned int r = 1; r < nm2 - p - q;
223 ++r, ++mode, ++cnt_pqr)
225 prod.fma(in[cnt_pqr], basis2[k + nq2 * mode]);
232 for (
unsigned int q = nm1 - p; q < nm2 - p; ++q)
238 for (
unsigned int j = 0; j < nq1; ++j)
241 for (
unsigned int p = 0; p < nm0; ++p)
244 fpq[cnt_pq] * basis1[mode * nq1 + j];
247 for (
unsigned int q = 1; q < nm1 - p; ++q, ++cnt_pq)
249 prod.fma(fpq[cnt_pq],
250 basis1[(mode + q) * nq1 + j]);
257 for (
unsigned int i = 0; i < nq0; ++i, ++cnt_kji)
259 simd_type tmp = basis0[i] * fp[0];
261 for (
unsigned int p = 1; p < nm0; ++p)
263 tmp.fma(basis0[p * nq0 + i], fp[p]);
275 simd_type tmp1 = basis0[i] * basis1[nq1 + j];
276 tmp1.fma(basis0[nq0 + i], basis1[j]);
277 tmp1.fma(basis0[nq0 + i], basis1[nq1 + j]);
278 tmp1 = tmp1 * basis2[nq2 + k];
280 simd_type inarray1 = simd_type(in[1]);
281 tmp.fma(tmp1, inarray1);
287 tmp1 = basis0[nq0 + i] * basis1[nq1 + j];
288 tmp1 = tmp1 * basis2[k];
289 inarray1 = simd_type(in[nm2]);
290 tmp.fma(inarray1, tmp1);
293 for (
unsigned int r = 1; r < nm2 - 1; ++r)
297 tmp1 = basis1[nq1 + j] * basis0[nq0 + i];
298 tmp1 = tmp1 * basis2[(r + 1) * nq2 + k];
299 inarray1 = simd_type(in[nm2 + r]);
300 tmp.fma(inarray1, tmp1);
311template <
typename simd_type>
313 const unsigned int nm0,
const unsigned int nm1,
const unsigned int nm2,
314 const unsigned int nq0,
const unsigned int nq1,
const unsigned int nq2,
315 const bool isModified,
const simd_type *basis0,
const simd_type *basis1,
316 const simd_type *basis2,
319 const simd_type *in, simd_type *out)
321 for (
unsigned int k = 0, cnt_kji = 0; k < nq2; ++k)
323 unsigned int mode_pqr = 0, mode_pq = 0, mode_pr = 0;
324 for (
unsigned int p = 0; p < nm0; ++p)
326 for (
unsigned int q = 0; q < nm1; ++q, ++mode_pq)
328 simd_type prod = 0.0;
329 for (
unsigned int r = 0; r < nm2 - p; ++r, ++mode_pqr)
331 prod.fma(in[mode_pqr],
332 basis2[(mode_pr + r) * nq2 + k]);
341 for (
unsigned int j = 0; j < nq1; ++j)
344 for (
unsigned int p = 0; p < nm0; ++p)
346 simd_type prod = 0.0;
347 for (
unsigned int q = 0; q < nm1; ++q, ++mode_pq)
349 prod.fma(fpq[mode_pq], basis1[q * nq1 + j]);
354 for (
unsigned int i = 0; i < nq0; ++i, ++cnt_kji)
356 simd_type val_kji = 0.0;
357 for (
unsigned int p = 0; p < nm0; ++p)
359 val_kji.fma(fp[p], basis0[p * nq0 + i]);
364 simd_type basis_2 = basis2[nq2 + k];
365 simd_type basis_0 = basis0[nq0 + i];
367 for (
unsigned int q = 0; q < nm1; ++q)
370 simd_type(in[q * nm2 + 1]);
371 simd_type basis_1 = basis1[q * nq1 + j];
372 val_kji.fma(basis_2 * basis_1, basis_0 * coef_0q1);
375 out[cnt_kji] = val_kji;
381template <
typename simd_type>
383 const unsigned int nm0,
const unsigned int nm1,
const unsigned int nm2,
384 const unsigned int nq0,
const unsigned int nq1,
const unsigned int nq2,
385 const bool isModified,
const simd_type *basis0,
const simd_type *basis1,
386 const simd_type *basis2,
389 const simd_type *in, simd_type *out)
391 for (
unsigned int k = 0, cnt_kji = 0; k < nq2; ++k)
393 unsigned int cnt_pqr = 0, mode_pqr = 0, mode_pq = 0;
394 for (
unsigned int p = 0; p < nm0; ++p)
396 for (
unsigned int q = 0; q < p; ++q, ++mode_pq)
398 simd_type prod = 0.0;
399 for (
unsigned int r = 0; r < nm2 - p;
400 ++r, ++mode_pqr, ++cnt_pqr)
403 prod.fma(in[cnt_pqr], basis2[mode_pqr * nq2 + k]);
408 for (
unsigned int q = p; q < nm1; ++q, ++mode_pq)
410 simd_type prod = 0.0;
411 for (
unsigned int r = 0; r < nm2 - q;
412 ++r, ++mode_pqr, ++cnt_pqr)
415 prod.fma(in[cnt_pqr], basis2[mode_pqr * nq2 + k]);
422 for (
unsigned int q = nm1; q < nm2; ++q)
428 for (
unsigned int j = 0; j < nq1; ++j)
431 for (
unsigned int p = 0; p < nm0; ++p)
433 simd_type prod = 0.0;
434 for (
unsigned int q = 0; q < nm1; ++q, ++mode_pq)
436 prod.fma(fpq[mode_pq], basis1[q * nq1 + j]);
441 for (
unsigned int i = 0; i < nq0; ++i, ++cnt_kji)
443 simd_type val_kji = 0.0;
444 for (
unsigned int p = 0; p < nm0; ++p)
446 val_kji.fma(fp[p], basis0[p * nq0 + i]);
457 simd_type tmp1 = basis0[i] * basis1[nq1 + j];
458 tmp1.fma(basis0[nq0 + i], basis1[j]);
459 tmp1.fma(basis0[nq0 + i], basis1[nq1 + j]);
460 tmp1 = tmp1 * basis2[nq2 + k];
462 simd_type inarray1 = simd_type(in[1]);
463 val_kji.fma(tmp1, inarray1);
466 out[cnt_kji] = val_kji;
static NEK_FORCE_INLINE void BwdTransTetKernel(const unsigned int nm0, const unsigned int nm1, const unsigned int nm2, const unsigned int nq0, const unsigned int nq1, const unsigned int nq2, const bool isModified, const simd_type *basis0, const simd_type *basis1, const simd_type *basis2, simd_type *fpq, simd_type *fp, const simd_type *in, simd_type *out)
static NEK_FORCE_INLINE void BwdTransPrismKernel(const unsigned int nm0, const unsigned int nm1, const unsigned int nm2, const unsigned int nq0, const unsigned int nq1, const unsigned int nq2, const bool isModified, const simd_type *basis0, const simd_type *basis1, const simd_type *basis2, simd_type *fpq, simd_type *fp, const simd_type *in, simd_type *out)
static NEK_FORCE_INLINE void BwdTransPyrKernel(const unsigned int nm0, const unsigned int nm1, const unsigned int nm2, const unsigned int nq0, const unsigned int nq1, const unsigned int nq2, const bool isModified, const simd_type *basis0, const simd_type *basis1, const simd_type *basis2, simd_type *fpq, simd_type *fp, const simd_type *in, simd_type *out)
static NEK_FORCE_INLINE void BwdTransQuadKernel(const unsigned int nm0, const unsigned int nm1, const unsigned int nq0, const unsigned int nq1, const simd_type *basis0, const simd_type *basis1, simd_type *wsp, const simd_type *in, simd_type *out)
static NEK_FORCE_INLINE void BwdTransSegKernel(const unsigned int nm0, const unsigned int nq0, const simd_type *basis0, const simd_type *in, simd_type *out)
static NEK_FORCE_INLINE void BwdTransTriKernel(const unsigned int nm0, const unsigned int nm1, const unsigned int nq0, const unsigned int nq1, const bool isModified, const simd_type *basis0, const simd_type *basis1, simd_type *p_sums, const simd_type *in, simd_type *out)
static NEK_FORCE_INLINE void BwdTransHexKernel(const unsigned int nm0, const unsigned int nm1, const unsigned int nm2, const unsigned int nq0, const unsigned int nq1, const unsigned int nq2, const simd_type *basis0, const simd_type *basis1, const simd_type *basis2, simd_type *sum_irq, simd_type *sum_jir, const simd_type *in, simd_type *out)