35 #include <boost/core/ignore_unused.hpp> 44 namespace Collections {
73 int nPhys = m_stdExp->GetTotPoints();
74 int ntot = m_numElmt*nPhys;
75 int nmodes = m_stdExp->GetNcoeffs();
80 in[0] = entry0; in[1] = entry1;
83 output = (m_coordim == 3)? entry3: (m_coordim == 2)?
86 for(
int i = 0; i < m_dim; ++i)
88 tmp[i] = wsp + i*ntot;
92 for(
int i = 0; i < m_dim; ++i)
96 for(
int j = 1; j < m_coordim; ++j)
99 in[j],1, tmp[i], 1, tmp[i],1);
107 Blas::Dgemm(
'N',
'N', m_iProdWRTStdDBase[0]->GetRows(),
108 m_numElmt,m_iProdWRTStdDBase[0]->GetColumns(),
109 1.0, m_iProdWRTStdDBase[0]->GetRawPtr(),
110 m_iProdWRTStdDBase[0]->GetRows(),
111 tmp[0].
get(), nPhys, 0.0,
112 output.get(), nmodes);
115 for(
int i = 1; i < m_dim; ++i)
118 Blas::Dgemm(
'N',
'N', m_iProdWRTStdDBase[i]->GetRows(),
119 m_numElmt,m_iProdWRTStdDBase[i]->GetColumns(),
120 1.0, m_iProdWRTStdDBase[i]->GetRawPtr(),
121 m_iProdWRTStdDBase[i]->GetRows(),
122 tmp[i].
get(), nPhys, 1.0,
123 output.get(), nmodes);
133 boost::ignore_unused(dir, input, output, wsp);
134 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
146 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
151 m_dim = PtsKey.size();
152 m_coordim = pCollExp[0]->GetCoordim();
154 int nqtot = m_stdExp->GetTotPoints();
155 int nmodes = m_stdExp->GetNcoeffs();
159 for(
int i = 0; i < m_dim; ++i)
164 for(
int j = 0; j < nqtot; ++j)
168 m_stdExp->IProductWRTDerivBase(i,tmp,tmp1);
170 &(m_iProdWRTStdDBase[i]->GetPtr())[0]
174 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
175 m_jac = pGeomData->GetJac(pCollExp);
176 m_wspSize = m_dim*nqtot*m_numElmt;
181 OperatorKey IProductWRTDerivBase_StdMat::m_typeArr[] = {
184 IProductWRTDerivBase_StdMat::create,
185 "IProductWRTDerivBase_StdMat_Seg"),
188 IProductWRTDerivBase_StdMat::create,
189 "IProductWRTDerivBase_StdMat_Tri"),
192 IProductWRTDerivBase_StdMat::create,
193 "IProductWRTDerivBase_StdMat_NodalTri"),
196 IProductWRTDerivBase_StdMat::create,
197 "IProductWRTDerivBase_StdMat_Quad"),
200 IProductWRTDerivBase_StdMat::create,
201 "IProductWRTDerivBase_StdMat_Tet"),
204 IProductWRTDerivBase_StdMat::create,
205 "IProductWRTDerivBase_StdMat_NodalTet"),
208 IProductWRTDerivBase_StdMat::create,
209 "IProductWRTDerivBase_StdMat_Pyr"),
212 IProductWRTDerivBase_StdMat::create,
213 "IProductWRTDerivBase_StdMat_Prism"),
216 IProductWRTDerivBase_StdMat::create,
217 "IProductWRTDerivBase_StdMat_NodalPrism"),
220 IProductWRTDerivBase_StdMat::create,
221 "IProductWRTDerivBase_StdMat_Hex"),
224 IProductWRTDerivBase_StdMat::create,
"IProductWRTDerivBase_SumFac_Pyr")
247 unsigned int nPhys = m_stdExp->GetTotPoints();
248 unsigned int ntot = m_numElmt*nPhys;
249 unsigned int nmodes = m_stdExp->GetNcoeffs();
250 unsigned int nmax = max(ntot,m_numElmt*nmodes);
255 in[0] = entry0; in[1] = entry1; in[2] = entry2;
257 output = (m_coordim == 3)? entry3: (m_coordim == 2)?
260 for(
int i = 0; i < m_dim; ++i)
262 tmp[i] = wsp + i*nmax;
266 for(
int i = 0; i < m_dim; ++i)
270 for(
int j = 1; j < m_coordim; ++j)
273 in[j],1, tmp[i], 1, tmp[i],1);
280 for(
int n = 0; n < m_numElmt; ++n)
282 m_stdExp->IProductWRTDerivBase(0,tmp[0]+n*nPhys,
283 tmp1 = output + n*nmodes);
287 for(
int i = 1; i < m_dim; ++i)
291 for(
int n = 0; n < m_numElmt; ++n)
293 m_stdExp->IProductWRTDerivBase(i,tmp[i]+n*nPhys,tmp[0]);
295 tmp1 = output+n*nmodes,1);
306 boost::ignore_unused(dir, input, output, wsp);
307 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
318 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
323 m_dim = PtsKey.size();
324 m_coordim = pCollExp[0]->GetCoordim();
326 int nqtot = m_stdExp->GetTotPoints();
328 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
329 m_jac = pGeomData->GetJac(pCollExp);
330 m_wspSize = m_dim*nqtot*m_numElmt;
335 OperatorKey IProductWRTDerivBase_IterPerExp::m_typeArr[] = {
338 IProductWRTDerivBase_IterPerExp::create,
339 "IProductWRTDerivBase_IterPerExp_Seg"),
342 IProductWRTDerivBase_IterPerExp::create,
343 "IProductWRTDerivBase_IterPerExp_Tri"),
346 IProductWRTDerivBase_IterPerExp::create,
347 "IProductWRTDerivBase_IterPerExp_NodalTri"),
350 IProductWRTDerivBase_IterPerExp::create,
351 "IProductWRTDerivBase_IterPerExp_Quad"),
354 IProductWRTDerivBase_IterPerExp::create,
355 "IProductWRTDerivBase_IterPerExp_Tet"),
358 IProductWRTDerivBase_IterPerExp::create,
359 "IProductWRTDerivBase_IterPerExp_NodalTet"),
362 IProductWRTDerivBase_IterPerExp::create,
363 "IProductWRTDerivBase_IterPerExp_Pyr"),
366 IProductWRTDerivBase_IterPerExp::create,
367 "IProductWRTDerivBase_IterPerExp_Prism"),
370 IProductWRTDerivBase_IterPerExp::create,
371 "IProductWRTDerivBase_IterPerExp_NodalPrism"),
374 IProductWRTDerivBase_IterPerExp::create,
375 "IProductWRTDerivBase_IterPerExp_Hex")
399 boost::ignore_unused(wsp);
401 unsigned int nmodes = m_expList[0]->GetNcoeffs();
402 unsigned int nPhys = m_expList[0]->GetTotPoints();
407 in[0] = entry0; in[1] = entry1; in[2] = entry2;
409 output = (m_coordim == 3)? entry3: (m_coordim == 2)?
412 for(
int n = 0; n < m_numElmt; ++n)
414 m_expList[n]->IProductWRTDerivBase(0,
416 tmp1 = output + n * nmodes);
419 for(
int i = 1; i < m_dim; ++i)
421 for(
int n = 0; n < m_numElmt; ++n)
423 m_expList[n]->IProductWRTDerivBase(i,in[i]+n*nPhys,tmp);
426 tmp1 = output+n*nmodes,1);
437 boost::ignore_unused(dir, input, output, wsp);
438 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
448 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
452 m_expList = pCollExp;
453 m_dim = pCollExp[0]->GetNumBases();
454 m_coordim = pCollExp[0]->GetCoordim();
459 OperatorKey IProductWRTDerivBase_NoCollection::m_typeArr[] = {
462 IProductWRTDerivBase_NoCollection::create,
463 "IProductWRTDerivBase_NoCollection_Seg"),
466 IProductWRTDerivBase_NoCollection::create,
467 "IProductWRTDerivBase_NoCollection_Tri"),
470 IProductWRTDerivBase_NoCollection::create,
471 "IProductWRTDerivBase_NoCollection_NodalTri"),
474 IProductWRTDerivBase_NoCollection::create,
475 "IProductWRTDerivBase_NoCollection_Quad"),
478 IProductWRTDerivBase_NoCollection::create,
479 "IProductWRTDerivBase_NoCollection_Tet"),
482 IProductWRTDerivBase_NoCollection::create,
483 "IProductWRTDerivBase_NoCollection_NodalTet"),
486 IProductWRTDerivBase_NoCollection::create,
487 "IProductWRTDerivBase_NoCollection_Pyr"),
490 IProductWRTDerivBase_NoCollection::create,
491 "IProductWRTDerivBase_NoCollection_Prism"),
494 IProductWRTDerivBase_NoCollection::create,
495 "IProductWRTDerivBase_NoCollection_NodalPrism"),
498 IProductWRTDerivBase_NoCollection::create,
499 "IProductWRTDerivBase_NoCollection_Hex")
523 boost::ignore_unused(output1, output2);
525 Vmath::Vmul(m_numElmt*m_nquad0, m_jac, 1, input, 1, wsp, 1);
526 Vmath::Vmul(m_numElmt*m_nquad0, &m_derivFac[0][0], 1,
531 Blas::Dgemm(
'T',
'N', m_nmodes0, m_numElmt, m_nquad0,
532 1.0, m_derbase0.get(), m_nquad0,
533 &wsp[0], m_nquad0, 0.0,
534 &output[0], m_nmodes0);
543 boost::ignore_unused(dir, input, output, wsp);
544 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
556 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
559 m_nquad0 (m_stdExp->GetNumPoints(0)),
560 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
561 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata())
563 m_wspSize = m_numElmt*m_nquad0;
564 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
565 m_jac = pGeomData->GetJacWithStdWeights(pCollExp);
571 RegisterCreatorFunction(
573 IProductWRTDerivBase_SumFac_Seg::create,
574 "IProductWRTDerivBase_SumFac_Seg");
596 unsigned int nPhys = m_stdExp->GetTotPoints();
597 unsigned int ntot = m_numElmt*nPhys;
598 unsigned int nmodes = m_stdExp->GetNcoeffs();
599 unsigned int nmax = max(ntot,m_numElmt*nmodes);
604 in[0] = entry0; in[1] = entry1; in[2] = entry2;
606 output = (m_coordim == 2)? entry2: entry3;
608 tmp[0] = wsp; tmp[1] = wsp + nmax;
612 for(
int i = 0; i < 2; ++i)
616 for(
int j = 1; j < 2; ++j)
619 in[j],1, tmp[i], 1, tmp[i],1);
626 m_nmodes0, m_nmodes1,
628 m_jac, tmp[0], output, wsp1);
633 m_nmodes0, m_nmodes1,
635 m_jac, tmp[1], tmp[0], wsp1);
637 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
646 boost::ignore_unused(dir, input, output, wsp);
647 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
667 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
670 m_nquad0 (m_stdExp->GetNumPoints(0)),
671 m_nquad1 (m_stdExp->GetNumPoints(1)),
672 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
673 m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
674 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
675 m_colldir1(m_stdExp->GetBasis(1)->Collocation()),
676 m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
677 m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
678 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
679 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata())
682 m_coordim = pCollExp[0]->GetCoordim();
684 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
685 m_jac = pGeomData->GetJacWithStdWeights(pCollExp);
686 m_wspSize = 4 * m_numElmt * (max(m_nquad0*m_nquad1,
687 m_nmodes0*m_nmodes1));
692 OperatorKey IProductWRTDerivBase_SumFac_Quad::m_type =
695 IProductWRTDerivBase_SumFac_Quad::create,
696 "IProductWRTDerivBase_IterPerExp_Quad");
749 unsigned int nPhys = m_stdExp->GetTotPoints();
750 unsigned int ntot = m_numElmt*nPhys;
751 unsigned int nmodes = m_stdExp->GetNcoeffs();
752 unsigned int nmax = max(ntot,m_numElmt*nmodes);
757 in[0] = entry0; in[1] = entry1; in[2] = entry2;
759 output = (m_coordim == 2)? entry2: entry3;
761 tmp[0] = wsp; tmp[1] = wsp + nmax;
764 for(
int i = 0; i < 2; ++i)
766 Vmath::Vmul (ntot,m_derivFac[i],1, in[0],1, tmp[i],1);
768 for(
int j = 1; j < 2; ++j)
771 in[j],1, tmp[i], 1, tmp[i],1);
776 for (
int i = 0; i < m_numElmt; ++i)
779 Vmath::Vmul(nPhys,&m_fac0[0],1,tmp[0].
get()+i*nPhys,1,
780 tmp[0].
get()+i*nPhys,1);
784 tmp[0].
get()+i*nPhys,1,tmp[0].
get()+i*nPhys,1);
788 TriIProduct(m_sortTopVertex, m_numElmt, m_nquad0, m_nquad1,
789 m_nmodes0, m_nmodes1, m_derbase0, m_base1,
790 m_jac, tmp[0], output, wsp1);
793 TriIProduct(m_sortTopVertex, m_numElmt, m_nquad0, m_nquad1,
794 m_nmodes0, m_nmodes1, m_base0, m_derbase1,
795 m_jac, tmp[1], tmp[0], wsp1);
797 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
806 boost::ignore_unused(dir, input, output, wsp);
807 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
830 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
833 m_nquad0 (m_stdExp->GetNumPoints(0)),
834 m_nquad1 (m_stdExp->GetNumPoints(1)),
835 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
836 m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
837 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
838 m_colldir1(m_stdExp->GetBasis(1)->Collocation()),
839 m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
840 m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
841 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
842 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata())
845 m_coordim = pCollExp[0]->GetCoordim();
847 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
848 m_jac = pGeomData->GetJacWithStdWeights(pCollExp);
849 m_wspSize = 4 * m_numElmt * (max(m_nquad0*m_nquad1,
850 m_nmodes0*m_nmodes1));
852 if(m_stdExp->GetBasis(0)->GetBasisType()
855 m_sortTopVertex =
true;
859 m_sortTopVertex =
false;
863 = m_stdExp->GetBasis(0)->GetZ();
865 = m_stdExp->GetBasis(1)->GetZ();
869 for (
int i = 0; i < m_nquad0; ++i)
871 for(
int j = 0; j < m_nquad1; ++j)
873 m_fac0[i+j*m_nquad0] = 2.0/(1-z1[j]);
879 for (
int i = 0; i < m_nquad0; ++i)
881 for(
int j = 0; j < m_nquad1; ++j)
883 m_fac1[i+j*m_nquad0] = (1+z0[i])/(1-z1[j]);
890 OperatorKey IProductWRTDerivBase_SumFac_Tri::m_type =
893 IProductWRTDerivBase_SumFac_Tri::create,
894 "IProductWRTDerivBase_IterPerExp_Tri");
916 unsigned int nPhys = m_stdExp->GetTotPoints();
917 unsigned int ntot = m_numElmt*nPhys;
918 unsigned int nmodes = m_stdExp->GetNcoeffs();
919 unsigned int nmax = max(ntot,m_numElmt*nmodes);
924 in[0] = entry0; in[1] = entry1;
929 for(
int i = 0; i < 3; ++i)
931 tmp[i] = wsp + i*nmax;
935 for(
int i = 0; i < 3; ++i)
939 for(
int j = 1; j < 3; ++j)
942 in[j],1, tmp[i], 1, tmp[i],1);
949 HexIProduct(
false,m_colldir1,m_colldir2, m_numElmt,
950 m_nquad0, m_nquad1, m_nquad2,
951 m_nmodes0, m_nmodes1, m_nmodes2,
952 m_derbase0, m_base1, m_base2,
953 m_jac,tmp[0],output,wsp1);
955 HexIProduct(m_colldir0,
false,m_colldir2, m_numElmt,
956 m_nquad0, m_nquad1, m_nquad2,
957 m_nmodes0, m_nmodes1, m_nmodes2,
958 m_base0, m_derbase1, m_base2,
959 m_jac,tmp[1],tmp[0],wsp1);
960 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
962 HexIProduct(m_colldir0,m_colldir1,
false, m_numElmt,
963 m_nquad0, m_nquad1, m_nquad2,
964 m_nmodes0, m_nmodes1, m_nmodes2,
965 m_base0, m_base1, m_derbase2,
966 m_jac,tmp[2],tmp[0],wsp1);
967 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
976 boost::ignore_unused(dir, input, output, wsp);
977 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
1001 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1004 m_nquad0 (m_stdExp->GetNumPoints(0)),
1005 m_nquad1 (m_stdExp->GetNumPoints(1)),
1006 m_nquad2 (m_stdExp->GetNumPoints(2)),
1007 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
1008 m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
1009 m_nmodes2 (m_stdExp->GetBasisNumModes(2)),
1010 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
1011 m_colldir1(m_stdExp->GetBasis(1)->Collocation()),
1012 m_colldir2(m_stdExp->GetBasis(2)->Collocation()),
1013 m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
1014 m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
1015 m_base2 (m_stdExp->GetBasis(2)->GetBdata()),
1016 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
1017 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata()),
1018 m_derbase2(m_stdExp->GetBasis(2)->GetDbdata())
1021 m_jac = pGeomData->GetJacWithStdWeights(pCollExp);
1022 m_wspSize = 6 * m_numElmt * (max(m_nquad0*m_nquad1*m_nquad2,
1023 m_nmodes0*m_nmodes1*m_nmodes2));
1024 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1030 RegisterCreatorFunction(
1032 IProductWRTDerivBase_SumFac_Hex::create,
1033 "IProductWRTDerivBase_SumFac_Hex");
1098 virtual
void operator()(
1105 unsigned int nPhys = m_stdExp->GetTotPoints();
1106 unsigned int ntot = m_numElmt*nPhys;
1107 unsigned int nmodes = m_stdExp->GetNcoeffs();
1108 unsigned int nmax = max(ntot,m_numElmt*nmodes);
1113 in[0] = entry0; in[1] = entry1;
1118 for(
int i = 0; i < 3; ++i)
1120 tmp[i] = wsp + i*nmax;
1123 for(
int i = 0; i < 3; ++i)
1125 Vmath::Vmul (ntot,m_derivFac[i],1, in[0],1,tmp[i],1);
1126 for(
int j = 1; j < 3; ++j)
1129 in[j],1, tmp[i], 1, tmp[i],1);
1133 wsp1 = wsp + 3*nmax;
1136 for (
int i = 0; i < m_numElmt; ++i)
1140 tmp[2].
get() + i*nPhys, 1,
1145 tmp[0].get()+i*nPhys,1,tmp[0].get()+i*nPhys,1);
1148 Vmath::Vmul(nPhys,&m_fac0[0],1,tmp[0].
get()+i*nPhys,1,
1149 tmp[0].
get()+i*nPhys,1);
1152 Vmath::Vvtvp(nPhys,&m_fac3[0],1,tmp[2].
get()+i*nPhys,1,
1153 tmp[1].
get()+i*nPhys,1,tmp[1].
get()+i*nPhys,1);
1156 Vmath::Vmul(nPhys,&m_fac2[0],1,tmp[1].
get()+i*nPhys,1,
1157 tmp[1].
get()+i*nPhys,1);
1163 m_nquad0, m_nquad1, m_nquad2,
1164 m_nmodes0, m_nmodes1, m_nmodes2,
1165 m_derbase0, m_base1, m_base2,
1166 m_jac,tmp[0],output,wsp1);
1169 m_nquad0, m_nquad1, m_nquad2,
1170 m_nmodes0, m_nmodes1, m_nmodes2,
1171 m_base0, m_derbase1, m_base2,
1172 m_jac,tmp[1],tmp[0],wsp1);
1173 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
1176 m_nquad0, m_nquad1, m_nquad2,
1177 m_nmodes0, m_nmodes1, m_nmodes2,
1178 m_base0, m_base1, m_derbase2,
1179 m_jac,tmp[2],tmp[0],wsp1);
1180 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
1189 boost::ignore_unused(dir, input, output, wsp);
1190 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
1216 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1219 m_nquad0 (m_stdExp->GetNumPoints(0)),
1220 m_nquad1 (m_stdExp->GetNumPoints(1)),
1221 m_nquad2 (m_stdExp->GetNumPoints(2)),
1222 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
1223 m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
1224 m_nmodes2 (m_stdExp->GetBasisNumModes(2)),
1225 m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
1226 m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
1227 m_base2 (m_stdExp->GetBasis(2)->GetBdata()),
1228 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
1229 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata()),
1230 m_derbase2(m_stdExp->GetBasis(2)->GetDbdata())
1233 m_jac = pGeomData->GetJacWithStdWeights(pCollExp);
1234 m_wspSize = 6 * m_numElmt * (max(m_nquad0*m_nquad1*m_nquad2,
1235 m_nmodes0*m_nmodes1*m_nmodes2));
1236 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1240 = m_stdExp->GetBasis(0)->GetZ();
1242 = m_stdExp->GetBasis(1)->GetZ();
1244 = m_stdExp->GetBasis(2)->GetZ();
1251 for (
int i = 0; i < m_nquad0; ++i)
1253 for(
int j = 0; j < m_nquad1; ++j)
1255 for(
int k = 0; k < m_nquad2; ++k)
1258 m_fac0[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1259 = 4.0/((1-z1[j])*(1-z2[k]));
1260 m_fac1[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1262 m_fac2[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1264 m_fac3[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1270 if(m_stdExp->GetBasis(0)->GetBasisType()
1273 m_sortTopEdge =
true;
1277 m_sortTopEdge =
false;
1285 RegisterCreatorFunction(
1287 IProductWRTDerivBase_SumFac_Tet::create,
1288 "IProductWRTDerivBase_SumFac_Tet");
1356 unsigned int nPhys = m_stdExp->GetTotPoints();
1357 unsigned int ntot = m_numElmt*nPhys;
1358 unsigned int nmodes = m_stdExp->GetNcoeffs();
1359 unsigned int nmax = max(ntot,m_numElmt*nmodes);
1364 in[0] = entry0; in[1] = entry1;
1369 for(
int i = 0; i < 3; ++i)
1371 tmp[i] = wsp + i*nmax;
1374 for(
int i = 0; i < 3; ++i)
1378 for(
int j = 1; j < 3; ++j)
1381 in[j],1, tmp[i], 1, tmp[i],1);
1384 wsp1 = wsp + 3*nmax;
1387 for (
int i = 0; i < m_numElmt; ++i)
1390 Vmath::Vmul(nPhys,&m_fac0[0],1,tmp[0].
get()+i*nPhys,1,
1391 tmp[0].
get()+i*nPhys,1);
1394 Vmath::Vvtvp(nPhys,&m_fac1[0],1,tmp[2].
get()+i*nPhys,1,
1395 tmp[0].
get()+i*nPhys,1,tmp[0].
get()+i*nPhys,1);
1400 m_nquad0, m_nquad1, m_nquad2,
1401 m_nmodes0, m_nmodes1, m_nmodes2,
1402 m_derbase0, m_base1, m_base2,
1403 m_jac,tmp[0],output,wsp1);
1406 m_nquad0, m_nquad1, m_nquad2,
1407 m_nmodes0, m_nmodes1, m_nmodes2,
1408 m_base0, m_derbase1, m_base2,
1409 m_jac,tmp[1],tmp[0],wsp1);
1410 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
1413 m_nquad0, m_nquad1, m_nquad2,
1414 m_nmodes0, m_nmodes1, m_nmodes2,
1415 m_base0, m_base1, m_derbase2,
1416 m_jac,tmp[2],tmp[0],wsp1);
1417 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
1426 boost::ignore_unused(dir, input, output, wsp);
1427 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
1452 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1455 m_nquad0 (m_stdExp->GetNumPoints(0)),
1456 m_nquad1 (m_stdExp->GetNumPoints(1)),
1457 m_nquad2 (m_stdExp->GetNumPoints(2)),
1458 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
1459 m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
1460 m_nmodes2 (m_stdExp->GetBasisNumModes(2)),
1461 m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
1462 m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
1463 m_base2 (m_stdExp->GetBasis(2)->GetBdata()),
1464 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
1465 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata()),
1466 m_derbase2(m_stdExp->GetBasis(2)->GetDbdata())
1469 m_jac = pGeomData->GetJacWithStdWeights(pCollExp);
1470 m_wspSize = 6 * m_numElmt * (max(m_nquad0*m_nquad1*m_nquad2,
1471 m_nmodes0*m_nmodes1*m_nmodes2));
1472 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1474 if(m_stdExp->GetBasis(0)->GetBasisType()
1477 m_sortTopVertex =
true;
1481 m_sortTopVertex =
false;
1485 = m_stdExp->GetBasis(0)->GetZ();
1487 = m_stdExp->GetBasis(2)->GetZ();
1492 for (
int i = 0; i < m_nquad0; ++i)
1494 for(
int j = 0; j < m_nquad1; ++j)
1496 for(
int k = 0; k < m_nquad2; ++k)
1499 m_fac0[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1502 m_fac1[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1503 = (1+z0[i])/(1-z2[k]);
1513 RegisterCreatorFunction(
1515 IProductWRTDerivBase_SumFac_Prism::create,
1516 "IProductWRTDerivBase_SumFac_Prism");
1593 unsigned int nPhys = m_stdExp->GetTotPoints();
1594 unsigned int ntot = m_numElmt*nPhys;
1595 unsigned int nmodes = m_stdExp->GetNcoeffs();
1596 unsigned int nmax = max(ntot,m_numElmt*nmodes);
1601 in[0] = entry0; in[1] = entry1;
1606 for(
int i = 0; i < 3; ++i)
1608 tmp[i] = wsp + i*nmax;
1611 for(
int i = 0; i < 3; ++i)
1613 Vmath::Vmul (ntot,m_derivFac[i],1, in[0],1, tmp[i],1);
1614 for(
int j = 1; j < 3; ++j)
1617 in[j],1, tmp[i], 1, tmp[i],1);
1620 wsp1 = wsp + 3*nmax;
1623 for (
int i = 0; i < m_numElmt; ++i)
1626 Vmath::Vmul(nPhys,&m_fac0[0],1,tmp[0].
get()+i*nPhys,1,
1627 tmp[0].
get()+i*nPhys,1);
1630 Vmath::Vvtvp(nPhys,&m_fac1[0],1,tmp[2].
get()+i*nPhys,1,
1631 tmp[0].
get()+i*nPhys,1,tmp[0].
get()+i*nPhys,1);
1634 Vmath::Vmul(nPhys,&m_fac0[0],1,tmp[1].
get()+i*nPhys,1,
1635 tmp[1].
get()+i*nPhys,1);
1638 Vmath::Vvtvp(nPhys,&m_fac2[0],1,tmp[2].
get()+i*nPhys,1,
1639 tmp[1].
get()+i*nPhys,1,tmp[1].
get()+i*nPhys,1);
1644 m_nquad0, m_nquad1, m_nquad2,
1645 m_nmodes0, m_nmodes1, m_nmodes2,
1646 m_derbase0, m_base1, m_base2,
1647 m_jac,tmp[0],output,wsp1);
1650 m_nquad0, m_nquad1, m_nquad2,
1651 m_nmodes0, m_nmodes1, m_nmodes2,
1652 m_base0, m_derbase1, m_base2,
1653 m_jac,tmp[1],tmp[0],wsp1);
1654 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
1657 m_nquad0, m_nquad1, m_nquad2,
1658 m_nmodes0, m_nmodes1, m_nmodes2,
1659 m_base0, m_base1, m_derbase2,
1660 m_jac,tmp[2],tmp[0],wsp1);
1661 Vmath::Vadd(m_numElmt*nmodes,tmp[0],1,output,1,output,1);
1670 boost::ignore_unused(dir, input, output, wsp);
1671 NEKERROR(ErrorUtil::efatal,
"Not valid for this operator.");
1697 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1700 m_nquad0 (m_stdExp->GetNumPoints(0)),
1701 m_nquad1 (m_stdExp->GetNumPoints(1)),
1702 m_nquad2 (m_stdExp->GetNumPoints(2)),
1703 m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
1704 m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
1705 m_nmodes2 (m_stdExp->GetBasisNumModes(2)),
1706 m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
1707 m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
1708 m_base2 (m_stdExp->GetBasis(2)->GetBdata()),
1709 m_derbase0(m_stdExp->GetBasis(0)->GetDbdata()),
1710 m_derbase1(m_stdExp->GetBasis(1)->GetDbdata()),
1711 m_derbase2(m_stdExp->GetBasis(2)->GetDbdata())
1714 m_jac = pGeomData->GetJacWithStdWeights(pCollExp);
1715 m_wspSize = 6 * m_numElmt * (max(m_nquad0*m_nquad1*m_nquad2,
1716 m_nmodes0*m_nmodes1*m_nmodes2));
1717 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1719 if(m_stdExp->GetBasis(0)->GetBasisType()
1722 m_sortTopVertex =
true;
1726 m_sortTopVertex =
false;
1730 = m_stdExp->GetBasis(0)->GetZ();
1732 = m_stdExp->GetBasis(1)->GetZ();
1734 = m_stdExp->GetBasis(2)->GetZ();
1740 for (
int i = 0; i < m_nquad0; ++i)
1742 for(
int j = 0; j < m_nquad1; ++j)
1744 for(
int k = 0; k < m_nquad2; ++k)
1747 m_fac0[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1750 m_fac1[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1751 = (1+z0[i])/(1-z2[k]);
1753 m_fac2[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1754 = (1+z1[j])/(1-z2[k]);
1764 RegisterCreatorFunction(
1766 IProductWRTDerivBase_SumFac_Pyr::create,
1767 "IProductWRTDerivBase_SumFac_Pyr");
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
std::shared_ptr< CoalescedGeomData > CoalescedGeomDataSharedPtr
Inner product WRT deriv base operator using sum-factorisation (Tri)
Array< TwoD, const NekDouble > m_derivFac
Inner product WRT deriv base operator using sum-factorisation (Segment)
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)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mod...
IProductWRTDerivBase_StdMat(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
std::vector< PointsKey > PointsKeyVector
Array< OneD, NekDouble > m_fac0
void PyrIProduct(bool sortTopVertex, 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)
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
std::tuple< LibUtilities::ShapeType, OperatorType, ImplementationType, ExpansionIsNodal > OperatorKey
Key for describing an Operator.
Array< OneD, NekDouble > m_fac0
Array< TwoD, const NekDouble > m_derivFac
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_derbase1
Array< OneD, NekDouble > m_fac1
IProductWRTDerivBase_SumFac_Tri(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
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
Principle Modified Functions .
Inner product WRT deriv base operator using LocalRegions implementation.
Array< OneD, const NekDouble > m_derbase0
Inner product WRT deriv base operator using standard matrix approach.
Array< OneD, const NekDouble > m_base1
Array< TwoD, const NekDouble > m_derivFac
Array< TwoD, const NekDouble > m_derivFac
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_derbase1
Array< OneD, const NekDouble > m_base1
Array< OneD, const NekDouble > m_jac
Array< OneD, const NekDouble > m_jac
IProductWRTDerivBase_SumFac_Quad(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
Array< OneD, NekDouble > m_fac2
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)
Array< OneD, const NekDouble > m_derbase1
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 A[m x n], B[n x k], C[m x k].
Base class for operators on a collection of elements.
Array< OneD, const NekDouble > m_base2
virtual void operator()(const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp)
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
virtual void operator()(const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp)
Perform operation.
Array< OneD, NekDouble > m_fac1
virtual void operator()(const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp)
Perform operation.
virtual void operator()(const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp)
Perform operation.
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)
virtual void operator()(const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp)
Array< OneD, const NekDouble > m_jac
IProductWRTDerivBase_SumFac_Prism(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
Array< OneD, const NekDouble > m_jac
Array< OneD, NekDouble > m_fac2
Array< OneD, const NekDouble > m_base2
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)
Array< TwoD, const NekDouble > m_derivFac
virtual void operator()(const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp)
Perform operation.
Inner product WRT deriv base operator using sum-factorisation (Tet)
Array< OneD, const NekDouble > m_base2
virtual void operator()(const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp)
Perform operation.
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
Array< OneD, const NekDouble > m_derbase0
Array< OneD, const NekDouble > m_derbase0
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
IProductWRTDerivBase_SumFac_Seg(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
Array< OneD, const NekDouble > m_jac
IProductWRTDerivBase_SumFac_Pyr(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
Array< OneD, const NekDouble > m_base0
IProductWRTDerivBase_NoCollection(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
Inner product WRT deriv base operator using element-wise operation.
virtual void operator()(const Array< OneD, const NekDouble > &entry0, Array< OneD, NekDouble > &entry1, Array< OneD, NekDouble > &entry2, Array< OneD, NekDouble > &entry3, Array< OneD, NekDouble > &wsp)
Inner product WRT deriv base operator using sum-factorisation (Quad)
IProductWRTDerivBase_IterPerExp(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
Inner product WRT deriv base operator using sum-factorisation (Hex)
OperatorFactory & GetOperatorFactory()
Returns the singleton Operator factory object.
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)
Perform operation.
Array< OneD, const NekDouble > m_derbase0
Array< OneD, NekDouble > m_fac0
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
Array< OneD, const NekDouble > m_jac
Array< OneD, const NekDouble > m_derbase2
Array< OneD, const NekDouble > m_derbase2
Array< OneD, NekDouble > m_fac0
void PrismIProduct(bool sortTopVertex, 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)
Array< OneD, const NekDouble > m_derbase1
Array< OneD, const NekDouble > m_base1
Array< OneD, NekDouble > m_fac1
Inner product WRT deriv base operator using sum-factorisation (Prism)
#define OPERATOR_CREATE(cname)
Array< OneD, NekDouble > m_fac1
IProductWRTDerivBase_SumFac_Hex(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
Array< OneD, const NekDouble > m_base2
Array< OneD, NekDouble > m_fac3
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_derbase2
Array< OneD, const NekDouble > m_base1
Array< OneD, DNekMatSharedPtr > m_iProdWRTStdDBase
Array< OneD, const NekDouble > m_derbase1
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
Array< TwoD, const NekDouble > m_derivFac
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
Array< OneD, const NekDouble > m_derbase1
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Array< OneD, const NekDouble > m_jac
Array< OneD, const NekDouble > m_derbase0
Array< TwoD, const NekDouble > m_derivFac
Array< OneD, const NekDouble > m_derbase0
Array< OneD, const NekDouble > m_base1
Array< TwoD, const NekDouble > m_derivFac
Array< OneD, const NekDouble > m_jac
Array< OneD, const NekDouble > m_base1
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)
Inner product WRT deriv base operator using sum-factorisation (Pyr)
Array< OneD, const NekDouble > m_jac
IProductWRTDerivBase_SumFac_Tet(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
Array< TwoD, const NekDouble > m_derivFac
vector< StdRegions::StdExpansionSharedPtr > m_expList
Array< OneD, const NekDouble > m_derbase2
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 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.
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_derbase0