35 #include <boost/core/ignore_unused.hpp>
37 #include <MatrixFreeOps/Operator.hpp>
47 namespace Collections {
77 int nPhys = m_stdExp->GetTotPoints();
78 int ntot = m_numElmt*nPhys;
79 int nmodes = m_stdExp->GetNcoeffs();
84 in[0] = entry0; in[1] = entry1;
87 output = (m_coordim == 3)? entry3: (m_coordim == 2)?
90 for(
int i = 0; i < m_dim; ++i)
92 tmp[i] = wsp + i*ntot;
101 for(
int i = 0; i < m_dim; ++i)
105 for(
int j = 1; j < m_coordim; ++j)
108 in[j],1, tmp[i], 1, tmp[i],1);
117 for(
int e = 0; e < m_numElmt; ++e)
120 for(
int i = 0; i < m_dim; ++i)
124 t = tmp[i] + e*m_nqe,1);
125 for(
int j = 1; j < m_coordim; ++j)
130 t = tmp[i] + e*m_nqe,1);
134 Vmath::Smul(m_nqe,m_jac[e],tmp[0]+e*m_nqe,1,t=tmp[0]+e*m_nqe,1);
138 Blas::Dgemm(
'N',
'N', m_iProdWRTStdDBase[0]->GetRows(),
139 m_numElmt,m_iProdWRTStdDBase[0]->GetColumns(),
140 1.0, m_iProdWRTStdDBase[0]->GetRawPtr(),
141 m_iProdWRTStdDBase[0]->GetRows(),
142 tmp[0].get(), nPhys, 0.0,
143 output.get(), nmodes);
146 for(
int i = 1; i < m_dim; ++i)
155 for(
int e = 0; e < m_numElmt; ++e)
161 Blas::Dgemm(
'N',
'N', m_iProdWRTStdDBase[i]->GetRows(),
162 m_numElmt,m_iProdWRTStdDBase[i]->GetColumns(),
163 1.0, m_iProdWRTStdDBase[i]->GetRawPtr(),
164 m_iProdWRTStdDBase[i]->GetRows(),
165 tmp[i].get(), nPhys, 1.0,
166 output.get(), nmodes);
175 boost::ignore_unused(dir, input, output, wsp);
176 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
180 int coll_phys_offset)
182 boost::ignore_unused(factors, coll_phys_offset);
183 ASSERTL0(
false,
"Not valid for this operator.");
195 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
198 :
Operator(pCollExp, pGeomData, factors)
201 m_dim = PtsKey.size();
202 m_coordim = pCollExp[0]->GetCoordim();
204 m_nqe = m_stdExp->GetTotPoints();
205 int nmodes = m_stdExp->GetNcoeffs();
209 for(
int i = 0; i < m_dim; ++i)
214 for(
int j = 0; j < m_nqe; ++j)
218 m_stdExp->IProductWRTDerivBase(i,tmp,tmp1);
220 &(m_iProdWRTStdDBase[i]->GetPtr())[0]
224 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
225 m_jac = pGeomData->GetJac(pCollExp);
226 m_wspSize = m_dim*m_nqe*m_numElmt;
231 OperatorKey IProductWRTDerivBase_StdMat::m_typeArr[] = {
234 IProductWRTDerivBase_StdMat::create,
235 "IProductWRTDerivBase_StdMat_Seg"),
238 IProductWRTDerivBase_StdMat::create,
239 "IProductWRTDerivBase_StdMat_Tri"),
242 IProductWRTDerivBase_StdMat::create,
243 "IProductWRTDerivBase_StdMat_NodalTri"),
246 IProductWRTDerivBase_StdMat::create,
247 "IProductWRTDerivBase_StdMat_Quad"),
250 IProductWRTDerivBase_StdMat::create,
251 "IProductWRTDerivBase_StdMat_Tet"),
254 IProductWRTDerivBase_StdMat::create,
255 "IProductWRTDerivBase_StdMat_NodalTet"),
258 IProductWRTDerivBase_StdMat::create,
259 "IProductWRTDerivBase_StdMat_Pyr"),
262 IProductWRTDerivBase_StdMat::create,
263 "IProductWRTDerivBase_StdMat_Prism"),
266 IProductWRTDerivBase_StdMat::create,
267 "IProductWRTDerivBase_StdMat_NodalPrism"),
270 IProductWRTDerivBase_StdMat::create,
271 "IProductWRTDerivBase_StdMat_Hex"),
274 IProductWRTDerivBase_StdMat::create,
"IProductWRTDerivBase_SumFac_Pyr")
297 boost::ignore_unused(wsp);
322 NEKERROR(ErrorUtil::efatal,
"m_coordim value not valid");
327 (*m_oper)(m_input, m_output);
354 NEKERROR(ErrorUtil::efatal,
"coordim not valid");
358 (*m_oper)(input, output);
367 boost::ignore_unused(dir, input, output, wsp);
368 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
372 int coll_phys_offset)
374 boost::ignore_unused(factors, coll_phys_offset);
375 ASSERTL0(
false,
"Not valid for this operator.");
379 std::shared_ptr<MatrixFree::IProductWRTDerivBase>
m_oper;
382 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
385 :
Operator(pCollExp, pGeomData, factors),
387 pCollExp[0]->GetStdExp()->GetTotPoints(),
388 pCollExp[0]->GetStdExp()->GetNcoeffs(),
392 const auto dim = pCollExp[0]->GetStdExp()->GetShapeDimension();
395 std::vector<LibUtilities::BasisSharedPtr> basis(dim);
396 for (
unsigned int i = 0; i < dim; ++i)
398 basis[i] = pCollExp[0]->GetBasis(i);
402 auto shapeType = pCollExp[0]->GetStdExp()->DetShapeType();
405 std::string op_string =
"IProductWRTDerivBase";
406 op_string += MatrixFree::GetOpstring(shapeType, m_isDeformed);
408 CreateInstance(op_string, basis, m_nElmtPad);
411 oper->SetJac(pGeomData->GetJacInterLeave(pCollExp,m_nElmtPad));
414 oper->SetDF(pGeomData->GetDerivFactorsInterLeave
415 (pCollExp,m_nElmtPad));
417 m_oper = std::dynamic_pointer_cast<MatrixFree::
418 IProductWRTDerivBase>(oper);
419 ASSERTL0(m_oper,
"Failed to cast pointer.");
425 OperatorKey IProductWRTDerivBase_MatrixFree::m_typeArr[] = {
428 IProductWRTDerivBase_MatrixFree::create,
"IProductWRTDerivBase_MatrixFree_Seg"),
431 IProductWRTDerivBase_MatrixFree::create,
"IProductWRTDerivBase_MatrixFree_Quad"),
434 IProductWRTDerivBase_MatrixFree::create,
"IProductWRTDerivBase_MatrixFree_Tri"),
437 IProductWRTDerivBase_MatrixFree::create,
"IProductWRTDerivBase_MatrixFree_Hex"),
440 IProductWRTDerivBase_MatrixFree::create,
"IProductWRTDerivBase_MatrixFree_Prism"),
443 IProductWRTDerivBase_MatrixFree::create,
"IProductWRTDerivBase_MatrixFree_Pyr"),
446 IProductWRTDerivBase_MatrixFree::create,
"IProductWRTDerivBase_MatrixFree_Tet")
469 unsigned int nPhys = m_stdExp->GetTotPoints();
470 unsigned int ntot = m_numElmt*nPhys;
471 unsigned int nmodes = m_stdExp->GetNcoeffs();
472 unsigned int nmax = max(ntot,m_numElmt*nmodes);
477 in[0] = entry0; in[1] = entry1; in[2] = entry2;
479 output = (m_coordim == 3)? entry3: (m_coordim == 2)?
482 for(
int i = 0; i < m_dim; ++i)
484 tmp[i] = wsp + i*nmax;
493 for(
int i = 0; i < m_dim; ++i)
497 for(
int j = 1; j < m_coordim; ++j)
500 in[j],1, tmp[i], 1, tmp[i],1);
509 for(
int e = 0; e < m_numElmt; ++e)
512 for(
int i = 0; i < m_dim; ++i)
516 t = tmp[i] + e*m_nqe,1);
517 for(
int j = 1; j < m_coordim; ++j)
522 t = tmp[i] + e*m_nqe,1);
526 Vmath::Smul(m_nqe,m_jac[e],tmp[0]+e*m_nqe,1,t=tmp[0]+e*m_nqe,1);
530 for(
int n = 0; n < m_numElmt; ++n)
532 m_stdExp->IProductWRTDerivBase(0,tmp[0]+n*nPhys,
533 tmp1 = output + n*nmodes);
537 for(
int i = 1; i < m_dim; ++i)
547 for(
int e = 0; e < m_numElmt; ++e)
554 for(
int n = 0; n < m_numElmt; ++n)
556 m_stdExp->IProductWRTDerivBase(i,tmp[i]+n*nPhys,tmp[0]);
558 tmp1 = output+n*nmodes,1);
568 boost::ignore_unused(dir, input, output, wsp);
569 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
573 int coll_phys_offset)
575 boost::ignore_unused(factors, coll_phys_offset);
576 ASSERTL0(
false,
"Not valid for this operator.");
587 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
590 :
Operator(pCollExp, pGeomData, factors)
593 m_dim = PtsKey.size();
594 m_coordim = pCollExp[0]->GetCoordim();
596 m_nqe = m_stdExp->GetTotPoints();
598 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
599 m_jac = pGeomData->GetJac(pCollExp);
600 m_wspSize = m_dim*m_nqe*m_numElmt;
605 OperatorKey IProductWRTDerivBase_IterPerExp::m_typeArr[] = {
608 IProductWRTDerivBase_IterPerExp::create,
609 "IProductWRTDerivBase_IterPerExp_Seg"),
612 IProductWRTDerivBase_IterPerExp::create,
613 "IProductWRTDerivBase_IterPerExp_Tri"),
616 IProductWRTDerivBase_IterPerExp::create,
617 "IProductWRTDerivBase_IterPerExp_NodalTri"),
620 IProductWRTDerivBase_IterPerExp::create,
621 "IProductWRTDerivBase_IterPerExp_Quad"),
624 IProductWRTDerivBase_IterPerExp::create,
625 "IProductWRTDerivBase_IterPerExp_Tet"),
628 IProductWRTDerivBase_IterPerExp::create,
629 "IProductWRTDerivBase_IterPerExp_NodalTet"),
632 IProductWRTDerivBase_IterPerExp::create,
633 "IProductWRTDerivBase_IterPerExp_Pyr"),
636 IProductWRTDerivBase_IterPerExp::create,
637 "IProductWRTDerivBase_IterPerExp_Prism"),
640 IProductWRTDerivBase_IterPerExp::create,
641 "IProductWRTDerivBase_IterPerExp_NodalPrism"),
644 IProductWRTDerivBase_IterPerExp::create,
645 "IProductWRTDerivBase_IterPerExp_Hex")
669 boost::ignore_unused(wsp);
671 unsigned int nmodes = m_expList[0]->GetNcoeffs();
672 unsigned int nPhys = m_expList[0]->GetTotPoints();
677 in[0] = entry0; in[1] = entry1; in[2] = entry2;
679 output = (m_coordim == 3)? entry3: (m_coordim == 2)?
682 for(
int n = 0; n < m_numElmt; ++n)
684 m_expList[n]->IProductWRTDerivBase(0,
686 tmp1 = output + n * nmodes);
689 for(
int i = 1; i < m_dim; ++i)
691 for(
int n = 0; n < m_numElmt; ++n)
693 m_expList[n]->IProductWRTDerivBase(i,in[i]+n*nPhys,tmp);
696 tmp1 = output+n*nmodes,1);
706 boost::ignore_unused(dir, input, output, wsp);
707 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
711 int coll_phys_offset)
713 boost::ignore_unused(factors, coll_phys_offset);
714 ASSERTL0(
false,
"Not valid for this operator.");
724 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
727 :
Operator(pCollExp, pGeomData, factors)
729 m_expList = pCollExp;
730 m_dim = pCollExp[0]->GetNumBases();
731 m_coordim = pCollExp[0]->GetCoordim();
736 OperatorKey IProductWRTDerivBase_NoCollection::m_typeArr[] = {
739 IProductWRTDerivBase_NoCollection::create,
740 "IProductWRTDerivBase_NoCollection_Seg"),
743 IProductWRTDerivBase_NoCollection::create,
744 "IProductWRTDerivBase_NoCollection_Tri"),
747 IProductWRTDerivBase_NoCollection::create,
748 "IProductWRTDerivBase_NoCollection_NodalTri"),
751 IProductWRTDerivBase_NoCollection::create,
752 "IProductWRTDerivBase_NoCollection_Quad"),
755 IProductWRTDerivBase_NoCollection::create,
756 "IProductWRTDerivBase_NoCollection_Tet"),
759 IProductWRTDerivBase_NoCollection::create,
760 "IProductWRTDerivBase_NoCollection_NodalTet"),
763 IProductWRTDerivBase_NoCollection::create,
764 "IProductWRTDerivBase_NoCollection_Pyr"),
767 IProductWRTDerivBase_NoCollection::create,
768 "IProductWRTDerivBase_NoCollection_Prism"),
771 IProductWRTDerivBase_NoCollection::create,
772 "IProductWRTDerivBase_NoCollection_NodalPrism"),
775 IProductWRTDerivBase_NoCollection::create,
776 "IProductWRTDerivBase_NoCollection_Hex")
803 output = (m_coordim == 3)? entry3: (m_coordim == 2)?
806 in[0] = entry0; in[1] = entry1;
812 Vmath::Vmul (m_wspSize,m_derivFac[0], 1, in[0], 1, wsp, 1);
813 for(
int i = 1; i < m_coordim; ++i)
815 Vmath::Vvtvp (m_wspSize,m_derivFac[i],1,in[i],1,wsp,1,wsp,1);
821 for(
int e = 0; e < m_numElmt; ++e)
824 in[0] + e*m_nquad0, 1,
825 t = wsp + e*m_nquad0, 1);
828 for(
int i = 1; i < m_coordim; ++i)
830 for(
int e = 0; e < m_numElmt; ++e)
833 in[i] + e*m_nquad0,1,
835 t = wsp + e*m_nquad0,1);
840 Vmath::Vmul(m_wspSize, m_jacWStdW, 1, wsp, 1, wsp, 1);
843 Blas::Dgemm(
'T',
'N', m_nmodes0, m_numElmt, m_nquad0,
844 1.0, m_derbase0.get(), m_nquad0,
845 &wsp[0], m_nquad0, 0.0,
846 &output[0], m_nmodes0);
854 boost::ignore_unused(dir, input, output, wsp);
855 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
859 int coll_phys_offset)
861 boost::ignore_unused(factors, coll_phys_offset);
862 ASSERTL0(
false,
"Not valid for this operator.");
875 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
878 :
Operator(pCollExp, pGeomData, factors),
879 m_nquad0 (m_stdExp->GetNumPoints(0)),
880 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
881 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata())
883 m_coordim = pCollExp[0]->GetCoordim();
884 m_wspSize = m_numElmt*m_nquad0;
885 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
886 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
892 RegisterCreatorFunction(
894 IProductWRTDerivBase_SumFac_Seg::create,
895 "IProductWRTDerivBase_SumFac_Seg");
918 unsigned int nPhys = m_stdExp->GetTotPoints();
919 unsigned int ntot = m_numElmt*nPhys;
920 unsigned int nmodes = m_stdExp->GetNcoeffs();
921 unsigned int nmax = max(ntot,m_numElmt*nmodes);
926 in[0] = entry0; in[1] = entry1; in[2] = entry2;
928 output = (m_coordim == 2)? entry2: entry3;
930 tmp[0] = wsp; tmp[1] = wsp + nmax;
936 for(
int i = 0; i < 2; ++i)
938 Vmath::Vmul(ntot, m_derivFac[i], 1, in[0], 1, tmp[i], 1);
939 for(
int j = 1; j < m_coordim; ++j)
942 tmp[i], 1, tmp[i], 1);
949 for(
int e = 0; e < m_numElmt; ++e)
952 for(
int i = 0; i < 2; ++i)
956 t = tmp[i] + e*m_nqe,1);
957 for(
int j = 1; j < m_coordim; ++j)
962 t = tmp[i] + e*m_nqe,1);
970 m_nmodes0, m_nmodes1,
972 m_jacWStdW, tmp[0], output, wsp1);
977 m_nmodes0, m_nmodes1,
979 m_jacWStdW, tmp[1], tmp[0], wsp1);
981 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
989 boost::ignore_unused(dir, input, output, wsp);
990 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
994 int coll_phys_offset)
996 boost::ignore_unused(factors, coll_phys_offset);
997 ASSERTL0(
false,
"Not valid for this operator.");
1017 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1020 :
Operator(pCollExp, pGeomData, factors),
1021 m_nquad0 (m_stdExp->GetNumPoints(0)),
1022 m_nquad1 (m_stdExp->GetNumPoints(1)),
1023 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
1024 m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
1025 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
1026 m_colldir1(m_stdExp->GetBasis(1)->Collocation()),
1027 m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
1028 m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
1029 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
1030 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata())
1033 m_coordim = pCollExp[0]->GetCoordim();
1035 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1036 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
1037 m_wspSize = 4 * m_numElmt * (max(m_nquad0*m_nquad1,
1038 m_nmodes0*m_nmodes1));
1043 OperatorKey IProductWRTDerivBase_SumFac_Quad::m_type =
1046 IProductWRTDerivBase_SumFac_Quad::create,
1047 "IProductWRTDerivBase_IterPerExp_Quad");
1101 unsigned int nPhys = m_stdExp->GetTotPoints();
1102 unsigned int ntot = m_numElmt*nPhys;
1103 unsigned int nmodes = m_stdExp->GetNcoeffs();
1104 unsigned int nmax = max(ntot,m_numElmt*nmodes);
1109 in[0] = entry0; in[1] = entry1; in[2] = entry2;
1111 output = (m_coordim == 2)? entry2: entry3;
1113 tmp[0] = wsp; tmp[1] = wsp + nmax;
1114 wsp1 = wsp + 2*nmax;
1118 for (
int i = 0; i < 2; ++i)
1120 Vmath::Vmul(ntot, m_derivFac[i], 1, in[0], 1, tmp[i], 1);
1121 for(
int j = 1; j < m_coordim; ++j)
1124 tmp[i], 1, tmp[i], 1);
1131 for(
int e = 0; e < m_numElmt; ++e)
1134 for(
int i = 0; i < 2; ++i)
1138 t = tmp[i] + e*m_nqe,1);
1139 for(
int j = 1; j < m_coordim; ++j)
1143 tmp[i] + e*m_nqe, 1,
1144 t = tmp[i] + e*m_nqe,1);
1151 for (
int i = 0; i < m_numElmt; ++i)
1154 Vmath::Vmul(nPhys,&m_fac0[0],1,tmp[0].get()+i*nPhys,1,
1155 tmp[0].get()+i*nPhys,1);
1158 Vmath::Vvtvp(nPhys,&m_fac1[0],1,tmp[1].get()+i*nPhys,1,
1159 tmp[0].get()+i*nPhys,1,tmp[0].get()+i*nPhys,1);
1163 TriIProduct(m_sortTopVertex, m_numElmt, m_nquad0, m_nquad1,
1164 m_nmodes0, m_nmodes1, m_derbase0, m_base1,
1165 m_jacWStdW, tmp[0], output, wsp1);
1168 TriIProduct(m_sortTopVertex, m_numElmt, m_nquad0, m_nquad1,
1169 m_nmodes0, m_nmodes1, m_base0, m_derbase1,
1170 m_jacWStdW, tmp[1], tmp[0], wsp1);
1172 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
1180 boost::ignore_unused(dir, input, output, wsp);
1181 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
1185 int coll_phys_offset)
1187 boost::ignore_unused(factors, coll_phys_offset);
1188 ASSERTL0(
false,
"Not valid for this operator.");
1211 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1214 :
Operator(pCollExp, pGeomData, factors),
1215 m_nquad0 (m_stdExp->GetNumPoints(0)),
1216 m_nquad1 (m_stdExp->GetNumPoints(1)),
1217 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
1218 m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
1219 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
1220 m_colldir1(m_stdExp->GetBasis(1)->Collocation()),
1221 m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
1222 m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
1223 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
1224 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata())
1227 m_coordim = pCollExp[0]->GetCoordim();
1229 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1230 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
1231 m_wspSize = 4 * m_numElmt * (max(m_nquad0*m_nquad1,
1232 m_nmodes0*m_nmodes1));
1234 if(m_stdExp->GetBasis(0)->GetBasisType()
1237 m_sortTopVertex =
true;
1241 m_sortTopVertex =
false;
1245 = m_stdExp->GetBasis(0)->GetZ();
1247 = m_stdExp->GetBasis(1)->GetZ();
1251 for (
int i = 0; i < m_nquad0; ++i)
1253 for(
int j = 0; j < m_nquad1; ++j)
1255 m_fac0[i+j*m_nquad0] = 2.0/(1-z1[j]);
1261 for (
int i = 0; i < m_nquad0; ++i)
1263 for(
int j = 0; j < m_nquad1; ++j)
1265 m_fac1[i+j*m_nquad0] = (1+z0[i])/(1-z1[j]);
1272 OperatorKey IProductWRTDerivBase_SumFac_Tri::m_type =
1275 IProductWRTDerivBase_SumFac_Tri::create,
1276 "IProductWRTDerivBase_IterPerExp_Tri");
1299 unsigned int nPhys = m_stdExp->GetTotPoints();
1300 unsigned int ntot = m_numElmt*nPhys;
1301 unsigned int nmodes = m_stdExp->GetNcoeffs();
1302 unsigned int nmax = max(ntot,m_numElmt*nmodes);
1307 in[0] = entry0; in[1] = entry1;
1312 for(
int i = 0; i < 3; ++i)
1314 tmp[i] = wsp + i*nmax;
1320 for(
int i = 0; i < 3; ++i)
1324 for(
int j = 1; j < 3; ++j)
1327 in[j],1, tmp[i], 1, tmp[i],1);
1334 for(
int e = 0; e < m_numElmt; ++e)
1337 for(
int i = 0; i < 3; ++i)
1341 t = tmp[i] + e*m_nqe,1);
1342 for(
int j = 1; j < 3; ++j)
1346 tmp[i] + e*m_nqe, 1,
1347 t = tmp[i] + e*m_nqe,1);
1353 wsp1 = wsp + 3*nmax;
1356 HexIProduct(
false,m_colldir1,m_colldir2, m_numElmt,
1357 m_nquad0, m_nquad1, m_nquad2,
1358 m_nmodes0, m_nmodes1, m_nmodes2,
1359 m_derbase0, m_base1, m_base2,
1360 m_jacWStdW,tmp[0],output,wsp1);
1362 HexIProduct(m_colldir0,
false,m_colldir2, m_numElmt,
1363 m_nquad0, m_nquad1, m_nquad2,
1364 m_nmodes0, m_nmodes1, m_nmodes2,
1365 m_base0, m_derbase1, m_base2,
1366 m_jacWStdW,tmp[1],tmp[0],wsp1);
1367 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
1369 HexIProduct(m_colldir0,m_colldir1,
false, m_numElmt,
1370 m_nquad0, m_nquad1, m_nquad2,
1371 m_nmodes0, m_nmodes1, m_nmodes2,
1372 m_base0, m_base1, m_derbase2,
1373 m_jacWStdW,tmp[2],tmp[0],wsp1);
1374 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
1382 boost::ignore_unused(dir, input, output, wsp);
1383 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
1387 int coll_phys_offset)
1389 boost::ignore_unused(factors, coll_phys_offset);
1390 ASSERTL0(
false,
"Not valid for this operator.");
1414 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1417 :
Operator(pCollExp, pGeomData, factors),
1418 m_nquad0 (m_stdExp->GetNumPoints(0)),
1419 m_nquad1 (m_stdExp->GetNumPoints(1)),
1420 m_nquad2 (m_stdExp->GetNumPoints(2)),
1421 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
1422 m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
1423 m_nmodes2 (m_stdExp->GetBasisNumModes(2)),
1424 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
1425 m_colldir1(m_stdExp->GetBasis(1)->Collocation()),
1426 m_colldir2(m_stdExp->GetBasis(2)->Collocation()),
1427 m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
1428 m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
1429 m_base2 (m_stdExp->GetBasis(2)->GetBdata()),
1430 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
1431 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata()),
1432 m_derbase2(m_stdExp->GetBasis(2)->GetDbdata())
1435 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
1436 m_wspSize = 6 * m_numElmt * (max(m_nquad0*m_nquad1*m_nquad2,
1437 m_nmodes0*m_nmodes1*m_nmodes2));
1438 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1444 RegisterCreatorFunction(
1446 IProductWRTDerivBase_SumFac_Hex::create,
1447 "IProductWRTDerivBase_SumFac_Hex");
1520 unsigned int nPhys = m_stdExp->GetTotPoints();
1521 unsigned int ntot = m_numElmt*nPhys;
1522 unsigned int nmodes = m_stdExp->GetNcoeffs();
1523 unsigned int nmax = max(ntot,m_numElmt*nmodes);
1528 in[0] = entry0; in[1] = entry1;
1533 for(
int i = 0; i < 3; ++i)
1535 tmp[i] = wsp + i*nmax;
1541 for(
int i = 0; i < 3; ++i)
1545 for(
int j = 1; j < 3; ++j)
1548 in[j],1, tmp[i], 1, tmp[i],1);
1555 for(
int e = 0; e < m_numElmt; ++e)
1558 for(
int i = 0; i < 3; ++i)
1562 t = tmp[i] + e*m_nqe,1);
1563 for(
int j = 1; j < 3; ++j)
1567 tmp[i] + e*m_nqe, 1,
1568 t = tmp[i] + e*m_nqe,1);
1574 wsp1 = wsp + 3*nmax;
1577 for (
int i = 0; i < m_numElmt; ++i)
1581 tmp[2].get() + i*nPhys, 1,
1586 tmp[0].get()+i*nPhys,1,tmp[0].get()+i*nPhys,1);
1589 Vmath::Vmul(nPhys,&m_fac0[0],1,tmp[0].get()+i*nPhys,1,
1590 tmp[0].get()+i*nPhys,1);
1593 Vmath::Vvtvp(nPhys,&m_fac3[0],1,tmp[2].get()+i*nPhys,1,
1594 tmp[1].get()+i*nPhys,1,tmp[1].get()+i*nPhys,1);
1597 Vmath::Vmul(nPhys,&m_fac2[0],1,tmp[1].get()+i*nPhys,1,
1598 tmp[1].get()+i*nPhys,1);
1604 m_nquad0, m_nquad1, m_nquad2,
1605 m_nmodes0, m_nmodes1, m_nmodes2,
1606 m_derbase0, m_base1, m_base2,
1607 m_jacWStdW,tmp[0],output,wsp1);
1610 m_nquad0, m_nquad1, m_nquad2,
1611 m_nmodes0, m_nmodes1, m_nmodes2,
1612 m_base0, m_derbase1, m_base2,
1613 m_jacWStdW,tmp[1],tmp[0],wsp1);
1614 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
1617 m_nquad0, m_nquad1, m_nquad2,
1618 m_nmodes0, m_nmodes1, m_nmodes2,
1619 m_base0, m_base1, m_derbase2,
1620 m_jacWStdW,tmp[2],tmp[0],wsp1);
1621 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
1629 boost::ignore_unused(dir, input, output, wsp);
1630 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
1634 int coll_phys_offset)
1636 boost::ignore_unused(factors, coll_phys_offset);
1637 ASSERTL0(
false,
"Not valid for this operator.");
1663 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1666 :
Operator(pCollExp, pGeomData, factors),
1667 m_nquad0 (m_stdExp->GetNumPoints(0)),
1668 m_nquad1 (m_stdExp->GetNumPoints(1)),
1669 m_nquad2 (m_stdExp->GetNumPoints(2)),
1670 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
1671 m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
1672 m_nmodes2 (m_stdExp->GetBasisNumModes(2)),
1673 m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
1674 m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
1675 m_base2 (m_stdExp->GetBasis(2)->GetBdata()),
1676 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
1677 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata()),
1678 m_derbase2(m_stdExp->GetBasis(2)->GetDbdata())
1681 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
1682 m_wspSize = 6 * m_numElmt * (max(m_nquad0*m_nquad1*m_nquad2,
1683 m_nmodes0*m_nmodes1*m_nmodes2));
1684 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1688 = m_stdExp->GetBasis(0)->GetZ();
1690 = m_stdExp->GetBasis(1)->GetZ();
1692 = m_stdExp->GetBasis(2)->GetZ();
1699 for (
int i = 0; i < m_nquad0; ++i)
1701 for(
int j = 0; j < m_nquad1; ++j)
1703 for(
int k = 0; k < m_nquad2; ++k)
1706 m_fac0[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1707 = 4.0/((1-z1[j])*(1-z2[k]));
1708 m_fac1[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1710 m_fac2[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1712 m_fac3[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1718 if(m_stdExp->GetBasis(0)->GetBasisType()
1721 m_sortTopEdge =
true;
1725 m_sortTopEdge =
false;
1733 RegisterCreatorFunction(
1735 IProductWRTDerivBase_SumFac_Tet::create,
1736 "IProductWRTDerivBase_SumFac_Tet");
1805 unsigned int nPhys = m_stdExp->GetTotPoints();
1806 unsigned int ntot = m_numElmt*nPhys;
1807 unsigned int nmodes = m_stdExp->GetNcoeffs();
1808 unsigned int nmax = max(ntot,m_numElmt*nmodes);
1813 in[0] = entry0; in[1] = entry1;
1818 for(
int i = 0; i < 3; ++i)
1820 tmp[i] = wsp + i*nmax;
1826 for(
int i = 0; i < 3; ++i)
1830 for(
int j = 1; j < 3; ++j)
1833 in[j],1, tmp[i], 1, tmp[i],1);
1840 for(
int e = 0; e < m_numElmt; ++e)
1843 for(
int i = 0; i < 3; ++i)
1847 t = tmp[i] + e*m_nqe,1);
1848 for(
int j = 1; j < 3; ++j)
1852 tmp[i] + e*m_nqe, 1,
1853 t = tmp[i] + e*m_nqe,1);
1859 wsp1 = wsp + 3*nmax;
1862 for (
int i = 0; i < m_numElmt; ++i)
1865 Vmath::Vmul(nPhys,&m_fac0[0],1,tmp[0].get()+i*nPhys,1,
1866 tmp[0].get()+i*nPhys,1);
1869 Vmath::Vvtvp(nPhys,&m_fac1[0],1,tmp[2].get()+i*nPhys,1,
1870 tmp[0].get()+i*nPhys,1,tmp[0].get()+i*nPhys,1);
1875 m_nquad0, m_nquad1, m_nquad2,
1876 m_nmodes0, m_nmodes1, m_nmodes2,
1877 m_derbase0, m_base1, m_base2,
1878 m_jacWStdW,tmp[0],output,wsp1);
1881 m_nquad0, m_nquad1, m_nquad2,
1882 m_nmodes0, m_nmodes1, m_nmodes2,
1883 m_base0, m_derbase1, m_base2,
1884 m_jacWStdW,tmp[1],tmp[0],wsp1);
1885 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
1888 m_nquad0, m_nquad1, m_nquad2,
1889 m_nmodes0, m_nmodes1, m_nmodes2,
1890 m_base0, m_base1, m_derbase2,
1891 m_jacWStdW,tmp[2],tmp[0],wsp1);
1892 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
1900 boost::ignore_unused(dir, input, output, wsp);
1901 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
1905 int coll_phys_offset)
1907 boost::ignore_unused(factors, coll_phys_offset);
1908 ASSERTL0(
false,
"Not valid for this operator.");
1933 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1936 :
Operator(pCollExp, pGeomData, factors),
1937 m_nquad0 (m_stdExp->GetNumPoints(0)),
1938 m_nquad1 (m_stdExp->GetNumPoints(1)),
1939 m_nquad2 (m_stdExp->GetNumPoints(2)),
1940 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
1941 m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
1942 m_nmodes2 (m_stdExp->GetBasisNumModes(2)),
1943 m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
1944 m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
1945 m_base2 (m_stdExp->GetBasis(2)->GetBdata()),
1946 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
1947 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata()),
1948 m_derbase2(m_stdExp->GetBasis(2)->GetDbdata())
1951 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
1952 m_wspSize = 6 * m_numElmt * (max(m_nquad0*m_nquad1*m_nquad2,
1953 m_nmodes0*m_nmodes1*m_nmodes2));
1954 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1956 if(m_stdExp->GetBasis(0)->GetBasisType()
1959 m_sortTopVertex =
true;
1963 m_sortTopVertex =
false;
1967 = m_stdExp->GetBasis(0)->GetZ();
1969 = m_stdExp->GetBasis(2)->GetZ();
1974 for (
int i = 0; i < m_nquad0; ++i)
1976 for(
int j = 0; j < m_nquad1; ++j)
1978 for(
int k = 0; k < m_nquad2; ++k)
1981 m_fac0[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1984 m_fac1[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1985 = (1+z0[i])/(1-z2[k]);
1995 RegisterCreatorFunction(
1997 IProductWRTDerivBase_SumFac_Prism::create,
1998 "IProductWRTDerivBase_SumFac_Prism");
2075 unsigned int nPhys = m_stdExp->GetTotPoints();
2076 unsigned int ntot = m_numElmt*nPhys;
2077 unsigned int nmodes = m_stdExp->GetNcoeffs();
2078 unsigned int nmax = max(ntot,m_numElmt*nmodes);
2083 in[0] = entry0; in[1] = entry1;
2088 for(
int i = 0; i < 3; ++i)
2090 tmp[i] = wsp + i*nmax;
2096 for(
int i = 0; i < 3; ++i)
2100 for(
int j = 1; j < 3; ++j)
2103 in[j],1, tmp[i], 1, tmp[i],1);
2110 for(
int e = 0; e < m_numElmt; ++e)
2113 for(
int i = 0; i < 3; ++i)
2117 t = tmp[i] + e*m_nqe,1);
2118 for(
int j = 1; j < 3; ++j)
2122 tmp[i] + e*m_nqe, 1,
2123 t = tmp[i] + e*m_nqe,1);
2129 wsp1 = wsp + 3*nmax;
2132 for (
int i = 0; i < m_numElmt; ++i)
2135 Vmath::Vmul(nPhys,&m_fac0[0],1,tmp[0].get()+i*nPhys,1,
2136 tmp[0].get()+i*nPhys,1);
2139 Vmath::Vvtvp(nPhys,&m_fac1[0],1,tmp[2].get()+i*nPhys,1,
2140 tmp[0].get()+i*nPhys,1,tmp[0].get()+i*nPhys,1);
2143 Vmath::Vmul(nPhys,&m_fac0[0],1,tmp[1].get()+i*nPhys,1,
2144 tmp[1].get()+i*nPhys,1);
2147 Vmath::Vvtvp(nPhys,&m_fac2[0],1,tmp[2].get()+i*nPhys,1,
2148 tmp[1].get()+i*nPhys,1,tmp[1].get()+i*nPhys,1);
2153 m_nquad0, m_nquad1, m_nquad2,
2154 m_nmodes0, m_nmodes1, m_nmodes2,
2155 m_derbase0, m_base1, m_base2,
2156 m_jacWStdW,tmp[0],output,wsp1);
2159 m_nquad0, m_nquad1, m_nquad2,
2160 m_nmodes0, m_nmodes1, m_nmodes2,
2161 m_base0, m_derbase1, m_base2,
2162 m_jacWStdW,tmp[1],tmp[0],wsp1);
2163 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
2166 m_nquad0, m_nquad1, m_nquad2,
2167 m_nmodes0, m_nmodes1, m_nmodes2,
2168 m_base0, m_base1, m_derbase2,
2169 m_jacWStdW,tmp[2],tmp[0],wsp1);
2170 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
2178 boost::ignore_unused(dir, input, output, wsp);
2179 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
2183 int coll_phys_offset)
2185 boost::ignore_unused(factors, coll_phys_offset);
2186 ASSERTL0(
false,
"Not valid for this operator.");
2212 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
2215 :
Operator(pCollExp, pGeomData, factors),
2216 m_nquad0 (m_stdExp->GetNumPoints(0)),
2217 m_nquad1 (m_stdExp->GetNumPoints(1)),
2218 m_nquad2 (m_stdExp->GetNumPoints(2)),
2219 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
2220 m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
2221 m_nmodes2 (m_stdExp->GetBasisNumModes(2)),
2222 m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
2223 m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
2224 m_base2 (m_stdExp->GetBasis(2)->GetBdata()),
2225 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
2226 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata()),
2227 m_derbase2(m_stdExp->GetBasis(2)->GetDbdata())
2230 m_jacWStdW = pGeomData->GetJacWithStdWeights(pCollExp);
2231 m_wspSize = 6 * m_numElmt * (max(m_nquad0*m_nquad1*m_nquad2,
2232 m_nmodes0*m_nmodes1*m_nmodes2));
2233 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
2235 if(m_stdExp->GetBasis(0)->GetBasisType()
2238 m_sortTopVertex =
true;
2242 m_sortTopVertex =
false;
2246 = m_stdExp->GetBasis(0)->GetZ();
2248 = m_stdExp->GetBasis(1)->GetZ();
2250 = m_stdExp->GetBasis(2)->GetZ();
2256 for (
int i = 0; i < m_nquad0; ++i)
2258 for(
int j = 0; j < m_nquad1; ++j)
2260 for(
int k = 0; k < m_nquad2; ++k)
2263 m_fac0[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
2266 m_fac1[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
2267 = (1+z0[i])/(1-z2[k]);
2269 m_fac2[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
2270 = (1+z1[j])/(1-z2[k]);
2280 RegisterCreatorFunction(
2282 IProductWRTDerivBase_SumFac_Pyr::create,
2283 "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.
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) final
Perform operation.
IProductWRTDerivBase_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) final
Array< OneD, const NekDouble > m_jac
~IProductWRTDerivBase_IterPerExp() final
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.
~IProductWRTDerivBase_MatrixFree() final
IProductWRTDerivBase_MatrixFree(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
std::shared_ptr< MatrixFree::IProductWRTDerivBase > m_oper
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
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 > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp) final
Perform operation.
Inner product WRT deriv base operator using LocalRegions implementation.
vector< StdRegions::StdExpansionSharedPtr > m_expList
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
IProductWRTDerivBase_NoCollection(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void operator()(const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp) final
Perform operation.
~IProductWRTDerivBase_NoCollection() final
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
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) 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) final
IProductWRTDerivBase_StdMat(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 WRT deriv base operator using sum-factorisation (Hex)
void operator()(const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp) final
Perform operation.
Array< OneD, const NekDouble > m_derbase1
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
Array< OneD, const NekDouble > m_base2
IProductWRTDerivBase_SumFac_Hex(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< TwoD, const NekDouble > m_derivFac
Array< OneD, const NekDouble > m_derbase2
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
Array< OneD, const NekDouble > m_derbase0
Array< OneD, const NekDouble > m_base1
Array< OneD, const NekDouble > m_base0
~IProductWRTDerivBase_SumFac_Hex() final
Inner product WRT deriv base operator using sum-factorisation (Prism)
Array< OneD, const NekDouble > m_base2
Array< OneD, const NekDouble > m_derbase2
Array< OneD, const NekDouble > m_derbase0
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
Array< OneD, const NekDouble > m_jacWStdW
~IProductWRTDerivBase_SumFac_Prism() final
IProductWRTDerivBase_SumFac_Prism(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
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) final
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
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)
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Array< TwoD, const NekDouble > m_derivFac
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) final
Array< OneD, NekDouble > m_fac0
Array< OneD, const NekDouble > m_derbase1
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
~IProductWRTDerivBase_SumFac_Pyr() final
Array< OneD, NekDouble > m_fac1
Array< OneD, const NekDouble > m_jacWStdW
Array< OneD, const NekDouble > m_derbase0
Array< OneD, const NekDouble > m_base0
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) 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) final
Perform operation.
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)
Check the validity of the supplied factor map.
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()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
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_derbase0
IProductWRTDerivBase_SumFac_Seg(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void operator()(const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp) final
Perform operation.
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) final
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
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
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
~IProductWRTDerivBase_SumFac_Tri() final
Array< OneD, const NekDouble > m_jacWStdW
Array< OneD, NekDouble > m_fac1
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Array< TwoD, const NekDouble > m_derivFac
Array< OneD, const NekDouble > m_derbase0
void operator()(const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp) final
IProductWRTDerivBase_SumFac_Tri(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.
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.
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)
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.
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)