49 m_lhom_z(1), m_homogeneous2DBlockMat(
54ExpListHomogeneous2D::ExpListHomogeneous2D(
55 const ExpansionType type,
56 const LibUtilities::SessionReaderSharedPtr &pSession,
57 const LibUtilities::BasisKey &HomoBasis_y,
58 const LibUtilities::BasisKey &HomoBasis_z,
const NekDouble lhom_y,
59 const NekDouble lhom_z,
const bool useFFT,
const bool dealiasing)
60 : ExpList(type), m_useFFT(useFFT), m_lhom_y(lhom_y), m_lhom_z(lhom_z),
61 m_homogeneous2DBlockMat(
63 m_dealiasing(dealiasing)
66 m_comm = pSession->GetComm();
68 ASSERTL2(HomoBasis_y != LibUtilities::NullBasisKey,
69 "Homogeneous Basis in y direction is a null basis");
70 ASSERTL2(HomoBasis_z != LibUtilities::NullBasisKey,
71 "Homogeneous Basis in z direction is a null basis");
73 m_homogeneousBasis_y = LibUtilities::BasisManager()[HomoBasis_y];
74 m_homogeneousBasis_z = LibUtilities::BasisManager()[HomoBasis_z];
77 MemoryManager<LibUtilities::Transposition>::AllocateSharedPtr(
78 HomoBasis_y, HomoBasis_z, m_comm->GetColumnComm());
80 m_Ycomm = m_comm->GetColumnComm()->GetRowComm();
81 m_Zcomm = m_comm->GetColumnComm()->GetRowComm();
83 m_ny = m_homogeneousBasis_y->GetNumPoints() / m_Ycomm->GetSize();
84 m_nz = m_homogeneousBasis_z->GetNumPoints() / m_Zcomm->GetSize();
86 m_lines = Array<OneD, ExpListSharedPtr>(m_ny * m_nz);
91 LibUtilities::GetNektarFFTFactory().CreateInstance(
"NekFFTW", m_ny);
93 LibUtilities::GetNektarFFTFactory().CreateInstance(
"NekFFTW", m_nz);
98 ASSERTL0(m_comm->GetColumnComm()->GetSize() == 1,
99 "Remove dealiasing if you want to run in parallel");
107ExpListHomogeneous2D::ExpListHomogeneous2D(
const ExpListHomogeneous2D &In)
108 : ExpList(In, false), m_useFFT(In.m_useFFT), m_FFT_y(In.m_FFT_y),
109 m_FFT_z(In.m_FFT_z), m_transposition(In.m_transposition),
110 m_Ycomm(In.m_Ycomm), m_Zcomm(In.m_Ycomm),
111 m_homogeneousBasis_y(In.m_homogeneousBasis_y),
112 m_homogeneousBasis_z(In.m_homogeneousBasis_z), m_lhom_y(In.m_lhom_y),
113 m_lhom_z(In.m_lhom_z),
114 m_homogeneous2DBlockMat(In.m_homogeneous2DBlockMat), m_ny(In.m_ny),
115 m_nz(In.m_nz), m_dealiasing(In.m_dealiasing), m_padsize_y(In.m_padsize_y),
116 m_padsize_z(In.m_padsize_z), MatFwdPAD(In.MatFwdPAD),
117 MatBwdPAD(In.MatBwdPAD)
119 m_lines = Array<OneD, ExpListSharedPtr>(In.m_lines.size());
122ExpListHomogeneous2D::ExpListHomogeneous2D(
123 const ExpListHomogeneous2D &In,
const std::vector<unsigned int> &eIDs)
124 : ExpList(In, eIDs, false), m_useFFT(In.m_useFFT), m_FFT_y(In.m_FFT_y),
125 m_FFT_z(In.m_FFT_z), m_transposition(In.m_transposition),
126 m_Ycomm(In.m_Ycomm), m_Zcomm(In.m_Ycomm),
127 m_homogeneousBasis_y(In.m_homogeneousBasis_y),
128 m_homogeneousBasis_z(In.m_homogeneousBasis_z), m_lhom_y(In.m_lhom_y),
129 m_lhom_z(In.m_lhom_z),
130 m_homogeneous2DBlockMat(
132 m_ny(In.m_ny), m_nz(In.m_nz), m_dealiasing(In.m_dealiasing),
133 m_padsize_y(In.m_padsize_y), m_padsize_z(In.m_padsize_z),
134 MatFwdPAD(In.MatFwdPAD), MatBwdPAD(In.MatBwdPAD)
136 m_lines = Array<OneD, ExpListSharedPtr>(In.m_lines.size());
142ExpListHomogeneous2D::~ExpListHomogeneous2D()
146void ExpListHomogeneous2D::v_HomogeneousFwdTrans(
147 const int npts,
const Array<OneD, const NekDouble> &inarray,
148 Array<OneD, NekDouble> &outarray,
bool Shuff,
bool UnShuff)
151 Homogeneous2DTrans(npts, inarray, outarray,
true, Shuff, UnShuff);
154void ExpListHomogeneous2D::v_HomogeneousBwdTrans(
155 const int npts,
const Array<OneD, const NekDouble> &inarray,
156 Array<OneD, NekDouble> &outarray,
bool Shuff,
bool UnShuff)
159 Homogeneous2DTrans(npts, inarray, outarray,
false, Shuff, UnShuff);
162void ExpListHomogeneous2D::v_DealiasedProd(
163 const int npoints,
const Array<OneD, NekDouble> &inarray1,
164 const Array<OneD, NekDouble> &inarray2, Array<OneD, NekDouble> &outarray)
170 int nslabs = npoints /
173 Array<OneD, NekDouble> V1(npoints);
174 Array<OneD, NekDouble> V2(npoints);
175 Array<OneD, NekDouble> V1V2(npoints);
176 Array<OneD, NekDouble> ShufV1(npoints);
177 Array<OneD, NekDouble> ShufV2(npoints);
178 Array<OneD, NekDouble> ShufV1V2(npoints);
187 HomogeneousFwdTrans(npoints, inarray1, V1);
188 HomogeneousFwdTrans(npoints, inarray2, V2);
191 m_transposition->Transpose(npoints, V1, ShufV1,
false,
192 LibUtilities::eXtoYZ);
193 m_transposition->Transpose(npoints, V2, ShufV2,
false,
194 LibUtilities::eXtoYZ);
196 Array<OneD, NekDouble> PadV1_slab_coeff(m_padsize_y * m_padsize_z, 0.0);
197 Array<OneD, NekDouble> PadV2_slab_coeff(m_padsize_y * m_padsize_z, 0.0);
198 Array<OneD, NekDouble> PadRe_slab_coeff(m_padsize_y * m_padsize_z, 0.0);
200 Array<OneD, NekDouble> PadV1_slab_phys(m_padsize_y * m_padsize_z, 0.0);
201 Array<OneD, NekDouble> PadV2_slab_phys(m_padsize_y * m_padsize_z, 0.0);
202 Array<OneD, NekDouble> PadRe_slab_phys(m_padsize_y * m_padsize_z, 0.0);
204 NekVector<NekDouble> PadIN_V1(m_padsize_y * m_padsize_z, PadV1_slab_coeff,
206 NekVector<NekDouble> PadOUT_V1(m_padsize_y * m_padsize_z, PadV1_slab_phys,
209 NekVector<NekDouble> PadIN_V2(m_padsize_y * m_padsize_z, PadV2_slab_coeff,
211 NekVector<NekDouble> PadOUT_V2(m_padsize_y * m_padsize_z, PadV2_slab_phys,
214 NekVector<NekDouble> PadIN_Re(m_padsize_y * m_padsize_z, PadRe_slab_phys,
216 NekVector<NekDouble> PadOUT_Re(m_padsize_y * m_padsize_z, PadRe_slab_coeff,
220 for (
int j = 0; j < nslabs; j++)
224 for (
int i = 0; i < m_nz; i++)
227 &(PadV1_slab_coeff[i * 2 * m_ny]), 1);
229 &(PadV2_slab_coeff[i * 2 * m_ny]), 1);
233 PadOUT_V1 = (*MatBwdPAD) * PadIN_V1;
234 PadOUT_V2 = (*MatBwdPAD) * PadIN_V2;
238 Vmath::Vmul(m_padsize_y * m_padsize_z, PadV1_slab_phys, 1,
239 PadV2_slab_phys, 1, PadRe_slab_phys, 1);
243 PadOUT_Re = (*MatFwdPAD) * PadIN_Re;
247 for (
int i = 0; i < m_nz; i++)
249 Vmath::Vcopy(m_ny, &(PadRe_slab_coeff[i * 2 * m_ny]), 1,
250 &(ShufV1V2[i * m_ny + j * nlines]), 1);
256 m_transposition->Transpose(npoints, ShufV1V2, outarray,
false,
257 LibUtilities::eYZtoX);
261 m_transposition->Transpose(npoints, ShufV1V2, V1V2,
false,
262 LibUtilities::eYZtoX);
265 HomogeneousBwdTrans(npoints, V1V2, outarray);
269void ExpListHomogeneous2D::v_DealiasedDotProd(
270 const int npts,
const Array<OneD, Array<OneD, NekDouble>> &inarray1,
271 const Array<OneD, Array<OneD, NekDouble>> &inarray2,
272 Array<OneD, Array<OneD, NekDouble>> &outarray)
275 size_t ndim = inarray1.size();
276 ASSERTL1(inarray2.size() % ndim == 0,
277 "Wrong dimensions for DealiasedDotProd.");
279 size_t nvec = inarray2.size() % ndim;
281 Array<OneD, NekDouble> out(npts);
282 for (
size_t i = 0; i < nvec; i++)
285 for (
size_t j = 0; j < ndim; j++)
287 DealiasedProd(npts, inarray1[j], inarray2[i * ndim + j], out);
288 Vmath::Vadd(npts, outarray[i], 1, out, 1, outarray[i], 1);
293void ExpListHomogeneous2D::v_FwdTrans(
294 const Array<OneD, const NekDouble> &inarray,
295 Array<OneD, NekDouble> &outarray)
297 size_t cnt = 0, cnt1 = 0;
298 Array<OneD, NekDouble> tmparray;
299 size_t nlines = m_lines.size();
301 for (
size_t n = 0; n < nlines; ++n)
303 m_lines[n]->FwdTrans(inarray + cnt, tmparray = outarray + cnt1);
304 cnt += m_lines[n]->GetTotPoints();
305 cnt1 += m_lines[n]->GetNcoeffs();
309 HomogeneousFwdTrans(cnt1, outarray, outarray);
313void ExpListHomogeneous2D::v_FwdTransLocalElmt(
314 const Array<OneD, const NekDouble> &inarray,
315 Array<OneD, NekDouble> &outarray)
317 size_t cnt = 0, cnt1 = 0;
318 Array<OneD, NekDouble> tmparray;
319 size_t nlines = m_lines.size();
321 for (
size_t n = 0; n < nlines; ++n)
323 m_lines[n]->FwdTransLocalElmt(inarray + cnt,
324 tmparray = outarray + cnt1);
326 cnt += m_lines[n]->GetTotPoints();
327 cnt1 += m_lines[n]->GetNcoeffs();
331 HomogeneousFwdTrans(cnt1, outarray, outarray);
335void ExpListHomogeneous2D::v_FwdTransBndConstrained(
336 const Array<OneD, const NekDouble> &inarray,
337 Array<OneD, NekDouble> &outarray)
339 int cnt = 0, cnt1 = 0;
340 Array<OneD, NekDouble> tmparray;
341 int nlines = m_lines.size();
343 for (
int n = 0; n < nlines; ++n)
345 m_lines[n]->FwdTransBndConstrained(inarray + cnt,
346 tmparray = outarray + cnt1);
348 cnt += m_lines[n]->GetTotPoints();
349 cnt1 += m_lines[n]->GetNcoeffs();
353 HomogeneousFwdTrans(cnt1, outarray, outarray);
357void ExpListHomogeneous2D::v_BwdTrans(
358 const Array<OneD, const NekDouble> &inarray,
359 Array<OneD, NekDouble> &outarray)
361 size_t cnt = 0, cnt1 = 0;
362 Array<OneD, NekDouble> tmparray;
363 size_t nlines = m_lines.size();
365 for (
size_t n = 0; n < nlines; ++n)
367 m_lines[n]->BwdTrans(inarray + cnt, tmparray = outarray + cnt1);
368 cnt += m_lines[n]->GetNcoeffs();
369 cnt1 += m_lines[n]->GetTotPoints();
373 HomogeneousBwdTrans(cnt1, outarray, outarray);
377void ExpListHomogeneous2D::v_IProductWRTBase(
378 const Array<OneD, const NekDouble> &inarray,
379 Array<OneD, NekDouble> &outarray)
381 size_t cnt = 0, cnt1 = 0;
382 Array<OneD, NekDouble> tmparray;
383 size_t nlines = m_lines.size();
385 for (
size_t n = 0; n < nlines; ++n)
387 m_lines[n]->IProductWRTBase(inarray + cnt, tmparray = outarray + cnt1);
389 cnt += m_lines[n]->GetNcoeffs();
390 cnt1 += m_lines[n]->GetTotPoints();
394void ExpListHomogeneous2D::Homogeneous2DTrans(
395 const int num_dofs,
const Array<OneD, const NekDouble> &inarray,
396 Array<OneD, NekDouble> &outarray,
bool IsForwards,
397 [[maybe_unused]]
bool Shuff, [[maybe_unused]]
bool UnShuff)
402 int n = m_lines.size();
408 Array<OneD, NekDouble> fft_in(num_dofs);
409 Array<OneD, NekDouble> fft_out(num_dofs);
411 m_transposition->Transpose(num_dofs, inarray, fft_in,
false,
412 LibUtilities::eXtoYZ);
416 for (
int i = 0; i < (
p * m_nz); i++)
418 m_FFT_y->FFTFwdTrans(m_tmpIN = fft_in + i * m_ny,
419 m_tmpOUT = fft_out + i * m_ny);
424 for (
int i = 0; i < (
p * m_nz); i++)
426 m_FFT_y->FFTBwdTrans(m_tmpIN = fft_in + i * m_ny,
427 m_tmpOUT = fft_out + i * m_ny);
431 m_transposition->Transpose(num_dofs, fft_out, fft_in,
false,
432 LibUtilities::eYZtoZY);
436 for (
int i = 0; i < (
p * m_ny); i++)
438 m_FFT_z->FFTFwdTrans(m_tmpIN = fft_in + i * m_nz,
439 m_tmpOUT = fft_out + i * m_nz);
444 for (
int i = 0; i < (
p * m_ny); i++)
446 m_FFT_z->FFTBwdTrans(m_tmpIN = fft_in + i * m_nz,
447 m_tmpOUT = fft_out + i * m_nz);
452 m_transposition->Transpose(num_dofs, fft_out, fft_in,
false,
453 LibUtilities::eZYtoYZ);
455 m_transposition->Transpose(num_dofs, fft_in, outarray,
false,
456 LibUtilities::eYZtoX);
463 if (num_dofs == m_npoints)
467 blkmatY = GetHomogeneous2DBlockMatrix(eForwardsPhysSpaceY1D);
468 blkmatZ = GetHomogeneous2DBlockMatrix(eForwardsPhysSpaceZ1D);
472 blkmatY = GetHomogeneous2DBlockMatrix(eBackwardsPhysSpaceY1D);
473 blkmatZ = GetHomogeneous2DBlockMatrix(eBackwardsPhysSpaceZ1D);
480 blkmatY = GetHomogeneous2DBlockMatrix(eForwardsCoeffSpaceY1D);
481 blkmatZ = GetHomogeneous2DBlockMatrix(eForwardsCoeffSpaceZ1D);
485 blkmatY = GetHomogeneous2DBlockMatrix(eBackwardsCoeffSpaceY1D);
486 blkmatZ = GetHomogeneous2DBlockMatrix(eBackwardsCoeffSpaceZ1D);
490 int nrowsY = blkmatY->GetRows();
491 int ncolsY = blkmatY->GetColumns();
493 Array<OneD, NekDouble> sortedinarrayY(ncolsY);
494 Array<OneD, NekDouble> sortedoutarrayY(nrowsY);
496 int nrowsZ = blkmatZ->GetRows();
497 int ncolsZ = blkmatZ->GetColumns();
499 Array<OneD, NekDouble> sortedinarrayZ(ncolsZ);
500 Array<OneD, NekDouble> sortedoutarrayZ(nrowsZ);
502 NekVector<NekDouble> inY(ncolsY, sortedinarrayY, eWrapper);
503 NekVector<NekDouble> outY(nrowsY, sortedoutarrayY, eWrapper);
505 NekVector<NekDouble> inZ(ncolsZ, sortedinarrayZ, eWrapper);
506 NekVector<NekDouble> outZ(nrowsZ, sortedoutarrayZ, eWrapper);
508 m_transposition->Transpose(num_dofs, inarray, sortedinarrayY,
509 !IsForwards, LibUtilities::eXtoYZ);
511 outY = (*blkmatY) * inY;
513 m_transposition->Transpose(sortedoutarrayY.size(), sortedoutarrayY,
514 sortedinarrayZ,
false,
515 LibUtilities::eYZtoZY);
517 outZ = (*blkmatZ) * inZ;
519 m_transposition->Transpose(sortedoutarrayZ.size(), sortedoutarrayZ,
520 sortedoutarrayY,
false,
521 LibUtilities::eZYtoYZ);
523 m_transposition->Transpose(sortedoutarrayY.size(), sortedoutarrayY,
524 outarray,
false, LibUtilities::eYZtoX);
529 Homogeneous2DMatType mattype)
const
531 auto matrixIter = m_homogeneous2DBlockMat->find(mattype);
533 if (matrixIter == m_homogeneous2DBlockMat->end())
535 return ((*m_homogeneous2DBlockMat)[mattype] =
536 GenHomogeneous2DBlockMatrix(mattype));
540 return matrixIter->second;
545 Homogeneous2DMatType mattype)
const
553 LibUtilities::BasisSharedPtr Basis;
559 if ((mattype == eForwardsCoeffSpaceY1D) ||
560 (mattype == eBackwardsCoeffSpaceY1D) ||
561 (mattype == eForwardsPhysSpaceY1D) ||
562 (mattype == eBackwardsPhysSpaceY1D))
564 Basis = m_homogeneousBasis_y;
565 NumPoints = m_homogeneousBasis_y->GetNumModes();
566 NumModes = m_homogeneousBasis_y->GetNumPoints();
567 NumPencils = m_homogeneousBasis_z->GetNumPoints();
571 Basis = m_homogeneousBasis_z;
572 NumPoints = m_homogeneousBasis_z->GetNumModes();
573 NumModes = m_homogeneousBasis_z->GetNumPoints();
574 NumPencils = m_homogeneousBasis_y->GetNumPoints();
577 if ((mattype == eForwardsCoeffSpaceY1D) ||
578 (mattype == eForwardsCoeffSpaceZ1D) ||
579 (mattype == eBackwardsCoeffSpaceY1D) ||
580 (mattype == eBackwardsCoeffSpaceZ1D))
582 n_exp = m_lines[0]->GetNcoeffs();
586 n_exp = m_lines[0]->GetTotPoints();
589 Array<OneD, unsigned int> nrows(n_exp);
590 Array<OneD, unsigned int> ncols(n_exp);
592 if ((mattype == eForwardsCoeffSpaceY1D) ||
593 (mattype == eForwardsPhysSpaceY1D) ||
594 (mattype == eForwardsCoeffSpaceZ1D) ||
595 (mattype == eForwardsPhysSpaceZ1D))
597 nrows = Array<OneD, unsigned int>(n_exp * NumPencils, NumModes);
598 ncols = Array<OneD, unsigned int>(n_exp * NumPencils, NumPoints);
602 nrows = Array<OneD, unsigned int>(n_exp * NumPencils, NumPoints);
603 ncols = Array<OneD, unsigned int>(n_exp * NumPencils, NumModes);
607 BlkMatrix = MemoryManager<DNekBlkMat>::AllocateSharedPtr(nrows, ncols,
610 StdRegions::StdSegExp StdSeg(Basis->GetBasisKey());
612 if ((mattype == eForwardsCoeffSpaceY1D) ||
613 (mattype == eForwardsPhysSpaceY1D) ||
614 (mattype == eForwardsCoeffSpaceZ1D) ||
615 (mattype == eForwardsPhysSpaceZ1D))
617 StdRegions::StdMatrixKey matkey(StdRegions::eFwdTrans,
618 StdSeg.DetShapeType(), StdSeg);
620 loc_mat = StdSeg.GetStdMatrix(matkey);
624 StdRegions::StdMatrixKey matkey(StdRegions::eBwdTrans,
625 StdSeg.DetShapeType(), StdSeg);
627 loc_mat = StdSeg.GetStdMatrix(matkey);
631 for (i = 0; i < (n_exp * NumPencils); ++i)
633 BlkMatrix->SetBlock(i, i, loc_mat);
639std::vector<LibUtilities::FieldDefinitionsSharedPtr> ExpListHomogeneous2D::
640 v_GetFieldDefinitions()
642 std::vector<LibUtilities::FieldDefinitionsSharedPtr> returnval;
644 Array<OneD, LibUtilities::BasisSharedPtr> HomoBasis(2);
645 HomoBasis[0] = m_homogeneousBasis_y;
646 HomoBasis[1] = m_homogeneousBasis_z;
648 std::vector<NekDouble> HomoLen(2);
649 HomoLen[0] = m_lhom_y;
650 HomoLen[1] = m_lhom_z;
652 int nhom_modes_y = m_homogeneousBasis_y->GetNumModes();
653 int nhom_modes_z = m_homogeneousBasis_z->GetNumModes();
655 std::vector<unsigned int> sIDs = LibUtilities::NullUnsignedIntVector;
657 std::vector<unsigned int> yIDs;
658 std::vector<unsigned int> zIDs;
660 for (
int n = 0; n < nhom_modes_z; ++n)
662 for (
int m = 0; m < nhom_modes_y; ++m)
669 m_lines[0]->GeneralGetFieldDefinitions(returnval, 2, HomoBasis, HomoLen,
670 false, sIDs, zIDs, yIDs);
674void ExpListHomogeneous2D::v_GetFieldDefinitions(
675 std::vector<LibUtilities::FieldDefinitionsSharedPtr> &fielddef)
678 Array<OneD, LibUtilities::BasisSharedPtr> HomoBasis(2);
679 HomoBasis[0] = m_homogeneousBasis_y;
680 HomoBasis[1] = m_homogeneousBasis_z;
681 std::vector<NekDouble> HomoLen(2);
682 HomoLen[0] = m_lhom_y;
683 HomoLen[1] = m_lhom_z;
685 int nhom_modes_y = m_homogeneousBasis_y->GetNumModes();
686 int nhom_modes_z = m_homogeneousBasis_z->GetNumModes();
688 std::vector<unsigned int> sIDs = LibUtilities::NullUnsignedIntVector;
690 std::vector<unsigned int> yIDs;
691 std::vector<unsigned int> zIDs;
693 for (
int n = 0; n < nhom_modes_z; ++n)
695 for (
int m = 0; m < nhom_modes_y; ++m)
703 m_lines[0]->GeneralGetFieldDefinitions(fielddef, 2, HomoBasis, HomoLen,
704 false, sIDs, zIDs, yIDs);
707void ExpListHomogeneous2D::v_AppendFieldData(
708 LibUtilities::FieldDefinitionsSharedPtr &fielddef,
709 std::vector<NekDouble> &fielddata, Array<OneD, NekDouble> &coeffs)
713 int NumMod_y = m_homogeneousBasis_y->GetNumModes();
714 int NumMod_z = m_homogeneousBasis_z->GetNumModes();
716 int ncoeffs_per_line = m_lines[0]->GetNcoeffs();
720 map<int, int> ElmtID_to_ExpID;
721 for (i = 0; i < m_lines[0]->GetExpSize(); ++i)
723 ElmtID_to_ExpID[(*m_exp)[i]->GetGeom()->GetGlobalID()] = i;
726 for (i = 0; i < fielddef->m_elementIDs.size(); ++i)
728 int eid = ElmtID_to_ExpID[fielddef->m_elementIDs[i]];
729 int datalen = (*m_exp)[eid]->GetNcoeffs();
731 for (k = 0; k < (NumMod_y * NumMod_z); ++k)
735 &coeffs[m_coeff_offset[eid] + k * ncoeffs_per_line],
736 &coeffs[m_coeff_offset[eid] + k * ncoeffs_per_line] + datalen);
741void ExpListHomogeneous2D::v_AppendFieldData(
742 LibUtilities::FieldDefinitionsSharedPtr &fielddef,
743 std::vector<NekDouble> &fielddata)
745 v_AppendFieldData(fielddef, fielddata, m_coeffs);
748void ExpListHomogeneous2D::v_ExtractDataToCoeffs(
749 LibUtilities::FieldDefinitionsSharedPtr &fielddef,
750 std::vector<NekDouble> &fielddata, std::string &field,
751 Array<OneD, NekDouble> &coeffs,
752 [[maybe_unused]] std::unordered_map<int, int> zIdToPlane)
756 int datalen = fielddata.size() / fielddef->m_fields.size();
757 int ncoeffs_per_line = m_lines[0]->GetNcoeffs();
758 int NumMod_y = m_homogeneousBasis_y->GetNumModes();
759 int NumMod_z = m_homogeneousBasis_z->GetNumModes();
761 for (i = 0; i < fielddef->m_fields.size(); ++i)
763 if (fielddef->m_fields[i] == field)
769 ASSERTL0(i != fielddef->m_fields.size(),
"Field not found in data file");
772 map<int, int> ElmtID_to_ExpID;
773 for (i = 0; i < m_lines[0]->GetExpSize(); ++i)
775 ElmtID_to_ExpID[(*m_exp)[i]->GetGeom()->GetGlobalID()] = i;
777 for (i = 0; i < fielddef->m_elementIDs.size(); ++i)
779 int eid = ElmtID_to_ExpID[fielddef->m_elementIDs[i]];
780 int datalen = (*m_exp)[eid]->GetNcoeffs();
781 for (k = 0; k < (NumMod_y * NumMod_z); ++k)
784 &coeffs[m_coeff_offset[eid] + k * ncoeffs_per_line],
790void ExpListHomogeneous2D::v_WriteVtkPieceData(std::ostream &outfile,
791 int expansion, std::string var)
794 int nq = (*m_exp)[expansion]->GetTotPoints();
795 int npoints_per_line = m_lines[0]->GetTotPoints();
798 outfile << R
"( <DataArray type="Float64" Name=")" << var << "\">"
801 for (
int n = 0; n < m_lines.size(); ++n)
803 const Array<OneD, NekDouble> phys =
804 m_phys + m_phys_offset[expansion] + n * npoints_per_line;
806 for (i = 0; i < nq; ++i)
808 outfile << (fabs(phys[i]) < NekConstants::kNekZeroTol ? 0 : phys[i])
813 outfile <<
" </DataArray>" << endl;
816void ExpListHomogeneous2D::v_PhysDeriv(
817 const Array<OneD, const NekDouble> &inarray, Array<OneD, NekDouble> &out_d0,
818 Array<OneD, NekDouble> &out_d1, Array<OneD, NekDouble> &out_d2)
821 int nyzlines = m_lines.size();
823 int n_points_line = m_npoints / nyzlines;
825 Array<OneD, NekDouble> temparray(m_npoints);
826 Array<OneD, NekDouble> temparray1(m_npoints);
827 Array<OneD, NekDouble> temparray2(m_npoints);
828 Array<OneD, NekDouble> tmp1;
829 Array<OneD, NekDouble> tmp2;
830 Array<OneD, NekDouble> tmp3;
832 for (
int i = 0; i < nyzlines; i++)
834 m_lines[i]->PhysDeriv(tmp1 = inarray + i * n_points_line,
835 tmp2 = out_d0 + i * n_points_line);
838 if (m_homogeneousBasis_y->GetBasisType() == LibUtilities::eFourier &&
839 m_homogeneousBasis_z->GetBasisType() == LibUtilities::eFourier)
847 HomogeneousFwdTrans(m_npoints, inarray, temparray);
853 for (
int i = 0; i < m_ny; i++)
855 beta = -
sign * 2 * M_PI * (i / 2) / m_lhom_y;
857 for (
int j = 0; j < m_nz; j++)
860 tmp1 = temparray + n_points_line * (i + j * m_ny),
863 n_points_line * ((i -
int(
sign)) + j * m_ny),
872 for (
int i = 0; i < m_nz; i++)
874 beta = -
sign * 2 * M_PI * (i / 2) / m_lhom_z;
876 m_ny * n_points_line, beta,
877 tmp1 = temparray + i * m_ny * n_points_line, 1,
878 tmp2 = temparray2 + (i -
int(
sign)) * m_ny * n_points_line, 1);
888 HomogeneousBwdTrans(m_npoints, temparray1, out_d1);
889 HomogeneousBwdTrans(m_npoints, temparray2, out_d2);
896 ASSERTL0(
false,
"Semi-phyisical time-stepping not implemented yet "
897 "for non-Fourier basis")
901 StdRegions::StdQuadExp StdQuad(m_homogeneousBasis_y->GetBasisKey(),
902 m_homogeneousBasis_z->GetBasisKey());
904 m_transposition->Transpose(m_npoints, inarray, temparray,
false,
905 LibUtilities::eXtoYZ);
907 for (
int i = 0; i < n_points_line; i++)
909 StdQuad.PhysDeriv(tmp1 = temparray + i * nyzlines,
910 tmp2 = temparray1 + i * nyzlines,
911 tmp3 = temparray2 + i * nyzlines);
914 m_transposition->Transpose(m_npoints, temparray1, out_d1,
false,
915 LibUtilities::eYZtoX);
916 m_transposition->Transpose(m_npoints, temparray2, out_d2,
false,
917 LibUtilities::eYZtoX);
918 Vmath::Smul(m_npoints, 2.0 / m_lhom_y, out_d1, 1, out_d1, 1);
919 Vmath::Smul(m_npoints, 2.0 / m_lhom_z, out_d2, 1, out_d2, 1);
924void ExpListHomogeneous2D::v_PhysDeriv(
925 Direction edir,
const Array<OneD, const NekDouble> &inarray,
926 Array<OneD, NekDouble> &out_d)
929 int nyzlines = m_lines.size();
931 int n_points_line = m_npoints / nyzlines;
935 Array<OneD, NekDouble> temparray(m_npoints);
936 Array<OneD, NekDouble> temparray1(m_npoints);
937 Array<OneD, NekDouble> temparray2(m_npoints);
938 Array<OneD, NekDouble> tmp1;
939 Array<OneD, NekDouble> tmp2;
940 Array<OneD, NekDouble> tmp3;
944 for (
int i = 0; i < nyzlines; i++)
946 m_lines[i]->PhysDeriv(tmp1 = inarray + i * n_points_line,
947 tmp2 = out_d + i * n_points_line);
952 if (m_homogeneousBasis_y->GetBasisType() == LibUtilities::eFourier &&
953 m_homogeneousBasis_z->GetBasisType() == LibUtilities::eFourier)
961 HomogeneousFwdTrans(m_npoints, inarray, temparray);
969 for (
int i = 0; i < m_ny; i++)
971 beta = -
sign * 2 * M_PI * (i / 2) / m_lhom_y;
973 for (
int j = 0; j < m_nz; j++)
977 tmp1 = temparray + n_points_line * (i + j * m_ny),
980 n_points_line * ((i -
int(
sign)) + j * m_ny),
991 HomogeneousBwdTrans(m_npoints, temparray1, out_d);
997 for (
int i = 0; i < m_nz; i++)
999 beta = -
sign * 2 * M_PI * (i / 2) / m_lhom_z;
1001 tmp1 = temparray + i * m_ny * n_points_line, 1,
1003 (i -
int(
sign)) * m_ny * n_points_line,
1013 HomogeneousBwdTrans(m_npoints, temparray2, out_d);
1021 ASSERTL0(
false,
"Semi-phyisical time-stepping not implemented "
1022 "yet for non-Fourier basis")
1026 StdRegions::StdQuadExp StdQuad(
1027 m_homogeneousBasis_y->GetBasisKey(),
1028 m_homogeneousBasis_z->GetBasisKey());
1030 m_transposition->Transpose(m_npoints, inarray, temparray,
false,
1031 LibUtilities::eXtoYZ);
1033 for (
int i = 0; i < n_points_line; i++)
1035 StdQuad.PhysDeriv(tmp1 = temparray + i * nyzlines,
1036 tmp2 = temparray1 + i * nyzlines,
1037 tmp3 = temparray2 + i * nyzlines);
1042 m_transposition->Transpose(m_npoints, temparray1, out_d,
1043 false, LibUtilities::eYZtoX);
1044 Vmath::Smul(m_npoints, 2.0 / m_lhom_y, out_d, 1, out_d, 1);
1048 m_transposition->Transpose(m_npoints, temparray2, out_d,
1049 false, LibUtilities::eYZtoX);
1050 Vmath::Smul(m_npoints, 2.0 / m_lhom_z, out_d, 1, out_d, 1);
1057void ExpListHomogeneous2D::PhysDeriv(
1058 const Array<OneD, const NekDouble> &inarray, Array<OneD, NekDouble> &out_d0,
1059 Array<OneD, NekDouble> &out_d1, Array<OneD, NekDouble> &out_d2)
1062 v_PhysDeriv(inarray, out_d0, out_d1, out_d2);
1065void ExpListHomogeneous2D::PhysDeriv(
1066 Direction edir,
const Array<OneD, const NekDouble> &inarray,
1067 Array<OneD, NekDouble> &out_d)
1070 v_PhysDeriv(edir, inarray, out_d);
1073void ExpListHomogeneous2D::SetPaddingBase(
void)
1077 m_padsize_y = int(size_y);
1078 m_padsize_z = int(size_z);
1080 const LibUtilities::PointsKey Ppad_y(m_padsize_y,
1081 LibUtilities::eFourierEvenlySpaced);
1082 const LibUtilities::BasisKey Bpad_y(LibUtilities::eFourier, m_padsize_y,
1085 const LibUtilities::PointsKey Ppad_z(m_padsize_z,
1086 LibUtilities::eFourierEvenlySpaced);
1087 const LibUtilities::BasisKey Bpad_z(LibUtilities::eFourier, m_padsize_z,
1090 m_paddingBasis_y = LibUtilities::BasisManager()[Bpad_y];
1091 m_paddingBasis_z = LibUtilities::BasisManager()[Bpad_z];
1093 StdRegions::StdQuadExp StdQuad(m_paddingBasis_y->GetBasisKey(),
1094 m_paddingBasis_z->GetBasisKey());
1096 StdRegions::StdMatrixKey matkey1(StdRegions::eFwdTrans,
1097 StdQuad.DetShapeType(), StdQuad);
1098 StdRegions::StdMatrixKey matkey2(StdRegions::eBwdTrans,
1099 StdQuad.DetShapeType(), StdQuad);
1101 MatFwdPAD = StdQuad.GetStdMatrix(matkey1);
1102 MatBwdPAD = StdQuad.GetStdMatrix(matkey2);
#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
ExpListHomogeneous2D(const ExpansionType type)
Default constructor.
static BasisSharedPtr NullBasisSharedPtr
@ beta
Gauss Radau pinned at x=-1,.
std::map< Homogeneous2DMatType, DNekBlkMatSharedPtr > Homo2DBlockMatrixMap
A map between homo matrix keys and their associated block matrices.
std::vector< double > p(NPUPPER)
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)