Nektar++
DisContField3DHomogeneous2D.cpp
Go to the documentation of this file.
1//////////////////////////////////////////////////////////////////////////////
2//
3// File: DisContField3DHomogeneous2D.cpp
4//
5// For more information, please see: http://www.nektar.info
6//
7// The MIT License
8//
9// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
10// Department of Aeronautics, Imperial College London (UK), and Scientific
11// Computing and Imaging Institute, University of Utah (USA).
12//
13// Permission is hereby granted, free of charge, to any person obtaining a
14// copy of this software and associated documentation files (the "Software"),
15// to deal in the Software without restriction, including without limitation
16// the rights to use, copy, modify, merge, publish, distribute, sublicense,
17// and/or sell copies of the Software, and to permit persons to whom the
18// Software is furnished to do so, subject to the following conditions:
19//
20// The above copyright notice and this permission notice shall be included
21// in all copies or substantial portions of the Software.
22//
23// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29// DEALINGS IN THE SOFTWARE.
30//
31// Description: Field definition for 3D domain with boundary
32// conditions using LDG flux and a 2D homogeneous directions
33//
34///////////////////////////////////////////////////////////////////////////////
35
36#include <boost/core/ignore_unused.hpp>
37
41
42namespace Nektar
43{
44namespace MultiRegions
45{
46
48 : ExpList3DHomogeneous2D(), m_bndCondExpansions(), m_bndCondBndWeight(),
49 m_bndConditions()
50{
51}
52
55 const LibUtilities::BasisKey &HomoBasis_y,
56 const LibUtilities::BasisKey &HomoBasis_z, const NekDouble lhom_y,
57 const NekDouble lhom_z, const bool useFFT, const bool dealiasing,
59 : ExpList3DHomogeneous2D(pSession, HomoBasis_y, HomoBasis_z, lhom_y, lhom_z,
60 useFFT, dealiasing, ImpType),
61 m_bndCondExpansions(), m_bndCondBndWeight(), m_bndConditions()
62{
63}
64
66 const DisContField3DHomogeneous2D &In, const bool DeclareLinesSetCoeffPhys)
67 : ExpList3DHomogeneous2D(In, false),
68 m_bndCondExpansions(In.m_bndCondExpansions),
69 m_bndCondBndWeight(In.m_bndCondBndWeight),
70 m_bndConditions(In.m_bndConditions)
71{
72 if (DeclareLinesSetCoeffPhys)
73 {
74 DisContFieldSharedPtr zero_line =
75 std::dynamic_pointer_cast<DisContField>(In.m_lines[0]);
76
77 for (int n = 0; n < m_lines.size(); ++n)
78 {
79 m_lines[n] =
81 }
82
84 }
85}
86
89 const LibUtilities::BasisKey &HomoBasis_y,
90 const LibUtilities::BasisKey &HomoBasis_z, const NekDouble lhom_y,
91 const NekDouble lhom_z, const bool useFFT, const bool dealiasing,
93 const std::string &variable, const Collections::ImplementationType ImpType)
94 : ExpList3DHomogeneous2D(pSession, HomoBasis_y, HomoBasis_z, lhom_y, lhom_z,
95 useFFT, dealiasing, ImpType),
96 m_bndCondExpansions(), m_bndCondBndWeight(), m_bndConditions()
97{
98 int i, n, nel;
99 DisContFieldSharedPtr line_zero;
100 SpatialDomains::BoundaryConditions bcs(pSession, graph1D);
101
102 //
104 pSession, graph1D, variable, ImpType);
105
107 nel = m_lines[0]->GetExpSize();
108
109 for (i = 0; i < nel; ++i)
110 {
111 (*m_exp).push_back(m_lines[0]->GetExp(i));
112 }
113
114 int nylines = m_homogeneousBasis_y->GetNumPoints();
115 int nzlines = m_homogeneousBasis_z->GetNumPoints();
116
117 for (n = 1; n < nylines * nzlines; ++n)
118 {
120 pSession, graph1D, variable, ImpType);
121 for (i = 0; i < nel; ++i)
122 {
123 (*m_exp).push_back((*m_exp)[i]);
124 }
125 }
126
127 // Setup Default optimisation information.
128 nel = GetExpSize();
129
130 SetCoeffPhys();
131
132 SetupBoundaryConditions(HomoBasis_y, HomoBasis_z, lhom_y, lhom_z, bcs,
133 variable);
134}
135
137{
138}
139
141 const LibUtilities::BasisKey &HomoBasis_y,
142 const LibUtilities::BasisKey &HomoBasis_z, const NekDouble lhom_y,
144 const std::string variable)
145{
146 // Setup an ExpList2DHomogeneous2D expansion for boundary
147 // conditions and link to class declared in m_lines.
148
149 size_t nlines = m_lines.size();
150
152 bcs.GetBoundaryRegions();
153
154 size_t nbnd = bregions.size();
155
158
159 Array<OneD, MultiRegions::ExpListSharedPtr> LinesBndCondExp(nlines);
160
161 m_bndConditions = m_lines[0]->UpdateBndConditions();
162
163 for (int i = 0; i < nbnd; ++i)
164 {
165 for (int n = 0; n < nlines; ++n)
166 {
167 LinesBndCondExp[n] = m_lines[n]->UpdateBndCondExpansion(i);
168 }
169
172 m_session, HomoBasis_y, HomoBasis_z, lhom_y, lhom_z, m_useFFT,
173 false, LinesBndCondExp);
174 }
175
176 v_EvaluateBoundaryConditions(0.0, variable);
177}
178
180 const Array<OneD, const NekDouble> &inarray,
182 const StdRegions::VarCoeffMap &varcoeff,
183 const MultiRegions::VarFactorsMap &varfactors,
184 const Array<OneD, const NekDouble> &dirForcing, const bool PhysSpaceForcing)
185{
186 int n, m;
187 int cnt = 0;
188 int cnt1 = 0;
189 int nhom_modes_y = m_homogeneousBasis_y->GetNumModes();
190 int nhom_modes_z = m_homogeneousBasis_z->GetNumModes();
191 NekDouble beta_y;
192 NekDouble beta_z;
193 StdRegions::ConstFactorMap new_factors;
194
195 int npts_fce = PhysSpaceForcing ? m_npoints : m_ncoeffs;
197 Array<OneD, NekDouble> fce(npts_fce);
199
200 // Fourier transform forcing function
201 if (m_WaveSpace)
202 {
203 fce = inarray;
204 }
205 else
206 {
207 HomogeneousFwdTrans(npts_fce, inarray, fce);
208 }
209
210 for (n = 0; n < nhom_modes_z; ++n)
211 {
212 for (m = 0; m < nhom_modes_y; ++m)
213 {
214 beta_z = 2 * M_PI * (n / 2) / m_lhom_z;
215 beta_y = 2 * M_PI * (m / 2) / m_lhom_y;
216 new_factors = factors;
217 new_factors[StdRegions::eFactorLambda] +=
218 beta_y * beta_y + beta_z * beta_z;
219
220 wfce = (PhysSpaceForcing) ? fce + cnt : fce + cnt1;
221 m_lines[n]->HelmSolve(wfce, e_out = outarray + cnt1, new_factors,
222 varcoeff, varfactors, dirForcing,
223 PhysSpaceForcing);
224
225 cnt += m_lines[n]->GetTotPoints();
226 cnt1 += m_lines[n]->GetNcoeffs();
227 }
228 }
229 return NullGlobalLinSysKey;
230}
231
233 int i, std::shared_ptr<ExpList> &result, const bool DeclareCoeffPhysArrays)
234{
235 int cnt, n;
236
237 std::vector<unsigned int> eIDs;
238 Array<OneD, int> ElmtID, EdgeID;
239 GetBoundaryToElmtMap(ElmtID, EdgeID);
240
241 // Skip other boundary regions
242 for (cnt = n = 0; n < i; ++n)
243 {
244 cnt += m_bndCondExpansions[n]->GetExpSize();
245 }
246
247 // Populate eIDs with information from BoundaryToElmtMap
248 for (n = 0; n < m_bndCondExpansions[i]->GetExpSize(); ++n)
249 {
250 eIDs.push_back(ElmtID[cnt + n]);
251 }
252
253 // Create expansion list
254 result =
256
257 // Copy phys and coeffs to new explist
258 if (DeclareCoeffPhysArrays)
259 {
260 int nq, offsetOld, offsetNew;
261 Array<OneD, NekDouble> tmp1, tmp2;
262 for (n = 0; n < result->GetExpSize(); ++n)
263 {
264 nq = GetExp(ElmtID[cnt + n])->GetTotPoints();
265 offsetOld = GetPhys_Offset(ElmtID[cnt + n]);
266 offsetNew = result->GetPhys_Offset(n);
267 Vmath::Vcopy(nq, tmp1 = GetPhys() + offsetOld, 1,
268 tmp2 = result->UpdatePhys() + offsetNew, 1);
269
270 nq = GetExp(ElmtID[cnt + n])->GetNcoeffs();
271 offsetOld = GetCoeff_Offset(ElmtID[cnt + n]);
272 offsetNew = result->GetCoeff_Offset(n);
273 Vmath::Vcopy(nq, tmp1 = GetCoeffs() + offsetOld, 1,
274 tmp2 = result->UpdateCoeffs() + offsetNew, 1);
275 }
276 }
277
278 // Set wavespace value
279 result->SetWaveSpace(GetWaveSpace());
280}
281
283 Array<OneD, int> &ElmtID, Array<OneD, int> &EdgeID)
284{
285 if (m_BCtoElmMap.size() == 0)
286 {
287 Array<OneD, int> ElmtID_tmp;
288 Array<OneD, int> EdgeID_tmp;
289
290 m_lines[0]->GetBoundaryToElmtMap(ElmtID_tmp, EdgeID_tmp);
291 int nel_per_lines = m_lines[0]->GetExpSize();
292 int nlines = m_lines.size();
293
294 int MapSize = ElmtID_tmp.size();
295
296 m_BCtoElmMap = Array<OneD, int>(nlines * MapSize);
297 m_BCtoEdgMap = Array<OneD, int>(nlines * MapSize);
298 if (MapSize > 0)
299 {
300 int i, j, n, cnt;
301 int cntLine = 0;
302 for (cnt = n = 0; n < m_bndCondExpansions.size(); ++n)
303 {
304 int lineExpSize =
305 m_lines[0]->GetBndCondExpansions()[n]->GetExpSize();
306 for (i = 0; i < lineExpSize; ++i, ++cntLine)
307 {
308 for (j = 0; j < nlines; j++)
309 {
310 m_BCtoElmMap[cnt + i + j * lineExpSize] =
311 ElmtID_tmp[cntLine] + j * nel_per_lines;
312 m_BCtoEdgMap[cnt + i + j * lineExpSize] =
313 EdgeID_tmp[cntLine];
314 }
315 }
316 cnt += m_bndCondExpansions[n]->GetExpSize();
317 }
318 }
319 }
320 ElmtID = m_BCtoElmMap;
321 EdgeID = m_BCtoEdgMap;
322}
323
324/// @todo Fix Robin BCs for homogeneous case
325std::map<int, RobinBCInfoSharedPtr> DisContField3DHomogeneous2D::
327{
328 return std::map<int, RobinBCInfoSharedPtr>();
329}
330
332 const NekDouble time, const std::string varName, const NekDouble x2_in,
333 const NekDouble x3_in)
334{
335 boost::ignore_unused(x2_in, x3_in);
336 int n, m;
339
340 for (n = 0; n < m_nz; ++n)
341 {
342 for (m = 0; m < m_ny; ++m)
343 {
345 time, varName, 0.5 * m_lhom_y * (1.0 + y[m]),
346 0.5 * m_lhom_z * (1.0 + z[n]));
347 }
348 }
349
350 // Fourier transform coefficient space boundary values
351 for (n = 0; n < m_bndCondExpansions.size(); ++n)
352 {
353 if (time == 0.0 || m_bndConditions[n]->IsTimeDependent())
354 {
355 m_bndCondBndWeight[n] = 1.0;
356 m_bndCondExpansions[n]->HomogeneousFwdTrans(
360 }
361 }
362}
363
366{
367 return m_bndCondExpansions;
368}
369
372{
373 return m_bndConditions;
374}
375
377 int i)
378{
379 return m_bndCondExpansions[i];
380}
381
384{
385 return m_bndConditions;
386}
387
389 const NekDouble value)
390{
391 m_bndCondBndWeight[index] = value;
392}
393} // namespace MultiRegions
394} // namespace Nektar
Describes the specification for a Basis.
Definition: Basis.h:47
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
virtual void v_GetBndElmtExpansion(int i, std::shared_ptr< ExpList > &result, const bool DeclareCoeffPhysArrays) override
void SetupBoundaryConditions(const LibUtilities::BasisKey &HomoBasis_y, const LibUtilities::BasisKey &HomoBasis_z, const NekDouble lhom_y, const NekDouble lhom_z, SpatialDomains::BoundaryConditions &bcs, const std::string variable)
virtual void v_GetBoundaryToElmtMap(Array< OneD, int > &ElmtID, Array< OneD, int > &EdgeID) override
virtual const Array< OneD, const std::shared_ptr< ExpList > > & v_GetBndCondExpansions(void) override
Array< OneD, int > m_BCtoElmMap
Storage space for the boundary to element and boundary to trace map. This member variable is really a...
virtual void v_SetBndCondBwdWeight(const int index, const NekDouble value) override
virtual Array< OneD, SpatialDomains::BoundaryConditionShPtr > & v_UpdateBndConditions() override
virtual void v_EvaluateBoundaryConditions(const NekDouble time=0.0, const std::string varName="", const NekDouble x2_in=NekConstants::kNekUnsetDouble, const NekDouble x3_in=NekConstants::kNekUnsetDouble) override
virtual std::map< int, RobinBCInfoSharedPtr > v_GetRobinBCInfo() override
virtual GlobalLinSysKey v_HelmSolve(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::ConstFactorMap &factors, const StdRegions::VarCoeffMap &varcoeff, const MultiRegions::VarFactorsMap &varfactors, const Array< OneD, const NekDouble > &dirForcing, const bool PhysSpaceForcing) override
virtual std::shared_ptr< ExpList > & v_UpdateBndCondExpansion(int i) override
virtual const Array< OneD, const SpatialDomains::BoundaryConditionShPtr > & v_GetBndConditions() override
Array< OneD, MultiRegions::ExpListSharedPtr > m_bndCondExpansions
Array< OneD, SpatialDomains::BoundaryConditionShPtr > m_bndConditions
Abstraction of a one-dimensional multi-elemental expansion which is merely a collection of local expa...
void SetCoeffPhys(void)
Definition of the total number of degrees of freedom and quadrature points. Sets up the storage for m...
int m_nz
Number of modes = number of poitns in z direction.
LibUtilities::BasisSharedPtr m_homogeneousBasis_y
Definition of the total number of degrees of freedom and quadrature points. Sets up the storage for m...
NekDouble m_lhom_z
Width of homogeneous direction z.
int m_ny
Number of modes = number of poitns in y direction.
Array< OneD, ExpListSharedPtr > m_lines
Vector of ExpList, will be filled with ExpList1D.
LibUtilities::BasisSharedPtr m_homogeneousBasis_z
Base expansion in z direction.
NekDouble m_lhom_y
Width of homogeneous direction y.
Array< OneD, NekDouble > & UpdateCoeffs()
This function returns (a reference to) the array (implemented as m_coeffs) containing all local expa...
Definition: ExpList.h:2119
int GetNcoeffs(void) const
Returns the total number of local degrees of freedom .
Definition: ExpList.h:1527
void GetBoundaryToElmtMap(Array< OneD, int > &ElmtID, Array< OneD, int > &EdgeID)
Definition: ExpList.h:2290
const Array< OneD, const NekDouble > & GetCoeffs() const
This function returns (a reference to) the array (implemented as m_coeffs) containing all local expa...
Definition: ExpList.h:1967
const Array< OneD, const NekDouble > & GetPhys() const
This function returns (a reference to) the array (implemented as m_phys) containing the function ev...
Definition: ExpList.h:2053
int GetCoeff_Offset(int n) const
Get the start offset position for a local contiguous list of coeffs correspoinding to element n.
Definition: ExpList.h:2102
int GetExpSize(void)
This function returns the number of elements in the expansion.
Definition: ExpList.h:2061
std::shared_ptr< LocalRegions::ExpansionVector > m_exp
The list of local expansions.
Definition: ExpList.h:1127
int m_ncoeffs
The total number of local degrees of freedom. m_ncoeffs .
Definition: ExpList.h:1072
void EvaluateBoundaryConditions(const NekDouble time=0.0, const std::string varName="", const NekDouble=NekConstants::kNekUnsetDouble, const NekDouble=NekConstants::kNekUnsetDouble)
Definition: ExpList.h:2279
const std::shared_ptr< LocalRegions::ExpansionVector > GetExp() const
This function returns the vector of elements in the expansion.
Definition: ExpList.h:2094
LibUtilities::SessionReaderSharedPtr m_session
Session.
Definition: ExpList.h:1067
bool GetWaveSpace(void) const
This function returns the third direction expansion condition, which can be in wave space (coefficien...
Definition: ExpList.h:1619
int GetPhys_Offset(int n) const
Get the start offset position for a local contiguous list of quadrature points in a full array corres...
Definition: ExpList.h:2109
void HomogeneousFwdTrans(const int npts, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool Shuff=true, bool UnShuff=true)
Definition: ExpList.h:1863
const BoundaryRegionCollection & GetBoundaryRegions(void) const
Definition: Conditions.h:234
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< DisContField > DisContFieldSharedPtr
Definition: DisContField.h:341
static GlobalLinSysKey NullGlobalLinSysKey(StdRegions::eNoMatrixType)
std::map< StdRegions::ConstFactorType, Array< OneD, NekDouble > > VarFactorsMap
std::map< int, BoundaryRegionShPtr > BoundaryRegionCollection
Definition: Conditions.h:210
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
Definition: MeshGraph.h:176
std::map< ConstFactorType, NekDouble > ConstFactorMap
Definition: StdRegions.hpp:408
std::map< StdRegions::VarCoeffType, VarCoeffEntry > VarCoeffMap
Definition: StdRegions.hpp:352
std::vector< double > z(NPUPPER)
StdRegions::ConstFactorMap factors
The above copyright notice and this permission notice shall be included.
Definition: CoupledSolver.h:2
double NekDouble
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1191