39#include <MatrixFreeOps/Operator.hpp>
90 1.0,
m_mat->GetRawPtr(),
m_mat->GetRows(), input.get(),
91 m_stdExp->GetNcoeffs(), 0.0, output0.get(),
100 ASSERTL0(
false,
"Not valid for this operator.");
104 [[maybe_unused]]
int coll_phys_offset)
override
106 ASSERTL0(
false,
"Not valid for this operator.");
128 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Seg"),
131 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Tri"),
134 BwdTrans_StdMat::create,
"BwdTrans_StdMat_NodalTri"),
137 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Quad"),
140 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Tet"),
143 BwdTrans_StdMat::create,
"BwdTrans_StdMat_NodalTet"),
146 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Pyr"),
149 "BwdTrans_StdMat_Prism"),
152 "BwdTrans_StdMat_NodalPrism"),
155 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Hex"),
158 BwdTrans_StdMat::create,
"BwdTrans_SumFac_Pyr")};
189 (*m_oper)(input, output0);
199 "BwdTrans_MatrixFree: Not valid for this operator.");
203 [[maybe_unused]]
int coll_phys_offset)
override
205 ASSERTL0(
false,
"Not valid for this operator.");
209 std::shared_ptr<MatrixFree::BwdTrans>
m_oper;
216 pCollExp[0]->GetStdExp()->GetTotPoints(),
220 const auto dim = pCollExp[0]->GetStdExp()->GetShapeDimension();
221 std::vector<LibUtilities::BasisSharedPtr> basis(dim);
222 for (
auto i = 0; i < dim; ++i)
224 basis[i] = pCollExp[0]->GetBasis(i);
228 auto shapeType = pCollExp[0]->GetStdExp()->DetShapeType();
231 std::string op_string =
"BwdTrans";
232 op_string += MatrixFree::GetOpstring(shapeType,
false);
236 m_oper = std::dynamic_pointer_cast<MatrixFree::BwdTrans>(oper);
245 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Seg"),
248 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Quad"),
251 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Tri"),
254 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Hex"),
257 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Prism"),
260 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Tet"),
263 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Pyr")};
282 const int nCoeffs =
m_stdExp->GetNcoeffs();
283 const int nPhys =
m_stdExp->GetTotPoints();
288 m_stdExp->BwdTrans(input + i * nCoeffs, tmp = output0 + i * nPhys);
297 ASSERTL0(
false,
"Not valid for this operator.");
301 [[maybe_unused]]
int coll_phys_offset)
override
303 ASSERTL0(
false,
"Not valid for this operator.");
319 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Seg"),
322 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Tri"),
325 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_NodalTri"),
328 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Quad"),
331 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Tet"),
334 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_NodalTet"),
337 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Pyr"),
340 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Prism"),
343 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_NodalPrism"),
346 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Hex"),
366 const int nCoeffs =
m_expList[0]->GetNcoeffs();
367 const int nPhys =
m_expList[0]->GetTotPoints();
372 m_expList[i]->BwdTrans(input + i * nCoeffs,
373 tmp = output0 + i * nPhys);
382 ASSERTL0(
false,
"Not valid for this operator.");
386 [[maybe_unused]]
int coll_phys_offset)
override
388 ASSERTL0(
false,
"Not valid for this operator.");
408 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Seg"),
411 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Tri"),
414 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_NodalTri"),
417 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Quad"),
420 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Tet"),
423 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_NodalTet"),
426 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Pyr"),
429 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Prism"),
432 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_NodalPrism"),
435 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Hex"),
474 ASSERTL0(
false,
"Not valid for this operator.");
478 [[maybe_unused]]
int coll_phys_offset)
override
480 ASSERTL0(
false,
"Not valid for this operator.");
507 BwdTrans_SumFac_Seg::create,
"BwdTrans_SumFac_Seg");
573 ASSERTL0(
false,
"Not valid for this operator.");
577 [[maybe_unused]]
int coll_phys_offset)
override
579 ASSERTL0(
false,
"Not valid for this operator.");
614 BwdTrans_SumFac_Quad::create,
"BwdTrans_SumFac_Quad");
635 int ncoeffs =
m_stdExp->GetNcoeffs();
643 &input[0] + mode, ncoeffs, 0.0,
669 ASSERTL0(
false,
"Not valid for this operator.");
673 [[maybe_unused]]
int coll_phys_offset)
override
675 ASSERTL0(
false,
"Not valid for this operator.");
715 BwdTrans_SumFac_Tri::create,
"BwdTrans_SumFac_Tri");
735 input.get(), 1, output0.get(), 1);
775 ASSERTL0(
false,
"Not valid for this operator.");
779 [[maybe_unused]]
int coll_phys_offset)
override
781 ASSERTL0(
false,
"Not valid for this operator.");
803 m_nquad0(pCollExp[0]->GetNumPoints(0)),
804 m_nquad1(pCollExp[0]->GetNumPoints(1)),
805 m_nquad2(pCollExp[0]->GetNumPoints(2)),
806 m_nmodes0(pCollExp[0]->GetBasisNumModes(0)),
807 m_nmodes1(pCollExp[0]->GetBasisNumModes(1)),
808 m_nmodes2(pCollExp[0]->GetBasisNumModes(2)),
809 m_base0(pCollExp[0]->GetBasis(0)->GetBdata()),
810 m_base1(pCollExp[0]->GetBasis(1)->GetBdata()),
811 m_base2(pCollExp[0]->GetBasis(2)->GetBdata()),
812 m_colldir0(pCollExp[0]->GetBasis(0)->Collocation()),
813 m_colldir1(pCollExp[0]->GetBasis(1)->Collocation()),
814 m_colldir2(pCollExp[0]->GetBasis(2)->Collocation())
825 BwdTrans_SumFac_Hex::create,
"BwdTrans_SumFac_Hex");
854 int ncoeffs =
m_stdExp->GetNcoeffs();
859 for (
int j = 0; j <
m_nmodes1 - i; ++j, ++cnt)
863 input.get() + mode1, ncoeffs, 0.0,
943 ASSERTL0(
false,
"Not valid for this operator.");
947 [[maybe_unused]]
int coll_phys_offset)
override
949 ASSERTL0(
false,
"Not valid for this operator.");
998 BwdTrans_SumFac_Tet::create,
"BwdTrans_SumFac_Tet");
1020 int totmodes =
m_stdExp->GetNcoeffs();
1031 for (i = mode = mode1 = 0; i <
m_nmodes0; ++i)
1038 input.get() + mode1, totmodes, 0.0,
1054 input[1 + i * totmodes + j *
m_nmodes2],
1086 ASSERTL0(
false,
"Not valid for this operator.");
1090 [[maybe_unused]]
int coll_phys_offset)
override
1092 ASSERTL0(
false,
"Not valid for this operator.");
1140 BwdTrans_SumFac_Prism::create,
"BwdTrans_SumFac_Prism");
1162 int totmodes =
m_stdExp->GetNcoeffs();
1177 int ijmax = max(i, j);
1180 input.get() + mode1, totmodes, 0.0,
1189 int ijmax = max(i, j);
1248 ASSERTL0(
false,
"Not valid for this operator.");
1252 [[maybe_unused]]
int coll_phys_offset)
override
1254 ASSERTL0(
false,
"Not valid for this operator.");
1301 BwdTrans_SumFac_Pyr::create,
"BwdTrans_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)
Backward transform help class to calculate the size of the collection that is given as an input and a...
Backward transform operator using default StdRegions operator.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
BwdTrans_IterPerExp(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
~BwdTrans_IterPerExp() final=default
Backward transform operator using matrix free operators.
std::shared_ptr< MatrixFree::BwdTrans > m_oper
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
~BwdTrans_MatrixFree() final=default
BwdTrans_MatrixFree(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Backward transform operator using LocalRegions implementation.
BwdTrans_NoCollection(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~BwdTrans_NoCollection() final=default
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
vector< StdRegions::StdExpansionSharedPtr > m_expList
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Backward transform operator using standard matrix approach.
~BwdTrans_StdMat() final=default
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
BwdTrans_StdMat(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
Backward transform operator using sum-factorisation (Hex)
Array< OneD, const NekDouble > m_base1
~BwdTrans_SumFac_Hex() final=default
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
Array< OneD, const NekDouble > m_base2
Array< OneD, const NekDouble > m_base0
BwdTrans_SumFac_Hex(vector< StdRegions::StdExpansionSharedPtr > 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
Backward transform operator using sum-factorisation (Prism)
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
BwdTrans_SumFac_Prism(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~BwdTrans_SumFac_Prism() final=default
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_base1
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
Array< OneD, const NekDouble > m_base2
Backward transform operator using sum-factorisation (Pyr)
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
~BwdTrans_SumFac_Pyr() final=default
BwdTrans_SumFac_Pyr(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_base1
Array< OneD, const NekDouble > m_base0
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
Backward transform operator using sum-factorisation (Quad)
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
Array< OneD, const NekDouble > m_base0
~BwdTrans_SumFac_Quad() final=default
BwdTrans_SumFac_Quad(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
Backward transform operator using sum-factorisation (Segment)
~BwdTrans_SumFac_Seg() final=default
BwdTrans_SumFac_Seg(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_base0
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Backward transform operator using sum-factorisation (Tet)
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
BwdTrans_SumFac_Tet(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_base1
~BwdTrans_SumFac_Tet() final=default
Array< OneD, const NekDouble > m_base0
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Array< OneD, const NekDouble > m_base2
Backward transform operator using sum-factorisation (Tri)
~BwdTrans_SumFac_Tri() final=default
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
BwdTrans_SumFac_Tri(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
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
bool m_isPadded
flag for padding
unsigned int m_nElmtPad
size after padding
Array< OneD, NekDouble > m_output
Array< OneD, NekDouble > m_input
padded input/output vectors
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.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
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 void Daxpy(const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: y = alpha x plus y.
std::tuple< LibUtilities::ShapeType, OperatorType, ImplementationType, ExpansionIsNodal > OperatorKey
Key for describing an Operator.
std::shared_ptr< CoalescedGeomData > CoalescedGeomDataSharedPtr
OperatorFactory & GetOperatorFactory()
Returns the singleton Operator factory object.
@ eModified_A
Principle Modified Functions .
StdRegions::ConstFactorMap factors
std::shared_ptr< DNekMat > DNekMatSharedPtr
void Zero(int n, T *x, const int incx)
Zero vector.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)