46 namespace MultiRegions
49 ExpListHomogeneous2D::ExpListHomogeneous2D():
65 const bool dealiasing):
71 m_dealiasing(dealiasing)
74 "Homogeneous Basis in y direction is a null basis");
76 "Homogeneous Basis in z direction is a null basis");
99 ASSERTL0(
m_comm->GetColumnComm()->GetSize() == 1,
"Remove dealiasing if you want to run in parallel");
110 m_useFFT(In.m_useFFT),
113 m_transposition(In.m_transposition),
116 m_homogeneousBasis_y(In.m_homogeneousBasis_y),
117 m_homogeneousBasis_z(In.m_homogeneousBasis_z),
118 m_lhom_y(In.m_lhom_y),
119 m_lhom_z(In.m_lhom_z),
120 m_homogeneous2DBlockMat(In.m_homogeneous2DBlockMat),
123 m_dealiasing(In.m_dealiasing),
124 m_padsize_y(In.m_padsize_y),
125 m_padsize_z(In.m_padsize_z),
126 MatFwdPAD(In.MatFwdPAD),
127 MatBwdPAD(In.MatBwdPAD)
164 int npoints = outarray.num_elements();
165 int nlines =
m_lines.num_elements();
166 int nslabs = npoints/nlines;
207 for(
int j = 0 ; j< nslabs ; j++)
211 for(
int i = 0 ; i<
m_nz ; i++)
214 Vmath::Vcopy(m_ny,&(ShufV2[i*m_ny + j*nlines]),1,&(PadV2_slab_coeff[i*2*m_ny]),1);
218 PadOUT_V1 = (*MatBwdPAD)*PadIN_V1;
219 PadOUT_V2 = (*MatBwdPAD)*PadIN_V2;
227 PadOUT_Re = (*MatFwdPAD)*PadIN_Re;
231 for (
int i = 0; i <
m_nz; i++)
252 int cnt = 0, cnt1 = 0;
254 int nlines =
m_lines.num_elements();
256 for(
int n = 0; n < nlines; ++n)
258 m_lines[n]->FwdTrans(inarray+cnt, tmparray = outarray + cnt1,
260 cnt +=
m_lines[n]->GetTotPoints();
261 cnt1 +=
m_lines[n]->GetNcoeffs();
271 int cnt = 0, cnt1 = 0;
273 int nlines =
m_lines.num_elements();
275 for(
int n = 0; n < nlines; ++n)
277 m_lines[n]->FwdTrans_IterPerExp(inarray+cnt, tmparray = outarray + cnt1);
279 cnt +=
m_lines[n]->GetTotPoints();
280 cnt1 +=
m_lines[n]->GetNcoeffs();
290 int cnt = 0, cnt1 = 0;
292 int nlines =
m_lines.num_elements();
294 for(
int n = 0; n < nlines; ++n)
296 m_lines[n]->BwdTrans(inarray+cnt, tmparray = outarray + cnt1,
298 cnt +=
m_lines[n]->GetNcoeffs();
299 cnt1 +=
m_lines[n]->GetTotPoints();
309 int cnt = 0, cnt1 = 0;
311 int nlines =
m_lines.num_elements();
313 for(
int n = 0; n < nlines; ++n)
315 m_lines[n]->BwdTrans_IterPerExp(inarray+cnt, tmparray = outarray + cnt1);
317 cnt +=
m_lines[n]->GetNcoeffs();
318 cnt1 +=
m_lines[n]->GetTotPoints();
329 int cnt = 0, cnt1 = 0;
331 int nlines =
m_lines.num_elements();
333 for(
int n = 0; n < nlines; ++n)
335 m_lines[n]->IProductWRTBase(inarray+cnt, tmparray = outarray + cnt1,coeffstate);
337 cnt +=
m_lines[n]->GetNcoeffs();
338 cnt1 +=
m_lines[n]->GetTotPoints();
344 int cnt = 0, cnt1 = 0;
346 int nlines =
m_lines.num_elements();
348 for(
int n = 0; n < nlines; ++n)
350 m_lines[n]->IProductWRTBase_IterPerExp(inarray+cnt, tmparray = outarray + cnt1);
352 cnt +=
m_lines[n]->GetNcoeffs();
353 cnt1 +=
m_lines[n]->GetTotPoints();
367 int n =
m_lines.num_elements();
368 int s = inarray.num_elements();
378 for(
int i=0;i<(p*
m_nz);i++)
386 for(
int i=0;i<(p*
m_nz);i++)
396 for(
int i=0;i<(p*
m_ny);i++)
404 for(
int i=0;i<(p*
m_ny);i++)
448 int nrowsY = blkmatY->GetRows();
449 int ncolsY = blkmatY->GetColumns();
454 int nrowsZ = blkmatZ->GetRows();
455 int ncolsZ = blkmatZ->GetColumns();
468 outY = (*blkmatY)*inY;
472 outZ = (*blkmatZ)*inZ;
491 return matrixIter->second;
528 n_exp =
m_lines[0]->GetNcoeffs();
532 n_exp =
m_lines[0]->GetTotPoints();
559 StdSeg.DetShapeType(),
562 loc_mat = StdSeg.GetStdMatrix(matkey);
567 StdSeg.DetShapeType(),
570 loc_mat = StdSeg.GetStdMatrix(matkey);
574 for(i = 0; i < (n_exp*NumPencils); ++i)
576 BlkMatrix->SetBlock(i,i,loc_mat);
584 std::vector<LibUtilities::FieldDefinitionsSharedPtr> returnval;
590 std::vector<NekDouble> HomoLen(2);
597 std::vector<unsigned int> sIDs
600 std::vector<unsigned int> yIDs;
601 std::vector<unsigned int> zIDs;
603 for(
int n = 0; n < nhom_modes_z; ++n)
605 for(
int m = 0; m < nhom_modes_y; ++m)
612 m_lines[0]->GeneralGetFieldDefinitions(returnval, 2, HomoBasis,
624 std::vector<NekDouble> HomoLen(2);
631 std::vector<unsigned int> sIDs
634 std::vector<unsigned int> yIDs;
635 std::vector<unsigned int> zIDs;
637 for(
int n = 0; n < nhom_modes_z; ++n)
639 for(
int m = 0; m < nhom_modes_y; ++m)
647 m_lines[0]->GeneralGetFieldDefinitions(fielddef, 2, HomoBasis,
659 int ncoeffs_per_line =
m_lines[0]->GetNcoeffs();
663 map<int, int> ElmtID_to_ExpID;
664 for(i = 0; i <
m_lines[0]->GetExpSize(); ++i)
666 ElmtID_to_ExpID[(*m_exp)[i]->GetGeom()->GetGlobalID()] = i;
669 for(i = 0; i < fielddef->m_elementIDs.size(); ++i)
671 int eid = ElmtID_to_ExpID[fielddef->m_elementIDs[i]];
672 int datalen = (*m_exp)[eid]->GetNcoeffs();
674 for(k = 0; k < (NumMod_y*NumMod_z); ++k)
676 fielddata.insert(fielddata.end(),&coeffs[
m_coeff_offset[eid]+k*ncoeffs_per_line],&coeffs[m_coeff_offset[eid]+k*ncoeffs_per_line]+datalen);
691 int datalen = fielddata.size()/fielddef->m_fields.size();
692 int ncoeffs_per_line =
m_lines[0]->GetNcoeffs();
697 for(i = 0; i < fielddef->m_fields.size(); ++i)
699 if(fielddef->m_fields[i] == field)
706 ASSERTL0(i!= fielddef->m_fields.size(),
"Field not found in data file");
710 map<int, int> ElmtID_to_ExpID;
711 for(i = 0; i <
m_lines[0]->GetExpSize(); ++i)
713 ElmtID_to_ExpID[(*m_exp)[i]->GetGeom()->GetGlobalID()] = i;
716 for(i = 0; i < fielddef->m_elementIDs.size(); ++i)
718 int eid = ElmtID_to_ExpID[fielddef->m_elementIDs[i]];
719 int datalen = (*m_exp)[eid]->GetNcoeffs();
721 for(k = 0; k < (NumMod_y*NumMod_z); ++k)
733 int nq = (*m_exp)[expansion]->GetTotPoints();
734 int npoints_per_line =
m_lines[0]->GetTotPoints();
737 outfile <<
" <DataArray type=\"Float64\" Name=\""
738 << var <<
"\">" << endl;
740 for (
int n = 0; n <
m_lines.num_elements(); ++n)
743 for(i = 0; i < nq; ++i)
749 outfile <<
" </DataArray>" << endl;
758 int nyzlines =
m_lines.num_elements();
759 int npoints = inarray.num_elements();
760 int n_points_line = npoints/nyzlines;
769 for(
int i=0 ; i<nyzlines ; i++ )
771 m_lines[i]->PhysDeriv( tmp1 = inarray + i*n_points_line ,tmp2 = out_d0 + i*n_points_line);
788 for(
int i = 0; i <
m_ny; i++)
792 for(
int j = 0; j <
m_nz; j++)
794 Vmath::Smul(n_points_line,beta,tmp1 = temparray + n_points_line*(i+j*m_ny),1, tmp2 = temparray1 + n_points_line*((i-
int(sign))+j*m_ny),1);
802 for(
int i = 0; i <
m_nz; i++)
805 Vmath::Smul(m_ny*n_points_line,beta,tmp1 = temparray + i*m_ny*n_points_line,1,tmp2 = temparray2 + (i-
int(sign))*m_ny*n_points_line,1);
823 ASSERTL0(
false,
"Semi-phyisical time-stepping not implemented yet for non-Fourier basis")
831 for(
int i = 0; i < n_points_line; i++)
833 StdQuad.PhysDeriv(tmp1 = temparray + i*nyzlines, tmp2 = temparray1 + i*nyzlines, tmp3 = temparray2 + i*nyzlines);
849 int nyzlines =
m_lines.num_elements();
850 int npoints = inarray.num_elements();
851 int n_points_line = npoints/nyzlines;
864 for(
int i=0 ; i<nyzlines ; i++)
866 m_lines[i]->PhysDeriv( tmp1 = inarray + i*n_points_line ,tmp2 = out_d + i*n_points_line);
887 for(
int i = 0; i <
m_ny; i++)
891 for(
int j = 0; j <
m_nz; j++)
893 Vmath::Smul(n_points_line,beta,tmp1 = temparray + n_points_line*(i+j*m_ny),1, tmp2 = temparray1 + n_points_line*((i-
int(sign))+j*m_ny),1);
909 for(
int i = 0; i <
m_nz; i++)
912 Vmath::Smul(
m_ny*n_points_line,beta,tmp1 = temparray + i*
m_ny*n_points_line,1,tmp2 = temparray2 + (i-
int(sign))*
m_ny*n_points_line,1);
929 ASSERTL0(
false,
"Semi-phyisical time-stepping not implemented yet for non-Fourier basis")
937 for(
int i = 0; i < n_points_line; i++)
939 StdQuad.PhysDeriv(tmp1 = temparray + i*nyzlines, tmp2 = temparray1 + i*nyzlines, tmp3 = temparray2 + i*nyzlines);
995 MatFwdPAD = StdQuad.GetStdMatrix(matkey1);
996 MatBwdPAD = StdQuad.GetStdMatrix(matkey2);
Abstraction of a two-dimensional multi-elemental expansion which is merely a collection of local expa...
#define ASSERTL0(condition, msg)
LibUtilities::TranspositionSharedPtr m_transposition
void HomogeneousFwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal, bool Shuff=true, bool UnShuff=true)
LibUtilities::CommSharedPtr m_Ycomm
Homo2DBlockMatrixMapShPtr m_homogeneous2DBlockMat
LibUtilities::CommSharedPtr m_Zcomm
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.
DNekBlkMatSharedPtr GenHomogeneous2DBlockMatrix(Homogeneous2DMatType mattype, CoeffState coeffstate=eLocal) const
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
#define sign(a, b)
return the sign(b)*a
virtual std::vector< LibUtilities::FieldDefinitionsSharedPtr > v_GetFieldDefinitions(void)
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
void SetPaddingBase(void)
LibUtilities::BasisSharedPtr m_paddingBasis_z
Base expansion in z direction.
boost::shared_ptr< FieldDefinitions > FieldDefinitionsSharedPtr
static BasisSharedPtr NullBasisSharedPtr
ExpListHomogeneous2D()
Default constructor.
Array< OneD, NekDouble > m_phys
The global expansion evaluated at the quadrature points.
LibUtilities::NektarFFTSharedPtr m_FFT_z
NekDouble m_lhom_z
Width of homogeneous direction z.
virtual void v_DealiasedProd(const Array< OneD, NekDouble > &inarray1, const Array< OneD, NekDouble > &inarray2, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal)
Array< OneD, NekDouble > m_coeffs
Concatenation of all local expansion coefficients.
void PhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2)
boost::shared_ptr< DNekMat > DNekMatSharedPtr
NektarFFTFactory & GetNektarFFTFactory()
boost::shared_ptr< SessionReader > SessionReaderSharedPtr
virtual void v_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate)
Array< OneD, NekDouble > m_tmpOUT
Array< OneD, ExpListSharedPtr > m_lines
Vector of ExpList, will be filled with ExpList1D.
BasisManagerT & BasisManager(void)
virtual void v_IProductWRTBase_IterPerExp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Class representing a segment element in reference space.
Array< OneD, int > m_coeff_offset
Offset of elemental data into the array m_coeffs.
Base class for all multi-elemental spectral/hp expansions.
1D Evenly-spaced points using Fourier Fit
static const NekDouble kNekZeroTol
LibUtilities::BasisSharedPtr m_homogeneousBasis_z
Base expansion in z direction.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
Array< OneD, int > m_phys_offset
Offset of elemental data into the array m_phys.
virtual void v_HomogeneousFwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal, bool Shuff=true, bool UnShuff=true)
NekDouble m_lhom_y
Width of homogeneous direction y.
static std::vector< unsigned int > NullUnsignedIntVector
virtual ~ExpListHomogeneous2D()
Destructor.
Defines a specification for a set of points.
virtual void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate)
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)
int m_ny
Number of modes = number of poitns in y direction.
LibUtilities::BasisSharedPtr m_homogeneousBasis_y
Definition of the total number of degrees of freedom and quadrature points. Sets up the storage for m...
void Homogeneous2DTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool IsForwards, CoeffState coeffstate=eLocal, bool Shuff=true, bool UnShuff=true)
std::map< Homogeneous2DMatType, DNekBlkMatSharedPtr > Homo2DBlockMatrixMap
A map between homo matrix keys and their associated block matrices.
int m_nz
Number of modes = number of poitns in z direction.
LibUtilities::BasisSharedPtr m_paddingBasis_y
Base expansion in y direction.
boost::shared_ptr< DNekBlkMat > DNekBlkMatSharedPtr
StandardMatrixTag boost::call_traits< LhsDataType >::const_reference rhs typedef NekMatrix< LhsDataType, StandardMatrixTag >::iterator iterator
virtual void v_BwdTrans_IterPerExp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
LibUtilities::CommSharedPtr m_comm
Communicator.
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed t...
DNekMatSharedPtr MatBwdPAD
static const BasisKey NullBasisKey(eNoBasisType, 0, NullPointsKey)
Defines a null basis with no type or points.
LibUtilities::NektarFFTSharedPtr m_FFT_y
virtual void v_FwdTrans_IterPerExp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_WriteVtkPieceData(std::ostream &outfile, int expansion, std::string var)
Array< OneD, NekDouble > m_tmpIN
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< Basis > BasisSharedPtr
bool m_useFFT
FFT variables.
DNekMatSharedPtr MatFwdPAD
virtual void v_HomogeneousBwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal, bool Shuff=true, bool UnShuff=true)
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Describes the specification for a Basis.
virtual void v_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate)
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.
virtual void v_AppendFieldData(LibUtilities::FieldDefinitionsSharedPtr &fielddef, std::vector< NekDouble > &fielddata)
void HomogeneousBwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal, bool Shuff=true, bool UnShuff=true)
DNekBlkMatSharedPtr GetHomogeneous2DBlockMatrix(Homogeneous2DMatType mattype, CoeffState coeffstate=eLocal) const