Nektar++
Loading...
Searching...
No Matches
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.
 
 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.
 
 ~AssemblyMapDG () override
 Destructor.
 
int GetNumDirichletBndPhys ()
 Return the number of boundary segments on which Dirichlet boundary conditions are imposed.
 
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.
 
 AssemblyMap (const LibUtilities::SessionReaderSharedPtr &pSession, const LibUtilities::CommSharedPtr &comm, const std::string variable="DefaultVar")
 Constructor with a communicator.
 
 AssemblyMap (AssemblyMap *oldLevelMap, const BottomUpSubStructuredGraphSharedPtr &multiLevelGraph)
 Constructor for next level in multi-level static condensation.
 
virtual ~AssemblyMap ()
 Destructor.
 
LibUtilities::CommSharedPtr GetComm ()
 Retrieves the communicator.
 
std::string GetVariable ()
 Retrieves the variable string.
 
size_t GetHash () const
 Retrieves the hash of this map.
 
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.
 
const Array< OneD, const int > & GetLocalToGlobalBndMap ()
 Retrieve the global indices of the local boundary modes.
 
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.
 
NekDouble GetLocalToGlobalBndSign (const int i) const
 Retrieve the sign change of a given local boundary mode.
 
Array< OneD, const NekDoubleGetLocalToGlobalBndSign () const
 Retrieve the sign change for all local boundary modes.
 
const Array< OneD, const int > & GetBndCondCoeffsToLocalCoeffsMap ()
 Retrieves the local indices corresponding to the boundary expansion modes.
 
const Array< OneD, NekDouble > & GetBndCondCoeffsToLocalCoeffsSign ()
 Returns the modal sign associated with a given boundary expansion mode.
 
const Array< OneD, const int > & GetBndCondCoeffsToLocalTraceMap ()
 Retrieves the local indices corresponding to the boundary expansion modes to global trace.
 
int GetBndCondIDToGlobalTraceID (const int i)
 Returns the global index of the boundary trace giving the index on the boundary expansion.
 
const Array< OneD, const int > & GetBndCondIDToGlobalTraceID ()
 
int GetPerBndCondIDToGlobalTraceID (const int i)
 Returns the global index of the rotational periodic boundary trace giving the index on the rotational periodic boundary condition.
 
const Array< OneD, const int > & GetPerBndCondIDToGlobalTraceID ()
 
int GetNumGlobalDirBndCoeffs () const
 Returns the number of global Dirichlet boundary coefficients.
 
int GetNumLocalDirBndCoeffs () const
 Returns the number of local Dirichlet boundary coefficients.
 
int GetNumGlobalBndCoeffs () const
 Returns the total number of global boundary coefficients.
 
int GetNumLocalBndCoeffs () const
 Returns the total number of local boundary coefficients.
 
int GetNumLocalCoeffs () const
 Returns the total number of local coefficients.
 
int GetNumGlobalCoeffs () const
 Returns the total number of global coefficients.
 
bool GetSingularSystem () const
 Retrieves if the system is singular (true) or not (false)
 
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.
 
int GetStaticCondLevel () const
 Returns the level of static condensation for this map.
 
int GetNumPatches () const
 Returns the number of patches in this static condensation level.
 
const Array< OneD, const unsigned int > & GetNumLocalBndCoeffsPerPatch ()
 Returns the number of local boundary coefficients in each patch.
 
const Array< OneD, const unsigned int > & GetNumLocalIntCoeffsPerPatch ()
 Returns the number of local interior coefficients in each patch.
 
const AssemblyMapSharedPtr GetNextLevelLocalToGlobalMap () const
 Returns the local to global mapping for the next level in the multi-level static condensation.
 
void SetNextLevelLocalToGlobalMap (AssemblyMapSharedPtr pNextLevelLocalToGlobalMap)
 
const PatchMapSharedPtrGetPatchMapFromPrevLevel (void) const
 Returns the patch map from the previous level of the multi-level static condensation.
 
bool AtLastLevel () const
 Returns true if this is the last level in the multi-level static condensation.
 
GlobalSysSolnType GetGlobalSysSolnType () const
 Returns the method of solving global systems.
 
std::string GetPreconType () const
 
bool IsAbsoluteTolerance () 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)
 
int v_GetLocalToGlobalMap (const int i) const override
 
int v_GetGlobalToUniversalMap (const int i) const override
 
int v_GetGlobalToUniversalMapUnique (const int i) const override
 
const Array< OneD, const int > & v_GetLocalToGlobalMap () override
 
const Array< OneD, const int > & v_GetGlobalToUniversalMap () override
 
const Array< OneD, const int > & v_GetGlobalToUniversalMapUnique () override
 
NekDouble v_GetLocalToGlobalSign (const int i) const override
 
const Array< OneD, NekDouble > & v_GetLocalToGlobalSign () const override
 
void v_LocalToGlobal (const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global, bool useComm=false) const override
 
void v_GlobalToLocal (const Array< OneD, const NekDouble > &global, Array< OneD, NekDouble > &loc) const override
 
void v_GlobalToLocal (const NekVector< NekDouble > &global, NekVector< NekDouble > &loc) const override
 
void v_Assemble (const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global) const override
 
void v_Assemble (const NekVector< NekDouble > &loc, NekVector< NekDouble > &global) const override
 
void v_UniversalAssemble (Array< OneD, NekDouble > &pGlobal) const override
 
void v_UniversalAssemble (Array< OneD, NekDouble > &pGlobal, int offset) const override
 
int v_GetFullSystemBandWidth () const override
 
- Protected Member Functions inherited from Nektar::MultiRegions::AssemblyMap
void CalculateBndSystemBandWidth ()
 Calculates the bandwidth of the boundary system.
 
void GlobalToLocalBndWithoutSign (const Array< OneD, const NekDouble > &global, Array< OneD, NekDouble > &loc)
 
virtual int v_GetNumNonDirVertexModes () const
 
virtual int v_GetNumNonDirEdgeModes () const
 
virtual int v_GetNumNonDirFaceModes () const
 
virtual int v_GetNumDirEdges () const
 
virtual int v_GetNumDirFaces () const
 
virtual int v_GetNumNonDirEdges () const
 
virtual int v_GetNumNonDirFaces () const
 
virtual const Array< OneD, const int > & v_GetExtraDirEdges ()
 
virtual std::shared_ptr< AssemblyMapv_LinearSpaceMap (const ExpList &locexp, GlobalSysSolnType solnType)
 Generate a linear space mapping from existing mapping.
 

Protected Attributes

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

Detailed Description

Definition at line 49 of file AssemblyMapDG.h.

Constructor & Destructor Documentation

◆ AssemblyMapDG() [1/2]

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

Default constructor.

Definition at line 52 of file AssemblyMapDG.cpp.

53{
54}
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 60 of file AssemblyMapDG.cpp.

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

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::SpatialDomains::Geometry::GetGlobalID(), 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_perbndCondIDToGlobalTraceID, 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 ( )
override

Destructor.

Definition at line 56 of file AssemblyMapDG.cpp.

57{
58}

Member Function Documentation

◆ GetAssemblyCommDG()

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

Definition at line 935 of file AssemblyMapDG.cpp.

936{
937 return m_assemblyComm;
938}

References m_assemblyComm.

◆ GetElmtToTrace() [1/2]

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

Definition at line 929 of file AssemblyMapDG.cpp.

931{
932 return m_elmtToTrace;
933}

References m_elmtToTrace.

◆ GetElmtToTrace() [2/2]

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

Definition at line 922 of file AssemblyMapDG.cpp.

924{
925 ASSERTL1(i >= 0 && i < m_elmtToTrace.size(), "i is out of range");
926 return m_elmtToTrace[i];
927}
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....

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 917 of file AssemblyMapDG.cpp.

918{
920}

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 753 of file AssemblyMapDG.cpp.

756{
757 if (orient == StdRegions::eBackwards)
758 {
759 ASSERTL1(nquad2 == 0, "nquad2 != 0 for reorienation");
760 for (int i = 0; i < nquad1 / 2; ++i)
761 {
762 swap(toAlign[i], toAlign[nquad1 - 1 - i]);
763 }
764 }
765 else if (orient != StdRegions::eForwards)
766 {
767 ASSERTL1(nquad2 != 0, "nquad2 == 0 for reorienation");
768
769 Array<OneD, int> tmp(nquad1 * nquad2);
770
771 // Copy transpose.
776 {
777 for (int i = 0; i < nquad2; ++i)
778 {
779 for (int j = 0; j < nquad1; ++j)
780 {
781 tmp[i * nquad1 + j] = toAlign[j * nquad2 + i];
782 }
783 }
784 }
785 else
786 {
787 for (int i = 0; i < nquad2; ++i)
788 {
789 for (int j = 0; j < nquad1; ++j)
790 {
791 tmp[i * nquad1 + j] = toAlign[i * nquad1 + j];
792 }
793 }
794 }
795
800 {
801 // Reverse x direction
802 for (int i = 0; i < nquad2; ++i)
803 {
804 for (int j = 0; j < nquad1 / 2; ++j)
805 {
806 swap(tmp[i * nquad1 + j], tmp[i * nquad1 + nquad1 - j - 1]);
807 }
808 }
809 }
810
815 {
816 // Reverse y direction
817 for (int j = 0; j < nquad1; ++j)
818 {
819 for (int i = 0; i < nquad2 / 2; ++i)
820 {
821 swap(tmp[i * nquad1 + j],
822 tmp[(nquad2 - i - 1) * nquad1 + j]);
823 }
824 }
825 }
826 Vmath::Vcopy(nquad1 * nquad2, tmp, 1, toAlign, 1);
827 }
828}
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition Vmath.hpp:825

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 574 of file AssemblyMapDG.cpp.

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

References ASSERTL2, Nektar::StdRegions::eDir1FwdDir1_Dir2FwdDir2, Nektar::StdRegions::eForwards, Nektar::MultiRegions::ExpList::GetExp(), Nektar::LocalRegions::Expansion::GetGeom(), Nektar::LocalRegions::PointExp::GetGeom(), Nektar::SpatialDomains::Geometry::GetGlobalID(), 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
overrideprotectedvirtual

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 889 of file AssemblyMapDG.cpp.

891{
892 AssembleBnd(loc, global);
893}
void AssembleBnd(const NekVector< NekDouble > &loc, NekVector< NekDouble > &global, int offset) const

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

◆ v_Assemble() [2/2]

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

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 895 of file AssemblyMapDG.cpp.

897{
898 AssembleBnd(loc, global);
899}

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

◆ v_GetFullSystemBandWidth()

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

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 912 of file AssemblyMapDG.cpp.

913{
914 return GetBndSystemBandWidth();
915}
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  )
overrideprotectedvirtual

◆ v_GetGlobalToUniversalMap() [2/2]

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

◆ v_GetGlobalToUniversalMapUnique() [1/2]

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

◆ v_GetGlobalToUniversalMapUnique() [2/2]

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

◆ v_GetLocalToGlobalMap() [1/2]

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

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 845 of file AssemblyMapDG.cpp.

846{
848}

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

◆ v_GetLocalToGlobalMap() [2/2]

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

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 830 of file AssemblyMapDG.cpp.

831{
832 return m_localToGlobalBndMap[i];
833}

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

◆ v_GetLocalToGlobalSign() [1/2]

const Array< OneD, NekDouble > & Nektar::MultiRegions::AssemblyMapDG::v_GetLocalToGlobalSign ( ) const
overrideprotectedvirtual

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 865 of file AssemblyMapDG.cpp.

866{
868}
virtual const Array< OneD, NekDouble > & v_GetLocalToGlobalSign() const

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

◆ v_GetLocalToGlobalSign() [2/2]

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

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 860 of file AssemblyMapDG.cpp.

861{
862 return GetLocalToGlobalBndSign(i);
863}
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
overrideprotectedvirtual

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 877 of file AssemblyMapDG.cpp.

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

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

◆ v_GlobalToLocal() [2/2]

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

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 883 of file AssemblyMapDG.cpp.

885{
886 GlobalToLocalBnd(global, loc);
887}

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

◆ v_LocalToGlobal()

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

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 870 of file AssemblyMapDG.cpp.

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

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

◆ v_UniversalAssemble() [1/2]

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

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 901 of file AssemblyMapDG.cpp.

902{
903 Gs::Gather(pGlobal, Gs::gs_add, m_gsh);
904}
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:278
@ gs_add
Definition GsLib.hpp:60

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

◆ v_UniversalAssemble() [2/2]

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

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 906 of file AssemblyMapDG.cpp.

908{
909 AssemblyMap::v_UniversalAssemble(pGlobal, offset);
910}
virtual void v_UniversalAssemble(Array< OneD, NekDouble > &pGlobal) const

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

Member Data Documentation

◆ m_assemblyComm

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

Definition at line 99 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 102 of file AssemblyMapDG.h.

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

◆ m_numDirichletBndPhys

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

Number of physical dirichlet boundary values in trace.

Definition at line 97 of file AssemblyMapDG.h.

Referenced by AssemblyMapDG(), and GetNumDirichletBndPhys().