40#include <MatrixFreeOps/Operator.hpp>
106 tmp = wsp + e *
m_nqe, 1);
111 1.0,
m_mat->GetRawPtr(),
m_mat->GetRows(), wsp.data(),
112 m_stdExp->GetTotPoints(), 0.0, output.data(),
134 m_jac = pGeomData->GetJac(pCollExp);
147 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Seg"),
150 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Tri"),
153 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_NodalTri"),
156 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Quad"),
159 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Tet"),
162 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_NodalTet"),
165 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Pyr"),
168 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Prism"),
171 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_NodalPrism"),
174 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Hex"),
177 IProductWRTBase_StdMat::create,
"IProductWRTBase_SumFac_Pyr")};
197 (*m_oper)(input, output);
209 std::shared_ptr<MatrixFree::IProduct>
m_oper;
212 vector<LocalRegions::ExpansionSharedPtr> pCollExp,
215 MatrixFreeBase(pCollExp[0]->GetTotPoints(), pCollExp[0]->GetNcoeffs(),
219 const auto dim = pCollExp[0]->GetShapeDimension();
220 std::vector<LibUtilities::BasisSharedPtr> basis(dim);
221 for (
unsigned int i = 0; i < dim; ++i)
223 basis[i] = pCollExp[0]->GetBasis(i);
227 auto shapeType = pCollExp[0]->DetShapeType();
230 std::string op_string =
"IProduct";
231 op_string += MatrixFree::GetOpstring(shapeType,
m_isDeformed);
232 auto oper = MatrixFree::GetOperatorFactory().CreateInstance(
233 op_string, basis, pCollExp.size());
235 oper->SetUpBdata(basis);
236 oper->SetUpZW(basis);
239 oper->SetJac(pGeomData->GetJacInterLeave(pCollExp,
m_nElmtPad));
241 m_oper = std::dynamic_pointer_cast<MatrixFree::IProduct>(oper);
247OperatorKey IProductWRTBase_MatrixFree::m_typeArr[] = {
250 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Seg"),
253 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Quad"),
256 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Tri"),
259 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Hex"),
262 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Prism"),
265 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Pyr"),
268 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Tet")};
289 const int nCoeffs =
m_stdExp->GetNcoeffs();
290 const int nPhys =
m_stdExp->GetTotPoints();
298 m_stdExp->IProductWRTBase(wsp + i * nPhys,
299 tmp = output + i * nCoeffs);
307 tmp = wsp + i * nPhys, 1);
308 m_stdExp->IProductWRTBase(wsp + i * nPhys,
309 tmp = output + i * nCoeffs);
328 vector<LocalRegions::ExpansionSharedPtr> pCollExp,
332 int nqtot = pCollExp[0]->GetTotPoints();
334 m_deformed = (pCollExp[0]->GetGeomFactors()->GetGtype() ==
336 m_jac = pGeomData->GetJac(pCollExp);
343OperatorKey IProductWRTBase_IterPerExp::m_typeArr[] = {
346 IProductWRTBase_IterPerExp::create,
"IProductWRTBase_IterPerExp_Seg"),
349 IProductWRTBase_IterPerExp::create,
"IProductWRTBase_IterPerExp_Tri"),
352 IProductWRTBase_IterPerExp::create,
353 "IProductWRTBase_IterPerExp_NodalTri"),
356 IProductWRTBase_IterPerExp::create,
"IProductWRTBase_IterPerExp_Quad"),
359 IProductWRTBase_IterPerExp::create,
"IProductWRTBase_IterPerExp_Tet"),
362 IProductWRTBase_IterPerExp::create,
363 "IProductWRTBase_IterPerExp_NodalTet"),
366 IProductWRTBase_IterPerExp::create,
"IProductWRTBase_IterPerExp_Pyr"),
369 IProductWRTBase_IterPerExp::create,
"IProductWRTBase_IterPerExp_Prism"),
372 IProductWRTBase_IterPerExp::create,
373 "IProductWRTBase_IterPerExp_NodalPrism"),
376 IProductWRTBase_IterPerExp::create,
"IProductWRTBase_IterPerExp_Hex"),
396 const int nCoeffs =
m_expList[0]->GetNcoeffs();
397 const int nPhys =
m_expList[0]->GetTotPoints();
402 m_expList[i]->IProductWRTBase(input + i * nPhys,
403 tmp = output + i * nCoeffs);
420 vector<LocalRegions::ExpansionSharedPtr> pCollExp,
429OperatorKey IProductWRTBase_NoCollection::m_typeArr[] = {
432 IProductWRTBase_NoCollection::create,
433 "IProductWRTBase_NoCollection_Seg"),
436 IProductWRTBase_NoCollection::create,
437 "IProductWRTBase_NoCollection_Tri"),
440 IProductWRTBase_NoCollection::create,
441 "IProductWRTBase_NoCollection_NodalTri"),
444 IProductWRTBase_NoCollection::create,
445 "IProductWRTBase_NoCollection_Quad"),
448 IProductWRTBase_NoCollection::create,
449 "IProductWRTBase_NoCollection_Tet"),
452 IProductWRTBase_NoCollection::create,
453 "IProductWRTBase_NoCollection_NodalTet"),
456 IProductWRTBase_NoCollection::create,
457 "IProductWRTBase_NoCollection_Pyr"),
460 IProductWRTBase_NoCollection::create,
461 "IProductWRTBase_NoCollection_Prism"),
464 IProductWRTBase_NoCollection::create,
465 "IProductWRTBase_NoCollection_NodalPrism"),
468 IProductWRTBase_NoCollection::create,
469 "IProductWRTBase_NoCollection_Hex"),
522 vector<LocalRegions::ExpansionSharedPtr> pCollExp,
531 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
539 IProductWRTBase_SumFac_Seg::create,
"IProductWRTBase_SumFac_Seg");
586 vector<LocalRegions::ExpansionSharedPtr> pCollExp,
598 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
608 IProductWRTBase_SumFac_Quad::create,
"IProductWRTBase_SumFac_Quad");
654 vector<LocalRegions::ExpansionSharedPtr> pCollExp,
664 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
682 IProductWRTBase_SumFac_Tri::create,
"IProductWRTBase_SumFac_Tri");
733 vector<LocalRegions::ExpansionSharedPtr> pCollExp,
750 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
761 IProductWRTBase_SumFac_Hex::create,
"IProductWRTBase_SumFac_Hex");
810 vector<LocalRegions::ExpansionSharedPtr> pCollExp,
823 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
845 IProductWRTBase_SumFac_Tet::create,
"IProductWRTBase_SumFac_Tet");
894 vector<LocalRegions::ExpansionSharedPtr> pCollExp,
908 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
929 IProductWRTBase_SumFac_Prism::create,
"IProductWRTBase_SumFac_Prism");
978 vector<LocalRegions::ExpansionSharedPtr> pCollExp,
992 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
1013 IProductWRTBase_SumFac_Pyr::create,
"IProductWRTBase_SumFac_Pyr");
#define ASSERTL0(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....
#define OPERATOR_CREATE(cname)
Inner product help class to calculate the size of the collection that is given as an input and as an ...
Inner product operator using element-wise operation.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
IProductWRTBase_IterPerExp(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~IProductWRTBase_IterPerExp() final=default
Array< OneD, NekDouble > m_jac
Inner product operator using operator using matrix free operators.
IProductWRTBase_MatrixFree(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~IProductWRTBase_MatrixFree() final=default
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
std::shared_ptr< MatrixFree::IProduct > m_oper
Inner product operator using original MultiRegions implementation.
~IProductWRTBase_NoCollection() final=default
IProductWRTBase_NoCollection(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
vector< LocalRegions::ExpansionSharedPtr > m_expList
Inner product operator using standard matrix approach.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
IProductWRTBase_StdMat(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_jac
~IProductWRTBase_StdMat() final=default
Inner Product operator using sum-factorisation (Hex)
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Array< OneD, const NekDouble > m_base0
IProductWRTBase_SumFac_Hex(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_base2
Array< OneD, const NekDouble > m_base1
Array< OneD, const NekDouble > m_jacWStdW
~IProductWRTBase_SumFac_Hex() final=default
Inner Product operator using sum-factorisation (Prism)
IProductWRTBase_SumFac_Prism(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_jacWStdW
~IProductWRTBase_SumFac_Prism() final=default
Array< OneD, const NekDouble > m_base1
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_base2
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Inner Product operator using sum-factorisation (Pyr)
IProductWRTBase_SumFac_Pyr(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_jacWStdW
Array< OneD, const NekDouble > m_base2
~IProductWRTBase_SumFac_Pyr() final=default
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_base1
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Inner product operator using sum-factorisation (Quad)
Array< OneD, const NekDouble > m_jacWStdW
Array< OneD, const NekDouble > m_base1
Array< OneD, const NekDouble > m_base0
~IProductWRTBase_SumFac_Quad() final=default
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
IProductWRTBase_SumFac_Quad(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Inner product operator using sum-factorisation (Segment)
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
IProductWRTBase_SumFac_Seg(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_jacWStdW
~IProductWRTBase_SumFac_Seg() final=default
Array< OneD, const NekDouble > m_base0
Inner product operator using sum-factorisation (Tet)
Array< OneD, const NekDouble > m_jacWStdW
~IProductWRTBase_SumFac_Tet() final=default
Array< OneD, const NekDouble > m_base1
IProductWRTBase_SumFac_Tet(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_base2
Inner product operator using sum-factorisation (Tri)
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
~IProductWRTBase_SumFac_Tri() final=default
Array< OneD, const NekDouble > m_base0
IProductWRTBase_SumFac_Tri(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_jacWStdW
Array< OneD, const NekDouble > m_base1
unsigned int m_nElmtPad
size after padding
Base class for operators on a collection of elements.
StdRegions::StdExpansionSharedPtr m_stdExp
unsigned int m_numElmt
number of elements that the operator is applied on
unsigned int m_outputSize
number of modes or quadrature points that are taken as output from an operator
unsigned int m_inputSize
number of modes or quadrature points that are passed as input to an operator
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
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...
void TetIProduct(bool sortTopEdge, int numElmt, int nquad0, int nquad1, int nquad2, int nmodes0, int nmodes1, int nmodes2, const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &jac, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
void PyrIProduct(bool sortTopVert, int numElmt, int nquad0, int nquad1, int nquad2, int nmodes0, int nmodes1, int nmodes2, const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &jac, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
void TriIProduct(bool sortTopVertex, int numElmt, int nquad0, int nquad1, int nmodes0, int nmodes1, const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &jac, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
std::tuple< LibUtilities::ShapeType, OperatorType, ImplementationType, ExpansionIsNodal > OperatorKey
Key for describing an Operator.
void QuadIProduct(bool colldir0, bool colldir1, int numElmt, int nquad0, int nquad1, int nmodes0, int nmodes1, const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &jac, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
std::shared_ptr< CoalescedGeomData > CoalescedGeomDataSharedPtr
OperatorFactory & GetOperatorFactory()
Returns the singleton Operator factory object.
void PrismIProduct(bool sortTopVert, int numElmt, int nquad0, int nquad1, int nquad2, int nmodes0, int nmodes1, int nmodes2, const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &jac, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
void HexIProduct(bool colldir0, bool colldir1, bool colldir2, int numElmt, int nquad0, int nquad1, int nquad2, int nmodes0, int nmodes1, int nmodes2, const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &jac, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
@ eModified_A
Principle Modified Functions .
@ eDeformed
Geometry is curved or has non-constant factors.
std::shared_ptr< DNekMat > DNekMatSharedPtr
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
scalarT< T > max(scalarT< T > lhs, scalarT< T > rhs)