Nektar++
Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
Nektar::MultiRegions::AssemblyMapDG Class Reference

#include <AssemblyMapDG.h>

Inheritance diagram for Nektar::MultiRegions::AssemblyMapDG:
[legend]

Public Member Functions

 AssemblyMapDG ()
 Default constructor. More...
 
 AssemblyMapDG (const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &graph1D, const ExpListSharedPtr &trace, const ExpList &locExp, const Array< OneD, const MultiRegions::ExpListSharedPtr > &bndConstraint, const Array< OneD, const SpatialDomains::BoundaryConditionShPtr > &bndCond, const PeriodicMap &periodicTrace, const std::string variable="DefaultVar")
 Constructor for trace map for one-dimensional expansion. More...
 
virtual ~AssemblyMapDG ()
 Destructor. More...
 
int GetNumDirichletBndPhys ()
 Return the number of boundary segments on which Dirichlet boundary conditions are imposed. More...
 
Array< OneD, LocalRegions::ExpansionSharedPtr > & GetElmtToTrace (const int i)
 
Array< OneD, Array< OneD, LocalRegions::ExpansionSharedPtr > > & GetElmtToTrace ()
 
AssemblyCommDGSharedPtr GetAssemblyCommDG ()
 
- Public Member Functions inherited from Nektar::MultiRegions::AssemblyMap
 AssemblyMap ()
 Default constructor. More...
 
 AssemblyMap (const LibUtilities::SessionReaderSharedPtr &pSession, const std::string variable="DefaultVar")
 Constructor with a communicator. More...
 
 AssemblyMap (AssemblyMap *oldLevelMap, const BottomUpSubStructuredGraphSharedPtr &multiLevelGraph)
 Constructor for next level in multi-level static condensation. More...
 
virtual ~AssemblyMap ()
 Destructor. More...
 
LibUtilities::CommSharedPtr GetComm ()
 Retrieves the communicator. More...
 
size_t GetHash () const
 Retrieves the hash of this map. More...
 
int GetLocalToGlobalMap (const int i) const
 
int GetGlobalToUniversalMap (const int i) const
 
int GetGlobalToUniversalMapUnique (const int i) const
 
const Array< OneD, const int > & GetLocalToGlobalMap ()
 
const Array< OneD, const int > & GetGlobalToUniversalMap ()
 
const Array< OneD, const int > & GetGlobalToUniversalMapUnique ()
 
NekDouble GetLocalToGlobalSign (const int i) const
 
const Array< OneD, NekDouble > & GetLocalToGlobalSign () const
 
void LocalToGlobal (const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global, bool useComm=true) const
 
void LocalToGlobal (const NekVector< NekDouble > &loc, NekVector< NekDouble > &global, bool useComm=true) const
 
void GlobalToLocal (const Array< OneD, const NekDouble > &global, Array< OneD, NekDouble > &loc) const
 
void GlobalToLocal (const NekVector< NekDouble > &global, NekVector< NekDouble > &loc) const
 
void Assemble (const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global) const
 
void Assemble (const NekVector< NekDouble > &loc, NekVector< NekDouble > &global) const
 
void UniversalAssemble (Array< OneD, NekDouble > &pGlobal) const
 
void UniversalAssemble (NekVector< NekDouble > &pGlobal) const
 
void UniversalAssemble (Array< OneD, NekDouble > &pGlobal, int offset) const
 
void UniversalAbsMaxBnd (Array< OneD, NekDouble > &bndvals)
 
int GetLocalToGlobalBndMap (const int i) const
 Retrieve the global index of a given local boundary mode. More...
 
const Array< OneD, const int > & GetLocalToGlobalBndMap ()
 Retrieve the global indices of the local boundary modes. More...
 
const Array< OneD, const int > & GetGlobalToUniversalBndMap ()
 
const Array< OneD, const int > & GetGlobalToUniversalBndMapUnique ()
 
bool GetSignChange ()
 Returns true if using a modal expansion requiring a change of sign of some modes. More...
 
NekDouble GetLocalToGlobalBndSign (const int i) const
 Retrieve the sign change of a given local boundary mode. More...
 
Array< OneD, const NekDoubleGetLocalToGlobalBndSign () const
 Retrieve the sign change for all local boundary modes. More...
 
const Array< OneD, const int > & GetBndCondCoeffsToLocalCoeffsMap ()
 Retrieves the local indices corresponding to the boundary expansion modes. More...
 
const Array< OneD, NekDouble > & GetBndCondCoeffsToLocalCoeffsSign ()
 Returns the modal sign associated with a given boundary expansion mode. More...
 
const Array< OneD, const int > & GetBndCondCoeffsToLocalTraceMap ()
 Retrieves the local indices corresponding to the boundary expansion modes to global trace. More...
 
int GetBndCondIDToGlobalTraceID (const int i)
 Returns the global index of the boundary trace giving the index on the boundary expansion. More...
 
const Array< OneD, const int > & GetBndCondIDToGlobalTraceID ()
 
int GetNumGlobalDirBndCoeffs () const
 Returns the number of global Dirichlet boundary coefficients. More...
 
int GetNumLocalDirBndCoeffs () const
 Returns the number of local Dirichlet boundary coefficients. More...
 
int GetNumGlobalBndCoeffs () const
 Returns the total number of global boundary coefficients. More...
 
int GetNumLocalBndCoeffs () const
 Returns the total number of local boundary coefficients. More...
 
int GetNumLocalCoeffs () const
 Returns the total number of local coefficients. More...
 
int GetNumGlobalCoeffs () const
 Returns the total number of global coefficients. More...
 
bool GetSingularSystem () const
 Retrieves if the system is singular (true) or not (false) More...
 
void GlobalToLocalBnd (const NekVector< NekDouble > &global, NekVector< NekDouble > &loc, int offset) const
 
void GlobalToLocalBnd (const NekVector< NekDouble > &global, NekVector< NekDouble > &loc) const
 
void GlobalToLocalBnd (const Array< OneD, const NekDouble > &global, Array< OneD, NekDouble > &loc, int offset) const
 
void GlobalToLocalBnd (const Array< OneD, const NekDouble > &global, Array< OneD, NekDouble > &loc) const
 
void LocalBndToGlobal (const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global, int offset, bool UseComm=true) const
 
void LocalBndToGlobal (const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global, bool UseComm=true) const
 
void LocalToLocalBnd (const Array< OneD, const NekDouble > &local, Array< OneD, NekDouble > &locbnd) const
 
void LocalToLocalInt (const Array< OneD, const NekDouble > &local, Array< OneD, NekDouble > &locint) const
 
void LocalBndToLocal (const Array< OneD, const NekDouble > &locbnd, Array< OneD, NekDouble > &local) const
 
void LocalIntToLocal (const Array< OneD, const NekDouble > &locbnd, Array< OneD, NekDouble > &local) const
 
void AssembleBnd (const NekVector< NekDouble > &loc, NekVector< NekDouble > &global, int offset) const
 
void AssembleBnd (const NekVector< NekDouble > &loc, NekVector< NekDouble > &global) const
 
void AssembleBnd (const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global, int offset) const
 
void AssembleBnd (const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global) const
 
void UniversalAssembleBnd (Array< OneD, NekDouble > &pGlobal) const
 
void UniversalAssembleBnd (NekVector< NekDouble > &pGlobal) const
 
void UniversalAssembleBnd (Array< OneD, NekDouble > &pGlobal, int offset) const
 
int GetFullSystemBandWidth () const
 
int GetNumNonDirVertexModes () const
 
int GetNumNonDirEdgeModes () const
 
int GetNumNonDirFaceModes () const
 
int GetNumDirEdges () const
 
int GetNumDirFaces () const
 
int GetNumNonDirEdges () const
 
int GetNumNonDirFaces () const
 
void PrintStats (std::ostream &out, std::string variable, bool printHeader=true) const
 
const Array< OneD, const int > & GetExtraDirEdges ()
 
std::shared_ptr< AssemblyMapLinearSpaceMap (const ExpList &locexp, GlobalSysSolnType solnType)
 
int GetBndSystemBandWidth () const
 Returns the bandwidth of the boundary system. More...
 
int GetStaticCondLevel () const
 Returns the level of static condensation for this map. More...
 
int GetNumPatches () const
 Returns the number of patches in this static condensation level. More...
 
const Array< OneD, const unsigned int > & GetNumLocalBndCoeffsPerPatch ()
 Returns the number of local boundary coefficients in each patch. More...
 
const Array< OneD, const unsigned int > & GetNumLocalIntCoeffsPerPatch ()
 Returns the number of local interior coefficients in each patch. More...
 
const AssemblyMapSharedPtr GetNextLevelLocalToGlobalMap () const
 Returns the local to global mapping for the next level in the multi-level static condensation. More...
 
void SetNextLevelLocalToGlobalMap (AssemblyMapSharedPtr pNextLevelLocalToGlobalMap)
 
const PatchMapSharedPtrGetPatchMapFromPrevLevel (void) const
 Returns the patch map from the previous level of the multi-level static condensation. More...
 
bool AtLastLevel () const
 Returns true if this is the last level in the multi-level static condensation. More...
 
GlobalSysSolnType GetGlobalSysSolnType () const
 Returns the method of solving global systems. More...
 
PreconditionerType GetPreconType () const
 
NekDouble GetIterativeTolerance () const
 
int GetMaxIterations () const
 
int GetSuccessiveRHS () const
 
std::string GetLinSysIterSolver () const
 
int GetLowestStaticCondLevel () const
 
void PatchLocalToGlobal (const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global) const
 
void PatchGlobalToLocal (const Array< OneD, const NekDouble > &global, Array< OneD, NekDouble > &loc) const
 
void PatchAssemble (const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global) const
 

Static Public Member Functions

static void RealignTraceElement (Array< OneD, int > &toAlign, StdRegions::Orientation orient, int nquad1, int nquad2=0)
 

Protected Member Functions

void SetUpUniversalDGMap (const ExpList &locExp)
 
virtual int v_GetLocalToGlobalMap (const int i) const
 
virtual int v_GetGlobalToUniversalMap (const int i) const
 
virtual int v_GetGlobalToUniversalMapUnique (const int i) const
 
virtual const Array< OneD, const int > & v_GetLocalToGlobalMap ()
 
virtual const Array< OneD, const int > & v_GetGlobalToUniversalMap ()
 
virtual const Array< OneD, const int > & v_GetGlobalToUniversalMapUnique ()
 
virtual NekDouble v_GetLocalToGlobalSign (const int i) const
 
virtual void v_LocalToGlobal (const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global, bool useComm=false) const
 
virtual void v_GlobalToLocal (const Array< OneD, const NekDouble > &global, Array< OneD, NekDouble > &loc) const
 
virtual void v_GlobalToLocal (const NekVector< NekDouble > &global, NekVector< NekDouble > &loc) const
 
virtual void v_Assemble (const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global) const
 
virtual void v_Assemble (const NekVector< NekDouble > &loc, NekVector< NekDouble > &global) const
 
virtual void v_UniversalAssemble (Array< OneD, NekDouble > &pGlobal) const
 
virtual void v_UniversalAssemble (NekVector< NekDouble > &pGlobal) const
 
virtual int v_GetFullSystemBandWidth () const
 
- Protected Member Functions inherited from Nektar::MultiRegions::AssemblyMap
void CalculateBndSystemBandWidth ()
 Calculates the bandwidth of the boundary system. More...
 
void GlobalToLocalBndWithoutSign (const Array< OneD, const NekDouble > &global, Array< OneD, NekDouble > &loc)
 

Protected Attributes

int m_numDirichletBndPhys
 Number of physical dirichlet boundary values in trace. More...
 
AssemblyCommDGSharedPtr m_assemblyComm
 
Array< OneD, Array< OneD, LocalRegions::ExpansionSharedPtr > > m_elmtToTrace
 list of edge expansions for a given element More...
 
- Protected Attributes inherited from Nektar::MultiRegions::AssemblyMap
LibUtilities::SessionReaderSharedPtr m_session
 Session object. More...
 
LibUtilities::CommSharedPtr m_comm
 Communicator. More...
 
size_t m_hash
 Hash for map. More...
 
int m_numLocalBndCoeffs
 Number of local boundary coefficients. More...
 
int m_numGlobalBndCoeffs
 Total number of global boundary coefficients. More...
 
int m_numLocalDirBndCoeffs
 Number of Local Dirichlet Boundary Coefficients. More...
 
int m_numGlobalDirBndCoeffs
 Number of Global Dirichlet Boundary Coefficients. More...
 
bool m_systemSingular
 Flag indicating if the system is singular or not. More...
 
int m_numLocalCoeffs
 Total number of local coefficients. More...
 
int m_numGlobalCoeffs
 Total number of global coefficients. More...
 
bool m_signChange
 Flag indicating if modes require sign reversal. More...
 
Array< OneD, int > m_localToGlobalBndMap
 Integer map of local coeffs to global Boundary Dofs. More...
 
Array< OneD, NekDoublem_localToGlobalBndSign
 Integer sign of local boundary coeffs to global space. More...
 
Array< OneD, int > m_localToLocalBndMap
 Integer map of local boundary coeffs to local boundary system numbering. More...
 
Array< OneD, int > m_localToLocalIntMap
 Integer map of local boundary coeffs to local interior system numbering. More...
 
Array< OneD, int > m_bndCondCoeffsToLocalCoeffsMap
 Integer map of bnd cond coeffs to local coefficients. More...
 
Array< OneD, NekDoublem_bndCondCoeffsToLocalCoeffsSign
 Integer map of sign of bnd cond coeffs to local coefficients. More...
 
Array< OneD, int > m_bndCondCoeffsToLocalTraceMap
 Integer map of bnd cond coeff to local trace coeff. More...
 
Array< OneD, int > m_bndCondIDToGlobalTraceID
 Integer map of bnd cond trace number to global trace number. More...
 
Array< OneD, int > m_globalToUniversalBndMap
 Integer map of process coeffs to universal space. More...
 
Array< OneD, int > m_globalToUniversalBndMapUnique
 Integer map of unique process coeffs to universal space (signed) More...
 
GlobalSysSolnType m_solnType
 The solution type of the global system. More...
 
int m_bndSystemBandWidth
 The bandwith of the global bnd system. More...
 
PreconditionerType m_preconType
 Type type of preconditioner to use in iterative solver. More...
 
int m_maxIterations
 Maximum iterations for iterative solver. More...
 
NekDouble m_iterativeTolerance
 Tolerance for iterative solver. More...
 
int m_successiveRHS
 sucessive RHS for iterative solver More...
 
std::string m_linSysIterSolver
 Iterative solver: Conjugate Gradient, GMRES. More...
 
Gs::gs_datam_gsh
 
Gs::gs_datam_bndGsh
 
Gs::gs_datam_dirBndGsh
 gs gather communication to impose Dirhichlet BCs. More...
 
int m_staticCondLevel
 The level of recursion in the case of multi-level static condensation. More...
 
int m_numPatches
 The number of patches (~elements) in the current level. More...
 
Array< OneD, unsigned int > m_numLocalBndCoeffsPerPatch
 The number of bnd dofs per patch. More...
 
Array< OneD, unsigned int > m_numLocalIntCoeffsPerPatch
 The number of int dofs per patch. More...
 
AssemblyMapSharedPtr m_nextLevelLocalToGlobalMap
 Map from the patches of the previous level to the patches of the current level. More...
 
int m_lowestStaticCondLevel
 Lowest static condensation level. More...
 

Detailed Description

Definition at line 51 of file AssemblyMapDG.h.

Constructor & Destructor Documentation

◆ AssemblyMapDG() [1/2]

Nektar::MultiRegions::AssemblyMapDG::AssemblyMapDG ( )

Default constructor.

Definition at line 54 of file AssemblyMapDG.cpp.

54  :
56  {
57  }
int m_numDirichletBndPhys
Number of physical dirichlet boundary values in trace.

◆ AssemblyMapDG() [2/2]

Nektar::MultiRegions::AssemblyMapDG::AssemblyMapDG ( const LibUtilities::SessionReaderSharedPtr pSession,
const SpatialDomains::MeshGraphSharedPtr graph1D,
const ExpListSharedPtr trace,
const ExpList locExp,
const Array< OneD, const MultiRegions::ExpListSharedPtr > &  bndConstraint,
const Array< OneD, const SpatialDomains::BoundaryConditionShPtr > &  bndCond,
const PeriodicMap periodicTrace,
const std::string  variable = "DefaultVar" 
)

Constructor for trace map for one-dimensional expansion.

Definition at line 63 of file AssemblyMapDG.cpp.

71  :
72  AssemblyMap(pSession,variable)
73  {
74  boost::ignore_unused(graph);
75 
76  int i, j, k, cnt, id, id1, gid;
77  int order_e = 0;
78  int nTraceExp = trace->GetExpSize();
79  int nbnd = bndCondExp.size();
80 
84 
85  const LocalRegions::ExpansionVector expList = *(locExp.GetExp());
86  int nel = expList.size();
87 
88  map<int, int> meshTraceId;
89 
90  m_signChange = true;
91 
92  // determine mapping from geometry edges to trace
93  for(i = 0; i < nTraceExp; ++i)
94  {
95  meshTraceId[trace->GetExp(i)->GetGeom()->GetGlobalID()] = i;
96  }
97 
98  // Count total number of trace elements
99  cnt = 0;
100  for(i = 0; i < nel; ++i)
101  {
102  cnt += expList[i]->GetNtraces();
103  }
104 
105  Array<OneD, LocalRegions::ExpansionSharedPtr> tracemap(cnt);
106  m_elmtToTrace = Array<
107  OneD, Array<OneD, LocalRegions::ExpansionSharedPtr> >(nel);
108 
109  // set up trace expansions links;
110  for(cnt = i = 0; i < nel; ++i)
111  {
112  m_elmtToTrace[i] = tracemap + cnt;
113  exp = expList[i];
114 
115  for(j = 0; j < exp->GetNtraces(); ++j)
116  {
117  id = exp->GetGeom()->GetTid(j);
118 
119  if(meshTraceId.count(id) > 0)
120  {
121  m_elmtToTrace[i][j] =
122  trace->GetExp(meshTraceId.find(id)->second);
123  }
124  else
125  {
126  ASSERTL0(false, "Failed to find trace map");
127  }
128  }
129 
130  cnt += exp->GetNtraces();
131  }
132 
133  // Set up boundary mapping
134  cnt = 0;
135  for(i = 0; i < nbnd; ++i)
136  {
137  if (bndCond[i]->GetBoundaryConditionType() ==
139  {
140  continue;
141  }
142  cnt += bndCondExp[i]->GetExpSize();
143  }
144 
145  set<int> dirTrace;
146 
149 
150  for(i = 0; i < bndCondExp.size(); ++i)
151  {
152  for(j = 0; j < bndCondExp[i]->GetExpSize(); ++j)
153  {
154  bndExp = bndCondExp[i]->GetExp(j);
155  traceGeom = bndExp->GetGeom();
156  id = traceGeom->GetGlobalID();
157 
158  if(bndCond[i]->GetBoundaryConditionType() ==
160  {
161  m_numLocalDirBndCoeffs += bndExp->GetNcoeffs();
162  m_numDirichletBndPhys += bndExp->GetTotPoints();
163  dirTrace.insert(id);
164  }
165  }
166  }
167 
168  // Set up integer mapping array and sign change for each degree of
169  // freedom + initialise some more data members.
170  m_staticCondLevel = 0;
172  m_numPatches = nel;
173  m_numLocalBndCoeffsPerPatch = Array<OneD, unsigned int>(nel);
174  m_numLocalIntCoeffsPerPatch = Array<OneD, unsigned int>(nel);
175 
176  int nbndry = 0;
177  for(i = 0; i < nel; ++i) // count number of elements in array
178  {
179  int BndCoeffs = expList[i]->NumDGBndryCoeffs();
180  nbndry += BndCoeffs;
182  m_numLocalBndCoeffsPerPatch[i] = (unsigned int) BndCoeffs;
183  }
184 
186  m_numLocalBndCoeffs = nbndry;
187  m_numLocalCoeffs = nbndry;
188  m_localToGlobalBndMap = Array<OneD, int> (nbndry);
189  m_localToGlobalBndSign = Array<OneD, NekDouble> (nbndry,1);
190 
191  // Set up array for potential mesh optimsation
192  Array<OneD,int> traceElmtGid(nTraceExp, -1);
193  int nDir = 0;
194  cnt = 0;
195 
196  // We are now going to construct a graph of the mesh which can be
197  // reordered depending on the type of solver we would like to use.
198  typedef boost::adjacency_list<
199  boost::setS, boost::vecS, boost::undirectedS> BoostGraph;
200 
201  BoostGraph boostGraphObj;
202  int trace_id, trace_id1;
203  int dirOffset = 0;
204 
205  // make trace renumbering map where first solved trace starts
206  // at 0 so we can set up graph.
207  for(i = 0; i < nTraceExp; ++i)
208  {
209  id = trace->GetExp(i)->GetGeom()->GetGlobalID();
210 
211  if (dirTrace.count(id) == 0)
212  {
213  // Initial put in element ordering (starting from zero) into
214  // traceElmtGid
215  boost::add_vertex(boostGraphObj);
216  traceElmtGid[i] = cnt++;
217  }
218  else
219  {
220  // Use existing offset for Dirichlet edges
221  traceElmtGid[i] = dirOffset;
222  dirOffset += trace->GetExp(i)->GetNcoeffs();
223  nDir++;
224  }
225  }
226 
227  // Set up boost Graph
228  for(i = 0; i < nel; ++i)
229  {
230  exp = expList[i];
231 
232  for(j = 0; j < exp->GetNtraces(); ++j)
233  {
234  // Add trace to boost graph for non-Dirichlet Boundary
235  traceGeom = m_elmtToTrace[i][j]->GetGeom();
236  id = traceGeom->GetGlobalID();
237  trace_id = meshTraceId.find(id)->second;
238 
239  if(dirTrace.count(id) == 0)
240  {
241  for(k = j+1; k < exp->GetNtraces(); ++k)
242  {
243  traceGeom = m_elmtToTrace[i][k]->GetGeom();
244  id1 = traceGeom->GetGlobalID();
245  trace_id1 = meshTraceId.find(id1)->second;
246 
247  if(dirTrace.count(id1) == 0)
248  {
249  boost::add_edge((size_t)traceElmtGid[trace_id],
250  (size_t)traceElmtGid[trace_id1],
251  boostGraphObj);
252  }
253  }
254  }
255  }
256  }
257 
258  int nGraphVerts = nTraceExp - nDir;
259  Array<OneD, int> perm (nGraphVerts);
260  Array<OneD, int> iperm(nGraphVerts);
261  Array<OneD, int> vwgts(nGraphVerts);
263 
264  for(i = 0; i < nGraphVerts; ++i)
265  {
266  vwgts[i] = trace->GetExp(i+nDir)->GetNcoeffs();
267  }
268 
269  if(nGraphVerts)
270  {
271  switch(m_solnType)
272  {
273  case eDirectFullMatrix:
274  case eIterativeFull:
276  case eXxtFullMatrix:
277  case eXxtStaticCond:
278  case ePETScFullMatrix:
279  case ePETScStaticCond:
280  {
281  NoReordering(boostGraphObj,perm,iperm);
282  break;
283  }
284  case eDirectStaticCond:
285  {
286  CuthillMckeeReordering(boostGraphObj,perm,iperm);
287  break;
288  }
293  {
294  MultiLevelBisectionReordering(boostGraphObj,perm,iperm,
295  bottomUpGraph);
296  break;
297  }
298  default:
299  {
300  ASSERTL0(false,"Unrecognised solution type");
301  }
302  }
303  }
304 
305  // Recast the permutation so that it can be used as a map from old
306  // trace ID to new trace ID
308  for(i = 0; i < nTraceExp - nDir; ++i)
309  {
310  traceElmtGid[perm[i]+nDir] = cnt;
311  cnt += trace->GetExp(perm[i]+nDir)->GetNcoeffs();
312  }
313 
314  // Now have trace edges Gid position
315  cnt = 0;
316  for(i = 0; i < nel; ++i)
317  {
318  exp = expList[i];
319 
320  for(j = 0; j < exp->GetNtraces(); ++j)
321  {
322  traceGeom = m_elmtToTrace[i][j]->GetGeom();
323  id = traceGeom->GetGlobalID();
324  gid = traceElmtGid[meshTraceId.find(id)->second];
325 
326  const int nDim = exp->GetNumBases();
327 
328  if (nDim == 1)
329  {
330  order_e = 1;
331  m_localToGlobalBndMap[cnt] = gid;
332  }
333  else if (nDim == 2)
334  {
335  order_e = exp->GetTraceNcoeffs(j);
336 
337  if(exp->GetTraceOrient(j) == StdRegions::eForwards)
338  {
339  for(k = 0; k < order_e; ++k)
340  {
341  m_localToGlobalBndMap[k+cnt] = gid + k;
342  }
343  }
344  else
345  {
346  switch(m_elmtToTrace[i][j]->GetBasisType(0))
347  {
349  {
350  // reverse vertex order
351  m_localToGlobalBndMap[cnt] = gid + 1;
352  m_localToGlobalBndMap[cnt+1] = gid;
353  for (k = 2; k < order_e; ++k)
354  {
355  m_localToGlobalBndMap[k+cnt] = gid + k;
356  }
357 
358  // negate odd modes
359  for(k = 3; k < order_e; k+=2)
360  {
361  m_localToGlobalBndSign[cnt+k] = -1.0;
362  }
363  break;
364  }
366  {
367  // reverse order
368  for(k = 0; k < order_e; ++k)
369  {
370  m_localToGlobalBndMap[cnt+order_e-k-1] = gid + k;
371  }
372  break;
373  }
375  {
376  // reverse order
377  for(k = 0; k < order_e; ++k)
378  {
379  m_localToGlobalBndMap[cnt+order_e-k-1] = gid + k;
380  }
381  break;
382  }
383  default:
384  {
385  ASSERTL0(false,"Boundary type not permitted");
386  }
387  }
388  }
389  }
390  else if (nDim == 3)
391  {
392  order_e = exp->GetTraceNcoeffs(j);
393 
394  std::map<int, int> orientMap;
395 
396  Array<OneD, unsigned int> elmMap1 (order_e);
397  Array<OneD, int> elmSign1(order_e);
398  Array<OneD, unsigned int> elmMap2 (order_e);
399  Array<OneD, int> elmSign2(order_e);
400 
401  StdRegions::Orientation fo = exp->GetTraceOrient(j);
402 
403  // Construct mapping which will permute global IDs
404  // according to face orientations.
405  exp->GetTraceToElementMap(j,elmMap1,elmSign1,fo);
406  exp->GetTraceToElementMap(j,elmMap2,elmSign2,
408 
409  for (k = 0; k < elmMap1.size(); ++k)
410  {
411  // Find the elemental co-efficient in the original
412  // mapping.
413  int idx = -1;
414  for (int l = 0; l < elmMap2.size(); ++l)
415  {
416  if (elmMap1[k] == elmMap2[l])
417  {
418  idx = l;
419  break;
420  }
421  }
422 
423  ASSERTL2(idx != -1, "Problem with face to element map!");
424  orientMap[k] = idx;
425  }
426 
427  for(k = 0; k < order_e; ++k)
428  {
429  m_localToGlobalBndMap [k+cnt] = gid + orientMap[k];
430  m_localToGlobalBndSign[k+cnt] = elmSign2[orientMap[k]];
431  }
432  }
433 
434  cnt += order_e;
435  }
436  }
437 
438  // set up identify map for lcoal to lcoal
439  m_localToLocalBndMap = Array<OneD,int>(m_numLocalBndCoeffs);
440 
441  //local to bnd map is just a copy
442  for(i = 0; i < m_numLocalBndCoeffs; ++i)
443  {
444  m_localToLocalBndMap[i] = i;
445  }
446 
447 
448  m_numGlobalBndCoeffs = trace->GetNcoeffs();
450 
452 
453  // set up m_bndCondCoeffsToLocalTraceMap
454  // Number of boundary expansions
455  int nbndexp = 0;
456  int bndTotal = 0;
457  int bndOffset;
458  int traceOffset;
459 
460  cnt = 0;
461  for(i = 0; i < nbnd; ++i)
462  {
463  if (bndCond[i]->GetBoundaryConditionType() ==
465  {
466  continue;
467  }
468  cnt += bndCondExp[i]->GetNcoeffs();
469  nbndexp += bndCondExp[i]->GetExpSize();
470  }
471 
472  m_bndCondCoeffsToLocalTraceMap = Array<OneD, int>(cnt);
473  m_bndCondIDToGlobalTraceID = Array<OneD, int>(nbndexp);
474 
475  cnt = 0;
476  for(i = 0; i < bndCondExp.size(); ++i)
477  {
478  if (bndCond[i]->GetBoundaryConditionType() ==
480  {
481  continue;
482  }
483 
484  for(j = 0; j < bndCondExp[i]->GetExpSize(); ++j)
485  {
486  bndExp = bndCondExp[i]->GetExp(j);
487  id = bndExp->GetGeom()->GetGlobalID();
488 
489  int meshId = meshTraceId.find(id)->second;
490  m_bndCondIDToGlobalTraceID[cnt++] = meshId;
491 
492  // initialy set up map with global bnd location
493  // and then use the localToGlobalBndMap to invert
494  // since this is a one to one mapping on boundaries
495  traceOffset = traceElmtGid[meshId];
496  bndOffset = bndCondExp[i]->GetCoeff_Offset(j) + bndTotal;
497 
498 
499  for(k = 0; k < bndExp->GetNcoeffs(); ++k)
500  {
501  m_bndCondCoeffsToLocalTraceMap[bndOffset+k] =
502  traceOffset + k;
503  }
504  }
505  bndTotal += bndCondExp[i]->GetNcoeffs();
506  }
507 
508  // generate an inverse local to global bnd map;
509  map<int,int> invLocToGloMap;
510  for(i = 0; i < nbndry; ++i)
511  {
512  invLocToGloMap[m_localToGlobalBndMap[i]] = i;
513  }
514 
515  // reset bndCondCoeffToLocalTraceMap to hold local rather
516  // than global reference
517  for(i = 0; i < m_bndCondCoeffsToLocalTraceMap.size(); ++i)
518  {
520  invLocToGloMap[m_bndCondCoeffsToLocalTraceMap[i]];
521  }
522 
523  // Now set up mapping from global coefficients to universal.
524  ExpListSharedPtr tr = std::dynamic_pointer_cast<ExpList>(trace);
525  SetUpUniversalDGMap (locExp);
526 
529  locExp, tr, m_elmtToTrace, bndCondExp, bndCond, periodicTrace));
530 
535  && nGraphVerts)
536  {
537  if (m_staticCondLevel < (bottomUpGraph->GetNlevels() - 1))
538  {
539  Array<OneD, int> vwgts_perm(nGraphVerts);
540 
541  for (int i = 0; i < nGraphVerts; i++)
542  {
543  vwgts_perm[i] = vwgts[perm[i]];
544  }
545 
546  bottomUpGraph->ExpandGraphWithVertexWeights(vwgts_perm);
548  AllocateSharedPtr(this, bottomUpGraph);
549  }
550  }
551 
553  m_localToGlobalBndMap.end());
554  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed to...
Definition: ErrorUtil.hpp:274
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
Array< OneD, Array< OneD, LocalRegions::ExpansionSharedPtr > > m_elmtToTrace
list of edge expansions for a given element
AssemblyCommDGSharedPtr m_assemblyComm
void SetUpUniversalDGMap(const ExpList &locExp)
int m_lowestStaticCondLevel
Lowest static condensation level.
Definition: AssemblyMap.h:434
GlobalSysSolnType m_solnType
The solution type of the global system.
Definition: AssemblyMap.h:395
int m_numLocalCoeffs
Total number of local coefficients.
Definition: AssemblyMap.h:357
bool m_signChange
Flag indicating if modes require sign reversal.
Definition: AssemblyMap.h:371
int m_numGlobalCoeffs
Total number of global coefficients.
Definition: AssemblyMap.h:368
Array< OneD, int > m_localToGlobalBndMap
Integer map of local coeffs to global Boundary Dofs.
Definition: AssemblyMap.h:374
void CalculateBndSystemBandWidth()
Calculates the bandwidth of the boundary system.
Array< OneD, unsigned int > m_numLocalBndCoeffsPerPatch
The number of bnd dofs per patch.
Definition: AssemblyMap.h:425
int m_numLocalBndCoeffs
Number of local boundary coefficients.
Definition: AssemblyMap.h:338
AssemblyMapSharedPtr m_nextLevelLocalToGlobalMap
Map from the patches of the previous level to the patches of the current level.
Definition: AssemblyMap.h:432
int m_staticCondLevel
The level of recursion in the case of multi-level static condensation.
Definition: AssemblyMap.h:421
Array< OneD, NekDouble > m_localToGlobalBndSign
Integer sign of local boundary coeffs to global space.
Definition: AssemblyMap.h:376
int m_numLocalDirBndCoeffs
Number of Local Dirichlet Boundary Coefficients.
Definition: AssemblyMap.h:342
int m_numGlobalDirBndCoeffs
Number of Global Dirichlet Boundary Coefficients.
Definition: AssemblyMap.h:344
Array< OneD, unsigned int > m_numLocalIntCoeffsPerPatch
The number of int dofs per patch.
Definition: AssemblyMap.h:427
AssemblyMap()
Default constructor.
Definition: AssemblyMap.cpp:80
Array< OneD, int > m_localToLocalBndMap
Integer map of local boundary coeffs to local boundary system numbering.
Definition: AssemblyMap.h:378
int m_numPatches
The number of patches (~elements) in the current level.
Definition: AssemblyMap.h:423
Array< OneD, int > m_bndCondIDToGlobalTraceID
Integer map of bnd cond trace number to global trace number.
Definition: AssemblyMap.h:388
Array< OneD, int > m_bndCondCoeffsToLocalTraceMap
Integer map of bnd cond coeff to local trace coeff.
Definition: AssemblyMap.h:386
int m_numGlobalBndCoeffs
Total number of global boundary coefficients.
Definition: AssemblyMap.h:340
@ eGauss_Lagrange
Lagrange Polynomials using the Gauss points .
Definition: BasisType.h:55
@ eGLL_Lagrange
Lagrange for SEM basis .
Definition: BasisType.h:54
@ eModified_A
Principle Modified Functions .
Definition: BasisType.h:48
std::shared_ptr< Expansion > ExpansionSharedPtr
Definition: Expansion.h:68
std::vector< ExpansionSharedPtr > ExpansionVector
Definition: Expansion.h:70
void NoReordering(const BoostGraph &graph, Array< OneD, int > &perm, Array< OneD, int > &iperm)
std::shared_ptr< AssemblyCommDG > AssemblyCommDGSharedPtr
void CuthillMckeeReordering(const BoostGraph &graph, Array< OneD, int > &perm, Array< OneD, int > &iperm)
void MultiLevelBisectionReordering(const BoostGraph &graph, Array< OneD, int > &perm, Array< OneD, int > &iperm, BottomUpSubStructuredGraphSharedPtr &substructgraph, std::set< int > partVerts, int mdswitch)
std::shared_ptr< BottomUpSubStructuredGraph > BottomUpSubStructuredGraphSharedPtr
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
std::shared_ptr< Geometry > GeometrySharedPtr
Definition: Geometry.h:53
std::size_t hash_range(Iter first, Iter last)
Definition: HashUtils.hpp:69

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), ASSERTL0, ASSERTL2, Nektar::MultiRegions::AssemblyMap::CalculateBndSystemBandWidth(), Nektar::MultiRegions::CuthillMckeeReordering(), Nektar::StdRegions::eDir1FwdDir1_Dir2FwdDir2, Nektar::MultiRegions::eDirectFullMatrix, Nektar::MultiRegions::eDirectMultiLevelStaticCond, Nektar::MultiRegions::eDirectStaticCond, Nektar::SpatialDomains::eDirichlet, Nektar::StdRegions::eForwards, Nektar::LibUtilities::eGauss_Lagrange, Nektar::LibUtilities::eGLL_Lagrange, Nektar::MultiRegions::eIterativeFull, Nektar::MultiRegions::eIterativeMultiLevelStaticCond, Nektar::MultiRegions::eIterativeStaticCond, Nektar::LibUtilities::eModified_A, Nektar::SpatialDomains::ePeriodic, Nektar::MultiRegions::ePETScFullMatrix, Nektar::MultiRegions::ePETScMultiLevelStaticCond, Nektar::MultiRegions::ePETScStaticCond, Nektar::MultiRegions::eXxtFullMatrix, Nektar::MultiRegions::eXxtMultiLevelStaticCond, Nektar::MultiRegions::eXxtStaticCond, Nektar::MultiRegions::ExpList::GetExp(), Nektar::hash_range(), m_assemblyComm, Nektar::MultiRegions::AssemblyMap::m_bndCondCoeffsToLocalTraceMap, Nektar::MultiRegions::AssemblyMap::m_bndCondIDToGlobalTraceID, m_elmtToTrace, Nektar::MultiRegions::AssemblyMap::m_hash, Nektar::MultiRegions::AssemblyMap::m_localToGlobalBndMap, Nektar::MultiRegions::AssemblyMap::m_localToGlobalBndSign, Nektar::MultiRegions::AssemblyMap::m_localToLocalBndMap, Nektar::MultiRegions::AssemblyMap::m_lowestStaticCondLevel, Nektar::MultiRegions::AssemblyMap::m_nextLevelLocalToGlobalMap, m_numDirichletBndPhys, Nektar::MultiRegions::AssemblyMap::m_numGlobalBndCoeffs, Nektar::MultiRegions::AssemblyMap::m_numGlobalCoeffs, Nektar::MultiRegions::AssemblyMap::m_numGlobalDirBndCoeffs, Nektar::MultiRegions::AssemblyMap::m_numLocalBndCoeffs, Nektar::MultiRegions::AssemblyMap::m_numLocalBndCoeffsPerPatch, Nektar::MultiRegions::AssemblyMap::m_numLocalCoeffs, Nektar::MultiRegions::AssemblyMap::m_numLocalDirBndCoeffs, Nektar::MultiRegions::AssemblyMap::m_numLocalIntCoeffsPerPatch, Nektar::MultiRegions::AssemblyMap::m_numPatches, Nektar::MultiRegions::AssemblyMap::m_signChange, Nektar::MultiRegions::AssemblyMap::m_solnType, Nektar::MultiRegions::AssemblyMap::m_staticCondLevel, Nektar::MultiRegions::MultiLevelBisectionReordering(), Nektar::MultiRegions::NoReordering(), and SetUpUniversalDGMap().

◆ ~AssemblyMapDG()

Nektar::MultiRegions::AssemblyMapDG::~AssemblyMapDG ( )
virtual

Destructor.

Definition at line 59 of file AssemblyMapDG.cpp.

60  {
61  }

Member Function Documentation

◆ GetAssemblyCommDG()

AssemblyCommDGSharedPtr Nektar::MultiRegions::AssemblyMapDG::GetAssemblyCommDG ( )

Definition at line 926 of file AssemblyMapDG.cpp.

927  {
928  return m_assemblyComm;
929  }

References m_assemblyComm.

◆ GetElmtToTrace() [1/2]

Array< OneD, Array< OneD, LocalRegions::ExpansionSharedPtr > > & Nektar::MultiRegions::AssemblyMapDG::GetElmtToTrace ( )

Definition at line 921 of file AssemblyMapDG.cpp.

922  {
923  return m_elmtToTrace;
924  }

References m_elmtToTrace.

◆ GetElmtToTrace() [2/2]

Array< OneD, LocalRegions::ExpansionSharedPtr > & Nektar::MultiRegions::AssemblyMapDG::GetElmtToTrace ( const int  i)

Definition at line 913 of file AssemblyMapDG.cpp.

914  {
915  ASSERTL1(i >= 0 && i < m_elmtToTrace.size(),
916  "i is out of range");
917  return m_elmtToTrace[i];
918  }
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
Definition: ErrorUtil.hpp:250

References ASSERTL1, and m_elmtToTrace.

◆ GetNumDirichletBndPhys()

int Nektar::MultiRegions::AssemblyMapDG::GetNumDirichletBndPhys ( )

Return the number of boundary segments on which Dirichlet boundary conditions are imposed.

Definition at line 907 of file AssemblyMapDG.cpp.

908  {
909  return m_numDirichletBndPhys;
910  }

References m_numDirichletBndPhys.

◆ RealignTraceElement()

void Nektar::MultiRegions::AssemblyMapDG::RealignTraceElement ( Array< OneD, int > &  toAlign,
StdRegions::Orientation  orient,
int  nquad1,
int  nquad2 = 0 
)
static

Changes toAlign quadrature point order, where the realignment is given by orient, which defines the mapping needed to go between the original ordering and the new desired ordering.

Parameters
[in,out]toAlignData to reorder
[in]orientThe transformation to perform
[in]nquad1Quadrature points in direction 1
[in]nquad2Quadrature points in direction 2

Definition at line 738 of file AssemblyMapDG.cpp.

743  {
744  if (orient == StdRegions::eBackwards)
745  {
746  ASSERTL1(nquad2 == 0, "nquad2 != 0 for reorienation");
747  for (int i = 0; i < nquad1/2; ++i)
748  {
749  swap(toAlign[i], toAlign[nquad1-1-i]);
750  }
751  }
752  else if (orient != StdRegions::eForwards)
753  {
754  ASSERTL1(nquad2 != 0, "nquad2 == 0 for reorienation");
755 
756  Array<OneD, int> tmp(nquad1*nquad2);
757 
758  // Copy transpose.
759  if (orient == StdRegions::eDir1FwdDir2_Dir2FwdDir1 ||
763  {
764  for (int i = 0; i < nquad2; ++i)
765  {
766  for (int j = 0; j < nquad1; ++j)
767  {
768  tmp[i*nquad1 + j] = toAlign[j*nquad2 + i];
769  }
770  }
771  }
772  else
773  {
774  for (int i = 0; i < nquad2; ++i)
775  {
776  for (int j = 0; j < nquad1; ++j)
777  {
778  tmp[i*nquad1 + j] = toAlign[i*nquad1 + j];
779  }
780  }
781  }
782 
783  if (orient == StdRegions::eDir1BwdDir1_Dir2FwdDir2 ||
787  {
788  // Reverse x direction
789  for (int i = 0; i < nquad2; ++i)
790  {
791  for (int j = 0; j < nquad1/2; ++j)
792  {
793  swap(tmp[i*nquad1 + j],
794  tmp[i*nquad1 + nquad1-j-1]);
795  }
796  }
797  }
798 
799  if (orient == StdRegions::eDir1FwdDir1_Dir2BwdDir2 ||
803  {
804  // Reverse y direction
805  for (int j = 0; j < nquad1; ++j)
806  {
807  for (int i = 0; i < nquad2/2; ++i)
808  {
809  swap(tmp[i*nquad1 + j],
810  tmp[(nquad2-i-1)*nquad1 + j]);
811  }
812  }
813  }
814  Vmath::Vcopy(nquad1*nquad2, tmp, 1, toAlign, 1);
815  }
816  }
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1199

References ASSERTL1, Nektar::StdRegions::eBackwards, Nektar::StdRegions::eDir1BwdDir1_Dir2BwdDir2, Nektar::StdRegions::eDir1BwdDir1_Dir2FwdDir2, Nektar::StdRegions::eDir1BwdDir2_Dir2BwdDir1, Nektar::StdRegions::eDir1BwdDir2_Dir2FwdDir1, Nektar::StdRegions::eDir1FwdDir1_Dir2BwdDir2, Nektar::StdRegions::eDir1FwdDir2_Dir2BwdDir1, Nektar::StdRegions::eDir1FwdDir2_Dir2FwdDir1, Nektar::StdRegions::eForwards, and Vmath::Vcopy().

Referenced by Nektar::MultiRegions::AssemblyCommDG::InitialiseStructure().

◆ SetUpUniversalDGMap()

void Nektar::MultiRegions::AssemblyMapDG::SetUpUniversalDGMap ( const ExpList locExp)
protected

Constructs a mapping between the process-local global numbering and a universal numbering of the trace space expansion. The universal numbering is defined by the mesh edge IDs to enforce consistency across processes.

Parameters
locExpList of local elemental expansions.

Definition at line 564 of file AssemblyMapDG.cpp.

565  {
567  int cnt = 0;
568  int id = 0;
569  int order_e = 0;
570  int vGlobalId = 0;
571  int maxDof = 0;
572  int dof = 0;
573  int nDim = 0;
574  int i,j,k;
575 
576  const LocalRegions::ExpansionVector &locExpVector = *(locExp.GetExp());
577 
578  // Initialise the global to universal maps.
581 
582  // Loop over all the elements in the domain and compute max
583  // DOF. Reduce across all processes to get universal maximum.
584  for(i = 0; i < locExpVector.size(); ++i)
585  {
586  locExpansion = locExpVector[i];
587  nDim = locExpansion->GetShapeDimension();
588 
589  // Loop over all edges of element i
590  if (nDim == 1)
591  {
592  maxDof = (1 > maxDof ? 1 : maxDof);
593  }
594  else
595  {
596  for (j = 0; j < locExpansion->GetNtraces(); ++j)
597  {
598  dof = locExpansion->GetTraceNcoeffs(j);
599  maxDof = (dof > maxDof ? dof : maxDof);
600  }
601  }
602  }
603  m_comm->GetRowComm()->AllReduce(maxDof, LibUtilities::ReduceMax);
604 
605  // Now have trace edges Gid position
606  cnt = 0;
607  for(i = 0; i < locExpVector.size(); ++i)
608  {
609  locExpansion = locExpVector[i];
610  nDim = locExpansion->GetShapeDimension();
611 
612  // Populate mapping for each edge of the element.
613  if (nDim == 1)
614  {
615  int nverts = locExpansion->GetNverts();
616  for(j = 0; j < nverts; ++j)
617  {
618  LocalRegions::PointExpSharedPtr locPointExp =
619  m_elmtToTrace[i][j]->as<LocalRegions::PointExp>();
620  id = locPointExp->GetGeom()->GetGlobalID();
621  vGlobalId = m_localToGlobalBndMap[cnt+j];
622  m_globalToUniversalBndMap[vGlobalId]
623  = id * maxDof + j + 1;
624  }
625  cnt += nverts;
626  }
627  else if (nDim == 2)
628  {
629  for(j = 0; j < locExpansion->GetNtraces(); ++j)
630  {
632  m_elmtToTrace[i][j]->as<LocalRegions::SegExp>();
633 
634  id = locSegExp->GetGeom()->GetGlobalID();
635  order_e = locExpansion->GetTraceNcoeffs(j);
636 
637  map<int,int> orientMap;
638  Array<OneD, unsigned int> map1(order_e), map2(order_e);
639  Array<OneD, int> sign1(order_e), sign2(order_e);
640 
641  locExpansion->GetTraceToElementMap(j, map1, sign1,
643  locExpansion->GetTraceToElementMap(j, map2, sign2,
644  locExpansion->GetTraceOrient(j));
645 
646  for (k = 0; k < map1.size(); ++k)
647  {
648  // Find the elemental co-efficient in the original
649  // mapping.
650  int idx = -1;
651  for (int l = 0; l < map2.size(); ++l)
652  {
653  if (map1[k] == map2[l])
654  {
655  idx = l;
656  break;
657  }
658  }
659 
660  ASSERTL2(idx != -1, "Problem with face to"
661  " element map!");
662  orientMap[k] = idx;
663  }
664 
665  for(k = 0; k < order_e; ++k)
666  {
667  vGlobalId = m_localToGlobalBndMap[k+cnt];
668  m_globalToUniversalBndMap[vGlobalId]
669  = id * maxDof + orientMap[k] + 1;
670  }
671  cnt += order_e;
672  }
673  }
674  else if (nDim == 3) //This could likely be combined with nDim == 2
675  {
676  for(j = 0; j < locExpansion->GetNtraces(); ++j)
677  {
679  m_elmtToTrace[i][j]
680  ->as<LocalRegions::Expansion2D>();
681 
682  id = locFaceExp->GetGeom()->GetGlobalID();
683  order_e = locExpansion->GetTraceNcoeffs(j);
684 
685  map<int,int> orientMap;
686  Array<OneD, unsigned int> map1(order_e), map2(order_e);
687  Array<OneD, int> sign1(order_e), sign2(order_e);
688 
689  locExpansion->GetTraceToElementMap(j, map1, sign1,
691  locExpansion->GetTraceToElementMap(j, map2, sign2,
692  locExpansion->GetTraceOrient(j));
693 
694  for (k = 0; k < map1.size(); ++k)
695  {
696  // Find the elemental co-efficient in the original
697  // mapping.
698  int idx = -1;
699  for (int l = 0; l < map2.size(); ++l)
700  {
701  if (map1[k] == map2[l])
702  {
703  idx = l;
704  break;
705  }
706  }
707 
708  ASSERTL2(idx != -1, "Problem with face to "
709  "element map!");
710  orientMap[k] = idx;
711  }
712 
713  for(k = 0; k < order_e; ++k)
714  {
715  vGlobalId = m_localToGlobalBndMap[k+cnt];
716  m_globalToUniversalBndMap[vGlobalId]
717  = id * maxDof + orientMap[k] + 1;
718  }
719  cnt += order_e;
720  }
721  }
722  }
723 
724  // Initialise GSlib and populate the unique map.
725  Array<OneD, long> tmp(m_globalToUniversalBndMap.size());
726  for (i = 0; i < m_globalToUniversalBndMap.size(); ++i)
727  {
728  tmp[i] = m_globalToUniversalBndMap[i];
729  }
730  m_bndGsh = m_gsh = Gs::Init(tmp, m_comm->GetRowComm());
731  Gs::Unique(tmp, m_comm->GetRowComm());
732  for (i = 0; i < m_globalToUniversalBndMap.size(); ++i)
733  {
734  m_globalToUniversalBndMapUnique[i] = (tmp[i] >= 0 ? 1 : 0);
735  }
736  }
Array< OneD, int > m_globalToUniversalBndMap
Integer map of process coeffs to universal space.
Definition: AssemblyMap.h:390
LibUtilities::CommSharedPtr m_comm
Communicator.
Definition: AssemblyMap.h:332
Array< OneD, int > m_globalToUniversalBndMapUnique
Integer map of unique process coeffs to universal space (signed)
Definition: AssemblyMap.h:392
static gs_data * Init(const Nektar::Array< OneD, long > pId, const LibUtilities::CommSharedPtr &pComm, bool verbose=true)
Initialise Gather-Scatter map.
Definition: GsLib.hpp:167
static void Unique(const Nektar::Array< OneD, long > pId, const LibUtilities::CommSharedPtr &pComm)
Updates pId to negate all-but-one references to each universal ID.
Definition: GsLib.hpp:202
std::shared_ptr< SegExp > SegExpSharedPtr
Definition: SegExp.h:272
std::shared_ptr< PointExp > PointExpSharedPtr
Definition: PointExp.h:129
std::shared_ptr< Expansion2D > Expansion2DSharedPtr
Definition: Expansion1D.h:47

References ASSERTL2, Nektar::StdRegions::eDir1FwdDir1_Dir2FwdDir2, Nektar::StdRegions::eForwards, Nektar::MultiRegions::ExpList::GetExp(), Nektar::LocalRegions::Expansion::GetGeom(), Nektar::LocalRegions::PointExp::GetGeom(), Gs::Init(), Nektar::MultiRegions::AssemblyMap::m_bndGsh, Nektar::MultiRegions::AssemblyMap::m_comm, m_elmtToTrace, Nektar::MultiRegions::AssemblyMap::m_globalToUniversalBndMap, Nektar::MultiRegions::AssemblyMap::m_globalToUniversalBndMapUnique, Nektar::MultiRegions::AssemblyMap::m_gsh, Nektar::MultiRegions::AssemblyMap::m_localToGlobalBndMap, Nektar::MultiRegions::AssemblyMap::m_numGlobalBndCoeffs, Nektar::LibUtilities::ReduceMax, and Gs::Unique().

Referenced by AssemblyMapDG().

◆ v_Assemble() [1/2]

void Nektar::MultiRegions::AssemblyMapDG::v_Assemble ( const Array< OneD, const NekDouble > &  loc,
Array< OneD, NekDouble > &  global 
) const
protectedvirtual

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 876 of file AssemblyMapDG.cpp.

879  {
880  AssembleBnd(loc,global);
881  }
void AssembleBnd(const NekVector< NekDouble > &loc, NekVector< NekDouble > &global, int offset) const

References Nektar::MultiRegions::AssemblyMap::AssembleBnd(), and CG_Iterations::loc.

◆ v_Assemble() [2/2]

void Nektar::MultiRegions::AssemblyMapDG::v_Assemble ( const NekVector< NekDouble > &  loc,
NekVector< NekDouble > &  global 
) const
protectedvirtual

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 883 of file AssemblyMapDG.cpp.

886  {
887  AssembleBnd(loc,global);
888  }

References Nektar::MultiRegions::AssemblyMap::AssembleBnd(), and CG_Iterations::loc.

◆ v_GetFullSystemBandWidth()

int Nektar::MultiRegions::AssemblyMapDG::v_GetFullSystemBandWidth ( ) const
protectedvirtual

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 902 of file AssemblyMapDG.cpp.

903  {
904  return GetBndSystemBandWidth();
905  }
int GetBndSystemBandWidth() const
Returns the bandwidth of the boundary system.

References Nektar::MultiRegions::AssemblyMap::GetBndSystemBandWidth().

◆ v_GetGlobalToUniversalMap() [1/2]

const Array< OneD, const int > & Nektar::MultiRegions::AssemblyMapDG::v_GetGlobalToUniversalMap ( void  )
protectedvirtual

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 838 of file AssemblyMapDG.cpp.

839  {
841  }

References Nektar::MultiRegions::AssemblyMap::m_globalToUniversalBndMap.

◆ v_GetGlobalToUniversalMap() [2/2]

int Nektar::MultiRegions::AssemblyMapDG::v_GetGlobalToUniversalMap ( const int  i) const
protectedvirtual

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 823 of file AssemblyMapDG.cpp.

824  {
825  return m_globalToUniversalBndMap[i];
826  }

References Nektar::MultiRegions::AssemblyMap::m_globalToUniversalBndMap.

◆ v_GetGlobalToUniversalMapUnique() [1/2]

const Array< OneD, const int > & Nektar::MultiRegions::AssemblyMapDG::v_GetGlobalToUniversalMapUnique ( void  )
protectedvirtual

◆ v_GetGlobalToUniversalMapUnique() [2/2]

int Nektar::MultiRegions::AssemblyMapDG::v_GetGlobalToUniversalMapUnique ( const int  i) const
protectedvirtual

◆ v_GetLocalToGlobalMap() [1/2]

const Array< OneD, const int > & Nektar::MultiRegions::AssemblyMapDG::v_GetLocalToGlobalMap ( void  )
protectedvirtual

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 833 of file AssemblyMapDG.cpp.

834  {
835  return m_localToGlobalBndMap;
836  }

References Nektar::MultiRegions::AssemblyMap::m_localToGlobalBndMap.

◆ v_GetLocalToGlobalMap() [2/2]

int Nektar::MultiRegions::AssemblyMapDG::v_GetLocalToGlobalMap ( const int  i) const
protectedvirtual

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 818 of file AssemblyMapDG.cpp.

819  {
820  return m_localToGlobalBndMap[i];
821  }

References Nektar::MultiRegions::AssemblyMap::m_localToGlobalBndMap.

◆ v_GetLocalToGlobalSign()

NekDouble Nektar::MultiRegions::AssemblyMapDG::v_GetLocalToGlobalSign ( const int  i) const
protectedvirtual

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 848 of file AssemblyMapDG.cpp.

850  {
851  return GetLocalToGlobalBndSign(i);
852  }
Array< OneD, const NekDouble > GetLocalToGlobalBndSign() const
Retrieve the sign change for all local boundary modes.

References Nektar::MultiRegions::AssemblyMap::GetLocalToGlobalBndSign().

◆ v_GlobalToLocal() [1/2]

void Nektar::MultiRegions::AssemblyMapDG::v_GlobalToLocal ( const Array< OneD, const NekDouble > &  global,
Array< OneD, NekDouble > &  loc 
) const
protectedvirtual

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 862 of file AssemblyMapDG.cpp.

865  {
866  GlobalToLocalBnd(global,loc);
867  }
void GlobalToLocalBnd(const NekVector< NekDouble > &global, NekVector< NekDouble > &loc, int offset) const

References Nektar::MultiRegions::AssemblyMap::GlobalToLocalBnd(), and CG_Iterations::loc.

◆ v_GlobalToLocal() [2/2]

void Nektar::MultiRegions::AssemblyMapDG::v_GlobalToLocal ( const NekVector< NekDouble > &  global,
NekVector< NekDouble > &  loc 
) const
protectedvirtual

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 869 of file AssemblyMapDG.cpp.

872  {
873  GlobalToLocalBnd(global,loc);
874  }

References Nektar::MultiRegions::AssemblyMap::GlobalToLocalBnd(), and CG_Iterations::loc.

◆ v_LocalToGlobal()

void Nektar::MultiRegions::AssemblyMapDG::v_LocalToGlobal ( const Array< OneD, const NekDouble > &  loc,
Array< OneD, NekDouble > &  global,
bool  useComm = false 
) const
protectedvirtual

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 854 of file AssemblyMapDG.cpp.

858  {
859  LocalBndToGlobal(loc,global,useComm);
860  }
void LocalBndToGlobal(const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global, int offset, bool UseComm=true) const

References CG_Iterations::loc, and Nektar::MultiRegions::AssemblyMap::LocalBndToGlobal().

◆ v_UniversalAssemble() [1/2]

void Nektar::MultiRegions::AssemblyMapDG::v_UniversalAssemble ( Array< OneD, NekDouble > &  pGlobal) const
protectedvirtual

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 890 of file AssemblyMapDG.cpp.

892  {
893  Gs::Gather(pGlobal, Gs::gs_add, m_gsh);
894  }
static void Gather(Nektar::Array< OneD, NekDouble > pU, gs_op pOp, gs_data *pGsh, Nektar::Array< OneD, NekDouble > pBuffer=NullNekDouble1DArray)
Performs a gather-scatter operation of the provided values.
Definition: GsLib.hpp:245
@ gs_add
Definition: GsLib.hpp:53

References Gs::Gather(), Gs::gs_add, and Nektar::MultiRegions::AssemblyMap::m_gsh.

◆ v_UniversalAssemble() [2/2]

void Nektar::MultiRegions::AssemblyMapDG::v_UniversalAssemble ( NekVector< NekDouble > &  pGlobal) const
protectedvirtual

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 896 of file AssemblyMapDG.cpp.

898  {
899  UniversalAssemble(pGlobal.GetPtr());
900  }
void UniversalAssemble(Array< OneD, NekDouble > &pGlobal) const

References Nektar::NekVector< DataType >::GetPtr(), and Nektar::MultiRegions::AssemblyMap::UniversalAssemble().

Member Data Documentation

◆ m_assemblyComm

AssemblyCommDGSharedPtr Nektar::MultiRegions::AssemblyMapDG::m_assemblyComm
protected

Definition at line 106 of file AssemblyMapDG.h.

Referenced by AssemblyMapDG(), and GetAssemblyCommDG().

◆ m_elmtToTrace

Array<OneD, Array<OneD, LocalRegions::ExpansionSharedPtr> > Nektar::MultiRegions::AssemblyMapDG::m_elmtToTrace
protected

list of edge expansions for a given element

Definition at line 109 of file AssemblyMapDG.h.

Referenced by AssemblyMapDG(), GetElmtToTrace(), and SetUpUniversalDGMap().

◆ m_numDirichletBndPhys

int Nektar::MultiRegions::AssemblyMapDG::m_numDirichletBndPhys
protected

Number of physical dirichlet boundary values in trace.

Definition at line 104 of file AssemblyMapDG.h.

Referenced by AssemblyMapDG(), and GetNumDirichletBndPhys().