17#ifdef MFEM_HAVE_GCC_PRAGMA_DIAGNOSTIC 
   18#pragma GCC diagnostic push 
   19#pragma GCC diagnostic ignored "-Wunused-function" 
   22#ifndef GSLIB_RELEASE_VERSION  
   23#define GSLIB_RELEASE_VERSION 10007 
   25#ifdef MFEM_HAVE_GCC_PRAGMA_DIAGNOSTIC 
   26#pragma GCC diagnostic pop 
   30#if GSLIB_RELEASE_VERSION >= 10009 
   31#define CODE_INTERNAL 0 
   33#define CODE_NOT_FOUND 2 
   35static MFEM_HOST_DEVICE 
void lagrange_eval(
double *p0, 
double x,
 
   37                                           double *z, 
double *lagrangeCoeff)
 
   39   double p_i = (1 << (p_Nq - 1));
 
   40   for (
int j = 0; j < p_Nq; ++j)
 
   42      double d_j = x - z[j];
 
   43      p_i *= j == i ? 1 : d_j;
 
   45   p0[i] = lagrangeCoeff[i] * p_i;
 
   48template<
int T_D1D = 0>
 
   49static void InterpolateLocal2DKernel(
const double *
const gf_in,
 
   52                                     double *
const int_out,
 
   61   const int Nfields = ncomp;
 
   62   const int MD1 = T_D1D ? T_D1D : DofQuadLimits::MAX_D1D;
 
   63   const int D1D = T_D1D ? T_D1D : pN;
 
   64   const int p_Np = D1D*D1D;
 
   65   MFEM_VERIFY(MD1 <= DofQuadLimits::MAX_D1D,
 
   66               "Increase Max allowable polynomial order.");
 
   67   MFEM_VERIFY(D1D != 0, 
"Polynomial order not specified.");
 
   70      MFEM_SHARED 
double wtr[2*MD1];
 
   71      MFEM_SHARED 
double sums[MD1*MD1];
 
   74      MFEM_FOREACH_THREAD(j,x,D1D)
 
   76         MFEM_FOREACH_THREAD(k,y,2)
 
   78            lagrange_eval(wtr + k*D1D, r[2*i+k], j, D1D, gll1D, lagcoeff);
 
   83      for (
int fld = 0; fld < Nfields; ++fld)
 
   88         const int elemOffset = el[i] * p_Np * Nfields + fld * p_Np;
 
   89         MFEM_FOREACH_THREAD(j,x,D1D)
 
   91            MFEM_FOREACH_THREAD(k,y,D1D)
 
   93               sums[j + k*D1D] = gf_in[elemOffset + j + k * D1D] *
 
  101         MFEM_FOREACH_THREAD(j,x,1)
 
  103            MFEM_FOREACH_THREAD(k,y,1)
 
  106               for (
int jj = 0; jj < D1D*D1D; ++jj)
 
  110               int_out[i + fld * npt] = sumv;
 
  123                                        int nel, 
int dof1Dsol)
 
  125   if (npt == 0) { 
return; }
 
  126   const int gf_offset = field_in.
Size()/ncomp;
 
  127   auto pfin = field_in.
Read();
 
  130   auto pfout = field_out.
Write();
 
  131   auto pgll = 
DEV.gll1d_sol.ReadWrite();
 
  132   auto plcf = 
DEV.lagcoeff_sol.ReadWrite();
 
  135      case 2: 
return InterpolateLocal2DKernel<2>(pfin, pgsl, pgslr, pfout,
 
  136                                                    npt, ncomp, nel, gf_offset,
 
  138      case 3: 
return InterpolateLocal2DKernel<3>(pfin, pgsl, pgslr, pfout,
 
  139                                                    npt, ncomp, nel, gf_offset,
 
  141      case 4: 
return InterpolateLocal2DKernel<4>(pfin, pgsl, pgslr, pfout,
 
  142                                                    npt, ncomp, nel, gf_offset,
 
  144      case 5: 
return InterpolateLocal2DKernel<5>(pfin, pgsl, pgslr, pfout,
 
  145                                                    npt, ncomp, nel, gf_offset,
 
  147      default: 
return InterpolateLocal2DKernel(pfin, pgsl, pgslr, pfout,
 
  148                                                  npt, ncomp, nel, gf_offset,
 
  149                                                  pgll, plcf, dof1Dsol);
 
 
  163                                        int nel, 
int dof1Dsol) {};
 
T * ReadWrite(bool on_dev=true)
Shortcut for mfem::ReadWrite(a.GetMemory(), a.Size(), on_dev).
struct mfem::FindPointsGSLIB::@24 DEV
void InterpolateLocal2(const Vector &field_in, Array< int > &gsl_elem_dev_l, Vector &gsl_ref_l, Vector &field_out, int npt, int ncomp, int nel, int dof1dsol)
virtual const real_t * Read(bool on_dev=true) const
Shortcut for mfem::Read(vec.GetMemory(), vec.Size(), on_dev).
virtual real_t * ReadWrite(bool on_dev=true)
Shortcut for mfem::ReadWrite(vec.GetMemory(), vec.Size(), on_dev).
int Size() const
Returns the size of the vector.
virtual real_t * Write(bool on_dev=true)
Shortcut for mfem::Write(vec.GetMemory(), vec.Size(), on_dev).
void forall_2D(int N, int X, int Y, lambda &&body)