35 #include <boost/core/ignore_unused.hpp>
47 namespace MultiRegions
68 const bool dealiasing):
74 m_dealiasing(dealiasing)
77 m_comm = pSession->GetComm();
80 "Homogeneous Basis in y direction is a null basis");
82 "Homogeneous Basis in z direction is a null basis");
105 ASSERTL0(
m_comm->GetColumnComm()->GetSize() == 1,
"Remove dealiasing if you want to run in parallel");
116 m_useFFT(In.m_useFFT),
119 m_transposition(In.m_transposition),
122 m_homogeneousBasis_y(In.m_homogeneousBasis_y),
123 m_homogeneousBasis_z(In.m_homogeneousBasis_z),
124 m_lhom_y(In.m_lhom_y),
125 m_lhom_z(In.m_lhom_z),
126 m_homogeneous2DBlockMat(In.m_homogeneous2DBlockMat),
129 m_dealiasing(In.m_dealiasing),
130 m_padsize_y(In.m_padsize_y),
131 m_padsize_z(In.m_padsize_z),
132 MatFwdPAD(In.MatFwdPAD),
133 MatBwdPAD(In.MatBwdPAD)
139 const std::vector<unsigned int> &eIDs):
141 m_useFFT(In.m_useFFT),
144 m_transposition(In.m_transposition),
147 m_homogeneousBasis_y(In.m_homogeneousBasis_y),
148 m_homogeneousBasis_z(In.m_homogeneousBasis_z),
149 m_lhom_y(In.m_lhom_y),
150 m_lhom_z(In.m_lhom_z),
154 m_dealiasing(In.m_dealiasing),
155 m_padsize_y(In.m_padsize_y),
156 m_padsize_z(In.m_padsize_z),
157 MatFwdPAD(In.MatFwdPAD),
158 MatBwdPAD(In.MatBwdPAD)
192 int npoints = outarray.size();
194 int nslabs = npoints/nlines;
235 for(
int j = 0 ; j< nslabs ; j++)
239 for(
int i = 0 ; i<
m_nz ; i++)
246 PadOUT_V1 = (*MatBwdPAD)*PadIN_V1;
247 PadOUT_V2 = (*MatBwdPAD)*PadIN_V2;
255 PadOUT_Re = (*MatFwdPAD)*PadIN_Re;
259 for (
int i = 0; i <
m_nz; i++)
284 int ndim = inarray1.size();
285 ASSERTL1( inarray2.size() % ndim == 0,
286 "Wrong dimensions for DealiasedDotProd.");
287 int nvec = inarray2.size() % ndim;
288 int npts = inarray1[0].size();
291 for (
int i = 0; i < nvec; i++)
294 for (
int j = 0; j < ndim; j++)
297 Vmath::Vadd(npts, outarray[i], 1, out, 1, outarray[i], 1);
304 int cnt = 0, cnt1 = 0;
308 for(
int n = 0; n < nlines; ++n)
310 m_lines[n]->FwdTrans(inarray+cnt, tmparray = outarray + cnt1);
311 cnt +=
m_lines[n]->GetTotPoints();
312 cnt1 +=
m_lines[n]->GetNcoeffs();
322 int cnt = 0, cnt1 = 0;
326 for(
int n = 0; n < nlines; ++n)
328 m_lines[n]->FwdTrans_IterPerExp(inarray+cnt, tmparray = outarray + cnt1);
330 cnt +=
m_lines[n]->GetTotPoints();
331 cnt1 +=
m_lines[n]->GetNcoeffs();
341 int cnt = 0, cnt1 = 0;
345 for(
int n = 0; n < nlines; ++n)
347 m_lines[n]->BwdTrans(inarray+cnt, tmparray = outarray + cnt1);
348 cnt +=
m_lines[n]->GetNcoeffs();
349 cnt1 +=
m_lines[n]->GetTotPoints();
359 int cnt = 0, cnt1 = 0;
363 for(
int n = 0; n < nlines; ++n)
365 m_lines[n]->BwdTrans_IterPerExp(inarray+cnt, tmparray = outarray + cnt1);
367 cnt +=
m_lines[n]->GetNcoeffs();
368 cnt1 +=
m_lines[n]->GetTotPoints();
379 int cnt = 0, cnt1 = 0;
383 for(
int n = 0; n < nlines; ++n)
385 m_lines[n]->IProductWRTBase(inarray+cnt, tmparray = outarray + cnt1);
387 cnt +=
m_lines[n]->GetNcoeffs();
388 cnt1 +=
m_lines[n]->GetTotPoints();
394 int cnt = 0, cnt1 = 0;
398 for(
int n = 0; n < nlines; ++n)
400 m_lines[n]->IProductWRTBase_IterPerExp(inarray+cnt, tmparray = outarray + cnt1);
402 cnt +=
m_lines[n]->GetNcoeffs();
403 cnt1 +=
m_lines[n]->GetTotPoints();
413 boost::ignore_unused(Shuff, UnShuff);
419 int s = inarray.size();
429 for(
int i=0;i<(
p*
m_nz);i++)
437 for(
int i=0;i<(
p*
m_nz);i++)
447 for(
int i=0;i<(
p*
m_ny);i++)
455 for(
int i=0;i<(
p*
m_ny);i++)
499 int nrowsY = blkmatY->GetRows();
500 int ncolsY = blkmatY->GetColumns();
505 int nrowsZ = blkmatZ->GetRows();
506 int ncolsZ = blkmatZ->GetColumns();
519 outY = (*blkmatY)*inY;
523 outZ = (*blkmatZ)*inZ;
542 return matrixIter->second;
579 n_exp =
m_lines[0]->GetNcoeffs();
583 n_exp =
m_lines[0]->GetTotPoints();
625 for(i = 0; i < (n_exp*NumPencils); ++i)
627 BlkMatrix->SetBlock(i,i,loc_mat);
635 std::vector<LibUtilities::FieldDefinitionsSharedPtr> returnval;
641 std::vector<NekDouble> HomoLen(2);
648 std::vector<unsigned int> sIDs
651 std::vector<unsigned int> yIDs;
652 std::vector<unsigned int> zIDs;
654 for(
int n = 0; n < nhom_modes_z; ++n)
656 for(
int m = 0; m < nhom_modes_y; ++m)
663 m_lines[0]->GeneralGetFieldDefinitions(returnval, 2, HomoBasis,
675 std::vector<NekDouble> HomoLen(2);
682 std::vector<unsigned int> sIDs
685 std::vector<unsigned int> yIDs;
686 std::vector<unsigned int> zIDs;
688 for(
int n = 0; n < nhom_modes_z; ++n)
690 for(
int m = 0; m < nhom_modes_y; ++m)
698 m_lines[0]->GeneralGetFieldDefinitions(fielddef, 2, HomoBasis,
710 int ncoeffs_per_line =
m_lines[0]->GetNcoeffs();
714 map<int, int> ElmtID_to_ExpID;
715 for(i = 0; i <
m_lines[0]->GetExpSize(); ++i)
717 ElmtID_to_ExpID[(*m_exp)[i]->GetGeom()->GetGlobalID()] = i;
720 for(i = 0; i < fielddef->m_elementIDs.size(); ++i)
722 int eid = ElmtID_to_ExpID[fielddef->m_elementIDs[i]];
723 int datalen = (*m_exp)[eid]->GetNcoeffs();
725 for(k = 0; k < (NumMod_y*NumMod_z); ++k)
727 fielddata.insert(fielddata.end(),&coeffs[
m_coeff_offset[eid]+k*ncoeffs_per_line],&coeffs[
m_coeff_offset[eid]+k*ncoeffs_per_line]+datalen);
742 int datalen = fielddata.size()/fielddef->m_fields.size();
743 int ncoeffs_per_line =
m_lines[0]->GetNcoeffs();
748 for(i = 0; i < fielddef->m_fields.size(); ++i)
750 if(fielddef->m_fields[i] == field)
757 ASSERTL0(i!= fielddef->m_fields.size(),
"Field not found in data file");
761 map<int, int> ElmtID_to_ExpID;
762 for(i = 0; i <
m_lines[0]->GetExpSize(); ++i)
764 ElmtID_to_ExpID[(*m_exp)[i]->GetGeom()->GetGlobalID()] = i;
767 for(i = 0; i < fielddef->m_elementIDs.size(); ++i)
769 int eid = ElmtID_to_ExpID[fielddef->m_elementIDs[i]];
770 int datalen = (*m_exp)[eid]->GetNcoeffs();
772 for(k = 0; k < (NumMod_y*NumMod_z); ++k)
784 int nq = (*m_exp)[expansion]->GetTotPoints();
785 int npoints_per_line =
m_lines[0]->GetTotPoints();
788 outfile <<
" <DataArray type=\"Float64\" Name=\""
789 << var <<
"\">" << endl;
791 for (
int n = 0; n <
m_lines.size(); ++n)
794 for(i = 0; i < nq; ++i)
800 outfile <<
" </DataArray>" << endl;
810 int npoints = inarray.size();
811 int n_points_line = npoints/nyzlines;
820 for(
int i=0 ; i<nyzlines ; i++ )
822 m_lines[i]->PhysDeriv( tmp1 = inarray + i*n_points_line ,tmp2 = out_d0 + i*n_points_line);
839 for(
int i = 0; i <
m_ny; i++)
843 for(
int j = 0; j <
m_nz; j++)
845 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);
853 for(
int i = 0; i <
m_nz; i++)
856 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);
874 ASSERTL0(
false,
"Semi-phyisical time-stepping not implemented yet for non-Fourier basis")
882 for(
int i = 0; i < n_points_line; i++)
884 StdQuad.
PhysDeriv(tmp1 = temparray + i*nyzlines, tmp2 = temparray1 + i*nyzlines, tmp3 = temparray2 + i*nyzlines);
901 int npoints = inarray.size();
902 int n_points_line = npoints/nyzlines;
915 for(
int i=0 ; i<nyzlines ; i++)
917 m_lines[i]->PhysDeriv( tmp1 = inarray + i*n_points_line ,tmp2 = out_d + i*n_points_line);
938 for(
int i = 0; i <
m_ny; i++)
942 for(
int j = 0; j <
m_nz; j++)
944 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);
960 for(
int i = 0; i <
m_nz; i++)
963 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);
980 ASSERTL0(
false,
"Semi-phyisical time-stepping not implemented yet for non-Fourier basis")
988 for(
int i = 0; i < n_points_line; i++)
990 StdQuad.
PhysDeriv(tmp1 = temparray + i*nyzlines, tmp2 = temparray1 + i*nyzlines, tmp3 = temparray2 + i*nyzlines);
#define ASSERTL0(condition, msg)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed to...
#define sign(a, b)
return the sign(b)*a
Represents a basis of a given type.
const BasisKey GetBasisKey() const
Returns the specification for the Basis.
Describes the specification for a Basis.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
Defines a specification for a set of points.
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
Abstraction of a two-dimensional multi-elemental expansion which is merely a collection of local expa...
virtual void v_HomogeneousFwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool Shuff=true, bool UnShuff=true)
DNekBlkMatSharedPtr GenHomogeneous2DBlockMatrix(Homogeneous2DMatType mattype) const
virtual std::vector< LibUtilities::FieldDefinitionsSharedPtr > v_GetFieldDefinitions(void)
DNekMatSharedPtr MatFwdPAD
LibUtilities::NektarFFTSharedPtr m_FFT_y
virtual void v_AppendFieldData(LibUtilities::FieldDefinitionsSharedPtr &fielddef, std::vector< NekDouble > &fielddata)
ExpListHomogeneous2D(const ExpansionType type)
Default constructor.
int m_nz
Number of modes = number of poitns in z direction.
Homo2DBlockMatrixMapShPtr m_homogeneous2DBlockMat
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.
LibUtilities::NektarFFTSharedPtr m_FFT_z
LibUtilities::BasisSharedPtr m_homogeneousBasis_y
Definition of the total number of degrees of freedom and quadrature points. Sets up the storage for m...
virtual void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
NekDouble m_lhom_z
Width of homogeneous direction z.
DNekMatSharedPtr MatBwdPAD
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)
void HomogeneousBwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool Shuff=true, bool UnShuff=true)
int m_ny
Number of modes = number of poitns in y direction.
void PhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2)
LibUtilities::CommSharedPtr m_Ycomm
LibUtilities::CommSharedPtr m_Zcomm
Array< OneD, NekDouble > m_tmpOUT
virtual void v_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
void Homogeneous2DTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool IsForwards, bool Shuff=true, bool UnShuff=true)
virtual void v_WriteVtkPieceData(std::ostream &outfile, int expansion, std::string var)
virtual void v_DealiasedProd(const Array< OneD, NekDouble > &inarray1, const Array< OneD, NekDouble > &inarray2, Array< OneD, NekDouble > &outarray)
bool m_useFFT
FFT variables.
virtual void v_HomogeneousBwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool Shuff=true, bool UnShuff=true)
LibUtilities::TranspositionSharedPtr m_transposition
Array< OneD, ExpListSharedPtr > m_lines
Vector of ExpList, will be filled with ExpList1D.
LibUtilities::BasisSharedPtr m_homogeneousBasis_z
Base expansion in z direction.
virtual void v_DealiasedDotProd(const Array< OneD, Array< OneD, NekDouble > > &inarray1, const Array< OneD, Array< OneD, NekDouble > > &inarray2, Array< OneD, Array< OneD, NekDouble > > &outarray)
LibUtilities::BasisSharedPtr m_paddingBasis_z
Base expansion in z direction.
void SetPaddingBase(void)
virtual void v_BwdTrans_IterPerExp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
DNekBlkMatSharedPtr GetHomogeneous2DBlockMatrix(Homogeneous2DMatType mattype) const
Array< OneD, NekDouble > m_tmpIN
LibUtilities::BasisSharedPtr m_paddingBasis_y
Base expansion in y direction.
virtual void v_IProductWRTBase_IterPerExp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
NekDouble m_lhom_y
Width of homogeneous direction y.
virtual void v_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_FwdTrans_IterPerExp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
void HomogeneousFwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool Shuff=true, bool UnShuff=true)
virtual ~ExpListHomogeneous2D()
Destructor.
Base class for all multi-elemental spectral/hp expansions.
Array< OneD, NekDouble > m_coeffs
Concatenation of all local expansion coefficients.
Array< OneD, int > m_coeff_offset
Offset of elemental data into the array m_coeffs.
LibUtilities::CommSharedPtr m_comm
Communicator.
void DealiasedProd(const Array< OneD, NekDouble > &inarray1, const Array< OneD, NekDouble > &inarray2, Array< OneD, NekDouble > &outarray)
LibUtilities::SessionReaderSharedPtr m_session
Session.
Array< OneD, int > m_phys_offset
Offset of elemental data into the array m_phys.
Array< OneD, NekDouble > m_phys
The global expansion evaluated at the quadrature points.
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
void PhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1=NullNekDouble1DArray, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray)
Class representing a segment element in reference space.
static BasisSharedPtr NullBasisSharedPtr
static std::vector< unsigned int > NullUnsignedIntVector
BasisManagerT & BasisManager(void)
std::shared_ptr< Basis > BasisSharedPtr
NektarFFTFactory & GetNektarFFTFactory()
static const BasisKey NullBasisKey(eNoBasisType, 0, NullPointsKey)
Defines a null basis with no type or points.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< FieldDefinitions > FieldDefinitionsSharedPtr
@ eFourierEvenlySpaced
1D Evenly-spaced points using Fourier Fit
@ eFourier
Fourier Expansion .
@ eBackwardsCoeffSpaceY1D
@ eBackwardsCoeffSpaceZ1D
std::map< Homogeneous2DMatType, DNekBlkMatSharedPtr > Homo2DBlockMatrixMap
A map between homo matrix keys and their associated block matrices.
static const NekDouble kNekZeroTol
The above copyright notice and this permission notice shall be included.
std::shared_ptr< DNekBlkMat > DNekBlkMatSharedPtr
std::shared_ptr< DNekMat > DNekMatSharedPtr
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.
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
void Zero(int n, T *x, const int incx)
Zero vector.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)