37 #include <boost/core/ignore_unused.hpp>
75 const int nquad0 =
m_base[0]->GetNumPoints();
76 const int nquad1 =
m_base[1]->GetNumPoints();
77 const int nquad2 =
m_base[2]->GetNumPoints();
82 Vmath::Vcopy(nquad0*nquad1*nquad2, &inarray[0], 1, &wsp[0], 1);
84 if (out_dx.size() > 0)
88 Blas::Dgemm(
'N',
'N', nquad0,nquad1*nquad2,nquad0,1.0,
89 D0,nquad0,&wsp[0],nquad0,0.0,&out_dx[0],nquad0);
92 if (out_dy.size() > 0)
95 for (
int j = 0; j < nquad2; ++j)
98 1.0, &wsp[j*nquad0*nquad1], nquad0,
100 0.0, &out_dy[j*nquad0*nquad1], nquad0);
104 if (out_dz.size() > 0)
108 Blas::Dgemm(
'N',
'T',nquad0*nquad1,nquad2,nquad2,1.0,
109 &wsp[0],nquad0*nquad1,D2,nquad2,0.0,&out_dz[0],
121 bool doCheckCollDir0,
122 bool doCheckCollDir1,
123 bool doCheckCollDir2)
125 v_BwdTrans_SumFacKernel(base0, base1, base2, inarray, outarray, wsp, doCheckCollDir0, doCheckCollDir1, doCheckCollDir2);
135 bool doCheckCollDir0,
136 bool doCheckCollDir1,
137 bool doCheckCollDir2)
146 ASSERTL1((dir==0)||(dir==1)||(dir==2),
"Invalid direction.");
148 const int nq0 =
m_base[0]->GetNumPoints();
149 const int nq1 =
m_base[1]->GetNumPoints();
150 const int nq2 =
m_base[2]->GetNumPoints();
151 const int nq = nq0*nq1*nq2;
152 const int nm0 =
m_base[0]->GetNumModes();
153 const int nm1 =
m_base[1]->GetNumModes();
165 for(
int i=0; i<nq;i++)
178 (*mat)(j,i) = tmp5[j];
183 for(
int i=0; i<nq;i++)
196 (*mat)(j,i) = tmp5[j];
201 for(
int i=0; i<nq;i++)
213 (*mat)(j,i) = tmp5[j];
245 const int nq0 =
m_base[0]->GetNumPoints();
246 const int nq1 =
m_base[1]->GetNumPoints();
247 const int nq2 =
m_base[2]->GetNumPoints();
253 for (
int i = 0; i < nq1 * nq2; ++i, ptr += nq0)
255 wsp1[i] = StdExpansion::BaryEvaluate<0>(eta[0], ptr);
258 for (
int i = 0; i < nq2; ++i)
260 wsp2[i] = StdExpansion::BaryEvaluate<1>(eta[1], &wsp1[i * nq1]);
263 return StdExpansion::BaryEvaluate<2>(eta[2], &wsp2[0]);
272 int Qx =
m_base[0]->GetNumPoints();
273 int Qy =
m_base[1]->GetNumPoints();
274 int Qz =
m_base[2]->GetNumPoints();
283 interpolatingNodes = &I[0]->GetPtr()[0];
285 Blas::Dgemv(
'T',Qx,Qy*Qz,1.0,&physvals[0],Qx,&interpolatingNodes[0], 1, 0.0, &sumFactorization_qr[0], 1);
288 interpolatingNodes = &I[1]->GetPtr()[0];
290 Blas::Dgemv(
'T',Qy,Qz,1.0,&sumFactorization_qr[0],Qy,&interpolatingNodes[0],1,0.0,&sumFactorization_r[0], 1);
293 interpolatingNodes = &I[2]->GetPtr()[0];
294 value =
Blas::Ddot(Qz, interpolatingNodes, 1, &sumFactorization_r[0], 1);
325 if(!(
m_base[0]->Collocation() &&
m_base[1]->Collocation() &&
326 m_base[2]->Collocation()))
356 int nquad0 =
m_base[0]->GetNumPoints();
357 int nquad1 =
m_base[1]->GetNumPoints();
358 int nquad2 =
m_base[2]->GetNumPoints();
359 int nmodes0 =
m_base[0]->GetNumModes();
360 int nmodes1 =
m_base[1]->GetNumModes();
361 int nmodes2 =
m_base[2]->GetNumModes();
362 int wspsize = max(nquad0*nmodes2*(nmodes1+nquad1),
363 nquad0*nquad1*(nquad2+nmodes0)+
364 nmodes0*nmodes1*nquad2);
375 if(!(
m_base[0]->Collocation() &&
m_base[1]->Collocation() &&
376 m_base[2]->Collocation()))
384 wsp0,wsp2,
true,
true,
true);
387 outarray,wsp2,
true,
true,
true);
426 boost::ignore_unused(i);
437 boost::ignore_unused(tid,maparray,signarray,traceOrient);
447 boost::ignore_unused(facedir);
449 switch(faceDirBasisType)
505 switch(faceDirBasisType)
#define WARNINGL2(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
Describes the specification for a Basis.
Defines a specification for a set of points.
virtual NekDouble v_Integral(const Array< OneD, const NekDouble > &inarray)
Integrates the specified function over the domain.
virtual ~StdExpansion3D()
virtual void v_LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
virtual int v_GetNedges(void) const
void BwdTrans_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)
virtual void v_GetEdgeInteriorToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation traceOrient=eForwards)
void IProductWRTBase_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)
virtual void v_BwdTrans_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)=0
virtual int v_GetEdgeNcoeffs(const int i) const
virtual NekDouble v_PhysEvaluate(const Array< OneD, const NekDouble > &coords, const Array< OneD, const NekDouble > &physvals)
This function evaluates the expansion at a single (arbitrary) point of the domain.
virtual void v_HelmholtzMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
virtual void v_IProductWRTBase_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)=0
void PhysTensorDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray_d1, Array< OneD, NekDouble > &outarray_d2, Array< OneD, NekDouble > &outarray_d3)
Calculate the 3D derivative in the local tensor/collapsed coordinate at the physical points.
virtual void v_GenStdMatBwdDeriv(const int dir, DNekMatSharedPtr &mat)
The base class for all shapes.
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
void LaplacianMatrixOp_MatFree_GenericImpl(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
void LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
Convert local cartesian coordinate xi into local collapsed coordinates eta.
virtual void v_MultiplyByStdQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
void HelmholtzMatrixOp_MatFree_GenericImpl(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
Array< OneD, LibUtilities::BasisSharedPtr > m_base
void LaplacianMatrixOp_MatFree_Kernel(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp)
NekDouble GetConstFactor(const ConstFactorType &factor) const
bool ConstFactorExists(const ConstFactorType &factor) const
static void Dgemv(const char &trans, const int &m, const int &n, const double &alpha, const double *a, const int &lda, const double *x, const int &incx, const double &beta, double *y, const int &incy)
BLAS level 2: Matrix vector multiply y = A x where A[m x n].
static double Ddot(const int &n, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: output = .
static void Dgemm(const char &transa, const char &transb, const int &m, const int &n, const int &k, const double &alpha, const double *a, const int &lda, const double *b, const int &ldb, const double &beta, double *c, const int &ldc)
BLAS level 3: Matrix-matrix multiply C = A x B where op(A)[m x k], op(B)[k x n], C[m x n] DGEMM perfo...
static const BasisKey NullBasisKey(eNoBasisType, 0, NullPointsKey)
Defines a null basis with no type or points.
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
@ eGaussRadauMAlpha1Beta0
Gauss Radau pinned at x=-1, .
@ eModified_B
Principle Modified Functions .
@ eOrtho_A
Principle Orthogonal Functions .
@ eModified_C
Principle Modified Functions .
@ eGLL_Lagrange
Lagrange for SEM basis .
@ eOrtho_C
Principle Orthogonal Functions .
@ eModifiedPyr_C
Principle Modified Functions .
@ eOrtho_B
Principle Orthogonal Functions .
@ eModified_A
Principle Modified Functions .
@ eOrthoPyr_C
Principle Orthogonal Functions .
static const NekDouble kNekZeroTol
LibUtilities::BasisKey EvaluateTriFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
LibUtilities::BasisKey EvaluateQuadFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
The above copyright notice and this permission notice shall be included.
std::shared_ptr< DNekMat > DNekMatSharedPtr
void Svtvp(int n, const T alpha, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
svtvp (scalar times vector plus vector): z = alpha*x + y
T Vsum(int n, const T *x, const int incx)
Subtract return sum(x)
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)