15#ifndef MFEM_QUADINTERP_EVAL
16#define MFEM_QUADINTERP_EVAL
30namespace quadrature_interpolator
33template<QVectorLayout Q_LAYOUT>
34static void Values1D(
const int NE,
42 const auto b =
Reshape(b_, q1d, d1d);
43 const auto x =
Reshape(x_, d1d, vdim, NE);
50 for (
int c = 0; c < vdim; c++)
52 for (
int q = 0; q < q1d; q++)
55 for (
int d = 0; d < d1d; d++)
57 u +=
b(q, d) * x(d, c, e);
68 int T_VDIM = 0,
int T_D1D = 0,
int T_Q1D = 0,
70static void Values2D(
const int NE,
78 static constexpr int NBZ = T_NBZ ? T_NBZ : 1;
80 const int D1D = T_D1D ? T_D1D : d1d;
81 const int Q1D = T_Q1D ? T_Q1D : q1d;
82 const int VDIM = T_VDIM ? T_VDIM : vdim;
84 const auto b =
Reshape(b_, Q1D, D1D);
85 const auto x =
Reshape(x_, D1D, D1D, VDIM, NE);
87 Reshape(y_, Q1D, Q1D, VDIM, NE):
88 Reshape(y_, VDIM, Q1D, Q1D, NE);
92 const int D1D = T_D1D ? T_D1D : d1d;
93 const int Q1D = T_Q1D ? T_Q1D : q1d;
94 const int VDIM = T_VDIM ? T_VDIM : vdim;
95 constexpr int MQ1 = T_Q1D ? T_Q1D : DofQuadLimits::MAX_Q1D;
96 constexpr int MD1 = T_D1D ? T_D1D : DofQuadLimits::MAX_D1D;
97 constexpr int MDQ = (MQ1 > MD1) ? MQ1 : MD1;
98 const int tidz = MFEM_THREAD_ID(z);
100 MFEM_SHARED
real_t sB[MQ1*MD1];
101 MFEM_SHARED
real_t sm0[NBZ][MDQ*MDQ];
102 MFEM_SHARED
real_t sm1[NBZ][MDQ*MDQ];
104 kernels::internal::LoadB<MD1,MQ1>(D1D,Q1D,
b,sB);
111 for (
int c = 0; c < VDIM; c++)
113 kernels::internal::LoadX(e,D1D,c,x,DD);
114 kernels::internal::EvalX(D1D,Q1D,B,DD,DQ);
115 kernels::internal::EvalY(D1D,Q1D,B,DQ,QQ);
116 MFEM_FOREACH_THREAD(qy,y,Q1D)
118 MFEM_FOREACH_THREAD(qx,x,Q1D)
132 int T_VDIM = 0,
int T_D1D = 0,
int T_Q1D = 0>
133static void Values3D(
const int NE,
141 const int D1D = T_D1D ? T_D1D : d1d;
142 const int Q1D = T_Q1D ? T_Q1D : q1d;
143 const int VDIM = T_VDIM ? T_VDIM : vdim;
145 const auto b =
Reshape(b_, Q1D, D1D);
146 const auto x =
Reshape(x_, D1D, D1D, D1D, VDIM, NE);
148 Reshape(y_, Q1D, Q1D, Q1D, VDIM, NE):
149 Reshape(y_, VDIM, Q1D, Q1D, Q1D, NE);
153 const int D1D = T_D1D ? T_D1D : d1d;
154 const int Q1D = T_Q1D ? T_Q1D : q1d;
155 const int VDIM = T_VDIM ? T_VDIM : vdim;
156 constexpr int MQ1 = T_Q1D ? T_Q1D : DofQuadLimits::MAX_INTERP_1D;
157 constexpr int MD1 = T_D1D ? T_D1D : DofQuadLimits::MAX_INTERP_1D;
158 constexpr int MDQ = (MQ1 > MD1) ? MQ1 : MD1;
160 MFEM_SHARED
real_t sB[MQ1*MD1];
161 MFEM_SHARED
real_t sm0[MDQ*MDQ*MDQ];
162 MFEM_SHARED
real_t sm1[MDQ*MDQ*MDQ];
164 kernels::internal::LoadB<MD1,MQ1>(D1D,Q1D,
b,sB);
172 for (
int c = 0; c < VDIM; c++)
174 kernels::internal::LoadX(e,D1D,c,x,DDD);
175 kernels::internal::EvalX(D1D,Q1D,B,DDD,DDQ);
176 kernels::internal::EvalY(D1D,Q1D,B,DDQ,DQQ);
177 kernels::internal::EvalZ(D1D,Q1D,B,DQQ,QQQ);
178 MFEM_FOREACH_THREAD(qz,z,Q1D)
180 MFEM_FOREACH_THREAD(qy,y,Q1D)
182 MFEM_FOREACH_THREAD(qx,x,Q1D)
184 const real_t u = QQQ(qz,qy,qx);
202 int VDIM,
int D1D,
int Q1D,
int NBZ>
204QuadratureInterpolator::TensorEvalKernels::Kernel()
206 if (
DIM == 1) {
return internal::quadrature_interpolator::Values1D<Q_LAYOUT>; }
207 else if (
DIM == 2) {
return internal::quadrature_interpolator::Values2D<Q_LAYOUT, VDIM, D1D, Q1D, NBZ>; }
208 else if (
DIM == 3) {
return internal::quadrature_interpolator::Values3D<Q_LAYOUT, VDIM, D1D, Q1D>; }
209 else { MFEM_ABORT(
""); }
void(*)(const int, const real_t *, const real_t *, real_t *, const int, const int, const int) TensorEvalKernelType
real_t u(const Vector &xvec)
DeviceTensor< 2, real_t > DeviceMatrix
MFEM_HOST_DEVICE DeviceTensor< sizeof...(Dims), T > Reshape(T *ptr, Dims... dims)
Wrap a pointer as a DeviceTensor with automatically deduced template parameters.
void forall_2D_batch(int N, int X, int Y, int BZ, lambda &&body)
DeviceTensor< 2, const real_t > ConstDeviceMatrix
void forall_3D(int N, int X, int Y, int Z, lambda &&body)
QVectorLayout
Type describing possible layouts for Q-vectors.
DeviceTensor< 3, real_t > DeviceCube
void forall(int N, lambda &&body)