35 #include <boost/core/ignore_unused.hpp>
37 #include <MatrixFreeOps/Operator.hpp>
47 namespace Collections {
76 boost::ignore_unused(output1, output2);
79 "Incorrect workspace size");
88 for(
int e = 0; e < m_numElmt; ++e)
90 Vmath::Smul(m_nqe,m_jac[e],input+e*m_nqe,1,tmp = wsp+e*m_nqe,1);
95 m_mat->GetColumns(), 1.0, m_mat->GetRawPtr(),
96 m_mat->GetRows(), wsp.get(), m_stdExp->GetTotPoints(),
97 0.0, output.get(), m_stdExp->GetNcoeffs());
105 boost::ignore_unused(dir, input, output, wsp);
106 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
110 int coll_phys_offset)
112 boost::ignore_unused(factors, coll_phys_offset);
113 ASSERTL0(
false,
"Not valid for this operator.");
123 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
126 :
Operator(pCollExp, pGeomData, factors)
128 m_jac = pGeomData->GetJac(pCollExp);
130 m_stdExp->DetShapeType(), *m_stdExp);
131 m_mat = m_stdExp->GetStdMatrix(key);
132 m_nqe = m_stdExp->GetTotPoints();
133 m_wspSize = m_nqe*m_numElmt;
138 OperatorKey IProductWRTBase_StdMat::m_typeArr[] = {
141 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Seg"),
144 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Tri"),
147 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_NodalTri"),
150 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Quad"),
153 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Tet"),
156 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_NodalTet"),
159 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Pyr"),
162 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Prism"),
165 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_NodalPrism"),
168 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Hex"),
171 IProductWRTBase_StdMat::create,
"IProductWRTBase_SumFac_Pyr")
193 boost::ignore_unused(output1, output2, wsp);
200 (*m_oper)(m_input, m_output);
206 (*m_oper)(input, output);
215 boost::ignore_unused(dir, input, output, wsp);
216 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
220 int coll_phys_offset)
222 boost::ignore_unused(factors, coll_phys_offset);
223 ASSERTL0(
false,
"Not valid for this operator.");
227 std::shared_ptr<MatrixFree::IProduct>
m_oper;
230 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
233 :
Operator(pCollExp, pGeomData, factors),
235 pCollExp[0]->GetStdExp()->GetNcoeffs(),
240 const auto dim = pCollExp[0]->GetStdExp()->GetShapeDimension();
241 std::vector<LibUtilities::BasisSharedPtr> basis(dim);
242 for (
unsigned int i = 0; i < dim; ++i)
244 basis[i] = pCollExp[0]->GetBasis(i);
248 auto shapeType = pCollExp[0]->GetStdExp()->DetShapeType();
251 std::string op_string =
"IProduct";
252 op_string += MatrixFree::GetOpstring(shapeType, m_isDeformed);
254 CreateInstance(op_string, basis, m_nElmtPad);
257 oper->SetJac(pGeomData->GetJacInterLeave(pCollExp,m_nElmtPad));
259 m_oper = std::dynamic_pointer_cast<MatrixFree::IProduct>(oper);
260 ASSERTL0(m_oper,
"Failed to cast pointer.");
266 OperatorKey IProductWRTBase_MatrixFree::m_typeArr[] = {
269 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Seg"),
272 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Quad"),
275 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Tri"),
278 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Hex"),
281 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Prism"),
284 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Pyr"),
287 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Tet")
311 boost::ignore_unused(output1, output2);
314 "Incorrect workspace size");
316 const int nCoeffs = m_stdExp->GetNcoeffs();
317 const int nPhys = m_stdExp->GetTotPoints();
320 Vmath::Vmul(m_jacWStdW.size(),m_jacWStdW,1,input,1,wsp,1);
322 for (
int i = 0; i < m_numElmt; ++i)
324 m_stdExp->IProductWRTBase_SumFac(wsp + i*nPhys,
325 tmp = output + i*nCoeffs,
335 boost::ignore_unused(dir, input, output, wsp);
336 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
340 int coll_phys_offset)
342 boost::ignore_unused(factors, coll_phys_offset);
343 ASSERTL0(
false,
"Not valid for this operator.");
351 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
354 :
Operator(pCollExp, pGeomData, factors)
358 for(
int i = 0; i < PtsKey.size(); ++i)
360 nqtot *= PtsKey[i].GetNumPoints();
363 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
365 m_wspSize = nqtot*m_numElmt;
371 OperatorKey IProductWRTBase_IterPerExp::m_typeArr[] = {
374 IProductWRTBase_IterPerExp::create,
375 "IProductWRTBase_IterPerExp_Seg"),
378 IProductWRTBase_IterPerExp::create,
379 "IProductWRTBase_IterPerExp_Tri"),
382 IProductWRTBase_IterPerExp::create,
383 "IProductWRTBase_IterPerExp_NodalTri"),
386 IProductWRTBase_IterPerExp::create,
387 "IProductWRTBase_IterPerExp_Quad"),
390 IProductWRTBase_IterPerExp::create,
391 "IProductWRTBase_IterPerExp_Tet"),
394 IProductWRTBase_IterPerExp::create,
395 "IProductWRTBase_IterPerExp_NodalTet"),
398 IProductWRTBase_IterPerExp::create,
399 "IProductWRTBase_IterPerExp_Pyr"),
402 IProductWRTBase_IterPerExp::create,
403 "IProductWRTBase_IterPerExp_Prism"),
406 IProductWRTBase_IterPerExp::create,
407 "IProductWRTBase_IterPerExp_NodalPrism"),
410 IProductWRTBase_IterPerExp::create,
411 "IProductWRTBase_IterPerExp_Hex"),
434 boost::ignore_unused(output1, output2, wsp);
436 const int nCoeffs = m_expList[0]->GetNcoeffs();
437 const int nPhys = m_expList[0]->GetTotPoints();
440 for (
int i = 0; i < m_numElmt; ++i)
442 m_expList[i]->IProductWRTBase(input + i*nPhys,
443 tmp = output + i*nCoeffs);
453 boost::ignore_unused(dir, input, output, wsp);
454 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
458 int coll_phys_offset)
460 boost::ignore_unused(factors, coll_phys_offset);
461 ASSERTL0(
false,
"Not valid for this operator.");
469 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
472 :
Operator(pCollExp, pGeomData, factors)
474 m_expList = pCollExp;
479 OperatorKey IProductWRTBase_NoCollection::m_typeArr[] = {
482 IProductWRTBase_NoCollection::create,
483 "IProductWRTBase_NoCollection_Seg"),
486 IProductWRTBase_NoCollection::create,
487 "IProductWRTBase_NoCollection_Tri"),
490 IProductWRTBase_NoCollection::create,
491 "IProductWRTBase_NoCollection_NodalTri"),
494 IProductWRTBase_NoCollection::create,
495 "IProductWRTBase_NoCollection_Quad"),
498 IProductWRTBase_NoCollection::create,
499 "IProductWRTBase_NoCollection_Tet"),
502 IProductWRTBase_NoCollection::create,
503 "IProductWRTBase_NoCollection_NodalTet"),
506 IProductWRTBase_NoCollection::create,
507 "IProductWRTBase_NoCollection_Pyr"),
510 IProductWRTBase_NoCollection::create,
511 "IProductWRTBase_NoCollection_Prism"),
514 IProductWRTBase_NoCollection::create,
515 "IProductWRTBase_NoCollection_NodalPrism"),
518 IProductWRTBase_NoCollection::create,
519 "IProductWRTBase_NoCollection_Hex"),
542 boost::ignore_unused(output1, output2);
546 Vmath::Vmul(m_numElmt*m_nquad0,m_jacWStdW,1,input,1,output,1);
550 Vmath::Vmul(m_numElmt*m_nquad0,m_jacWStdW,1,input,1,wsp,1);
553 Blas::Dgemm(
'T',
'N', m_nmodes0, m_numElmt, m_nquad0,
554 1.0, m_base0.get(), m_nquad0,
555 &wsp[0], m_nquad0, 0.0,
556 &output[0], m_nmodes0);
565 boost::ignore_unused(dir, input, output, wsp);
566 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
570 int coll_phys_offset)
572 boost::ignore_unused(factors, coll_phys_offset);
573 ASSERTL0(
false,
"Not valid for this operator.");
585 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
588 :
Operator (pCollExp, pGeomData, factors),
589 m_nquad0 (m_stdExp->GetNumPoints(0)),
590 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
591 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
592 m_base0 (m_stdExp->GetBasis(0)->GetBdata())
594 m_wspSize = m_numElmt*m_nquad0;
595 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
601 RegisterCreatorFunction(
603 IProductWRTBase_SumFac_Seg::create,
"IProductWRTBase_SumFac_Seg");
625 boost::ignore_unused(output1, output2);
628 "Incorrect workspace size");
632 m_nmodes0, m_nmodes1,
634 m_jacWStdW, input, output, wsp);
642 boost::ignore_unused(dir, input, output, wsp);
643 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
647 int coll_phys_offset)
649 boost::ignore_unused(factors, coll_phys_offset);
650 ASSERTL0(
false,
"Not valid for this operator.");
666 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
669 :
Operator (pCollExp, pGeomData, factors),
670 m_nquad0 (m_stdExp->GetNumPoints(0)),
671 m_nquad1 (m_stdExp->GetNumPoints(1)),
672 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
673 m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
674 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
675 m_colldir1(m_stdExp->GetBasis(1)->Collocation()),
676 m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
677 m_base1 (m_stdExp->GetBasis(1)->GetBdata())
679 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
680 m_wspSize = 2 * m_numElmt
681 * (max(m_nquad0*m_nquad1,m_nmodes0*m_nmodes1));
687 RegisterCreatorFunction(
689 IProductWRTBase_SumFac_Quad::create,
"IProductWRTBase_SumFac_Quad");
711 boost::ignore_unused(output1, output2);
714 "Incorrect workspace size");
716 TriIProduct(m_sortTopVertex, m_numElmt, m_nquad0, m_nquad1,
717 m_nmodes0, m_nmodes1,m_base0,m_base1,m_jacWStdW, input,
726 boost::ignore_unused(dir, input, output, wsp);
727 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
731 int coll_phys_offset)
733 boost::ignore_unused(factors, coll_phys_offset);
734 ASSERTL0(
false,
"Not valid for this operator.");
749 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
752 :
Operator (pCollExp, pGeomData, factors),
753 m_nquad0 (m_stdExp->GetNumPoints(0)),
754 m_nquad1 (m_stdExp->GetNumPoints(1)),
755 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
756 m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
757 m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
758 m_base1 (m_stdExp->GetBasis(1)->GetBdata())
760 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
761 m_wspSize = 2 * m_numElmt
762 * (max(m_nquad0*m_nquad1,m_nmodes0*m_nmodes1));
763 if(m_stdExp->GetBasis(0)->GetBasisType()
766 m_sortTopVertex =
true;
770 m_sortTopVertex =
false;
777 RegisterCreatorFunction(
779 IProductWRTBase_SumFac_Tri::create,
"IProductWRTBase_SumFac_Tri");
801 boost::ignore_unused(output1, output2);
804 "Incorrect workspace size");
806 HexIProduct(m_colldir0,m_colldir1,m_colldir2, m_numElmt,
807 m_nquad0, m_nquad1, m_nquad2,
808 m_nmodes0, m_nmodes1, m_nmodes2,
809 m_base0, m_base1, m_base2,
810 m_jacWStdW,input,output,wsp);
818 boost::ignore_unused(dir, input, output, wsp);
819 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
823 int coll_phys_offset)
825 boost::ignore_unused(factors, coll_phys_offset);
826 ASSERTL0(
false,
"Not valid for this operator.");
846 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
849 :
Operator (pCollExp, pGeomData, factors),
850 m_nquad0 (m_stdExp->GetNumPoints(0)),
851 m_nquad1 (m_stdExp->GetNumPoints(1)),
852 m_nquad2 (m_stdExp->GetNumPoints(2)),
853 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
854 m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
855 m_nmodes2 (m_stdExp->GetBasisNumModes(2)),
856 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
857 m_colldir1(m_stdExp->GetBasis(1)->Collocation()),
858 m_colldir2(m_stdExp->GetBasis(2)->Collocation()),
859 m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
860 m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
861 m_base2 (m_stdExp->GetBasis(2)->GetBdata())
864 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
865 m_wspSize = 3 * m_numElmt * (max(m_nquad0*m_nquad1*m_nquad2,
866 m_nmodes0*m_nmodes1*m_nmodes2));
872 RegisterCreatorFunction(
874 IProductWRTBase_SumFac_Hex::create,
"IProductWRTBase_SumFac_Hex");
897 boost::ignore_unused(output1, output2);
900 "Incorrect workspace size");
903 m_nquad0, m_nquad1, m_nquad2,
904 m_nmodes0, m_nmodes1, m_nmodes2,
905 m_base0, m_base1, m_base2,
906 m_jacWStdW,input,output,wsp);
915 boost::ignore_unused(dir, input, output, wsp);
916 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
920 int coll_phys_offset)
922 boost::ignore_unused(factors, coll_phys_offset);
923 ASSERTL0(
false,
"Not valid for this operator.");
941 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
944 :
Operator (pCollExp, pGeomData, factors),
945 m_nquad0 (m_stdExp->GetNumPoints(0)),
946 m_nquad1 (m_stdExp->GetNumPoints(1)),
947 m_nquad2 (m_stdExp->GetNumPoints(2)),
948 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
949 m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
950 m_nmodes2 (m_stdExp->GetBasisNumModes(2)),
951 m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
952 m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
953 m_base2 (m_stdExp->GetBasis(2)->GetBdata())
955 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
956 m_wspSize = m_numElmt*(max(m_nquad0*m_nquad1*m_nquad2,
957 m_nquad2*m_nmodes0*(2*m_nmodes1-m_nmodes0+1)/2)+
958 m_nquad2*m_nquad1*m_nmodes0);
960 if(m_stdExp->GetBasis(0)->GetBasisType()
963 m_sortTopEdge =
true;
967 m_sortTopEdge =
false;
974 RegisterCreatorFunction(
976 IProductWRTBase_SumFac_Tet::create,
"IProductWRTBase_SumFac_Tet");
999 boost::ignore_unused(output1, output2);
1002 "Incorrect workspace size");
1005 m_nquad0, m_nquad1, m_nquad2,
1006 m_nmodes0, m_nmodes1, m_nmodes2,
1007 m_base0, m_base1, m_base2,
1008 m_jacWStdW,input,output,wsp);
1016 boost::ignore_unused(dir, input, output, wsp);
1017 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
1021 int coll_phys_offset)
1023 boost::ignore_unused(factors, coll_phys_offset);
1024 ASSERTL0(
false,
"Not valid for this operator.");
1042 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1045 :
Operator (pCollExp, pGeomData, factors),
1046 m_nquad0 (m_stdExp->GetNumPoints(0)),
1047 m_nquad1 (m_stdExp->GetNumPoints(1)),
1048 m_nquad2 (m_stdExp->GetNumPoints(2)),
1049 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
1050 m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
1051 m_nmodes2 (m_stdExp->GetBasisNumModes(2)),
1052 m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
1053 m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
1054 m_base2 (m_stdExp->GetBasis(2)->GetBdata())
1057 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
1059 m_wspSize = m_numElmt * m_nquad2
1060 *(max(m_nquad0*m_nquad1,m_nmodes0*m_nmodes1))
1061 + m_nquad1*m_nquad2*m_numElmt*m_nmodes0;
1063 if(m_stdExp->GetBasis(0)->GetBasisType()
1066 m_sortTopVertex =
true;
1070 m_sortTopVertex =
false;
1077 RegisterCreatorFunction(
1079 IProductWRTBase_SumFac_Prism::create,
"IProductWRTBase_SumFac_Prism");
1101 boost::ignore_unused(output1, output2);
1104 "Incorrect workspace size");
1107 m_nquad0, m_nquad1, m_nquad2,
1108 m_nmodes0, m_nmodes1, m_nmodes2,
1109 m_base0, m_base1, m_base2,
1110 m_jacWStdW,input,output,wsp);
1118 boost::ignore_unused(dir, input, output, wsp);
1119 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
1123 int coll_phys_offset)
1125 boost::ignore_unused(factors, coll_phys_offset);
1126 ASSERTL0(
false,
"Not valid for this operator.");
1144 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1147 :
Operator (pCollExp, pGeomData, factors),
1148 m_nquad0 (m_stdExp->GetNumPoints(0)),
1149 m_nquad1 (m_stdExp->GetNumPoints(1)),
1150 m_nquad2 (m_stdExp->GetNumPoints(2)),
1151 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
1152 m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
1153 m_nmodes2 (m_stdExp->GetBasisNumModes(2)),
1154 m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
1155 m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
1156 m_base2 (m_stdExp->GetBasis(2)->GetBdata())
1159 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
1161 m_wspSize = m_numElmt * m_nquad2
1162 *(max(m_nquad0*m_nquad1,m_nmodes0*m_nmodes1))
1163 + m_nquad1*m_nquad2*m_numElmt*m_nmodes0;
1165 if(m_stdExp->GetBasis(0)->GetBasisType()
1168 m_sortTopVertex =
true;
1172 m_sortTopVertex =
false;
1179 RegisterCreatorFunction(
1181 IProductWRTBase_SumFac_Pyr::create,
"IProductWRTBase_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)
Inner product operator using element-wise operation.
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Array< OneD, NekDouble > m_jacWStdW
~IProductWRTBase_IterPerExp() final
IProductWRTBase_IterPerExp(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
Inner product operator using operator using matrix free operators.
IProductWRTBase_MatrixFree(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
~IProductWRTBase_MatrixFree() final
virtual void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
std::shared_ptr< MatrixFree::IProduct > m_oper
Inner product operator using original MultiRegions implementation.
~IProductWRTBase_NoCollection() final
vector< StdRegions::StdExpansionSharedPtr > m_expList
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
IProductWRTBase_NoCollection(vector< StdRegions::StdExpansionSharedPtr > 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
Inner product operator using standard matrix approach.
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
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
Array< OneD, const NekDouble > m_jac
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
IProductWRTBase_StdMat(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~IProductWRTBase_StdMat() final
Inner Product operator using sum-factorisation (Hex)
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
Array< OneD, const NekDouble > m_base0
IProductWRTBase_SumFac_Hex(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~IProductWRTBase_SumFac_Hex() final
Array< OneD, const NekDouble > m_base2
Array< OneD, const NekDouble > m_base1
Array< OneD, const NekDouble > m_jacWStdW
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
Inner Product operator using sum-factorisation (Prism)
Array< OneD, const NekDouble > m_jacWStdW
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
Array< OneD, const NekDouble > m_base1
Array< OneD, const NekDouble > m_base0
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
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
IProductWRTBase_SumFac_Prism(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~IProductWRTBase_SumFac_Prism() final
Inner Product operator using sum-factorisation (Pyr)
Array< OneD, const NekDouble > m_jacWStdW
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
Array< OneD, const NekDouble > m_base2
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_base1
~IProductWRTBase_SumFac_Pyr() final
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
IProductWRTBase_SumFac_Pyr(vector< StdRegions::StdExpansionSharedPtr > 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
Inner product operator using sum-factorisation (Quad)
Array< OneD, const NekDouble > m_jacWStdW
Array< OneD, const NekDouble > m_base1
Array< OneD, const NekDouble > m_base0
IProductWRTBase_SumFac_Quad(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~IProductWRTBase_SumFac_Quad() final
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
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
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
Inner product operator using sum-factorisation (Segment)
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Array< OneD, const NekDouble > m_jacWStdW
IProductWRTBase_SumFac_Seg(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
~IProductWRTBase_SumFac_Seg() final
Array< OneD, const NekDouble > m_base0
Inner product operator using sum-factorisation (Tet)
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
Array< OneD, const NekDouble > m_jacWStdW
Array< OneD, const NekDouble > m_base1
IProductWRTBase_SumFac_Tet(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) final
Perform operation.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
~IProductWRTBase_SumFac_Tet() final
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_base2
Inner product operator using sum-factorisation (Tri)
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
IProductWRTBase_SumFac_Tri(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) final
Perform operation.
Array< OneD, const NekDouble > m_jacWStdW
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
Array< OneD, const NekDouble > m_base1
~IProductWRTBase_SumFac_Tri() final
Base class for operators on a collection of elements.
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...
void TetIProduct(bool sortTopEdge, int numElmt, int nquad0, int nquad1, int nquad2, int nmodes0, int nmodes1, int nmodes2, const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &jac, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
void PyrIProduct(bool sortTopVert, int numElmt, int nquad0, int nquad1, int nquad2, int nmodes0, int nmodes1, int nmodes2, const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &jac, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
void TriIProduct(bool sortTopVertex, int numElmt, int nquad0, int nquad1, int nmodes0, int nmodes1, const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &jac, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
void QuadIProduct(bool colldir0, bool colldir1, int numElmt, int nquad0, int nquad1, int nmodes0, int nmodes1, const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &jac, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
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 PrismIProduct(bool sortTopVert, int numElmt, int nquad0, int nquad1, int nquad2, int nmodes0, int nmodes1, int nmodes2, const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &jac, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
void HexIProduct(bool colldir0, bool colldir1, bool colldir2, int numElmt, int nquad0, int nquad1, int nquad2, int nmodes0, int nmodes1, int nmodes2, const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &jac, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
std::vector< PointsKey > PointsKeyVector
@ eModified_A
Principle Modified Functions .
The above copyright notice and this permission notice shall be included.
std::shared_ptr< DNekMat > DNekMatSharedPtr
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 Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)