Nektar++
LocTraceToTraceMap.h
Go to the documentation of this file.
1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 // File: LocTraceToTraceMap.h
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: Local Trace to general trace map information
32 //
33 ///////////////////////////////////////////////////////////////////////////////
34 
35 #ifndef MULTIREGIONS_LOCTRACETOTRACEMAP_H
36 #define MULTIREGIONS_LOCTRACETOTRACEMAP_H
37 
38 #include <tuple>
39 
44 
45 namespace Nektar
46 {
47 namespace LocalRegions
48 {
49 class Expansion;
50 typedef std::shared_ptr<Expansion> ExpansionSharedPtr;
51 } // namespace LocalRegions
52 
53 namespace MultiRegions
54 {
55 class ExpList;
56 typedef std::shared_ptr<ExpList> ExpListSharedPtr;
57 
59 {
67 };
68 
69 /**
70  * @brief Map holding points distributions required for interpolation of local
71  * traces onto global trace in two and three dimensions.
72  *
73  * The tuple contains four PointsKey entries. All four are used in 3D, but for
74  * 2D only two are used. The first two denote the local elemental points
75  * distributions, the latter the target trace distributions. In the 2D case,
76  * unused trace directions are set to LibUtilities::eNoPointsType.
77  */
81 
82 struct cmpop
83 {
85  TraceInterpPoints const &b) const
86  {
87  if (std::get<0>(a) < std::get<0>(b))
88  {
89  return true;
90  }
91 
92  if (std::get<0>(b) < std::get<0>(a))
93  {
94  return false;
95  }
96 
97  if (std::get<1>(a) < std::get<1>(b))
98  {
99  return true;
100  }
101  if (std::get<1>(b) < std::get<1>(a))
102  {
103  return false;
104  }
105 
106  if (std::get<2>(a) < std::get<2>(b))
107  {
108  return true;
109  }
110 
111  if (std::get<2>(b) < std::get<2>(a))
112  {
113  return false;
114  }
115 
116  if (std::get<3>(a) < std::get<3>(b))
117  {
118  return true;
119  }
120 
121  return false;
122  }
123 };
124 
125 /**
126  * @brief A helper class to deal with trace operations in the discontinuous
127  * Galerkin code.
128  *
129  * This class sets up a number of mappings to deal with operations that take the
130  * "local trace" of an expansion list -- i.e. the concatenation of all elemental
131  * facets -- to the "global trace" -- where the duplicate facets between
132  * connected elements have been removed.
133  *
134  * <pre>
135  * Elements: Local trace: Global trace:
136  * +----+----+ + +---+ + + +---+ + + +---+ + +---+ +
137  * | | | | | | | | | |
138  * | | | | | | | | | |
139  * +----+----+ + +---+ + + +---+ + + +---+ + +---+ +
140  * </pre>
141  *
142  * There are a number of mappings that are required that this class provides
143  * maps for:
144  *
145  * - Extracting the local trace from the elements in physical space
146  * - Dealing with cases that need interpolation (i.e. where the polynomial
147  * order varies between two elements)
148  * - Adding global trace contributions back into the elements.
149  *
150  * These are documented in the member variables and class functions.
151  */
153 {
154 public:
155  // Constructor
157  const ExpList &locExp, const ExpListSharedPtr &trace,
159  &elmtToTrace,
160  const std::vector<bool> &LeftAdjacents);
161 
162  // Destructor
164 
166  const ExpList &locExp, const ExpListSharedPtr &trace,
168  &elmtToTrace,
169  const std::vector<bool> &LeftAdjacents);
170 
172  const Array<OneD, const NekDouble> &field,
173  Array<OneD, NekDouble> faces);
174 
176  const Array<OneD, const NekDouble> &field,
177  Array<OneD, NekDouble> faces);
179  const Array<OneD, const NekDouble> &faces,
180  Array<OneD, NekDouble> &field);
181 
183  const int dir, const Array<OneD, const NekDouble> &loctraces,
184  Array<OneD, NekDouble> reshuffle);
185 
187  const int dir, const Array<OneD, const NekDouble> &loctraces,
188  Array<OneD, NekDouble> unshuffle);
189 
191  const int dir, const Array<OneD, const NekDouble> &loctraces,
192  Array<OneD, NekDouble> &traces);
193 
195  const int dir, const Array<OneD, const NekDouble> &locfaces,
196  Array<OneD, NekDouble> &edges);
197 
199  const int dir, const Array<OneD, const NekDouble> &locfaces,
200  Array<OneD, NekDouble> faces);
201 
203  const int dir, const Array<OneD, const NekDouble> &traces,
204  Array<OneD, NekDouble> &loctraces);
205 
206  /// Transpose of interp local edges to Trace methods
208  const int dir, const Array<OneD, const NekDouble> &edges,
209  Array<OneD, NekDouble> &locedges);
210 
211  /// Transpose of interp local faces to Trace methods
213  const int dir, const Array<OneD, const NekDouble> &traces,
214  Array<OneD, NekDouble> &loctraces);
215 
217  const int dir, const Array<OneD, NekDouble> &traces,
218  Array<OneD, NekDouble> &loctraces);
219 
221  const int dir, const Array<OneD, const NekDouble> &locfaces,
222  Array<OneD, NekDouble> &edges);
223 
225  const int dir, const Array<OneD, const NekDouble> &faces,
226  Array<OneD, NekDouble> &locfaces);
227 
229  const Array<OneD, const NekDouble> &trace,
230  Array<OneD, NekDouble> &field);
231 
233  const int dir, const Array<OneD, const NekDouble> &race,
234  Array<OneD, NekDouble> &field);
235 
237  const ExpListSharedPtr &tracelist, const int ndim);
238 
240  const ExpListSharedPtr &tracelist);
241 
243  const ExpListSharedPtr &tracelist);
244 
245  /**
246  * @brief Return the number of `forward' local trace points.
247  */
249  {
250  return m_nFwdLocTracePts;
251  }
252 
253  /**
254  * @brief Return the number of local trace points.
255  */
257  {
258  return m_nLocTracePts;
259  }
260 
263  {
265  }
266 
269  {
271  }
272 
273  MULTI_REGIONS_EXPORT inline const Array<OneD,
276  {
278  }
279 
280  MULTI_REGIONS_EXPORT inline const Array<OneD,
283  {
285  }
286 
288  const
289  {
290  return m_ElemNeighbsNumb;
291  }
292 
295  {
296  return m_ElemNeighbsId;
297  }
298 
301  {
303  }
304 
306  const Array<OneD, Array<OneD, int>> &inarray)
307  {
308  m_LocTracephysToTraceIDMap = inarray;
309  }
310 
313  {
314  return m_locTraceToFieldMap;
315  }
316 
318  const ExpList &locExp, const ExpListSharedPtr &trace);
319 
320 private:
321  /// Expansion Dimension we have setup for trace mapping.
322  int m_expdim;
323  /// The number of forward trace points. A local trace element is `forward'
324  /// if it is the side selected for the global trace.
326  /// The number of local trace points.
328  /// The number of global trace points.
330  /// A mapping from the local elemental trace points, arranged as
331  /// all forwards traces followed by backwards traces, to elemental
332  /// storage.
334  /// A mapping from the local elemental trace points, arranged as
335  /// all forwards traces followed by backwards traces, to elemental
336  /// storage.
338  /// A mapping from local trace points to the global trace. Dimension 0 holds
339  /// forward traces, dimension 1 backward.
341  /// A mapping holding the type of interpolation needed for each local trace.
342  /// Dimension 0 holds forward traces, dimension 1 backward.
344  /// Interpolation matrices for either 2D edges or first coordinate of 3D
345  /// face.
347  /// Interpolation matrices for the second coordinate of 3D face, not used in
348  /// 2D.
350  /// Interpolation matrices for either 2D edges or first coordinate
351  /// of 3D face using going "from' to 'to' points (i.e. the reverse
352  /// of other techniques)
354  /// Interpolation matrices for either 2D edges or first coordinate
355  /// of 3D face using going "from' to 'to' points (i.e. the reverse
356  /// of other techniques)
358  /// Interpolation points key distributions to each of the local to global
359  /// mappings.
361  /// Mapping to hold first coordinate direction endpoint interpolation, which
362  /// can be more optimal if using Gauss-Radau distribution for triangles
364  /// Mapping to hold second coordinate direction endpoint interpolation,
365  /// which can be more optimal if using Gauss-Radau distribution for
366  /// triangles
368  /// Number of edges/faces on a 2D/3D element that require interpolation.
370  /// Number of forwards/backwards trace coefficients.
372  /// Mapping from forwards/backwards trace coefficients to elemental
373  /// coefficient storage.
375  /// Mapping from forwards/backwards trace coefficients to the position of
376  /// the trace element in global storage.
378  /// Sign array for mapping from forwards/backwards trace coefficients to
379  /// local trace storage.
381  /// Flag indicates whether the expansion that are the left & right adjacent
382  /// to current trace exists.
384  /// The expansion ID that are the left & right adjacent to current trace.
386  /// The map of every coeff from current trace to the left & right adjacent
387  /// expasion coeffs.
390  /// The sign of every coeff from current trace to the left & right adjacent
391  /// expasion coeffs.
394  /// The map of every phys from current trace to the left & right adjacent
395  /// expasion phys. This map is only used when no interpolation is needed in
396  /// getting GetFwdBwdTracePhys. If interpolation is needed, it should be
397  /// determined as the InnerProduct of m_locTraceToFieldMap matrix and
398  /// interpolation matrix.
400 
401  // store the number of neighbor elements for each element
403  // store the id of neighbor elements for each element
405 
407 
408  void FindElmtNeighbors(const ExpList &locExp,
409  const ExpListSharedPtr &trace);
410 };
411 
412 typedef std::shared_ptr<LocTraceToTraceMap> LocTraceToTraceMapSharedPtr;
413 
415 
416 } // namespace MultiRegions
417 } // namespace Nektar
418 
419 #endif
#define MULTI_REGIONS_EXPORT
Defines a specification for a set of points.
Definition: Points.h:59
Base class for all multi-elemental spectral/hp expansions.
Definition: ExpList.h:103
A helper class to deal with trace operations in the discontinuous Galerkin code.
Array< OneD, Array< OneD, Array< OneD, int > > > m_traceCoeffToLeftRightExpCoeffMap
The map of every coeff from current trace to the left & right adjacent expasion coeffs.
Array< OneD, Array< OneD, int > > m_traceCoeffsToElmtSign
Sign array for mapping from forwards/backwards trace coefficients to local trace storage.
Array< OneD, Array< OneD, int > > m_interpNtraces
Number of edges/faces on a 2D/3D element that require interpolation.
Array< OneD, Array< OneD, int > > m_locTraceToElmtTraceMap
A mapping from the local elemental trace points, arranged as all forwards traces followed by backward...
const Array< OneD, const Array< OneD, Array< OneD, int > > > & GetTraceCoeffToLeftRightExpCoeffMap() const
const Array< OneD, const Array< OneD, int > > & GetLeftRightAdjacentExpId() const
int GetNLocTracePts()
Return the number of local trace points.
const Array< OneD, int > & GetElemNeighbsNumb() const
void InterpLocEdgesToTraceTranspose(const int dir, const Array< OneD, const NekDouble > &edges, Array< OneD, NekDouble > &locedges)
Transpose of interp local edges to Trace methods.
void InterpLocTracesToTraceTranspose(const int dir, const Array< OneD, const NekDouble > &traces, Array< OneD, NekDouble > &loctraces)
Array< OneD, Array< OneD, int > > m_traceCoeffsToElmtTrace
Mapping from forwards/backwards trace coefficients to the position of the trace element in global sto...
Array< OneD, Array< OneD, int > > m_leftRightAdjacentExpId
The expansion ID that are the left & right adjacent to current trace.
const Array< OneD, const Array< OneD, int > > & GetLocTracephysToTraceIDMap() const
const Array< OneD, const Array< OneD, Array< OneD, int > > > & GetTraceCoeffToLeftRightExpCoeffSign() const
Array< OneD, Array< OneD, DNekMatSharedPtr > > m_interpFromTraceI1
Interpolation matrices for either 2D edges or first coordinate of 3D face using going "from' to 'to' ...
Array< OneD, Array< OneD, Array< OneD, NekDouble > > > m_interpEndPtI0
Mapping to hold first coordinate direction endpoint interpolation, which can be more optimal if using...
void LocTracesFromField(const Array< OneD, const NekDouble > &field, Array< OneD, NekDouble > faces)
Gather the local elemental traces in physical space from field using m_locTraceToFieldMap....
void CalcLocTracePhysToTraceIDMap_3D(const ExpListSharedPtr &tracelist)
int m_nLocTracePts
The number of local trace points.
void InterpLocEdgesToTrace(const int dir, const Array< OneD, const NekDouble > &locfaces, Array< OneD, NekDouble > &edges)
Interpolate local trace edges to global trace edge point distributions where required.
int m_nTracePts
The number of global trace points.
const Array< OneD, const int > & GetLocTraceToFieldMap() const
void UnshuffleLocTraces(const int dir, const Array< OneD, const NekDouble > &loctraces, Array< OneD, NekDouble > unshuffle)
Unshuffle local elemental traces in physical space from similar faces points are blocked together to ...
void InterpLocTracesToTrace(const int dir, const Array< OneD, const NekDouble > &loctraces, Array< OneD, NekDouble > &traces)
Array< OneD, Array< OneD, bool > > m_leftRightAdjacentExpFlag
Flag indicates whether the expansion that are the left & right adjacent to current trace exists.
void CalcLocTracePhysToTraceIDMap(const ExpListSharedPtr &tracelist, const int ndim)
void AddLocTracesToField(const Array< OneD, const NekDouble > &faces, Array< OneD, NekDouble > &field)
Reverse process of LocTracesFromField() Add the local traces in physical space to field using m_locTr...
int m_nTraceCoeffs[2]
Number of forwards/backwards trace coefficients.
int m_nFwdLocTracePts
The number of forward trace points. A local trace element is ‘forward’ if it is the side selected for...
Array< OneD, Array< OneD, Array< OneD, int > > > m_traceCoeffToLeftRightExpCoeffSign
The sign of every coeff from current trace to the left & right adjacent expasion coeffs.
void InterpTraceToLocFaces(const int dir, const Array< OneD, const NekDouble > &faces, Array< OneD, NekDouble > &locfaces)
Interpolate global trace edge to local trace edges point distributions where required.
Array< OneD, Array< OneD, Array< OneD, NekDouble > > > m_interpEndPtI1
Mapping to hold second coordinate direction endpoint interpolation, which can be more optimal if usin...
const Array< OneD, const Array< OneD, bool > > & GetLeftRightAdjacentExpFlag() const
void TraceLocToElmtLocCoeffMap(const ExpList &locExp, const ExpListSharedPtr &trace)
Set up maps between coefficients on trace and in cells.
Array< OneD, Array< OneD, int > > m_traceCoeffsToElmtMap
Mapping from forwards/backwards trace coefficients to elemental coefficient storage.
int m_expdim
Expansion Dimension we have setup for trace mapping.
Array< OneD, Array< OneD, InterpLocTraceToTrace > > m_interpTrace
A mapping holding the type of interpolation needed for each local trace. Dimension 0 holds forward tr...
void InterpTraceToLocEdges(const int dir, const Array< OneD, const NekDouble > &locfaces, Array< OneD, NekDouble > &edges)
Interpolate global trace edge to local trace edges point distributions where required.
void FwdLocTracesFromField(const Array< OneD, const NekDouble > &field, Array< OneD, NekDouble > faces)
Gather the forwards-oriented local traces in physical space from field using m_locTraceToFieldMap.
Array< OneD, Array< OneD, int > > m_locInterpTraceToTraceMap
A mapping from local trace points to the global trace. Dimension 0 holds forward traces,...
LocTraceToTraceMap(const ExpList &locExp, const ExpListSharedPtr &trace, const Array< OneD, Array< OneD, LocalRegions::ExpansionSharedPtr >> &elmtToTrace, const std::vector< bool > &LeftAdjacents)
Set up trace to trace mapping components.
Array< OneD, Array< OneD, int > > m_ElemNeighbsId
Array< OneD, Array< OneD, TraceInterpPoints > > m_interpPoints
Interpolation points key distributions to each of the local to global mappings.
Array< OneD, int > m_locTraceToFieldMap
A mapping from the local elemental trace points, arranged as all forwards traces followed by backward...
Array< OneD, Array< OneD, DNekMatSharedPtr > > m_interpFromTraceI0
Interpolation matrices for either 2D edges or first coordinate of 3D face using going "from' to 'to' ...
const Array< OneD, const Array< OneD, int > > & GetElemNeighbsId() const
void AddTraceCoeffsToFieldCoeffs(const Array< OneD, const NekDouble > &trace, Array< OneD, NekDouble > &field)
Add contributions from trace coefficients to the elemental field storage.
void InterpLocFacesToTraceTranspose(const int dir, const Array< OneD, const NekDouble > &traces, Array< OneD, NekDouble > &loctraces)
Transpose of interp local faces to Trace methods.
Array< OneD, Array< OneD, DNekMatSharedPtr > > m_interpTraceI1
Interpolation matrices for the second coordinate of 3D face, not used in 2D.
Array< OneD, Array< OneD, DNekMatSharedPtr > > m_interpTraceI0
Interpolation matrices for either 2D edges or first coordinate of 3D face.
void FindElmtNeighbors(const ExpList &locExp, const ExpListSharedPtr &trace)
Array< OneD, Array< OneD, Array< OneD, int > > > m_tracePhysToLeftRightExpPhysMap
The map of every phys from current trace to the left & right adjacent expasion phys....
void InterpTraceToLocTrace(const int dir, const Array< OneD, NekDouble > &traces, Array< OneD, NekDouble > &loctraces)
void SetLocTracePhysToTraceIDMap(const Array< OneD, Array< OneD, int >> &inarray)
int GetNFwdLocTracePts()
Return the number of ‘forward’ local trace points.
void ReshuffleLocTracesForInterp(const int dir, const Array< OneD, const NekDouble > &loctraces, Array< OneD, NekDouble > reshuffle)
Reshuffle local elemental traces in physical space so that similar faces points are blocked together ...
void CalcLocTracePhysToTraceIDMap_2D(const ExpListSharedPtr &tracelist)
Array< OneD, Array< OneD, int > > m_LocTracephysToTraceIDMap
void InterpLocFacesToTrace(const int dir, const Array< OneD, const NekDouble > &locfaces, Array< OneD, NekDouble > faces)
Interpolate local faces to trace face point distributions where required.
void Setup(const ExpList &locExp, const ExpListSharedPtr &trace, const Array< OneD, Array< OneD, LocalRegions::ExpansionSharedPtr >> &elmtToTrace, const std::vector< bool > &LeftAdjacents)
Set up member variables for a two-dimensional problem.
std::shared_ptr< Expansion > ExpansionSharedPtr
Definition: Expansion.h:68
std::tuple< LibUtilities::PointsKey, LibUtilities::PointsKey, LibUtilities::PointsKey, LibUtilities::PointsKey > TraceInterpPoints
Map holding points distributions required for interpolation of local traces onto global trace in two ...
static LocTraceToTraceMapSharedPtr NullLocTraceToTraceMapSharedPtr
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
std::shared_ptr< LocTraceToTraceMap > LocTraceToTraceMapSharedPtr
The above copyright notice and this permission notice shall be included.
Definition: CoupledSolver.h:2
bool operator()(TraceInterpPoints const &a, TraceInterpPoints const &b) const