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);
205 int nqtot = pCollExp[0]->GetTotPoints();
206 m_dim = pCollExp[0]->GetShapeDimension();
211 for (
int i = 0; i <
m_dim; ++i)
216 for (
int j = 0; j < nqtot; ++j)
222 &(
m_derivMat[i]->GetPtr())[0] + j * nqtot, 1);
225 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
234 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Seg"),
237 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Tri"),
240 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_NodalTri"),
243 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Quad"),
246 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Tet"),
249 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_NodalTet"),
252 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Pyr"),
255 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Prism"),
258 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_NodalPrism"),
261 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Hex"),
264 PhysDeriv_StdMat::create,
"PhysDeriv_SumFac_Pyr")};
306 (*m_oper)(input, output);
318 std::shared_ptr<MatrixFree::PhysDeriv>
m_oper;
327 pCollExp[0]->GetStdExp()->GetTotPoints(),
331 bool deformed{pGeomData->IsDeformed(pCollExp)};
332 const auto dim = pCollExp[0]->GetStdExp()->GetShapeDimension();
336 int nOut = pCollExp[0]->GetStdExp()->GetTotPoints();
350 std::vector<LibUtilities::BasisSharedPtr> basis(dim);
351 for (
unsigned int i = 0; i < dim; ++i)
353 basis[i] = pCollExp[0]->GetBasis(i);
357 auto shapeType = pCollExp[0]->GetStdExp()->DetShapeType();
360 std::string op_string =
"PhysDeriv";
361 op_string += MatrixFree::GetOpstring(shapeType, deformed);
363 op_string, basis, pCollExp.size());
365 oper->SetUpZW(basis);
369 oper->SetDF(pGeomData->GetDerivFactorsInterLeave(pCollExp,
m_nElmtPad));
371 m_oper = std::dynamic_pointer_cast<MatrixFree::PhysDeriv>(oper);
380 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Seg"),
383 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Tri"),
386 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Quad"),
389 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Hex"),
392 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Prism"),
395 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Pyr"),
398 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Tet")
419 int nPhys =
m_stdExp->GetTotPoints();
428 for (
int i = 0; i <
m_dim; ++i)
430 Diff[i] = wsp + i * ntot;
436 m_stdExp->PhysDeriv(input + i * nPhys, tmp0 = Diff[0] + i * nPhys,
437 tmp1 = Diff[1] + i * nPhys,
438 tmp2 = Diff[2] + i * nPhys);
448 for (
int j = 1; j <
m_dim; ++j)
451 out[i], 1, out[i], 1);
463 Diff[0] + e *
m_nqe, 1, t = out[i] + e *
m_nqe,
465 for (
int j = 1; j <
m_dim; ++j)
469 1, t = out[i] + e *
m_nqe, 1);
480 int nPhys =
m_stdExp->GetTotPoints();
485 for (
int i = 0; i <
m_dim; ++i)
487 Diff[i] = wsp + i * ntot;
493 m_stdExp->PhysDeriv(input + i * nPhys, tmp0 = Diff[0] + i * nPhys,
494 tmp1 = Diff[1] + i * nPhys,
495 tmp2 = Diff[2] + i * nPhys);
501 for (
int j = 0; j <
m_dim; ++j)
504 output, 1, output, 1);
512 for (
int j = 0; j <
m_dim; ++j)
515 Diff[j] + e *
m_nqe, 1, output + e *
m_nqe, 1,
516 t = output + e *
m_nqe, 1);
533 int nqtot = pCollExp[0]->GetTotPoints();
534 m_dim = pCollExp[0]->GetShapeDimension();
537 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
546 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Seg"),
549 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Tri"),
552 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_NodalTri"),
555 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Quad"),
558 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Tet"),
561 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_NodalTet"),
564 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Pyr"),
567 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Prism"),
570 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_NodalPrism"),
573 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Hex")};
592 const int nPhys =
m_expList[0]->GetTotPoints();
596 switch (
m_expList[0]->GetShapeDimension())
602 m_expList[i]->PhysDeriv(input + i * nPhys,
603 tmp0 = output0 + i * nPhys);
611 m_expList[i]->PhysDeriv(input + i * nPhys,
612 tmp0 = output0 + i * nPhys,
613 tmp1 = output1 + i * nPhys);
622 input + i * nPhys, tmp0 = output0 + i * nPhys,
623 tmp1 = output1 + i * nPhys, tmp2 = output2 + i * nPhys);
628 ASSERTL0(
false,
"Unknown dimension.");
636 const int nPhys =
m_expList[0]->GetTotPoints();
642 m_expList[i]->PhysDeriv(dir, input + i * nPhys,
643 tmp = output + i * nPhys);
664 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Seg"),
667 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Tri"),
670 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_NodalTri"),
673 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Quad"),
676 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Tet"),
679 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_NodalTet"),
682 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Pyr"),
685 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Prism"),
688 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_NodalPrism"),
691 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Hex")};
713 ASSERTL1(input.size() >= nqcol,
"Incorrect input size");
741 t = output0 + e *
m_nqe, 1);
749 t = output1 + e *
m_nqe, 1);
757 t = output1 + e *
m_nqe, 1);
759 t = output2 + e *
m_nqe, 1);
772 ASSERTL1(input.size() >= nqcol,
"Incorrect input size");
790 t = output + e *
m_nqe, 1);
810 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
821 PhysDeriv_SumFac_Seg::create,
"PhysDeriv_SumFac_Seg");
844 ASSERTL1(input.size() >= nqcol,
"Incorrect input size");
854 for (
int i = 0; i <
m_numElmt; ++i, cnt += nqtot)
883 t = output0 + e *
m_nqe, 1);
885 output0 + e *
m_nqe, 1, t = output0 + e *
m_nqe,
889 t = output1 + e *
m_nqe, 1);
891 output1 + e *
m_nqe, 1, t = output1 + e *
m_nqe,
900 t = output2 + e *
m_nqe, 1);
902 output2 + e *
m_nqe, 1,
903 t = output2 + e *
m_nqe, 1);
917 ASSERTL1(input.size() >= nqcol,
"Incorrect input size");
927 for (
int i = 0; i <
m_numElmt; ++i, cnt += nqtot)
946 t = output + e *
m_nqe, 1);
949 t = output + e *
m_nqe, 1);
972 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
984 PhysDeriv_SumFac_Quad::create,
"PhysDeriv_SumFac_Quad");
1007 ASSERTL1(input.size() >= nqcol,
"Incorrect input size");
1018 for (
int i = 0; i <
m_numElmt; ++i, cnt += nqtot)
1022 diff0.get() + cnt, 1);
1030 diff1.get() + cnt, 1, diff1.get() + cnt, 1);
1055 t = output0 + e *
m_nqe, 1);
1057 output0 + e *
m_nqe, 1, t = output0 + e *
m_nqe,
1061 t = output1 + e *
m_nqe, 1);
1063 output1 + e *
m_nqe, 1, t = output1 + e *
m_nqe,
1072 t = output2 + e *
m_nqe, 1);
1074 output2 + e *
m_nqe, 1,
1075 t = output2 + e *
m_nqe, 1);
1089 ASSERTL1(input.size() >= nqcol,
"Incorrect input size");
1100 for (
int i = 0; i <
m_numElmt; ++i, cnt += nqtot)
1104 diff0.get() + cnt, 1);
1112 diff1.get() + cnt, 1, diff1.get() + cnt, 1);
1127 t = output + e *
m_nqe, 1);
1130 t = output + e *
m_nqe, 1);
1155 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1189 PhysDeriv_SumFac_Tri::create,
"PhysDeriv_SumFac_Tri"),
1192 PhysDeriv_SumFac_Tri::create,
"PhysDeriv_SumFac_NodalTri")};
1211 int nPhys =
m_stdExp->GetTotPoints();
1220 for (
int i = 0; i < 3; ++i)
1222 Diff[i] = wsp + i * ntot;
1242 m_nquad2, 0.0, &Diff[2][i * nPhys],
1252 for (
int j = 1; j < 3; ++j)
1255 out[i], 1, out[i], 1);
1267 Diff[0] + e *
m_nqe, 1, t = out[i] + e *
m_nqe,
1270 for (
int j = 1; j < 3; ++j)
1274 1, t = out[i] + e *
m_nqe, 1);
1285 int nPhys =
m_stdExp->GetTotPoints();
1290 for (
int i = 0; i < 3; ++i)
1292 Diff[i] = wsp + i * ntot;
1312 m_nquad2, 0.0, &Diff[2][i * nPhys],
1321 for (
int j = 1; j < 3; ++j)
1324 output, 1, output, 1);
1333 1, t = output + e *
m_nqe, 1);
1335 for (
int j = 1; j < 3; ++j)
1338 Diff[j] + e *
m_nqe, 1, output + e *
m_nqe, 1,
1339 t = output + e *
m_nqe, 1);
1366 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1380 PhysDeriv_SumFac_Hex::create,
"PhysDeriv_SumFac_Hex")};
1399 int nPhys =
m_stdExp->GetTotPoints();
1408 for (
int i = 0; i < 3; ++i)
1410 Diff[i] = wsp + i * ntot;
1423 m_nquad2, 0.0, &Diff[2][i * nPhys],
1441 Diff[2].get() + i * nPhys, 1,
1442 Diff[2].get() + i * nPhys, 1);
1446 Diff[1].get() + i * nPhys, 1);
1450 Diff[1].get() + i * nPhys, 1,
1451 Diff[1].get() + i * nPhys, 1);
1455 Diff[2].get() + i * nPhys, 1,
1456 Diff[2].get() + i * nPhys, 1);
1460 Diff[0].get() + i * nPhys, 1);
1469 for (
int j = 1; j < 3; ++j)
1472 out[i], 1, out[i], 1);
1484 Diff[0] + e *
m_nqe, 1, t = out[i] + e *
m_nqe,
1486 for (
int j = 1; j < 3; ++j)
1490 1, t = out[i] + e *
m_nqe, 1);
1501 int nPhys =
m_stdExp->GetTotPoints();
1506 for (
int i = 0; i < 3; ++i)
1508 Diff[i] = wsp + i * ntot;
1521 m_nquad2, 0.0, &Diff[2][i * nPhys],
1539 Diff[2].get() + i * nPhys, 1,
1540 Diff[2].get() + i * nPhys, 1);
1544 Diff[1].get() + i * nPhys, 1);
1548 Diff[1].get() + i * nPhys, 1,
1549 Diff[1].get() + i * nPhys, 1);
1553 Diff[2].get() + i * nPhys, 1,
1554 Diff[2].get() + i * nPhys, 1);
1558 Diff[0].get() + i * nPhys, 1);
1566 for (
int j = 1; j < 3; ++j)
1569 output, 1, output, 1);
1578 1, t = output + e *
m_nqe, 1);
1579 for (
int j = 1; j < 3; ++j)
1582 Diff[j] + e *
m_nqe, 1, output + e *
m_nqe, 1,
1583 t = output + e *
m_nqe, 1);
1614 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1639 4.0 / ((1 - z1[j]) * (1 - z2[k]));
1641 2.0 * (1 + z0[i]) / ((1 - z1[j]) * (1 - z2[k]));
1645 (1 + z1[j]) / (1 - z2[k]);
1656 PhysDeriv_SumFac_Tet::create,
"PhysDeriv_SumFac_Tet")};
1675 int nPhys =
m_stdExp->GetTotPoints();
1684 for (
int i = 0; i < 3; ++i)
1686 Diff[i] = wsp + i * ntot;
1710 m_nquad2, 0.0, &Diff[2][i * nPhys],
1715 Diff[0].get() + cnt, 1);
1719 Diff[2].get() + cnt, 1, Diff[2].get() + cnt, 1);
1729 for (
int j = 1; j < 3; ++j)
1732 out[i], 1, out[i], 1);
1744 Diff[0] + e *
m_nqe, 1, t = out[i] + e *
m_nqe,
1747 for (
int j = 1; j < 3; ++j)
1751 1, t = out[i] + e *
m_nqe, 1);
1762 int nPhys =
m_stdExp->GetTotPoints();
1767 for (
int i = 0; i < 3; ++i)
1769 Diff[i] = wsp + i * ntot;
1793 m_nquad2, 0.0, &Diff[2][i * nPhys],
1798 Diff[0].get() + cnt, 1);
1802 Diff[2].get() + cnt, 1, Diff[2].get() + cnt, 1);
1811 for (
int j = 1; j < 3; ++j)
1814 output, 1, output, 1);
1823 1, t = output + e *
m_nqe, 1);
1825 for (
int j = 1; j < 3; ++j)
1828 Diff[j] + e *
m_nqe, 1, output + e *
m_nqe, 1,
1829 t = output + e *
m_nqe, 1);
1858 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1887OperatorKey PhysDeriv_SumFac_Prism::m_typeArr[] = {
1890 PhysDeriv_SumFac_Prism::create,
"PhysDeriv_SumFac_Prism")};
1909 int nPhys =
m_stdExp->GetTotPoints();
1918 for (
int i = 0; i < 3; ++i)
1920 Diff[i] = wsp + i * ntot;
1944 m_nquad2, 0.0, &Diff[2][i * nPhys],
1949 Diff[0].get() + cnt, 1);
1953 Diff[1].get() + cnt, 1);
1957 Diff[2].get() + cnt, 1, Diff[2].get() + cnt, 1);
1961 Diff[2].get() + cnt, 1, Diff[2].get() + cnt, 1);
1971 for (
int j = 1; j < 3; ++j)
1974 out[i], 1, out[i], 1);
1986 Diff[0] + e *
m_nqe, 1, t = out[i] + e *
m_nqe,
1989 for (
int j = 1; j < 3; ++j)
1993 1, t = out[i] + e *
m_nqe, 1);
2004 int nPhys =
m_stdExp->GetTotPoints();
2009 for (
int i = 0; i < 3; ++i)
2011 Diff[i] = wsp + i * ntot;
2035 m_nquad2, 0.0, &Diff[2][i * nPhys],
2040 Diff[0].get() + cnt, 1);
2044 Diff[1].get() + cnt, 1);
2048 Diff[2].get() + cnt, 1, Diff[2].get() + cnt, 1);
2052 Diff[2].get() + cnt, 1, Diff[2].get() + cnt, 1);
2061 for (
int j = 1; j < 3; ++j)
2064 output, 1, output, 1);
2073 1, t = output + e *
m_nqe, 1);
2075 for (
int j = 1; j < 3; ++j)
2078 Diff[j] + e *
m_nqe, 1, output + e *
m_nqe, 1,
2079 t = output + e *
m_nqe, 1);
2109 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
2126 m_fac0[ifac + k * nq0_nq1] = 2.0 / (1 - z2[k]);
2127 m_fac1[ifac + k * nq0_nq1] = 0.5 * (1 + z0[i]);
2128 m_fac2[ifac + k * nq0_nq1] = 0.5 * (1 + z1[j]);
2145 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)
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
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
~PhysDeriv_IterPerExp() final=default
Phys deriv operator using matrix free operators.
Array< OneD, Array< OneD, NekDouble > > m_output
PhysDeriv_MatrixFree(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~PhysDeriv_MatrixFree() final=default
std::shared_ptr< MatrixFree::PhysDeriv > m_oper
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
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)
~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)
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
~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)
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)
~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
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
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
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)