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

#include <AssemblyMapDG.h>

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

Public Member Functions

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

Static Public Member Functions

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

Protected Member Functions

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

Protected Attributes

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

Detailed Description

Definition at line 51 of file AssemblyMapDG.h.

Constructor & Destructor Documentation

◆ AssemblyMapDG() [1/2]

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

Default constructor.

Definition at line 54 of file AssemblyMapDG.cpp.

55{
56}
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 62 of file AssemblyMapDG.cpp.

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

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

◆ ~AssemblyMapDG()

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

Destructor.

Definition at line 58 of file AssemblyMapDG.cpp.

59{
60}

Member Function Documentation

◆ GetAssemblyCommDG()

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

Definition at line 908 of file AssemblyMapDG.cpp.

909{
910 return m_assemblyComm;
911}

References m_assemblyComm.

◆ GetElmtToTrace() [1/2]

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

Definition at line 903 of file AssemblyMapDG.cpp.

904{
905 return m_elmtToTrace;
906}

References m_elmtToTrace.

◆ GetElmtToTrace() [2/2]

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

Definition at line 895 of file AssemblyMapDG.cpp.

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

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

891{
893}

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

735{
736 if (orient == StdRegions::eBackwards)
737 {
738 ASSERTL1(nquad2 == 0, "nquad2 != 0 for reorienation");
739 for (int i = 0; i < nquad1 / 2; ++i)
740 {
741 swap(toAlign[i], toAlign[nquad1 - 1 - i]);
742 }
743 }
744 else if (orient != StdRegions::eForwards)
745 {
746 ASSERTL1(nquad2 != 0, "nquad2 == 0 for reorienation");
747
748 Array<OneD, int> tmp(nquad1 * nquad2);
749
750 // Copy transpose.
755 {
756 for (int i = 0; i < nquad2; ++i)
757 {
758 for (int j = 0; j < nquad1; ++j)
759 {
760 tmp[i * nquad1 + j] = toAlign[j * nquad2 + i];
761 }
762 }
763 }
764 else
765 {
766 for (int i = 0; i < nquad2; ++i)
767 {
768 for (int j = 0; j < nquad1; ++j)
769 {
770 tmp[i * nquad1 + j] = toAlign[i * nquad1 + j];
771 }
772 }
773 }
774
779 {
780 // Reverse x direction
781 for (int i = 0; i < nquad2; ++i)
782 {
783 for (int j = 0; j < nquad1 / 2; ++j)
784 {
785 swap(tmp[i * nquad1 + j], tmp[i * nquad1 + nquad1 - j - 1]);
786 }
787 }
788 }
789
794 {
795 // Reverse y direction
796 for (int j = 0; j < nquad1; ++j)
797 {
798 for (int i = 0; i < nquad2 / 2; ++i)
799 {
800 swap(tmp[i * nquad1 + j],
801 tmp[(nquad2 - i - 1) * nquad1 + j]);
802 }
803 }
804 }
805 Vmath::Vcopy(nquad1 * nquad2, tmp, 1, toAlign, 1);
806 }
807}
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1191

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

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

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

Referenced by AssemblyMapDG().

◆ v_Assemble() [1/2]

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

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 863 of file AssemblyMapDG.cpp.

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

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

◆ v_Assemble() [2/2]

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

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 869 of file AssemblyMapDG.cpp.

871{
872 AssembleBnd(loc, global);
873}

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

◆ v_GetFullSystemBandWidth()

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

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 885 of file AssemblyMapDG.cpp.

886{
887 return GetBndSystemBandWidth();
888}
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 824 of file AssemblyMapDG.cpp.

825{
827}

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

810{
811 return m_localToGlobalBndMap[i];
812}

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

◆ v_GetLocalToGlobalSign()

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

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 839 of file AssemblyMapDG.cpp.

840{
841 return GetLocalToGlobalBndSign(i);
842}
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 851 of file AssemblyMapDG.cpp.

853{
854 GlobalToLocalBnd(global, loc);
855}
void GlobalToLocalBnd(const NekVector< NekDouble > &global, NekVector< NekDouble > &loc, int offset) const

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

◆ v_GlobalToLocal() [2/2]

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

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 857 of file AssemblyMapDG.cpp.

859{
860 GlobalToLocalBnd(global, loc);
861}

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

◆ v_LocalToGlobal()

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

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 844 of file AssemblyMapDG.cpp.

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

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

◆ v_UniversalAssemble() [1/2]

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

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 875 of file AssemblyMapDG.cpp.

876{
877 Gs::Gather(pGlobal, Gs::gs_add, m_gsh);
878}
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:270
@ gs_add
Definition: GsLib.hpp:62

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

◆ v_UniversalAssemble() [2/2]

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

Reimplemented from Nektar::MultiRegions::AssemblyMap.

Definition at line 880 of file AssemblyMapDG.cpp.

881{
882 UniversalAssemble(pGlobal.GetPtr());
883}
void UniversalAssemble(Array< OneD, NekDouble > &pGlobal) const
Array< OneD, DataType > & GetPtr()
Definition: NekVector.cpp:217

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

Member Data Documentation

◆ m_assemblyComm

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

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

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

◆ m_numDirichletBndPhys

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

Number of physical dirichlet boundary values in trace.

Definition at line 100 of file AssemblyMapDG.h.

Referenced by AssemblyMapDG(), and GetNumDirichletBndPhys().