35 #include <boost/core/ignore_unused.hpp>
37 #include <MatrixFreeOps/Operator.hpp>
46 namespace Collections {
76 int nPhys = m_stdExp->GetTotPoints();
77 int ntot = m_numElmt*nPhys;
81 out[0] = output0; out[1] = output1; out[2] = output2;
83 for(
int i = 0; i < m_dim; ++i)
85 Diff[i] = wsp + i*ntot;
89 for(
int i = 0; i < m_dim; ++i)
91 Blas::Dgemm(
'N',
'N', m_derivMat[i]->GetRows(), m_numElmt,
92 m_derivMat[i]->GetColumns(), 1.0,
93 m_derivMat[i]->GetRawPtr(),
94 m_derivMat[i]->GetRows(), input.get(), nPhys,
95 0.0, &Diff[i][0],nPhys);
101 for(
int i = 0; i < m_coordim; ++i)
104 for(
int j = 0; j < m_dim; ++j)
116 for(
int i = 0; i < m_coordim; ++i)
119 for(
int e = 0; e < m_numElmt; ++e)
121 for(
int j = 0; j < m_dim; ++j)
124 Diff[j] + e*m_nqe, 1,
126 t = out[i] + e*m_nqe, 1);
138 int nPhys = m_stdExp->GetTotPoints();
139 int ntot = m_numElmt*nPhys;
143 for(
int i = 0; i < m_dim; ++i)
145 Diff[i] = wsp + i*ntot;
149 for(
int i = 0; i < m_dim; ++i)
151 Blas::Dgemm(
'N',
'N', m_derivMat[i]->GetRows(), m_numElmt,
152 m_derivMat[i]->GetColumns(), 1.0,
153 m_derivMat[i]->GetRawPtr(),
154 m_derivMat[i]->GetRows(), input.get(), nPhys,
155 0.0, &Diff[i][0],nPhys);
162 for(
int j = 0; j < m_dim; ++j)
173 for(
int e = 0; e < m_numElmt; ++e)
175 for(
int j = 0; j < m_dim; ++j)
178 Diff[j] + e*m_nqe, 1,
180 t = output + e*m_nqe, 1);
187 int coll_phys_offset)
189 boost::ignore_unused(factors, coll_phys_offset);
190 ASSERTL0(
false,
"Not valid for this operator.");
201 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
204 :
Operator(pCollExp, pGeomData, factors)
208 m_dim = PtsKey.size();
209 m_coordim = pCollExp[0]->GetCoordim();
211 for(
int i = 0; i < m_dim; ++i)
213 nqtot *= PtsKey[i].GetNumPoints();
217 for(
int i = 0; i < m_dim; ++i)
222 for(
int j = 0; j < nqtot; ++j)
226 m_stdExp->PhysDeriv(i,tmp,tmp1);
228 &(m_derivMat[i]->GetPtr())[0] + j*nqtot, 1);
231 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
232 m_wspSize = 3*nqtot*m_numElmt;
241 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Seg"),
244 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Tri"),
247 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_NodalTri"),
250 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Quad"),
253 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Tet"),
256 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_NodalTet"),
259 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Pyr"),
262 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Prism"),
265 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_NodalPrism"),
268 PhysDeriv_StdMat::create,
"PhysDeriv_StdMat_Hex"),
271 PhysDeriv_StdMat::create,
"PhysDeriv_SumFac_Pyr")
293 boost::ignore_unused(wsp);
299 (*m_oper)(m_input, m_output);
303 (*m_oper)(input, m_output);
325 "Unknown coordinate dimension");
335 boost::ignore_unused(wsp);
340 (*m_oper)(m_input, m_output);
344 (*m_oper)(input, m_output);
350 int coll_phys_offset)
352 boost::ignore_unused(factors, coll_phys_offset);
353 ASSERTL0(
false,
"Not valid for this operator.");
357 std::shared_ptr<MatrixFree::PhysDeriv>
m_oper;
360 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
363 :
Operator(pCollExp, pGeomData, factors),
365 pCollExp[0]->GetStdExp()->GetTotPoints(),
366 pCollExp[0]->GetStdExp()->GetTotPoints(),
370 bool deformed{pGeomData->IsDeformed(pCollExp)};
371 const auto dim = pCollExp[0]->GetStdExp()->GetShapeDimension();
373 if(m_isPadded ==
false)
375 int nOut = pCollExp[0]->GetStdExp()->GetTotPoints();
382 else if (m_coordim == 3)
390 std::vector<LibUtilities::BasisSharedPtr> basis(dim);
391 for (
unsigned int i = 0; i < dim; ++i)
393 basis[i] = pCollExp[0]->GetBasis(i);
397 auto shapeType = pCollExp[0]->GetStdExp()->DetShapeType();
400 std::string op_string =
"PhysDeriv";
401 op_string += MatrixFree::GetOpstring(shapeType, deformed);
403 CreateInstance(op_string, basis, m_nElmtPad);
406 oper->SetDF(pGeomData->GetDerivFactorsInterLeave
407 (pCollExp,m_nElmtPad));
409 m_oper = std::dynamic_pointer_cast<MatrixFree::PhysDeriv>(oper);
410 ASSERTL0(m_oper,
"Failed to cast pointer.");
420 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Seg"),
423 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Tri"),
426 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Quad"),
429 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Hex"),
432 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Prism"),
435 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Pyr"),
438 PhysDeriv_MatrixFree::create,
"PhysDeriv_MatrixFree_Tet")
461 int nPhys = m_stdExp->GetTotPoints();
462 int ntot = m_numElmt*nPhys;
466 out[0] = output0; out[1] = output1; out[2] = output2;
468 for(
int i = 0; i < m_dim; ++i)
470 Diff[i] = wsp + i*ntot;
474 for (
int i = 0; i < m_numElmt; ++i)
476 m_stdExp->PhysDeriv(input + i*nPhys,
477 tmp0 = Diff[0] + i*nPhys,
478 tmp1 = Diff[1] + i*nPhys,
479 tmp2 = Diff[2] + i*nPhys);
485 for(
int i = 0; i < m_coordim; ++i)
487 Vmath::Vmul(ntot,m_derivFac[i*m_dim],1,Diff[0],1,out[i],1);
488 for(
int j = 1; j < m_dim; ++j)
500 for(
int e = 0; e < m_numElmt; ++e)
502 for(
int i = 0; i < m_coordim; ++i)
506 t = out[i] + e*m_nqe,1);
507 for(
int j = 1; j < m_dim; ++j)
510 Diff[j] + e*m_nqe, 1,
512 t = out[i] + e*m_nqe, 1);
524 int nPhys = m_stdExp->GetTotPoints();
525 int ntot = m_numElmt*nPhys;
529 for(
int i = 0; i < m_dim; ++i)
531 Diff[i] = wsp + i*ntot;
535 for (
int i = 0; i < m_numElmt; ++i)
537 m_stdExp->PhysDeriv(input + i*nPhys,
538 tmp0 = Diff[0] + i*nPhys,
539 tmp1 = Diff[1] + i*nPhys,
540 tmp2 = Diff[2] + i*nPhys);
546 for(
int j = 0; j < m_dim; ++j)
557 for(
int e = 0; e < m_numElmt; ++e)
559 for(
int j = 0; j < m_dim; ++j)
562 Diff[j] + e*m_nqe, 1,
564 t = output + e*m_nqe, 1);
571 int coll_phys_offset)
573 boost::ignore_unused(factors, coll_phys_offset);
574 ASSERTL0(
false,
"Not valid for this operator.");
584 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
587 :
Operator(pCollExp, pGeomData, factors)
591 m_dim = PtsKey.size();
592 m_coordim = pCollExp[0]->GetCoordim();
594 for(
int i = 0; i < m_dim; ++i)
596 nqtot *= PtsKey[i].GetNumPoints();
598 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
599 m_wspSize = 3*nqtot*m_numElmt;
608 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Seg"),
611 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Tri"),
614 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_NodalTri"),
617 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Quad"),
620 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Tet"),
623 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_NodalTet"),
626 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Pyr"),
629 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Prism"),
632 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_NodalPrism"),
635 PhysDeriv_IterPerExp::create,
"PhysDeriv_IterPerExp_Hex")
658 boost::ignore_unused(wsp);
660 const int nPhys = m_expList[0]->GetTotPoints();
664 switch (m_expList[0]->GetShapeDimension())
668 for (
int i = 0; i < m_numElmt; ++i)
670 m_expList[i]->PhysDeriv(input + i*nPhys,
671 tmp0 = output0 + i*nPhys);
677 for (
int i = 0; i < m_numElmt; ++i)
679 m_expList[i]->PhysDeriv(input + i*nPhys,
680 tmp0 = output0 + i*nPhys,
681 tmp1 = output1 + i*nPhys);
687 for (
int i = 0; i < m_numElmt; ++i)
689 m_expList[i]->PhysDeriv(input + i*nPhys,
690 tmp0 = output0 + i*nPhys,
691 tmp1 = output1 + i*nPhys,
692 tmp2 = output2 + i*nPhys);
697 ASSERTL0(
false,
"Unknown dimension.");
706 boost::ignore_unused(wsp);
708 const int nPhys = m_expList[0]->GetTotPoints();
712 for (
int i = 0; i < m_numElmt; ++i)
714 m_expList[i]->PhysDeriv(dir, input + i*nPhys,
715 tmp = output + i*nPhys);
720 int coll_phys_offset)
722 boost::ignore_unused(factors, coll_phys_offset);
723 ASSERTL0(
false,
"Not valid for this operator.");
731 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
734 :
Operator(pCollExp, pGeomData, factors)
736 m_expList = pCollExp;
745 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Seg"),
748 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Tri"),
751 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_NodalTri"),
754 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Quad"),
757 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Tet"),
760 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_NodalTet"),
763 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Pyr"),
766 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Prism"),
769 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_NodalPrism"),
772 PhysDeriv_NoCollection::create,
"PhysDeriv_NoCollection_Hex")
796 const int nqcol = m_nquad0*m_numElmt;
799 "Incorrect workspace size");
801 "Incorrect input size");
806 m_nquad0, 1.0, m_Deriv0, m_nquad0,
807 input.get(), m_nquad0, 0.0,
808 diff0.get(), m_nquad0);
812 Vmath::Vmul (nqcol, m_derivFac[0], 1, diff0, 1, output0, 1);
816 Vmath::Vmul (nqcol, m_derivFac[1], 1, diff0, 1, output1, 1);
818 else if (m_coordim == 3)
820 Vmath::Vmul (nqcol, m_derivFac[1], 1, diff0, 1, output1, 1);
821 Vmath::Vmul (nqcol, m_derivFac[2], 1, diff0, 1, output2, 1);
827 for(
int e = 0; e < m_numElmt; ++e)
829 Vmath::Smul (m_nqe, m_derivFac[0][e], diff0 + e*m_nqe, 1,
830 t = output0 + e*m_nqe, 1);
835 for(
int e = 0; e < m_numElmt; ++e)
837 Vmath::Smul (m_nqe, m_derivFac[1][e], diff0 + e*m_nqe, 1,
838 t = output1 + e*m_nqe, 1);
841 else if (m_coordim == 3)
843 for(
int e = 0; e < m_numElmt; ++e)
845 Vmath::Smul (m_nqe, m_derivFac[1][e], diff0 + e*m_nqe, 1,
846 t = output1 + e*m_nqe, 1);
847 Vmath::Smul (m_nqe, m_derivFac[2][e], diff0 + e*m_nqe, 1,
848 t = output2 + e*m_nqe, 1);}
859 const int nqcol = m_nquad0*m_numElmt;
862 "Incorrect workspace size");
864 "Incorrect input size");
869 m_nquad0, 1.0, m_Deriv0, m_nquad0,
870 input.get(), m_nquad0, 0.0,
871 diff0.get(), m_nquad0);
875 Vmath::Vmul(nqcol, m_derivFac[dir], 1, diff0, 1, output, 1);
880 for(
int e = 0; e < m_numElmt; ++e)
882 Vmath::Smul (m_nqe, m_derivFac[0][e], diff0 + e*m_nqe, 1,
883 t = output + e*m_nqe, 1);
889 int coll_phys_offset)
891 boost::ignore_unused(factors, coll_phys_offset);
892 ASSERTL0(
false,
"Not valid for this operator.");
903 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
906 :
Operator(pCollExp, pGeomData, factors),
907 m_nquad0 (m_stdExp->GetNumPoints(0))
910 m_coordim = pCollExp[0]->GetCoordim();
912 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
914 m_Deriv0 = &((m_stdExp->GetBasis(0)->GetD())->GetPtr())[0];
915 m_wspSize = m_nquad0*m_numElmt;
922 RegisterCreatorFunction(
924 PhysDeriv_SumFac_Seg::create,
"PhysDeriv_SumFac_Seg");
948 const int nqtot = m_nquad0 * m_nquad1;
949 const int nqcol = nqtot*m_numElmt;
952 "Incorrect workspace size");
954 "Incorrect input size");
959 Blas::Dgemm(
'N',
'N', m_nquad0, m_nquad1*m_numElmt,
960 m_nquad0, 1.0, m_Deriv0, m_nquad0,
961 input.get(), m_nquad0, 0.0,
962 diff0.get(), m_nquad0);
965 for (
int i = 0; i < m_numElmt; ++i, cnt += nqtot)
967 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
968 input.get() + cnt, m_nquad0,
969 m_Deriv1, m_nquad1, 0.0,
970 diff1.get() + cnt, m_nquad0);
975 Vmath::Vmul (nqcol, m_derivFac[0], 1, diff0, 1, output0, 1);
976 Vmath::Vvtvp (nqcol, m_derivFac[1], 1, diff1, 1, output0, 1,
978 Vmath::Vmul (nqcol, m_derivFac[2], 1, diff0, 1, output1, 1);
979 Vmath::Vvtvp (nqcol, m_derivFac[3], 1, diff1, 1, output1, 1,
984 Vmath::Vmul (nqcol, m_derivFac[4], 1, diff0, 1, output2, 1);
985 Vmath::Vvtvp (nqcol, m_derivFac[5], 1, diff1, 1, output2, 1,
992 for(
int e = 0; e < m_numElmt; ++e)
994 Vmath::Smul (m_nqe, m_derivFac[0][e], diff0 + e*m_nqe, 1,
995 t = output0 + e*m_nqe, 1);
996 Vmath::Svtvp (m_nqe, m_derivFac[1][e], diff1 + e*m_nqe, 1,
997 output0 + e*m_nqe, 1, t = output0 + e*m_nqe, 1);
999 Vmath::Smul (m_nqe, m_derivFac[2][e], diff0 + e*m_nqe, 1,
1000 t = output1 + e*m_nqe, 1);
1001 Vmath::Svtvp (m_nqe, m_derivFac[3][e], diff1 + e*m_nqe, 1,
1002 output1 + e*m_nqe, 1, t = output1 + e*m_nqe, 1);
1007 for(
int e = 0; e < m_numElmt; ++e)
1009 Vmath::Smul (m_nqe, m_derivFac[4][e], diff0 + e*m_nqe, 1,
1010 t = output2 + e*m_nqe, 1);
1011 Vmath::Svtvp (m_nqe, m_derivFac[5][e], diff1 + e*m_nqe, 1,
1012 output2 + e*m_nqe, 1, t = output2 + e*m_nqe, 1);
1023 const int nqtot = m_nquad0 * m_nquad1;
1024 const int nqcol = nqtot*m_numElmt;
1027 "Incorrect workspace size");
1029 "Incorrect input size");
1034 Blas::Dgemm(
'N',
'N', m_nquad0, m_nquad1*m_numElmt,
1035 m_nquad0, 1.0, m_Deriv0, m_nquad0,
1036 input.get(), m_nquad0, 0.0,
1037 diff0.get(), m_nquad0);
1040 for (
int i = 0; i < m_numElmt; ++i, cnt += nqtot)
1042 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
1043 input.get() + cnt, m_nquad0,
1044 m_Deriv1, m_nquad1, 0.0,
1045 diff1.get() + cnt, m_nquad0);
1050 Vmath::Vmul (nqcol, m_derivFac[2*dir] , 1, diff0, 1, output, 1);
1051 Vmath::Vvtvp (nqcol, m_derivFac[2*dir+1], 1, diff1, 1, output, 1,
1057 for(
int e = 0; e < m_numElmt; ++e)
1059 Vmath::Smul (m_nqe, m_derivFac[2*dir][e], diff0 + e*m_nqe, 1,
1060 t = output + e*m_nqe, 1);
1061 Vmath::Svtvp (m_nqe, m_derivFac[2*dir+1][e], diff1 + e*m_nqe, 1,
1062 output + e*m_nqe, 1, t = output + e*m_nqe, 1);
1068 int coll_phys_offset)
1070 boost::ignore_unused(factors, coll_phys_offset);
1071 ASSERTL0(
false,
"Not valid for this operator.");
1084 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1087 :
Operator(pCollExp, pGeomData, factors),
1088 m_nquad0 (m_stdExp->GetNumPoints(0)),
1089 m_nquad1 (m_stdExp->GetNumPoints(1))
1092 m_coordim = pCollExp[0]->GetCoordim();
1094 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1096 m_Deriv0 = &((m_stdExp->GetBasis(0)->GetD())->GetPtr())[0];
1097 m_Deriv1 = &((m_stdExp->GetBasis(1)->GetD())->GetPtr())[0];
1098 m_wspSize = 2 * m_nquad0*m_nquad1*m_numElmt;
1105 RegisterCreatorFunction(
1107 PhysDeriv_SumFac_Quad::create,
"PhysDeriv_SumFac_Quad");
1130 const int nqtot = m_nquad0 * m_nquad1;
1131 const int nqcol = nqtot*m_numElmt;
1134 "Incorrect workspace size");
1136 "Incorrect input size");
1142 Blas::Dgemm(
'N',
'N', m_nquad0, m_nquad1*m_numElmt,
1143 m_nquad0, 1.0, m_Deriv0, m_nquad0,
1144 input.get(), m_nquad0, 0.0,
1145 diff0.get(), m_nquad0);
1148 for (
int i = 0; i < m_numElmt; ++i, cnt += nqtot)
1154 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
1155 input.get() + cnt, m_nquad0,
1156 m_Deriv1, m_nquad1, 0.0,
1157 diff1.get() + cnt, m_nquad0);
1161 diff1.get()+cnt,1,diff1.get()+cnt,1);
1166 Vmath::Vmul (nqcol, m_derivFac[0], 1, diff0, 1, output0, 1);
1167 Vmath::Vvtvp (nqcol, m_derivFac[1], 1, diff1, 1, output0, 1,
1169 Vmath::Vmul (nqcol, m_derivFac[2], 1, diff0, 1, output1, 1);
1170 Vmath::Vvtvp (nqcol, m_derivFac[3], 1, diff1, 1, output1, 1,
1175 Vmath::Vmul (nqcol, m_derivFac[4], 1, diff0, 1, output2, 1);
1176 Vmath::Vvtvp (nqcol, m_derivFac[5], 1, diff1, 1, output2, 1,
1183 for(
int e = 0; e < m_numElmt; ++e)
1185 Vmath::Smul (m_nqe, m_derivFac[0][e], diff0 + e*m_nqe, 1,
1186 t = output0 + e*m_nqe, 1);
1187 Vmath::Svtvp (m_nqe, m_derivFac[1][e], diff1 + e*m_nqe, 1,
1188 output0 + e*m_nqe, 1, t = output0 + e*m_nqe, 1);
1190 Vmath::Smul (m_nqe, m_derivFac[2][e], diff0 + e*m_nqe, 1,
1191 t = output1 + e*m_nqe, 1);
1192 Vmath::Svtvp (m_nqe, m_derivFac[3][e], diff1 + e*m_nqe, 1,
1193 output1 + e*m_nqe, 1, t = output1 + e*m_nqe, 1);
1198 for(
int e = 0; e < m_numElmt; ++e)
1200 Vmath::Smul (m_nqe, m_derivFac[4][e], diff0 + e*m_nqe, 1,
1201 t = output2 + e*m_nqe, 1);
1202 Vmath::Svtvp (m_nqe, m_derivFac[5][e], diff1 + e*m_nqe, 1,
1203 output2 + e*m_nqe, 1, t = output2 + e*m_nqe, 1);
1214 const int nqtot = m_nquad0 * m_nquad1;
1215 const int nqcol = nqtot*m_numElmt;
1218 "Incorrect workspace size");
1220 "Incorrect input size");
1226 Blas::Dgemm(
'N',
'N', m_nquad0, m_nquad1*m_numElmt,
1227 m_nquad0, 1.0, m_Deriv0, m_nquad0,
1228 input.get(), m_nquad0, 0.0,
1229 diff0.get(), m_nquad0);
1232 for (
int i = 0; i < m_numElmt; ++i, cnt += nqtot)
1238 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1, m_nquad1, 1.0,
1239 input.get() + cnt, m_nquad0,
1240 m_Deriv1, m_nquad1, 0.0,
1241 diff1.get() + cnt, m_nquad0);
1245 diff1.get()+cnt,1,diff1.get()+cnt,1);
1250 Vmath::Vmul (nqcol, m_derivFac[2*dir] , 1, diff0, 1, output, 1);
1251 Vmath::Vvtvp (nqcol, m_derivFac[2*dir+1], 1, diff1, 1, output, 1,
1257 for(
int e = 0; e < m_numElmt; ++e)
1259 Vmath::Smul (m_nqe, m_derivFac[2*dir][e], diff0 + e*m_nqe, 1,
1260 t = output + e*m_nqe, 1);
1261 Vmath::Svtvp (m_nqe, m_derivFac[2*dir+1][e], diff1 + e*m_nqe, 1,
1262 output + e*m_nqe, 1, t = output + e*m_nqe, 1);
1268 int coll_phys_offset)
1270 boost::ignore_unused(factors, coll_phys_offset);
1271 ASSERTL0(
false,
"Not valid for this operator.");
1286 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1289 :
Operator(pCollExp, pGeomData, factors),
1290 m_nquad0 (m_stdExp->GetNumPoints(0)),
1291 m_nquad1 (m_stdExp->GetNumPoints(1))
1294 m_coordim = pCollExp[0]->GetCoordim();
1296 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1299 = m_stdExp->GetBasis(0)->GetZ();
1301 = m_stdExp->GetBasis(1)->GetZ();
1304 for (
int i = 0; i < m_nquad0; ++i)
1306 for(
int j = 0; j < m_nquad1; ++j)
1308 m_fac0[i+j*m_nquad0] = 0.5*(1+z0[i]);
1314 for (
int i = 0; i < m_nquad0; ++i)
1316 for(
int j = 0; j < m_nquad1; ++j)
1318 m_fac1[i+j*m_nquad0] = 2.0/(1-z1[j]);
1323 m_Deriv0 = &((m_stdExp->GetBasis(0)->GetD())->GetPtr())[0];
1324 m_Deriv1 = &((m_stdExp->GetBasis(1)->GetD())->GetPtr())[0];
1325 m_wspSize = 2 * m_nquad0*m_nquad1*m_numElmt;
1334 PhysDeriv_SumFac_Tri::create,
"PhysDeriv_SumFac_Tri"),
1337 PhysDeriv_SumFac_Tri::create,
"PhysDeriv_SumFac_NodalTri")
1361 int nPhys = m_stdExp->GetTotPoints();
1362 int ntot = m_numElmt*nPhys;
1366 out[0] = output0; out[1] = output1; out[2] = output2;
1368 for(
int i = 0; i < 3; ++i)
1370 Diff[i] = wsp + i*ntot;
1373 Blas::Dgemm(
'N',
'N', m_nquad0,m_nquad1*m_nquad2*m_numElmt,
1374 m_nquad0,1.0, m_Deriv0,m_nquad0,&input[0],
1375 m_nquad0,0.0,&Diff[0][0],m_nquad0);
1377 for(
int i = 0; i < m_numElmt; ++i)
1379 for (
int j = 0; j < m_nquad2; ++j)
1381 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1, m_nquad1,
1382 1.0, &input[i*nPhys+j*m_nquad0*m_nquad1],
1383 m_nquad0, m_Deriv1, m_nquad1, 0.0,
1384 &Diff[1][i*nPhys+j*m_nquad0*m_nquad1],
1388 Blas::Dgemm(
'N',
'T',m_nquad0*m_nquad1,m_nquad2,m_nquad2,
1389 1.0, &input[i*nPhys],m_nquad0*m_nquad1,
1390 m_Deriv2,m_nquad2, 0.0,&Diff[2][i*nPhys],
1397 for(
int i = 0; i < m_coordim; ++i)
1399 Vmath::Vmul(ntot,m_derivFac[i*3],1,Diff[0],1,out[i],1);
1400 for(
int j = 1; j < 3; ++j)
1412 for(
int e = 0; e < m_numElmt; ++e)
1414 for(
int i = 0; i < m_coordim; ++i)
1418 Diff[0] + e*m_nqe, 1,
1419 t = out[i] + e*m_nqe,1);
1421 for(
int j = 1; j < 3; ++j)
1424 Diff[j] + e*m_nqe, 1,
1425 out[i] + e*m_nqe, 1,
1426 t = out[i] + e*m_nqe, 1);
1438 int nPhys = m_stdExp->GetTotPoints();
1439 int ntot = m_numElmt*nPhys;
1443 for(
int i = 0; i < 3; ++i)
1445 Diff[i] = wsp + i*ntot;
1448 Blas::Dgemm(
'N',
'N', m_nquad0,m_nquad1*m_nquad2*m_numElmt,
1449 m_nquad0,1.0, m_Deriv0,m_nquad0,&input[0],
1450 m_nquad0,0.0,&Diff[0][0],m_nquad0);
1452 for(
int i = 0; i < m_numElmt; ++i)
1454 for (
int j = 0; j < m_nquad2; ++j)
1456 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1, m_nquad1,
1457 1.0, &input[i*nPhys+j*m_nquad0*m_nquad1],
1458 m_nquad0, m_Deriv1, m_nquad1, 0.0,
1459 &Diff[1][i*nPhys+j*m_nquad0*m_nquad1],
1463 Blas::Dgemm(
'N',
'T',m_nquad0*m_nquad1,m_nquad2,m_nquad2,
1464 1.0, &input[i*nPhys],m_nquad0*m_nquad1,
1465 m_Deriv2,m_nquad2, 0.0,&Diff[2][i*nPhys],
1473 Vmath::Vmul(ntot,m_derivFac[dir*3],1,Diff[0],1,output,1);
1474 for(
int j = 1; j < 3; ++j)
1485 for(
int e = 0; e < m_numElmt; ++e)
1488 Diff[0] + e*m_nqe, 1,
1489 t = output + e*m_nqe,1);
1491 for(
int j = 1; j < 3; ++j)
1494 Diff[j] + e*m_nqe, 1,
1495 output + e*m_nqe, 1,
1496 t = output + e*m_nqe, 1);
1503 int coll_phys_offset)
1505 boost::ignore_unused(factors, coll_phys_offset);
1506 ASSERTL0(
false,
"Not valid for this operator.");
1521 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1524 :
Operator(pCollExp, pGeomData, factors),
1525 m_nquad0 (m_stdExp->GetNumPoints(0)),
1526 m_nquad1 (m_stdExp->GetNumPoints(1)),
1527 m_nquad2 (m_stdExp->GetNumPoints(2))
1531 m_coordim = pCollExp[0]->GetCoordim();
1533 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1535 m_Deriv0 = &((m_stdExp->GetBasis(0)->GetD())->GetPtr())[0];
1536 m_Deriv1 = &((m_stdExp->GetBasis(1)->GetD())->GetPtr())[0];
1537 m_Deriv2 = &((m_stdExp->GetBasis(2)->GetD())->GetPtr())[0];
1539 m_wspSize = 3*m_nquad0*m_nquad1*m_nquad2*m_numElmt;
1548 PhysDeriv_SumFac_Hex::create,
"PhysDeriv_SumFac_Hex")
1572 int nPhys = m_stdExp->GetTotPoints();
1573 int ntot = m_numElmt*nPhys;
1577 out[0] = output0; out[1] = output1; out[2] = output2;
1579 for(
int i = 0; i < 3; ++i)
1581 Diff[i] = wsp + i*ntot;
1585 Blas::Dgemm(
'N',
'N', m_nquad0,m_nquad1*m_nquad2*m_numElmt,
1586 m_nquad0,1.0, m_Deriv0,m_nquad0,&input[0],
1587 m_nquad0,0.0,&Diff[0][0],m_nquad0);
1590 for(
int i = 0; i < m_numElmt; ++i)
1592 Blas::Dgemm(
'N',
'T',m_nquad0*m_nquad1,m_nquad2,m_nquad2,
1593 1.0, &input[i*nPhys],m_nquad0*m_nquad1,
1594 m_Deriv2,m_nquad2, 0.0,&Diff[2][i*nPhys],
1598 for(
int i = 0; i < m_numElmt; ++i)
1602 for (
int j = 0; j < m_nquad2; ++j)
1604 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1, m_nquad1,
1605 1.0, &input[i*nPhys+j*m_nquad0*m_nquad1],
1606 m_nquad0, m_Deriv1, m_nquad1, 0.0,
1607 &Diff[1][i*nPhys+j*m_nquad0*m_nquad1],
1613 Diff[1].get() + i*nPhys, 1,
1614 Diff[2].get() + i*nPhys, 1,
1615 Diff[2].get() + i*nPhys, 1);
1619 Diff[1].get() + i*nPhys, 1,
1620 Diff[1].get() + i*nPhys, 1);
1624 Diff[0].get() + i*nPhys, 1,
1625 Diff[1].get() + i*nPhys, 1,
1626 Diff[1].get() + i*nPhys, 1);
1630 Diff[0].get() + i*nPhys, 1,
1631 Diff[2].get() + i*nPhys, 1,
1632 Diff[2].get() + i*nPhys, 1);
1636 Diff[0].get() + i*nPhys, 1,
1637 Diff[0].get() + i*nPhys, 1);
1644 for(
int i = 0; i < m_coordim; ++i)
1646 Vmath::Vmul(ntot,m_derivFac[i*3],1,Diff[0],1,out[i],1);
1647 for(
int j = 1; j < 3; ++j)
1659 for(
int e = 0; e < m_numElmt; ++e)
1661 for(
int i = 0; i < m_coordim; ++i)
1664 Diff[0] + e*m_nqe, 1,
1665 t = out[i] + e*m_nqe,1);
1667 for(
int j = 1; j < 3; ++j)
1670 Diff[j] + e*m_nqe, 1,
1671 out[i] + e*m_nqe, 1,
1672 t = out[i] + e*m_nqe, 1);
1684 int nPhys = m_stdExp->GetTotPoints();
1685 int ntot = m_numElmt*nPhys;
1689 for(
int i = 0; i < 3; ++i)
1691 Diff[i] = wsp + i*ntot;
1695 Blas::Dgemm(
'N',
'N', m_nquad0,m_nquad1*m_nquad2*m_numElmt,
1696 m_nquad0,1.0, m_Deriv0,m_nquad0,&input[0],
1697 m_nquad0,0.0,&Diff[0][0],m_nquad0);
1700 for(
int i = 0; i < m_numElmt; ++i)
1702 Blas::Dgemm(
'N',
'T',m_nquad0*m_nquad1,m_nquad2,m_nquad2,
1703 1.0, &input[i*nPhys],m_nquad0*m_nquad1,
1704 m_Deriv2,m_nquad2, 0.0,&Diff[2][i*nPhys],
1708 for(
int i = 0; i < m_numElmt; ++i)
1712 for (
int j = 0; j < m_nquad2; ++j)
1714 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1, m_nquad1,
1715 1.0, &input[i*nPhys+j*m_nquad0*m_nquad1],
1716 m_nquad0, m_Deriv1, m_nquad1, 0.0,
1717 &Diff[1][i*nPhys+j*m_nquad0*m_nquad1],
1723 Diff[1].get() + i*nPhys, 1,
1724 Diff[2].get() + i*nPhys, 1,
1725 Diff[2].get() + i*nPhys, 1);
1729 Diff[1].get() + i*nPhys, 1,
1730 Diff[1].get() + i*nPhys, 1);
1734 Diff[0].get() + i*nPhys, 1,
1735 Diff[1].get() + i*nPhys, 1,
1736 Diff[1].get() + i*nPhys, 1);
1740 Diff[0].get() + i*nPhys, 1,
1741 Diff[2].get() + i*nPhys, 1,
1742 Diff[2].get() + i*nPhys, 1);
1746 Diff[0].get() + i*nPhys, 1,
1747 Diff[0].get() + i*nPhys, 1);
1755 Vmath::Vmul(ntot,m_derivFac[dir*3],1,Diff[0],1,output,1);
1756 for(
int j = 1; j < 3; ++j)
1767 for(
int e = 0; e < m_numElmt; ++e)
1770 Diff[0] + e*m_nqe, 1,
1771 t = output + e*m_nqe,1);
1773 for(
int j = 1; j < 3; ++j)
1776 Diff[j] + e*m_nqe, 1,
1777 output + e*m_nqe, 1,
1778 t = output + e*m_nqe, 1);
1785 int coll_phys_offset)
1787 boost::ignore_unused(factors, coll_phys_offset);
1788 ASSERTL0(
false,
"Not valid for this operator.");
1807 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1810 :
Operator(pCollExp, pGeomData, factors),
1811 m_nquad0 (m_stdExp->GetNumPoints(0)),
1812 m_nquad1 (m_stdExp->GetNumPoints(1)),
1813 m_nquad2 (m_stdExp->GetNumPoints(2))
1817 m_coordim = pCollExp[0]->GetCoordim();
1819 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
1821 m_Deriv0 = &((m_stdExp->GetBasis(0)->GetD())->GetPtr())[0];
1822 m_Deriv1 = &((m_stdExp->GetBasis(1)->GetD())->GetPtr())[0];
1823 m_Deriv2 = &((m_stdExp->GetBasis(2)->GetD())->GetPtr())[0];
1825 m_wspSize = 3*m_nquad0*m_nquad1*m_nquad2*m_numElmt;
1828 = m_stdExp->GetBasis(0)->GetZ();
1830 = m_stdExp->GetBasis(1)->GetZ();
1832 = m_stdExp->GetBasis(2)->GetZ();
1839 for (
int i = 0; i < m_nquad0; ++i)
1841 for(
int j = 0; j < m_nquad1; ++j)
1843 for(
int k = 0; k < m_nquad2; ++k)
1846 m_fac0[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1847 = 4.0/((1-z1[j])*(1-z2[k]));
1848 m_fac1[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1849 = 2.0*(1+z0[i])/((1-z1[j])*(1-z2[k]));
1850 m_fac2[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1852 m_fac3[i + j*m_nquad0 + k*m_nquad0*m_nquad1]
1853 = (1+z1[j])/(1-z2[k]);
1866 PhysDeriv_SumFac_Tet::create,
"PhysDeriv_SumFac_Tet")
1890 int nPhys = m_stdExp->GetTotPoints();
1891 int ntot = m_numElmt*nPhys;
1895 out[0] = output0; out[1] = output1; out[2] = output2;
1897 for(
int i = 0; i < 3; ++i)
1899 Diff[i] = wsp + i*ntot;
1903 Blas::Dgemm(
'N',
'N', m_nquad0,m_nquad1*m_nquad2*m_numElmt,
1904 m_nquad0,1.0, m_Deriv0,m_nquad0,&input[0],
1905 m_nquad0,0.0,&Diff[0][0],m_nquad0);
1908 for(
int i = 0; i < m_numElmt; ++i)
1912 for (
int j = 0; j < m_nquad2; ++j)
1914 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1, m_nquad1,
1915 1.0, &input[i*nPhys+j*m_nquad0*m_nquad1],
1916 m_nquad0, m_Deriv1, m_nquad1, 0.0,
1917 &Diff[1][i*nPhys+j*m_nquad0*m_nquad1],
1922 Blas::Dgemm(
'N',
'T',m_nquad0*m_nquad1,m_nquad2,m_nquad2,
1923 1.0, &input[i*nPhys],m_nquad0*m_nquad1,
1924 m_Deriv2,m_nquad2, 0.0,&Diff[2][i*nPhys],
1928 Vmath::Vmul(nPhys,&m_fac0[0],1,Diff[0].get()+cnt,1,
1929 Diff[0].get()+cnt,1);
1933 Diff[2].get()+cnt,1,Diff[2].get()+cnt,1);
1940 for(
int i = 0; i < m_coordim; ++i)
1942 Vmath::Vmul(ntot,m_derivFac[i*3],1,Diff[0],1,out[i],1);
1943 for(
int j = 1; j < 3; ++j)
1955 for(
int e = 0; e < m_numElmt; ++e)
1957 for(
int i = 0; i < m_coordim; ++i)
1960 Diff[0] + e*m_nqe, 1,
1961 t = out[i] + e*m_nqe,1);
1963 for(
int j = 1; j < 3; ++j)
1966 Diff[j] + e*m_nqe, 1,
1967 out[i] + e*m_nqe, 1,
1968 t = out[i] + e*m_nqe, 1);
1980 int nPhys = m_stdExp->GetTotPoints();
1981 int ntot = m_numElmt*nPhys;
1985 for(
int i = 0; i < 3; ++i)
1987 Diff[i] = wsp + i*ntot;
1991 Blas::Dgemm(
'N',
'N', m_nquad0,m_nquad1*m_nquad2*m_numElmt,
1992 m_nquad0,1.0, m_Deriv0,m_nquad0,&input[0],
1993 m_nquad0,0.0,&Diff[0][0],m_nquad0);
1996 for(
int i = 0; i < m_numElmt; ++i)
2000 for (
int j = 0; j < m_nquad2; ++j)
2002 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1, m_nquad1,
2003 1.0, &input[i*nPhys+j*m_nquad0*m_nquad1],
2004 m_nquad0, m_Deriv1, m_nquad1, 0.0,
2005 &Diff[1][i*nPhys+j*m_nquad0*m_nquad1],
2010 Blas::Dgemm(
'N',
'T',m_nquad0*m_nquad1,m_nquad2,m_nquad2,
2011 1.0, &input[i*nPhys],m_nquad0*m_nquad1,
2012 m_Deriv2,m_nquad2, 0.0,&Diff[2][i*nPhys],
2016 Vmath::Vmul(nPhys,&m_fac0[0],1,Diff[0].get()+cnt,1,
2017 Diff[0].get()+cnt,1);
2021 Diff[2].get()+cnt,1,Diff[2].get()+cnt,1);
2029 Vmath::Vmul(ntot,m_derivFac[dir*3],1,Diff[0],1,output,1);
2030 for(
int j = 1; j < 3; ++j)
2041 for(
int e = 0; e < m_numElmt; ++e)
2044 Diff[0] + e*m_nqe, 1,
2045 t = output + e*m_nqe,1);
2047 for(
int j = 1; j < 3; ++j)
2050 Diff[j] + e*m_nqe, 1,
2051 output + e*m_nqe, 1,
2052 t = output + e*m_nqe, 1);
2059 int coll_phys_offset)
2061 boost::ignore_unused(factors, coll_phys_offset);
2062 ASSERTL0(
false,
"Not valid for this operator.");
2079 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
2082 :
Operator(pCollExp, pGeomData, factors),
2083 m_nquad0 (m_stdExp->GetNumPoints(0)),
2084 m_nquad1 (m_stdExp->GetNumPoints(1)),
2085 m_nquad2 (m_stdExp->GetNumPoints(2))
2089 m_coordim = pCollExp[0]->GetCoordim();
2091 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
2094 = m_stdExp->GetBasis(0)->GetZ();
2096 = m_stdExp->GetBasis(2)->GetZ();
2099 for (
int i = 0; i < m_nquad0; ++i)
2101 for(
int j = 0; j < m_nquad1; ++j)
2103 for(
int k = 0; k < m_nquad2; ++k)
2105 m_fac0[i+j*m_nquad0 + k*m_nquad0*m_nquad1] =
2107 m_fac1[i+j*m_nquad0 + k*m_nquad0*m_nquad1] =
2115 m_Deriv0 = &((m_stdExp->GetBasis(0)->GetD())->GetPtr())[0];
2116 m_Deriv1 = &((m_stdExp->GetBasis(1)->GetD())->GetPtr())[0];
2117 m_Deriv2 = &((m_stdExp->GetBasis(2)->GetD())->GetPtr())[0];
2119 m_wspSize = 3*m_nquad0*m_nquad1*m_nquad2*m_numElmt;
2124 OperatorKey PhysDeriv_SumFac_Prism::m_typeArr[] = {
2127 PhysDeriv_SumFac_Prism::create,
"PhysDeriv_SumFac_Prism")
2151 int nPhys = m_stdExp->GetTotPoints();
2152 int ntot = m_numElmt*nPhys;
2156 out[0] = output0; out[1] = output1; out[2] = output2;
2158 for(
int i = 0; i < 3; ++i)
2160 Diff[i] = wsp + i*ntot;
2164 Blas::Dgemm(
'N',
'N', m_nquad0,m_nquad1*m_nquad2*m_numElmt,
2165 m_nquad0,1.0, m_Deriv0,m_nquad0,&input[0],
2166 m_nquad0,0.0,&Diff[0][0],m_nquad0);
2169 for(
int i = 0; i < m_numElmt; ++i)
2173 for (
int j = 0; j < m_nquad2; ++j)
2175 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1, m_nquad1,
2176 1.0, &input[i*nPhys+j*m_nquad0*m_nquad1],
2177 m_nquad0, m_Deriv1, m_nquad1, 0.0,
2178 &Diff[1][i*nPhys+j*m_nquad0*m_nquad1],
2183 Blas::Dgemm(
'N',
'T',m_nquad0*m_nquad1,m_nquad2,m_nquad2,
2184 1.0, &input[i*nPhys],m_nquad0*m_nquad1,
2185 m_Deriv2,m_nquad2, 0.0,&Diff[2][i*nPhys],
2189 Vmath::Vmul(nPhys,&m_fac0[0],1,Diff[0].get()+cnt,1,
2190 Diff[0].get()+cnt,1);
2193 Vmath::Vmul(nPhys,&m_fac0[0],1,Diff[1].get()+cnt,1,
2194 Diff[1].get()+cnt,1);
2198 Diff[2].get()+cnt,1,Diff[2].get()+cnt,1);
2202 Diff[2].get()+cnt,1,Diff[2].get()+cnt,1);
2209 for(
int i = 0; i < m_coordim; ++i)
2211 Vmath::Vmul(ntot,m_derivFac[i*3],1,Diff[0],1,out[i],1);
2212 for(
int j = 1; j < 3; ++j)
2224 for(
int e = 0; e < m_numElmt; ++e)
2226 for(
int i = 0; i < m_coordim; ++i)
2229 Diff[0] + e*m_nqe, 1,
2230 t = out[i] + e*m_nqe,1);
2232 for(
int j = 1; j < 3; ++j)
2235 Diff[j] + e*m_nqe, 1,
2236 out[i] + e*m_nqe, 1,
2237 t = out[i] + e*m_nqe, 1);
2249 int nPhys = m_stdExp->GetTotPoints();
2250 int ntot = m_numElmt*nPhys;
2254 for(
int i = 0; i < 3; ++i)
2256 Diff[i] = wsp + i*ntot;
2260 Blas::Dgemm(
'N',
'N', m_nquad0,m_nquad1*m_nquad2*m_numElmt,
2261 m_nquad0,1.0, m_Deriv0,m_nquad0,&input[0],
2262 m_nquad0,0.0,&Diff[0][0],m_nquad0);
2265 for(
int i = 0; i < m_numElmt; ++i)
2268 for (
int j = 0; j < m_nquad2; ++j)
2270 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1, m_nquad1,
2271 1.0, &input[i*nPhys+j*m_nquad0*m_nquad1],
2272 m_nquad0, m_Deriv1, m_nquad1, 0.0,
2273 &Diff[1][i*nPhys+j*m_nquad0*m_nquad1],
2278 Blas::Dgemm(
'N',
'T',m_nquad0*m_nquad1,m_nquad2,m_nquad2,
2279 1.0, &input[i*nPhys],m_nquad0*m_nquad1,
2280 m_Deriv2,m_nquad2, 0.0,&Diff[2][i*nPhys],
2284 Vmath::Vmul(nPhys,&m_fac0[0],1,Diff[0].get()+cnt,1,
2285 Diff[0].get()+cnt,1);
2288 Vmath::Vmul(nPhys,&m_fac0[0],1,Diff[1].get()+cnt,1,
2289 Diff[1].get()+cnt,1);
2293 Diff[2].get()+cnt,1,Diff[2].get()+cnt,1);
2296 Diff[2].get()+cnt,1,Diff[2].get()+cnt,1);
2304 Vmath::Vmul(ntot,m_derivFac[dir*3],1,Diff[0],1,output,1);
2305 for(
int j = 1; j < 3; ++j)
2316 for(
int e = 0; e < m_numElmt; ++e)
2319 Diff[0] + e*m_nqe, 1,
2320 t = output + e*m_nqe,1);
2322 for(
int j = 1; j < 3; ++j)
2325 Diff[j] + e*m_nqe, 1,
2326 output + e*m_nqe, 1,
2327 t = output + e*m_nqe, 1);
2334 int coll_phys_offset)
2336 boost::ignore_unused(factors, coll_phys_offset);
2337 ASSERTL0(
false,
"Not valid for this operator.");
2355 vector<StdRegions::StdExpansionSharedPtr> pCollExp,
2358 :
Operator(pCollExp, pGeomData, factors),
2359 m_nquad0 (m_stdExp->GetNumPoints(0)),
2360 m_nquad1 (m_stdExp->GetNumPoints(1)),
2361 m_nquad2 (m_stdExp->GetNumPoints(2))
2365 m_coordim = pCollExp[0]->GetCoordim();
2367 m_derivFac = pGeomData->GetDerivFactors(pCollExp);
2370 = m_stdExp->GetBasis(0)->GetZ();
2372 = m_stdExp->GetBasis(1)->GetZ();
2374 = m_stdExp->GetBasis(2)->GetZ();
2379 int nq0_nq1 = m_nquad0*m_nquad1;
2380 for (
int i = 0; i < m_nquad0; ++i)
2382 for(
int j = 0; j < m_nquad1; ++j)
2384 int ifac = i+j*m_nquad0;
2385 for(
int k = 0; k < m_nquad2; ++k)
2387 m_fac0[ifac + k*nq0_nq1] =
2389 m_fac1[ifac + k*nq0_nq1] =
2391 m_fac2[ifac + k*nq0_nq1] =
2397 m_Deriv0 = &((m_stdExp->GetBasis(0)->GetD())->GetPtr())[0];
2398 m_Deriv1 = &((m_stdExp->GetBasis(1)->GetD())->GetPtr())[0];
2399 m_Deriv2 = &((m_stdExp->GetBasis(2)->GetD())->GetPtr())[0];
2401 m_wspSize = 3*m_nquad0*m_nquad1*m_nquad2*m_numElmt;
2409 PhysDeriv_SumFac_Pyr::create,
"PhysDeriv_SumFac_Pyr")
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
#define OPERATOR_CREATE(cname)
Base class for operators on a collection of elements.
Phys deriv operator using element-wise operation.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
PhysDeriv_IterPerExp(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output0, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
Array< TwoD, const NekDouble > m_derivFac
~PhysDeriv_IterPerExp() final
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
Phys deriv operator using matrix free operators.
~PhysDeriv_MatrixFree() final
PhysDeriv_MatrixFree(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
std::shared_ptr< MatrixFree::PhysDeriv > m_oper
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output0, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Phys deriv operator using original LocalRegions implementation.
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.
PhysDeriv_NoCollection(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
vector< StdRegions::StdExpansionSharedPtr > m_expList
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output0, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
~PhysDeriv_NoCollection() final
Phys deriv operator using standard matrix approach.
Array< TwoD, const NekDouble > m_derivFac
Array< OneD, DNekMatSharedPtr > m_derivMat
PhysDeriv_StdMat(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~PhysDeriv_StdMat() final
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output0, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Phys deriv operator using sum-factorisation (Hex)
PhysDeriv_SumFac_Hex(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.
~PhysDeriv_SumFac_Hex() final
Array< TwoD, const NekDouble > m_derivFac
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output0, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
Phys deriv operator using sum-factorisation (Prism)
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
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output0, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
PhysDeriv_SumFac_Prism(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~PhysDeriv_SumFac_Prism() final
Array< OneD, NekDouble > m_fac0
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
Phys deriv operator using sum-factorisation (Pyramid)
PhysDeriv_SumFac_Pyr(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~PhysDeriv_SumFac_Pyr() final
Array< OneD, NekDouble > m_fac1
Array< OneD, NekDouble > m_fac2
Array< TwoD, const NekDouble > m_derivFac
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output0, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
Array< OneD, NekDouble > m_fac0
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.
Phys deriv operator using sum-factorisation (Quad)
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
PhysDeriv_SumFac_Quad(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
~PhysDeriv_SumFac_Quad() final
Array< TwoD, const NekDouble > m_derivFac
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output0, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
Phys deriv operator using sum-factorisation (Segment)
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
PhysDeriv_SumFac_Seg(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< TwoD, const NekDouble > m_derivFac
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
~PhysDeriv_SumFac_Seg() final
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output0, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
Phys deriv operator using sum-factorisation (Tet)
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
~PhysDeriv_SumFac_Tet() final
Array< OneD, NekDouble > m_fac2
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output0, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
Array< OneD, NekDouble > m_fac1
PhysDeriv_SumFac_Tet(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, NekDouble > m_fac0
Array< TwoD, const NekDouble > m_derivFac
Array< OneD, NekDouble > m_fac3
Phys deriv operator using sum-factorisation (Tri)
PhysDeriv_SumFac_Tri(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output0, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
~PhysDeriv_SumFac_Tri() final
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Array< OneD, NekDouble > m_fac1
Array< TwoD, const NekDouble > m_derivFac
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
Array< OneD, NekDouble > m_fac0
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...
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.
std::vector< PointsKey > PointsKeyVector
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 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)