35 #include <boost/core/ignore_unused.hpp>
37 #include <MatrixFreeOps/Operator.hpp>
77 boost::ignore_unused(output1, output2);
79 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
83 Vmath::Vmul(m_jac.size(), m_jac, 1, input, 1, wsp, 1);
88 for (
int e = 0; e < m_numElmt; ++e)
91 tmp = wsp + e * m_nqe, 1);
95 Blas::Dgemm(
'N',
'N', m_mat->GetRows(), m_numElmt, m_mat->GetColumns(),
96 1.0, m_mat->GetRawPtr(), m_mat->GetRows(), wsp.get(),
97 m_stdExp->GetTotPoints(), 0.0, output.get(),
98 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)
override
112 boost::ignore_unused(factors, coll_phys_offset);
113 ASSERTL0(
false,
"Not valid for this operator.");
124 :
Operator(pCollExp, pGeomData, factors)
126 m_jac = pGeomData->GetJac(pCollExp);
128 m_stdExp->DetShapeType(), *m_stdExp);
129 m_mat = m_stdExp->GetStdMatrix(key);
130 m_nqe = m_stdExp->GetTotPoints();
131 m_wspSize = m_nqe * m_numElmt;
136 OperatorKey IProductWRTBase_StdMat::m_typeArr[] = {
139 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Seg"),
142 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Tri"),
145 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_NodalTri"),
148 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Quad"),
151 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Tet"),
154 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_NodalTet"),
157 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Pyr"),
160 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Prism"),
163 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_NodalPrism"),
166 IProductWRTBase_StdMat::create,
"IProductWRTBase_StdMat_Hex"),
169 IProductWRTBase_StdMat::create,
"IProductWRTBase_SumFac_Pyr")};
189 boost::ignore_unused(output1, output2, wsp);
196 (*m_oper)(m_input, m_output);
202 (*m_oper)(input, output);
210 boost::ignore_unused(dir, input, output, wsp);
211 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
215 int coll_phys_offset)
override
217 boost::ignore_unused(factors, coll_phys_offset);
218 ASSERTL0(
false,
"Not valid for this operator.");
222 std::shared_ptr<MatrixFree::IProduct>
m_oper;
225 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
227 :
Operator(pCollExp, pGeomData, factors),
229 pCollExp[0]->GetStdExp()->GetNcoeffs(),
234 const auto dim = pCollExp[0]->GetStdExp()->GetShapeDimension();
235 std::vector<LibUtilities::BasisSharedPtr> basis(dim);
236 for (
unsigned int i = 0; i < dim; ++i)
238 basis[i] = pCollExp[0]->GetBasis(i);
242 auto shapeType = pCollExp[0]->GetStdExp()->DetShapeType();
245 std::string op_string =
"IProduct";
246 op_string += MatrixFree::GetOpstring(shapeType, m_isDeformed);
248 op_string, basis, m_nElmtPad);
251 oper->SetJac(pGeomData->GetJacInterLeave(pCollExp, m_nElmtPad));
253 m_oper = std::dynamic_pointer_cast<MatrixFree::IProduct>(oper);
254 ASSERTL0(m_oper,
"Failed to cast pointer.");
259 OperatorKey IProductWRTBase_MatrixFree::m_typeArr[] = {
262 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Seg"),
265 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Quad"),
268 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Tri"),
271 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Hex"),
274 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Prism"),
277 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Pyr"),
280 IProductWRTBase_MatrixFree::create,
"IProductWRTBase_MatrixFree_Tet")
302 boost::ignore_unused(output1, output2);
304 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
306 const int nCoeffs = m_stdExp->GetNcoeffs();
307 const int nPhys = m_stdExp->GetTotPoints();
310 Vmath::Vmul(m_jacWStdW.size(), m_jacWStdW, 1, input, 1, wsp, 1);
312 for (
int i = 0; i < m_numElmt; ++i)
314 m_stdExp->IProductWRTBase_SumFac(wsp + i * nPhys,
315 tmp = output + i * nCoeffs,
false);
323 boost::ignore_unused(dir, input, output, wsp);
324 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
328 int coll_phys_offset)
override
330 boost::ignore_unused(factors, coll_phys_offset);
331 ASSERTL0(
false,
"Not valid for this operator.");
339 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
341 :
Operator(pCollExp, pGeomData, factors)
345 for (
int i = 0; i < PtsKey.size(); ++i)
347 nqtot *= PtsKey[i].GetNumPoints();
350 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
352 m_wspSize = nqtot * m_numElmt;
357 OperatorKey IProductWRTBase_IterPerExp::m_typeArr[] = {
360 IProductWRTBase_IterPerExp::create,
"IProductWRTBase_IterPerExp_Seg"),
363 IProductWRTBase_IterPerExp::create,
"IProductWRTBase_IterPerExp_Tri"),
366 IProductWRTBase_IterPerExp::create,
367 "IProductWRTBase_IterPerExp_NodalTri"),
370 IProductWRTBase_IterPerExp::create,
"IProductWRTBase_IterPerExp_Quad"),
373 IProductWRTBase_IterPerExp::create,
"IProductWRTBase_IterPerExp_Tet"),
376 IProductWRTBase_IterPerExp::create,
377 "IProductWRTBase_IterPerExp_NodalTet"),
380 IProductWRTBase_IterPerExp::create,
"IProductWRTBase_IterPerExp_Pyr"),
383 IProductWRTBase_IterPerExp::create,
"IProductWRTBase_IterPerExp_Prism"),
386 IProductWRTBase_IterPerExp::create,
387 "IProductWRTBase_IterPerExp_NodalPrism"),
390 IProductWRTBase_IterPerExp::create,
"IProductWRTBase_IterPerExp_Hex"),
411 boost::ignore_unused(output1, output2, wsp);
413 const int nCoeffs = m_expList[0]->GetNcoeffs();
414 const int nPhys = m_expList[0]->GetTotPoints();
417 for (
int i = 0; i < m_numElmt; ++i)
419 m_expList[i]->IProductWRTBase(input + i * nPhys,
420 tmp = output + i * nCoeffs);
428 boost::ignore_unused(dir, input, output, wsp);
429 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
433 int coll_phys_offset)
override
435 boost::ignore_unused(factors, coll_phys_offset);
436 ASSERTL0(
false,
"Not valid for this operator.");
444 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
446 :
Operator(pCollExp, pGeomData, factors)
448 m_expList = pCollExp;
453 OperatorKey IProductWRTBase_NoCollection::m_typeArr[] = {
456 IProductWRTBase_NoCollection::create,
457 "IProductWRTBase_NoCollection_Seg"),
460 IProductWRTBase_NoCollection::create,
461 "IProductWRTBase_NoCollection_Tri"),
464 IProductWRTBase_NoCollection::create,
465 "IProductWRTBase_NoCollection_NodalTri"),
468 IProductWRTBase_NoCollection::create,
469 "IProductWRTBase_NoCollection_Quad"),
472 IProductWRTBase_NoCollection::create,
473 "IProductWRTBase_NoCollection_Tet"),
476 IProductWRTBase_NoCollection::create,
477 "IProductWRTBase_NoCollection_NodalTet"),
480 IProductWRTBase_NoCollection::create,
481 "IProductWRTBase_NoCollection_Pyr"),
484 IProductWRTBase_NoCollection::create,
485 "IProductWRTBase_NoCollection_Prism"),
488 IProductWRTBase_NoCollection::create,
489 "IProductWRTBase_NoCollection_NodalPrism"),
492 IProductWRTBase_NoCollection::create,
493 "IProductWRTBase_NoCollection_Hex"),
514 boost::ignore_unused(output1, output2);
518 Vmath::Vmul(m_numElmt * m_nquad0, m_jacWStdW, 1, input, 1, output,
523 Vmath::Vmul(m_numElmt * m_nquad0, m_jacWStdW, 1, input, 1, wsp, 1);
526 Blas::Dgemm(
'T',
'N', m_nmodes0, m_numElmt, m_nquad0, 1.0,
527 m_base0.get(), m_nquad0, &wsp[0], m_nquad0, 0.0,
528 &output[0], m_nmodes0);
536 boost::ignore_unused(dir, input, output, wsp);
537 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
541 int coll_phys_offset)
override
543 boost::ignore_unused(factors, coll_phys_offset);
544 ASSERTL0(
false,
"Not valid for this operator.");
556 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
558 :
Operator(pCollExp, pGeomData, factors),
559 m_nquad0(m_stdExp->GetNumPoints(0)),
560 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
561 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
562 m_base0(m_stdExp->GetBasis(0)->GetBdata())
564 m_wspSize = m_numElmt * m_nquad0;
565 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
573 IProductWRTBase_SumFac_Seg::create,
"IProductWRTBase_SumFac_Seg");
593 boost::ignore_unused(output1, output2);
595 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
597 QuadIProduct(m_colldir0, m_colldir1, m_numElmt, m_nquad0, m_nquad1,
598 m_nmodes0, m_nmodes1, m_base0, m_base1, m_jacWStdW, input,
606 boost::ignore_unused(dir, input, output, wsp);
607 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
611 int coll_phys_offset)
override
613 boost::ignore_unused(factors, coll_phys_offset);
614 ASSERTL0(
false,
"Not valid for this operator.");
630 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
632 :
Operator(pCollExp, pGeomData, factors),
633 m_nquad0(m_stdExp->GetNumPoints(0)),
634 m_nquad1(m_stdExp->GetNumPoints(1)),
635 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
636 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
637 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
638 m_colldir1(m_stdExp->GetBasis(1)->Collocation()),
639 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
640 m_base1(m_stdExp->GetBasis(1)->GetBdata())
642 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
644 2 * m_numElmt * (max(m_nquad0 * m_nquad1, m_nmodes0 * m_nmodes1));
652 IProductWRTBase_SumFac_Quad::create,
"IProductWRTBase_SumFac_Quad");
672 boost::ignore_unused(output1, output2);
674 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
676 TriIProduct(m_sortTopVertex, m_numElmt, m_nquad0, m_nquad1, m_nmodes0,
677 m_nmodes1, m_base0, m_base1, m_jacWStdW, input, output,
685 boost::ignore_unused(dir, input, output, wsp);
686 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
690 int coll_phys_offset)
override
692 boost::ignore_unused(factors, coll_phys_offset);
693 ASSERTL0(
false,
"Not valid for this operator.");
708 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
710 :
Operator(pCollExp, pGeomData, factors),
711 m_nquad0(m_stdExp->GetNumPoints(0)),
712 m_nquad1(m_stdExp->GetNumPoints(1)),
713 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
714 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
715 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
716 m_base1(m_stdExp->GetBasis(1)->GetBdata())
718 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
720 2 * m_numElmt * (max(m_nquad0 * m_nquad1, m_nmodes0 * m_nmodes1));
723 m_sortTopVertex =
true;
727 m_sortTopVertex =
false;
736 IProductWRTBase_SumFac_Tri::create,
"IProductWRTBase_SumFac_Tri");
756 boost::ignore_unused(output1, output2);
758 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
760 HexIProduct(m_colldir0, m_colldir1, m_colldir2, m_numElmt, m_nquad0,
761 m_nquad1, m_nquad2, m_nmodes0, m_nmodes1, m_nmodes2,
762 m_base0, m_base1, m_base2, m_jacWStdW, input, output, wsp);
769 boost::ignore_unused(dir, input, output, wsp);
770 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
774 int coll_phys_offset)
override
776 boost::ignore_unused(factors, coll_phys_offset);
777 ASSERTL0(
false,
"Not valid for this operator.");
797 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
799 :
Operator(pCollExp, pGeomData, factors),
800 m_nquad0(m_stdExp->GetNumPoints(0)),
801 m_nquad1(m_stdExp->GetNumPoints(1)),
802 m_nquad2(m_stdExp->GetNumPoints(2)),
803 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
804 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
805 m_nmodes2(m_stdExp->GetBasisNumModes(2)),
806 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
807 m_colldir1(m_stdExp->GetBasis(1)->Collocation()),
808 m_colldir2(m_stdExp->GetBasis(2)->Collocation()),
809 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
810 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
811 m_base2(m_stdExp->GetBasis(2)->GetBdata())
814 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
815 m_wspSize = 3 * m_numElmt *
816 (max(m_nquad0 * m_nquad1 * m_nquad2,
817 m_nmodes0 * m_nmodes1 * m_nmodes2));
825 IProductWRTBase_SumFac_Hex::create,
"IProductWRTBase_SumFac_Hex");
845 boost::ignore_unused(output1, output2);
847 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
849 TetIProduct(m_sortTopEdge, m_numElmt, m_nquad0, m_nquad1, m_nquad2,
850 m_nmodes0, m_nmodes1, m_nmodes2, m_base0, m_base1, m_base2,
851 m_jacWStdW, input, output, wsp);
858 boost::ignore_unused(dir, input, output, wsp);
859 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
863 int coll_phys_offset)
override
865 boost::ignore_unused(factors, coll_phys_offset);
866 ASSERTL0(
false,
"Not valid for this operator.");
884 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
886 :
Operator(pCollExp, pGeomData, factors),
887 m_nquad0(m_stdExp->GetNumPoints(0)),
888 m_nquad1(m_stdExp->GetNumPoints(1)),
889 m_nquad2(m_stdExp->GetNumPoints(2)),
890 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
891 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
892 m_nmodes2(m_stdExp->GetBasisNumModes(2)),
893 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
894 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
895 m_base2(m_stdExp->GetBasis(2)->GetBdata())
897 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
900 (max(m_nquad0 * m_nquad1 * m_nquad2,
901 m_nquad2 * m_nmodes0 * (2 * m_nmodes1 - m_nmodes0 + 1) / 2) +
902 m_nquad2 * m_nquad1 * m_nmodes0);
906 m_sortTopEdge =
true;
910 m_sortTopEdge =
false;
919 IProductWRTBase_SumFac_Tet::create,
"IProductWRTBase_SumFac_Tet");
939 boost::ignore_unused(output1, output2);
941 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
943 PrismIProduct(m_sortTopVertex, m_numElmt, m_nquad0, m_nquad1, m_nquad2,
944 m_nmodes0, m_nmodes1, m_nmodes2, m_base0, m_base1,
945 m_base2, m_jacWStdW, input, output, wsp);
952 boost::ignore_unused(dir, input, output, wsp);
953 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
957 int coll_phys_offset)
override
959 boost::ignore_unused(factors, coll_phys_offset);
960 ASSERTL0(
false,
"Not valid for this operator.");
978 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
980 :
Operator(pCollExp, pGeomData, factors),
981 m_nquad0(m_stdExp->GetNumPoints(0)),
982 m_nquad1(m_stdExp->GetNumPoints(1)),
983 m_nquad2(m_stdExp->GetNumPoints(2)),
984 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
985 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
986 m_nmodes2(m_stdExp->GetBasisNumModes(2)),
987 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
988 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
989 m_base2(m_stdExp->GetBasis(2)->GetBdata())
992 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
994 m_wspSize = m_numElmt * m_nquad2 *
995 (max(m_nquad0 * m_nquad1, m_nmodes0 * m_nmodes1)) +
996 m_nquad1 * m_nquad2 * m_numElmt * m_nmodes0;
1000 m_sortTopVertex =
true;
1004 m_sortTopVertex =
false;
1010 OperatorKey IProductWRTBase_SumFac_Prism::m_type =
1013 IProductWRTBase_SumFac_Prism::create,
"IProductWRTBase_SumFac_Prism");
1033 boost::ignore_unused(output1, output2);
1035 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
1037 PyrIProduct(m_sortTopVertex, m_numElmt, m_nquad0, m_nquad1, m_nquad2,
1038 m_nmodes0, m_nmodes1, m_nmodes2, m_base0, m_base1, m_base2,
1039 m_jacWStdW, input, output, wsp);
1046 boost::ignore_unused(dir, input, output, wsp);
1047 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
1051 int coll_phys_offset)
override
1053 boost::ignore_unused(factors, coll_phys_offset);
1054 ASSERTL0(
false,
"Not valid for this operator.");
1072 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1074 :
Operator(pCollExp, pGeomData, factors),
1075 m_nquad0(m_stdExp->GetNumPoints(0)),
1076 m_nquad1(m_stdExp->GetNumPoints(1)),
1077 m_nquad2(m_stdExp->GetNumPoints(2)),
1078 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
1079 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
1080 m_nmodes2(m_stdExp->GetBasisNumModes(2)),
1081 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
1082 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
1083 m_base2(m_stdExp->GetBasis(2)->GetBdata())
1086 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
1088 m_wspSize = m_numElmt * m_nquad2 *
1089 (max(m_nquad0 * m_nquad1, m_nmodes0 * m_nmodes1)) +
1090 m_nquad1 * m_nquad2 * m_numElmt * m_nmodes0;
1094 m_sortTopVertex =
true;
1098 m_sortTopVertex =
false;
1107 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.
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
Array< OneD, NekDouble > m_jacWStdW
~IProductWRTBase_IterPerExp() final
IProductWRTBase_IterPerExp(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) override 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) override final
Perform operation.
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) override
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) override final
Perform operation.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
std::shared_ptr< MatrixFree::IProduct > m_oper
Inner product operator using original MultiRegions implementation.
virtual 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) override final
~IProductWRTBase_NoCollection() 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) override final
Perform operation.
vector< StdRegions::StdExpansionSharedPtr > m_expList
IProductWRTBase_NoCollection(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Inner product operator using standard matrix approach.
Array< OneD, const NekDouble > m_jac
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
IProductWRTBase_StdMat(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 final
Perform operation.
~IProductWRTBase_StdMat() final
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
Inner Product operator using sum-factorisation (Hex)
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 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
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
Array< OneD, const NekDouble > m_base2
Array< OneD, const NekDouble > m_base1
Array< OneD, const NekDouble > m_jacWStdW
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
Inner Product operator using sum-factorisation (Prism)
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 final
Perform operation.
Array< OneD, const NekDouble > m_jacWStdW
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
Array< OneD, const NekDouble > m_base1
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_base2
IProductWRTBase_SumFac_Prism(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~IProductWRTBase_SumFac_Prism() final
Inner Product operator using sum-factorisation (Pyr)
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 final
Perform operation.
Array< OneD, const NekDouble > m_jacWStdW
Array< OneD, const NekDouble > m_base2
Array< OneD, const NekDouble > m_base0
virtual 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) override final
Array< OneD, const NekDouble > m_base1
~IProductWRTBase_SumFac_Pyr() final
IProductWRTBase_SumFac_Pyr(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
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) 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) override 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) override final
Perform operation.
Inner product operator using sum-factorisation (Segment)
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
Array< OneD, const NekDouble > m_jacWStdW
IProductWRTBase_SumFac_Seg(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 final
Perform operation.
~IProductWRTBase_SumFac_Seg() final
Array< OneD, const NekDouble > m_base0
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
Inner product operator using sum-factorisation (Tet)
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 final
Perform operation.
Array< OneD, const NekDouble > m_jacWStdW
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
Array< OneD, const NekDouble > m_base1
IProductWRTBase_SumFac_Tet(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~IProductWRTBase_SumFac_Tet() final
Array< OneD, const NekDouble > m_base0
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
Array< OneD, const NekDouble > m_base2
Inner product operator using sum-factorisation (Tri)
Array< OneD, const NekDouble > m_base0
IProductWRTBase_SumFac_Tri(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) override final
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
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) override final
Perform operation.
Array< OneD, const NekDouble > m_jacWStdW
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.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
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)
std::tuple< LibUtilities::ShapeType, OperatorType, ImplementationType, ExpansionIsNodal > OperatorKey
Key for describing an Operator.
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::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)