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 AvgAssemble (const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global, bool useComm=true) 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 void v_AvgAssemble (const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global, bool useComm) const
 
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 61 of file AssemblyMapDG.cpp.

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

References Gs::Finalise(), and Nektar::MultiRegions::AssemblyMap::m_bndGsh.

Member Function Documentation

◆ GetAssemblyCommDG()

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

Definition at line 936 of file AssemblyMapDG.cpp.

937{
938 return m_assemblyComm;
939}

References m_assemblyComm.

◆ GetElmtToTrace() [1/2]

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

Definition at line 930 of file AssemblyMapDG.cpp.

932{
933 return m_elmtToTrace;
934}

References m_elmtToTrace.

◆ GetElmtToTrace() [2/2]

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

Definition at line 923 of file AssemblyMapDG.cpp.

925{
926 ASSERTL1(i >= 0 && i < m_elmtToTrace.size(), "i is out of range");
927 return m_elmtToTrace[i];
928}
#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 918 of file AssemblyMapDG.cpp.

919{
921}

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

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

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

892{
893 AssembleBnd(loc, global);
894}
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 896 of file AssemblyMapDG.cpp.

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

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

◆ v_GetFullSystemBandWidth()

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

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 913 of file AssemblyMapDG.cpp.

914{
915 return GetBndSystemBandWidth();
916}
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 846 of file AssemblyMapDG.cpp.

847{
849}

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

832{
833 return m_localToGlobalBndMap[i];
834}

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

867{
869}
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 861 of file AssemblyMapDG.cpp.

862{
863 return GetLocalToGlobalBndSign(i);
864}
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 878 of file AssemblyMapDG.cpp.

880{
881 GlobalToLocalBnd(global, loc);
882}
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 884 of file AssemblyMapDG.cpp.

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

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

874{
875 LocalBndToGlobal(loc, global, useComm);
876}
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 902 of file AssemblyMapDG.cpp.

903{
904 Gs::Gather(pGlobal, Gs::gs_add, m_gsh);
905}
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 907 of file AssemblyMapDG.cpp.

909{
910 AssemblyMap::v_UniversalAssemble(pGlobal, offset);
911}
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().