55 const Vector &Dv = pa_data;
62 internal::OccaPADiffusionApply2D(dofs1D,quad1D,ne,B,G,Bt,Gt,Dv,x,y);
67 internal::OccaPADiffusionApply3D(dofs1D,quad1D,ne,B,G,Bt,Gt,Dv,x,y);
70 MFEM_ABORT(
"OCCA PADiffusionApply unknown kernel!");
77 return ApplySimplexPAKernels::Run(dim, dofs1D, quad1D, ne, symmetric,
79 rmaps->forward_map2d_diff,
80 rmaps->inverse_map2d_diff,
81 rmaps->forward_map3d_diff,
82 rmaps->inverse_map3d_diff,
89 Dv, x, y, dofs1D, quad1D);
92 ApplyPAKernels::Run(dim, dofs1D, quad1D, ne, symmetric, B, G, Bt,
93 Gt, Dv, x, y, dofs1D, quad1D);
233 MFEM_VERIFY(3 == dim,
"Only 3D so far");
238 const std::vector<Array2D<real_t>>& B = pB[patch];
239 const std::vector<Array2D<real_t>>& G = pG[patch];
241 const IntArrayVar2D& minD = pminD[patch];
242 const IntArrayVar2D& maxD = pmaxD[patch];
243 const IntArrayVar2D& minQ = pminQ[patch];
244 const IntArrayVar2D& maxQ = pmaxQ[patch];
246 auto X =
Reshape(x.
Read(), D1D[0], D1D[1], D1D[2]);
249 const auto qd =
Reshape(pa_data.
Read(), Q1D[0]*Q1D[1]*Q1D[2],
250 (symmetric ? 6 : 9));
253 std::vector<Array3D<real_t>> grad(dim);
255 Array3D<real_t> gradXY(3, std::max(Q1D[0], D1D[0]), std::max(Q1D[1], D1D[1]));
258 for (
int d=0; d<dim; ++d)
260 grad[d].SetSize(Q1D[0], Q1D[1], Q1D[2]);
262 for (
int qz = 0; qz < Q1D[2]; ++qz)
264 for (
int qy = 0; qy < Q1D[1]; ++qy)
266 for (
int qx = 0; qx < Q1D[0]; ++qx)
268 grad[d](qx,qy,qz) = 0.0;
274 for (
int dz = 0; dz < D1D[2]; ++dz)
276 for (
int qy = 0; qy < Q1D[1]; ++qy)
278 for (
int qx = 0; qx < Q1D[0]; ++qx)
280 for (
int d=0; d<
dim; ++d)
282 gradXY(d,qx,qy) = 0.0;
286 for (
int dy = 0; dy < D1D[1]; ++dy)
288 for (
int qx = 0; qx < Q1D[0]; ++qx)
293 for (
int dx = 0; dx < D1D[0]; ++dx)
295 const real_t s = X(dx,dy,dz);
296 for (
int qx = minD[0][dx]; qx <= maxD[0][dx]; ++qx)
298 gradX(0,qx) += s * B[0](qx,dx);
299 gradX(1,qx) += s * G[0](qx,dx);
302 for (
int qy = minD[1][dy]; qy <= maxD[1][dy]; ++qy)
304 const real_t wy = B[1](qy,dy);
305 const real_t wDy = G[1](qy,dy);
307 for (
int qx = 0; qx < Q1D[0]; ++qx)
309 const real_t wx = gradX(0,qx);
310 const real_t wDx = gradX(1,qx);
311 gradXY(0,qx,qy) += wDx * wy;
312 gradXY(1,qx,qy) += wx * wDy;
313 gradXY(2,qx,qy) += wx * wy;
317 for (
int qz = minD[2][dz]; qz <= maxD[2][dz]; ++qz)
319 const real_t wz = B[2](qz,dz);
320 const real_t wDz = G[2](qz,dz);
321 for (
int qy = 0; qy < Q1D[1]; ++qy)
323 for (
int qx = 0; qx < Q1D[0]; ++qx)
325 grad[0](qx,qy,qz) += gradXY(0,qx,qy) * wz;
326 grad[1](qx,qy,qz) += gradXY(1,qx,qy) * wz;
327 grad[2](qx,qy,qz) += gradXY(2,qx,qy) * wDz;
333 for (
int qz = 0; qz < Q1D[2]; ++qz)
335 for (
int qy = 0; qy < Q1D[1]; ++qy)
337 for (
int qx = 0; qx < Q1D[0]; ++qx)
339 const int q = qx + ((qy + (qz * Q1D[1])) * Q1D[0]);
340 const real_t O00 = qd(q,0);
341 const real_t O01 = qd(q,1);
342 const real_t O02 = qd(q,2);
343 const real_t O10 = symmetric ? O01 : qd(q,3);
344 const real_t O11 = symmetric ? qd(q,3) : qd(q,4);
345 const real_t O12 = symmetric ? qd(q,4) : qd(q,5);
346 const real_t O20 = symmetric ? O02 : qd(q,6);
347 const real_t O21 = symmetric ? O12 : qd(q,7);
348 const real_t O22 = symmetric ? qd(q,5) : qd(q,8);
350 const real_t grad0 = grad[0](qx,qy,qz);
351 const real_t grad1 = grad[1](qx,qy,qz);
352 const real_t grad2 = grad[2](qx,qy,qz);
354 grad[0](qx,qy,qz) = (O00*grad0)+(O01*grad1)+(O02*grad2);
355 grad[1](qx,qy,qz) = (O10*grad0)+(O11*grad1)+(O12*grad2);
356 grad[2](qx,qy,qz) = (O20*grad0)+(O21*grad1)+(O22*grad2);
361 for (
int qz = 0; qz < Q1D[2]; ++qz)
363 for (
int dy = 0; dy < D1D[1]; ++dy)
365 for (
int dx = 0; dx < D1D[0]; ++dx)
367 for (
int d=0; d<3; ++d)
369 gradXY(d,dx,dy) = 0.0;
373 for (
int qy = 0; qy < Q1D[1]; ++qy)
375 for (
int dx = 0; dx < D1D[0]; ++dx)
377 for (
int d=0; d<3; ++d)
382 for (
int qx = 0; qx < Q1D[0]; ++qx)
384 const real_t gX = grad[0](qx,qy,qz);
385 const real_t gY = grad[1](qx,qy,qz);
386 const real_t gZ = grad[2](qx,qy,qz);
387 for (
int dx = minQ[0][qx]; dx <= maxQ[0][qx]; ++dx)
389 const real_t wx = B[0](qx,dx);
390 const real_t wDx = G[0](qx,dx);
391 gradX(0,dx) += gX * wDx;
392 gradX(1,dx) += gY * wx;
393 gradX(2,dx) += gZ * wx;
396 for (
int dy = minQ[1][qy]; dy <= maxQ[1][qy]; ++dy)
398 const real_t wy = B[1](qy,dy);
399 const real_t wDy = G[1](qy,dy);
400 for (
int dx = 0; dx < D1D[0]; ++dx)
402 gradXY(0,dx,dy) += gradX(0,dx) * wy;
403 gradXY(1,dx,dy) += gradX(1,dx) * wDy;
404 gradXY(2,dx,dy) += gradX(2,dx) * wy;
408 for (
int dz = minQ[2][qz]; dz <= maxQ[2][qz]; ++dz)
410 const real_t wz = B[2](qz,dz);
411 const real_t wDz = G[2](qz,dz);
412 for (
int dy = 0; dy < D1D[1]; ++dy)
414 for (
int dx = 0; dx < D1D[0]; ++dx)
417 ((gradXY(0,dx,dy) * wz) +
418 (gradXY(1,dx,dy) * wz) +
419 (gradXY(2,dx,dy) * wDz));