39#include <MatrixFreeOps/Operator.hpp>
93 1.0,
m_mat->GetRawPtr(),
m_mat->GetRows(), input.data(),
94 m_stdExp->GetNcoeffs(), 0.0, output0.data(),
103 ASSERTL0(
false,
"Not valid for this operator.");
125 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Seg"),
128 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Tri"),
131 BwdTrans_StdMat::create,
"BwdTrans_StdMat_NodalTri"),
134 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Quad"),
137 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Tet"),
140 BwdTrans_StdMat::create,
"BwdTrans_StdMat_NodalTet"),
143 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Pyr"),
146 "BwdTrans_StdMat_Prism"),
149 BwdTrans_StdMat::create,
"BwdTrans_StdMat_NodalPrism"),
152 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Hex"),
155 BwdTrans_StdMat::create,
"BwdTrans_SumFac_Pyr")};
175 (*m_oper)(input, output0);
184 "BwdTrans_MatrixFree: Not valid for this operator.");
188 std::shared_ptr<MatrixFree::BwdTrans>
m_oper;
194 MatrixFreeBase(pCollExp[0]->GetNcoeffs(), pCollExp[0]->GetTotPoints(),
198 const auto dim = pCollExp[0]->GetShapeDimension();
199 std::vector<LibUtilities::BasisSharedPtr> basis(dim);
200 for (
auto i = 0; i < dim; ++i)
202 basis[i] = pCollExp[0]->GetBasis(i);
206 auto shapeType = pCollExp[0]->DetShapeType();
209 std::string op_string =
"BwdTrans";
210 op_string += MatrixFree::GetOpstring(shapeType,
false);
211 auto oper = MatrixFree::GetOperatorFactory().CreateInstance(
212 op_string, basis, pCollExp.size());
214 oper->SetUpBdata(basis);
216 m_oper = std::dynamic_pointer_cast<MatrixFree::BwdTrans>(oper);
225 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Seg"),
228 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Quad"),
231 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Tri"),
234 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Hex"),
237 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Prism"),
240 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Tet"),
243 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Pyr")};
262 const int nCoeffs =
m_stdExp->GetNcoeffs();
263 const int nPhys =
m_stdExp->GetTotPoints();
268 m_stdExp->BwdTrans(input + i * nCoeffs, tmp = output0 + i * nPhys);
277 ASSERTL0(
false,
"Not valid for this operator.");
293 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Seg"),
296 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Tri"),
299 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_NodalTri"),
302 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Quad"),
305 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Tet"),
308 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_NodalTet"),
311 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Pyr"),
314 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Prism"),
317 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_NodalPrism"),
320 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Hex"),
340 const int nCoeffs =
m_expList[0]->GetNcoeffs();
341 const int nPhys =
m_expList[0]->GetTotPoints();
346 m_expList[i]->BwdTrans(input + i * nCoeffs,
347 tmp = output0 + i * nPhys);
356 ASSERTL0(
false,
"Not valid for this operator.");
376 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Seg"),
379 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Tri"),
382 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_NodalTri"),
385 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Quad"),
388 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Tet"),
391 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_NodalTet"),
394 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Pyr"),
397 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Prism"),
400 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_NodalPrism"),
403 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Hex"),
442 ASSERTL0(
false,
"Not valid for this operator.");
469 BwdTrans_SumFac_Seg::create,
"BwdTrans_SumFac_Seg");
535 ASSERTL0(
false,
"Not valid for this operator.");
570 BwdTrans_SumFac_Quad::create,
"BwdTrans_SumFac_Quad");
591 int ncoeffs =
m_stdExp->GetNcoeffs();
599 &input[0] + mode, ncoeffs, 0.0,
625 ASSERTL0(
false,
"Not valid for this operator.");
641 :
Operator(pCollExp, pGeomData, factors),
665 BwdTrans_SumFac_Tri::create,
"BwdTrans_SumFac_Tri");
685 input.data(), 1, output0.data(), 1);
725 ASSERTL0(
false,
"Not valid for this operator.");
747 m_nquad0(pCollExp[0]->GetNumPoints(0)),
748 m_nquad1(pCollExp[0]->GetNumPoints(1)),
749 m_nquad2(pCollExp[0]->GetNumPoints(2)),
750 m_nmodes0(pCollExp[0]->GetBasisNumModes(0)),
751 m_nmodes1(pCollExp[0]->GetBasisNumModes(1)),
752 m_nmodes2(pCollExp[0]->GetBasisNumModes(2)),
753 m_base0(pCollExp[0]->GetBasis(0)->GetBdata()),
754 m_base1(pCollExp[0]->GetBasis(1)->GetBdata()),
755 m_base2(pCollExp[0]->GetBasis(2)->GetBdata()),
756 m_colldir0(pCollExp[0]->GetBasis(0)->Collocation()),
757 m_colldir1(pCollExp[0]->GetBasis(1)->Collocation()),
758 m_colldir2(pCollExp[0]->GetBasis(2)->Collocation())
769 BwdTrans_SumFac_Hex::create,
"BwdTrans_SumFac_Hex");
798 int ncoeffs =
m_stdExp->GetNcoeffs();
803 for (
int j = 0; j <
m_nmodes1 - i; ++j, ++cnt)
807 input.data() + mode1, ncoeffs, 0.0,
887 ASSERTL0(
false,
"Not valid for this operator.");
936 BwdTrans_SumFac_Tet::create,
"BwdTrans_SumFac_Tet");
958 int totmodes =
m_stdExp->GetNcoeffs();
969 for (i = mode = mode1 = 0; i <
m_nmodes0; ++i)
976 input.data() + mode1, totmodes, 0.0,
1024 ASSERTL0(
false,
"Not valid for this operator.");
1072 BwdTrans_SumFac_Prism::create,
"BwdTrans_SumFac_Prism");
1094 int totmodes =
m_stdExp->GetNcoeffs();
1109 int ijmax =
max(i, j);
1112 input.data() + mode1, totmodes, 0.0,
1179 ASSERTL0(
false,
"Not valid for this operator.");
1226 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() final=default
BwdTrans_IterPerExp(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Backward transform operator using matrix free operators.
std::shared_ptr< MatrixFree::BwdTrans > m_oper
BwdTrans_MatrixFree(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
~BwdTrans_MatrixFree() final=default
Backward transform operator using LocalRegions implementation.
~BwdTrans_NoCollection() final=default
vector< LocalRegions::ExpansionSharedPtr > m_expList
BwdTrans_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
Backward transform operator using standard matrix approach.
~BwdTrans_StdMat() final=default
BwdTrans_StdMat(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
Backward transform operator using sum-factorisation (Hex)
Array< OneD, const NekDouble > m_base1
~BwdTrans_SumFac_Hex() final=default
BwdTrans_SumFac_Hex(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_base2
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
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() final=default
BwdTrans_SumFac_Prism(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_base1
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(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~BwdTrans_SumFac_Pyr() final=default
Array< OneD, const NekDouble > m_base1
Array< OneD, const NekDouble > m_base0
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< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Backward transform operator using sum-factorisation (Segment)
~BwdTrans_SumFac_Seg() final=default
BwdTrans_SumFac_Seg(vector< LocalRegions::ExpansionSharedPtr > 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) final
Backward transform operator using sum-factorisation (Tet)
BwdTrans_SumFac_Tet(vector< LocalRegions::ExpansionSharedPtr > 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
BwdTrans_SumFac_Tri(vector< LocalRegions::ExpansionSharedPtr > 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
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...
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 .
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)
scalarT< T > max(scalarT< T > lhs, scalarT< T > rhs)