38#include <MatrixFreeOps/Operator.hpp>
93 int nPhys =
m_stdExp->GetTotPoints();
102 for (
int i = 0; i <
m_dim; ++i)
104 Diff[i] = wsp + i * ntot;
108 for (
int i = 0; i <
m_dim; ++i)
113 input.data(), nPhys, 0.0, &Diff[i][0], nPhys);
122 for (
int j = 0; j <
m_dim; ++j)
125 out[i], 1, out[i], 1);
137 for (
int j = 0; j <
m_dim; ++j)
141 1, t = out[i] + e *
m_nqe, 1);
152 int nPhys =
m_stdExp->GetTotPoints();
157 for (
int i = 0; i <
m_dim; ++i)
159 Diff[i] = wsp + i * ntot;
163 for (
int i = 0; i <
m_dim; ++i)
168 input.data(), nPhys, 0.0, &Diff[i][0], nPhys);
175 for (
int j = 0; j <
m_dim; ++j)
178 output, 1, output, 1);
186 for (
int j = 0; j <
m_dim; ++j)
189 Diff[j] + e *
m_nqe, 1, output + e *
m_nqe, 1,
190 t = output + e *
m_nqe, 1);
208 int nqtot = pCollExp[0]->GetTotPoints();
209 m_dim = pCollExp[0]->GetShapeDimension();
214 for (
int i = 0; i <
m_dim; ++i)
219 for (
int j = 0; j < nqtot; ++j)
225 &(
m_derivMat[i]->GetPtr())[0] + j * nqtot, 1);
228 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
237 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Seg"),
240 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Tri"),
243 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_NodalTri"),
246 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Quad"),
249 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Tet"),
252 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_NodalTet"),
255 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Pyr"),
258 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Prism"),
261 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_NodalPrism"),
264 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Hex"),
267 PhysDeriv_StdMat::create,
"PhysDeriv_SumFac_Pyr")};
309 (*m_oper)(input, output);
321 std::shared_ptr<MatrixFree::PhysDeriv>
m_oper;
330 pCollExp[0]->GetTotPoints(), pCollExp.size())
333 bool deformed{pGeomData->IsDeformed(pCollExp)};
334 const auto dim = pCollExp[0]->GetShapeDimension();
338 int nOut = pCollExp[0]->GetTotPoints();
352 std::vector<LibUtilities::BasisSharedPtr> basis(dim);
353 for (
unsigned int i = 0; i < dim; ++i)
355 basis[i] = pCollExp[0]->GetBasis(i);
359 auto shapeType = pCollExp[0]->DetShapeType();
362 std::string op_string =
"PhysDeriv";
363 op_string += MatrixFree::GetOpstring(shapeType, deformed);
364 auto oper = MatrixFree::GetOperatorFactory().CreateInstance(
365 op_string, basis, pCollExp.size());
367 oper->SetUpZW(basis);
371 oper->SetDF(pGeomData->GetDerivFactorsInterLeave(pCollExp,
m_nElmtPad));
373 m_oper = std::dynamic_pointer_cast<MatrixFree::PhysDeriv>(oper);
382 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Seg"),
385 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Tri"),
388 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Quad"),
391 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Hex"),
394 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Prism"),
397 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Pyr"),
400 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Tet")
421 int nPhys =
m_stdExp->GetTotPoints();
430 for (
int i = 0; i <
m_dim; ++i)
432 Diff[i] = wsp + i * ntot;
438 m_stdExp->PhysDeriv(input + i * nPhys, tmp0 = Diff[0] + i * nPhys,
439 tmp1 = Diff[1] + i * nPhys,
440 tmp2 = Diff[2] + i * nPhys);
450 for (
int j = 1; j <
m_dim; ++j)
453 out[i], 1, out[i], 1);
465 Diff[0] + e *
m_nqe, 1, t = out[i] + e *
m_nqe,
467 for (
int j = 1; j <
m_dim; ++j)
471 1, t = out[i] + e *
m_nqe, 1);
482 int nPhys =
m_stdExp->GetTotPoints();
487 for (
int i = 0; i <
m_dim; ++i)
489 Diff[i] = wsp + i * ntot;
495 m_stdExp->PhysDeriv(input + i * nPhys, tmp0 = Diff[0] + i * nPhys,
496 tmp1 = Diff[1] + i * nPhys,
497 tmp2 = Diff[2] + i * nPhys);
503 for (
int j = 0; j <
m_dim; ++j)
506 output, 1, output, 1);
514 for (
int j = 0; j <
m_dim; ++j)
517 Diff[j] + e *
m_nqe, 1, output + e *
m_nqe, 1,
518 t = output + e *
m_nqe, 1);
535 int nqtot = pCollExp[0]->GetTotPoints();
536 m_dim = pCollExp[0]->GetShapeDimension();
539 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
548 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Seg"),
551 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Tri"),
554 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_NodalTri"),
557 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Quad"),
560 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Tet"),
563 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_NodalTet"),
566 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Pyr"),
569 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Prism"),
572 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_NodalPrism"),
575 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Hex")};
594 const int nPhys =
m_expList[0]->GetTotPoints();
604 m_expList[i]->PhysDeriv(input + i * nPhys,
605 tmp0 = output0 + i * nPhys);
613 m_expList[i]->PhysDeriv(input + i * nPhys,
614 tmp0 = output0 + i * nPhys,
615 tmp1 = output1 + i * nPhys);
624 input + i * nPhys, tmp0 = output0 + i * nPhys,
625 tmp1 = output1 + i * nPhys, tmp2 = output2 + i * nPhys);
630 ASSERTL0(
false,
"Unknown dimension.");
638 const int nPhys =
m_expList[0]->GetTotPoints();
644 m_expList[i]->PhysDeriv(dir, input + i * nPhys,
645 tmp = output + i * nPhys);
666 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Seg"),
669 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Tri"),
672 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_NodalTri"),
675 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Quad"),
678 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Tet"),
681 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_NodalTet"),
684 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Pyr"),
687 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Prism"),
690 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_NodalPrism"),
693 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Hex")};
715 ASSERTL1(input.size() >= nqcol,
"Incorrect input size");
743 t = output0 + e *
m_nqe, 1);
751 t = output1 + e *
m_nqe, 1);
759 t = output1 + e *
m_nqe, 1);
761 t = output2 + e *
m_nqe, 1);
774 ASSERTL1(input.size() >= nqcol,
"Incorrect input size");
792 t = output + e *
m_nqe, 1);
812 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
823 PhysDeriv_SumFac_Seg::create,
"PhysDeriv_SumFac_Seg");
846 ASSERTL1(input.size() >= nqcol,
"Incorrect input size");
856 for (
int i = 0; i <
m_numElmt; ++i, cnt += nqtot)
885 t = output0 + e *
m_nqe, 1);
887 output0 + e *
m_nqe, 1, t = output0 + e *
m_nqe,
891 t = output1 + e *
m_nqe, 1);
893 output1 + e *
m_nqe, 1, t = output1 + e *
m_nqe,
902 t = output2 + e *
m_nqe, 1);
904 output2 + e *
m_nqe, 1,
905 t = output2 + e *
m_nqe, 1);
919 ASSERTL1(input.size() >= nqcol,
"Incorrect input size");
929 for (
int i = 0; i <
m_numElmt; ++i, cnt += nqtot)
948 t = output + e *
m_nqe, 1);
951 t = output + e *
m_nqe, 1);
974 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
986 PhysDeriv_SumFac_Quad::create,
"PhysDeriv_SumFac_Quad");
1009 ASSERTL1(input.size() >= nqcol,
"Incorrect input size");
1020 for (
int i = 0; i <
m_numElmt; ++i, cnt += nqtot)
1024 diff0.data() + cnt, 1);
1032 diff1.data() + cnt, 1, diff1.data() + cnt, 1);
1057 t = output0 + e *
m_nqe, 1);
1059 output0 + e *
m_nqe, 1, t = output0 + e *
m_nqe,
1063 t = output1 + e *
m_nqe, 1);
1065 output1 + e *
m_nqe, 1, t = output1 + e *
m_nqe,
1074 t = output2 + e *
m_nqe, 1);
1076 output2 + e *
m_nqe, 1,
1077 t = output2 + e *
m_nqe, 1);
1091 ASSERTL1(input.size() >= nqcol,
"Incorrect input size");
1102 for (
int i = 0; i <
m_numElmt; ++i, cnt += nqtot)
1106 diff0.data() + cnt, 1);
1114 diff1.data() + cnt, 1, diff1.data() + cnt, 1);
1129 t = output + e *
m_nqe, 1);
1132 t = output + e *
m_nqe, 1);
1157 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1191 PhysDeriv_SumFac_Tri::create,
"PhysDeriv_SumFac_Tri"),
1194 PhysDeriv_SumFac_Tri::create,
"PhysDeriv_SumFac_NodalTri")};
1213 int nPhys =
m_stdExp->GetTotPoints();
1222 for (
int i = 0; i < 3; ++i)
1224 Diff[i] = wsp + i * ntot;
1244 m_nquad2, 0.0, &Diff[2][i * nPhys],
1254 for (
int j = 1; j < 3; ++j)
1257 out[i], 1, out[i], 1);
1269 Diff[0] + e *
m_nqe, 1, t = out[i] + e *
m_nqe,
1272 for (
int j = 1; j < 3; ++j)
1276 1, t = out[i] + e *
m_nqe, 1);
1287 int nPhys =
m_stdExp->GetTotPoints();
1292 for (
int i = 0; i < 3; ++i)
1294 Diff[i] = wsp + i * ntot;
1314 m_nquad2, 0.0, &Diff[2][i * nPhys],
1323 for (
int j = 1; j < 3; ++j)
1326 output, 1, output, 1);
1335 1, t = output + e *
m_nqe, 1);
1337 for (
int j = 1; j < 3; ++j)
1340 Diff[j] + e *
m_nqe, 1, output + e *
m_nqe, 1,
1341 t = output + e *
m_nqe, 1);
1368 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1382 PhysDeriv_SumFac_Hex::create,
"PhysDeriv_SumFac_Hex")};
1401 int nPhys =
m_stdExp->GetTotPoints();
1410 for (
int i = 0; i < 3; ++i)
1412 Diff[i] = wsp + i * ntot;
1425 m_nquad2, 0.0, &Diff[2][i * nPhys],
1443 Diff[2].data() + i * nPhys, 1,
1444 Diff[2].data() + i * nPhys, 1);
1448 Diff[1].data() + i * nPhys, 1);
1452 Diff[1].data() + i * nPhys, 1,
1453 Diff[1].data() + i * nPhys, 1);
1457 Diff[2].data() + i * nPhys, 1,
1458 Diff[2].data() + i * nPhys, 1);
1462 Diff[0].data() + i * nPhys, 1);
1471 for (
int j = 1; j < 3; ++j)
1474 out[i], 1, out[i], 1);
1486 Diff[0] + e *
m_nqe, 1, t = out[i] + e *
m_nqe,
1488 for (
int j = 1; j < 3; ++j)
1492 1, t = out[i] + e *
m_nqe, 1);
1503 int nPhys =
m_stdExp->GetTotPoints();
1508 for (
int i = 0; i < 3; ++i)
1510 Diff[i] = wsp + i * ntot;
1523 m_nquad2, 0.0, &Diff[2][i * nPhys],
1541 Diff[2].data() + i * nPhys, 1,
1542 Diff[2].data() + i * nPhys, 1);
1546 Diff[1].data() + i * nPhys, 1);
1550 Diff[1].data() + i * nPhys, 1,
1551 Diff[1].data() + i * nPhys, 1);
1555 Diff[2].data() + i * nPhys, 1,
1556 Diff[2].data() + i * nPhys, 1);
1560 Diff[0].data() + i * nPhys, 1);
1568 for (
int j = 1; j < 3; ++j)
1571 output, 1, output, 1);
1580 1, t = output + e *
m_nqe, 1);
1581 for (
int j = 1; j < 3; ++j)
1584 Diff[j] + e *
m_nqe, 1, output + e *
m_nqe, 1,
1585 t = output + e *
m_nqe, 1);
1616 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1641 4.0 / ((1 - z1[j]) * (1 - z2[k]));
1643 2.0 * (1 + z0[i]) / ((1 - z1[j]) * (1 - z2[k]));
1647 (1 + z1[j]) / (1 - z2[k]);
1658 PhysDeriv_SumFac_Tet::create,
"PhysDeriv_SumFac_Tet")};
1677 int nPhys =
m_stdExp->GetTotPoints();
1686 for (
int i = 0; i < 3; ++i)
1688 Diff[i] = wsp + i * ntot;
1712 m_nquad2, 0.0, &Diff[2][i * nPhys],
1717 Diff[0].data() + cnt, 1);
1721 Diff[2].data() + cnt, 1, Diff[2].data() + cnt, 1);
1731 for (
int j = 1; j < 3; ++j)
1734 out[i], 1, out[i], 1);
1746 Diff[0] + e *
m_nqe, 1, t = out[i] + e *
m_nqe,
1749 for (
int j = 1; j < 3; ++j)
1753 1, t = out[i] + e *
m_nqe, 1);
1764 int nPhys =
m_stdExp->GetTotPoints();
1769 for (
int i = 0; i < 3; ++i)
1771 Diff[i] = wsp + i * ntot;
1795 m_nquad2, 0.0, &Diff[2][i * nPhys],
1800 Diff[0].data() + cnt, 1);
1804 Diff[2].data() + cnt, 1, Diff[2].data() + cnt, 1);
1813 for (
int j = 1; j < 3; ++j)
1816 output, 1, output, 1);
1825 1, t = output + e *
m_nqe, 1);
1827 for (
int j = 1; j < 3; ++j)
1830 Diff[j] + e *
m_nqe, 1, output + e *
m_nqe, 1,
1831 t = output + e *
m_nqe, 1);
1860 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1889OperatorKey PhysDeriv_SumFac_Prism::m_typeArr[] = {
1892 PhysDeriv_SumFac_Prism::create,
"PhysDeriv_SumFac_Prism")};
1911 int nPhys =
m_stdExp->GetTotPoints();
1920 for (
int i = 0; i < 3; ++i)
1922 Diff[i] = wsp + i * ntot;
1946 m_nquad2, 0.0, &Diff[2][i * nPhys],
1951 Diff[0].data() + cnt, 1);
1955 Diff[1].data() + cnt, 1);
1959 Diff[2].data() + cnt, 1, Diff[2].data() + cnt, 1);
1963 Diff[2].data() + cnt, 1, Diff[2].data() + cnt, 1);
1973 for (
int j = 1; j < 3; ++j)
1976 out[i], 1, out[i], 1);
1988 Diff[0] + e *
m_nqe, 1, t = out[i] + e *
m_nqe,
1991 for (
int j = 1; j < 3; ++j)
1995 1, t = out[i] + e *
m_nqe, 1);
2006 int nPhys =
m_stdExp->GetTotPoints();
2011 for (
int i = 0; i < 3; ++i)
2013 Diff[i] = wsp + i * ntot;
2037 m_nquad2, 0.0, &Diff[2][i * nPhys],
2042 Diff[0].data() + cnt, 1);
2046 Diff[1].data() + cnt, 1);
2050 Diff[2].data() + cnt, 1, Diff[2].data() + cnt, 1);
2054 Diff[2].data() + cnt, 1, Diff[2].data() + cnt, 1);
2063 for (
int j = 1; j < 3; ++j)
2066 output, 1, output, 1);
2075 1, t = output + e *
m_nqe, 1);
2077 for (
int j = 1; j < 3; ++j)
2080 Diff[j] + e *
m_nqe, 1, output + e *
m_nqe, 1,
2081 t = output + e *
m_nqe, 1);
2111 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
2128 m_fac0[ifac + k * nq0_nq1] = 2.0 / (1 - z2[k]);
2129 m_fac1[ifac + k * nq0_nq1] = 0.5 * (1 + z0[i]);
2130 m_fac2[ifac + k * nq0_nq1] = 0.5 * (1 + z1[j]);
2147 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< LocalRegions::ExpansionSharedPtr > 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() final=default
std::shared_ptr< MatrixFree::PhysDeriv > m_oper
PhysDeriv_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
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
vector< LocalRegions::ExpansionSharedPtr > m_expList
PhysDeriv_NoCollection(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Phys deriv operator using standard matrix approach.
Array< TwoD, const NekDouble > m_derivFac
PhysDeriv_StdMat(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, DNekMatSharedPtr > m_derivMat
~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)
Array< TwoD, const NekDouble > m_derivFac
~PhysDeriv_SumFac_Hex() final=default
PhysDeriv_SumFac_Hex(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
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< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, NekDouble > m_fac0
Phys deriv operator using sum-factorisation (Pyramid)
Array< OneD, NekDouble > m_fac1
Array< OneD, NekDouble > m_fac2
PhysDeriv_SumFac_Pyr(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
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
PhysDeriv_SumFac_Quad(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
Array< TwoD, const NekDouble > m_derivFac
Phys deriv operator using sum-factorisation (Segment)
~PhysDeriv_SumFac_Seg() final=default
Array< TwoD, const NekDouble > m_derivFac
PhysDeriv_SumFac_Seg(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
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
Array< OneD, NekDouble > m_fac0
Array< TwoD, const NekDouble > m_derivFac
Array< OneD, NekDouble > m_fac3
PhysDeriv_SumFac_Tet(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~PhysDeriv_SumFac_Tet() final=default
Phys deriv operator using sum-factorisation (Tri)
~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
PhysDeriv_SumFac_Tri(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
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.
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)