40#include <MatrixFreeOps/Operator.hpp>
76 "Constant factor not defined: " +
82 int shape_dimension =
m_stdExp->GetShapeDimension();
84 for (
int i = 0; i < shape_dimension; ++i)
106 int shape_dimension =
m_stdExp->GetShapeDimension();
108 for (
int i = 0; i < shape_dimension; ++i)
136 (*m_oper)(input, output0);
145 "PhysInterp1DScaled_MatrixFree: Not valid for this operator.");
155 "Constant factor not defined: " +
162 const auto dim =
m_stdExp->GetShapeDimension();
165 std::vector<LibUtilities::BasisSharedPtr> basis(dim);
166 for (
unsigned int i = 0; i < dim; ++i)
173 m_oper->SetScalingFactor(x->second);
179 std::shared_ptr<MatrixFree::PhysInterp1DScaled>
m_oper;
182 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
186 pCollExp[0]->GetStdExp()->GetTotPoints(),
190 const auto dim = pCollExp[0]->GetStdExp()->GetShapeDimension();
193 std::vector<LibUtilities::BasisSharedPtr> basis(dim);
194 for (
unsigned int i = 0; i < dim; ++i)
196 basis[i] = pCollExp[0]->GetBasis(i);
200 auto shapeType = pCollExp[0]->GetStdExp()->DetShapeType();
203 std::string op_string =
"PhysInterp1DScaled";
204 op_string += MatrixFree::GetOpstring(shapeType,
false);
206 op_string, basis, pCollExp.size());
209 std::dynamic_pointer_cast<MatrixFree::PhysInterp1DScaled>(oper);
226 m_oper->SetScalingFactor(scale);
227 m_oper->SetUpInterp1D(basis, scale);
233OperatorKey PhysInterp1DScaled_MatrixFree::m_typeArr[] = {
236 PhysInterp1DScaled_MatrixFree::create,
237 "PhysInterp1DScaled_MatrixFree_Seg"),
240 PhysInterp1DScaled_MatrixFree::create,
241 "PhysInterp1DScaled_MatrixFree_Tri"),
244 PhysInterp1DScaled_MatrixFree::create,
245 "PhysInterp1DScaled_MatrixFree_NodalTri"),
248 PhysInterp1DScaled_MatrixFree::create,
249 "PhysInterp1DScaled_MatrixFree_Quad"),
252 PhysInterp1DScaled_MatrixFree::create,
253 "PhysInterp1DScaled_MatrixFree_Tet"),
256 PhysInterp1DScaled_MatrixFree::create,
257 "PhysInterp1DScaled_MatrixFree_NodalTet"),
260 PhysInterp1DScaled_MatrixFree::create,
261 "PhysInterp1DScaled_MatrixFree_Pyr"),
264 PhysInterp1DScaled_MatrixFree::create,
265 "PhysInterp1DScaled_MatrixFree_Prism"),
268 PhysInterp1DScaled_MatrixFree::create,
269 "PhysInterp1DScaled_MatrixFree_NodalPrism"),
272 PhysInterp1DScaled_MatrixFree::create,
273 "PhysInterp1DScaled_NoCollection_Hex"),
298 int dim{
m_expList[0]->GetShapeDimension()};
307 int npt0 = (int)pt0 * scale;
321 Blas::Dgemv(
'N', npt0, pt0, 1.0, I0->GetPtr().get(), npt0,
322 &input[cnt], 1, 0.0, &output[cnt1], 1);
335 int npt0 = (int)pt0 * scale;
336 int npt1 = (int)pt1 * scale;
359 Blas::Dgemm(
'N',
'T', pt0, npt1, pt1, 1.0, &input[cnt], pt0,
360 I1->GetPtr().get(), npt1, 0.0, wsp.get(), pt0);
363 I0->GetPtr().get(), npt0, wsp.get(), pt0, 0.0,
364 &output[cnt1], npt0);
378 int npt0 = (int)pt0 * scale;
379 int npt1 = (int)pt1 * scale;
380 int npt2 = (int)pt2 * scale;
410 I0->GetPtr().get(), npt0, &input[cnt], pt0, 0.0,
413 for (
int j = 0; j < pt2; j++)
416 wsp2.get() + j * npt0 * pt1, npt0,
417 I1->GetPtr().get(), npt1, 0.0,
418 wsp1.get() + j * npt0 * npt1, npt0);
422 wsp1.get(), npt0 * npt1, I2->GetPtr().get(),
423 npt2, 0.0, &output[cnt1], npt0 * npt1);
425 cnt += pt0 * pt1 * pt2;
426 cnt1 += npt0 * npt1 * npt2;
433 "PhysInterp1DScaled operator.");
443 ASSERTL0(
false,
"Not valid for this operator.");
454 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
467OperatorKey PhysInterp1DScaled_NoCollection::m_typeArr[] = {
470 PhysInterp1DScaled_NoCollection::create,
471 "PhysInterp1DScaled_NoCollection_Seg"),
474 PhysInterp1DScaled_NoCollection::create,
475 "PhysInterp1DScaled_NoCollection_Tri"),
478 PhysInterp1DScaled_NoCollection::create,
479 "PhysInterp1DScaled_NoCollection_NodalTri"),
482 PhysInterp1DScaled_NoCollection::create,
483 "PhysInterp1DScaled_NoCollection_Quad"),
486 PhysInterp1DScaled_NoCollection::create,
487 "PhysInterp1DScaled_NoCollection_Tet"),
490 PhysInterp1DScaled_NoCollection::create,
491 "PhysInterp1DScaled_NoCollection_NodalTet"),
494 PhysInterp1DScaled_NoCollection::create,
495 "PhysInterp1DScaled_NoCollection_Pyr"),
498 PhysInterp1DScaled_NoCollection::create,
499 "PhysInterp1DScaled_NoCollection_Prism"),
502 PhysInterp1DScaled_NoCollection::create,
503 "PhysInterp1DScaled_NoCollection_NodalPrism"),
506 PhysInterp1DScaled_NoCollection::create,
507 "PhysInterp1DScaled_NoCollection_Hex"),
#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)
unsigned int m_nElmtPad
size after padding
unsigned int m_nOut
actural size of output array
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
PhysInterp1DScaled help class to calculate the size of the collection that is given as an input and a...
StdRegions::FactorMap m_factors
PhysInterp1DScaled_Helper()
void UpdateFactors(StdRegions::FactorMap factors) override
Update the supplied factor map.
PhysInterp1DScaled operator using matrix free implementation.
PhysInterp1DScaled_MatrixFree(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
std::shared_ptr< MatrixFree::PhysInterp1DScaled > m_oper
~PhysInterp1DScaled_MatrixFree() final=default
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
void UpdateFactors(StdRegions::FactorMap factors) override
Update the supplied factor map.
PhysInterp1DScaled operator using LocalRegions implementation.
PhysInterp1DScaled_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.
void UpdateFactors(StdRegions::FactorMap factors) override
Update the supplied factor map.
StdRegions::FactorMap m_factors
~PhysInterp1DScaled_NoCollection() final
vector< StdRegions::StdExpansionSharedPtr > m_expList
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
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.
Defines a specification for a set of points.
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 = alpha A x plus beta y where A[m x n].
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...
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.
PointsManagerT & PointsManager(void)
const char *const ConstFactorTypeMap[]
StdRegions::ConstFactorMap factors
std::shared_ptr< DNekMat > DNekMatSharedPtr