51 const bool useFFT,
const bool dealiasing)
61 const bool useFFT,
const bool dealiasing,
76 const bool useFFT,
const bool dealiasing,
100 for (j = 0; j < nel; ++j)
105 for (n = 1; n <
m_planes.size(); ++n)
109 for (j = 0; j < nel; ++j)
111 (*m_exp).push_back((*
m_exp)[j]);
122 bool DeclarePlanesSetCoeffPhys)
125 if (DeclarePlanesSetCoeffPhys)
129 std::dynamic_pointer_cast<ExpList>(In.
m_planes[0]);
131 for (
int n = 0; n <
m_planes.size(); ++n)
147 bool DeclarePlanesSetCoeffPhys,
151 if (DeclarePlanesSetCoeffPhys)
154 std::vector<unsigned int> eIDsPlane;
155 int nel = eIDs.size() /
m_planes.size();
157 for (
int i = 0; i < nel; ++i)
159 eIDsPlane.push_back(eIDs[i]);
163 std::dynamic_pointer_cast<ExpList>(In.
m_planes[0]);
166 *(zero_plane_old), eIDsPlane, DeclarePlanesSetCoeffPhys, ImpType);
168 for (
int n = 0; n <
m_planes.size(); ++n)
188 int ncoeffs_per_plane =
m_planes[0]->GetNcoeffs();
189 int npoints_per_plane =
m_planes[0]->GetTotPoints();
194 m_ncoeffs = ncoeffs_per_plane * nzplanes;
195 m_npoints = npoints_per_plane * nzplanes;
200 int nel =
m_planes[0]->GetExpSize();
205 for (cnt = n = 0; n < nzplanes; ++n)
207 m_planes[n]->SetCoeffsArray(tmparray =
209 m_planes[n]->SetPhysArray(tmparray =
m_phys + npoints_per_plane * n);
211 for (i = 0; i < nel; ++i)
214 m_planes[n]->GetCoeff_Offset(i) + n * ncoeffs_per_plane;
216 m_planes[n]->GetPhys_Offset(i) + n * npoints_per_plane;
232 (*m_exp)[eid]->GetCoords(xc0, xc1);
238 for (n = 0; n <
m_planes.size(); n++)
248 for (n = 0; n < nzplanes; ++n)
250 Vmath::Fill(npoints,
z[n], tmp_xc = xc2 + npoints * n, 1);
253 Vmath::Vcopy(npoints, xc0, 1, tmp_xc = xc0 + npoints * n, 1);
254 Vmath::Vcopy(npoints, xc1, 1, tmp_xc = xc1 + npoints * n, 1);
282 int npoints =
m_planes[0]->GetTotPoints();
291 for (n = 0; n <
m_planes.size(); n++)
301 for (n = 0; n < nzplanes; ++n)
303 Vmath::Fill(npoints,
z[n], tmp_xc = xc2 + npoints * n, 1);
306 Vmath::Vcopy(npoints, xc0, 1, tmp_xc = xc0 + npoints * n, 1);
307 Vmath::Vcopy(npoints, xc1, 1, tmp_xc = xc1 + npoints * n, 1);
316 "Multi-zone output not supported for homogeneous expansions.");
318 const int nPtsPlane =
m_planes[0]->GetNpoints();
319 const int nElmt =
m_planes[0]->GetExpSize();
320 const int nPlanes =
m_planes.size();
322 for (
int i = 0, cnt = 0; i < nElmt; ++i)
324 const int np0 = (*m_exp)[i]->GetNumPoints(0);
325 const int np1 = (*m_exp)[i]->GetNumPoints(1);
327 for (
int n = 1; n < nPlanes; ++n)
329 const int o1 = (n - 1) * nPtsPlane;
330 const int o2 = n * nPtsPlane;
331 for (
int j = 1; j < np1; ++j)
333 for (
int k = 1; k < np0; ++k)
335 outfile << cnt + (j - 1) * np0 + (k - 1) + o1 + 1 <<
" ";
336 outfile << cnt + (j - 1) * np0 + (k - 1) + o2 + 1 <<
" ";
337 outfile << cnt + (j - 1) * np0 + k + o2 + 1 <<
" ";
338 outfile << cnt + (j - 1) * np0 + k + o1 + 1 <<
" ";
339 outfile << cnt + j * np0 + (k - 1) + o1 + 1 <<
" ";
340 outfile << cnt + j * np0 + (k - 1) + o2 + 1 <<
" ";
341 outfile << cnt + j * np0 + k + o2 + 1 <<
" ";
342 outfile << cnt + j * np0 + k + o1 + 1 << endl;
352 int expansion,
int istrip)
357 m_planes[0]->WriteVtkPieceHeader(outfile, expansion);
362 int outputExtraPlane = 0;
367 outputExtraPlane = 1;
371 int nq0 = (*m_exp)[expansion]->GetNumPoints(0);
372 int nq1 = (*m_exp)[expansion]->GetNumPoints(1);
373 int nq2 =
m_planes.size() + outputExtraPlane;
374 int ntot = nq0 * nq1 * nq2;
375 int ntotminus = (nq0 - 1) * (nq1 - 1) * (nq2 - 1);
381 v_GetCoords(expansion, coords[0], coords[1], coords[2]);
383 if (outputExtraPlane)
388 tmp = coords[0] + (nq2 - 1) * nq0 * nq1, 1);
390 tmp = coords[1] + (nq2 - 1) * nq0 * nq1, 1);
393 (coords[2][nq0 * nq1] - coords[2][0]);
394 Vmath::Fill(nq0 * nq1,
z, tmp = coords[2] + (nq2 - 1) * nq0 * nq1, 1);
398 m_session->LoadParameter(
"DistStrip", DistStrip, 0);
400 for (
int i = 0; i < ntot; i++)
402 coords[2][i] += istrip * DistStrip;
405 outfile <<
" <Piece NumberOfPoints=\"" << ntot <<
"\" NumberOfCells=\""
406 << ntotminus <<
"\">" << endl;
407 outfile <<
" <Points>" << endl;
408 outfile <<
" <DataArray type=\"Float64\" "
409 << R
"(NumberOfComponents="3" format="ascii">)" << endl;
411 for (i = 0; i < ntot; ++i)
413 for (j = 0; j < 3; ++j)
415 outfile << coords[j][i] <<
" ";
420 outfile <<
" </DataArray>" << endl;
421 outfile <<
" </Points>" << endl;
422 outfile <<
" <Cells>" << endl;
423 outfile <<
" <DataArray type=\"Int32\" "
424 << R
"(Name="connectivity" format="ascii">)" << endl;
425 for (i = 0; i < nq0 - 1; ++i)
427 for (j = 0; j < nq1 - 1; ++j)
429 for (k = 0; k < nq2 - 1; ++k)
431 outfile << k * nq0 * nq1 + j * nq0 + i <<
" "
432 << k * nq0 * nq1 + j * nq0 + i + 1 <<
" "
433 << k * nq0 * nq1 + (j + 1) * nq0 + i + 1 <<
" "
434 << k * nq0 * nq1 + (j + 1) * nq0 + i <<
" "
435 << (k + 1) * nq0 * nq1 + j * nq0 + i <<
" "
436 << (k + 1) * nq0 * nq1 + j * nq0 + i + 1 <<
" "
437 << (k + 1) * nq0 * nq1 + (j + 1) * nq0 + i + 1 <<
" "
438 << (k + 1) * nq0 * nq1 + (j + 1) * nq0 + i << endl;
443 outfile <<
" </DataArray>" << endl;
444 outfile <<
" <DataArray type=\"Int32\" "
445 << R
"(Name="offsets" format="ascii">)" << endl;
446 for (i = 0; i < ntotminus; ++i)
448 outfile << i * 8 + 8 <<
" ";
451 outfile <<
" </DataArray>" << endl;
452 outfile <<
" <DataArray type=\"UInt8\" "
453 << R
"(Name="types" format="ascii">)" << endl;
454 for (i = 0; i < ntotminus; ++i)
459 outfile <<
" </DataArray>" << endl;
460 outfile <<
" </Cells>" << endl;
461 outfile <<
" <PointData>" << endl;
473 for (
int n = 0; n <
m_planes.size(); n++)
480 for (
int n = 0; n <
m_planes.size(); ++n)
482 errL2 =
m_planes[n]->L2(inarray + cnt);
484 err += errL2 * errL2 * local_w[n] *
m_lhom * 0.5;
489 for (
int n = 0; n <
m_planes.size(); ++n)
491 errL2 =
m_planes[n]->L2(inarray + cnt, soln + cnt);
493 err += errL2 * errL2 * local_w[n] *
m_lhom * 0.5;
507 for (
int n = 0; n <
m_planes[0]->GetExpSize(); ++n)
511 area +=
m_planes[0]->GetExp(n)->Integral(inarray);
517 for (
int n = 0; n <
m_planes.size(); n += 2)
523 for (
int i = 0; i <
m_planes[n]->GetExpSize(); ++i)
531 energy[n / 2] += err * err;
538 energy[n / 2] += err * err;
542 energy[n / 2] /= 2.0 * area;
#define ASSERTL0(condition, msg)
Describes the specification for a Basis.
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...
void GenExpList3DHomogeneous1D(const SpatialDomains::ExpansionInfoMap &expansions, const Collections::ImplementationType ImpType)
NekDouble v_L2(const Array< OneD, const NekDouble > &inarray, const Array< OneD, const NekDouble > &soln=NullNekDouble1DArray) override
~ExpList3DHomogeneous1D() override
Destructor.
void v_GetCoords(Array< OneD, NekDouble > &coord_0, Array< OneD, NekDouble > &coord_1, Array< OneD, NekDouble > &coord_2) override
void SetCoeffPhys(void)
Definition of the total number of degrees of freedom and quadrature points. Sets up the storage for m...
Array< OneD, const NekDouble > v_HomogeneousEnergy(void) override
void v_WriteVtkPieceHeader(std::ostream &outfile, int expansion, int istrip) override
void v_WriteTecplotConnectivity(std::ostream &outfile, int expansion) override
ExpList3DHomogeneous1D()
Default constructor.
Abstraction of a two-dimensional multi-elemental expansion which is merely a collection of local expa...
NekDouble m_lhom
Width of homogeneous direction.
LibUtilities::TranspositionSharedPtr m_transposition
Array< OneD, ExpListSharedPtr > m_planes
LibUtilities::BasisSharedPtr m_homogeneousBasis
Definition of the total number of degrees of freedom and quadrature points. Sets up the storage for m...
Array< OneD, NekDouble > m_coeffs
Concatenation of all local expansion coefficients.
const Array< OneD, const NekDouble > & GetCoeffs() const
This function returns (a reference to) the array (implemented as m_coeffs) containing all local expa...
int GetCoeff_Offset(int n) const
Get the start offset position for a local contiguous list of coeffs correspoinding to element n.
Array< OneD, int > m_coeff_offset
Offset of elemental data into the array m_coeffs.
LibUtilities::CommSharedPtr m_comm
Communicator.
std::shared_ptr< LocalRegions::ExpansionVector > m_exp
The list of local expansions.
int m_ncoeffs
The total number of local degrees of freedom. m_ncoeffs .
const std::shared_ptr< LocalRegions::ExpansionVector > GetExp() const
This function returns the vector of elements in the expansion.
SpatialDomains::MeshGraphSharedPtr m_graph
Mesh associated with this expansion list.
LibUtilities::SessionReaderSharedPtr m_session
Session.
Array< OneD, int > m_phys_offset
Offset of elemental data into the array m_phys.
ExpansionType m_expType
Expansion type.
Array< OneD, NekDouble > m_phys
The global expansion evaluated at the quadrature points.
int GetTotPoints(void) const
Returns the total number of quadrature points m_npoints .
std::shared_ptr< SessionReader > SessionReaderSharedPtr
@ eFourierEvenlySpaced
1D Evenly-spaced points using Fourier Fit
@ eFourier
Fourier Expansion .
std::shared_ptr< Expansion > ExpansionSharedPtr
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
std::map< int, ExpansionInfoShPtr > ExpansionInfoMap
std::vector< double > w(NPUPPER)
std::vector< double > z(NPUPPER)
static Array< OneD, NekDouble > NullNekDouble1DArray
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
void Sadd(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Add vector y = alpha + x.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
scalarT< T > sqrt(scalarT< T > in)