37 #include <boost/core/ignore_unused.hpp>
71 const int nquad0 =
m_base[0]->GetNumPoints();
72 const int nquad1 =
m_base[1]->GetNumPoints();
73 const int nquad2 =
m_base[2]->GetNumPoints();
78 Vmath::Vcopy(nquad0 * nquad1 * nquad2, &inarray[0], 1, &wsp[0], 1);
80 if (out_dx.size() > 0)
84 Blas::Dgemm(
'N',
'N', nquad0, nquad1 * nquad2, nquad0, 1.0, D0, nquad0,
85 &wsp[0], nquad0, 0.0, &out_dx[0], nquad0);
88 if (out_dy.size() > 0)
91 for (
int j = 0; j < nquad2; ++j)
94 &wsp[j * nquad0 * nquad1], nquad0, D1, nquad1, 0.0,
95 &out_dy[j * nquad0 * nquad1], nquad0);
99 if (out_dz.size() > 0)
103 Blas::Dgemm(
'N',
'T', nquad0 * nquad1, nquad2, nquad2, 1.0, &wsp[0],
104 nquad0 * nquad1, D2, nquad2, 0.0, &out_dz[0],
115 bool doCheckCollDir0,
bool doCheckCollDir1,
bool doCheckCollDir2)
118 doCheckCollDir0, doCheckCollDir1, doCheckCollDir2);
127 bool doCheckCollDir0,
bool doCheckCollDir1,
bool doCheckCollDir2)
130 doCheckCollDir0, doCheckCollDir1,
136 ASSERTL1((dir == 0) || (dir == 1) || (dir == 2),
"Invalid direction.");
138 const int nq0 =
m_base[0]->GetNumPoints();
139 const int nq1 =
m_base[1]->GetNumPoints();
140 const int nq2 =
m_base[2]->GetNumPoints();
141 const int nq = nq0 * nq1 * nq2;
142 const int nm0 =
m_base[0]->GetNumModes();
143 const int nm1 =
m_base[1]->GetNumModes();
156 for (
int i = 0; i < nq; i++)
161 m_base[2]->GetBdata(), tmp2, tmp5, wsp,
false,
true,
true);
167 (*mat)(j, i) = tmp5[j];
172 for (
int i = 0; i < nq; i++)
177 m_base[2]->GetBdata(), tmp2, tmp5, wsp,
true,
false,
true);
183 (*mat)(j, i) = tmp5[j];
188 for (
int i = 0; i < nq; i++)
193 m_base[2]->GetDbdata(), tmp2, tmp5, wsp,
true,
true,
false);
198 (*mat)(j, i) = tmp5[j];
224 const int nq0 =
m_base[0]->GetNumPoints();
225 const int nq1 =
m_base[1]->GetNumPoints();
226 const int nq2 =
m_base[2]->GetNumPoints();
232 for (
int i = 0; i < nq1 * nq2; ++i, ptr += nq0)
234 wsp1[i] = StdExpansion::BaryEvaluate<0>(eta[0], ptr);
237 for (
int i = 0; i < nq2; ++i)
239 wsp2[i] = StdExpansion::BaryEvaluate<1>(eta[1], &wsp1[i * nq1]);
242 return StdExpansion::BaryEvaluate<2>(eta[2], &wsp2[0]);
251 int Qx =
m_base[0]->GetNumPoints();
252 int Qy =
m_base[1]->GetNumPoints();
253 int Qz =
m_base[2]->GetNumPoints();
263 interpolatingNodes = &I[0]->GetPtr()[0];
265 Blas::Dgemv(
'T', Qx, Qy * Qz, 1.0, &physvals[0], Qx, &interpolatingNodes[0],
266 1, 0.0, &sumFactorization_qr[0], 1);
269 interpolatingNodes = &I[1]->GetPtr()[0];
271 Blas::Dgemv(
'T', Qy, Qz, 1.0, &sumFactorization_qr[0], Qy,
272 &interpolatingNodes[0], 1, 0.0, &sumFactorization_r[0], 1);
275 interpolatingNodes = &I[2]->GetPtr()[0];
276 value =
Blas::Ddot(Qz, interpolatingNodes, 1, &sumFactorization_r[0], 1);
306 if (!(
m_base[0]->Collocation() &&
m_base[1]->Collocation() &&
307 m_base[2]->Collocation()))
338 int nquad0 =
m_base[0]->GetNumPoints();
339 int nquad1 =
m_base[1]->GetNumPoints();
340 int nquad2 =
m_base[2]->GetNumPoints();
341 int nmodes0 =
m_base[0]->GetNumModes();
342 int nmodes1 =
m_base[1]->GetNumModes();
343 int nmodes2 =
m_base[2]->GetNumModes();
344 int wspsize = max(nquad0 * nmodes2 * (nmodes1 + nquad1),
345 nquad0 * nquad1 * (nquad2 + nmodes0) +
346 nmodes0 * nmodes1 * nquad2);
357 if (!(
m_base[0]->Collocation() &&
m_base[1]->Collocation() &&
358 m_base[2]->Collocation()))
369 wsp2,
true,
true,
true);
409 boost::ignore_unused(i);
418 boost::ignore_unused(tid, maparray, signarray, traceOrient);
432 if (maparray.size() != map2.size())
437 for (
int i = 0; i < map2.size(); ++i)
439 maparray[i] = map1[map2[i]];
445 const int numpoints,
const int nummodes)
447 boost::ignore_unused(facedir);
449 switch (faceDirBasisType)
501 const int numpoints,
const int nummodes)
503 switch (faceDirBasisType)
531 numpoints, LibUtilities::eGaussRadauMAlpha1Beta0);
559 numpoints, LibUtilities::eGaussRadauMAlpha1Beta0);
589 numpoints, LibUtilities::eGaussRadauMAlpha1Beta0);
#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 void v_GetTraceToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation traceOrient, int P, int Q)
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 GetElmtTraceToTraceMap(const unsigned int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation traceOrient=eForwards, int P=-1, int Q=-1)
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.
void GetTraceCoeffMap(const unsigned int traceid, Array< OneD, unsigned int > &maparray)
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
@ 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)