38 #include <MatrixFreeOps/Operator.hpp>
39 #include <boost/core/ignore_unused.hpp>
73 boost::ignore_unused(output1, output2, wsp);
75 m_mat->GetColumns(), 1.0, m_mat->GetRawPtr(),
76 m_mat->GetRows(), input.get(), m_stdExp->GetNcoeffs(),
77 0.0, output.get(), m_stdExp->GetTotPoints());
85 boost::ignore_unused(dir, input, output, wsp);
86 ASSERTL0(
false,
"Not valid for this operator.");
92 boost::ignore_unused(factors, coll_phys_offset);
93 ASSERTL0(
false,
"Not valid for this operator.");
103 :
Operator(pCollExp, pGeomData, factors)
106 m_stdExp->DetShapeType(), *m_stdExp);
107 m_mat = m_stdExp->GetStdMatrix(key);
115 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Seg"),
118 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Tri"),
121 BwdTrans_StdMat::create,
"BwdTrans_StdMat_NodalTri"),
124 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Quad"),
127 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Tet"),
130 BwdTrans_StdMat::create,
"BwdTrans_StdMat_NodalTet"),
133 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Pyr"),
136 "BwdTrans_StdMat_Prism"),
139 "BwdTrans_StdMat_NodalPrism"),
142 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Hex"),
145 BwdTrans_StdMat::create,
"BwdTrans_SumFac_Pyr")};
165 boost::ignore_unused(output1, output2, wsp);
172 (*m_oper)(m_input, m_output);
178 (*m_oper)(input, output0);
186 boost::ignore_unused(dir, input, output, wsp);
188 "BwdTrans_MatrixFree: Not valid for this operator.");
192 int coll_phys_offset)
194 boost::ignore_unused(factors, coll_phys_offset);
195 ASSERTL0(
false,
"Not valid for this operator.");
200 std::shared_ptr<MatrixFree::BwdTrans>
m_oper;
205 :
Operator(pCollExp, pGeomData, factors),
207 pCollExp[0]->GetStdExp()->GetTotPoints(),
211 const auto dim = pCollExp[0]->GetStdExp()->GetShapeDimension();
212 std::vector<LibUtilities::BasisSharedPtr> basis(dim);
213 for (
auto i = 0; i < dim; ++i)
215 basis[i] = pCollExp[0]->GetBasis(i);
219 auto shapeType = pCollExp[0]->GetStdExp()->DetShapeType();
222 std::string op_string =
"BwdTrans";
223 op_string += MatrixFree::GetOpstring(shapeType,
false);
225 op_string, basis, m_nElmtPad);
227 m_oper = std::dynamic_pointer_cast<MatrixFree::BwdTrans>(oper);
228 ASSERTL0(m_oper,
"Failed to cast pointer.");
236 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Seg"),
239 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Quad"),
242 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Tri"),
245 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Hex"),
248 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Prism"),
251 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Tet"),
254 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Pyr")
275 boost::ignore_unused(output1, output2, wsp);
277 const int nCoeffs = m_stdExp->GetNcoeffs();
278 const int nPhys = m_stdExp->GetTotPoints();
281 for (
int i = 0; i < m_numElmt; ++i)
283 m_stdExp->BwdTrans(input + i*nCoeffs, tmp = output + i*nPhys);
292 boost::ignore_unused(dir, input, output, wsp);
293 ASSERTL0(
false,
"Not valid for this operator.");
297 int coll_phys_offset)
299 boost::ignore_unused(factors, coll_phys_offset);
300 ASSERTL0(
false,
"Not valid for this operator.");
308 :
Operator(pCollExp, pGeomData, factors)
317 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Seg"),
320 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Tri"),
323 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_NodalTri"),
326 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Quad"),
329 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Tet"),
332 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_NodalTet"),
335 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Pyr"),
338 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Prism"),
341 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_NodalPrism"),
344 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Hex"),
365 boost::ignore_unused(output1, output2, wsp);
367 const int nCoeffs = m_expList[0]->GetNcoeffs();
368 const int nPhys = m_expList[0]->GetTotPoints();
371 for (
int i = 0; i < m_numElmt; ++i)
373 m_expList[i]->BwdTrans(input + i*nCoeffs,
374 tmp = output + i*nPhys);
383 boost::ignore_unused(dir, input, output, wsp);
384 ASSERTL0(
false,
"Not valid for this operator.");
388 int coll_phys_offset)
390 boost::ignore_unused(factors, coll_phys_offset);
391 ASSERTL0(
false,
"Not valid for this operator.");
401 :
Operator(pCollExp, pGeomData, factors)
403 m_expList = pCollExp;
411 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Seg"),
414 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Tri"),
417 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_NodalTri"),
420 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Quad"),
423 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Tet"),
426 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_NodalTet"),
429 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Pyr"),
432 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Prism"),
435 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_NodalPrism"),
438 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Hex"),
459 boost::ignore_unused(output1, output2, wsp);
462 Vmath::Vcopy(m_numElmt*m_nmodes0,input.get(),1,output.get(),1);
467 Blas::Dgemm(
'N',
'N', m_nquad0, m_numElmt, m_nmodes0,
468 1.0, m_base0.get(), m_nquad0,
469 &input[0], m_nmodes0, 0.0,
470 &output[0], m_nquad0);
479 boost::ignore_unused(dir, input, output, wsp);
480 ASSERTL0(
false,
"Not valid for this operator.");
484 int coll_phys_offset)
486 boost::ignore_unused(factors, coll_phys_offset);
487 ASSERTL0(
false,
"Not valid for this operator.");
501 :
Operator(pCollExp, pGeomData, factors), m_nquad0(m_stdExp->GetNumPoints(0)),
502 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
503 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
504 m_base0(m_stdExp->GetBasis(0)->GetBdata())
514 BwdTrans_SumFac_Seg::create,
"BwdTrans_SumFac_Seg");
534 boost::ignore_unused(output1, output2);
537 if (m_colldir0 && m_colldir1)
539 Vmath::Vcopy(m_numElmt * m_nmodes0 * m_nmodes1, input.get(), 1,
545 m_stdExp->GetBasis(1)->GetBdata();
547 for (i = 0; i < m_numElmt; ++i)
549 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1, m_nmodes1, 1.0,
550 &input[i * m_nquad0 * m_nmodes1], m_nquad0,
551 base1.get(), m_nquad1, 0.0,
552 &output[i * m_nquad0 * m_nquad1], m_nquad0);
557 Blas::Dgemm(
'N',
'N', m_nquad0, m_nmodes1 * m_numElmt, m_nmodes0,
558 1.0, m_base0.get(), m_nquad0, &input[0], m_nmodes0, 0.0,
559 &output[0], m_nquad0);
563 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
567 Blas::Dgemm(
'N',
'N', m_nquad0, m_nmodes1 * m_numElmt, m_nmodes0,
568 1.0, m_base0.get(), m_nquad0, &input[0], m_nmodes0, 0.0,
571 for (i = 0; i < m_numElmt; ++i)
573 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1, m_nmodes1, 1.0,
574 &wsp[i * m_nquad0 * m_nmodes1], m_nquad0,
575 m_base1.get(), m_nquad1, 0.0,
576 &output[i * m_nquad0 * m_nquad1], m_nquad0);
585 boost::ignore_unused(dir, input, output, wsp);
586 ASSERTL0(
false,
"Not valid for this operator.");
590 int coll_phys_offset)
592 boost::ignore_unused(factors, coll_phys_offset);
593 ASSERTL0(
false,
"Not valid for this operator.");
611 :
Operator(pCollExp, pGeomData, factors), m_nquad0(m_stdExp->GetNumPoints(0)),
612 m_nquad1(m_stdExp->GetNumPoints(1)),
613 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
614 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
615 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
616 m_colldir1(m_stdExp->GetBasis(1)->Collocation()),
617 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
618 m_base1(m_stdExp->GetBasis(1)->GetBdata())
620 m_wspSize = m_nquad0 * m_nmodes1 * m_numElmt;
628 BwdTrans_SumFac_Quad::create,
"BwdTrans_SumFac_Quad");
648 boost::ignore_unused(output1, output2);
650 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
652 int ncoeffs = m_stdExp->GetNcoeffs();
656 for (i = mode = 0; i < m_nmodes0; ++i)
658 Blas::Dgemm(
'N',
'N', m_nquad1, m_numElmt, m_nmodes1 - i, 1.0,
659 m_base1.get() + mode * m_nquad1, m_nquad1,
660 &input[0] + mode, ncoeffs, 0.0,
661 &wsp[i * m_nquad1 * m_numElmt], m_nquad1);
662 mode += m_nmodes1 - i;
668 for (i = 0; i < m_numElmt; ++i)
671 m_base1.get() + m_nquad1, 1,
672 &wsp[m_nquad1 * m_numElmt] + i * m_nquad1, 1);
676 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1 * m_numElmt, m_nmodes0, 1.0,
677 m_base0.get(), m_nquad0, &wsp[0], m_nquad1 * m_numElmt, 0.0,
678 &output[0], m_nquad0);
685 boost::ignore_unused(dir, input, output, wsp);
686 ASSERTL0(
false,
"Not valid for this operator.");
690 int coll_phys_offset)
692 boost::ignore_unused(factors, coll_phys_offset);
693 ASSERTL0(
false,
"Not valid for this operator.");
710 :
Operator(pCollExp, pGeomData, factors), m_nquad0(m_stdExp->GetNumPoints(0)),
711 m_nquad1(m_stdExp->GetNumPoints(1)),
712 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
713 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
714 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
715 m_base1(m_stdExp->GetBasis(1)->GetBdata())
717 m_wspSize = m_nquad0 * m_nmodes1 * m_numElmt;
720 m_sortTopVertex =
true;
724 m_sortTopVertex =
false;
733 BwdTrans_SumFac_Tri::create,
"BwdTrans_SumFac_Tri");
751 boost::ignore_unused(output1, output2);
753 if (m_colldir0 && m_colldir1 && m_colldir2)
755 Vmath::Vcopy(m_numElmt * m_nmodes0 * m_nmodes1 * m_nmodes2,
761 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
764 int totmodes = m_nmodes0 * m_nmodes1 * m_nmodes2;
767 wsp + m_nmodes0 * m_nmodes1 * m_nquad2 * m_numElmt;
770 for (
int n = 0; n < m_numElmt; ++n)
772 Blas::Dgemm(
'N',
'T', m_nquad2, m_nmodes0 * m_nmodes1,
773 m_nmodes2, 1.0, m_base2.get(), m_nquad2,
774 &input[n * totmodes], m_nmodes0 * m_nmodes1, 0.0,
775 &wsp[n * m_nquad2], m_nquad2 * m_numElmt);
779 Blas::Dgemm(
'N',
'T', m_nquad1, m_nquad2 * m_numElmt * m_nmodes0,
780 m_nmodes1, 1.0, m_base1.get(), m_nquad1, wsp.get(),
781 m_nquad2 * m_numElmt * m_nmodes0, 0.0, wsp2.get(),
785 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1 * m_nquad2 * m_numElmt,
786 m_nmodes0, 1.0, m_base0.get(), m_nquad0, wsp2.get(),
787 m_nquad1 * m_nquad2 * m_numElmt, 0.0, output.get(),
796 boost::ignore_unused(dir, input, output, wsp);
797 ASSERTL0(
false,
"Not valid for this operator.");
801 int coll_phys_offset)
803 boost::ignore_unused(factors, coll_phys_offset);
804 ASSERTL0(
false,
"Not valid for this operator.");
825 :
Operator(pCollExp, pGeomData, factors), m_nquad0(pCollExp[0]->GetNumPoints(0)),
826 m_nquad1(pCollExp[0]->GetNumPoints(1)),
827 m_nquad2(pCollExp[0]->GetNumPoints(2)),
828 m_nmodes0(pCollExp[0]->GetBasisNumModes(0)),
829 m_nmodes1(pCollExp[0]->GetBasisNumModes(1)),
830 m_nmodes2(pCollExp[0]->GetBasisNumModes(2)),
831 m_base0(pCollExp[0]->GetBasis(0)->GetBdata()),
832 m_base1(pCollExp[0]->GetBasis(1)->GetBdata()),
833 m_base2(pCollExp[0]->GetBasis(2)->GetBdata()),
834 m_colldir0(pCollExp[0]->GetBasis(0)->Collocation()),
835 m_colldir1(pCollExp[0]->GetBasis(1)->Collocation()),
836 m_colldir2(pCollExp[0]->GetBasis(2)->Collocation())
838 m_wspSize = m_numElmt * m_nmodes0 *
839 (m_nmodes1 * m_nquad2 + m_nquad1 * m_nquad2);
847 BwdTrans_SumFac_Hex::create,
"BwdTrans_SumFac_Hex");
867 boost::ignore_unused(output1, output2);
869 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
873 tmp + m_numElmt * m_nquad2 * m_nmodes0 *
874 (2 * m_nmodes1 - m_nmodes0 + 1) / 2;
879 int ncoeffs = m_stdExp->GetNcoeffs();
882 for (
int i = 0; i < m_nmodes0; ++i)
884 for (
int j = 0; j < m_nmodes1 - i; ++j, ++cnt)
886 Blas::Dgemm(
'N',
'N', m_nquad2, m_numElmt, m_nmodes2 - i - j,
887 1.0, m_base2.get() + mode * m_nquad2, m_nquad2,
888 input.get() + mode1, ncoeffs, 0.0,
889 tmp.get() + cnt * m_nquad2 * m_numElmt, m_nquad2);
890 mode += m_nmodes2 - i - j;
891 mode1 += m_nmodes2 - i - j;
895 mode += (m_nmodes2 - m_nmodes1) * (m_nmodes2 - m_nmodes1 + 1) / 2;
902 for (
int i = 0; i < m_numElmt; ++i)
907 m_base2.get() + m_nquad2, 1,
908 &tmp[m_nquad2 * m_numElmt] + i * m_nquad2, 1);
913 m_nquad2, input[1 + i * ncoeffs], m_base2.get() + m_nquad2,
914 1, &tmp[m_nmodes1 * m_nquad2 * m_numElmt] + i * m_nquad2,
921 for (
int i = 0; i < m_nmodes0; ++i)
923 Blas::Dgemm(
'N',
'T', m_nquad1, m_nquad2 * m_numElmt, m_nmodes1 - i,
924 1.0, m_base1.get() + mode * m_nquad1, m_nquad1,
925 tmp.get() + mode * m_nquad2 * m_numElmt,
926 m_nquad2 * m_numElmt, 0.0,
927 tmp1.get() + i * m_nquad1 * m_nquad2 * m_numElmt,
929 mode += m_nmodes1 - i;
940 for (
int i = 0; i < m_numElmt; ++i)
944 for (
int j = 0; j < m_nquad2; ++j)
947 tmp[m_nquad2 * m_numElmt + i * m_nquad2 + j],
948 m_base1.get() + m_nquad1, 1,
949 &tmp1[m_nquad1 * m_nquad2 * m_numElmt] +
950 i * m_nquad1 * m_nquad2 + j * m_nquad1,
957 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1 * m_nquad2 * m_numElmt,
958 m_nmodes0, 1.0, m_base0.get(), m_nquad0, tmp1.get(),
959 m_nquad1 * m_nquad2 * m_numElmt, 0.0, output.get(),
967 boost::ignore_unused(dir, input, output, wsp);
968 ASSERTL0(
false,
"Not valid for this operator.");
972 int coll_phys_offset)
974 boost::ignore_unused(factors, coll_phys_offset);
975 ASSERTL0(
false,
"Not valid for this operator.");
995 :
Operator(pCollExp, pGeomData, factors), m_nquad0(m_stdExp->GetNumPoints(0)),
996 m_nquad1(m_stdExp->GetNumPoints(1)),
997 m_nquad2(m_stdExp->GetNumPoints(2)),
998 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
999 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
1000 m_nmodes2(m_stdExp->GetBasisNumModes(2)),
1001 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
1002 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
1003 m_base2(m_stdExp->GetBasis(2)->GetBdata())
1005 m_wspSize = m_numElmt * (m_nquad2 * m_nmodes0 *
1006 (2 * m_nmodes1 - m_nmodes0 + 1) / 2 +
1007 m_nquad2 * m_nquad1 * m_nmodes0);
1011 m_sortTopEdge =
true;
1015 m_sortTopEdge =
false;
1024 BwdTrans_SumFac_Tet::create,
"BwdTrans_SumFac_Tet");
1044 boost::ignore_unused(output1, output2);
1046 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
1049 int totmodes = m_stdExp->GetNcoeffs();
1052 wsp + m_nmodes0 * m_nmodes1 * m_nquad2 * m_numElmt;
1054 Vmath::Zero(m_nmodes0 * m_nmodes1 * m_nquad2 * m_numElmt, wsp, 1);
1060 for (i = mode = mode1 = 0; i < m_nmodes0; ++i)
1062 cnt = i * m_nquad2 * m_numElmt;
1063 for (j = 0; j < m_nmodes1; ++j)
1065 Blas::Dgemm(
'N',
'N', m_nquad2, m_numElmt, m_nmodes2 - i, 1.0,
1066 m_base2.get() + mode * m_nquad2, m_nquad2,
1067 input.get() + mode1, totmodes, 0.0,
1068 &wsp[j * m_nquad2 * m_numElmt * m_nmodes0 + cnt],
1070 mode1 += m_nmodes2 - i;
1072 mode += m_nmodes2 - i;
1076 if (m_sortTopVertex)
1078 for (j = 0; j < m_nmodes1; ++j)
1080 for (i = 0; i < m_numElmt; ++i)
1083 input[1 + i * totmodes + j * m_nmodes2],
1084 m_base2.get() + m_nquad2, 1,
1085 &wsp[j * m_nquad2 * m_numElmt * m_nmodes0 +
1086 m_nquad2 * m_numElmt] +
1098 Blas::Dgemm(
'N',
'T', m_nquad1, m_nquad2 * m_numElmt * m_nmodes0,
1099 m_nmodes1, 1.0, m_base1.get(), m_nquad1, wsp.get(),
1100 m_nquad2 * m_numElmt * m_nmodes0, 0.0, wsp2.get(),
1104 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1 * m_nquad2 * m_numElmt,
1105 m_nmodes0, 1.0, m_base0.get(), m_nquad0, wsp2.get(),
1106 m_nquad1 * m_nquad2 * m_numElmt, 0.0, output.get(),
1114 boost::ignore_unused(dir, input, output, wsp);
1115 ASSERTL0(
false,
"Not valid for this operator.");
1119 int coll_phys_offset)
1121 boost::ignore_unused(factors, coll_phys_offset);
1122 ASSERTL0(
false,
"Not valid for this operator.");
1142 :
Operator(pCollExp, pGeomData, factors), m_nquad0(m_stdExp->GetNumPoints(0)),
1143 m_nquad1(m_stdExp->GetNumPoints(1)),
1144 m_nquad2(m_stdExp->GetNumPoints(2)),
1145 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
1146 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
1147 m_nmodes2(m_stdExp->GetBasisNumModes(2)),
1148 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
1149 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
1150 m_base2(m_stdExp->GetBasis(2)->GetBdata())
1152 m_wspSize = m_numElmt * m_nmodes0 *
1153 (m_nmodes1 * m_nquad2 + m_nquad1 * m_nquad2);
1157 m_sortTopVertex =
true;
1161 m_sortTopVertex =
false;
1170 BwdTrans_SumFac_Prism::create,
"BwdTrans_SumFac_Prism");
1190 boost::ignore_unused(output1, output2);
1192 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
1195 int totmodes = m_stdExp->GetNcoeffs();
1198 wsp + m_nmodes0 * m_nmodes1 * m_nquad2 * m_numElmt;
1200 Vmath::Zero(m_nmodes0 * m_nmodes1 * m_nquad2 * m_numElmt, wsp, 1);
1206 for (i = 0; i < m_nmodes0; ++i)
1208 for (j = 0; j < m_nmodes1; ++j, ++cnt)
1210 int ijmax = max(i, j);
1211 Blas::Dgemm(
'N',
'N', m_nquad2, m_numElmt, m_nmodes2 - ijmax,
1212 1.0, m_base2.get() + mode * m_nquad2, m_nquad2,
1213 input.get() + mode1, totmodes, 0.0,
1214 wsp.get() + cnt * m_nquad2 * m_numElmt, m_nquad2);
1215 mode += m_nmodes2 - ijmax;
1216 mode1 += m_nmodes2 - ijmax;
1220 for (j = m_nmodes1; j < m_nmodes2 - i; ++j)
1222 int ijmax = max(i, j);
1223 mode += m_nmodes2 - ijmax;
1229 if (m_sortTopVertex)
1231 for (i = 0; i < m_numElmt; ++i)
1236 m_base2.get() + m_nquad2, 1,
1237 &wsp[m_nquad2 * m_numElmt] + i * m_nquad2, 1);
1242 m_nquad2, input[1 + i * totmodes], m_base2.get() + m_nquad2,
1243 1, &wsp[m_nmodes1 * m_nquad2 * m_numElmt] + i * m_nquad2,
1249 m_base2.get() + m_nquad2, 1,
1250 &wsp[(m_nmodes1 + 1) * m_nquad2 * m_numElmt] +
1258 for (i = 0; i < m_nmodes0; ++i)
1260 Blas::Dgemm(
'N',
'T', m_nquad1, m_nquad2 * m_numElmt, m_nmodes1,
1261 1.0, m_base1.get(), m_nquad1,
1262 wsp.get() + mode * m_nquad2 * m_numElmt,
1263 m_nquad2 * m_numElmt, 0.0,
1264 wsp2.get() + i * m_nquad1 * m_nquad2 * m_numElmt,
1270 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1 * m_nquad2 * m_numElmt,
1271 m_nmodes0, 1.0, m_base0.get(), m_nquad0, wsp2.get(),
1272 m_nquad1 * m_nquad2 * m_numElmt, 0.0, output.get(),
1280 boost::ignore_unused(dir, input, output, wsp);
1281 ASSERTL0(
false,
"Not valid for this operator.");
1285 int coll_phys_offset)
1287 boost::ignore_unused(factors, coll_phys_offset);
1288 ASSERTL0(
false,
"Not valid for this operator.");
1308 :
Operator(pCollExp, pGeomData, factors), m_nquad0(m_stdExp->GetNumPoints(0)),
1309 m_nquad1(m_stdExp->GetNumPoints(1)),
1310 m_nquad2(m_stdExp->GetNumPoints(2)),
1311 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
1312 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
1313 m_nmodes2(m_stdExp->GetBasisNumModes(2)),
1314 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
1315 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
1316 m_base2(m_stdExp->GetBasis(2)->GetBdata())
1318 m_wspSize = m_numElmt * m_nmodes0 * m_nquad2 * (m_nmodes1 + m_nquad1);
1322 m_sortTopVertex =
true;
1326 m_sortTopVertex =
false;
1335 BwdTrans_SumFac_Pyr::create,
"BwdTrans_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)
Backward transform operator using default StdRegions operator.
~BwdTrans_IterPerExp() final
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
BwdTrans_IterPerExp(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp)
Perform operation.
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
Backward transform operator using matrix free operators.
std::shared_ptr< MatrixFree::BwdTrans > m_oper
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
~BwdTrans_MatrixFree() final
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.
BwdTrans_MatrixFree(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Backward transform operator using LocalRegions implementation.
BwdTrans_NoCollection(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.
vector< StdRegions::StdExpansionSharedPtr > m_expList
~BwdTrans_NoCollection() final
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp)
Perform operation.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Backward transform operator using standard matrix approach.
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
BwdTrans_StdMat(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp)
Perform operation.
Backward transform operator using sum-factorisation (Hex)
Array< OneD, const NekDouble > m_base1
~BwdTrans_SumFac_Hex() final
Array< OneD, const NekDouble > m_base2
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.
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
Array< OneD, const NekDouble > m_base0
BwdTrans_SumFac_Hex(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Backward transform operator using sum-factorisation (Prism)
~BwdTrans_SumFac_Prism() final
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
BwdTrans_SumFac_Prism(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_base1
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
Array< OneD, const NekDouble > m_base2
Backward transform operator using sum-factorisation (Pyr)
Array< OneD, const NekDouble > m_base2
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
~BwdTrans_SumFac_Pyr() final
BwdTrans_SumFac_Pyr(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_base1
Array< OneD, const NekDouble > m_base0
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
Backward transform operator using sum-factorisation (Quad)
Array< OneD, const NekDouble > m_base1
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
~BwdTrans_SumFac_Quad() final
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
Array< OneD, const NekDouble > m_base0
BwdTrans_SumFac_Quad(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp)
Perform operation.
Backward transform operator using sum-factorisation (Segment)
~BwdTrans_SumFac_Seg() final
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp)
Perform operation.
BwdTrans_SumFac_Seg(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.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Backward transform operator using sum-factorisation (Tet)
BwdTrans_SumFac_Tet(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_base1
~BwdTrans_SumFac_Tet() final
Array< OneD, const NekDouble > m_base0
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) 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 > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) final
Perform operation.
Array< OneD, const NekDouble > m_base2
Backward transform operator using sum-factorisation (Tri)
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.
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset)
Check the validity of the supplied factor map.
BwdTrans_SumFac_Tri(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_base1
~BwdTrans_SumFac_Tri() final
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Base class for operators on a collection of elements.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
static void Dgemm(const char &transa, const char &transb, const int &m, const int &n, const int &k, const double &alpha, const double *a, const int &lda, const double *b, const int &ldb, const double &beta, double *c, const int &ldc)
BLAS level 3: Matrix-matrix multiply C = A x B where op(A)[m x k], op(B)[k x n], C[m x n] DGEMM perfo...
static void Daxpy(const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: y = alpha x plus y.
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.
@ eModified_A
Principle Modified Functions .
The above copyright notice and this permission notice shall be included.
std::shared_ptr< DNekMat > DNekMatSharedPtr
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)