Nektar++
Loading...
Searching...
No Matches
BwdTrans.cpp
Go to the documentation of this file.
1///////////////////////////////////////////////////////////////////////////////
2//
3// File: BwdTrans.cpp
4//
5// For more information, please see: http://www.nektar.info
6//
7// The MIT License
8//
9// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
10// Department of Aeronautics, Imperial College London (UK), and Scientific
11// Computing and Imaging Institute, University of Utah (USA).
12//
13// Permission is hereby granted, free of charge, to any person obtaining a
14// copy of this software and associated documentation files (the "Software"),
15// to deal in the Software without restriction, including without limitation
16// the rights to use, copy, modify, merge, publish, distribute, sublicense,
17// and/or sell copies of the Software, and to permit persons to whom the
18// Software is furnished to do so, subject to the following conditions:
19//
20// The above copyright notice and this permission notice shall be included
21// in all copies or substantial portions of the Software.
22//
23// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29// DEALINGS IN THE SOFTWARE.
30//
31// Description: BwdTrans operator implementations
32//
33///////////////////////////////////////////////////////////////////////////////
34
38
39#include <MatrixFreeOps/Operator.hpp>
40
41using namespace std;
42
44{
45
56
57/**
58 * @brief Backward transform help class to calculate the size of the collection
59 * that is given as an input and as an output to the BwdTrans Operator. The size
60 * evaluation takes into account the conversion from the coefficient space to
61 * the physical space
62 */
63class BwdTrans_Helper : virtual public Operator
64{
65protected:
67 {
68 // expect input to be number of elements by the number of coefficients
69 m_inputSize = m_numElmt * m_stdExp->GetNcoeffs();
70 // expect input to be number of elements by the number of quad points
71 m_outputSize = m_numElmt * m_stdExp->GetTotPoints();
72 }
73};
74
75/**
76 * @brief Backward transform operator using standard matrix approach.
77 */
78class BwdTrans_StdMat final : virtual public Operator,
79 virtual public BwdTrans_Helper
80{
81public:
83
84 ~BwdTrans_StdMat() final = default;
85
86 void operator()(const Array<OneD, const NekDouble> &input,
87 Array<OneD, NekDouble> &output0,
88 [[maybe_unused]] Array<OneD, NekDouble> &output1,
89 [[maybe_unused]] Array<OneD, NekDouble> &output2,
90 [[maybe_unused]] Array<OneD, NekDouble> &wsp) override
91 {
92 Blas::Dgemm('N', 'N', m_mat->GetRows(), m_numElmt, m_mat->GetColumns(),
93 1.0, m_mat->GetRawPtr(), m_mat->GetRows(), input.data(),
94 m_stdExp->GetNcoeffs(), 0.0, output0.data(),
95 m_stdExp->GetTotPoints());
96 }
97
98 void operator()([[maybe_unused]] int dir,
99 [[maybe_unused]] const Array<OneD, const NekDouble> &input,
100 [[maybe_unused]] Array<OneD, NekDouble> &output,
101 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
102 {
103 ASSERTL0(false, "Not valid for this operator.");
104 }
105
106protected:
108
109private:
110 BwdTrans_StdMat(vector<LocalRegions::ExpansionSharedPtr> pCollExp,
112 StdRegions::FactorMap factors)
113 : Operator(pCollExp, pGeomData, factors), BwdTrans_Helper()
114 {
116 m_stdExp->DetShapeType(), *m_stdExp);
117 m_mat = m_stdExp->GetStdMatrix(key);
118 }
119};
120
121/// Factory initialisation for the BwdTrans_StdMat operators
122OperatorKey BwdTrans_StdMat::m_typeArr[] = {
124 OperatorKey(eSegment, eBwdTrans, eStdMat, false),
125 BwdTrans_StdMat::create, "BwdTrans_StdMat_Seg"),
127 OperatorKey(eTriangle, eBwdTrans, eStdMat, false),
128 BwdTrans_StdMat::create, "BwdTrans_StdMat_Tri"),
130 OperatorKey(eNodalTri, eBwdTrans, eStdMat, true),
131 BwdTrans_StdMat::create, "BwdTrans_StdMat_NodalTri"),
133 OperatorKey(eQuadrilateral, eBwdTrans, eStdMat, false),
134 BwdTrans_StdMat::create, "BwdTrans_StdMat_Quad"),
136 OperatorKey(eTetrahedron, eBwdTrans, eStdMat, false),
137 BwdTrans_StdMat::create, "BwdTrans_StdMat_Tet"),
139 OperatorKey(eNodalTet, eBwdTrans, eStdMat, true),
140 BwdTrans_StdMat::create, "BwdTrans_StdMat_NodalTet"),
142 OperatorKey(ePyramid, eBwdTrans, eStdMat, false),
143 BwdTrans_StdMat::create, "BwdTrans_StdMat_Pyr"),
145 OperatorKey(ePrism, eBwdTrans, eStdMat, false), BwdTrans_StdMat::create,
146 "BwdTrans_StdMat_Prism"),
148 OperatorKey(eNodalPrism, eBwdTrans, eStdMat, true),
149 BwdTrans_StdMat::create, "BwdTrans_StdMat_NodalPrism"),
151 OperatorKey(eHexahedron, eBwdTrans, eStdMat, false),
152 BwdTrans_StdMat::create, "BwdTrans_StdMat_Hex"),
154 OperatorKey(ePyramid, eBwdTrans, eSumFac, false),
155 BwdTrans_StdMat::create, "BwdTrans_SumFac_Pyr")};
156
157/**
158 * @brief Backward transform operator using matrix free operators.
159 */
160class BwdTrans_MatrixFree final : virtual public Operator,
162 virtual public BwdTrans_Helper
163{
164public:
166
167 ~BwdTrans_MatrixFree() final = default;
168
169 void operator()(const Array<OneD, const NekDouble> &input,
170 Array<OneD, NekDouble> &output0,
171 [[maybe_unused]] Array<OneD, NekDouble> &output1,
172 [[maybe_unused]] Array<OneD, NekDouble> &output2,
173 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
174 {
175 (*m_oper)(input, output0);
176 }
177
178 void operator()([[maybe_unused]] int dir,
179 [[maybe_unused]] const Array<OneD, const NekDouble> &input,
180 [[maybe_unused]] Array<OneD, NekDouble> &output,
181 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
182 {
184 "BwdTrans_MatrixFree: Not valid for this operator.");
185 }
186
187private:
188 std::shared_ptr<MatrixFree::BwdTrans> m_oper;
189
190 BwdTrans_MatrixFree(vector<LocalRegions::ExpansionSharedPtr> pCollExp,
192 StdRegions::FactorMap factors)
193 : Operator(pCollExp, pGeomData, factors), BwdTrans_Helper(),
194 MatrixFreeBase(pCollExp[0]->GetNcoeffs(), pCollExp[0]->GetTotPoints(),
195 pCollExp.size())
196 {
197 // Basis vector.
198 const auto dim = pCollExp[0]->GetShapeDimension();
199 std::vector<LibUtilities::BasisSharedPtr> basis(dim);
200 for (auto i = 0; i < dim; ++i)
201 {
202 basis[i] = pCollExp[0]->GetBasis(i);
203 }
204
205 // Get shape type
206 auto shapeType = pCollExp[0]->DetShapeType();
207
208 // Generate operator string and create operator.
209 std::string op_string = "BwdTrans";
210 op_string += MatrixFree::GetOpstring(shapeType, false);
211 auto oper = MatrixFree::GetOperatorFactory().CreateInstance(
212 op_string, basis, pCollExp.size());
213
214 oper->SetUpBdata(basis);
215
216 m_oper = std::dynamic_pointer_cast<MatrixFree::BwdTrans>(oper);
217 ASSERTL0(m_oper, "Failed to cast pointer.");
218 }
219};
220
221/// Factory initialisation for the BwdTrans_MatrixFree operators
222OperatorKey BwdTrans_MatrixFree::m_typeArr[] = {
224 OperatorKey(eSegment, eBwdTrans, eMatrixFree, false),
225 BwdTrans_MatrixFree::create, "BwdTrans_MatrixFree_Seg"),
227 OperatorKey(eQuadrilateral, eBwdTrans, eMatrixFree, false),
228 BwdTrans_MatrixFree::create, "BwdTrans_MatrixFree_Quad"),
230 OperatorKey(eTriangle, eBwdTrans, eMatrixFree, false),
231 BwdTrans_MatrixFree::create, "BwdTrans_MatrixFree_Tri"),
233 OperatorKey(eHexahedron, eBwdTrans, eMatrixFree, false),
234 BwdTrans_MatrixFree::create, "BwdTrans_MatrixFree_Hex"),
236 OperatorKey(ePrism, eBwdTrans, eMatrixFree, false),
237 BwdTrans_MatrixFree::create, "BwdTrans_MatrixFree_Prism"),
239 OperatorKey(eTetrahedron, eBwdTrans, eMatrixFree, false),
240 BwdTrans_MatrixFree::create, "BwdTrans_MatrixFree_Tet"),
242 OperatorKey(ePyramid, eBwdTrans, eMatrixFree, false),
243 BwdTrans_MatrixFree::create, "BwdTrans_MatrixFree_Pyr")};
244
245/**
246 * @brief Backward transform operator using default StdRegions operator
247 */
248class BwdTrans_IterPerExp final : virtual public Operator,
249 virtual public BwdTrans_Helper
250{
251public:
253
254 ~BwdTrans_IterPerExp() final = default;
255
256 void operator()(const Array<OneD, const NekDouble> &input,
257 Array<OneD, NekDouble> &output0,
258 [[maybe_unused]] Array<OneD, NekDouble> &output1,
259 [[maybe_unused]] Array<OneD, NekDouble> &output2,
260 [[maybe_unused]] Array<OneD, NekDouble> &wsp) override
261 {
262 const int nCoeffs = m_stdExp->GetNcoeffs();
263 const int nPhys = m_stdExp->GetTotPoints();
265
266 for (int i = 0; i < m_numElmt; ++i)
267 {
268 m_stdExp->BwdTrans(input + i * nCoeffs, tmp = output0 + i * nPhys);
269 }
270 }
271
272 void operator()([[maybe_unused]] int dir,
273 [[maybe_unused]] const Array<OneD, const NekDouble> &input,
274 [[maybe_unused]] Array<OneD, NekDouble> &output,
275 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
276 {
277 ASSERTL0(false, "Not valid for this operator.");
278 }
279
280private:
281 BwdTrans_IterPerExp(vector<LocalRegions::ExpansionSharedPtr> pCollExp,
283 StdRegions::FactorMap factors)
284 : Operator(pCollExp, pGeomData, factors), BwdTrans_Helper()
285 {
286 }
287};
288
289/// Factory initialisation for the BwdTrans_IterPerExp operators
290OperatorKey BwdTrans_IterPerExp::m_typeArr[] = {
292 OperatorKey(eSegment, eBwdTrans, eIterPerExp, false),
293 BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_Seg"),
295 OperatorKey(eTriangle, eBwdTrans, eIterPerExp, false),
296 BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_Tri"),
298 OperatorKey(eNodalTri, eBwdTrans, eIterPerExp, true),
299 BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_NodalTri"),
301 OperatorKey(eQuadrilateral, eBwdTrans, eIterPerExp, false),
302 BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_Quad"),
304 OperatorKey(eTetrahedron, eBwdTrans, eIterPerExp, false),
305 BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_Tet"),
307 OperatorKey(eNodalTet, eBwdTrans, eIterPerExp, true),
308 BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_NodalTet"),
310 OperatorKey(ePyramid, eBwdTrans, eIterPerExp, false),
311 BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_Pyr"),
313 OperatorKey(ePrism, eBwdTrans, eIterPerExp, false),
314 BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_Prism"),
316 OperatorKey(eNodalPrism, eBwdTrans, eIterPerExp, true),
317 BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_NodalPrism"),
319 OperatorKey(eHexahedron, eBwdTrans, eIterPerExp, false),
320 BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_Hex"),
321};
322
323/**
324 * @brief Backward transform operator using LocalRegions implementation.
325 */
326class BwdTrans_NoCollection final : virtual public Operator,
327 virtual public BwdTrans_Helper
328{
329public:
331
332 ~BwdTrans_NoCollection() final = default;
333
334 void operator()(const Array<OneD, const NekDouble> &input,
335 Array<OneD, NekDouble> &output0,
336 [[maybe_unused]] Array<OneD, NekDouble> &output1,
337 [[maybe_unused]] Array<OneD, NekDouble> &output2,
338 [[maybe_unused]] Array<OneD, NekDouble> &wsp) override
339 {
340 const int nCoeffs = m_expList[0]->GetNcoeffs();
341 const int nPhys = m_expList[0]->GetTotPoints();
343
344 for (int i = 0; i < m_numElmt; ++i)
345 {
346 m_expList[i]->BwdTrans(input + i * nCoeffs,
347 tmp = output0 + i * nPhys);
348 }
349 }
350
351 void operator()([[maybe_unused]] int dir,
352 [[maybe_unused]] const Array<OneD, const NekDouble> &input,
353 [[maybe_unused]] Array<OneD, NekDouble> &output,
354 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
355 {
356 ASSERTL0(false, "Not valid for this operator.");
357 }
358
359protected:
360 vector<LocalRegions::ExpansionSharedPtr> m_expList;
361
362private:
363 BwdTrans_NoCollection(vector<LocalRegions::ExpansionSharedPtr> pCollExp,
365 StdRegions::FactorMap factors)
366 : Operator(pCollExp, pGeomData, factors), BwdTrans_Helper()
367 {
368 m_expList = pCollExp;
369 }
370};
371
372/// Factory initialisation for the BwdTrans_NoCollection operators
373OperatorKey BwdTrans_NoCollection::m_typeArr[] = {
375 OperatorKey(eSegment, eBwdTrans, eNoCollection, false),
376 BwdTrans_NoCollection::create, "BwdTrans_NoCollection_Seg"),
378 OperatorKey(eTriangle, eBwdTrans, eNoCollection, false),
379 BwdTrans_NoCollection::create, "BwdTrans_NoCollection_Tri"),
381 OperatorKey(eNodalTri, eBwdTrans, eNoCollection, true),
382 BwdTrans_NoCollection::create, "BwdTrans_NoCollection_NodalTri"),
384 OperatorKey(eQuadrilateral, eBwdTrans, eNoCollection, false),
385 BwdTrans_NoCollection::create, "BwdTrans_NoCollection_Quad"),
387 OperatorKey(eTetrahedron, eBwdTrans, eNoCollection, false),
388 BwdTrans_NoCollection::create, "BwdTrans_NoCollection_Tet"),
390 OperatorKey(eNodalTet, eBwdTrans, eNoCollection, true),
391 BwdTrans_NoCollection::create, "BwdTrans_NoCollection_NodalTet"),
393 OperatorKey(ePyramid, eBwdTrans, eNoCollection, false),
394 BwdTrans_NoCollection::create, "BwdTrans_NoCollection_Pyr"),
396 OperatorKey(ePrism, eBwdTrans, eNoCollection, false),
397 BwdTrans_NoCollection::create, "BwdTrans_NoCollection_Prism"),
399 OperatorKey(eNodalPrism, eBwdTrans, eNoCollection, true),
400 BwdTrans_NoCollection::create, "BwdTrans_NoCollection_NodalPrism"),
402 OperatorKey(eHexahedron, eBwdTrans, eNoCollection, false),
403 BwdTrans_NoCollection::create, "BwdTrans_NoCollection_Hex"),
404};
405
406/**
407 * @brief Backward transform operator using sum-factorisation (Segment)
408 */
409class BwdTrans_SumFac_Seg final : virtual public Operator,
410 virtual public BwdTrans_Helper
411{
412public:
414
415 ~BwdTrans_SumFac_Seg() final = default;
416
417 void operator()(const Array<OneD, const NekDouble> &input,
418 Array<OneD, NekDouble> &output0,
419 [[maybe_unused]] Array<OneD, NekDouble> &output1,
420 [[maybe_unused]] Array<OneD, NekDouble> &output2,
421 [[maybe_unused]] Array<OneD, NekDouble> &wsp) override
422 {
423 if (m_colldir0)
424 {
425 Vmath::Vcopy(m_numElmt * m_nmodes0, input.data(), 1, output0.data(),
426 1);
427 }
428 else
429 {
430 // out = B0*in;
431 Blas::Dgemm('N', 'N', m_nquad0, m_numElmt, m_nmodes0, 1.0,
432 m_base0.data(), m_nquad0, &input[0], m_nmodes0, 0.0,
433 &output0[0], m_nquad0);
434 }
435 }
436
437 void operator()([[maybe_unused]] int dir,
438 [[maybe_unused]] const Array<OneD, const NekDouble> &input,
439 [[maybe_unused]] Array<OneD, NekDouble> &output,
440 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
441 {
442 ASSERTL0(false, "Not valid for this operator.");
443 }
444
445protected:
446 const int m_nquad0;
447 const int m_nmodes0;
448 const bool m_colldir0;
450
451private:
452 BwdTrans_SumFac_Seg(vector<LocalRegions::ExpansionSharedPtr> pCollExp,
454 StdRegions::FactorMap factors)
455 : Operator(pCollExp, pGeomData, factors), BwdTrans_Helper(),
456 m_nquad0(m_stdExp->GetNumPoints(0)),
457 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
458 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
459 m_base0(m_stdExp->GetBasis(0)->GetBdata())
460 {
461 m_wspSize = 0;
462 }
463};
464
465/// Factory initialisation for the BwdTrans_SumFac_Seg operator
466OperatorKey BwdTrans_SumFac_Seg::m_type =
468 OperatorKey(eSegment, eBwdTrans, eSumFac, false),
469 BwdTrans_SumFac_Seg::create, "BwdTrans_SumFac_Seg");
470
471/**
472 * @brief Backward transform operator using sum-factorisation (Quad)
473 */
474class BwdTrans_SumFac_Quad final : virtual public Operator,
475 virtual public BwdTrans_Helper
476{
477public:
479
480 ~BwdTrans_SumFac_Quad() final = default;
481
482 void operator()(const Array<OneD, const NekDouble> &input,
483 Array<OneD, NekDouble> &output0,
484 [[maybe_unused]] Array<OneD, NekDouble> &output1,
485 [[maybe_unused]] Array<OneD, NekDouble> &output2,
486 Array<OneD, NekDouble> &wsp) override
487 {
488 int i = 0;
489 if (m_colldir0 && m_colldir1)
490 {
491 Vmath::Vcopy(m_numElmt * m_nmodes0 * m_nmodes1, input.data(), 1,
492 output0.data(), 1);
493 }
494 else if (m_colldir0)
495 {
496 for (i = 0; i < m_numElmt; ++i)
497 {
498 Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nmodes1, 1.0,
499 &input[i * m_nquad0 * m_nmodes1], m_nquad0,
500 m_base1.data(), m_nquad1, 0.0,
501 &output0[i * m_nquad0 * m_nquad1], m_nquad0);
502 }
503 }
504 else if (m_colldir1)
505 {
507 1.0, m_base0.data(), m_nquad0, &input[0], m_nmodes0,
508 0.0, &output0[0], m_nquad0);
509 }
510 else
511 {
512 ASSERTL1(wsp.size() == m_wspSize, "Incorrect workspace size");
513
514 // Those two calls correpsond to the operation
515 // out = B0*in*Transpose(B1);
517 1.0, m_base0.data(), m_nquad0, &input[0], m_nmodes0,
518 0.0, &wsp[0], m_nquad0);
519
520 for (i = 0; i < m_numElmt; ++i)
521 {
522 Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nmodes1, 1.0,
523 &wsp[i * m_nquad0 * m_nmodes1], m_nquad0,
524 m_base1.data(), m_nquad1, 0.0,
525 &output0[i * m_nquad0 * m_nquad1], m_nquad0);
526 }
527 }
528 }
529
530 void operator()([[maybe_unused]] int dir,
531 [[maybe_unused]] const Array<OneD, const NekDouble> &input,
532 [[maybe_unused]] Array<OneD, NekDouble> &output,
533 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
534 {
535 ASSERTL0(false, "Not valid for this operator.");
536 }
537
538protected:
539 const int m_nquad0;
540 const int m_nquad1;
541 const int m_nmodes0;
542 const int m_nmodes1;
543 const bool m_colldir0;
544 const bool m_colldir1;
547
548private:
549 BwdTrans_SumFac_Quad(vector<LocalRegions::ExpansionSharedPtr> pCollExp,
551 StdRegions::FactorMap factors)
552 : Operator(pCollExp, pGeomData, factors), BwdTrans_Helper(),
553 m_nquad0(m_stdExp->GetNumPoints(0)),
554 m_nquad1(m_stdExp->GetNumPoints(1)),
555 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
556 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
557 m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
558 m_colldir1(m_stdExp->GetBasis(1)->Collocation()),
559 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
560 m_base1(m_stdExp->GetBasis(1)->GetBdata())
561 {
563 }
564};
565
566/// Factory initialisation for the BwdTrans_SumFac_Quad operator
567OperatorKey BwdTrans_SumFac_Quad::m_type =
569 OperatorKey(eQuadrilateral, eBwdTrans, eSumFac, false),
570 BwdTrans_SumFac_Quad::create, "BwdTrans_SumFac_Quad");
571
572/**
573 * @brief Backward transform operator using sum-factorisation (Tri)
574 */
575class BwdTrans_SumFac_Tri final : virtual public Operator,
576 virtual public BwdTrans_Helper
577{
578public:
580
581 ~BwdTrans_SumFac_Tri() final = default;
582
583 void operator()(const Array<OneD, const NekDouble> &input,
584 Array<OneD, NekDouble> &output0,
585 [[maybe_unused]] Array<OneD, NekDouble> &output1,
586 [[maybe_unused]] Array<OneD, NekDouble> &output2,
587 Array<OneD, NekDouble> &wsp) override
588 {
589 ASSERTL1(wsp.size() == m_wspSize, "Incorrect workspace size");
590
591 int ncoeffs = m_stdExp->GetNcoeffs();
592 int i = 0;
593 int mode = 0;
594
595 for (i = mode = 0; i < m_nmodes0; ++i)
596 {
597 Blas::Dgemm('N', 'N', m_nquad1, m_numElmt, m_nmodes1 - i, 1.0,
598 m_base1.data() + mode * m_nquad1, m_nquad1,
599 &input[0] + mode, ncoeffs, 0.0,
600 &wsp[i * m_nquad1 * m_numElmt], m_nquad1);
601 mode += m_nmodes1 - i;
602 }
603
604 // fix for modified basis by splitting top vertex mode
605 if (m_sortTopVertex)
606 {
607 for (i = 0; i < m_numElmt; ++i)
608 {
609 Blas::Daxpy(m_nquad1, input[1 + i * ncoeffs],
610 m_base1.data() + m_nquad1, 1,
611 &wsp[m_nquad1 * m_numElmt] + i * m_nquad1, 1);
612 }
613 }
614
616 m_base0.data(), m_nquad0, &wsp[0], m_nquad1 * m_numElmt,
617 0.0, &output0[0], m_nquad0);
618 }
619
620 void operator()([[maybe_unused]] int dir,
621 [[maybe_unused]] const Array<OneD, const NekDouble> &input,
622 [[maybe_unused]] Array<OneD, NekDouble> &output,
623 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
624 {
625 ASSERTL0(false, "Not valid for this operator.");
626 }
627
628protected:
629 const int m_nquad0;
630 const int m_nquad1;
631 const int m_nmodes0;
632 const int m_nmodes1;
636
637private:
638 BwdTrans_SumFac_Tri(vector<LocalRegions::ExpansionSharedPtr> pCollExp,
640 StdRegions::FactorMap factors)
641 : Operator(pCollExp, pGeomData, factors),
642 m_nquad0(m_stdExp->GetNumPoints(0)),
643 m_nquad1(m_stdExp->GetNumPoints(1)),
644 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
645 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
646 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
647 m_base1(m_stdExp->GetBasis(1)->GetBdata())
648 {
650 if (m_stdExp->GetBasis(0)->GetBasisType() == LibUtilities::eModified_A)
651 {
652 m_sortTopVertex = true;
653 }
654 else
655 {
656 m_sortTopVertex = false;
657 }
658 }
659};
660
661/// Factory initialisation for the BwdTrans_SumFac_Tri operator
662OperatorKey BwdTrans_SumFac_Tri::m_type =
664 OperatorKey(eTriangle, eBwdTrans, eSumFac, false),
665 BwdTrans_SumFac_Tri::create, "BwdTrans_SumFac_Tri");
666
667/// Backward transform operator using sum-factorisation (Hex)
668class BwdTrans_SumFac_Hex final : virtual public Operator,
669 virtual public BwdTrans_Helper
670{
671public:
673
674 ~BwdTrans_SumFac_Hex() final = default;
675
676 void operator()(const Array<OneD, const NekDouble> &input,
677 Array<OneD, NekDouble> &output0,
678 [[maybe_unused]] Array<OneD, NekDouble> &output1,
679 [[maybe_unused]] Array<OneD, NekDouble> &output2,
680 Array<OneD, NekDouble> &wsp) override
681 {
683 {
685 input.data(), 1, output0.data(), 1);
686 }
687 else
688 {
689 ASSERTL1(wsp.size() == m_wspSize, "Incorrect workspace size");
690
691 // Assign second half of workspace for 2nd DGEMM operation.
692 int totmodes = m_nmodes0 * m_nmodes1 * m_nmodes2;
693
696
697 // loop over elements and do bwd trans wrt c
698 for (int n = 0; n < m_numElmt; ++n)
699 {
701 m_nmodes2, 1.0, m_base2.data(), m_nquad2,
702 &input[n * totmodes], m_nmodes0 * m_nmodes1, 0.0,
703 &wsp[n * m_nquad2], m_nquad2 * m_numElmt);
704 }
705
706 // trans wrt b
708 m_nmodes1, 1.0, m_base1.data(), m_nquad1, wsp.data(),
709 m_nquad2 * m_numElmt * m_nmodes0, 0.0, wsp2.data(),
710 m_nquad1);
711
712 // trans wrt a
714 m_nmodes0, 1.0, m_base0.data(), m_nquad0, wsp2.data(),
715 m_nquad1 * m_nquad2 * m_numElmt, 0.0, output0.data(),
716 m_nquad0);
717 }
718 }
719
720 void operator()([[maybe_unused]] int dir,
721 [[maybe_unused]] const Array<OneD, const NekDouble> &input,
722 [[maybe_unused]] Array<OneD, NekDouble> &output,
723 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
724 {
725 ASSERTL0(false, "Not valid for this operator.");
726 }
727
728protected:
729 const int m_nquad0;
730 const int m_nquad1;
731 const int m_nquad2;
732 const int m_nmodes0;
733 const int m_nmodes1;
734 const int m_nmodes2;
738 const bool m_colldir0;
739 const bool m_colldir1;
740 const bool m_colldir2;
741
742private:
743 BwdTrans_SumFac_Hex(vector<LocalRegions::ExpansionSharedPtr> pCollExp,
745 StdRegions::FactorMap factors)
746 : Operator(pCollExp, pGeomData, factors), BwdTrans_Helper(),
747 m_nquad0(pCollExp[0]->GetNumPoints(0)),
748 m_nquad1(pCollExp[0]->GetNumPoints(1)),
749 m_nquad2(pCollExp[0]->GetNumPoints(2)),
750 m_nmodes0(pCollExp[0]->GetBasisNumModes(0)),
751 m_nmodes1(pCollExp[0]->GetBasisNumModes(1)),
752 m_nmodes2(pCollExp[0]->GetBasisNumModes(2)),
753 m_base0(pCollExp[0]->GetBasis(0)->GetBdata()),
754 m_base1(pCollExp[0]->GetBasis(1)->GetBdata()),
755 m_base2(pCollExp[0]->GetBasis(2)->GetBdata()),
756 m_colldir0(pCollExp[0]->GetBasis(0)->Collocation()),
757 m_colldir1(pCollExp[0]->GetBasis(1)->Collocation()),
758 m_colldir2(pCollExp[0]->GetBasis(2)->Collocation())
759 {
762 }
763};
764
765/// Factory initialisation for the BwdTrans_SumFac_Hex operator
766OperatorKey BwdTrans_SumFac_Hex::m_type =
768 OperatorKey(eHexahedron, eBwdTrans, eSumFac, false),
769 BwdTrans_SumFac_Hex::create, "BwdTrans_SumFac_Hex");
770
771/**
772 * @brief Backward transform operator using sum-factorisation (Tet)
773 */
774class BwdTrans_SumFac_Tet final : virtual public Operator,
775 virtual public BwdTrans_Helper
776{
777public:
779
780 ~BwdTrans_SumFac_Tet() final = default;
781
782 void operator()(const Array<OneD, const NekDouble> &input,
783 Array<OneD, NekDouble> &output0,
784 [[maybe_unused]] Array<OneD, NekDouble> &output1,
785 [[maybe_unused]] Array<OneD, NekDouble> &output2,
786 Array<OneD, NekDouble> &wsp) final
787 {
788 ASSERTL1(wsp.size() == m_wspSize, "Incorrect workspace size");
789
790 Array<OneD, NekDouble> tmp = wsp;
792 tmp + m_numElmt * m_nquad2 * m_nmodes0 *
793 (2 * m_nmodes1 - m_nmodes0 + 1) / 2;
794
795 int mode = 0;
796 int mode1 = 0;
797 int cnt = 0;
798 int ncoeffs = m_stdExp->GetNcoeffs();
799
800 // Perform summation over '2' direction
801 for (int i = 0; i < m_nmodes0; ++i)
802 {
803 for (int j = 0; j < m_nmodes1 - i; ++j, ++cnt)
804 {
805 Blas::Dgemm('N', 'N', m_nquad2, m_numElmt, m_nmodes2 - i - j,
806 1.0, m_base2.data() + mode * m_nquad2, m_nquad2,
807 input.data() + mode1, ncoeffs, 0.0,
808 tmp.data() + cnt * m_nquad2 * m_numElmt, m_nquad2);
809 mode += m_nmodes2 - i - j;
810 mode1 += m_nmodes2 - i - j;
811 }
812
813 // increment mode in case m_nmodes1!=m_nmodes2
814 mode += (m_nmodes2 - m_nmodes1) * (m_nmodes2 - m_nmodes1 + 1) / 2;
815 }
816
817 // vertex mode - currently (1+c)/2 x (1-b)/2 x (1-a)/2
818 // component is evaluated
819 if (m_sortTopEdge)
820 {
821 for (int i = 0; i < m_numElmt; ++i)
822 {
823 // top singular vertex
824 // (1+c)/2 x (1+b)/2 x (1-a)/2 component
825 Blas::Daxpy(m_nquad2, input[1 + i * ncoeffs],
826 m_base2.data() + m_nquad2, 1,
827 &tmp[m_nquad2 * m_numElmt] + i * m_nquad2, 1);
828
829 // top singular vertex
830 // (1+c)/2 x (1-b)/2 x (1+a)/2 component
832 m_nquad2, input[1 + i * ncoeffs], m_base2.data() + m_nquad2,
833 1, &tmp[m_nmodes1 * m_nquad2 * m_numElmt] + i * m_nquad2,
834 1);
835 }
836 }
837
838 // Perform summation over '1' direction
839 mode = 0;
840 for (int i = 0; i < m_nmodes0; ++i)
841 {
843 1.0, m_base1.data() + mode * m_nquad1, m_nquad1,
844 tmp.data() + mode * m_nquad2 * m_numElmt,
845 m_nquad2 * m_numElmt, 0.0,
846 tmp1.data() + i * m_nquad1 * m_nquad2 * m_numElmt,
847 m_nquad1);
848 mode += m_nmodes1 - i;
849 }
850
851 // fix for modified basis by adding additional split of
852 // top and base singular vertex modes as well as singular
853 // edge
854 if (m_sortTopEdge)
855 {
856 // this could probably be a dgemv or higher if we
857 // made a specialised m_base1[m_nuqad1] array
858 // containing multiply copies
859 for (int i = 0; i < m_numElmt; ++i)
860 {
861 // sort out singular vertices and singular
862 // edge components with (1+b)/2 (1+a)/2 form
863 for (int j = 0; j < m_nquad2; ++j)
864 {
866 tmp[m_nquad2 * m_numElmt + i * m_nquad2 + j],
867 m_base1.data() + m_nquad1, 1,
868 &tmp1[m_nquad1 * m_nquad2 * m_numElmt] +
869 i * m_nquad1 * m_nquad2 + j * m_nquad1,
870 1);
871 }
872 }
873 }
874
875 // Perform summation over '0' direction
877 m_nmodes0, 1.0, m_base0.data(), m_nquad0, tmp1.data(),
878 m_nquad1 * m_nquad2 * m_numElmt, 0.0, output0.data(),
879 m_nquad0);
880 }
881
882 void operator()([[maybe_unused]] int dir,
883 [[maybe_unused]] const Array<OneD, const NekDouble> &input,
884 [[maybe_unused]] Array<OneD, NekDouble> &output,
885 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
886 {
887 ASSERTL0(false, "Not valid for this operator.");
888 }
889
890protected:
891 const int m_nquad0;
892 const int m_nquad1;
893 const int m_nquad2;
894 const int m_nmodes0;
895 const int m_nmodes1;
896 const int m_nmodes2;
901
902private:
903 BwdTrans_SumFac_Tet(vector<LocalRegions::ExpansionSharedPtr> pCollExp,
905 StdRegions::FactorMap factors)
906 : Operator(pCollExp, pGeomData, factors), BwdTrans_Helper(),
907 m_nquad0(m_stdExp->GetNumPoints(0)),
908 m_nquad1(m_stdExp->GetNumPoints(1)),
909 m_nquad2(m_stdExp->GetNumPoints(2)),
910 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
911 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
912 m_nmodes2(m_stdExp->GetBasisNumModes(2)),
913 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
914 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
915 m_base2(m_stdExp->GetBasis(2)->GetBdata())
916 {
918 (2 * m_nmodes1 - m_nmodes0 + 1) / 2 +
920
921 if (m_stdExp->GetBasis(0)->GetBasisType() == LibUtilities::eModified_A)
922 {
923 m_sortTopEdge = true;
924 }
925 else
926 {
927 m_sortTopEdge = false;
928 }
929 }
930};
931
932/// Factory initialisation for the BwdTrans_SumFac_Tet operator
933OperatorKey BwdTrans_SumFac_Tet::m_type =
935 OperatorKey(eTetrahedron, eBwdTrans, eSumFac, false),
936 BwdTrans_SumFac_Tet::create, "BwdTrans_SumFac_Tet");
937
938/**
939 * @brief Backward transform operator using sum-factorisation (Prism)
940 */
941class BwdTrans_SumFac_Prism final : virtual public Operator,
942 virtual public BwdTrans_Helper
943{
944public:
946
947 ~BwdTrans_SumFac_Prism() final = default;
948
949 void operator()(const Array<OneD, const NekDouble> &input,
950 Array<OneD, NekDouble> &output0,
951 [[maybe_unused]] Array<OneD, NekDouble> &output1,
952 [[maybe_unused]] Array<OneD, NekDouble> &output2,
953 Array<OneD, NekDouble> &wsp) final
954 {
955 ASSERTL1(wsp.size() == m_wspSize, "Incorrect workspace size");
956
957 // Assign second half of workspace for 2nd DGEMM operation.
958 int totmodes = m_stdExp->GetNcoeffs();
959
962
964 int i = 0;
965 int j = 0;
966 int mode = 0;
967 int mode1 = 0;
968 int cnt = 0;
969 for (i = mode = mode1 = 0; i < m_nmodes0; ++i)
970 {
971 cnt = i * m_nquad2 * m_numElmt;
972 for (j = 0; j < m_nmodes1; ++j)
973 {
974 Blas::Dgemm('N', 'N', m_nquad2, m_numElmt, m_nmodes2 - i, 1.0,
975 m_base2.data() + mode * m_nquad2, m_nquad2,
976 input.data() + mode1, totmodes, 0.0,
977 &wsp[j * m_nquad2 * m_numElmt * m_nmodes0 + cnt],
978 m_nquad2);
979 mode1 += m_nmodes2 - i;
980 }
981 mode += m_nmodes2 - i;
982 }
983
984 // fix for modified basis by splitting top vertex mode
985 if (m_sortTopVertex)
986 {
987 for (j = 0; j < m_nmodes1; ++j)
988 {
989 for (i = 0; i < m_numElmt; ++i)
990 {
992 input[1 + i * totmodes + j * m_nmodes2],
993 m_base2.data() + m_nquad2, 1,
994 &wsp[j * m_nquad2 * m_numElmt * m_nmodes0 +
996 i * m_nquad2,
997 1);
998 }
999 }
1000 // Believe this could be made into a m_nmodes1
1001 // dgemv if we made an array of m_numElmt copies
1002 // of m_base2[m_quad2] (which are of size
1003 // m_nquad2.
1004 }
1005
1006 // Perform summation over '1' direction
1008 m_nmodes1, 1.0, m_base1.data(), m_nquad1, wsp.data(),
1009 m_nquad2 * m_numElmt * m_nmodes0, 0.0, wsp2.data(),
1010 m_nquad1);
1011
1012 // Perform summation over '0' direction
1014 m_nmodes0, 1.0, m_base0.data(), m_nquad0, wsp2.data(),
1015 m_nquad1 * m_nquad2 * m_numElmt, 0.0, output0.data(),
1016 m_nquad0);
1017 }
1018
1019 void operator()([[maybe_unused]] int dir,
1020 [[maybe_unused]] const Array<OneD, const NekDouble> &input,
1021 [[maybe_unused]] Array<OneD, NekDouble> &output,
1022 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
1023 {
1024 ASSERTL0(false, "Not valid for this operator.");
1025 }
1026
1027protected:
1028 const int m_nquad0;
1029 const int m_nquad1;
1030 const int m_nquad2;
1031 const int m_nmodes0;
1032 const int m_nmodes1;
1033 const int m_nmodes2;
1038
1039private:
1040 BwdTrans_SumFac_Prism(vector<LocalRegions::ExpansionSharedPtr> pCollExp,
1042 StdRegions::FactorMap factors)
1043 : Operator(pCollExp, pGeomData, factors), BwdTrans_Helper(),
1044 m_nquad0(m_stdExp->GetNumPoints(0)),
1045 m_nquad1(m_stdExp->GetNumPoints(1)),
1046 m_nquad2(m_stdExp->GetNumPoints(2)),
1047 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
1048 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
1049 m_nmodes2(m_stdExp->GetBasisNumModes(2)),
1050 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
1051 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
1052 m_base2(m_stdExp->GetBasis(2)->GetBdata())
1053 {
1056
1057 if (m_stdExp->GetBasis(0)->GetBasisType() == LibUtilities::eModified_A)
1058 {
1059 m_sortTopVertex = true;
1060 }
1061 else
1062 {
1063 m_sortTopVertex = false;
1064 }
1065 }
1066};
1067
1068/// Factory initialisation for the BwdTrans_SumFac_Prism operator
1069OperatorKey BwdTrans_SumFac_Prism::m_type =
1071 OperatorKey(ePrism, eBwdTrans, eSumFac, false),
1072 BwdTrans_SumFac_Prism::create, "BwdTrans_SumFac_Prism");
1073
1074/**
1075 * @brief Backward transform operator using sum-factorisation (Pyr)
1076 */
1077class BwdTrans_SumFac_Pyr final : virtual public Operator,
1078 virtual public BwdTrans_Helper
1079{
1080public:
1082
1083 ~BwdTrans_SumFac_Pyr() final = default;
1084
1085 void operator()(const Array<OneD, const NekDouble> &input,
1086 Array<OneD, NekDouble> &output0,
1087 [[maybe_unused]] Array<OneD, NekDouble> &output1,
1088 [[maybe_unused]] Array<OneD, NekDouble> &output2,
1089 Array<OneD, NekDouble> &wsp) final
1090 {
1091 ASSERTL1(wsp.size() == m_wspSize, "Incorrect workspace size");
1092
1093 // Assign second half of workspace for 2nd DGEMM operation.
1094 int totmodes = m_stdExp->GetNcoeffs();
1095
1098
1100 int i = 0;
1101 int j = 0;
1102 int mode = 0;
1103 int mode1 = 0;
1104 int cnt = 0;
1105 for (i = 0; i < m_nmodes0; ++i)
1106 {
1107 for (j = 0; j < m_nmodes1; ++j, ++cnt)
1108 {
1109 int ijmax = max(i, j);
1110 Blas::Dgemm('N', 'N', m_nquad2, m_numElmt, m_nmodes2 - ijmax,
1111 1.0, m_base2.data() + mode * m_nquad2, m_nquad2,
1112 input.data() + mode1, totmodes, 0.0,
1113 wsp.data() + cnt * m_nquad2 * m_numElmt, m_nquad2);
1114 mode += m_nmodes2 - ijmax;
1115 mode1 += m_nmodes2 - ijmax;
1116 }
1117
1118 // increment mode in case order1!=order2
1119 for (j = m_nmodes1; j < m_nmodes2; ++j)
1120 {
1121 mode += m_nmodes2 - j;
1122 }
1123 }
1124
1125 // vertex mode - currently (1+c)/2 x (1-b)/2 x (1-a)/2
1126 // component is evaluated
1127 if (m_sortTopVertex)
1128 {
1129 for (i = 0; i < m_numElmt; ++i)
1130 {
1131 // top singular vertex
1132 // (1+c)/2 x (1+b)/2 x (1-a)/2 component
1133 Blas::Daxpy(m_nquad2, input[1 + i * totmodes],
1134 m_base2.data() + m_nquad2, 1,
1135 &wsp[m_nquad2 * m_numElmt] + i * m_nquad2, 1);
1136
1137 // top singular vertex
1138 // (1+c)/2 x (1-b)/2 x (1+a)/2 component
1140 m_nquad2, input[1 + i * totmodes],
1141 m_base2.data() + m_nquad2, 1,
1142 &wsp[m_nmodes1 * m_nquad2 * m_numElmt] + i * m_nquad2, 1);
1143
1144 // top singular vertex
1145 // (1+c)/2 x (1+b)/2 x (1+a)/2 component
1146 Blas::Daxpy(m_nquad2, input[1 + i * totmodes],
1147 m_base2.data() + m_nquad2, 1,
1148 &wsp[(m_nmodes1 + 1) * m_nquad2 * m_numElmt] +
1149 i * m_nquad2,
1150 1);
1151 }
1152 }
1153
1154 // Perform summation over '1' direction
1155 mode = 0;
1156 for (i = 0; i < m_nmodes0; ++i)
1157 {
1159 1.0, m_base1.data(), m_nquad1,
1160 wsp.data() + mode * m_nquad2 * m_numElmt,
1161 m_nquad2 * m_numElmt, 0.0,
1162 wsp2.data() + i * m_nquad1 * m_nquad2 * m_numElmt,
1163 m_nquad1);
1164 mode += m_nmodes1;
1165 }
1166
1167 // Perform summation over '0' direction
1169 m_nmodes0, 1.0, m_base0.data(), m_nquad0, wsp2.data(),
1170 m_nquad1 * m_nquad2 * m_numElmt, 0.0, output0.data(),
1171 m_nquad0);
1172 }
1173
1174 void operator()([[maybe_unused]] int dir,
1175 [[maybe_unused]] const Array<OneD, const NekDouble> &input,
1176 [[maybe_unused]] Array<OneD, NekDouble> &output,
1177 [[maybe_unused]] Array<OneD, NekDouble> &wsp) final
1178 {
1179 ASSERTL0(false, "Not valid for this operator.");
1180 }
1181
1182protected:
1183 const int m_nquad0;
1184 const int m_nquad1;
1185 const int m_nquad2;
1186 const int m_nmodes0;
1187 const int m_nmodes1;
1188 const int m_nmodes2;
1193
1194private:
1195 BwdTrans_SumFac_Pyr(vector<LocalRegions::ExpansionSharedPtr> pCollExp,
1197 StdRegions::FactorMap factors)
1198 : Operator(pCollExp, pGeomData, factors), BwdTrans_Helper(),
1199 m_nquad0(m_stdExp->GetNumPoints(0)),
1200 m_nquad1(m_stdExp->GetNumPoints(1)),
1201 m_nquad2(m_stdExp->GetNumPoints(2)),
1202 m_nmodes0(m_stdExp->GetBasisNumModes(0)),
1203 m_nmodes1(m_stdExp->GetBasisNumModes(1)),
1204 m_nmodes2(m_stdExp->GetBasisNumModes(2)),
1205 m_base0(m_stdExp->GetBasis(0)->GetBdata()),
1206 m_base1(m_stdExp->GetBasis(1)->GetBdata()),
1207 m_base2(m_stdExp->GetBasis(2)->GetBdata())
1208 {
1210
1211 if (m_stdExp->GetBasis(0)->GetBasisType() == LibUtilities::eModified_A)
1212 {
1213 m_sortTopVertex = true;
1214 }
1215 else
1216 {
1217 m_sortTopVertex = false;
1218 }
1219 }
1220};
1221
1222/// Factory initialisation for the BwdTrans_SumFac_Pyr operator
1223OperatorKey BwdTrans_SumFac_Pyr::m_type =
1225 OperatorKey(ePyramid, eBwdTrans, eSumFac, false),
1226 BwdTrans_SumFac_Pyr::create, "BwdTrans_SumFac_Pyr");
1227
1228} // namespace Nektar::Collections
#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)
Definition Operator.h:43
Backward transform help class to calculate the size of the collection that is given as an input and a...
Definition BwdTrans.cpp:64
Backward transform operator using default StdRegions operator.
Definition BwdTrans.cpp:250
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Definition BwdTrans.cpp:272
BwdTrans_IterPerExp(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Definition BwdTrans.cpp:281
Backward transform operator using matrix free operators.
Definition BwdTrans.cpp:163
std::shared_ptr< MatrixFree::BwdTrans > m_oper
Definition BwdTrans.cpp:188
BwdTrans_MatrixFree(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Definition BwdTrans.cpp:190
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Definition BwdTrans.cpp:178
Backward transform operator using LocalRegions implementation.
Definition BwdTrans.cpp:328
vector< LocalRegions::ExpansionSharedPtr > m_expList
Definition BwdTrans.cpp:360
BwdTrans_NoCollection(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Definition BwdTrans.cpp:363
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Definition BwdTrans.cpp:351
Backward transform operator using standard matrix approach.
Definition BwdTrans.cpp:80
BwdTrans_StdMat(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Definition BwdTrans.cpp:110
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Definition BwdTrans.cpp:98
Backward transform operator using sum-factorisation (Hex)
Definition BwdTrans.cpp:670
Array< OneD, const NekDouble > m_base1
Definition BwdTrans.cpp:736
BwdTrans_SumFac_Hex(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Definition BwdTrans.cpp:743
Array< OneD, const NekDouble > m_base2
Definition BwdTrans.cpp:737
Array< OneD, const NekDouble > m_base0
Definition BwdTrans.cpp:735
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Definition BwdTrans.cpp:720
Backward transform operator using sum-factorisation (Prism)
Definition BwdTrans.cpp:943
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
BwdTrans_SumFac_Prism(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_base0
Array< OneD, const NekDouble > m_base1
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(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Array< OneD, const NekDouble > m_base1
Array< OneD, const NekDouble > m_base0
Backward transform operator using sum-factorisation (Quad)
Definition BwdTrans.cpp:476
Array< OneD, const NekDouble > m_base1
Definition BwdTrans.cpp:546
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Definition BwdTrans.cpp:530
Array< OneD, const NekDouble > m_base0
Definition BwdTrans.cpp:545
BwdTrans_SumFac_Quad(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Definition BwdTrans.cpp:549
Backward transform operator using sum-factorisation (Segment)
Definition BwdTrans.cpp:411
BwdTrans_SumFac_Seg(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Definition BwdTrans.cpp:452
Array< OneD, const NekDouble > m_base0
Definition BwdTrans.cpp:449
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Definition BwdTrans.cpp:437
Backward transform operator using sum-factorisation (Tet)
Definition BwdTrans.cpp:776
BwdTrans_SumFac_Tet(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Definition BwdTrans.cpp:903
Array< OneD, const NekDouble > m_base1
Definition BwdTrans.cpp:898
Array< OneD, const NekDouble > m_base0
Definition BwdTrans.cpp:897
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Definition BwdTrans.cpp:882
Array< OneD, const NekDouble > m_base2
Definition BwdTrans.cpp:899
Backward transform operator using sum-factorisation (Tri)
Definition BwdTrans.cpp:577
BwdTrans_SumFac_Tri(vector< LocalRegions::ExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData, StdRegions::FactorMap factors)
Definition BwdTrans.cpp:638
Array< OneD, const NekDouble > m_base0
Definition BwdTrans.cpp:633
Array< OneD, const NekDouble > m_base1
Definition BwdTrans.cpp:634
void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp) final
Definition BwdTrans.cpp:620
Base class for operators on a collection of elements.
Definition Operator.h:138
StdRegions::StdExpansionSharedPtr m_stdExp
Definition Operator.h:230
unsigned int m_numElmt
number of elements that the operator is applied on
Definition Operator.h:232
unsigned int m_outputSize
number of modes or quadrature points that are taken as output from an operator
Definition Operator.h:240
unsigned int m_inputSize
number of modes or quadrature points that are passed as input to an operator
Definition Operator.h:237
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
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...
Definition Blas.hpp:324
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.
Definition Blas.hpp:117
std::tuple< LibUtilities::ShapeType, OperatorType, ImplementationType, ExpansionIsNodal > OperatorKey
Key for describing an Operator.
Definition Operator.h:120
std::shared_ptr< CoalescedGeomData > CoalescedGeomDataSharedPtr
OperatorFactory & GetOperatorFactory()
Returns the singleton Operator factory object.
Definition Operator.cpp:44
@ eModified_A
Principle Modified Functions .
Definition BasisType.h:48
ConstFactorMap FactorMap
std::shared_ptr< DNekMat > DNekMatSharedPtr
void Zero(int n, T *x, const int incx)
Zero vector.
Definition Vmath.hpp:273
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition Vmath.hpp:825
STL namespace.
scalarT< T > max(scalarT< T > lhs, scalarT< T > rhs)
Definition scalar.hpp:305