Nektar++
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 
35 #include <boost/core/ignore_unused.hpp>
36 
37 #include <Collections/Operator.h>
38 #include <Collections/Collection.h>
39 
40 using namespace std;
41 
42 namespace Nektar {
43 namespace Collections {
44 
52 
53 /**
54  * @brief Backward transform operator using standard matrix approach.
55  */
56 class BwdTrans_StdMat : public Operator
57 {
58  public:
60 
61  virtual ~BwdTrans_StdMat()
62  {
63  }
64 
65  virtual void operator()(
66  const Array<OneD, const NekDouble> &input,
67  Array<OneD, NekDouble> &output,
68  Array<OneD, NekDouble> &output1,
69  Array<OneD, NekDouble> &output2,
71  {
72  boost::ignore_unused(output1, output2, wsp);
73  Blas::Dgemm('N', 'N', m_mat->GetRows(), m_numElmt,
74  m_mat->GetColumns(), 1.0, m_mat->GetRawPtr(),
75  m_mat->GetRows(), input.get(), m_stdExp->GetNcoeffs(),
76  0.0, output.get(), m_stdExp->GetTotPoints());
77  }
78 
79  virtual void operator()(
80  int dir,
81  const Array<OneD, const NekDouble> &input,
82  Array<OneD, NekDouble> &output,
84  {
85  boost::ignore_unused(dir, input, output, wsp);
86  ASSERTL0(false, "Not valid for this operator.");
87  }
88 
89  protected:
91 
92  private:
94  vector<StdRegions::StdExpansionSharedPtr> pCollExp,
96  : Operator(pCollExp, pGeomData)
97  {
99  m_stdExp->DetShapeType(), *m_stdExp);
100  m_mat = m_stdExp->GetStdMatrix(key);
101  }
102 };
103 
104 /// Factory initialisation for the BwdTrans_StdMat operators
105 OperatorKey BwdTrans_StdMat::m_typeArr[] = {
108  BwdTrans_StdMat::create, "BwdTrans_StdMat_Seg"),
111  BwdTrans_StdMat::create, "BwdTrans_StdMat_Tri"),
114  BwdTrans_StdMat::create, "BwdTrans_StdMat_NodalTri"),
117  BwdTrans_StdMat::create, "BwdTrans_StdMat_Quad"),
120  BwdTrans_StdMat::create, "BwdTrans_StdMat_Tet"),
123  BwdTrans_StdMat::create, "BwdTrans_StdMat_NodalTet"),
126  BwdTrans_StdMat::create, "BwdTrans_StdMat_Pyr"),
129  BwdTrans_StdMat::create, "BwdTrans_StdMat_Prism"),
132  BwdTrans_StdMat::create, "BwdTrans_StdMat_NodalPrism"),
135  BwdTrans_StdMat::create, "BwdTrans_StdMat_Hex"),
138  BwdTrans_StdMat::create, "BwdTrans_SumFac_Pyr")
139 };
140 
141 
142 
143 /**
144  * @brief Backward transform operator using default StdRegions operator
145  */
147 {
148  public:
150 
152  {
153  }
154 
155  virtual void operator()(
156  const Array<OneD, const NekDouble> &input,
157  Array<OneD, NekDouble> &output,
158  Array<OneD, NekDouble> &output1,
159  Array<OneD, NekDouble> &output2,
161  {
162  boost::ignore_unused(output1, output2, wsp);
163 
164  const int nCoeffs = m_stdExp->GetNcoeffs();
165  const int nPhys = m_stdExp->GetTotPoints();
167 
168  for (int i = 0; i < m_numElmt; ++i)
169  {
170  m_stdExp->BwdTrans(input + i*nCoeffs, tmp = output + i*nPhys);
171  }
172  }
173 
174  virtual void operator()(
175  int dir,
176  const Array<OneD, const NekDouble> &input,
177  Array<OneD, NekDouble> &output,
179  {
180  boost::ignore_unused(dir, input, output, wsp);
181  ASSERTL0(false, "Not valid for this operator.");
182  }
183 
184  private:
186  vector<StdRegions::StdExpansionSharedPtr> pCollExp,
187  CoalescedGeomDataSharedPtr pGeomData)
188  : Operator(pCollExp, pGeomData)
189  {
190  }
191 };
192 
193 /// Factory initialisation for the BwdTrans_IterPerExp operators
194 OperatorKey BwdTrans_IterPerExp::m_typeArr[] = {
197  BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_Seg"),
200  BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_Tri"),
203  BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_NodalTri"),
206  BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_Quad"),
209  BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_Tet"),
212  BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_NodalTet"),
215  BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_Pyr"),
218  BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_Prism"),
221  BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_NodalPrism"),
224  BwdTrans_IterPerExp::create, "BwdTrans_IterPerExp_Hex"),
225 };
226 
227 
228 /**
229  * @brief Backward transform operator using LocalRegions implementation.
230  */
232 {
233  public:
235 
237  {
238  }
239 
240  virtual void operator()(
241  const Array<OneD, const NekDouble> &input,
242  Array<OneD, NekDouble> &output,
243  Array<OneD, NekDouble> &output1,
244  Array<OneD, NekDouble> &output2,
246  {
247  boost::ignore_unused(output1, output2, wsp);
248 
249  const int nCoeffs = m_expList[0]->GetNcoeffs();
250  const int nPhys = m_expList[0]->GetTotPoints();
252 
253  for (int i = 0; i < m_numElmt; ++i)
254  {
255  m_expList[i]->BwdTrans(input + i*nCoeffs,
256  tmp = output + i*nPhys);
257  }
258  }
259 
260  virtual void operator()(
261  int dir,
262  const Array<OneD, const NekDouble> &input,
263  Array<OneD, NekDouble> &output,
265  {
266  boost::ignore_unused(dir, input, output, wsp);
267  ASSERTL0(false, "Not valid for this operator.");
268  }
269 
270  protected:
271  vector<StdRegions::StdExpansionSharedPtr> m_expList;
272 
273  private:
275  vector<StdRegions::StdExpansionSharedPtr> pCollExp,
276  CoalescedGeomDataSharedPtr pGeomData)
277  : Operator(pCollExp, pGeomData)
278  {
279  m_expList = pCollExp;
280  }
281 };
282 
283 /// Factory initialisation for the BwdTrans_NoCollection operators
284 OperatorKey BwdTrans_NoCollection::m_typeArr[] = {
287  BwdTrans_NoCollection::create, "BwdTrans_NoCollection_Seg"),
290  BwdTrans_NoCollection::create, "BwdTrans_NoCollection_Tri"),
293  BwdTrans_NoCollection::create, "BwdTrans_NoCollection_NodalTri"),
296  BwdTrans_NoCollection::create, "BwdTrans_NoCollection_Quad"),
299  BwdTrans_NoCollection::create, "BwdTrans_NoCollection_Tet"),
302  BwdTrans_NoCollection::create, "BwdTrans_NoCollection_NodalTet"),
305  BwdTrans_NoCollection::create, "BwdTrans_NoCollection_Pyr"),
308  BwdTrans_NoCollection::create, "BwdTrans_NoCollection_Prism"),
311  BwdTrans_NoCollection::create, "BwdTrans_NoCollection_NodalPrism"),
314  BwdTrans_NoCollection::create, "BwdTrans_NoCollection_Hex"),
315 };
316 
317 
318 /**
319  * @brief Backward transform operator using sum-factorisation (Segment)
320  */
322 {
323  public:
325 
327  {
328  }
329 
330  virtual void operator()(
331  const Array<OneD, const NekDouble> &input,
332  Array<OneD, NekDouble> &output,
333  Array<OneD, NekDouble> &output1,
334  Array<OneD, NekDouble> &output2,
336  {
337  boost::ignore_unused(output1, output2, wsp);
338  if(m_colldir0)
339  {
340  Vmath::Vcopy(m_numElmt*m_nmodes0,input.get(),1,output.get(),1);
341  }
342  else
343  {
344  // out = B0*in;
345  Blas::Dgemm('N','N', m_nquad0, m_numElmt, m_nmodes0,
346  1.0, m_base0.get(), m_nquad0,
347  &input[0], m_nmodes0, 0.0,
348  &output[0], m_nquad0);
349  }
350  }
351 
352  virtual void operator()(
353  int dir,
354  const Array<OneD, const NekDouble> &input,
355  Array<OneD, NekDouble> &output,
357  {
358  boost::ignore_unused(dir, input, output, wsp);
359  ASSERTL0(false, "Not valid for this operator.");
360  }
361 
362 
363  protected:
364  const int m_nquad0;
365  const int m_nmodes0;
366  const bool m_colldir0;
368 
369  private:
371  vector<StdRegions::StdExpansionSharedPtr> pCollExp,
372  CoalescedGeomDataSharedPtr pGeomData)
373  : Operator (pCollExp, pGeomData),
374  m_nquad0 (m_stdExp->GetNumPoints(0)),
375  m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
376  m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
377  m_base0 (m_stdExp->GetBasis(0)->GetBdata())
378  {
379  m_wspSize = 0;
380  }
381 };
382 
383 /// Factory initialisation for the BwdTrans_SumFac_Seg operator
384 OperatorKey BwdTrans_SumFac_Seg::m_type = GetOperatorFactory().
385  RegisterCreatorFunction(
387  BwdTrans_SumFac_Seg::create, "BwdTrans_SumFac_Seg");
388 
389 
390 
391 /**
392  * @brief Backward transform operator using sum-factorisation (Quad)
393  */
395 {
396  public:
398 
400  {
401  }
402 
403  virtual void operator()(
404  const Array<OneD, const NekDouble> &input,
405  Array<OneD, NekDouble> &output,
406  Array<OneD, NekDouble> &output1,
407  Array<OneD, NekDouble> &output2,
409  {
410  boost::ignore_unused(output1, output2);
411 
412  int i = 0;
413  if(m_colldir0 && m_colldir1)
414  {
415  Vmath::Vcopy(m_numElmt*m_nmodes0*m_nmodes1,
416  input.get(), 1, output.get(), 1);
417  }
418  else if(m_colldir0)
419  {
421  = m_stdExp->GetBasis(1)->GetBdata();
422 
423  for(i = 0; i < m_numElmt; ++i)
424  {
425  Blas::Dgemm('N', 'T', m_nquad0, m_nquad1, m_nmodes1,
426  1.0, &input[i*m_nquad0*m_nmodes1], m_nquad0,
427  base1.get(), m_nquad1, 0.0,
428  &output[i*m_nquad0*m_nquad1], m_nquad0);
429  }
430  }
431  else if(m_colldir1)
432  {
433  Blas::Dgemm('N', 'N', m_nquad0, m_nmodes1*m_numElmt, m_nmodes0,
434  1.0, m_base0.get(), m_nquad0,
435  &input[0], m_nmodes0, 0.0,
436  &output[0], m_nquad0);
437  }
438  else
439  {
440  ASSERTL1(wsp.num_elements() == m_wspSize,
441  "Incorrect workspace size");
442 
443  // Those two calls correpsond to the operation
444  // out = B0*in*Transpose(B1);
445  Blas::Dgemm('N', 'N', m_nquad0, m_nmodes1*m_numElmt, m_nmodes0,
446  1.0, m_base0.get(), m_nquad0,
447  &input[0], m_nmodes0, 0.0,
448  &wsp[0], m_nquad0);
449 
450  for(i = 0; i < m_numElmt; ++i)
451  {
452  Blas::Dgemm('N','T', m_nquad0, m_nquad1, m_nmodes1,
453  1.0, &wsp[i*m_nquad0*m_nmodes1], m_nquad0,
454  m_base1.get(), m_nquad1, 0.0,
455  &output[i*m_nquad0*m_nquad1], m_nquad0);
456  }
457  }
458  }
459 
460  virtual void operator()(
461  int dir,
462  const Array<OneD, const NekDouble> &input,
463  Array<OneD, NekDouble> &output,
465  {
466  boost::ignore_unused(dir, input, output, wsp);
467  ASSERTL0(false, "Not valid for this operator.");
468  }
469 
470  protected:
471  const int m_nquad0;
472  const int m_nquad1;
473  const int m_nmodes0;
474  const int m_nmodes1;
475  const bool m_colldir0;
476  const bool m_colldir1;
479 
480  private:
482  vector<StdRegions::StdExpansionSharedPtr> pCollExp,
483  CoalescedGeomDataSharedPtr pGeomData)
484  : Operator (pCollExp, pGeomData),
485  m_nquad0 (m_stdExp->GetNumPoints(0)),
486  m_nquad1 (m_stdExp->GetNumPoints(1)),
487  m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
488  m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
489  m_colldir0(m_stdExp->GetBasis(0)->Collocation()),
490  m_colldir1(m_stdExp->GetBasis(1)->Collocation()),
491  m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
492  m_base1 (m_stdExp->GetBasis(1)->GetBdata())
493  {
494  m_wspSize = m_nquad0*m_nmodes1*m_numElmt;
495  }
496 };
497 
498 /// Factory initialisation for the BwdTrans_SumFac_Quad operator
499 OperatorKey BwdTrans_SumFac_Quad::m_type = GetOperatorFactory().
500  RegisterCreatorFunction(
502  BwdTrans_SumFac_Quad::create, "BwdTrans_SumFac_Quad");
503 
504 
505 /**
506  * @brief Backward transform operator using sum-factorisation (Tri)
507  */
509 {
510  public:
512 
514  {
515  }
516 
517  virtual void operator()(
518  const Array<OneD, const NekDouble> &input,
519  Array<OneD, NekDouble> &output,
520  Array<OneD, NekDouble> &output1,
521  Array<OneD, NekDouble> &output2,
523  {
524  boost::ignore_unused(output1, output2);
525 
526  ASSERTL1(wsp.num_elements() == m_wspSize,
527  "Incorrect workspace size");
528 
529  int ncoeffs = m_stdExp->GetNcoeffs();
530  int i = 0;
531  int mode = 0;
532 
533  for (i = mode = 0; i < m_nmodes0; ++i)
534  {
535  Blas::Dgemm('N', 'N', m_nquad1, m_numElmt, m_nmodes1-i,
536  1.0, m_base1.get()+mode*m_nquad1, m_nquad1,
537  &input[0]+mode, ncoeffs, 0.0,
538  &wsp[i*m_nquad1*m_numElmt], m_nquad1);
539  mode += m_nmodes1-i;
540  }
541 
542  // fix for modified basis by splitting top vertex mode
543  if(m_sortTopVertex)
544  {
545  for(i = 0; i < m_numElmt; ++i)
546  {
547  Blas::Daxpy(m_nquad1, input[1+i*ncoeffs],
548  m_base1.get() + m_nquad1, 1,
549  &wsp[m_nquad1*m_numElmt] + i*m_nquad1, 1);
550  }
551 
552  }
553 
554  Blas::Dgemm('N', 'T', m_nquad0, m_nquad1*m_numElmt, m_nmodes0,
555  1.0, m_base0.get(), m_nquad0,
556  &wsp[0], m_nquad1*m_numElmt, 0.0,
557  &output[0], m_nquad0);
558  }
559 
560  virtual void operator()(
561  int dir,
562  const Array<OneD, const NekDouble> &input,
563  Array<OneD, NekDouble> &output,
565  {
566  boost::ignore_unused(dir, input, output, wsp);
567  ASSERTL0(false, "Not valid for this operator.");
568  }
569 
570 
571  protected:
572  const int m_nquad0;
573  const int m_nquad1;
574  const int m_nmodes0;
575  const int m_nmodes1;
579 
580  private:
582  vector<StdRegions::StdExpansionSharedPtr> pCollExp,
583  CoalescedGeomDataSharedPtr pGeomData)
584  : Operator (pCollExp, pGeomData),
585  m_nquad0 (m_stdExp->GetNumPoints(0)),
586  m_nquad1 (m_stdExp->GetNumPoints(1)),
587  m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
588  m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
589  m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
590  m_base1 (m_stdExp->GetBasis(1)->GetBdata())
591  {
592  m_wspSize = m_nquad0 * m_nmodes1 * m_numElmt;
593  if(m_stdExp->GetBasis(0)->GetBasisType()
595  {
596  m_sortTopVertex = true;
597  }
598  else
599  {
600  m_sortTopVertex = false;
601  }
602  }
603 
604 };
605 
606 /// Factory initialisation for the BwdTrans_SumFac_Tri operator
607 OperatorKey BwdTrans_SumFac_Tri::m_type = GetOperatorFactory().
608  RegisterCreatorFunction(
610  BwdTrans_SumFac_Tri::create, "BwdTrans_SumFac_Tri");
611 
612 
613 /// Backward transform operator using sum-factorisation (Hex)
615 {
616  public:
618 
620  {
621  }
622 
623  virtual void operator()(
624  const Array<OneD, const NekDouble> &input,
625  Array<OneD, NekDouble> &output,
626  Array<OneD, NekDouble> &output1,
627  Array<OneD, NekDouble> &output2,
629  {
630  boost::ignore_unused(output1, output2);
631 
632  if(m_colldir0 && m_colldir1 && m_colldir2)
633  {
634  Vmath::Vcopy(m_numElmt * m_nmodes0 * m_nmodes1 * m_nmodes2,
635  input.get(), 1,
636  output.get(), 1);
637  }
638  else
639  {
640  ASSERTL1(wsp.num_elements() == m_wspSize,
641  "Incorrect workspace size");
642 
643  // Assign second half of workspace for 2nd DGEMM operation.
644  int totmodes = m_nmodes0*m_nmodes1*m_nmodes2;
645 
647  = wsp + m_nmodes0*m_nmodes1*m_nquad2*m_numElmt;
648 
649  //loop over elements and do bwd trans wrt c
650  for(int n = 0; n < m_numElmt; ++n)
651  {
652  Blas::Dgemm('N', 'T', m_nquad2, m_nmodes0*m_nmodes1,
653  m_nmodes2, 1.0, m_base2.get(), m_nquad2,
654  &input[n*totmodes], m_nmodes0*m_nmodes1, 0.0,
655  &wsp[n*m_nquad2], m_nquad2*m_numElmt);
656  }
657 
658  // trans wrt b
659  Blas::Dgemm('N', 'T', m_nquad1, m_nquad2*m_numElmt*m_nmodes0,
660  m_nmodes1, 1.0, m_base1.get(), m_nquad1,
661  wsp.get(), m_nquad2*m_numElmt*m_nmodes0, 0.0,
662  wsp2.get(), m_nquad1);
663 
664  // trans wrt a
665  Blas::Dgemm('N', 'T', m_nquad0, m_nquad1*m_nquad2*m_numElmt,
666  m_nmodes0, 1.0, m_base0.get(), m_nquad0,
667  wsp2.get(), m_nquad1*m_nquad2*m_numElmt, 0.0,
668  output.get(), m_nquad0);
669  }
670  }
671 
672  virtual void operator()(
673  int dir,
674  const Array<OneD, const NekDouble> &input,
675  Array<OneD, NekDouble> &output,
677  {
678  boost::ignore_unused(dir, input, output, wsp);
679  ASSERTL0(false, "Not valid for this operator.");
680  }
681 
682  protected:
683  const int m_nquad0;
684  const int m_nquad1;
685  const int m_nquad2;
686  const int m_nmodes0;
687  const int m_nmodes1;
688  const int m_nmodes2;
692  const bool m_colldir0;
693  const bool m_colldir1;
694  const bool m_colldir2;
695 
696  private:
698  vector<StdRegions::StdExpansionSharedPtr> pCollExp,
699  CoalescedGeomDataSharedPtr pGeomData)
700  : Operator (pCollExp, pGeomData),
701  m_nquad0 (pCollExp[0]->GetNumPoints(0)),
702  m_nquad1 (pCollExp[0]->GetNumPoints(1)),
703  m_nquad2 (pCollExp[0]->GetNumPoints(2)),
704  m_nmodes0 (pCollExp[0]->GetBasisNumModes(0)),
705  m_nmodes1 (pCollExp[0]->GetBasisNumModes(1)),
706  m_nmodes2 (pCollExp[0]->GetBasisNumModes(2)),
707  m_base0 (pCollExp[0]->GetBasis(0)->GetBdata()),
708  m_base1 (pCollExp[0]->GetBasis(1)->GetBdata()),
709  m_base2 (pCollExp[0]->GetBasis(2)->GetBdata()),
710  m_colldir0(pCollExp[0]->GetBasis(0)->Collocation()),
711  m_colldir1(pCollExp[0]->GetBasis(1)->Collocation()),
712  m_colldir2(pCollExp[0]->GetBasis(2)->Collocation())
713  {
714  m_wspSize = m_numElmt*m_nmodes0*(m_nmodes1*m_nquad2 +
715  m_nquad1*m_nquad2);
716  }
717 };
718 
719 /// Factory initialisation for the BwdTrans_SumFac_Hex operator
720 OperatorKey BwdTrans_SumFac_Hex::m_type = GetOperatorFactory().
721  RegisterCreatorFunction(
723  BwdTrans_SumFac_Hex::create, "BwdTrans_SumFac_Hex");
724 
725 
726 /**
727  * @brief Backward transform operator using sum-factorisation (Tet)
728  */
730 {
731  public:
733 
735  {
736  }
737 
738  virtual void operator()(
739  const Array<OneD, const NekDouble> &input,
740  Array<OneD, NekDouble> &output,
741  Array<OneD, NekDouble> &output1,
742  Array<OneD, NekDouble> &output2,
744  {
745  boost::ignore_unused(output1, output2);
746 
747  ASSERTL1(wsp.num_elements() == m_wspSize,
748  "Incorrect workspace size");
749 
750  Array<OneD, NekDouble > tmp = wsp;
751  Array<OneD, NekDouble > tmp1 = tmp
752  + m_numElmt*m_nquad2*m_nmodes0*(2*m_nmodes1-m_nmodes0+1)/2;
753 
754  int i = 0;
755  int j = 0;
756  int mode = 0;
757  int mode1 = 0;
758  int cnt = 0;
759  int ncoeffs = m_stdExp->GetNcoeffs();
760 
761  // Perform summation over '2' direction
762  for(i = 0; i < m_nmodes0; ++i)
763  {
764  for(j = 0; j < m_nmodes1-i; ++j, ++cnt)
765  {
766  Blas::Dgemm('N', 'N', m_nquad2, m_numElmt, m_nmodes2-i-j,
767  1.0, m_base2.get()+mode*m_nquad2, m_nquad2,
768  input.get()+ mode1, ncoeffs, 0.0,
769  tmp.get() + cnt*m_nquad2*m_numElmt, m_nquad2);
770  mode += m_nmodes2-i-j;
771  mode1 += m_nmodes2-i-j;
772  }
773 
774  //increment mode in case m_nmodes1!=m_nmodes2
775  mode += (m_nmodes2-m_nmodes1)*(m_nmodes2-m_nmodes1+1)/2;
776  }
777 
778  // vertex mode - currently (1+c)/2 x (1-b)/2 x (1-a)/2
779  // component is evaluated
780  if(m_sortTopEdge)
781  {
782  for(i = 0; i < m_numElmt; ++i)
783  {
784  // top singular vertex
785  // (1+c)/2 x (1+b)/2 x (1-a)/2 component
786  Blas::Daxpy(m_nquad2, input[1+i*ncoeffs],
787  m_base2.get() + m_nquad2, 1,
788  &tmp[m_nquad2*m_numElmt] + i*m_nquad2, 1);
789 
790  // top singular vertex
791  // (1+c)/2 x (1-b)/2 x (1+a)/2 component
792  Blas::Daxpy(m_nquad2, input[1+i*ncoeffs],
793  m_base2.get() + m_nquad2, 1,
794  &tmp[m_nmodes1*m_nquad2*m_numElmt]
795  + i*m_nquad2, 1);
796  }
797  }
798 
799  // Perform summation over '1' direction
800  mode = 0;
801  for(i = 0; i < m_nmodes0; ++i)
802  {
803  Blas::Dgemm('N', 'T', m_nquad1, m_nquad2*m_numElmt, m_nmodes1-i,
804  1.0, m_base1.get()+mode*m_nquad1, m_nquad1,
805  tmp.get() + mode*m_nquad2*m_numElmt,
806  m_nquad2*m_numElmt,
807  0.0, tmp1.get() + i*m_nquad1*m_nquad2*m_numElmt,
808  m_nquad1);
809  mode += m_nmodes1-i;
810  }
811 
812  // fix for modified basis by adding additional split of
813  // top and base singular vertex modes as well as singular
814  // edge
815  if(m_sortTopEdge)
816  {
817  // this could probably be a dgemv or higher if we
818  // made a specialised m_base1[m_nuqad1] array
819  // containing multiply copies
820  for(i = 0; i < m_numElmt; ++i)
821  {
822  // sort out singular vertices and singular
823  // edge components with (1+b)/2 (1+a)/2 form
824  for(int j = 0; j < m_nquad2; ++j)
825  {
826  Blas::Daxpy(m_nquad1,
827  tmp[m_nquad2*m_numElmt + i*m_nquad2 + j],
828  m_base1.get() + m_nquad1,1,
829  &tmp1[m_nquad1*m_nquad2*m_numElmt]
830  + i*m_nquad1*m_nquad2 + j*m_nquad1, 1);
831  }
832  }
833  }
834 
835  // Perform summation over '0' direction
836  Blas::Dgemm('N', 'T', m_nquad0, m_nquad1*m_nquad2*m_numElmt,
837  m_nmodes0, 1.0, m_base0.get(), m_nquad0,
838  tmp1.get(), m_nquad1*m_nquad2*m_numElmt, 0.0,
839  output.get(), m_nquad0);
840 
841  }
842 
843  virtual void operator()(
844  int dir,
845  const Array<OneD, const NekDouble> &input,
846  Array<OneD, NekDouble> &output,
848  {
849  boost::ignore_unused(dir, input, output, wsp);
850  ASSERTL0(false, "Not valid for this operator.");
851  }
852 
853  protected:
854  const int m_nquad0;
855  const int m_nquad1;
856  const int m_nquad2;
857  const int m_nmodes0;
858  const int m_nmodes1;
859  const int m_nmodes2;
864 
865  private:
867  vector<StdRegions::StdExpansionSharedPtr> pCollExp,
868  CoalescedGeomDataSharedPtr pGeomData)
869  : Operator (pCollExp, pGeomData),
870  m_nquad0 (m_stdExp->GetNumPoints(0)),
871  m_nquad1 (m_stdExp->GetNumPoints(1)),
872  m_nquad2 (m_stdExp->GetNumPoints(2)),
873  m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
874  m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
875  m_nmodes2 (m_stdExp->GetBasisNumModes(2)),
876  m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
877  m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
878  m_base2 (m_stdExp->GetBasis(2)->GetBdata())
879  {
880  m_wspSize = m_numElmt
881  * (m_nquad2*m_nmodes0*(2*m_nmodes1-m_nmodes0+1)/2
882  + m_nquad2*m_nquad1*m_nmodes0);
883 
884  if(m_stdExp->GetBasis(0)->GetBasisType()
886  {
887  m_sortTopEdge = true;
888  }
889  else
890  {
891  m_sortTopEdge = false;
892  }
893  }
894 };
895 
896 /// Factory initialisation for the BwdTrans_SumFac_Tet operator
897 OperatorKey BwdTrans_SumFac_Tet::m_type = GetOperatorFactory().
898  RegisterCreatorFunction(
900  BwdTrans_SumFac_Tet::create, "BwdTrans_SumFac_Tet");
901 
902 
903 /**
904  * @brief Backward transform operator using sum-factorisation (Prism)
905  */
907 {
908  public:
910 
912  {
913  }
914 
915  virtual void operator()(
916  const Array<OneD, const NekDouble> &input,
917  Array<OneD, NekDouble> &output,
918  Array<OneD, NekDouble> &output1,
919  Array<OneD, NekDouble> &output2,
921  {
922  boost::ignore_unused(output1, output2);
923 
924  ASSERTL1(wsp.num_elements() == m_wspSize,
925  "Incorrect workspace size");
926 
927  // Assign second half of workspace for 2nd DGEMM operation.
928  int totmodes = m_stdExp->GetNcoeffs();
929 
931  = wsp + m_nmodes0*m_nmodes1*m_nquad2*m_numElmt;
932 
933  Vmath::Zero(m_nmodes0*m_nmodes1*m_nquad2*m_numElmt, wsp, 1);
934  int i = 0;
935  int j = 0;
936  int mode = 0;
937  int mode1 = 0;
938  int cnt = 0;
939  for (i = mode = mode1 = 0; i < m_nmodes0; ++i)
940  {
941  cnt = i * m_nquad2 * m_numElmt;
942  for (j = 0; j < m_nmodes1; ++j)
943  {
944  Blas::Dgemm('N', 'N', m_nquad2, m_numElmt, m_nmodes2-i,
945  1.0, m_base2.get()+mode*m_nquad2, m_nquad2,
946  input.get()+mode1, totmodes, 0.0,
947  &wsp[j*m_nquad2*m_numElmt*m_nmodes0+ cnt],
948  m_nquad2);
949  mode1 += m_nmodes2-i;
950  }
951  mode += m_nmodes2-i;
952  }
953 
954  // fix for modified basis by splitting top vertex mode
955  if(m_sortTopVertex)
956  {
957  for(j = 0; j < m_nmodes1; ++j)
958  {
959  for(i = 0; i < m_numElmt; ++i)
960  {
961  Blas::Daxpy(m_nquad2,input[1+i*totmodes+j*m_nmodes2],
962  m_base2.get()+m_nquad2,1,
963  &wsp[j*m_nquad2*m_numElmt*m_nmodes0 +
964  m_nquad2*m_numElmt]+i*m_nquad2,1);
965  }
966  }
967  // Believe this could be made into a m_nmodes1
968  // dgemv if we made an array of m_numElmt copies
969  // of m_base2[m_quad2] (which are of size
970  // m_nquad2.
971  }
972 
973  // Perform summation over '1' direction
974  Blas::Dgemm('N', 'T', m_nquad1, m_nquad2*m_numElmt*m_nmodes0,
975  m_nmodes1,1.0, m_base1.get(), m_nquad1,
976  wsp.get(), m_nquad2*m_numElmt*m_nmodes0,
977  0.0, wsp2.get(), m_nquad1);
978 
979 
980  // Perform summation over '0' direction
981  Blas::Dgemm('N', 'T', m_nquad0, m_nquad1*m_nquad2*m_numElmt,
982  m_nmodes0, 1.0, m_base0.get(), m_nquad0,
983  wsp2.get(), m_nquad1*m_nquad2*m_numElmt,
984  0.0, output.get(), m_nquad0);
985  }
986 
987  virtual void operator()(
988  int dir,
989  const Array<OneD, const NekDouble> &input,
990  Array<OneD, NekDouble> &output,
992  {
993  boost::ignore_unused(dir, input, output, wsp);
994  ASSERTL0(false, "Not valid for this operator.");
995  }
996 
997 
998  protected:
999  const int m_nquad0;
1000  const int m_nquad1;
1001  const int m_nquad2;
1002  const int m_nmodes0;
1003  const int m_nmodes1;
1004  const int m_nmodes2;
1009 
1010  private:
1012  vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1013  CoalescedGeomDataSharedPtr pGeomData)
1014  : Operator (pCollExp, pGeomData),
1015  m_nquad0 (m_stdExp->GetNumPoints(0)),
1016  m_nquad1 (m_stdExp->GetNumPoints(1)),
1017  m_nquad2 (m_stdExp->GetNumPoints(2)),
1018  m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
1019  m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
1020  m_nmodes2 (m_stdExp->GetBasisNumModes(2)),
1021  m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
1022  m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
1023  m_base2 (m_stdExp->GetBasis(2)->GetBdata())
1024  {
1025  m_wspSize = m_numElmt*m_nmodes0*(m_nmodes1*m_nquad2
1026  + m_nquad1*m_nquad2);
1027 
1028  if(m_stdExp->GetBasis(0)->GetBasisType()
1030  {
1031  m_sortTopVertex = true;
1032  }
1033  else
1034  {
1035  m_sortTopVertex = false;
1036  }
1037 
1038  }
1039 };
1040 
1041 /// Factory initialisation for the BwdTrans_SumFac_Prism operator
1042 OperatorKey BwdTrans_SumFac_Prism::m_type = GetOperatorFactory().
1043  RegisterCreatorFunction(
1045  BwdTrans_SumFac_Prism::create, "BwdTrans_SumFac_Prism");
1046 
1047 /**
1048  * @brief Backward transform operator using sum-factorisation (Pyr)
1049  */
1051 {
1052  public:
1054 
1056  {
1057  }
1058 
1059  virtual void operator()(
1060  const Array<OneD, const NekDouble> &input,
1061  Array<OneD, NekDouble> &output,
1062  Array<OneD, NekDouble> &output1,
1063  Array<OneD, NekDouble> &output2,
1065  {
1066  boost::ignore_unused(output1, output2);
1067 
1068  ASSERTL1(wsp.num_elements() == m_wspSize,
1069  "Incorrect workspace size");
1070 
1071  // Assign second half of workspace for 2nd DGEMM operation.
1072  int totmodes = m_stdExp->GetNcoeffs();
1073 
1075  = wsp + m_nmodes0*m_nmodes1*m_nquad2*m_numElmt;
1076 
1077  Vmath::Zero(m_nmodes0*m_nmodes1*m_nquad2*m_numElmt, wsp, 1);
1078  int i = 0;
1079  int j = 0;
1080  int mode = 0;
1081  int mode1 = 0;
1082  int cnt = 0;
1083  for (i = 0; i < m_nmodes0; ++i)
1084  {
1085  for (j = 0; j < m_nmodes1; ++j, ++cnt)
1086  {
1087  int ijmax = max(i,j);
1088  Blas::Dgemm('N', 'N', m_nquad2, m_numElmt, m_nmodes2-ijmax,
1089  1.0, m_base2.get()+mode*m_nquad2, m_nquad2,
1090  input.get()+mode1, totmodes, 0.0,
1091  wsp.get() + cnt*m_nquad2*m_numElmt, m_nquad2);
1092  mode += m_nmodes2-ijmax;
1093  mode1 += m_nmodes2-ijmax;
1094  }
1095 
1096  //increment mode in case order1!=order2
1097  for(j = m_nmodes1; j < m_nmodes2-i; ++j)
1098  {
1099  int ijmax = max(i,j);
1100  mode += m_nmodes2-ijmax;
1101  }
1102  }
1103 
1104  // vertex mode - currently (1+c)/2 x (1-b)/2 x (1-a)/2
1105  // component is evaluated
1106  if(m_sortTopVertex)
1107  {
1108  for(i = 0; i < m_numElmt; ++i)
1109  {
1110  // top singular vertex
1111  // (1+c)/2 x (1+b)/2 x (1-a)/2 component
1112  Blas::Daxpy(m_nquad2, input[1+i*totmodes],
1113  m_base2.get() + m_nquad2, 1,
1114  &wsp[m_nquad2*m_numElmt] + i*m_nquad2, 1);
1115 
1116  // top singular vertex
1117  // (1+c)/2 x (1-b)/2 x (1+a)/2 component
1118  Blas::Daxpy(m_nquad2, input[1+i*totmodes],
1119  m_base2.get() + m_nquad2, 1,
1120  &wsp[m_nmodes1*m_nquad2*m_numElmt]
1121  + i*m_nquad2, 1);
1122 
1123  // top singular vertex
1124  // (1+c)/2 x (1+b)/2 x (1+a)/2 component
1125  Blas::Daxpy(m_nquad2, input[1+i*totmodes],
1126  m_base2.get() + m_nquad2, 1,
1127  &wsp[(m_nmodes1+1)*m_nquad2*m_numElmt]
1128  + i*m_nquad2, 1);
1129 
1130  }
1131  }
1132 
1133  // Perform summation over '1' direction
1134  mode = 0;
1135  for(i = 0; i < m_nmodes0; ++i)
1136  {
1137  Blas::Dgemm('N', 'T', m_nquad1, m_nquad2*m_numElmt, m_nmodes1,
1138  1.0, m_base1.get(), m_nquad1,
1139  wsp.get() + mode*m_nquad2*m_numElmt,
1140  m_nquad2*m_numElmt,
1141  0.0, wsp2.get() + i*m_nquad1*m_nquad2*m_numElmt,
1142  m_nquad1);
1143  mode += m_nmodes1;
1144  }
1145 
1146  // Perform summation over '0' direction
1147  Blas::Dgemm('N', 'T', m_nquad0, m_nquad1*m_nquad2*m_numElmt,
1148  m_nmodes0, 1.0, m_base0.get(), m_nquad0,
1149  wsp2.get(), m_nquad1*m_nquad2*m_numElmt,
1150  0.0, output.get(), m_nquad0);
1151  }
1152 
1153  virtual void operator()(
1154  int dir,
1155  const Array<OneD, const NekDouble> &input,
1156  Array<OneD, NekDouble> &output,
1158  {
1159  boost::ignore_unused(dir, input, output, wsp);
1160  ASSERTL0(false, "Not valid for this operator.");
1161  }
1162 
1163 
1164  protected:
1165  const int m_nquad0;
1166  const int m_nquad1;
1167  const int m_nquad2;
1168  const int m_nmodes0;
1169  const int m_nmodes1;
1170  const int m_nmodes2;
1175 
1176  private:
1178  vector<StdRegions::StdExpansionSharedPtr> pCollExp,
1179  CoalescedGeomDataSharedPtr pGeomData)
1180  : Operator (pCollExp, pGeomData),
1181  m_nquad0 (m_stdExp->GetNumPoints(0)),
1182  m_nquad1 (m_stdExp->GetNumPoints(1)),
1183  m_nquad2 (m_stdExp->GetNumPoints(2)),
1184  m_nmodes0 (m_stdExp->GetBasisNumModes(0)),
1185  m_nmodes1 (m_stdExp->GetBasisNumModes(1)),
1186  m_nmodes2 (m_stdExp->GetBasisNumModes(2)),
1187  m_base0 (m_stdExp->GetBasis(0)->GetBdata()),
1188  m_base1 (m_stdExp->GetBasis(1)->GetBdata()),
1189  m_base2 (m_stdExp->GetBasis(2)->GetBdata())
1190  {
1191  m_wspSize = m_numElmt*m_nmodes0*m_nquad2*(m_nmodes1 + m_nquad1);
1192 
1193  if(m_stdExp->GetBasis(0)->GetBasisType()
1195  {
1196  m_sortTopVertex = true;
1197  }
1198  else
1199  {
1200  m_sortTopVertex = false;
1201  }
1202 
1203  }
1204 };
1205 
1206 /// Factory initialisation for the BwdTrans_SumFac_Pyr operator
1207 OperatorKey BwdTrans_SumFac_Pyr::m_type = GetOperatorFactory().
1208  RegisterCreatorFunction(
1210  BwdTrans_SumFac_Pyr::create, "BwdTrans_SumFac_Pyr");
1211 
1212 }
1213 
1214 }
virtual void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp)
Perform operation.
Definition: BwdTrans.cpp:915
virtual void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp)
Perform operation.
Definition: BwdTrans.cpp:155
std::shared_ptr< CoalescedGeomData > CoalescedGeomDataSharedPtr
Array< OneD, const NekDouble > m_base1
Definition: BwdTrans.cpp:1172
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
Array< OneD, const NekDouble > m_base1
Definition: BwdTrans.cpp:1006
virtual void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp)
Perform operation.
Definition: BwdTrans.cpp:517
Array< OneD, const NekDouble > m_base2
Definition: BwdTrans.cpp:1173
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
Definition: BwdTrans.cpp:79
Array< OneD, const NekDouble > m_base0
Definition: BwdTrans.cpp:1005
Backward transform operator using sum-factorisation (Tet)
Definition: BwdTrans.cpp:729
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
Definition: BwdTrans.cpp:260
std::tuple< LibUtilities::ShapeType, OperatorType, ImplementationType, ExpansionIsNodal > OperatorKey
Key for describing an Operator.
Definition: Operator.h:161
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
Definition: BwdTrans.cpp:1153
Backward transform operator using sum-factorisation (Hex)
Definition: BwdTrans.cpp:614
Principle Modified Functions .
Definition: BasisType.h:48
virtual void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp)
Perform operation.
Definition: BwdTrans.cpp:1059
STL namespace.
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
Definition: BwdTrans.cpp:560
Array< OneD, const NekDouble > m_base1
Definition: BwdTrans.cpp:690
Backward transform operator using sum-factorisation (Tri)
Definition: BwdTrans.cpp:508
std::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:69
static void Dgemm(const char &transa, const char &transb, const int &m, const int &n, const int &k, const double &alpha, const double *a, const int &lda, const double *b, const int &ldb, const double &beta, double *c, const int &ldc)
BLAS level 3: Matrix-matrix multiply C = A x B where A[m x n], B[n x k], C[m x k].
Definition: Blas.hpp:213
Base class for operators on a collection of elements.
Definition: Operator.h:109
BwdTrans_SumFac_Tri(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
Definition: BwdTrans.cpp:581
Backward transform operator using sum-factorisation (Prism)
Definition: BwdTrans.cpp:906
Backward transform operator using sum-factorisation (Segment)
Definition: BwdTrans.cpp:321
BwdTrans_SumFac_Seg(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
Definition: BwdTrans.cpp:370
virtual void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp)
Perform operation.
Definition: BwdTrans.cpp:330
Backward transform operator using sum-factorisation (Pyr)
Definition: BwdTrans.cpp:1050
Backward transform operator using LocalRegions implementation.
Definition: BwdTrans.cpp:231
Array< OneD, const NekDouble > m_base2
Definition: BwdTrans.cpp:1007
BwdTrans_NoCollection(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
Definition: BwdTrans.cpp:274
vector< StdRegions::StdExpansionSharedPtr > m_expList
Definition: BwdTrans.cpp:271
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
Definition: BwdTrans.cpp:987
Array< OneD, const NekDouble > m_base0
Definition: BwdTrans.cpp:576
BwdTrans_SumFac_Quad(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
Definition: BwdTrans.cpp:481
Array< OneD, const NekDouble > m_base0
Definition: BwdTrans.cpp:367
BwdTrans_SumFac_Hex(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
Definition: BwdTrans.cpp:697
OperatorFactory & GetOperatorFactory()
Returns the singleton Operator factory object.
Definition: Operator.cpp:108
Array< OneD, const NekDouble > m_base1
Definition: BwdTrans.cpp:478
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
Definition: BwdTrans.cpp:352
Array< OneD, const NekDouble > m_base0
Definition: BwdTrans.cpp:860
Backward transform operator using default StdRegions operator.
Definition: BwdTrans.cpp:146
Array< OneD, const NekDouble > m_base2
Definition: BwdTrans.cpp:691
BwdTrans_SumFac_Pyr(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
Definition: BwdTrans.cpp:1177
#define OPERATOR_CREATE(cname)
Definition: Operator.h:45
Array< OneD, const NekDouble > m_base0
Definition: BwdTrans.cpp:689
virtual void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp)
Perform operation.
Definition: BwdTrans.cpp:240
Backward transform operator using sum-factorisation (Quad)
Definition: BwdTrans.cpp:394
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
Definition: BwdTrans.cpp:672
Array< OneD, const NekDouble > m_base1
Definition: BwdTrans.cpp:577
BwdTrans_SumFac_Tet(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
Definition: BwdTrans.cpp:866
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
Definition: BwdTrans.cpp:174
Array< OneD, const NekDouble > m_base2
Definition: BwdTrans.cpp:862
virtual void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp)
Perform operation.
Definition: BwdTrans.cpp:403
Array< OneD, const NekDouble > m_base1
Definition: BwdTrans.cpp:861
virtual void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp)
Perform operation.
Definition: BwdTrans.cpp:65
Array< OneD, const NekDouble > m_base0
Definition: BwdTrans.cpp:1171
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Definition: NekFactory.hpp:199
virtual void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp)
Perform operation.
Definition: BwdTrans.cpp:623
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.cpp:376
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:250
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:110
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1064
BwdTrans_SumFac_Prism(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
Definition: BwdTrans.cpp:1011
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
Definition: BwdTrans.cpp:843
virtual void operator()(int dir, const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &wsp)
Definition: BwdTrans.cpp:460
Array< OneD, const NekDouble > m_base0
Definition: BwdTrans.cpp:477
virtual void operator()(const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output, Array< OneD, NekDouble > &output1, Array< OneD, NekDouble > &output2, Array< OneD, NekDouble > &wsp)
Perform operation.
Definition: BwdTrans.cpp:738
Backward transform operator using standard matrix approach.
Definition: BwdTrans.cpp:56
BwdTrans_IterPerExp(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
Definition: BwdTrans.cpp:185
BwdTrans_StdMat(vector< StdRegions::StdExpansionSharedPtr > pCollExp, CoalescedGeomDataSharedPtr pGeomData)
Definition: BwdTrans.cpp:93