38 #include <MatrixFreeOps/Operator.hpp>
39 #include <boost/core/ignore_unused.hpp>
73 boost::ignore_unused(output1, output2, wsp);
74 Blas::Dgemm(
'N',
'N', m_mat->GetRows(), m_numElmt, m_mat->GetColumns(),
75 1.0, m_mat->GetRawPtr(), m_mat->GetRows(), input.get(),
76 m_stdExp->GetNcoeffs(), 0.0, output.get(),
77 m_stdExp->GetTotPoints());
84 boost::ignore_unused(dir, input, output, wsp);
85 ASSERTL0(
false,
"Not valid for this operator.");
89 int coll_phys_offset)
override
91 boost::ignore_unused(factors, coll_phys_offset);
92 ASSERTL0(
false,
"Not valid for this operator.");
102 :
Operator(pCollExp, pGeomData, factors)
105 m_stdExp->DetShapeType(), *m_stdExp);
106 m_mat = m_stdExp->GetStdMatrix(key);
114 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Seg"),
117 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Tri"),
120 BwdTrans_StdMat::create,
"BwdTrans_StdMat_NodalTri"),
123 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Quad"),
126 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Tet"),
129 BwdTrans_StdMat::create,
"BwdTrans_StdMat_NodalTet"),
132 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Pyr"),
135 "BwdTrans_StdMat_Prism"),
138 "BwdTrans_StdMat_NodalPrism"),
141 BwdTrans_StdMat::create,
"BwdTrans_StdMat_Hex"),
144 BwdTrans_StdMat::create,
"BwdTrans_SumFac_Pyr")};
164 boost::ignore_unused(output1, output2, wsp);
171 (*m_oper)(m_input, m_output);
177 (*m_oper)(input, output0);
185 boost::ignore_unused(dir, input, output, wsp);
187 "BwdTrans_MatrixFree: Not valid for this operator.");
191 int coll_phys_offset)
override
193 boost::ignore_unused(factors, coll_phys_offset);
194 ASSERTL0(
false,
"Not valid for this operator.");
198 std::shared_ptr<MatrixFree::BwdTrans>
m_oper;
203 :
Operator(pCollExp, pGeomData, factors),
205 pCollExp[0]->GetStdExp()->GetTotPoints(),
209 const auto dim = pCollExp[0]->GetStdExp()->GetShapeDimension();
210 std::vector<LibUtilities::BasisSharedPtr> basis(dim);
211 for (
auto i = 0; i < dim; ++i)
213 basis[i] = pCollExp[0]->GetBasis(i);
217 auto shapeType = pCollExp[0]->GetStdExp()->DetShapeType();
220 std::string op_string =
"BwdTrans";
221 op_string += MatrixFree::GetOpstring(shapeType,
false);
223 op_string, basis, m_nElmtPad);
225 m_oper = std::dynamic_pointer_cast<MatrixFree::BwdTrans>(oper);
226 ASSERTL0(m_oper,
"Failed to cast pointer.");
234 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Seg"),
237 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Quad"),
240 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Tri"),
243 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Hex"),
246 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Prism"),
249 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Tet"),
252 BwdTrans_MatrixFree::create,
"BwdTrans_MatrixFree_Pyr")};
272 boost::ignore_unused(output1, output2, wsp);
274 const int nCoeffs = m_stdExp->GetNcoeffs();
275 const int nPhys = m_stdExp->GetTotPoints();
278 for (
int i = 0; i < m_numElmt; ++i)
280 m_stdExp->BwdTrans(input + i * nCoeffs, tmp = output + i * nPhys);
288 boost::ignore_unused(dir, input, output, wsp);
289 ASSERTL0(
false,
"Not valid for this operator.");
293 int coll_phys_offset)
override
295 boost::ignore_unused(factors, coll_phys_offset);
296 ASSERTL0(
false,
"Not valid for this operator.");
303 :
Operator(pCollExp, pGeomData, factors)
312 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Seg"),
315 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Tri"),
318 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_NodalTri"),
321 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Quad"),
324 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Tet"),
327 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_NodalTet"),
330 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Pyr"),
333 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Prism"),
336 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_NodalPrism"),
339 BwdTrans_IterPerExp::create,
"BwdTrans_IterPerExp_Hex"),
360 boost::ignore_unused(output1, output2, wsp);
362 const int nCoeffs = m_expList[0]->GetNcoeffs();
363 const int nPhys = m_expList[0]->GetTotPoints();
366 for (
int i = 0; i < m_numElmt; ++i)
368 m_expList[i]->BwdTrans(input + i * nCoeffs,
369 tmp = output + i * nPhys);
377 boost::ignore_unused(dir, input, output, wsp);
378 ASSERTL0(
false,
"Not valid for this operator.");
382 int coll_phys_offset)
override
384 boost::ignore_unused(factors, coll_phys_offset);
385 ASSERTL0(
false,
"Not valid for this operator.");
395 :
Operator(pCollExp, pGeomData, factors)
397 m_expList = pCollExp;
405 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Seg"),
408 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Tri"),
411 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_NodalTri"),
414 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Quad"),
417 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Tet"),
420 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_NodalTet"),
423 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Pyr"),
426 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Prism"),
429 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_NodalPrism"),
432 BwdTrans_NoCollection::create,
"BwdTrans_NoCollection_Hex"),
453 boost::ignore_unused(output1, output2, wsp);
456 Vmath::Vcopy(m_numElmt * m_nmodes0, input.get(), 1, output.get(),
462 Blas::Dgemm(
'N',
'N', m_nquad0, m_numElmt, m_nmodes0, 1.0,
463 m_base0.get(), m_nquad0, &input[0], m_nmodes0, 0.0,
464 &output[0], m_nquad0);
472 boost::ignore_unused(dir, input, output, wsp);
473 ASSERTL0(
false,
"Not valid for this operator.");
477 int coll_phys_offset)
override
479 boost::ignore_unused(factors, coll_phys_offset);
480 ASSERTL0(
false,
"Not valid for this operator.");
493 :
Operator(pCollExp, pGeomData, factors),
494 m_nquad0(m_stdExp->GetNumPoints(0)),
495 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
496 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
497 m_base0(m_stdExp->GetBasis(0)->GetBdata())
507 BwdTrans_SumFac_Seg::create,
"BwdTrans_SumFac_Seg");
527 boost::ignore_unused(output1, output2);
530 if (m_colldir0 && m_colldir1)
532 Vmath::Vcopy(m_numElmt * m_nmodes0 * m_nmodes1, input.get(), 1,
538 m_stdExp->GetBasis(1)->GetBdata();
540 for (i = 0; i < m_numElmt; ++i)
542 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1, m_nmodes1, 1.0,
543 &input[i * m_nquad0 * m_nmodes1], m_nquad0,
544 base1.get(), m_nquad1, 0.0,
545 &output[i * m_nquad0 * m_nquad1], m_nquad0);
550 Blas::Dgemm(
'N',
'N', m_nquad0, m_nmodes1 * m_numElmt, m_nmodes0,
551 1.0, m_base0.get(), m_nquad0, &input[0], m_nmodes0, 0.0,
552 &output[0], m_nquad0);
556 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
560 Blas::Dgemm(
'N',
'N', m_nquad0, m_nmodes1 * m_numElmt, m_nmodes0,
561 1.0, m_base0.get(), m_nquad0, &input[0], m_nmodes0, 0.0,
564 for (i = 0; i < m_numElmt; ++i)
566 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1, m_nmodes1, 1.0,
567 &wsp[i * m_nquad0 * m_nmodes1], m_nquad0,
568 m_base1.get(), m_nquad1, 0.0,
569 &output[i * m_nquad0 * m_nquad1], m_nquad0);
578 boost::ignore_unused(dir, input, output, wsp);
579 ASSERTL0(
false,
"Not valid for this operator.");
583 int coll_phys_offset)
override
585 boost::ignore_unused(factors, coll_phys_offset);
586 ASSERTL0(
false,
"Not valid for this operator.");
603 :
Operator(pCollExp, pGeomData, factors),
604 m_nquad0(m_stdExp->GetNumPoints(0)),
605 m_nquad1(m_stdExp->GetNumPoints(1)),
606 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
607 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
608 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
609 m_colldir1(m_stdExp->GetBasis(1)->Collocation()),
610 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
611 m_base1(m_stdExp->GetBasis(1)->GetBdata())
613 m_wspSize = m_nquad0 * m_nmodes1 * m_numElmt;
621 BwdTrans_SumFac_Quad::create,
"BwdTrans_SumFac_Quad");
641 boost::ignore_unused(output1, output2);
643 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
645 int ncoeffs = m_stdExp->GetNcoeffs();
649 for (i = mode = 0; i < m_nmodes0; ++i)
651 Blas::Dgemm(
'N',
'N', m_nquad1, m_numElmt, m_nmodes1 - i, 1.0,
652 m_base1.get() + mode * m_nquad1, m_nquad1,
653 &input[0] + mode, ncoeffs, 0.0,
654 &wsp[i * m_nquad1 * m_numElmt], m_nquad1);
655 mode += m_nmodes1 - i;
661 for (i = 0; i < m_numElmt; ++i)
664 m_base1.get() + m_nquad1, 1,
665 &wsp[m_nquad1 * m_numElmt] + i * m_nquad1, 1);
669 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1 * m_numElmt, m_nmodes0, 1.0,
670 m_base0.get(), m_nquad0, &wsp[0], m_nquad1 * m_numElmt, 0.0,
671 &output[0], m_nquad0);
678 boost::ignore_unused(dir, input, output, wsp);
679 ASSERTL0(
false,
"Not valid for this operator.");
683 int coll_phys_offset)
override
685 boost::ignore_unused(factors, coll_phys_offset);
686 ASSERTL0(
false,
"Not valid for this operator.");
702 :
Operator(pCollExp, pGeomData, factors),
703 m_nquad0(m_stdExp->GetNumPoints(0)),
704 m_nquad1(m_stdExp->GetNumPoints(1)),
705 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
706 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
707 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
708 m_base1(m_stdExp->GetBasis(1)->GetBdata())
710 m_wspSize = m_nquad0 * m_nmodes1 * m_numElmt;
713 m_sortTopVertex =
true;
717 m_sortTopVertex =
false;
726 BwdTrans_SumFac_Tri::create,
"BwdTrans_SumFac_Tri");
744 boost::ignore_unused(output1, output2);
746 if (m_colldir0 && m_colldir1 && m_colldir2)
748 Vmath::Vcopy(m_numElmt * m_nmodes0 * m_nmodes1 * m_nmodes2,
749 input.get(), 1, output.get(), 1);
753 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
756 int totmodes = m_nmodes0 * m_nmodes1 * m_nmodes2;
759 wsp + m_nmodes0 * m_nmodes1 * m_nquad2 * m_numElmt;
762 for (
int n = 0; n < m_numElmt; ++n)
764 Blas::Dgemm(
'N',
'T', m_nquad2, m_nmodes0 * m_nmodes1,
765 m_nmodes2, 1.0, m_base2.get(), m_nquad2,
766 &input[n * totmodes], m_nmodes0 * m_nmodes1, 0.0,
767 &wsp[n * m_nquad2], m_nquad2 * m_numElmt);
771 Blas::Dgemm(
'N',
'T', m_nquad1, m_nquad2 * m_numElmt * m_nmodes0,
772 m_nmodes1, 1.0, m_base1.get(), m_nquad1, wsp.get(),
773 m_nquad2 * m_numElmt * m_nmodes0, 0.0, wsp2.get(),
777 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1 * m_nquad2 * m_numElmt,
778 m_nmodes0, 1.0, m_base0.get(), m_nquad0, wsp2.get(),
779 m_nquad1 * m_nquad2 * m_numElmt, 0.0, output.get(),
788 boost::ignore_unused(dir, input, output, wsp);
789 ASSERTL0(
false,
"Not valid for this operator.");
793 int coll_phys_offset)
override
795 boost::ignore_unused(factors, coll_phys_offset);
796 ASSERTL0(
false,
"Not valid for this operator.");
817 :
Operator(pCollExp, pGeomData, factors),
818 m_nquad0(pCollExp[0]->GetNumPoints(0)),
819 m_nquad1(pCollExp[0]->GetNumPoints(1)),
820 m_nquad2(pCollExp[0]->GetNumPoints(2)),
821 m_nmodes0(pCollExp[0]->GetBasisNumModes(0)),
822 m_nmodes1(pCollExp[0]->GetBasisNumModes(1)),
823 m_nmodes2(pCollExp[0]->GetBasisNumModes(2)),
824 m_base0(pCollExp[0]->GetBasis(0)->GetBdata()),
825 m_base1(pCollExp[0]->GetBasis(1)->GetBdata()),
826 m_base2(pCollExp[0]->GetBasis(2)->GetBdata()),
827 m_colldir0(pCollExp[0]->GetBasis(0)->Collocation()),
828 m_colldir1(pCollExp[0]->GetBasis(1)->Collocation()),
829 m_colldir2(pCollExp[0]->GetBasis(2)->Collocation())
831 m_wspSize = m_numElmt * m_nmodes0 *
832 (m_nmodes1 * m_nquad2 + m_nquad1 * m_nquad2);
840 BwdTrans_SumFac_Hex::create,
"BwdTrans_SumFac_Hex");
860 boost::ignore_unused(output1, output2);
862 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
866 tmp + m_numElmt * m_nquad2 * m_nmodes0 *
867 (2 * m_nmodes1 - m_nmodes0 + 1) / 2;
872 int ncoeffs = m_stdExp->GetNcoeffs();
875 for (
int i = 0; i < m_nmodes0; ++i)
877 for (
int j = 0; j < m_nmodes1 - i; ++j, ++cnt)
879 Blas::Dgemm(
'N',
'N', m_nquad2, m_numElmt, m_nmodes2 - i - j,
880 1.0, m_base2.get() + mode * m_nquad2, m_nquad2,
881 input.get() + mode1, ncoeffs, 0.0,
882 tmp.get() + cnt * m_nquad2 * m_numElmt, m_nquad2);
883 mode += m_nmodes2 - i - j;
884 mode1 += m_nmodes2 - i - j;
888 mode += (m_nmodes2 - m_nmodes1) * (m_nmodes2 - m_nmodes1 + 1) / 2;
895 for (
int i = 0; i < m_numElmt; ++i)
900 m_base2.get() + m_nquad2, 1,
901 &tmp[m_nquad2 * m_numElmt] + i * m_nquad2, 1);
906 m_nquad2, input[1 + i * ncoeffs], m_base2.get() + m_nquad2,
907 1, &tmp[m_nmodes1 * m_nquad2 * m_numElmt] + i * m_nquad2,
914 for (
int i = 0; i < m_nmodes0; ++i)
916 Blas::Dgemm(
'N',
'T', m_nquad1, m_nquad2 * m_numElmt, m_nmodes1 - i,
917 1.0, m_base1.get() + mode * m_nquad1, m_nquad1,
918 tmp.get() + mode * m_nquad2 * m_numElmt,
919 m_nquad2 * m_numElmt, 0.0,
920 tmp1.get() + i * m_nquad1 * m_nquad2 * m_numElmt,
922 mode += m_nmodes1 - i;
933 for (
int i = 0; i < m_numElmt; ++i)
937 for (
int j = 0; j < m_nquad2; ++j)
940 tmp[m_nquad2 * m_numElmt + i * m_nquad2 + j],
941 m_base1.get() + m_nquad1, 1,
942 &tmp1[m_nquad1 * m_nquad2 * m_numElmt] +
943 i * m_nquad1 * m_nquad2 + j * m_nquad1,
950 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1 * m_nquad2 * m_numElmt,
951 m_nmodes0, 1.0, m_base0.get(), m_nquad0, tmp1.get(),
952 m_nquad1 * m_nquad2 * m_numElmt, 0.0, output.get(),
960 boost::ignore_unused(dir, input, output, wsp);
961 ASSERTL0(
false,
"Not valid for this operator.");
965 int coll_phys_offset)
override
967 boost::ignore_unused(factors, coll_phys_offset);
968 ASSERTL0(
false,
"Not valid for this operator.");
987 :
Operator(pCollExp, pGeomData, factors),
988 m_nquad0(m_stdExp->GetNumPoints(0)),
989 m_nquad1(m_stdExp->GetNumPoints(1)),
990 m_nquad2(m_stdExp->GetNumPoints(2)),
991 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
992 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
993 m_nmodes2(m_stdExp->GetBasisNumModes(2)),
994 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
995 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
996 m_base2(m_stdExp->GetBasis(2)->GetBdata())
998 m_wspSize = m_numElmt * (m_nquad2 * m_nmodes0 *
999 (2 * m_nmodes1 - m_nmodes0 + 1) / 2 +
1000 m_nquad2 * m_nquad1 * m_nmodes0);
1004 m_sortTopEdge =
true;
1008 m_sortTopEdge =
false;
1017 BwdTrans_SumFac_Tet::create,
"BwdTrans_SumFac_Tet");
1037 boost::ignore_unused(output1, output2);
1039 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
1042 int totmodes = m_stdExp->GetNcoeffs();
1045 wsp + m_nmodes0 * m_nmodes1 * m_nquad2 * m_numElmt;
1047 Vmath::Zero(m_nmodes0 * m_nmodes1 * m_nquad2 * m_numElmt, wsp, 1);
1053 for (i = mode = mode1 = 0; i < m_nmodes0; ++i)
1055 cnt = i * m_nquad2 * m_numElmt;
1056 for (j = 0; j < m_nmodes1; ++j)
1058 Blas::Dgemm(
'N',
'N', m_nquad2, m_numElmt, m_nmodes2 - i, 1.0,
1059 m_base2.get() + mode * m_nquad2, m_nquad2,
1060 input.get() + mode1, totmodes, 0.0,
1061 &wsp[j * m_nquad2 * m_numElmt * m_nmodes0 + cnt],
1063 mode1 += m_nmodes2 - i;
1065 mode += m_nmodes2 - i;
1069 if (m_sortTopVertex)
1071 for (j = 0; j < m_nmodes1; ++j)
1073 for (i = 0; i < m_numElmt; ++i)
1076 input[1 + i * totmodes + j * m_nmodes2],
1077 m_base2.get() + m_nquad2, 1,
1078 &wsp[j * m_nquad2 * m_numElmt * m_nmodes0 +
1079 m_nquad2 * m_numElmt] +
1091 Blas::Dgemm(
'N',
'T', m_nquad1, m_nquad2 * m_numElmt * m_nmodes0,
1092 m_nmodes1, 1.0, m_base1.get(), m_nquad1, wsp.get(),
1093 m_nquad2 * m_numElmt * m_nmodes0, 0.0, wsp2.get(),
1097 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1 * m_nquad2 * m_numElmt,
1098 m_nmodes0, 1.0, m_base0.get(), m_nquad0, wsp2.get(),
1099 m_nquad1 * m_nquad2 * m_numElmt, 0.0, output.get(),
1107 boost::ignore_unused(dir, input, output, wsp);
1108 ASSERTL0(
false,
"Not valid for this operator.");
1112 int coll_phys_offset)
override
1114 boost::ignore_unused(factors, coll_phys_offset);
1115 ASSERTL0(
false,
"Not valid for this operator.");
1134 :
Operator(pCollExp, pGeomData, factors),
1135 m_nquad0(m_stdExp->GetNumPoints(0)),
1136 m_nquad1(m_stdExp->GetNumPoints(1)),
1137 m_nquad2(m_stdExp->GetNumPoints(2)),
1138 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
1139 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
1140 m_nmodes2(m_stdExp->GetBasisNumModes(2)),
1141 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
1142 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
1143 m_base2(m_stdExp->GetBasis(2)->GetBdata())
1145 m_wspSize = m_numElmt * m_nmodes0 *
1146 (m_nmodes1 * m_nquad2 + m_nquad1 * m_nquad2);
1150 m_sortTopVertex =
true;
1154 m_sortTopVertex =
false;
1163 BwdTrans_SumFac_Prism::create,
"BwdTrans_SumFac_Prism");
1183 boost::ignore_unused(output1, output2);
1185 ASSERTL1(wsp.size() == m_wspSize,
"Incorrect workspace size");
1188 int totmodes = m_stdExp->GetNcoeffs();
1191 wsp + m_nmodes0 * m_nmodes1 * m_nquad2 * m_numElmt;
1193 Vmath::Zero(m_nmodes0 * m_nmodes1 * m_nquad2 * m_numElmt, wsp, 1);
1199 for (i = 0; i < m_nmodes0; ++i)
1201 for (j = 0; j < m_nmodes1; ++j, ++cnt)
1203 int ijmax = max(i, j);
1204 Blas::Dgemm(
'N',
'N', m_nquad2, m_numElmt, m_nmodes2 - ijmax,
1205 1.0, m_base2.get() + mode * m_nquad2, m_nquad2,
1206 input.get() + mode1, totmodes, 0.0,
1207 wsp.get() + cnt * m_nquad2 * m_numElmt, m_nquad2);
1208 mode += m_nmodes2 - ijmax;
1209 mode1 += m_nmodes2 - ijmax;
1213 for (j = m_nmodes1; j < m_nmodes2 - i; ++j)
1215 int ijmax = max(i, j);
1216 mode += m_nmodes2 - ijmax;
1222 if (m_sortTopVertex)
1224 for (i = 0; i < m_numElmt; ++i)
1229 m_base2.get() + m_nquad2, 1,
1230 &wsp[m_nquad2 * m_numElmt] + i * m_nquad2, 1);
1235 m_nquad2, input[1 + i * totmodes], m_base2.get() + m_nquad2,
1236 1, &wsp[m_nmodes1 * m_nquad2 * m_numElmt] + i * m_nquad2,
1242 m_base2.get() + m_nquad2, 1,
1243 &wsp[(m_nmodes1 + 1) * m_nquad2 * m_numElmt] +
1251 for (i = 0; i < m_nmodes0; ++i)
1253 Blas::Dgemm(
'N',
'T', m_nquad1, m_nquad2 * m_numElmt, m_nmodes1,
1254 1.0, m_base1.get(), m_nquad1,
1255 wsp.get() + mode * m_nquad2 * m_numElmt,
1256 m_nquad2 * m_numElmt, 0.0,
1257 wsp2.get() + i * m_nquad1 * m_nquad2 * m_numElmt,
1263 Blas::Dgemm(
'N',
'T', m_nquad0, m_nquad1 * m_nquad2 * m_numElmt,
1264 m_nmodes0, 1.0, m_base0.get(), m_nquad0, wsp2.get(),
1265 m_nquad1 * m_nquad2 * m_numElmt, 0.0, output.get(),
1273 boost::ignore_unused(dir, input, output, wsp);
1274 ASSERTL0(
false,
"Not valid for this operator.");
1278 int coll_phys_offset)
override
1280 boost::ignore_unused(factors, coll_phys_offset);
1281 ASSERTL0(
false,
"Not valid for this operator.");
1300 :
Operator(pCollExp, pGeomData, factors),
1301 m_nquad0(m_stdExp->GetNumPoints(0)),
1302 m_nquad1(m_stdExp->GetNumPoints(1)),
1303 m_nquad2(m_stdExp->GetNumPoints(2)),
1304 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
1305 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
1306 m_nmodes2(m_stdExp->GetBasisNumModes(2)),
1307 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
1308 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
1309 m_base2(m_stdExp->GetBasis(2)->GetBdata())
1311 m_wspSize = m_numElmt * m_nmodes0 * m_nquad2 * (m_nmodes1 + m_nquad1);
1315 m_sortTopVertex =
true;
1319 m_sortTopVertex =
false;
1328 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.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
~BwdTrans_IterPerExp() 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) override
Perform operation.
Backward transform operator using matrix free operators.
std::shared_ptr< MatrixFree::BwdTrans > m_oper
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output0, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) override final
Perform operation.
~BwdTrans_MatrixFree() final
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
BwdTrans_MatrixFree(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Backward transform operator using LocalRegions implementation.
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
BwdTrans_NoCollection(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) override
Perform operation.
vector< StdRegions::StdExpansionSharedPtr > m_expList
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
~BwdTrans_NoCollection() final
Backward transform operator using standard matrix approach.
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
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) override 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) override
Perform operation.
Backward transform operator using sum-factorisation (Hex)
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) override
Perform operation.
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
Array< OneD, const NekDouble > m_base1
~BwdTrans_SumFac_Hex() final
Array< OneD, const NekDouble > m_base2
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
Array< OneD, const NekDouble > m_base0
BwdTrans_SumFac_Hex(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Backward transform operator using sum-factorisation (Prism)
~BwdTrans_SumFac_Prism() final
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
BwdTrans_SumFac_Prism(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) override final
Perform operation.
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_base1
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
Array< OneD, const NekDouble > m_base2
Backward transform operator using sum-factorisation (Pyr)
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) override final
Perform operation.
~BwdTrans_SumFac_Pyr() final
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
BwdTrans_SumFac_Pyr(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_base1
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
Array< OneD, const NekDouble > m_base0
Backward transform operator using sum-factorisation (Quad)
Array< OneD, const NekDouble > m_base1
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
~BwdTrans_SumFac_Quad() 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) override 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) override
Perform operation.
BwdTrans_SumFac_Quad(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Backward transform operator using sum-factorisation (Segment)
~BwdTrans_SumFac_Seg() final
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
BwdTrans_SumFac_Seg(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_base0
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) override final
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) override
Perform operation.
Backward transform operator using sum-factorisation (Tet)
BwdTrans_SumFac_Tet(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
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) override final
Array< OneD, const NekDouble > m_base1
~BwdTrans_SumFac_Tet() final
Array< OneD, const NekDouble > m_base0
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) override final
Perform operation.
Backward transform operator using sum-factorisation (Tri)
BwdTrans_SumFac_Tri(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
virtual void CheckFactors(StdRegions::FactorMap factors, int coll_phys_offset) override
Check the validity of the supplied factor map.
void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp) override
Perform operation.
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) override 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)