38#include <MatrixFreeOps/Operator.hpp>
39#include <boost/core/ignore_unused.hpp>
73 boost::ignore_unused(output1, output2, wsp);
75 1.0,
m_mat->GetRawPtr(),
m_mat->GetRows(), input.get(),
76 m_stdExp->GetNcoeffs(), 0.0, output.get(),
84 boost::ignore_unused(dir, input, output, wsp);
85 ASSERTL0(
false,
"Not valid for this operator.");
89 int coll_phys_offset)
override
91 boost::ignore_unused(
factors, coll_phys_offset);
92 ASSERTL0(
false,
"Not valid for this operator.");
114 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Seg"),
117 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Tri"),
120 BwdTrans_StdMat::create,
"BwdTrans_StdMat_NodalTri"),
123 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Quad"),
126 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Tet"),
129 BwdTrans_StdMat::create,
"BwdTrans_StdMat_NodalTet"),
132 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Pyr"),
135 "BwdTrans_StdMat_Prism"),
138 "BwdTrans_StdMat_NodalPrism"),
141 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Hex"),
144 BwdTrans_StdMat::create,
"BwdTrans_SumFac_Pyr")};
164 boost::ignore_unused(output1, output2, wsp);
177 (*m_oper)(input, output0);
185 boost::ignore_unused(dir, input, output, wsp);
187 "BwdTrans_MatrixFree: Not valid for this operator.");
191 int coll_phys_offset)
override
193 boost::ignore_unused(
factors, coll_phys_offset);
194 ASSERTL0(
false,
"Not valid for this operator.");
198 std::shared_ptr<MatrixFree::BwdTrans>
m_oper;
205 pCollExp[0]->GetStdExp()->GetTotPoints(),
209 const auto dim = pCollExp[0]->GetStdExp()->GetShapeDimension();
210 std::vector<LibUtilities::BasisSharedPtr> basis(dim);
211 for (
auto i = 0; i < dim; ++i)
213 basis[i] = pCollExp[0]->GetBasis(i);
217 auto shapeType = pCollExp[0]->GetStdExp()->DetShapeType();
220 std::string op_string =
"BwdTrans";
221 op_string += MatrixFree::GetOpstring(shapeType,
false);
225 m_oper = std::dynamic_pointer_cast<MatrixFree::BwdTrans>(oper);
234 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Seg"),
237 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Quad"),
240 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Tri"),
243 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Hex"),
246 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Prism"),
249 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Tet"),
252 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Pyr")};
272 boost::ignore_unused(output1, output2, wsp);
274 const int nCoeffs =
m_stdExp->GetNcoeffs();
275 const int nPhys =
m_stdExp->GetTotPoints();
280 m_stdExp->BwdTrans(input + i * nCoeffs, tmp = output + i * nPhys);
288 boost::ignore_unused(dir, input, output, wsp);
289 ASSERTL0(
false,
"Not valid for this operator.");
293 int coll_phys_offset)
override
295 boost::ignore_unused(
factors, coll_phys_offset);
296 ASSERTL0(
false,
"Not valid for this operator.");
312 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Seg"),
315 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Tri"),
318 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_NodalTri"),
321 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Quad"),
324 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Tet"),
327 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_NodalTet"),
330 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Pyr"),
333 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Prism"),
336 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_NodalPrism"),
339 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Hex"),
360 boost::ignore_unused(output1, output2, wsp);
362 const int nCoeffs =
m_expList[0]->GetNcoeffs();
363 const int nPhys =
m_expList[0]->GetTotPoints();
368 m_expList[i]->BwdTrans(input + i * nCoeffs,
369 tmp = output + i * nPhys);
377 boost::ignore_unused(dir, input, output, wsp);
378 ASSERTL0(
false,
"Not valid for this operator.");
382 int coll_phys_offset)
override
384 boost::ignore_unused(
factors, coll_phys_offset);
385 ASSERTL0(
false,
"Not valid for this operator.");
405 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Seg"),
408 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Tri"),
411 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_NodalTri"),
414 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Quad"),
417 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Tet"),
420 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_NodalTet"),
423 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Pyr"),
426 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Prism"),
429 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_NodalPrism"),
432 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Hex"),
453 boost::ignore_unused(output1, output2, wsp);
472 boost::ignore_unused(dir, input, output, wsp);
473 ASSERTL0(
false,
"Not valid for this operator.");
477 int coll_phys_offset)
override
479 boost::ignore_unused(
factors, coll_phys_offset);
480 ASSERTL0(
false,
"Not valid for this operator.");
507 BwdTrans_SumFac_Seg::create,
"BwdTrans_SumFac_Seg");
527 boost::ignore_unused(output1, output2);
578 boost::ignore_unused(dir, input, output, wsp);
579 ASSERTL0(
false,
"Not valid for this operator.");
583 int coll_phys_offset)
override
585 boost::ignore_unused(
factors, coll_phys_offset);
586 ASSERTL0(
false,
"Not valid for this operator.");
621 BwdTrans_SumFac_Quad::create,
"BwdTrans_SumFac_Quad");
641 boost::ignore_unused(output1, output2);
645 int ncoeffs =
m_stdExp->GetNcoeffs();
653 &input[0] + mode, ncoeffs, 0.0,
678 boost::ignore_unused(dir, input, output, wsp);
679 ASSERTL0(
false,
"Not valid for this operator.");
683 int coll_phys_offset)
override
685 boost::ignore_unused(
factors, coll_phys_offset);
686 ASSERTL0(
false,
"Not valid for this operator.");
726 BwdTrans_SumFac_Tri::create,
"BwdTrans_SumFac_Tri");
744 boost::ignore_unused(output1, output2);
749 input.get(), 1, output.get(), 1);
788 boost::ignore_unused(dir, input, output, wsp);
789 ASSERTL0(
false,
"Not valid for this operator.");
793 int coll_phys_offset)
override
795 boost::ignore_unused(
factors, coll_phys_offset);
796 ASSERTL0(
false,
"Not valid for this operator.");
818 m_nquad0(pCollExp[0]->GetNumPoints(0)),
819 m_nquad1(pCollExp[0]->GetNumPoints(1)),
820 m_nquad2(pCollExp[0]->GetNumPoints(2)),
821 m_nmodes0(pCollExp[0]->GetBasisNumModes(0)),
822 m_nmodes1(pCollExp[0]->GetBasisNumModes(1)),
823 m_nmodes2(pCollExp[0]->GetBasisNumModes(2)),
824 m_base0(pCollExp[0]->GetBasis(0)->GetBdata()),
825 m_base1(pCollExp[0]->GetBasis(1)->GetBdata()),
826 m_base2(pCollExp[0]->GetBasis(2)->GetBdata()),
827 m_colldir0(pCollExp[0]->GetBasis(0)->Collocation()),
828 m_colldir1(pCollExp[0]->GetBasis(1)->Collocation()),
829 m_colldir2(pCollExp[0]->GetBasis(2)->Collocation())
840 BwdTrans_SumFac_Hex::create,
"BwdTrans_SumFac_Hex");
860 boost::ignore_unused(output1, output2);
872 int ncoeffs =
m_stdExp->GetNcoeffs();
877 for (
int j = 0; j <
m_nmodes1 - i; ++j, ++cnt)
881 input.get() + mode1, ncoeffs, 0.0,
960 boost::ignore_unused(dir, input, output, wsp);
961 ASSERTL0(
false,
"Not valid for this operator.");
965 int coll_phys_offset)
override
967 boost::ignore_unused(
factors, coll_phys_offset);
968 ASSERTL0(
false,
"Not valid for this operator.");
1017 BwdTrans_SumFac_Tet::create,
"BwdTrans_SumFac_Tet");
1037 boost::ignore_unused(output1, output2);
1042 int totmodes =
m_stdExp->GetNcoeffs();
1053 for (i = mode = mode1 = 0; i <
m_nmodes0; ++i)
1060 input.get() + mode1, totmodes, 0.0,
1076 input[1 + i * totmodes + j *
m_nmodes2],
1107 boost::ignore_unused(dir, input, output, wsp);
1108 ASSERTL0(
false,
"Not valid for this operator.");
1112 int coll_phys_offset)
override
1114 boost::ignore_unused(
factors, coll_phys_offset);
1115 ASSERTL0(
false,
"Not valid for this operator.");
1163 BwdTrans_SumFac_Prism::create,
"BwdTrans_SumFac_Prism");
1183 boost::ignore_unused(output1, output2);
1188 int totmodes =
m_stdExp->GetNcoeffs();
1203 int ijmax = max(i, j);
1206 input.get() + mode1, totmodes, 0.0,
1215 int ijmax = max(i, j);
1273 boost::ignore_unused(dir, input, output, wsp);
1274 ASSERTL0(
false,
"Not valid for this operator.");
1278 int coll_phys_offset)
override
1280 boost::ignore_unused(
factors, coll_phys_offset);
1281 ASSERTL0(
false,
"Not valid for this operator.");
1328 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 operator using default StdRegions operator.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
~BwdTrans_IterPerExp() final
BwdTrans_IterPerExp(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) override
Perform operation.
Backward transform operator using matrix free operators.
std::shared_ptr< MatrixFree::BwdTrans > m_oper
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output0, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) override final
Perform operation.
~BwdTrans_MatrixFree() final
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
BwdTrans_MatrixFree(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Backward transform operator using LocalRegions implementation.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
BwdTrans_NoCollection(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) override
Perform operation.
vector< StdRegions::StdExpansionSharedPtr > m_expList
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
~BwdTrans_NoCollection() final
Backward transform operator using standard matrix approach.
virtual 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) override final
BwdTrans_StdMat(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) override
Perform operation.
Backward transform operator using sum-factorisation (Hex)
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) override
Perform operation.
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
Array< OneD, const NekDouble > m_base1
~BwdTrans_SumFac_Hex() final
Array< OneD, const NekDouble > m_base2
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
Array< OneD, const NekDouble > m_base0
BwdTrans_SumFac_Hex(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Backward transform operator using sum-factorisation (Prism)
~BwdTrans_SumFac_Prism() final
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
BwdTrans_SumFac_Prism(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) override final
Perform operation.
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) override final
Array< OneD, const NekDouble > m_base2
Backward transform operator using sum-factorisation (Pyr)
Array< OneD, const NekDouble > m_base2
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) override final
Perform operation.
~BwdTrans_SumFac_Pyr() final
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
BwdTrans_SumFac_Pyr(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_base1
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
Array< OneD, const NekDouble > m_base0
Backward transform operator using sum-factorisation (Quad)
Array< OneD, const NekDouble > m_base1
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
~BwdTrans_SumFac_Quad() final
Array< OneD, const NekDouble > m_base0
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) override
Perform operation.
BwdTrans_SumFac_Quad(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Backward transform operator using sum-factorisation (Segment)
~BwdTrans_SumFac_Seg() final
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
BwdTrans_SumFac_Seg(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_base0
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) override
Perform operation.
Backward transform operator using sum-factorisation (Tet)
BwdTrans_SumFac_Tet(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
virtual 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) override final
Array< OneD, const NekDouble > m_base1
~BwdTrans_SumFac_Tet() final
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_base2
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) override final
Perform operation.
Backward transform operator using sum-factorisation (Tri)
BwdTrans_SumFac_Tri(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) override
Perform operation.
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_base1
~BwdTrans_SumFac_Tri() final
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override 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
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
The above copyright notice and this permission notice shall be included.
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)