47     namespace MultiRegions
 
   50         ExpListHomogeneous1D::ExpListHomogeneous1D():
 
   64             m_dealiasing(dealiasing)
 
   71                            m_comm->GetColumnComm()->GetColumnComm()  :
 
   76                       "HomModesZ should be a multiple of npz.");
 
   86                     "HomModesZ/npz should be an even integer.");
 
  113                     ASSERTL0(
false, 
"Dealiasing available just in combination " 
  125             m_transposition(In.m_transposition),
 
  126             m_StripZcomm(In.m_StripZcomm),
 
  127             m_useFFT(In.m_useFFT),
 
  130             m_tmpOUT(In.m_tmpOUT),
 
  131             m_homogeneousBasis(In.m_homogeneousBasis),
 
  133             m_homogeneous1DBlockMat(In.m_homogeneous1DBlockMat),
 
  134             m_dealiasing(In.m_dealiasing),
 
  135             m_padsize(In.m_padsize)
 
  141                                             const std::vector<unsigned int> &eIDs):
 
  143             m_transposition(In.m_transposition),
 
  144             m_useFFT(In.m_useFFT),
 
  147             m_tmpOUT(In.m_tmpOUT),
 
  148             m_homogeneousBasis(In.m_homogeneousBasis),
 
  151             m_dealiasing(In.m_dealiasing),
 
  152             m_padsize(In.m_padsize)
 
  196             int num_dofs = inarray1.num_elements();
 
  207             int num_points_per_plane = num_dofs/
m_planes.num_elements();
 
  209             if(!
m_session->DefinesSolverInfo(
"HomoStrip"))
 
  211                 num_proc             = 
m_comm->GetColumnComm()->GetSize();
 
  217             int num_dfts_per_proc    = num_points_per_plane / num_proc
 
  218                                         + (num_points_per_plane % num_proc > 0);
 
  236             for(
int i = 0 ; i < num_dfts_per_proc ; i++)
 
  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);
 
  244                 m_FFT_deal->FFTBwdTrans(ShufV1_PAD_coef, ShufV1_PAD_phys);
 
  245                 m_FFT_deal->FFTBwdTrans(ShufV2_PAD_coef, ShufV2_PAD_phys);
 
  251                                        ShufV1V2_PAD_phys, 1);
 
  255                 m_FFT_deal->FFTFwdTrans(ShufV1V2_PAD_phys, ShufV1V2_PAD_coef);
 
  260                                 &(ShufV1V2[i*N]),        1);
 
  275             int cnt = 0, cnt1 = 0;
 
  278             for(
int n = 0; n < 
m_planes.num_elements(); ++n)
 
  280                 m_planes[n]->FwdTrans(inarray+cnt, tmparray = outarray + cnt1,
 
  297             int cnt = 0, cnt1 = 0;
 
  301             for(
int n = 0; n < 
m_planes.num_elements(); ++n)
 
  303                 m_planes[n]->FwdTrans_IterPerExp(inarray+cnt, tmparray = outarray + cnt1);
 
  318             int cnt = 0, cnt1 = 0;
 
  321             for(
int n = 0; n < 
m_planes.num_elements(); ++n)
 
  323                 m_planes[n]->BwdTrans(inarray+cnt, tmparray = outarray + cnt1,
 
  326                 cnt1 += 
m_planes[n]->GetTotPoints();
 
  339             int cnt = 0, cnt1 = 0;
 
  342             for(
int n = 0; n < 
m_planes.num_elements(); ++n)
 
  344                 m_planes[n]->BwdTrans_IterPerExp(inarray+cnt, tmparray = outarray + cnt1);
 
  347                 cnt1   += 
m_planes[n]->GetTotPoints();
 
  360             int cnt = 0, cnt1 = 0;
 
  363             for(
int n = 0; n < 
m_planes.num_elements(); ++n)
 
  365                 m_planes[n]->IProductWRTBase(inarray+cnt, tmparray = outarray + cnt1,coeffstate);
 
  377             int cnt = 0, cnt1 = 0;
 
  380             for(
int n = 0; n < 
m_planes.num_elements(); ++n)
 
  382                 m_planes[n]->IProductWRTBase_IterPerExp(inarray+cnt, tmparray = outarray + cnt1);
 
  402                 num_dofs = inarray.num_elements();
 
  406                 num_dofs = outarray.num_elements();
 
  411                 int num_points_per_plane = num_dofs/
m_planes.num_elements();
 
  412                 int num_dfts_per_proc;
 
  413                 if(!
m_session->DefinesSolverInfo(
"HomoStrip"))
 
  415                     int nP = 
m_comm->GetColumnComm()->GetSize();
 
  416                     num_dfts_per_proc = num_points_per_plane / nP
 
  417                                       + (num_points_per_plane % nP > 0);
 
  422                     num_dfts_per_proc = num_points_per_plane / nP
 
  423                                       + (num_points_per_plane % nP > 0);
 
  441                     for(
int i = 0 ; i < num_dfts_per_proc ; i++)
 
  448                     for(
int i = 0 ; i < num_dfts_per_proc ; i++)
 
  461                                  fft_out,1,outarray,1);
 
  491                 int nrows = blkmat->GetRows();
 
  492                 int ncols = blkmat->GetColumns();
 
  536                 return matrixIter->second;
 
  546             int num_trans_per_proc = 0;
 
  555                 n_exp = 
m_planes[0]->GetTotPoints(); 
 
  558             num_trans_per_proc = n_exp/
m_comm->GetColumnComm()->GetSize() + (n_exp%
m_comm->GetColumnComm()->GetSize() > 0);
 
  586                                                     StdPoint.DetShapeType(),
 
  589                     loc_mat = StdPoint.GetStdMatrix(matkey);
 
  594                                                     StdPoint.DetShapeType(),
 
  597                     loc_mat = StdPoint.GetStdMatrix(matkey);
 
  608                                                     StdSeg.DetShapeType(),
 
  611                     loc_mat = StdSeg.GetStdMatrix(matkey);
 
  616                                                     StdSeg.DetShapeType(),
 
  619                     loc_mat = StdSeg.GetStdMatrix(matkey);
 
  625             for(
int i = 0; i < num_trans_per_proc; ++i)
 
  627                 BlkMatrix->SetBlock(i,i,loc_mat);
 
  635             std::vector<LibUtilities::FieldDefinitionsSharedPtr> returnval;
 
  640             std::vector<NekDouble> HomoLen;
 
  641             HomoLen.push_back(
m_lhom);
 
  643             std::vector<unsigned int> StripsIDs;
 
  646             m_session->MatchSolverInfo(
"HomoStrip",
"True",strips,
false);
 
  652             std::vector<unsigned int> PlanesIDs;
 
  662             for(
int i = 0; i < 
m_planes.num_elements(); i++)
 
  667             m_planes[0]->GeneralGetFieldDefinitions(returnval, 1, HomoBasis, 
 
  668                     HomoLen, strips, StripsIDs, PlanesIDs);
 
  677             std::vector<NekDouble> HomoLen;
 
  678             HomoLen.push_back(
m_lhom);
 
  680             std::vector<unsigned int> StripsIDs;
 
  683             m_session->MatchSolverInfo(
"HomoStrip",
"True",strips,
false);
 
  689             std::vector<unsigned int> PlanesIDs;
 
  697             for(
int i = 0; i < 
m_planes.num_elements(); i++)
 
  703             m_planes[0]->GeneralGetFieldDefinitions(fielddef, 1, HomoBasis,
 
  704                     HomoLen, strips, StripsIDs, PlanesIDs);
 
  717             int ncoeffs_per_plane = 
m_planes[0]->GetNcoeffs();
 
  723                 for(i = 0; i < 
m_planes[0]->GetExpSize(); ++i)
 
  729             for(i = 0; i < fielddef->m_elementIDs.size(); ++i)
 
  732                 int datalen = (*m_exp)[eid]->GetNcoeffs();
 
  734                 for(n = 0; n < 
m_planes.num_elements(); ++n)
 
  736                     fielddata.insert(fielddata.end(),&coeffs[
m_coeff_offset[eid]+n*ncoeffs_per_plane],&coeffs[m_coeff_offset[eid]+n*ncoeffs_per_plane]+datalen);
 
  749             std::vector<NekDouble>       &fielddata,
 
  756             int datalen = fielddata.size()/fielddef->m_fields.size();
 
  757             std::vector<unsigned int> fieldDefHomoZids;
 
  761             for(i = 0; i < fielddef->m_fields.size(); ++i)
 
  763                 if(fielddef->m_fields[i] == field)
 
  770             if(i == fielddef->m_fields.size())
 
  772                 cout << 
"Field "<< field<< 
"not found in data file. "  << endl;
 
  777                 int modes_offset = 0;
 
  778                 int planes_offset = 0;
 
  786                     for (i = 0; i < 
m_planes.num_elements(); ++i)
 
  791                     for (i = 0; i < 
m_planes[0]->GetExpSize(); ++i)
 
  797                 if(fielddef->m_numHomogeneousDir)
 
  799                     nzmodes = fielddef->m_homogeneousZIDs.size();
 
  800                     fieldDefHomoZids = fielddef->m_homogeneousZIDs;
 
  805                     fieldDefHomoZids.push_back(0);
 
  809                 int ncoeffs_per_plane = 
m_planes[0]->GetNcoeffs(); 
 
  811                 for(i = 0; i < fielddef->m_elementIDs.size(); ++i)
 
  813                     if(fielddef->m_uniOrder == 
true) 
 
  819                                                                         fielddef->m_numModes,
 
  828                         offset += datalen*nzmodes;
 
  829                         modes_offset += (*m_exp)[0]->GetNumBases() +
 
  830                                         fielddef->m_numHomogeneousDir;
 
  834                     int eid = it->second;
 
  837                     for(n = 0; n < nzmodes; ++n, offset += datalen)
 
  848                         planes_offset = it->second;
 
  849                         if(datalen == (*
m_exp)[eid]->GetNcoeffs())
 
  855                             (*m_exp)[eid]->ExtractDataToCoeffs(&fielddata[offset], fielddef->m_numModes,modes_offset,&coeffs[
m_coeff_offset[eid] + planes_offset*ncoeffs_per_plane]);
 
  858                     modes_offset += (*m_exp)[0]->GetNumBases() + fielddef->m_numHomogeneousDir;
 
  868             int fromNcoeffs_per_plane = fromExpList->GetPlane(0)->GetNcoeffs();
 
  869             int toNcoeffs_per_plane = 
m_planes[0]->GetNcoeffs();
 
  872             for(i = 0; i < 
m_planes.num_elements(); ++i)
 
  874                 m_planes[i]->ExtractCoeffsToCoeffs(fromExpList->GetPlane(i),fromcoeffs_tmp =  fromCoeffs + fromNcoeffs_per_plane*i, tocoeffs_tmp = toCoeffs + toNcoeffs_per_plane*i);
 
  884                 m_planes[0]->WriteVtkPieceData(outfile, expansion, var);
 
  889             int nq = (*m_exp)[expansion]->GetTotPoints();
 
  890             int npoints_per_plane = 
m_planes[0]->GetTotPoints();
 
  893             int outputExtraPlane = 0;
 
  899                 outputExtraPlane = 1;
 
  910                     int fromRank = (rank+1) % size;
 
  911                     int toRank   = (rank == 0) ? size-1 : rank-1;
 
  917                                            fromRank, extraPlane);
 
  922             outfile << 
"        <DataArray type=\"Float64\" Name=\"" 
  923                     << var << 
"\">" << endl;
 
  925             for (
int n = 0; n < 
m_planes.num_elements(); ++n)
 
  928                 for(i = 0; i < nq; ++i)
 
  933             if (outputExtraPlane)
 
  935                 for(i = 0; i < nq; ++i)
 
  938                                 0 : extraPlane[i]) << 
" ";
 
  942             outfile << 
"        </DataArray>" << endl;
 
  950             cnt1 = 
m_planes[0]->Get1DScaledTotPoints(scale);
 
  952             ASSERTL1(
m_planes.num_elements()*cnt1 <= outarray.num_elements(),
"size of outarray does not match internal estimage");
 
  955             for(
int i = 0; i < 
m_planes.num_elements(); i++)
 
  958                 m_planes[i]->PhysInterp1DScaled(scale,inarray+i*cnt,
 
  959                                                  tmparray = outarray+i*cnt1);
 
  968             cnt  = 
m_planes[0]->Get1DScaledTotPoints(scale);
 
  971             ASSERTL1(
m_planes.num_elements()*cnt <= inarray.num_elements(),
"size of outarray does not match internal estimage");
 
  974             for(
int i = 0; i < 
m_planes.num_elements(); i++)
 
  976                 m_planes[i]->PhysGalerkinProjection1DScaled(scale,inarray+i*cnt,
 
  977                                                  tmparray = outarray+i*cnt1);
 
  986             int nT_pts = inarray.num_elements();          
 
  987             int nP_pts = nT_pts/
m_planes.num_elements();    
 
  995             for(
int i = 0; i < 
m_planes.num_elements(); i++)
 
  997                 m_planes[i]->PhysDeriv(inarray + i*nP_pts ,tmp2 = out_d0 + i*nP_pts , tmp3 = out_d1 + i*nP_pts );
 
 1007                         temparray = inarray;
 
 1034                         for(
int i = 0; i < 
m_planes.num_elements(); i++)
 
 1038                             Vmath::Smul(nP_pts,beta,tmp1 = temparray + i*nP_pts,1,tmp2 = outarray + (i-
int(sign))*nP_pts,1);
 
 1055                     if(!
m_session->DefinesSolverInfo(
"HomoStrip"))
 
 1058                                  "Parallelisation in the homogeneous direction " 
 1059                                  "implemented just for Fourier basis");
 
 1064                                  "Parallelisation in the homogeneous direction " 
 1065                                  "implemented just for Fourier basis");
 
 1070                         ASSERTL0(
false, 
"Semi-phyisical time-stepping not " 
 1071                                         "implemented yet for non-Fourier " 
 1080                         for(
int i = 0; i < nP_pts; i++)
 
 1082                             StdSeg.PhysDeriv(temparray + i*
m_planes.num_elements(), tmp2 = outarray + i*
m_planes.num_elements());
 
 1097             int nT_pts = inarray.num_elements();        
 
 1098             int nP_pts = nT_pts/
m_planes.num_elements();  
 
 1109                 for(
int i=0; i < 
m_planes.num_elements(); i++)
 
 1111                     m_planes[i]->PhysDeriv(edir, inarray + i*nP_pts ,tmp2 = out_d + i*nP_pts);
 
 1121                         temparray = inarray;
 
 1147                         for(
int i = 0; i < 
m_planes.num_elements(); i++)
 
 1151                             Vmath::Smul(nP_pts,beta,tmp1 = temparray + i*nP_pts,1,tmp2 = outarray + (i-
int(sign))*nP_pts,1);
 
 1167                     if(!
m_session->DefinesSolverInfo(
"HomoStrip"))
 
 1170                                  "Parallelisation in the homogeneous direction " 
 1171                                  "implemented just for Fourier basis");
 
 1176                                  "Parallelisation in the homogeneous direction " 
 1177                                  "implemented just for Fourier basis");
 
 1182                         ASSERTL0(
false,
"Semi-phyisical time-stepping not implemented yet for non-Fourier basis");
 
 1190                         for(
int i = 0; i < nP_pts; i++)
 
 1192                             StdSeg.PhysDeriv(temparray + i*
m_planes.num_elements(), tmp2 = outarray + i*
m_planes.num_elements());
 
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)
 
Homo1DBlockMatrixMapShPtr m_homogeneous1DBlockMat
 
virtual void v_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate)
 
#define ASSERTL0(condition, msg)
 
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. 
 
static Array< OneD, NekDouble > NullNekDouble1DArray
 
boost::unordered_map< int, int > m_elmtToExpId
Mapping from geometry ID of element to index inside m_exp. 
 
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool. 
 
#define sign(a, b)
return the sign(b)*a 
 
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
 
LibUtilities::NektarFFTSharedPtr m_FFT_deal
 
static BasisSharedPtr NullBasisSharedPtr
 
Array< OneD, NekDouble > m_tmpOUT
 
NekDouble m_lhom
Width of homogeneous direction. 
 
Array< OneD, NekDouble > m_phys
The global expansion evaluated at the quadrature points. 
 
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. 
 
boost::shared_ptr< DNekMat > DNekMatSharedPtr
 
NektarFFTFactory & GetNektarFFTFactory()
 
boost::shared_ptr< SessionReader > SessionReaderSharedPtr
 
virtual LibUtilities::TranspositionSharedPtr v_GetTransposition(void)
 
int GetNumberOfCoefficients(ShapeType shape, std::vector< unsigned int > &modes, int offset)
 
virtual void v_AppendFieldData(LibUtilities::FieldDefinitionsSharedPtr &fielddef, std::vector< NekDouble > &fielddata)
 
BasisManagerT & BasisManager(void)
 
Class representing a segment element in reference space. 
 
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. 
 
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. 
 
boost::unordered_map< int, int > m_zIdToPlane
 
1D Evenly-spaced points using Fourier Fit 
 
static const NekDouble kNekZeroTol
 
Fourier Modified expansions with just the real part of the first mode . 
 
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y. 
 
boost::shared_ptr< LocalRegions::ExpansionVector > m_exp
The list of local expansions. 
 
Array< OneD, int > m_phys_offset
Offset of elemental data into the array m_phys. 
 
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. 
 
Array< OneD, ExpListSharedPtr > m_planes
 
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)
 
ExpListHomogeneous1D()
Default constructor. 
 
Array< OneD, NekDouble > m_tmpIN
 
Fourier Modified expansions with just the imaginary part of the first mode . 
 
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
 
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. 
 
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 . 
 
virtual ~ExpListHomogeneous1D()
Destructor. 
 
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed t...
 
LibUtilities::CommSharedPtr m_StripZcomm
 
bool m_useFFT
FFT variables. 
 
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. 
 
virtual NekDouble v_GetHomoLen(void)
 
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
 
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
 
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. 
 
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. 
 
LibUtilities::NektarFFTSharedPtr m_FFT