38#include <MatrixFreeOps/Operator.hpp>
90 int nPhys =
m_stdExp->GetTotPoints();
99 for (
int i = 0; i <
m_dim; ++i)
101 Diff[i] = wsp + i * ntot;
105 for (
int i = 0; i <
m_dim; ++i)
110 input.get(), nPhys, 0.0, &Diff[i][0], nPhys);
119 for (
int j = 0; j <
m_dim; ++j)
122 out[i], 1, out[i], 1);
134 for (
int j = 0; j <
m_dim; ++j)
138 1, t = out[i] + e *
m_nqe, 1);
149 int nPhys =
m_stdExp->GetTotPoints();
154 for (
int i = 0; i <
m_dim; ++i)
156 Diff[i] = wsp + i * ntot;
160 for (
int i = 0; i <
m_dim; ++i)
165 input.get(), nPhys, 0.0, &Diff[i][0], nPhys);
172 for (
int j = 0; j <
m_dim; ++j)
175 output, 1, output, 1);
183 for (
int j = 0; j <
m_dim; ++j)
186 Diff[j] + e *
m_nqe, 1, output + e *
m_nqe, 1,
187 t = output + e *
m_nqe, 1);
194 [[maybe_unused]]
int coll_phys_offset)
override
196 ASSERTL0(
false,
"Not valid for this operator.");
211 int nqtot = pCollExp[0]->GetTotPoints();
212 m_dim = pCollExp[0]->GetShapeDimension();
217 for (
int i = 0; i <
m_dim; ++i)
222 for (
int j = 0; j < nqtot; ++j)
228 &(
m_derivMat[i]->GetPtr())[0] + j * nqtot, 1);
231 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
240 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Seg"),
243 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Tri"),
246 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_NodalTri"),
249 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Quad"),
252 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Tet"),
255 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_NodalTet"),
258 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Pyr"),
261 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Prism"),
264 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_NodalPrism"),
267 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Hex"),
270 PhysDeriv_StdMat::create,
"PhysDeriv_SumFac_Pyr")};
342 [[maybe_unused]]
int coll_phys_offset)
override
344 ASSERTL0(
false,
"Not valid for this operator.");
348 std::shared_ptr<MatrixFree::PhysDeriv>
m_oper;
355 pCollExp[0]->GetStdExp()->GetTotPoints(),
356 pCollExp[0]->GetStdExp()->GetTotPoints(),
360 bool deformed{pGeomData->IsDeformed(pCollExp)};
361 const auto dim = pCollExp[0]->GetStdExp()->GetShapeDimension();
365 int nOut = pCollExp[0]->GetStdExp()->GetTotPoints();
380 std::vector<LibUtilities::BasisSharedPtr> basis(dim);
381 for (
unsigned int i = 0; i < dim; ++i)
383 basis[i] = pCollExp[0]->GetBasis(i);
387 auto shapeType = pCollExp[0]->GetStdExp()->DetShapeType();
390 std::string op_string =
"PhysDeriv";
391 op_string += MatrixFree::GetOpstring(shapeType, deformed);
396 oper->SetDF(pGeomData->GetDerivFactorsInterLeave(pCollExp,
m_nElmtPad));
398 m_oper = std::dynamic_pointer_cast<MatrixFree::PhysDeriv>(oper);
407 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Seg"),
410 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Tri"),
413 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Quad"),
416 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Hex"),
419 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Prism"),
422 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Pyr"),
425 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Tet")
446 int nPhys =
m_stdExp->GetTotPoints();
455 for (
int i = 0; i <
m_dim; ++i)
457 Diff[i] = wsp + i * ntot;
463 m_stdExp->PhysDeriv(input + i * nPhys, tmp0 = Diff[0] + i * nPhys,
464 tmp1 = Diff[1] + i * nPhys,
465 tmp2 = Diff[2] + i * nPhys);
475 for (
int j = 1; j <
m_dim; ++j)
478 out[i], 1, out[i], 1);
490 Diff[0] + e *
m_nqe, 1, t = out[i] + e *
m_nqe,
492 for (
int j = 1; j <
m_dim; ++j)
496 1, t = out[i] + e *
m_nqe, 1);
507 int nPhys =
m_stdExp->GetTotPoints();
512 for (
int i = 0; i <
m_dim; ++i)
514 Diff[i] = wsp + i * ntot;
520 m_stdExp->PhysDeriv(input + i * nPhys, tmp0 = Diff[0] + i * nPhys,
521 tmp1 = Diff[1] + i * nPhys,
522 tmp2 = Diff[2] + i * nPhys);
528 for (
int j = 0; j <
m_dim; ++j)
531 output, 1, output, 1);
539 for (
int j = 0; j <
m_dim; ++j)
542 Diff[j] + e *
m_nqe, 1, output + e *
m_nqe, 1,
543 t = output + e *
m_nqe, 1);
550 [[maybe_unused]]
int coll_phys_offset)
override
552 ASSERTL0(
false,
"Not valid for this operator.");
566 int nqtot = pCollExp[0]->GetTotPoints();
567 m_dim = pCollExp[0]->GetShapeDimension();
570 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
579 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Seg"),
582 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Tri"),
585 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_NodalTri"),
588 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Quad"),
591 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Tet"),
594 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_NodalTet"),
597 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Pyr"),
600 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Prism"),
603 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_NodalPrism"),
606 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Hex")};
625 const int nPhys =
m_expList[0]->GetTotPoints();
629 switch (
m_expList[0]->GetShapeDimension())
635 m_expList[i]->PhysDeriv(input + i * nPhys,
636 tmp0 = output0 + i * nPhys);
644 m_expList[i]->PhysDeriv(input + i * nPhys,
645 tmp0 = output0 + i * nPhys,
646 tmp1 = output1 + i * nPhys);
655 input + i * nPhys, tmp0 = output0 + i * nPhys,
656 tmp1 = output1 + i * nPhys, tmp2 = output2 + i * nPhys);
661 ASSERTL0(
false,
"Unknown dimension.");
669 const int nPhys =
m_expList[0]->GetTotPoints();
675 m_expList[i]->PhysDeriv(dir, input + i * nPhys,
676 tmp = output + i * nPhys);
681 [[maybe_unused]]
int coll_phys_offset)
override
683 ASSERTL0(
false,
"Not valid for this operator.");
703 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Seg"),
706 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Tri"),
709 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_NodalTri"),
712 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Quad"),
715 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Tet"),
718 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_NodalTet"),
721 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Pyr"),
724 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Prism"),
727 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_NodalPrism"),
730 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Hex")};
752 ASSERTL1(input.size() >= nqcol,
"Incorrect input size");
780 t = output0 + e *
m_nqe, 1);
788 t = output1 + e *
m_nqe, 1);
796 t = output1 + e *
m_nqe, 1);
798 t = output2 + e *
m_nqe, 1);
811 ASSERTL1(input.size() >= nqcol,
"Incorrect input size");
829 t = output + e *
m_nqe, 1);
835 [[maybe_unused]]
int coll_phys_offset)
override
837 ASSERTL0(
false,
"Not valid for this operator.");
855 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
866 PhysDeriv_SumFac_Seg::create,
"PhysDeriv_SumFac_Seg");
889 ASSERTL1(input.size() >= nqcol,
"Incorrect input size");
899 for (
int i = 0; i <
m_numElmt; ++i, cnt += nqtot)
928 t = output0 + e *
m_nqe, 1);
930 output0 + e *
m_nqe, 1, t = output0 + e *
m_nqe,
934 t = output1 + e *
m_nqe, 1);
936 output1 + e *
m_nqe, 1, t = output1 + e *
m_nqe,
945 t = output2 + e *
m_nqe, 1);
947 output2 + e *
m_nqe, 1,
948 t = output2 + e *
m_nqe, 1);
962 ASSERTL1(input.size() >= nqcol,
"Incorrect input size");
972 for (
int i = 0; i <
m_numElmt; ++i, cnt += nqtot)
991 t = output + e *
m_nqe, 1);
994 t = output + e *
m_nqe, 1);
1000 [[maybe_unused]]
int coll_phys_offset)
override
1002 ASSERTL0(
false,
"Not valid for this operator.");
1023 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1035 PhysDeriv_SumFac_Quad::create,
"PhysDeriv_SumFac_Quad");
1058 ASSERTL1(input.size() >= nqcol,
"Incorrect input size");
1069 for (
int i = 0; i <
m_numElmt; ++i, cnt += nqtot)
1073 diff0.get() + cnt, 1);
1081 diff1.get() + cnt, 1, diff1.get() + cnt, 1);
1106 t = output0 + e *
m_nqe, 1);
1108 output0 + e *
m_nqe, 1, t = output0 + e *
m_nqe,
1112 t = output1 + e *
m_nqe, 1);
1114 output1 + e *
m_nqe, 1, t = output1 + e *
m_nqe,
1123 t = output2 + e *
m_nqe, 1);
1125 output2 + e *
m_nqe, 1,
1126 t = output2 + e *
m_nqe, 1);
1140 ASSERTL1(input.size() >= nqcol,
"Incorrect input size");
1151 for (
int i = 0; i <
m_numElmt; ++i, cnt += nqtot)
1155 diff0.get() + cnt, 1);
1163 diff1.get() + cnt, 1, diff1.get() + cnt, 1);
1178 t = output + e *
m_nqe, 1);
1181 t = output + e *
m_nqe, 1);
1187 [[maybe_unused]]
int coll_phys_offset)
override
1189 ASSERTL0(
false,
"Not valid for this operator.");
1212 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1246 PhysDeriv_SumFac_Tri::create,
"PhysDeriv_SumFac_Tri"),
1249 PhysDeriv_SumFac_Tri::create,
"PhysDeriv_SumFac_NodalTri")};
1268 int nPhys =
m_stdExp->GetTotPoints();
1277 for (
int i = 0; i < 3; ++i)
1279 Diff[i] = wsp + i * ntot;
1299 m_nquad2, 0.0, &Diff[2][i * nPhys],
1309 for (
int j = 1; j < 3; ++j)
1312 out[i], 1, out[i], 1);
1324 Diff[0] + e *
m_nqe, 1, t = out[i] + e *
m_nqe,
1327 for (
int j = 1; j < 3; ++j)
1331 1, t = out[i] + e *
m_nqe, 1);
1342 int nPhys =
m_stdExp->GetTotPoints();
1347 for (
int i = 0; i < 3; ++i)
1349 Diff[i] = wsp + i * ntot;
1369 m_nquad2, 0.0, &Diff[2][i * nPhys],
1378 for (
int j = 1; j < 3; ++j)
1381 output, 1, output, 1);
1390 1, t = output + e *
m_nqe, 1);
1392 for (
int j = 1; j < 3; ++j)
1395 Diff[j] + e *
m_nqe, 1, output + e *
m_nqe, 1,
1396 t = output + e *
m_nqe, 1);
1403 [[maybe_unused]]
int coll_phys_offset)
override
1405 ASSERTL0(
false,
"Not valid for this operator.");
1429 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1443 PhysDeriv_SumFac_Hex::create,
"PhysDeriv_SumFac_Hex")};
1462 int nPhys =
m_stdExp->GetTotPoints();
1471 for (
int i = 0; i < 3; ++i)
1473 Diff[i] = wsp + i * ntot;
1486 m_nquad2, 0.0, &Diff[2][i * nPhys],
1504 Diff[2].get() + i * nPhys, 1,
1505 Diff[2].get() + i * nPhys, 1);
1509 Diff[1].get() + i * nPhys, 1);
1513 Diff[1].get() + i * nPhys, 1,
1514 Diff[1].get() + i * nPhys, 1);
1518 Diff[2].get() + i * nPhys, 1,
1519 Diff[2].get() + i * nPhys, 1);
1523 Diff[0].get() + i * nPhys, 1);
1532 for (
int j = 1; j < 3; ++j)
1535 out[i], 1, out[i], 1);
1547 Diff[0] + e *
m_nqe, 1, t = out[i] + e *
m_nqe,
1549 for (
int j = 1; j < 3; ++j)
1553 1, t = out[i] + e *
m_nqe, 1);
1564 int nPhys =
m_stdExp->GetTotPoints();
1569 for (
int i = 0; i < 3; ++i)
1571 Diff[i] = wsp + i * ntot;
1584 m_nquad2, 0.0, &Diff[2][i * nPhys],
1602 Diff[2].get() + i * nPhys, 1,
1603 Diff[2].get() + i * nPhys, 1);
1607 Diff[1].get() + i * nPhys, 1);
1611 Diff[1].get() + i * nPhys, 1,
1612 Diff[1].get() + i * nPhys, 1);
1616 Diff[2].get() + i * nPhys, 1,
1617 Diff[2].get() + i * nPhys, 1);
1621 Diff[0].get() + i * nPhys, 1);
1629 for (
int j = 1; j < 3; ++j)
1632 output, 1, output, 1);
1641 1, t = output + e *
m_nqe, 1);
1642 for (
int j = 1; j < 3; ++j)
1645 Diff[j] + e *
m_nqe, 1, output + e *
m_nqe, 1,
1646 t = output + e *
m_nqe, 1);
1653 [[maybe_unused]]
int coll_phys_offset)
override
1655 ASSERTL0(
false,
"Not valid for this operator.");
1683 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1708 4.0 / ((1 - z1[j]) * (1 - z2[k]));
1710 2.0 * (1 + z0[i]) / ((1 - z1[j]) * (1 - z2[k]));
1714 (1 + z1[j]) / (1 - z2[k]);
1725 PhysDeriv_SumFac_Tet::create,
"PhysDeriv_SumFac_Tet")};
1744 int nPhys =
m_stdExp->GetTotPoints();
1753 for (
int i = 0; i < 3; ++i)
1755 Diff[i] = wsp + i * ntot;
1779 m_nquad2, 0.0, &Diff[2][i * nPhys],
1784 Diff[0].get() + cnt, 1);
1788 Diff[2].get() + cnt, 1, Diff[2].get() + cnt, 1);
1798 for (
int j = 1; j < 3; ++j)
1801 out[i], 1, out[i], 1);
1813 Diff[0] + e *
m_nqe, 1, t = out[i] + e *
m_nqe,
1816 for (
int j = 1; j < 3; ++j)
1820 1, t = out[i] + e *
m_nqe, 1);
1831 int nPhys =
m_stdExp->GetTotPoints();
1836 for (
int i = 0; i < 3; ++i)
1838 Diff[i] = wsp + i * ntot;
1862 m_nquad2, 0.0, &Diff[2][i * nPhys],
1867 Diff[0].get() + cnt, 1);
1871 Diff[2].get() + cnt, 1, Diff[2].get() + cnt, 1);
1880 for (
int j = 1; j < 3; ++j)
1883 output, 1, output, 1);
1892 1, t = output + e *
m_nqe, 1);
1894 for (
int j = 1; j < 3; ++j)
1897 Diff[j] + e *
m_nqe, 1, output + e *
m_nqe, 1,
1898 t = output + e *
m_nqe, 1);
1905 [[maybe_unused]]
int coll_phys_offset)
override
1907 ASSERTL0(
false,
"Not valid for this operator.");
1933 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1962OperatorKey PhysDeriv_SumFac_Prism::m_typeArr[] = {
1965 PhysDeriv_SumFac_Prism::create,
"PhysDeriv_SumFac_Prism")};
1984 int nPhys =
m_stdExp->GetTotPoints();
1993 for (
int i = 0; i < 3; ++i)
1995 Diff[i] = wsp + i * ntot;
2019 m_nquad2, 0.0, &Diff[2][i * nPhys],
2024 Diff[0].get() + cnt, 1);
2028 Diff[1].get() + cnt, 1);
2032 Diff[2].get() + cnt, 1, Diff[2].get() + cnt, 1);
2036 Diff[2].get() + cnt, 1, Diff[2].get() + cnt, 1);
2046 for (
int j = 1; j < 3; ++j)
2049 out[i], 1, out[i], 1);
2061 Diff[0] + e *
m_nqe, 1, t = out[i] + e *
m_nqe,
2064 for (
int j = 1; j < 3; ++j)
2068 1, t = out[i] + e *
m_nqe, 1);
2079 int nPhys =
m_stdExp->GetTotPoints();
2084 for (
int i = 0; i < 3; ++i)
2086 Diff[i] = wsp + i * ntot;
2110 m_nquad2, 0.0, &Diff[2][i * nPhys],
2115 Diff[0].get() + cnt, 1);
2119 Diff[1].get() + cnt, 1);
2123 Diff[2].get() + cnt, 1, Diff[2].get() + cnt, 1);
2127 Diff[2].get() + cnt, 1, Diff[2].get() + cnt, 1);
2136 for (
int j = 1; j < 3; ++j)
2139 output, 1, output, 1);
2148 1, t = output + e *
m_nqe, 1);
2150 for (
int j = 1; j < 3; ++j)
2153 Diff[j] + e *
m_nqe, 1, output + e *
m_nqe, 1,
2154 t = output + e *
m_nqe, 1);
2161 [[maybe_unused]]
int coll_phys_offset)
override
2163 ASSERTL0(
false,
"Not valid for this operator.");
2190 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
2207 m_fac0[ifac + k * nq0_nq1] = 2.0 / (1 - z2[k]);
2208 m_fac1[ifac + k * nq0_nq1] = 0.5 * (1 + z0[i]);
2209 m_fac2[ifac + k * nq0_nq1] = 0.5 * (1 + z1[j]);
2226 PhysDeriv_SumFac_Pyr::create,
"PhysDeriv_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)
bool m_isPadded
flag for padding
unsigned int m_nElmtPad
size after padding
Array< OneD, NekDouble > m_input
padded input/output vectors
unsigned short m_coordim
coordinates dimension
Array< OneD, Array< OneD, NekDouble > > m_output
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
Physical Derivative help class to calculate the size of the collection that is given as an input and ...
Phys deriv operator using element-wise operation.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
PhysDeriv_IterPerExp(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< TwoD, const NekDouble > m_derivFac
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
~PhysDeriv_IterPerExp() final=default
Phys deriv operator using matrix free operators.
PhysDeriv_MatrixFree(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~PhysDeriv_MatrixFree() final=default
std::shared_ptr< MatrixFree::PhysDeriv > 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
Phys deriv operator using original LocalRegions implementation.
~PhysDeriv_NoCollection() final=default
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
PhysDeriv_NoCollection(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
vector< StdRegions::StdExpansionSharedPtr > m_expList
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
Phys deriv operator using standard matrix approach.
Array< TwoD, const NekDouble > m_derivFac
Array< OneD, DNekMatSharedPtr > m_derivMat
PhysDeriv_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.
~PhysDeriv_StdMat() final=default
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Phys deriv operator using sum-factorisation (Hex)
PhysDeriv_SumFac_Hex(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.
Array< TwoD, const NekDouble > m_derivFac
~PhysDeriv_SumFac_Hex() final=default
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Phys deriv operator using sum-factorisation (Prism)
Array< OneD, NekDouble > m_fac1
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Array< TwoD, const NekDouble > m_derivFac
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
~PhysDeriv_SumFac_Prism() final=default
PhysDeriv_SumFac_Prism(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, NekDouble > m_fac0
Phys deriv operator using sum-factorisation (Pyramid)
PhysDeriv_SumFac_Pyr(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.
Array< OneD, NekDouble > m_fac1
Array< OneD, NekDouble > m_fac2
Array< TwoD, const NekDouble > m_derivFac
Array< OneD, NekDouble > m_fac0
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
~PhysDeriv_SumFac_Pyr() final=default
Phys deriv operator using sum-factorisation (Quad)
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
~PhysDeriv_SumFac_Quad() final=default
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
PhysDeriv_SumFac_Quad(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< TwoD, const NekDouble > m_derivFac
Phys deriv operator using sum-factorisation (Segment)
PhysDeriv_SumFac_Seg(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~PhysDeriv_SumFac_Seg() final=default
Array< TwoD, const NekDouble > m_derivFac
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
Phys deriv operator using sum-factorisation (Tet)
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Array< OneD, NekDouble > m_fac2
Array< OneD, NekDouble > m_fac1
PhysDeriv_SumFac_Tet(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, NekDouble > m_fac0
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
Array< TwoD, const NekDouble > m_derivFac
Array< OneD, NekDouble > m_fac3
~PhysDeriv_SumFac_Tet() final=default
Phys deriv operator using sum-factorisation (Tri)
PhysDeriv_SumFac_Tri(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~PhysDeriv_SumFac_Tri() final=default
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Array< OneD, NekDouble > m_fac1
Array< TwoD, const NekDouble > m_derivFac
void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
Array< OneD, NekDouble > m_fac0
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 std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
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.
StdRegions::ConstFactorMap factors
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 Svtvp(int n, const T alpha, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Svtvp (scalar times vector plus vector): z = alpha*x + y.
void Vvtvp(int n, const T *w, const int incw, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
vvtvp (vector times vector plus vector): z = w*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.
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)