35 #include <boost/core/ignore_unused.hpp>
37 #include <MatrixFreeOps/Operator.hpp>
78 int nPhys = m_stdExp->GetTotPoints();
79 int ntot = m_numElmt * nPhys;
80 int nmodes = m_stdExp->GetNcoeffs();
89 output = (m_coordim == 3) ? entry3 : (m_coordim == 2) ? entry2 : entry1;
91 for (
int i = 0; i < m_dim; ++i)
93 tmp[i] = wsp + i * ntot;
102 for (
int i = 0; i < m_dim; ++i)
104 Vmath::Vmul(ntot, m_derivFac[i], 1, in[0], 1, tmp[i], 1);
105 for (
int j = 1; j < m_coordim; ++j)
107 Vmath::Vvtvp(ntot, m_derivFac[i + j * m_dim], 1, in[j], 1,
108 tmp[i], 1, tmp[i], 1);
117 for (
int e = 0; e < m_numElmt; ++e)
120 for (
int i = 0; i < m_dim; ++i)
122 Vmath::Smul(m_nqe, m_derivFac[i][e], in[0] + e * m_nqe, 1,
123 t = tmp[i] + e * m_nqe, 1);
124 for (
int j = 1; j < m_coordim; ++j)
127 in[j] + e * m_nqe, 1, tmp[i] + e * m_nqe,
128 1, t = tmp[i] + e * m_nqe, 1);
132 Vmath::Smul(m_nqe, m_jac[e], tmp[0] + e * m_nqe, 1,
133 t = tmp[0] + e * m_nqe, 1);
137 Blas::Dgemm(
'N',
'N', m_iProdWRTStdDBase[0]->GetRows(), m_numElmt,
138 m_iProdWRTStdDBase[0]->GetColumns(), 1.0,
139 m_iProdWRTStdDBase[0]->GetRawPtr(),
140 m_iProdWRTStdDBase[0]->GetRows(), tmp[0].get(), nPhys, 0.0,
141 output.get(), nmodes);
144 for (
int i = 1; i < m_dim; ++i)
153 for (
int e = 0; e < m_numElmt; ++e)
155 Vmath::Smul(m_nqe, m_jac[e], tmp[i] + e * m_nqe, 1,
156 t = tmp[i] + e * m_nqe, 1);
159 Blas::Dgemm(
'N',
'N', m_iProdWRTStdDBase[i]->GetRows(), m_numElmt,
160 m_iProdWRTStdDBase[i]->GetColumns(), 1.0,
161 m_iProdWRTStdDBase[i]->GetRawPtr(),
162 m_iProdWRTStdDBase[i]->GetRows(), tmp[i].get(), nPhys,
163 1.0, output.get(), nmodes);
171 boost::ignore_unused(dir, input, output, wsp);
172 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
176 int coll_phys_offset)
override
178 boost::ignore_unused(factors, coll_phys_offset);
179 ASSERTL0(
false,
"Not valid for this operator.");
191 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
193 :
Operator(pCollExp, pGeomData, factors)
196 m_dim = PtsKey.size();
197 m_coordim = pCollExp[0]->GetCoordim();
199 m_nqe = m_stdExp->GetTotPoints();
200 int nmodes = m_stdExp->GetNcoeffs();
204 for (
int i = 0; i < m_dim; ++i)
207 m_iProdWRTStdDBase[i] =
209 for (
int j = 0; j < m_nqe; ++j)
213 m_stdExp->IProductWRTDerivBase(i, tmp, tmp1);
215 &(m_iProdWRTStdDBase[i]->GetPtr())[0] + j * nmodes,
219 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
220 m_jac = pGeomData->GetJac(pCollExp);
221 m_wspSize = m_dim * m_nqe * m_numElmt;
226 OperatorKey IProductWRTDerivBase_StdMat::m_typeArr[] = {
229 IProductWRTDerivBase_StdMat::create,
"IProductWRTDerivBase_StdMat_Seg"),
232 IProductWRTDerivBase_StdMat::create,
"IProductWRTDerivBase_StdMat_Tri"),
235 IProductWRTDerivBase_StdMat::create,
236 "IProductWRTDerivBase_StdMat_NodalTri"),
239 IProductWRTDerivBase_StdMat::create,
240 "IProductWRTDerivBase_StdMat_Quad"),
243 IProductWRTDerivBase_StdMat::create,
"IProductWRTDerivBase_StdMat_Tet"),
246 IProductWRTDerivBase_StdMat::create,
247 "IProductWRTDerivBase_StdMat_NodalTet"),
250 IProductWRTDerivBase_StdMat::create,
"IProductWRTDerivBase_StdMat_Pyr"),
253 IProductWRTDerivBase_StdMat::create,
254 "IProductWRTDerivBase_StdMat_Prism"),
257 IProductWRTDerivBase_StdMat::create,
258 "IProductWRTDerivBase_StdMat_NodalPrism"),
261 IProductWRTDerivBase_StdMat::create,
"IProductWRTDerivBase_StdMat_Hex"),
264 IProductWRTDerivBase_StdMat::create,
265 "IProductWRTDerivBase_SumFac_Pyr")};
286 boost::ignore_unused(wsp);
311 NEKERROR(ErrorUtil::efatal,
"m_coordim value not valid");
316 (*m_oper)(m_input, m_output);
343 NEKERROR(ErrorUtil::efatal,
"coordim not valid");
347 (*m_oper)(input, output);
355 boost::ignore_unused(dir, input, output, wsp);
356 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
360 int coll_phys_offset)
override
362 boost::ignore_unused(factors, coll_phys_offset);
363 ASSERTL0(
false,
"Not valid for this operator.");
367 std::shared_ptr<MatrixFree::IProductWRTDerivBase>
m_oper;
370 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
372 :
Operator(pCollExp, pGeomData, factors),
374 pCollExp[0]->GetStdExp()->GetTotPoints(),
375 pCollExp[0]->GetStdExp()->GetNcoeffs(),
379 const auto dim = pCollExp[0]->GetStdExp()->GetShapeDimension();
382 std::vector<LibUtilities::BasisSharedPtr> basis(dim);
383 for (
unsigned int i = 0; i < dim; ++i)
385 basis[i] = pCollExp[0]->GetBasis(i);
389 auto shapeType = pCollExp[0]->GetStdExp()->DetShapeType();
392 std::string op_string =
"IProductWRTDerivBase";
393 op_string += MatrixFree::GetOpstring(shapeType, m_isDeformed);
395 op_string, basis, m_nElmtPad);
398 oper->SetJac(pGeomData->GetJacInterLeave(pCollExp, m_nElmtPad));
401 oper->SetDF(pGeomData->GetDerivFactorsInterLeave(pCollExp, m_nElmtPad));
404 std::dynamic_pointer_cast<MatrixFree::IProductWRTDerivBase>(oper);
405 ASSERTL0(m_oper,
"Failed to cast pointer.");
410 OperatorKey IProductWRTDerivBase_MatrixFree::m_typeArr[] = {
413 IProductWRTDerivBase_MatrixFree::create,
414 "IProductWRTDerivBase_MatrixFree_Seg"),
417 IProductWRTDerivBase_MatrixFree::create,
418 "IProductWRTDerivBase_MatrixFree_Quad"),
421 IProductWRTDerivBase_MatrixFree::create,
422 "IProductWRTDerivBase_MatrixFree_Tri"),
425 IProductWRTDerivBase_MatrixFree::create,
426 "IProductWRTDerivBase_MatrixFree_Hex"),
429 IProductWRTDerivBase_MatrixFree::create,
430 "IProductWRTDerivBase_MatrixFree_Prism"),
433 IProductWRTDerivBase_MatrixFree::create,
434 "IProductWRTDerivBase_MatrixFree_Pyr"),
437 IProductWRTDerivBase_MatrixFree::create,
438 "IProductWRTDerivBase_MatrixFree_Tet")};
459 unsigned int nPhys = m_stdExp->GetTotPoints();
460 unsigned int ntot = m_numElmt * nPhys;
461 unsigned int nmodes = m_stdExp->GetNcoeffs();
462 unsigned int nmax = max(ntot, m_numElmt * nmodes);
471 output = (m_coordim == 3) ? entry3 : (m_coordim == 2) ? entry2 : entry1;
473 for (
int i = 0; i < m_dim; ++i)
475 tmp[i] = wsp + i * nmax;
483 for (
int i = 0; i < m_dim; ++i)
485 Vmath::Vmul(ntot, m_derivFac[i], 1, in[0], 1, tmp[i], 1);
486 for (
int j = 1; j < m_coordim; ++j)
488 Vmath::Vvtvp(ntot, m_derivFac[i + j * m_dim], 1, in[j], 1,
489 tmp[i], 1, tmp[i], 1);
498 for (
int e = 0; e < m_numElmt; ++e)
501 for (
int i = 0; i < m_dim; ++i)
503 Vmath::Smul(m_nqe, m_derivFac[i][e], in[0] + e * m_nqe, 1,
504 t = tmp[i] + e * m_nqe, 1);
505 for (
int j = 1; j < m_coordim; ++j)
508 in[j] + e * m_nqe, 1, tmp[i] + e * m_nqe,
509 1, t = tmp[i] + e * m_nqe, 1);
513 Vmath::Smul(m_nqe, m_jac[e], tmp[0] + e * m_nqe, 1,
514 t = tmp[0] + e * m_nqe, 1);
518 for (
int n = 0; n < m_numElmt; ++n)
520 m_stdExp->IProductWRTDerivBase(0, tmp[0] + n * nPhys,
521 tmp1 = output + n * nmodes);
525 for (
int i = 1; i < m_dim; ++i)
535 for (
int e = 0; e < m_numElmt; ++e)
537 Vmath::Smul(m_nqe, m_jac[e], tmp[i] + e * m_nqe, 1,
538 t = tmp[i] + e * m_nqe, 1);
542 for (
int n = 0; n < m_numElmt; ++n)
544 m_stdExp->IProductWRTDerivBase(i, tmp[i] + n * nPhys, tmp[0]);
545 Vmath::Vadd(nmodes, tmp[0], 1, output + n * nmodes, 1,
546 tmp1 = output + n * nmodes, 1);
555 boost::ignore_unused(dir, input, output, wsp);
556 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
560 int coll_phys_offset)
override
562 boost::ignore_unused(factors, coll_phys_offset);
563 ASSERTL0(
false,
"Not valid for this operator.");
574 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
576 :
Operator(pCollExp, pGeomData, factors)
579 m_dim = PtsKey.size();
580 m_coordim = pCollExp[0]->GetCoordim();
582 m_nqe = m_stdExp->GetTotPoints();
584 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
585 m_jac = pGeomData->GetJac(pCollExp);
586 m_wspSize = m_dim * m_nqe * m_numElmt;
591 OperatorKey IProductWRTDerivBase_IterPerExp::m_typeArr[] = {
594 IProductWRTDerivBase_IterPerExp::create,
595 "IProductWRTDerivBase_IterPerExp_Seg"),
598 IProductWRTDerivBase_IterPerExp::create,
599 "IProductWRTDerivBase_IterPerExp_Tri"),
602 IProductWRTDerivBase_IterPerExp::create,
603 "IProductWRTDerivBase_IterPerExp_NodalTri"),
606 IProductWRTDerivBase_IterPerExp::create,
607 "IProductWRTDerivBase_IterPerExp_Quad"),
610 IProductWRTDerivBase_IterPerExp::create,
611 "IProductWRTDerivBase_IterPerExp_Tet"),
614 IProductWRTDerivBase_IterPerExp::create,
615 "IProductWRTDerivBase_IterPerExp_NodalTet"),
618 IProductWRTDerivBase_IterPerExp::create,
619 "IProductWRTDerivBase_IterPerExp_Pyr"),
622 IProductWRTDerivBase_IterPerExp::create,
623 "IProductWRTDerivBase_IterPerExp_Prism"),
626 IProductWRTDerivBase_IterPerExp::create,
627 "IProductWRTDerivBase_IterPerExp_NodalPrism"),
630 IProductWRTDerivBase_IterPerExp::create,
631 "IProductWRTDerivBase_IterPerExp_Hex")};
652 boost::ignore_unused(wsp);
654 unsigned int nmodes = m_expList[0]->GetNcoeffs();
655 unsigned int nPhys = m_expList[0]->GetTotPoints();
664 output = (m_coordim == 3) ? entry3 : (m_coordim == 2) ? entry2 : entry1;
666 for (
int n = 0; n < m_numElmt; ++n)
668 m_expList[n]->IProductWRTDerivBase(0, in[0] + n * nPhys,
669 tmp1 = output + n * nmodes);
672 for (
int i = 1; i < m_dim; ++i)
674 for (
int n = 0; n < m_numElmt; ++n)
676 m_expList[n]->IProductWRTDerivBase(i, in[i] + n * nPhys, tmp);
678 Vmath::Vadd(nmodes, tmp, 1, output + n * nmodes, 1,
679 tmp1 = output + n * nmodes, 1);
688 boost::ignore_unused(dir, input, output, wsp);
689 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
693 int coll_phys_offset)
override
695 boost::ignore_unused(factors, coll_phys_offset);
696 ASSERTL0(
false,
"Not valid for this operator.");
706 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
708 :
Operator(pCollExp, pGeomData, factors)
710 m_expList = pCollExp;
711 m_dim = pCollExp[0]->GetNumBases();
712 m_coordim = pCollExp[0]->GetCoordim();
717 OperatorKey IProductWRTDerivBase_NoCollection::m_typeArr[] = {
720 IProductWRTDerivBase_NoCollection::create,
721 "IProductWRTDerivBase_NoCollection_Seg"),
724 IProductWRTDerivBase_NoCollection::create,
725 "IProductWRTDerivBase_NoCollection_Tri"),
728 IProductWRTDerivBase_NoCollection::create,
729 "IProductWRTDerivBase_NoCollection_NodalTri"),
733 IProductWRTDerivBase_NoCollection::create,
734 "IProductWRTDerivBase_NoCollection_Quad"),
737 IProductWRTDerivBase_NoCollection::create,
738 "IProductWRTDerivBase_NoCollection_Tet"),
741 IProductWRTDerivBase_NoCollection::create,
742 "IProductWRTDerivBase_NoCollection_NodalTet"),
745 IProductWRTDerivBase_NoCollection::create,
746 "IProductWRTDerivBase_NoCollection_Pyr"),
749 IProductWRTDerivBase_NoCollection::create,
750 "IProductWRTDerivBase_NoCollection_Prism"),
753 IProductWRTDerivBase_NoCollection::create,
754 "IProductWRTDerivBase_NoCollection_NodalPrism"),
757 IProductWRTDerivBase_NoCollection::create,
758 "IProductWRTDerivBase_NoCollection_Hex")};
782 output = (m_coordim == 3) ? entry3 : (m_coordim == 2) ? entry2 : entry1;
791 Vmath::Vmul(m_wspSize, m_derivFac[0], 1, in[0], 1, wsp, 1);
792 for (
int i = 1; i < m_coordim; ++i)
794 Vmath::Vvtvp(m_wspSize, m_derivFac[i], 1, in[i], 1, wsp, 1, wsp,
801 for (
int e = 0; e < m_numElmt; ++e)
803 Vmath::Smul(m_nquad0, m_derivFac[0][e], in[0] + e * m_nquad0, 1,
804 t = wsp + e * m_nquad0, 1);
807 for (
int i = 1; i < m_coordim; ++i)
809 for (
int e = 0; e < m_numElmt; ++e)
812 in[i] + e * m_nquad0, 1, wsp + e * m_nquad0, 1,
813 t = wsp + e * m_nquad0, 1);
818 Vmath::Vmul(m_wspSize, m_jacWStdW, 1, wsp, 1, wsp, 1);
821 Blas::Dgemm(
'T',
'N', m_nmodes0, m_numElmt, m_nquad0, 1.0,
822 m_derbase0.get(), m_nquad0, &wsp[0], m_nquad0, 0.0,
823 &output[0], m_nmodes0);
830 boost::ignore_unused(dir, input, output, wsp);
831 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
835 int coll_phys_offset)
override
837 boost::ignore_unused(factors, coll_phys_offset);
838 ASSERTL0(
false,
"Not valid for this operator.");
851 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
853 :
Operator(pCollExp, pGeomData, factors),
854 m_nquad0(m_stdExp->GetNumPoints(0)),
855 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
856 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata())
858 m_coordim = pCollExp[0]->GetCoordim();
859 m_wspSize = m_numElmt * m_nquad0;
860 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
861 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
866 OperatorKey IProductWRTDerivBase_SumFac_Seg::m_type =
869 IProductWRTDerivBase_SumFac_Seg::create,
870 "IProductWRTDerivBase_SumFac_Seg");
891 unsigned int nPhys = m_stdExp->GetTotPoints();
892 unsigned int ntot = m_numElmt * nPhys;
893 unsigned int nmodes = m_stdExp->GetNcoeffs();
894 unsigned int nmax = max(ntot, m_numElmt * nmodes);
903 output = (m_coordim == 2) ? entry2 : entry3;
907 wsp1 = wsp + 2 * nmax;
912 for (
int i = 0; i < 2; ++i)
914 Vmath::Vmul(ntot, m_derivFac[i], 1, in[0], 1, tmp[i], 1);
915 for (
int j = 1; j < m_coordim; ++j)
918 tmp[i], 1, tmp[i], 1);
925 for (
int e = 0; e < m_numElmt; ++e)
928 for (
int i = 0; i < 2; ++i)
930 Vmath::Smul(m_nqe, m_derivFac[i][e], in[0] + e * m_nqe, 1,
931 t = tmp[i] + e * m_nqe, 1);
932 for (
int j = 1; j < m_coordim; ++j)
935 in[j] + e * m_nqe, 1, tmp[i] + e * m_nqe,
936 1, t = tmp[i] + e * m_nqe, 1);
942 QuadIProduct(
false, m_colldir1, m_numElmt, m_nquad0, m_nquad1,
943 m_nmodes0, m_nmodes1, m_derbase0, m_base1, m_jacWStdW,
944 tmp[0], output, wsp1);
947 QuadIProduct(m_colldir0,
false, m_numElmt, m_nquad0, m_nquad1,
948 m_nmodes0, m_nmodes1, m_base0, m_derbase1, m_jacWStdW,
949 tmp[1], tmp[0], wsp1);
951 Vmath::Vadd(m_numElmt * nmodes, tmp[0], 1, output, 1, output, 1);
958 boost::ignore_unused(dir, input, output, wsp);
959 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
963 int coll_phys_offset)
override
965 boost::ignore_unused(factors, coll_phys_offset);
966 ASSERTL0(
false,
"Not valid for this operator.");
986 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
988 :
Operator(pCollExp, pGeomData, factors),
989 m_nquad0(m_stdExp->GetNumPoints(0)),
990 m_nquad1(m_stdExp->GetNumPoints(1)),
991 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
992 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
993 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
994 m_colldir1(m_stdExp->GetBasis(1)->Collocation()),
995 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
996 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
997 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
998 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata())
1001 m_coordim = pCollExp[0]->GetCoordim();
1003 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1004 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
1006 4 * m_numElmt * (max(m_nquad0 * m_nquad1, m_nmodes0 * m_nmodes1));
1011 OperatorKey IProductWRTDerivBase_SumFac_Quad::m_type =
1014 IProductWRTDerivBase_SumFac_Quad::create,
1015 "IProductWRTDerivBase_IterPerExp_Quad");
1067 unsigned int nPhys = m_stdExp->GetTotPoints();
1068 unsigned int ntot = m_numElmt * nPhys;
1069 unsigned int nmodes = m_stdExp->GetNcoeffs();
1070 unsigned int nmax = max(ntot, m_numElmt * nmodes);
1079 output = (m_coordim == 2) ? entry2 : entry3;
1082 tmp[1] = wsp + nmax;
1083 wsp1 = wsp + 2 * nmax;
1087 for (
int i = 0; i < 2; ++i)
1089 Vmath::Vmul(ntot, m_derivFac[i], 1, in[0], 1, tmp[i], 1);
1090 for (
int j = 1; j < m_coordim; ++j)
1093 tmp[i], 1, tmp[i], 1);
1100 for (
int e = 0; e < m_numElmt; ++e)
1103 for (
int i = 0; i < 2; ++i)
1105 Vmath::Smul(m_nqe, m_derivFac[i][e], in[0] + e * m_nqe, 1,
1106 t = tmp[i] + e * m_nqe, 1);
1107 for (
int j = 1; j < m_coordim; ++j)
1110 in[j] + e * m_nqe, 1, tmp[i] + e * m_nqe,
1111 1, t = tmp[i] + e * m_nqe, 1);
1118 for (
int i = 0; i < m_numElmt; ++i)
1121 Vmath::Vmul(nPhys, &m_fac0[0], 1, tmp[0].get() + i * nPhys, 1,
1122 tmp[0].get() + i * nPhys, 1);
1125 Vmath::Vvtvp(nPhys, &m_fac1[0], 1, tmp[1].get() + i * nPhys, 1,
1126 tmp[0].get() + i * nPhys, 1, tmp[0].get() + i * nPhys,
1131 TriIProduct(m_sortTopVertex, m_numElmt, m_nquad0, m_nquad1, m_nmodes0,
1132 m_nmodes1, m_derbase0, m_base1, m_jacWStdW, tmp[0], output,
1136 TriIProduct(m_sortTopVertex, m_numElmt, m_nquad0, m_nquad1, m_nmodes0,
1137 m_nmodes1, m_base0, m_derbase1, m_jacWStdW, tmp[1], tmp[0],
1140 Vmath::Vadd(m_numElmt * nmodes, tmp[0], 1, output, 1, output, 1);
1147 boost::ignore_unused(dir, input, output, wsp);
1148 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
1152 int coll_phys_offset)
override
1154 boost::ignore_unused(factors, coll_phys_offset);
1155 ASSERTL0(
false,
"Not valid for this operator.");
1178 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1180 :
Operator(pCollExp, pGeomData, factors),
1181 m_nquad0(m_stdExp->GetNumPoints(0)),
1182 m_nquad1(m_stdExp->GetNumPoints(1)),
1183 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
1184 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
1185 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
1186 m_colldir1(m_stdExp->GetBasis(1)->Collocation()),
1187 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
1188 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
1189 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
1190 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata())
1193 m_coordim = pCollExp[0]->GetCoordim();
1195 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1196 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
1198 4 * m_numElmt * (max(m_nquad0 * m_nquad1, m_nmodes0 * m_nmodes1));
1202 m_sortTopVertex =
true;
1206 m_sortTopVertex =
false;
1214 for (
int i = 0; i < m_nquad0; ++i)
1216 for (
int j = 0; j < m_nquad1; ++j)
1218 m_fac0[i + j * m_nquad0] = 2.0 / (1 - z1[j]);
1224 for (
int i = 0; i < m_nquad0; ++i)
1226 for (
int j = 0; j < m_nquad1; ++j)
1228 m_fac1[i + j * m_nquad0] = (1 + z0[i]) / (1 - z1[j]);
1235 OperatorKey IProductWRTDerivBase_SumFac_Tri::m_type =
1238 IProductWRTDerivBase_SumFac_Tri::create,
1239 "IProductWRTDerivBase_IterPerExp_Tri");
1260 unsigned int nPhys = m_stdExp->GetTotPoints();
1261 unsigned int ntot = m_numElmt * nPhys;
1262 unsigned int nmodes = m_stdExp->GetNcoeffs();
1263 unsigned int nmax = max(ntot, m_numElmt * nmodes);
1274 for (
int i = 0; i < 3; ++i)
1276 tmp[i] = wsp + i * nmax;
1282 for (
int i = 0; i < 3; ++i)
1284 Vmath::Vmul(ntot, m_derivFac[i], 1, in[0], 1, tmp[i], 1);
1285 for (
int j = 1; j < 3; ++j)
1288 tmp[i], 1, tmp[i], 1);
1295 for (
int e = 0; e < m_numElmt; ++e)
1298 for (
int i = 0; i < 3; ++i)
1300 Vmath::Smul(m_nqe, m_derivFac[i][e], in[0] + e * m_nqe, 1,
1301 t = tmp[i] + e * m_nqe, 1);
1302 for (
int j = 1; j < 3; ++j)
1305 in[j] + e * m_nqe, 1, tmp[i] + e * m_nqe,
1306 1, t = tmp[i] + e * m_nqe, 1);
1312 wsp1 = wsp + 3 * nmax;
1315 HexIProduct(
false, m_colldir1, m_colldir2, m_numElmt, m_nquad0,
1316 m_nquad1, m_nquad2, m_nmodes0, m_nmodes1, m_nmodes2,
1317 m_derbase0, m_base1, m_base2, m_jacWStdW, tmp[0], output,
1320 HexIProduct(m_colldir0,
false, m_colldir2, m_numElmt, m_nquad0,
1321 m_nquad1, m_nquad2, m_nmodes0, m_nmodes1, m_nmodes2,
1322 m_base0, m_derbase1, m_base2, m_jacWStdW, tmp[1], tmp[0],
1324 Vmath::Vadd(m_numElmt * nmodes, tmp[0], 1, output, 1, output, 1);
1326 HexIProduct(m_colldir0, m_colldir1,
false, m_numElmt, m_nquad0,
1327 m_nquad1, m_nquad2, m_nmodes0, m_nmodes1, m_nmodes2,
1328 m_base0, m_base1, m_derbase2, m_jacWStdW, tmp[2], tmp[0],
1330 Vmath::Vadd(m_numElmt * nmodes, tmp[0], 1, output, 1, output, 1);
1337 boost::ignore_unused(dir, input, output, wsp);
1338 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
1342 int coll_phys_offset)
override
1344 boost::ignore_unused(factors, coll_phys_offset);
1345 ASSERTL0(
false,
"Not valid for this operator.");
1369 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1371 :
Operator(pCollExp, pGeomData, factors),
1372 m_nquad0(m_stdExp->GetNumPoints(0)),
1373 m_nquad1(m_stdExp->GetNumPoints(1)),
1374 m_nquad2(m_stdExp->GetNumPoints(2)),
1375 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
1376 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
1377 m_nmodes2(m_stdExp->GetBasisNumModes(2)),
1378 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
1379 m_colldir1(m_stdExp->GetBasis(1)->Collocation()),
1380 m_colldir2(m_stdExp->GetBasis(2)->Collocation()),
1381 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
1382 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
1383 m_base2(m_stdExp->GetBasis(2)->GetBdata()),
1384 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
1385 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata()),
1386 m_derbase2(m_stdExp->GetBasis(2)->GetDbdata())
1389 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
1390 m_wspSize = 6 * m_numElmt *
1391 (max(m_nquad0 * m_nquad1 * m_nquad2,
1392 m_nmodes0 * m_nmodes1 * m_nmodes2));
1393 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1398 OperatorKey IProductWRTDerivBase_SumFac_Hex::m_type =
1401 IProductWRTDerivBase_SumFac_Hex::create,
1402 "IProductWRTDerivBase_SumFac_Hex");
1472 unsigned int nPhys = m_stdExp->GetTotPoints();
1473 unsigned int ntot = m_numElmt * nPhys;
1474 unsigned int nmodes = m_stdExp->GetNcoeffs();
1475 unsigned int nmax = max(ntot, m_numElmt * nmodes);
1486 for (
int i = 0; i < 3; ++i)
1488 tmp[i] = wsp + i * nmax;
1494 for (
int i = 0; i < 3; ++i)
1496 Vmath::Vmul(ntot, m_derivFac[i], 1, in[0], 1, tmp[i], 1);
1497 for (
int j = 1; j < 3; ++j)
1500 tmp[i], 1, tmp[i], 1);
1507 for (
int e = 0; e < m_numElmt; ++e)
1510 for (
int i = 0; i < 3; ++i)
1512 Vmath::Smul(m_nqe, m_derivFac[i][e], in[0] + e * m_nqe, 1,
1513 t = tmp[i] + e * m_nqe, 1);
1514 for (
int j = 1; j < 3; ++j)
1517 in[j] + e * m_nqe, 1, tmp[i] + e * m_nqe,
1518 1, t = tmp[i] + e * m_nqe, 1);
1524 wsp1 = wsp + 3 * nmax;
1527 for (
int i = 0; i < m_numElmt; ++i)
1531 tmp[2].get() + i * nPhys, 1, wsp1.get(), 1);
1535 tmp[0].get() + i * nPhys, 1, tmp[0].get() + i * nPhys,
1539 Vmath::Vmul(nPhys, &m_fac0[0], 1, tmp[0].get() + i * nPhys, 1,
1540 tmp[0].get() + i * nPhys, 1);
1543 Vmath::Vvtvp(nPhys, &m_fac3[0], 1, tmp[2].get() + i * nPhys, 1,
1544 tmp[1].get() + i * nPhys, 1, tmp[1].get() + i * nPhys,
1548 Vmath::Vmul(nPhys, &m_fac2[0], 1, tmp[1].get() + i * nPhys, 1,
1549 tmp[1].get() + i * nPhys, 1);
1553 TetIProduct(m_sortTopEdge, m_numElmt, m_nquad0, m_nquad1, m_nquad2,
1554 m_nmodes0, m_nmodes1, m_nmodes2, m_derbase0, m_base1,
1555 m_base2, m_jacWStdW, tmp[0], output, wsp1);
1557 TetIProduct(m_sortTopEdge, m_numElmt, m_nquad0, m_nquad1, m_nquad2,
1558 m_nmodes0, m_nmodes1, m_nmodes2, m_base0, m_derbase1,
1559 m_base2, m_jacWStdW, tmp[1], tmp[0], wsp1);
1560 Vmath::Vadd(m_numElmt * nmodes, tmp[0], 1, output, 1, output, 1);
1562 TetIProduct(m_sortTopEdge, m_numElmt, m_nquad0, m_nquad1, m_nquad2,
1563 m_nmodes0, m_nmodes1, m_nmodes2, m_base0, m_base1,
1564 m_derbase2, m_jacWStdW, tmp[2], tmp[0], wsp1);
1565 Vmath::Vadd(m_numElmt * nmodes, tmp[0], 1, output, 1, output, 1);
1572 boost::ignore_unused(dir, input, output, wsp);
1573 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
1577 int coll_phys_offset)
override
1579 boost::ignore_unused(factors, coll_phys_offset);
1580 ASSERTL0(
false,
"Not valid for this operator.");
1606 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1608 :
Operator(pCollExp, pGeomData, factors),
1609 m_nquad0(m_stdExp->GetNumPoints(0)),
1610 m_nquad1(m_stdExp->GetNumPoints(1)),
1611 m_nquad2(m_stdExp->GetNumPoints(2)),
1612 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
1613 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
1614 m_nmodes2(m_stdExp->GetBasisNumModes(2)),
1615 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
1616 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
1617 m_base2(m_stdExp->GetBasis(2)->GetBdata()),
1618 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
1619 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata()),
1620 m_derbase2(m_stdExp->GetBasis(2)->GetDbdata())
1623 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
1624 m_wspSize = 6 * m_numElmt *
1625 (max(m_nquad0 * m_nquad1 * m_nquad2,
1626 m_nmodes0 * m_nmodes1 * m_nmodes2));
1627 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1638 for (
int i = 0; i < m_nquad0; ++i)
1640 for (
int j = 0; j < m_nquad1; ++j)
1642 for (
int k = 0; k < m_nquad2; ++k)
1645 m_fac0[i + j * m_nquad0 + k * m_nquad0 * m_nquad1] =
1646 4.0 / ((1 - z1[j]) * (1 - z2[k]));
1647 m_fac1[i + j * m_nquad0 + k * m_nquad0 * m_nquad1] =
1649 m_fac2[i + j * m_nquad0 + k * m_nquad0 * m_nquad1] =
1651 m_fac3[i + j * m_nquad0 + k * m_nquad0 * m_nquad1] =
1659 m_sortTopEdge =
true;
1663 m_sortTopEdge =
false;
1669 OperatorKey IProductWRTDerivBase_SumFac_Tet::m_type =
1672 IProductWRTDerivBase_SumFac_Tet::create,
1673 "IProductWRTDerivBase_SumFac_Tet");
1740 unsigned int nPhys = m_stdExp->GetTotPoints();
1741 unsigned int ntot = m_numElmt * nPhys;
1742 unsigned int nmodes = m_stdExp->GetNcoeffs();
1743 unsigned int nmax = max(ntot, m_numElmt * nmodes);
1754 for (
int i = 0; i < 3; ++i)
1756 tmp[i] = wsp + i * nmax;
1762 for (
int i = 0; i < 3; ++i)
1764 Vmath::Vmul(ntot, m_derivFac[i], 1, in[0], 1, tmp[i], 1);
1765 for (
int j = 1; j < 3; ++j)
1768 tmp[i], 1, tmp[i], 1);
1775 for (
int e = 0; e < m_numElmt; ++e)
1778 for (
int i = 0; i < 3; ++i)
1780 Vmath::Smul(m_nqe, m_derivFac[i][e], in[0] + e * m_nqe, 1,
1781 t = tmp[i] + e * m_nqe, 1);
1782 for (
int j = 1; j < 3; ++j)
1785 in[j] + e * m_nqe, 1, tmp[i] + e * m_nqe,
1786 1, t = tmp[i] + e * m_nqe, 1);
1792 wsp1 = wsp + 3 * nmax;
1795 for (
int i = 0; i < m_numElmt; ++i)
1798 Vmath::Vmul(nPhys, &m_fac0[0], 1, tmp[0].get() + i * nPhys, 1,
1799 tmp[0].get() + i * nPhys, 1);
1802 Vmath::Vvtvp(nPhys, &m_fac1[0], 1, tmp[2].get() + i * nPhys, 1,
1803 tmp[0].get() + i * nPhys, 1, tmp[0].get() + i * nPhys,
1808 PrismIProduct(m_sortTopVertex, m_numElmt, m_nquad0, m_nquad1, m_nquad2,
1809 m_nmodes0, m_nmodes1, m_nmodes2, m_derbase0, m_base1,
1810 m_base2, m_jacWStdW, tmp[0], output, wsp1);
1812 PrismIProduct(m_sortTopVertex, m_numElmt, m_nquad0, m_nquad1, m_nquad2,
1813 m_nmodes0, m_nmodes1, m_nmodes2, m_base0, m_derbase1,
1814 m_base2, m_jacWStdW, tmp[1], tmp[0], wsp1);
1815 Vmath::Vadd(m_numElmt * nmodes, tmp[0], 1, output, 1, output, 1);
1817 PrismIProduct(m_sortTopVertex, m_numElmt, m_nquad0, m_nquad1, m_nquad2,
1818 m_nmodes0, m_nmodes1, m_nmodes2, m_base0, m_base1,
1819 m_derbase2, m_jacWStdW, tmp[2], tmp[0], wsp1);
1820 Vmath::Vadd(m_numElmt * nmodes, tmp[0], 1, output, 1, output, 1);
1827 boost::ignore_unused(dir, input, output, wsp);
1828 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
1832 int coll_phys_offset)
override
1834 boost::ignore_unused(factors, coll_phys_offset);
1835 ASSERTL0(
false,
"Not valid for this operator.");
1859 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1861 :
Operator(pCollExp, pGeomData, factors),
1862 m_nquad0(m_stdExp->GetNumPoints(0)),
1863 m_nquad1(m_stdExp->GetNumPoints(1)),
1864 m_nquad2(m_stdExp->GetNumPoints(2)),
1865 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
1866 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
1867 m_nmodes2(m_stdExp->GetBasisNumModes(2)),
1868 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
1869 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
1870 m_base2(m_stdExp->GetBasis(2)->GetBdata()),
1871 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
1872 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata()),
1873 m_derbase2(m_stdExp->GetBasis(2)->GetDbdata())
1876 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
1877 m_wspSize = 6 * m_numElmt *
1878 (max(m_nquad0 * m_nquad1 * m_nquad2,
1879 m_nmodes0 * m_nmodes1 * m_nmodes2));
1880 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1884 m_sortTopVertex =
true;
1888 m_sortTopVertex =
false;
1897 for (
int i = 0; i < m_nquad0; ++i)
1899 for (
int j = 0; j < m_nquad1; ++j)
1901 for (
int k = 0; k < m_nquad2; ++k)
1904 m_fac0[i + j * m_nquad0 + k * m_nquad0 * m_nquad1] =
1907 m_fac1[i + j * m_nquad0 + k * m_nquad0 * m_nquad1] =
1908 (1 + z0[i]) / (1 - z2[k]);
1916 OperatorKey IProductWRTDerivBase_SumFac_Prism::m_type =
1919 IProductWRTDerivBase_SumFac_Prism::create,
1920 "IProductWRTDerivBase_SumFac_Prism");
1993 unsigned int nPhys = m_stdExp->GetTotPoints();
1994 unsigned int ntot = m_numElmt * nPhys;
1995 unsigned int nmodes = m_stdExp->GetNcoeffs();
1996 unsigned int nmax = max(ntot, m_numElmt * nmodes);
2007 for (
int i = 0; i < 3; ++i)
2009 tmp[i] = wsp + i * nmax;
2015 for (
int i = 0; i < 3; ++i)
2017 Vmath::Vmul(ntot, m_derivFac[i], 1, in[0], 1, tmp[i], 1);
2018 for (
int j = 1; j < 3; ++j)
2021 tmp[i], 1, tmp[i], 1);
2028 for (
int e = 0; e < m_numElmt; ++e)
2031 for (
int i = 0; i < 3; ++i)
2033 Vmath::Smul(m_nqe, m_derivFac[i][e], in[0] + e * m_nqe, 1,
2034 t = tmp[i] + e * m_nqe, 1);
2035 for (
int j = 1; j < 3; ++j)
2038 in[j] + e * m_nqe, 1, tmp[i] + e * m_nqe,
2039 1, t = tmp[i] + e * m_nqe, 1);
2045 wsp1 = wsp + 3 * nmax;
2048 for (
int i = 0; i < m_numElmt; ++i)
2051 Vmath::Vmul(nPhys, &m_fac0[0], 1, tmp[0].get() + i * nPhys, 1,
2052 tmp[0].get() + i * nPhys, 1);
2055 Vmath::Vvtvp(nPhys, &m_fac1[0], 1, tmp[2].get() + i * nPhys, 1,
2056 tmp[0].get() + i * nPhys, 1, tmp[0].get() + i * nPhys,
2060 Vmath::Vmul(nPhys, &m_fac0[0], 1, tmp[1].get() + i * nPhys, 1,
2061 tmp[1].get() + i * nPhys, 1);
2064 Vmath::Vvtvp(nPhys, &m_fac2[0], 1, tmp[2].get() + i * nPhys, 1,
2065 tmp[1].get() + i * nPhys, 1, tmp[1].get() + i * nPhys,
2070 PyrIProduct(m_sortTopVertex, m_numElmt, m_nquad0, m_nquad1, m_nquad2,
2071 m_nmodes0, m_nmodes1, m_nmodes2, m_derbase0, m_base1,
2072 m_base2, m_jacWStdW, tmp[0], output, wsp1);
2074 PyrIProduct(m_sortTopVertex, m_numElmt, m_nquad0, m_nquad1, m_nquad2,
2075 m_nmodes0, m_nmodes1, m_nmodes2, m_base0, m_derbase1,
2076 m_base2, m_jacWStdW, tmp[1], tmp[0], wsp1);
2077 Vmath::Vadd(m_numElmt * nmodes, tmp[0], 1, output, 1, output, 1);
2079 PyrIProduct(m_sortTopVertex, m_numElmt, m_nquad0, m_nquad1, m_nquad2,
2080 m_nmodes0, m_nmodes1, m_nmodes2, m_base0, m_base1,
2081 m_derbase2, m_jacWStdW, tmp[2], tmp[0], wsp1);
2082 Vmath::Vadd(m_numElmt * nmodes, tmp[0], 1, output, 1, output, 1);
2089 boost::ignore_unused(dir, input, output, wsp);
2090 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
2094 int coll_phys_offset)
override
2096 boost::ignore_unused(factors, coll_phys_offset);
2097 ASSERTL0(
false,
"Not valid for this operator.");
2122 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
2124 :
Operator(pCollExp, pGeomData, factors),
2125 m_nquad0(m_stdExp->GetNumPoints(0)),
2126 m_nquad1(m_stdExp->GetNumPoints(1)),
2127 m_nquad2(m_stdExp->GetNumPoints(2)),
2128 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
2129 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
2130 m_nmodes2(m_stdExp->GetBasisNumModes(2)),
2131 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
2132 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
2133 m_base2(m_stdExp->GetBasis(2)->GetBdata()),
2134 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
2135 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata()),
2136 m_derbase2(m_stdExp->GetBasis(2)->GetDbdata())
2139 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
2140 m_wspSize = 6 * m_numElmt *
2141 (max(m_nquad0 * m_nquad1 * m_nquad2,
2142 m_nmodes0 * m_nmodes1 * m_nmodes2));
2143 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
2147 m_sortTopVertex =
true;
2151 m_sortTopVertex =
false;
2162 for (
int i = 0; i < m_nquad0; ++i)
2164 for (
int j = 0; j < m_nquad1; ++j)
2166 for (
int k = 0; k < m_nquad2; ++k)
2169 m_fac0[i + j * m_nquad0 + k * m_nquad0 * m_nquad1] =
2172 m_fac1[i + j * m_nquad0 + k * m_nquad0 * m_nquad1] =
2173 (1 + z0[i]) / (1 - z2[k]);
2175 m_fac2[i + j * m_nquad0 + k * m_nquad0 * m_nquad1] =
2176 (1 + z1[j]) / (1 - z2[k]);
2184 OperatorKey IProductWRTDerivBase_SumFac_Pyr::m_type =
2187 IProductWRTDerivBase_SumFac_Pyr::create,
2188 "IProductWRTDerivBase_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 OPERATOR_CREATE(cname)
Inner product WRT deriv base operator using element-wise operation.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
Array< TwoD, const NekDouble > m_derivFac
IProductWRTDerivBase_IterPerExp(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
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.
void operator()(const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp) override final
Perform operation.
~IProductWRTDerivBase_IterPerExp() final
Inner product operator using operator using matrix free operators.
~IProductWRTDerivBase_MatrixFree() final
IProductWRTDerivBase_MatrixFree(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 > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp) override final
Perform operation.
std::shared_ptr< MatrixFree::IProductWRTDerivBase > m_oper
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
Inner product WRT deriv base operator using LocalRegions implementation.
vector< StdRegions::StdExpansionSharedPtr > m_expList
IProductWRTDerivBase_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) override final
~IProductWRTDerivBase_NoCollection() 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 > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp) override final
Perform operation.
Inner product WRT deriv base operator using standard matrix approach.
Array< OneD, const NekDouble > m_jac
~IProductWRTDerivBase_StdMat() final
Array< TwoD, const NekDouble > m_derivFac
void operator()(const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp) override final
Perform operation.
Array< OneD, DNekMatSharedPtr > m_iProdWRTStdDBase
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.
IProductWRTDerivBase_StdMat(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Inner product WRT deriv base operator using sum-factorisation (Hex)
Array< OneD, const NekDouble > m_derbase1
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
Array< OneD, const NekDouble > m_jacWStdW
Array< OneD, const NekDouble > m_base2
IProductWRTDerivBase_SumFac_Hex(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
Array< TwoD, const NekDouble > m_derivFac
Array< OneD, const NekDouble > m_derbase2
Array< OneD, const NekDouble > m_derbase0
Array< OneD, const NekDouble > m_base1
Array< OneD, const NekDouble > m_base0
~IProductWRTDerivBase_SumFac_Hex() final
void operator()(const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp) override final
Perform operation.
Inner product WRT deriv base operator using sum-factorisation (Prism)
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_derbase2
Array< OneD, const NekDouble > m_derbase0
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
void operator()(const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp) override final
~IProductWRTDerivBase_SumFac_Prism() final
IProductWRTDerivBase_SumFac_Prism(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_base1
Array< OneD, NekDouble > m_fac0
Array< OneD, const NekDouble > m_derbase1
Array< OneD, NekDouble > m_fac1
Array< OneD, const NekDouble > m_base0
Array< TwoD, const NekDouble > m_derivFac
Inner product WRT deriv base operator using sum-factorisation (Pyr)
Array< TwoD, const NekDouble > m_derivFac
Array< OneD, const NekDouble > m_base2
Array< OneD, const NekDouble > m_base1
void operator()(const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp) override final
Array< OneD, NekDouble > m_fac0
Array< OneD, const NekDouble > m_derbase1
~IProductWRTDerivBase_SumFac_Pyr() final
Array< OneD, NekDouble > m_fac1
Array< OneD, const NekDouble > m_jacWStdW
Array< OneD, const NekDouble > m_derbase0
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
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
IProductWRTDerivBase_SumFac_Pyr(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, NekDouble > m_fac2
Array< OneD, const NekDouble > m_derbase2
Inner product WRT deriv base operator using sum-factorisation (Quad)
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
Array< TwoD, const NekDouble > m_derivFac
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_derbase1
Array< OneD, const NekDouble > m_derbase0
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 > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp) override final
Perform operation.
Array< OneD, const NekDouble > m_jacWStdW
IProductWRTDerivBase_SumFac_Quad(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_base1
~IProductWRTDerivBase_SumFac_Quad() final
Inner product WRT deriv base operator using sum-factorisation (Segment)
~IProductWRTDerivBase_SumFac_Seg() final
void operator()(const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, 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
Array< OneD, const NekDouble > m_jacWStdW
Array< OneD, const NekDouble > m_derbase0
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
IProductWRTDerivBase_SumFac_Seg(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< TwoD, const NekDouble > m_derivFac
Inner product WRT deriv base operator using sum-factorisation (Tet)
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.
Array< OneD, NekDouble > m_fac2
Array< OneD, NekDouble > m_fac1
Array< OneD, const NekDouble > m_base2
IProductWRTDerivBase_SumFac_Tet(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_base0
Array< OneD, NekDouble > m_fac3
Array< OneD, NekDouble > m_fac0
Array< OneD, const NekDouble > m_jacWStdW
Array< TwoD, const NekDouble > m_derivFac
Array< OneD, const NekDouble > m_derbase1
Array< OneD, const NekDouble > m_base1
Array< OneD, const NekDouble > m_derbase0
Array< OneD, const NekDouble > m_derbase2
Inner product WRT deriv base operator using sum-factorisation (Tri)
Array< OneD, NekDouble > m_fac0
Array< OneD, const NekDouble > m_base0
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
~IProductWRTDerivBase_SumFac_Tri() final
void operator()(const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp) override final
Array< OneD, const NekDouble > m_jacWStdW
Array< OneD, NekDouble > m_fac1
Array< TwoD, const NekDouble > m_derivFac
Array< OneD, const NekDouble > m_derbase0
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
IProductWRTDerivBase_SumFac_Tri(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_derbase1
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.
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
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.
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 Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add 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 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)