Nektar++
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
ExpListHomogeneous1D.cpp
Go to the documentation of this file.
1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 // File ExpListHomogeneous1D.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 // License for the specific language governing rights and limitations under
14 // Permission is hereby granted, free of charge, to any person obtaining a
15 // copy of this software and associated documentation files (the "Software"),
16 // to deal in the Software without restriction, including without limitation
17 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
18 // and/or sell copies of the Software, and to permit persons to whom the
19 // Software is furnished to do so, subject to the following conditions:
20 //
21 // The above copyright notice and this permission notice shall be included
22 // in all copies or substantial portions of the Software.
23 //
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
25 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
27 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
29 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
30 // DEALINGS IN THE SOFTWARE.
31 //
32 // Description: An ExpList which is homogeneous in 1-direction
33 //
34 ///////////////////////////////////////////////////////////////////////////////
35 
37 #include <LibUtilities/Foundations/ManagerAccess.h> // for PointsManager, etc
38 #include <StdRegions/StdSegExp.h>
39 #include <StdRegions/StdPointExp.h>
40 #include <LocalRegions/Expansion.h>
42 
43 using namespace std;
44 
45 namespace Nektar
46 {
47  namespace MultiRegions
48  {
49  // Forward declaration for typedefs
50  ExpListHomogeneous1D::ExpListHomogeneous1D():
51  ExpList(),
52  m_homogeneousBasis(LibUtilities::NullBasisSharedPtr),
53  m_lhom(1),
54  m_homogeneous1DBlockMat(MemoryManager<Homo1DBlockMatrixMap>::AllocateSharedPtr())
55  {
56  }
57 
59  &pSession,const LibUtilities::BasisKey &HomoBasis, const NekDouble lhom, const bool useFFT, const bool dealiasing):
60  ExpList(pSession),
61  m_useFFT(useFFT),
62  m_lhom(lhom),
63  m_homogeneous1DBlockMat(MemoryManager<Homo1DBlockMatrixMap>::AllocateSharedPtr()),
64  m_dealiasing(dealiasing)
65  {
66  ASSERTL2(HomoBasis != LibUtilities::NullBasisKey,"Homogeneous Basis is a null basis");
67 
69 
70  m_StripZcomm = m_session->DefinesSolverInfo("HomoStrip") ?
71  m_comm->GetColumnComm()->GetColumnComm() :
72  m_comm->GetColumnComm();
73 
74  ASSERTL0( m_homogeneousBasis->GetNumPoints() %
75  m_StripZcomm->GetSize() == 0,
76  "HomModesZ should be a multiple of npz.");
77 
78  if ( (m_homogeneousBasis->GetBasisType() !=
80  && (m_homogeneousBasis->GetBasisType() !=
82  {
83  ASSERTL0(
84  (m_homogeneousBasis->GetNumPoints() /
85  m_StripZcomm->GetSize()) % 2 == 0,
86  "HomModesZ/npz should be an even integer.");
87  }
88 
91 
93  m_homogeneousBasis->GetNumPoints() /
94  m_StripZcomm->GetSize());
95 
96  if(m_useFFT)
97  {
99  "NekFFTW", m_homogeneousBasis->GetNumPoints());
100  }
101 
102  if(m_dealiasing)
103  {
104  if(m_useFFT)
105  {
106  NekDouble size = 1.5*m_homogeneousBasis->GetNumPoints();
107  m_padsize = int(size);
109  .CreateInstance("NekFFTW", m_padsize);
110  }
111  else
112  {
113  ASSERTL0(false, "Dealiasing available just in combination "
114  "with FFTW");
115  }
116  }
117  }
118 
119 
120  /**
121  * @param In ExpListHomogeneous1D object to copy.
122  */
124  ExpList(In,false),
125  m_transposition(In.m_transposition),
126  m_StripZcomm(In.m_StripZcomm),
127  m_useFFT(In.m_useFFT),
128  m_FFT(In.m_FFT),
129  m_tmpIN(In.m_tmpIN),
130  m_tmpOUT(In.m_tmpOUT),
131  m_homogeneousBasis(In.m_homogeneousBasis),
132  m_lhom(In.m_lhom),
133  m_homogeneous1DBlockMat(In.m_homogeneous1DBlockMat),
134  m_dealiasing(In.m_dealiasing),
135  m_padsize(In.m_padsize)
136  {
137  m_planes = Array<OneD, ExpListSharedPtr>(In.m_planes.num_elements());
138  }
139 
141  const std::vector<unsigned int> &eIDs):
142  ExpList(In,eIDs,false),
143  m_transposition(In.m_transposition),
144  m_useFFT(In.m_useFFT),
145  m_FFT(In.m_FFT),
146  m_tmpIN(In.m_tmpIN),
147  m_tmpOUT(In.m_tmpOUT),
148  m_homogeneousBasis(In.m_homogeneousBasis),
149  m_lhom(In.m_lhom),
150  m_homogeneous1DBlockMat(MemoryManager<Homo1DBlockMatrixMap>::AllocateSharedPtr()),
151  m_dealiasing(In.m_dealiasing),
152  m_padsize(In.m_padsize)
153  {
154  m_planes = Array<OneD, ExpListSharedPtr>(In.m_planes.num_elements());
155  }
156 
157  /**
158  * Destructor
159  */
161  {
162  }
163 
165  Array<OneD, NekDouble> &outarray,
166  CoeffState coeffstate,
167  bool Shuff,
168  bool UnShuff)
169  {
170  // Forwards trans
171  Homogeneous1DTrans(inarray,outarray,true,coeffstate,Shuff,UnShuff);
172  }
173 
175  Array<OneD, NekDouble> &outarray,
176  CoeffState coeffstate,
177  bool Shuff,
178  bool UnShuff)
179  {
180  // Backwards trans
181  Homogeneous1DTrans(inarray,outarray,false,coeffstate,Shuff,UnShuff);
182  }
183 
184  /**
185  * Dealiasing routine
186  */
188  const Array<OneD, NekDouble> &inarray2,
189  Array<OneD, NekDouble> &outarray,
190  CoeffState coeffstate)
191  {
192  // inarray1 = first term of the product in full physical space
193  // inarray2 = second term of the product in full physical space
194  // dealiased product stored in outarray
195 
196  int num_dofs = inarray1.num_elements();
197 
198  int N = m_homogeneousBasis->GetNumPoints();
199 
200  Array<OneD, NekDouble> V1(num_dofs);
201  Array<OneD, NekDouble> V2(num_dofs);
202  Array<OneD, NekDouble> V1V2(num_dofs);
203 
204  HomogeneousFwdTrans(inarray1,V1,coeffstate);
205  HomogeneousFwdTrans(inarray2,V2,coeffstate);
206 
207  int num_points_per_plane = num_dofs/m_planes.num_elements();
208  int num_proc;
209  if(!m_session->DefinesSolverInfo("HomoStrip"))
210  {
211  num_proc = m_comm->GetColumnComm()->GetSize();
212  }
213  else
214  {
215  num_proc = m_StripZcomm->GetSize();
216  }
217  int num_dfts_per_proc = num_points_per_plane / num_proc
218  + (num_points_per_plane % num_proc > 0);
219 
220  Array<OneD, NekDouble> ShufV1(num_dfts_per_proc*N,0.0);
221  Array<OneD, NekDouble> ShufV2(num_dfts_per_proc*N,0.0);
222  Array<OneD, NekDouble> ShufV1V2(num_dfts_per_proc*N,0.0);
223 
224  Array<OneD, NekDouble> ShufV1_PAD_coef(m_padsize,0.0);
225  Array<OneD, NekDouble> ShufV2_PAD_coef(m_padsize,0.0);
226  Array<OneD, NekDouble> ShufV1_PAD_phys(m_padsize,0.0);
227  Array<OneD, NekDouble> ShufV2_PAD_phys(m_padsize,0.0);
228 
229  Array<OneD, NekDouble> ShufV1V2_PAD_coef(m_padsize,0.0);
230  Array<OneD, NekDouble> ShufV1V2_PAD_phys(m_padsize,0.0);
231 
232  m_transposition->Transpose(V1, ShufV1, false, LibUtilities::eXYtoZ);
233  m_transposition->Transpose(V2, ShufV2, false, LibUtilities::eXYtoZ);
234 
235  // Looping on the pencils
236  for(int i = 0 ; i < num_dfts_per_proc ; i++)
237  {
238  // Copying the i-th pencil pf lenght N into a bigger
239  // pencil of lenght 2N We are in Fourier space
240  Vmath::Vcopy(N, &(ShufV1[i*N]), 1, &(ShufV1_PAD_coef[0]), 1);
241  Vmath::Vcopy(N, &(ShufV2[i*N]), 1, &(ShufV2_PAD_coef[0]), 1);
242 
243  // Moving to physical space using the padded system
244  m_FFT_deal->FFTBwdTrans(ShufV1_PAD_coef, ShufV1_PAD_phys);
245  m_FFT_deal->FFTBwdTrans(ShufV2_PAD_coef, ShufV2_PAD_phys);
246 
247  // Perfroming the vectors multiplication in physical space on
248  // the padded system
249  Vmath::Vmul(m_padsize, ShufV1_PAD_phys, 1,
250  ShufV2_PAD_phys, 1,
251  ShufV1V2_PAD_phys, 1);
252 
253  // Moving back the result (V1*V2)_phys in Fourier space, padded
254  // system
255  m_FFT_deal->FFTFwdTrans(ShufV1V2_PAD_phys, ShufV1V2_PAD_coef);
256 
257  // Copying the first half of the padded pencil in the full
258  // vector (Fourier space)
259  Vmath::Vcopy(N, &(ShufV1V2_PAD_coef[0]), 1,
260  &(ShufV1V2[i*N]), 1);
261  }
262 
263  m_transposition->Transpose(ShufV1V2, V1V2, false,
265 
266  // Moving the results in physical space for the output
267  HomogeneousBwdTrans(V1V2, outarray, coeffstate);
268  }
269 
270  /**
271  * Forward transform
272  */
274  {
275  int cnt = 0, cnt1 = 0;
276  Array<OneD, NekDouble> tmparray;
277 
278  for(int n = 0; n < m_planes.num_elements(); ++n)
279  {
280  m_planes[n]->FwdTrans(inarray+cnt, tmparray = outarray + cnt1,
281  coeffstate);
282  cnt += m_planes[n]->GetTotPoints();
283 
284  cnt1 += m_planes[n]->GetNcoeffs(); // need to skip ncoeffs
285  }
286  if(!m_WaveSpace)
287  {
288  HomogeneousFwdTrans(outarray,outarray,coeffstate);
289  }
290  }
291 
292  /**
293  * Forward transform element by element
294  */
296  {
297  int cnt = 0, cnt1 = 0;
298  Array<OneD, NekDouble> tmparray;
299 
300  //spectral element FwdTrans plane by plane
301  for(int n = 0; n < m_planes.num_elements(); ++n)
302  {
303  m_planes[n]->FwdTrans_IterPerExp(inarray+cnt, tmparray = outarray + cnt1);
304  cnt += m_planes[n]->GetTotPoints();
305  cnt1 += m_planes[n]->GetNcoeffs();
306  }
307  if(!m_WaveSpace)
308  {
309  HomogeneousFwdTrans(outarray,outarray);
310  }
311  }
312 
313  /**
314  * Backward transform
315  */
317  {
318  int cnt = 0, cnt1 = 0;
319  Array<OneD, NekDouble> tmparray;
320 
321  for(int n = 0; n < m_planes.num_elements(); ++n)
322  {
323  m_planes[n]->BwdTrans(inarray+cnt, tmparray = outarray + cnt1,
324  coeffstate);
325  cnt += m_planes[n]->GetNcoeffs();
326  cnt1 += m_planes[n]->GetTotPoints();
327  }
328  if(!m_WaveSpace)
329  {
330  HomogeneousBwdTrans(outarray,outarray);
331  }
332  }
333 
334  /**
335  * Backward transform element by element
336  */
338  {
339  int cnt = 0, cnt1 = 0;
340  Array<OneD, NekDouble> tmparray;
341 
342  for(int n = 0; n < m_planes.num_elements(); ++n)
343  {
344  m_planes[n]->BwdTrans_IterPerExp(inarray+cnt, tmparray = outarray + cnt1);
345 
346  cnt += m_planes[n]->GetNcoeffs();
347  cnt1 += m_planes[n]->GetTotPoints();
348  }
349  if(!m_WaveSpace)
350  {
351  HomogeneousBwdTrans(outarray,outarray);
352  }
353  }
354 
355  /**
356  * Inner product
357  */
359  {
360  int cnt = 0, cnt1 = 0;
361  Array<OneD, NekDouble> tmparray;
362 
363  for(int n = 0; n < m_planes.num_elements(); ++n)
364  {
365  m_planes[n]->IProductWRTBase(inarray+cnt, tmparray = outarray + cnt1,coeffstate);
366 
367  cnt1 += m_planes[n]->GetNcoeffs();
368  cnt += m_planes[n]->GetTotPoints();
369  }
370  }
371 
372  /**
373  * Inner product element by element
374  */
376  {
377  int cnt = 0, cnt1 = 0;
378  Array<OneD, NekDouble> tmparray;
379 
380  for(int n = 0; n < m_planes.num_elements(); ++n)
381  {
382  m_planes[n]->IProductWRTBase_IterPerExp(inarray+cnt, tmparray = outarray + cnt1);
383 
384  cnt1 += m_planes[n]->GetNcoeffs();
385  cnt += m_planes[n]->GetTotPoints();
386  }
387  }
388 
389  /**
390  * Homogeneous transform Bwd/Fwd (MVM and FFT)
391  */
393  bool IsForwards,
394  CoeffState coeffstate,
395  bool Shuff,
396  bool UnShuff)
397  {
398  int num_dofs;
399 
400  if(IsForwards)
401  {
402  num_dofs = inarray.num_elements();
403  }
404  else
405  {
406  num_dofs = outarray.num_elements();
407  }
408 
409  if(m_useFFT)
410  {
411  int num_points_per_plane = num_dofs/m_planes.num_elements();
412  int num_dfts_per_proc;
413  if(!m_session->DefinesSolverInfo("HomoStrip"))
414  {
415  int nP = m_comm->GetColumnComm()->GetSize();
416  num_dfts_per_proc = num_points_per_plane / nP
417  + (num_points_per_plane % nP > 0);
418  }
419  else
420  {
421  int nP = m_StripZcomm->GetSize();
422  num_dfts_per_proc = num_points_per_plane / nP
423  + (num_points_per_plane % nP > 0);
424  }
425 
426  Array<OneD, NekDouble> fft_in (num_dfts_per_proc*m_homogeneousBasis->GetNumPoints(),0.0);
427  Array<OneD, NekDouble> fft_out(num_dfts_per_proc*m_homogeneousBasis->GetNumPoints(),0.0);
428 
429  if(Shuff)
430  {
431  m_transposition->Transpose(inarray,fft_in,false,LibUtilities::eXYtoZ);
432  }
433  else
434  {
435  Vmath::Vcopy(num_dfts_per_proc*m_homogeneousBasis->GetNumPoints(),
436  inarray,1,fft_in,1);
437  }
438 
439  if(IsForwards)
440  {
441  for(int i = 0 ; i < num_dfts_per_proc ; i++)
442  {
443  m_FFT->FFTFwdTrans(m_tmpIN = fft_in + i*m_homogeneousBasis->GetNumPoints(), m_tmpOUT = fft_out + i*m_homogeneousBasis->GetNumPoints());
444  }
445  }
446  else
447  {
448  for(int i = 0 ; i < num_dfts_per_proc ; i++)
449  {
450  m_FFT->FFTBwdTrans(m_tmpIN = fft_in + i*m_homogeneousBasis->GetNumPoints(), m_tmpOUT = fft_out + i*m_homogeneousBasis->GetNumPoints());
451  }
452  }
453 
454  if(UnShuff)
455  {
456  m_transposition->Transpose(fft_out,outarray,false,LibUtilities::eZtoXY);
457  }
458  else
459  {
460  Vmath::Vcopy(num_dfts_per_proc*m_homogeneousBasis->GetNumPoints(),
461  fft_out,1,outarray,1);
462  }
463  }
464  else
465  {
466  DNekBlkMatSharedPtr blkmat;
467 
468  if(num_dofs == m_npoints) //transform phys space
469  {
470  if(IsForwards)
471  {
473  }
474  else
475  {
477  }
478  }
479  else
480  {
481  if(IsForwards)
482  {
484  }
485  else
486  {
488  }
489  }
490 
491  int nrows = blkmat->GetRows();
492  int ncols = blkmat->GetColumns();
493 
494  Array<OneD, NekDouble> sortedinarray(ncols,0.0);
495  Array<OneD, NekDouble> sortedoutarray(nrows,0.0);
496 
497  if(Shuff)
498  {
499  m_transposition->Transpose(inarray,sortedinarray,!IsForwards,LibUtilities::eXYtoZ);
500  }
501  else
502  {
503  Vmath::Vcopy(ncols,inarray,1,sortedinarray,1);
504  }
505 
506  // Create NekVectors from the given data arrays
507  NekVector<NekDouble> in (ncols,sortedinarray,eWrapper);
508  NekVector<NekDouble> out(nrows,sortedoutarray,eWrapper);
509 
510  // Perform matrix-vector multiply.
511  out = (*blkmat)*in;
512 
513  if(UnShuff)
514  {
515  m_transposition->Transpose(sortedoutarray,outarray,IsForwards,LibUtilities::eZtoXY);
516  }
517  else
518  {
519  Vmath::Vcopy(nrows,sortedoutarray,1,outarray,1);
520  }
521 
522  }
523  }
524 
526  {
527  Homo1DBlockMatrixMap::iterator matrixIter = m_homogeneous1DBlockMat->find(mattype);
528 
529  if(matrixIter == m_homogeneous1DBlockMat->end())
530  {
531  return ((*m_homogeneous1DBlockMat)[mattype] =
532  GenHomogeneous1DBlockMatrix(mattype,coeffstate));
533  }
534  else
535  {
536  return matrixIter->second;
537  }
538  }
539 
540 
542  {
543  DNekMatSharedPtr loc_mat;
544  DNekBlkMatSharedPtr BlkMatrix;
545  int n_exp = 0;
546  int num_trans_per_proc = 0;
547 
548  if((mattype == eForwardsCoeffSpace1D)
549  ||(mattype == eBackwardsCoeffSpace1D)) // will operate on m_coeffs
550  {
551  n_exp = m_planes[0]->GetNcoeffs();
552  }
553  else
554  {
555  n_exp = m_planes[0]->GetTotPoints(); // will operatore on m_phys
556  }
557 
558  num_trans_per_proc = n_exp/m_comm->GetColumnComm()->GetSize() + (n_exp%m_comm->GetColumnComm()->GetSize() > 0);
559 
560  Array<OneD,unsigned int> nrows(num_trans_per_proc);
561  Array<OneD,unsigned int> ncols(num_trans_per_proc);
562 
563  if((mattype == eForwardsCoeffSpace1D)||(mattype == eForwardsPhysSpace1D))
564  {
565  nrows = Array<OneD, unsigned int>(num_trans_per_proc,m_homogeneousBasis->GetNumModes());
566  ncols = Array<OneD, unsigned int>(num_trans_per_proc,m_homogeneousBasis->GetNumPoints());
567  }
568  else
569  {
570  nrows = Array<OneD, unsigned int>(num_trans_per_proc,m_homogeneousBasis->GetNumPoints());
571  ncols = Array<OneD, unsigned int>(num_trans_per_proc,m_homogeneousBasis->GetNumModes());
572  }
573 
574  MatrixStorage blkmatStorage = eDIAGONAL;
575  BlkMatrix = MemoryManager<DNekBlkMat>
576  ::AllocateSharedPtr(nrows,ncols,blkmatStorage);
577 
578  //Half Mode
580  {
581  StdRegions::StdPointExp StdPoint(m_homogeneousBasis->GetBasisKey());
582 
583  if((mattype == eForwardsCoeffSpace1D)||(mattype == eForwardsPhysSpace1D))
584  {
586  StdPoint.DetShapeType(),
587  StdPoint);
588 
589  loc_mat = StdPoint.GetStdMatrix(matkey);
590  }
591  else
592  {
594  StdPoint.DetShapeType(),
595  StdPoint);
596 
597  loc_mat = StdPoint.GetStdMatrix(matkey);
598  }
599  }
600  //other cases
601  else
602  {
603  StdRegions::StdSegExp StdSeg(m_homogeneousBasis->GetBasisKey());
604 
605  if((mattype == eForwardsCoeffSpace1D)||(mattype == eForwardsPhysSpace1D))
606  {
608  StdSeg.DetShapeType(),
609  StdSeg);
610 
611  loc_mat = StdSeg.GetStdMatrix(matkey);
612  }
613  else
614  {
616  StdSeg.DetShapeType(),
617  StdSeg);
618 
619  loc_mat = StdSeg.GetStdMatrix(matkey);
620  }
621 
622  }
623 
624  // set up array of block matrices.
625  for(int i = 0; i < num_trans_per_proc; ++i)
626  {
627  BlkMatrix->SetBlock(i,i,loc_mat);
628  }
629 
630  return BlkMatrix;
631  }
632 
633  std::vector<LibUtilities::FieldDefinitionsSharedPtr> ExpListHomogeneous1D::v_GetFieldDefinitions()
634  {
635  std::vector<LibUtilities::FieldDefinitionsSharedPtr> returnval;
636 
637  // Set up Homogeneous length details.
639 
640  std::vector<NekDouble> HomoLen;
641  HomoLen.push_back(m_lhom);
642 
643  std::vector<unsigned int> StripsIDs;
644 
645  bool strips;
646  m_session->MatchSolverInfo("HomoStrip","True",strips,false);
647  if (strips)
648  {
649  StripsIDs.push_back(m_transposition->GetStripID());
650  }
651 
652  std::vector<unsigned int> PlanesIDs;
653  int IDoffset = 0;
654 
655  // introduce a 2 plane offset for single mode case so can
656  // be post-processed or used in MultiMode expansion.
658  {
659  IDoffset = 2;
660  }
661 
662  for(int i = 0; i < m_planes.num_elements(); i++)
663  {
664  PlanesIDs.push_back(m_transposition->GetPlaneID(i)+IDoffset);
665  }
666 
667  m_planes[0]->GeneralGetFieldDefinitions(returnval, 1, HomoBasis,
668  HomoLen, strips, StripsIDs, PlanesIDs);
669  return returnval;
670  }
671 
672  void ExpListHomogeneous1D::v_GetFieldDefinitions(std::vector<LibUtilities::FieldDefinitionsSharedPtr> &fielddef)
673  {
674  // Set up Homogeneous length details.
676 
677  std::vector<NekDouble> HomoLen;
678  HomoLen.push_back(m_lhom);
679 
680  std::vector<unsigned int> StripsIDs;
681 
682  bool strips;
683  m_session->MatchSolverInfo("HomoStrip","True",strips,false);
684  if (strips)
685  {
686  StripsIDs.push_back(m_transposition->GetStripID());
687  }
688 
689  std::vector<unsigned int> PlanesIDs;
690  int IDoffset = 0;
691 
693  {
694  IDoffset = 2;
695  }
696 
697  for(int i = 0; i < m_planes.num_elements(); i++)
698  {
699  PlanesIDs.push_back(m_transposition->GetPlaneID(i)+IDoffset);
700  }
701 
702  // enforce NumHomoDir == 1 by direct call
703  m_planes[0]->GeneralGetFieldDefinitions(fielddef, 1, HomoBasis,
704  HomoLen, strips, StripsIDs, PlanesIDs);
705  }
706 
707 
708  /** This routine appends the data from the expansion list into
709  the output format where each element is given by looping
710  over its Fourier modes where as data in the expandion is
711  stored with all consecutive elements and then the Fourier
712  modes
713  */
715  {
716  int i,n;
717  int ncoeffs_per_plane = m_planes[0]->GetNcoeffs();
718 
719  // Determine mapping from element ids to location in
720  // expansion list
721  if (m_elmtToExpId.size() == 0)
722  {
723  for(i = 0; i < m_planes[0]->GetExpSize(); ++i)
724  {
725  m_elmtToExpId[(*m_exp)[i]->GetGeom()->GetGlobalID()] = i;
726  }
727  }
728 
729  for(i = 0; i < fielddef->m_elementIDs.size(); ++i)
730  {
731  int eid = m_elmtToExpId[fielddef->m_elementIDs[i]];
732  int datalen = (*m_exp)[eid]->GetNcoeffs();
733 
734  for(n = 0; n < m_planes.num_elements(); ++n)
735  {
736  fielddata.insert(fielddata.end(),&coeffs[m_coeff_offset[eid]+n*ncoeffs_per_plane],&coeffs[m_coeff_offset[eid]+n*ncoeffs_per_plane]+datalen);
737  }
738  }
739  }
740 
741  void ExpListHomogeneous1D::v_AppendFieldData(LibUtilities::FieldDefinitionsSharedPtr &fielddef, std::vector<NekDouble> &fielddata)
742  {
743  v_AppendFieldData(fielddef,fielddata,m_coeffs);
744  }
745 
746  //Extract the data in fielddata into the m_coeff list
749  std::vector<NekDouble> &fielddata,
750  std::string &field,
751  Array<OneD, NekDouble> &coeffs)
752  {
753  int i,n;
754  int offset = 0;
755  int nzmodes = 1;
756  int datalen = fielddata.size()/fielddef->m_fields.size();
757  std::vector<unsigned int> fieldDefHomoZids;
758 
759 
760  // Find data location according to field definition
761  for(i = 0; i < fielddef->m_fields.size(); ++i)
762  {
763  if(fielddef->m_fields[i] == field)
764  {
765  break;
766  }
767  offset += datalen;
768  }
769 
770  if(i == fielddef->m_fields.size())
771  {
772  cout << "Field "<< field<< "not found in data file. " << endl;
773  }
774  else
775  {
776 
777  int modes_offset = 0;
778  int planes_offset = 0;
779  Array<OneD, NekDouble> coeff_tmp;
781 
782  // Build map of plane IDs lying on this processor and determine
783  // mapping from element ids to location in expansion list.
784  if (m_zIdToPlane.size() == 0)
785  {
786  for (i = 0; i < m_planes.num_elements(); ++i)
787  {
788  m_zIdToPlane[m_transposition->GetPlaneID(i)] = i;
789  }
790 
791  for (i = 0; i < m_planes[0]->GetExpSize(); ++i)
792  {
793  m_elmtToExpId[(*m_exp)[i]->GetGeom()->GetGlobalID()] = i;
794  }
795  }
796 
797  if(fielddef->m_numHomogeneousDir)
798  {
799  nzmodes = fielddef->m_homogeneousZIDs.size();
800  fieldDefHomoZids = fielddef->m_homogeneousZIDs;
801  }
802  else // input file is 2D and so set nzmodes to 1
803  {
804  nzmodes = 1;
805  fieldDefHomoZids.push_back(0);
806  }
807 
808  // calculate number of modes in the current partition
809  int ncoeffs_per_plane = m_planes[0]->GetNcoeffs();
810 
811  for(i = 0; i < fielddef->m_elementIDs.size(); ++i)
812  {
813  if(fielddef->m_uniOrder == true) // reset modes_offset to zero
814  {
815  modes_offset = 0;
816  }
817 
818  int datalen = LibUtilities::GetNumberOfCoefficients(fielddef->m_shapeType,
819  fielddef->m_numModes,
820  modes_offset);
821 
822  it = m_elmtToExpId.find(fielddef->m_elementIDs[i]);
823 
824  // ensure element is on this partition for parallel case.
825  if(it == m_elmtToExpId.end())
826  {
827  // increase offset for correct FieldData access
828  offset += datalen*nzmodes;
829  modes_offset += (*m_exp)[0]->GetNumBases() +
830  fielddef->m_numHomogeneousDir;
831  continue;
832  }
833 
834  int eid = it->second;
835 
836 
837  for(n = 0; n < nzmodes; ++n, offset += datalen)
838  {
839 
840  it = m_zIdToPlane.find(fieldDefHomoZids[n]);
841 
842  // Check to make sure this mode number lies in this field.
843  if (it == m_zIdToPlane.end())
844  {
845  continue;
846  }
847 
848  planes_offset = it->second;
849  if(datalen == (*m_exp)[eid]->GetNcoeffs())
850  {
851  Vmath::Vcopy(datalen,&fielddata[offset],1,&coeffs[m_coeff_offset[eid]+planes_offset*ncoeffs_per_plane],1);
852  }
853  else // unpack data to new order
854  {
855  (*m_exp)[eid]->ExtractDataToCoeffs(&fielddata[offset], fielddef->m_numModes,modes_offset,&coeffs[m_coeff_offset[eid] + planes_offset*ncoeffs_per_plane]);
856  }
857  }
858  modes_offset += (*m_exp)[0]->GetNumBases() + fielddef->m_numHomogeneousDir;
859  }
860  }
861  }
862 
863  //Extract the data in fielddata into the m_coeff list
865  const boost::shared_ptr<ExpList> &fromExpList,const Array<OneD, const NekDouble> &fromCoeffs, Array<OneD, NekDouble> &toCoeffs)
866  {
867  int i;
868  int fromNcoeffs_per_plane = fromExpList->GetPlane(0)->GetNcoeffs();
869  int toNcoeffs_per_plane = m_planes[0]->GetNcoeffs();
870  Array<OneD, NekDouble> tocoeffs_tmp, fromcoeffs_tmp;
871 
872  for(i = 0; i < m_planes.num_elements(); ++i)
873  {
874  m_planes[i]->ExtractCoeffsToCoeffs(fromExpList->GetPlane(i),fromcoeffs_tmp = fromCoeffs + fromNcoeffs_per_plane*i, tocoeffs_tmp = toCoeffs + toNcoeffs_per_plane*i);
875  }
876  }
877 
878  void ExpListHomogeneous1D::v_WriteVtkPieceData(std::ostream &outfile, int expansion,
879  std::string var)
880  {
881  // If there is only one plane (e.g. HalfMode), we write a 2D plane.
882  if (m_planes.num_elements() == 1)
883  {
884  m_planes[0]->WriteVtkPieceData(outfile, expansion, var);
885  return;
886  }
887 
888  int i;
889  int nq = (*m_exp)[expansion]->GetTotPoints();
890  int npoints_per_plane = m_planes[0]->GetTotPoints();
891 
892  // If we are using Fourier points, output extra plane to fill domain
893  int outputExtraPlane = 0;
894  Array<OneD, NekDouble> extraPlane;
895  if ( m_homogeneousBasis->GetBasisType() == LibUtilities::eFourier
896  && m_homogeneousBasis->GetPointsType() ==
898  {
899  outputExtraPlane = 1;
900  // Get extra plane data
901  if (m_StripZcomm->GetSize() == 1)
902  {
903  extraPlane = m_phys + m_phys_offset[expansion];
904  }
905  else
906  {
907  // Determine to and from rank for communication
908  int size = m_StripZcomm->GetSize();
909  int rank = m_StripZcomm->GetRank();
910  int fromRank = (rank+1) % size;
911  int toRank = (rank == 0) ? size-1 : rank-1;
912  // Communicate using SendRecv
913  extraPlane = Array<OneD, NekDouble>(nq);
914  Array<OneD, NekDouble> send (nq,
915  m_phys + m_phys_offset[expansion]);
916  m_StripZcomm->SendRecv(toRank, send,
917  fromRank, extraPlane);
918  }
919  }
920 
921  // printing the fields of that zone
922  outfile << " <DataArray type=\"Float64\" Name=\""
923  << var << "\">" << endl;
924  outfile << " ";
925  for (int n = 0; n < m_planes.num_elements(); ++n)
926  {
927  const Array<OneD, NekDouble> phys = m_phys + m_phys_offset[expansion] + n*npoints_per_plane;
928  for(i = 0; i < nq; ++i)
929  {
930  outfile << (fabs(phys[i]) < NekConstants::kNekZeroTol ? 0 : phys[i]) << " ";
931  }
932  }
933  if (outputExtraPlane)
934  {
935  for(i = 0; i < nq; ++i)
936  {
937  outfile << (fabs(extraPlane[i]) < NekConstants::kNekZeroTol ?
938  0 : extraPlane[i]) << " ";
939  }
940  }
941  outfile << endl;
942  outfile << " </DataArray>" << endl;
943  }
944 
946  {
947  int cnt,cnt1;
948  Array<OneD, NekDouble> tmparray;
949  cnt = m_planes[0]->GetTotPoints();
950  cnt1 = m_planes[0]->Get1DScaledTotPoints(scale);
951 
952  ASSERTL1(m_planes.num_elements()*cnt1 <= outarray.num_elements(),"size of outarray does not match internal estimage");
953 
954 
955  for(int i = 0; i < m_planes.num_elements(); i++)
956  {
957 
958  m_planes[i]->PhysInterp1DScaled(scale,inarray+i*cnt,
959  tmparray = outarray+i*cnt1);
960  }
961  }
962 
963 
965  {
966  int cnt,cnt1;
967  Array<OneD, NekDouble> tmparray;
968  cnt = m_planes[0]->Get1DScaledTotPoints(scale);
969  cnt1 = m_planes[0]->GetTotPoints();
970 
971  ASSERTL1(m_planes.num_elements()*cnt <= inarray.num_elements(),"size of outarray does not match internal estimage");
972 
973 
974  for(int i = 0; i < m_planes.num_elements(); i++)
975  {
976  m_planes[i]->PhysGalerkinProjection1DScaled(scale,inarray+i*cnt,
977  tmparray = outarray+i*cnt1);
978  }
979 
980  }
982  Array<OneD, NekDouble> &out_d0,
983  Array<OneD, NekDouble> &out_d1,
984  Array<OneD, NekDouble> &out_d2)
985  {
986  int nT_pts = inarray.num_elements(); //number of total points = n. of Fourier points * n. of points per plane (nT_pts)
987  int nP_pts = nT_pts/m_planes.num_elements(); //number of points per plane = n of Fourier transform required (nP_pts)
988 
989  Array<OneD, NekDouble> temparray(nT_pts);
990  Array<OneD, NekDouble> outarray(nT_pts);
994 
995  for(int i = 0; i < m_planes.num_elements(); i++)
996  {
997  m_planes[i]->PhysDeriv(inarray + i*nP_pts ,tmp2 = out_d0 + i*nP_pts , tmp3 = out_d1 + i*nP_pts );
998  }
999 
1000  if(out_d2 != NullNekDouble1DArray)
1001  {
1004  {
1005  if(m_WaveSpace)
1006  {
1007  temparray = inarray;
1008  }
1009  else
1010  {
1011  HomogeneousFwdTrans(inarray,temparray);
1012  }
1013 
1014  NekDouble sign = -1.0;
1015  NekDouble beta;
1016 
1017  //Half Mode
1019  {
1020  beta = sign*2*M_PI*(m_transposition->GetK(0))/m_lhom;
1021 
1022  Vmath::Smul(nP_pts,beta,temparray,1,outarray,1);
1023  }
1024  else if(m_homogeneousBasis->GetBasisType() == LibUtilities::eFourierHalfModeIm)
1025  {
1026  beta = -sign*2*M_PI*(m_transposition->GetK(0))/m_lhom;
1027 
1028  Vmath::Smul(nP_pts,beta,temparray,1,outarray,1);
1029  }
1030 
1031  //Fully complex
1032  else
1033  {
1034  for(int i = 0; i < m_planes.num_elements(); i++)
1035  {
1036  beta = -sign*2*M_PI*(m_transposition->GetK(i))/m_lhom;
1037 
1038  Vmath::Smul(nP_pts,beta,tmp1 = temparray + i*nP_pts,1,tmp2 = outarray + (i-int(sign))*nP_pts,1);
1039 
1040  sign = -1.0*sign;
1041  }
1042  }
1043 
1044  if(m_WaveSpace)
1045  {
1046  out_d2 = outarray;
1047  }
1048  else
1049  {
1050  HomogeneousBwdTrans(outarray,out_d2);
1051  }
1052  }
1053  else
1054  {
1055  if(!m_session->DefinesSolverInfo("HomoStrip"))
1056  {
1057  ASSERTL0(m_comm->GetColumnComm()->GetSize() == 1,
1058  "Parallelisation in the homogeneous direction "
1059  "implemented just for Fourier basis");
1060  }
1061  else
1062  {
1063  ASSERTL0(m_StripZcomm->GetSize() == 1,
1064  "Parallelisation in the homogeneous direction "
1065  "implemented just for Fourier basis");
1066  }
1067 
1068  if(m_WaveSpace)
1069  {
1070  ASSERTL0(false, "Semi-phyisical time-stepping not "
1071  "implemented yet for non-Fourier "
1072  "basis");
1073  }
1074  else
1075  {
1076  StdRegions::StdSegExp StdSeg(m_homogeneousBasis->GetBasisKey());
1077 
1078  m_transposition->Transpose(inarray,temparray,false,LibUtilities::eXYtoZ);
1079 
1080  for(int i = 0; i < nP_pts; i++)
1081  {
1082  StdSeg.PhysDeriv(temparray + i*m_planes.num_elements(), tmp2 = outarray + i*m_planes.num_elements());
1083  }
1084 
1085  m_transposition->Transpose(outarray,out_d2,false,LibUtilities::eZtoXY);
1086 
1087  Vmath::Smul(nT_pts,2.0/m_lhom,out_d2,1,out_d2,1);
1088  }
1089  }
1090  }
1091  }
1092 
1095 
1096  {
1097  int nT_pts = inarray.num_elements(); //number of total points = n. of Fourier points * n. of points per plane (nT_pts)
1098  int nP_pts = nT_pts/m_planes.num_elements(); //number of points per plane = n of Fourier transform required (nP_pts)
1099 
1100  int dir= (int)edir;
1101 
1102  Array<OneD, NekDouble> temparray(nT_pts);
1103  Array<OneD, NekDouble> outarray(nT_pts);
1106 
1107  if (dir < 2)
1108  {
1109  for(int i=0; i < m_planes.num_elements(); i++)
1110  {
1111  m_planes[i]->PhysDeriv(edir, inarray + i*nP_pts ,tmp2 = out_d + i*nP_pts);
1112  }
1113  }
1114  else
1115  {
1118  {
1119  if(m_WaveSpace)
1120  {
1121  temparray = inarray;
1122  }
1123  else
1124  {
1125  HomogeneousFwdTrans(inarray,temparray);
1126  }
1127 
1128  NekDouble sign = -1.0;
1129  NekDouble beta;
1130 
1131  //HalfMode
1133  {
1134  beta = 2*sign*M_PI*(m_transposition->GetK(0))/m_lhom;
1135 
1136  Vmath::Smul(nP_pts,beta,temparray,1,outarray,1);
1137  }
1138  else if(m_homogeneousBasis->GetBasisType() == LibUtilities::eFourierHalfModeIm)
1139  {
1140  beta = -2*sign*M_PI*(m_transposition->GetK(0))/m_lhom;
1141 
1142  Vmath::Smul(nP_pts,beta,temparray,1,outarray,1);
1143  }
1144  //Fully complex
1145  else
1146  {
1147  for(int i = 0; i < m_planes.num_elements(); i++)
1148  {
1149  beta = -sign*2*M_PI*(m_transposition->GetK(i))/m_lhom;
1150 
1151  Vmath::Smul(nP_pts,beta,tmp1 = temparray + i*nP_pts,1,tmp2 = outarray + (i-int(sign))*nP_pts,1);
1152 
1153  sign = -1.0*sign;
1154  }
1155  }
1156  if(m_WaveSpace)
1157  {
1158  out_d = outarray;
1159  }
1160  else
1161  {
1162  HomogeneousBwdTrans(outarray,out_d);
1163  }
1164  }
1165  else
1166  {
1167  if(!m_session->DefinesSolverInfo("HomoStrip"))
1168  {
1169  ASSERTL0(m_comm->GetColumnComm()->GetSize() == 1,
1170  "Parallelisation in the homogeneous direction "
1171  "implemented just for Fourier basis");
1172  }
1173  else
1174  {
1175  ASSERTL0(m_StripZcomm->GetSize() == 1,
1176  "Parallelisation in the homogeneous direction "
1177  "implemented just for Fourier basis");
1178  }
1179 
1180  if(m_WaveSpace)
1181  {
1182  ASSERTL0(false,"Semi-phyisical time-stepping not implemented yet for non-Fourier basis");
1183  }
1184  else
1185  {
1186  StdRegions::StdSegExp StdSeg(m_homogeneousBasis->GetBasisKey());
1187 
1188  m_transposition->Transpose(inarray,temparray,false,LibUtilities::eXYtoZ);
1189 
1190  for(int i = 0; i < nP_pts; i++)
1191  {
1192  StdSeg.PhysDeriv(temparray + i*m_planes.num_elements(), tmp2 = outarray + i*m_planes.num_elements());
1193  }
1194 
1195  m_transposition->Transpose(outarray,out_d,false,LibUtilities::eZtoXY);
1196 
1197  Vmath::Smul(nT_pts,2.0/m_lhom,out_d,1,out_d,1);
1198  }
1199  }
1200  }
1201  }
1202 
1204  Array<OneD, NekDouble> &out_d0,
1205  Array<OneD, NekDouble> &out_d1,
1206  Array<OneD, NekDouble> &out_d2)
1207 
1208  {
1209  v_PhysDeriv(inarray,out_d0,out_d1,out_d2);
1210  }
1211 
1213  const Array<OneD, const NekDouble> &inarray,
1214  Array<OneD, NekDouble> &out_d)
1215  {
1216  v_PhysDeriv(edir,inarray,out_d);
1217  }
1218 
1220  {
1221  return m_transposition;
1222  }
1223 
1225  {
1226  return m_lhom;
1227  }
1228 
1230  {
1231  return m_transposition->GetPlanesIDs();
1232  }
1233  } //end of namespace
1234 } //end of namespace
1235 
1236 
1237 /**
1238 * $Log: v $
1239 *
1240 **/
1241 
Abstraction of a two-dimensional multi-elemental expansion which is merely a collection of local expa...
void HomogeneousBwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal, bool Shuff=true, bool UnShuff=true)
virtual void v_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate)
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:188
DNekBlkMatSharedPtr GetHomogeneous1DBlockMatrix(Homogeneous1DMatType mattype, CoeffState coeffstate=eLocal) const
virtual void v_PhysGalerkinProjection1DScaled(const NekDouble scale, const Array< OneD, NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
boost::shared_ptr< Transposition > TranspositionSharedPtr
tBaseSharedPtr CreateInstance(tKey idKey BOOST_PP_COMMA_IF(MAX_PARAM) BOOST_PP_ENUM_BINARY_PARAMS(MAX_PARAM, tParam, x))
Create an instance of the class referred to by idKey.
Definition: NekFactory.hpp:162
static Array< OneD, NekDouble > NullNekDouble1DArray
boost::unordered_map< int, int > m_elmtToExpId
Mapping from geometry ID of element to index inside m_exp.
Definition: ExpList.h:1011
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
#define sign(a, b)
return the sign(b)*a
Definition: Polylib.cpp:22
LibUtilities::TranspositionSharedPtr m_transposition
virtual void v_WriteVtkPieceData(std::ostream &outfile, int expansion, std::string var)
virtual void v_PhysInterp1DScaled(const NekDouble scale, const Array< OneD, NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
void PhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2)
virtual void v_ExtractCoeffsToCoeffs(const boost::shared_ptr< ExpList > &fromExpList, const Array< OneD, const NekDouble > &fromCoeffs, Array< OneD, NekDouble > &toCoeffs)
boost::shared_ptr< FieldDefinitions > FieldDefinitionsSharedPtr
Definition: FieldIO.h:118
LibUtilities::NektarFFTSharedPtr m_FFT_deal
static BasisSharedPtr NullBasisSharedPtr
Definition: Basis.h:358
STL namespace.
NekDouble m_lhom
Width of homogeneous direction.
Array< OneD, NekDouble > m_phys
The global expansion evaluated at the quadrature points.
Definition: ExpList.h:956
Fourier Expansion .
Definition: BasisType.h:52
virtual void v_HomogeneousFwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal, bool Shuff=true, bool UnShuff=true)
Array< OneD, NekDouble > m_coeffs
Concatenation of all local expansion coefficients.
Definition: ExpList.h:939
boost::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:70
NektarFFTFactory & GetNektarFFTFactory()
Definition: NektarFFT.cpp:69
boost::shared_ptr< SessionReader > SessionReaderSharedPtr
Definition: MeshPartition.h:51
virtual LibUtilities::TranspositionSharedPtr v_GetTransposition(void)
int GetNumberOfCoefficients(ShapeType shape, std::vector< unsigned int > &modes, int offset)
Definition: ShapeType.hpp:312
virtual void v_AppendFieldData(LibUtilities::FieldDefinitionsSharedPtr &fielddef, std::vector< NekDouble > &fielddata)
BasisManagerT & BasisManager(void)
Class representing a segment element in reference space.
Definition: StdSegExp.h:54
virtual void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate)
Array< OneD, int > m_coeff_offset
Offset of elemental data into the array m_coeffs.
Definition: ExpList.h:988
LibUtilities::BasisSharedPtr m_homogeneousBasis
Definition of the total number of degrees of freedom and quadrature points. Sets up the storage for m...
Base class for all multi-elemental spectral/hp expansions.
Definition: ExpList.h:101
boost::unordered_map< int, int > m_zIdToPlane
1D Evenly-spaced points using Fourier Fit
Definition: PointsType.h:64
static const NekDouble kNekZeroTol
Fourier Modified expansions with just the real part of the first mode .
Definition: BasisType.h:59
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
Definition: Vmath.cpp:199
boost::shared_ptr< LocalRegions::ExpansionVector > m_exp
The list of local expansions.
Definition: ExpList.h:977
Array< OneD, int > m_phys_offset
Offset of elemental data into the array m_phys.
Definition: ExpList.h:991
virtual void v_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate)
virtual void v_BwdTrans_IterPerExp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
LibUtilities::SessionReaderSharedPtr m_session
Session.
Definition: ExpList.h:910
Array< OneD, ExpListSharedPtr > m_planes
double NekDouble
void HomogeneousFwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal, bool Shuff=true, bool UnShuff=true)
virtual void v_FwdTrans_IterPerExp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_HomogeneousBwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal, bool Shuff=true, bool UnShuff=true)
Fourier Modified expansions with just the imaginary part of the first mode .
Definition: BasisType.h:60
virtual Array< OneD, const unsigned int > v_GetZIDs(void)
virtual void v_ExtractDataToCoeffs(LibUtilities::FieldDefinitionsSharedPtr &fielddef, std::vector< NekDouble > &fielddata, std::string &field, Array< OneD, NekDouble > &coeffs)
Extract data from raw field data into expansion list.
boost::shared_ptr< DNekBlkMat > DNekBlkMatSharedPtr
Definition: NekTypeDefs.hpp:72
StandardMatrixTag boost::call_traits< LhsDataType >::const_reference rhs typedef NekMatrix< LhsDataType, StandardMatrixTag >::iterator iterator
virtual void v_DealiasedProd(const Array< OneD, NekDouble > &inarray1, const Array< OneD, NekDouble > &inarray2, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal)
LibUtilities::CommSharedPtr m_comm
Communicator.
Definition: ExpList.h:907
void Homogeneous1DTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool IsForwards, CoeffState coeffstate=eLocal, bool Shuff=true, bool UnShuff=true)
virtual std::vector< LibUtilities::FieldDefinitionsSharedPtr > v_GetFieldDefinitions(void)
DNekBlkMatSharedPtr GenHomogeneous1DBlockMatrix(Homogeneous1DMatType mattype, CoeffState coeffstate=eLocal) const
virtual void v_IProductWRTBase_IterPerExp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Fourier ModifiedExpansion with just the first mode .
Definition: BasisType.h:58
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed t...
Definition: ErrorUtil.hpp:240
static const BasisKey NullBasisKey(eNoBasisType, 0, NullPointsKey)
Defines a null basis with no type or points.
std::map< Homogeneous1DMatType, DNekBlkMatSharedPtr > Homo1DBlockMatrixMap
A map between homo matrix keys and their associated block matrices.
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:218
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1047
virtual void v_PhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2)
Describes the specification for a Basis.
Definition: Basis.h:50
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
Definition: Vmath.cpp:169
LibUtilities::NektarFFTSharedPtr m_FFT