Nektar++
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
AssemblyMap.cpp
Go to the documentation of this file.
1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 // File AssemblyMap.cpp
4 //
5 // For more information, please see: http://www.nektar.info
6 //
7 // The MIT License
8 //
9 // Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
10 // Department of Aeronautics, Imperial College London (UK), and Scientific
11 // Computing and Imaging Institute, University of Utah (USA).
12 //
13 // License for the specific language governing rights and limitations under
14 // Permission is hereby granted, free of charge, to any person obtaining a
15 // copy of this software and associated documentation files (the "Software"),
16 // to deal in the Software without restriction, including without limitation
17 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
18 // and/or sell copies of the Software, and to permit persons to whom the
19 // Software is furnished to do so, subject to the following conditions:
20 //
21 // The above copyright notice and this permission notice shall be included
22 // in all copies or substantial portions of the Software.
23 //
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
25 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
27 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
29 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
30 // DEALINGS IN THE SOFTWARE.
31 //
32 // Description: Assembly (e.g. local to global) base mapping routines
33 //
34 ///////////////////////////////////////////////////////////////////////////////
35 
37 
38 namespace Nektar
39 {
40  namespace MultiRegions
41  {
42  /**
43  * @class AssemblyMap
44  * This class acts as a base class for constructing mappings between
45  * local, global and boundary degrees of freedom. It holds the storage
46  * for the maps and provides the accessors needed to retrieve them.
47  *
48  * There are two derived classes: AssemblyMapCG and
49  * AssemblyMapDG. These perform the actual construction of the
50  * maps within their specific contexts.
51  *
52  */
53 
54  /// Rounds a double precision number to an integer.
56  {
57  return int(x > 0.0 ? x + 0.5 : x - 0.5);
58  }
59 
60  /// Rounds an array of double precision numbers to integers.
62  {
63  int size = inarray.num_elements();
64  ASSERTL1(outarray.num_elements()>=size,"Array sizes not compatible");
65 
66  NekDouble x;
67  for(int i = 0; i < size; i++)
68  {
69  x = inarray[i];
70  outarray[i] = int(x > 0.0 ? x + 0.5 : x - 0.5);
71  }
72  }
73 
74  /**
75  * Initialises an empty mapping.
76  */
78  m_session(),
79  m_comm(),
80  m_hash(0),
81  m_numLocalBndCoeffs(0),
82  m_numGlobalBndCoeffs(0),
83  m_numLocalDirBndCoeffs(0),
84  m_numGlobalDirBndCoeffs(0),
85  m_solnType(eNoSolnType),
86  m_bndSystemBandWidth(0),
87  m_successiveRHS(0),
88  m_gsh(0),
89  m_bndGsh(0)
90  {
91  }
92 
95  const std::string variable):
96  m_session(pSession),
97  m_comm(pSession->GetComm()),
98  m_hash(0),
99  m_numLocalBndCoeffs(0),
100  m_numGlobalBndCoeffs(0),
101  m_numLocalDirBndCoeffs(0),
102  m_numGlobalDirBndCoeffs(0),
103  m_bndSystemBandWidth(0),
104  m_successiveRHS(0),
105  m_gsh(0),
106  m_bndGsh(0)
107  {
108  // Default value from Solver Info
109  m_solnType = pSession->GetSolverInfoAsEnum<GlobalSysSolnType>(
110  "GlobalSysSoln");
111  m_preconType = pSession->GetSolverInfoAsEnum<PreconditionerType>(
112  "Preconditioner");
113 
114  // Override values with data from GlobalSysSolnInfo section
115  if(pSession->DefinesGlobalSysSolnInfo(variable, "GlobalSysSoln"))
116  {
117  std::string sysSoln = pSession->GetGlobalSysSolnInfo(variable,
118  "GlobalSysSoln");
119  m_solnType = pSession->GetValueAsEnum<GlobalSysSolnType>(
120  "GlobalSysSoln", sysSoln);
121  }
122 
123  if(pSession->DefinesGlobalSysSolnInfo(variable, "Preconditioner"))
124  {
125  std::string precon = pSession->GetGlobalSysSolnInfo(variable,
126  "Preconditioner");
127  m_preconType = pSession->GetValueAsEnum<PreconditionerType>(
128  "Preconditioner", precon);
129  }
130 
131  if(pSession->DefinesGlobalSysSolnInfo(variable,
132  "IterativeSolverTolerance"))
133  {
134  m_iterativeTolerance = boost::lexical_cast<NekDouble>(
135  pSession->GetGlobalSysSolnInfo(variable,
136  "IterativeSolverTolerance").c_str());
137  }
138  else
139  {
140  pSession->LoadParameter("IterativeSolverTolerance",
143  }
144 
145 
146  if(pSession->DefinesGlobalSysSolnInfo(variable,
147  "MaxIterations"))
148  {
149  m_maxIterations = boost::lexical_cast<int>(
150  pSession->GetGlobalSysSolnInfo(variable,
151  "MaxIterations").c_str());
152  }
153  else
154  {
155  pSession->LoadParameter("MaxIterations",
157  5000);
158  }
159 
160 
161  if(pSession->DefinesGlobalSysSolnInfo(variable,"SuccessiveRHS"))
162  {
163  m_successiveRHS = boost::lexical_cast<int>(
164  pSession->GetGlobalSysSolnInfo(variable,
165  "SuccessiveRHS").c_str());
166  }
167  else
168  {
169  pSession->LoadParameter("SuccessiveRHS",
170  m_successiveRHS,0);
171  }
172 
173  }
174 
175  /**
176  * Create a new level of mapping using the information in
177  * multiLevelGraph and performing the following steps:
178  */
180  AssemblyMap* oldLevelMap,
181  const BottomUpSubStructuredGraphSharedPtr& multiLevelGraph):
182  m_session(oldLevelMap->m_session),
183  m_comm(oldLevelMap->GetComm()),
184  m_hash(0),
185  m_solnType(oldLevelMap->m_solnType),
186  m_preconType(oldLevelMap->m_preconType),
187  m_maxIterations(oldLevelMap->m_maxIterations),
188  m_iterativeTolerance(oldLevelMap->m_iterativeTolerance),
189  m_successiveRHS(oldLevelMap->m_successiveRHS),
190  m_gsh(oldLevelMap->m_gsh),
191  m_bndGsh(oldLevelMap->m_bndGsh),
192  m_lowestStaticCondLevel(oldLevelMap->m_lowestStaticCondLevel)
193  {
194  int i;
195  int j;
196  int cnt;
197 
198  //--------------------------------------------------------------
199  // -- Extract information from the input argument
200  int numGlobalBndCoeffsOld = oldLevelMap->GetNumGlobalBndCoeffs();
201  int numGlobalDirBndCoeffsOld = oldLevelMap->GetNumGlobalDirBndCoeffs();
202  int numLocalBndCoeffsOld = oldLevelMap->GetNumLocalBndCoeffs();
203  int numLocalDirBndCoeffsOld = oldLevelMap->GetNumLocalDirBndCoeffs();
204  bool signChangeOld = oldLevelMap->GetSignChange();
205 
206  int staticCondLevelOld = oldLevelMap->GetStaticCondLevel();
207  int numPatchesOld = oldLevelMap->GetNumPatches();
208  GlobalSysSolnType solnTypeOld = oldLevelMap->GetGlobalSysSolnType();
209  const Array<OneD, const unsigned int>& numLocalBndCoeffsPerPatchOld = oldLevelMap->GetNumLocalBndCoeffsPerPatch();
210  //--------------------------------------------------------------
211 
212  //--------------------------------------------------------------
213  int newLevel = staticCondLevelOld+1;
214  /** - STEP 1: setup a mask array to determine to which patch
215  * of the new level every patch of the current
216  * level belongs. To do so we make four arrays,
217  * #gloPatchMask, #globHomPatchMask,
218  * #locPatchMask_NekDouble and #locPatchMask.
219  * These arrays are then used to check which local
220  * dofs of the old level belong to which patch of
221  * the new level
222  */
223  Array<OneD, NekDouble> globPatchMask (numGlobalBndCoeffsOld,-1.0);
224  Array<OneD, NekDouble> globHomPatchMask (globPatchMask+numGlobalDirBndCoeffsOld);
225  Array<OneD, NekDouble> locPatchMask_NekDouble(numLocalBndCoeffsOld,-3.0);
226  Array<OneD, int> locPatchMask (numLocalBndCoeffsOld);
227 
228  // Fill the array globPatchMask as follows:
229  // - The first part (i.e. the glob bnd dofs) is filled with the
230  // value -1
231  // - The second part (i.e. the glob interior dofs) is numbered
232  // according to the patch it belongs to (i.e. dofs in first block
233  // all are numbered 0, the second block numbered are 1, etc...)
234  multiLevelGraph->MaskPatches(newLevel,globHomPatchMask);
235 
236  // Map from Global Dofs to Local Dofs
237  // As a result, we know for each local dof whether
238  // it is mapped to the boundary of the next level, or to which
239  // patch. Based upon this, we can than later associate every patch
240  // of the current level with a patch in the next level.
241  oldLevelMap->GlobalToLocalBndWithoutSign(globPatchMask,locPatchMask_NekDouble);
242 
243  // Convert the result to an array of integers rather than doubles
244  RoundNekDoubleToInt(locPatchMask_NekDouble,locPatchMask);
245 
246  /** - STEP 2: We calculate how many local bnd dofs of the
247  * old level belong to the boundaries of each patch at
248  * the new level. We need this information to set up the
249  * mapping between different levels.
250  */
251 
252  // Retrieve the number of patches at the next level
253  int numPatchesWithIntNew = multiLevelGraph->GetNpatchesWithInterior(newLevel);
254  int numPatchesNew = numPatchesWithIntNew;
255 
256  // Allocate memory to store the number of local dofs associated to
257  // each of elemental boundaries of these patches
258  map<int, int> numLocalBndCoeffsPerPatchNew;
259  for(int i = 0; i < numPatchesNew; i++)
260  {
261  numLocalBndCoeffsPerPatchNew[i] = 0;
262  }
263 
264  int minval;
265  int maxval;
266  int curPatch;
267  for(i = cnt = 0; i < numPatchesOld; i++)
268  {
269  // For every patch at the current level, the mask array
270  // locPatchMask should be filled with
271  // - the same (positive) number for each entry (which will
272  // correspond to the patch at the next level it belongs to)
273  // - the same (positive) number for each entry, except some
274  // entries that are -1 (the enties correspond to -1, will be
275  // mapped to the local boundary of the next level patch given
276  // by the positive number)
277  // - -1 for all entries. In this case, we will make an
278  // additional patch only consisting of boundaries at the next
279  // level
280  minval = *min_element(&locPatchMask[cnt],
281  &locPatchMask[cnt]+numLocalBndCoeffsPerPatchOld[i]);
282  maxval = *max_element(&locPatchMask[cnt],
283  &locPatchMask[cnt]+numLocalBndCoeffsPerPatchOld[i]);
284  ASSERTL0((minval==maxval)||(minval==-1),"These values should never be the same");
285 
286  if(maxval == -1)
287  {
288  curPatch = numPatchesNew;
289  numLocalBndCoeffsPerPatchNew[curPatch] = 0;
290  numPatchesNew++;
291  }
292  else
293  {
294  curPatch = maxval;
295  }
296 
297  for(j = 0; j < numLocalBndCoeffsPerPatchOld[i]; j++ )
298  {
299  ASSERTL0((locPatchMask[cnt]==maxval)||(locPatchMask[cnt]==minval),
300  "These values should never be the same");
301  if(locPatchMask[cnt] == -1)
302  {
303  ++numLocalBndCoeffsPerPatchNew[curPatch];
304  }
305  cnt++;
306  }
307  }
308 
309  // Count how many local dofs of the old level are mapped
310  // to the local boundary dofs of the new level
312  m_numPatches = numLocalBndCoeffsPerPatchNew.size();
315  for(int i = 0; i < m_numPatches; i++)
316  {
317  m_numLocalBndCoeffsPerPatch[i] = (unsigned int) numLocalBndCoeffsPerPatchNew[i];
318  m_numLocalBndCoeffs += numLocalBndCoeffsPerPatchNew[i];
319  }
320  multiLevelGraph->GetNintDofsPerPatch(newLevel,m_numLocalIntCoeffsPerPatch);
321 
322  // Also initialise some more data members
323  m_solnType = solnTypeOld;
328  "This method should only be called for in "
329  "case of multi-level static condensation.");
330  m_staticCondLevel = newLevel;
331  m_signChange = signChangeOld;
332  m_numLocalDirBndCoeffs = numLocalDirBndCoeffsOld;
333  m_numGlobalDirBndCoeffs = numGlobalDirBndCoeffsOld;
334  m_numGlobalBndCoeffs = multiLevelGraph->GetInteriorOffset(newLevel) +
336  m_numGlobalCoeffs = multiLevelGraph->GetNumGlobalDofs(newLevel) +
339  if(m_signChange)
340  {
342  }
343 
345 
350 
351  // Set up an offset array that denotes the offset of the local
352  // boundary degrees of freedom of the next level
353  Array<OneD, int> numLocalBndCoeffsPerPatchOffset(m_numPatches+1,0);
354  for(int i = 1; i < m_numPatches+1; i++)
355  {
356  numLocalBndCoeffsPerPatchOffset[i] += numLocalBndCoeffsPerPatchOffset[i-1] + numLocalBndCoeffsPerPatchNew[i-1];
357  }
358 
359  int additionalPatchCnt = numPatchesWithIntNew;
360  int newid;
361  int blockid;
362  bool isBndDof;
363  NekDouble sign;
364  Array<OneD, int> bndDofPerPatchCnt(m_numPatches,0);
365  for(i = cnt = 0; i < numPatchesOld; i++)
366  {
367  minval = *min_element(&locPatchMask[cnt],&locPatchMask[cnt]+numLocalBndCoeffsPerPatchOld[i]);
368  maxval = *max_element(&locPatchMask[cnt],&locPatchMask[cnt]+numLocalBndCoeffsPerPatchOld[i]);
369  ASSERTL0((minval==maxval)||(minval==-1),"These values should never be the same");
370 
371  if(maxval == -1)
372  {
373  curPatch = additionalPatchCnt;
374  additionalPatchCnt++;
375  }
376  else
377  {
378  curPatch = maxval;
379  }
380 
381  for(j = 0; j < numLocalBndCoeffsPerPatchOld[i]; j++ )
382  {
383  ASSERTL0((locPatchMask[cnt]==maxval)||(locPatchMask[cnt]==minval),
384  "These values should never be the same");
385 
386  sign = oldLevelMap->GetLocalToGlobalBndSign(cnt);
387 
388  if(locPatchMask[cnt] == -1)
389  {
390  newid = numLocalBndCoeffsPerPatchOffset[curPatch];
391 
392  m_localToGlobalBndMap[newid] = oldLevelMap->GetLocalToGlobalBndMap(cnt);
393  if(m_signChange)
394  {
395  m_localToGlobalBndSign[ newid ] = sign;
396  }
397 
398  blockid = bndDofPerPatchCnt[curPatch];
399  isBndDof = true;
400 
401 
402  numLocalBndCoeffsPerPatchOffset[curPatch]++;
403  bndDofPerPatchCnt[curPatch]++;
404  }
405  else
406  {
407  newid = oldLevelMap->GetLocalToGlobalBndMap(cnt) -
408  m_numGlobalBndCoeffs+m_numLocalBndCoeffs;
409 
410  blockid = oldLevelMap->GetLocalToGlobalBndMap(cnt)-
411  m_numGlobalDirBndCoeffs - multiLevelGraph->GetInteriorOffset(newLevel,curPatch);
412  isBndDof = false;
413  }
414 
415  sign = isBndDof?1.0:sign;
416 
417  m_patchMapFromPrevLevel->SetPatchMap(cnt,curPatch,blockid,isBndDof,sign);
418 
419  cnt++;
420  }
421  }
423 
424  // Postprocess the computed information - Update the old
425  // level with the mapping to new evel
426  // oldLevelMap->SetLocalBndToNextLevelMap(oldLocalBndToNewLevelMap,oldLocalBndToNewLevelSign);
427  // - Construct the next level mapping object
428  if(m_staticCondLevel < (multiLevelGraph->GetNlevels()-1))
429  {
431  }
432  }
433 
434 
436  {
437  }
438 
439 
440  /**
441  * The bandwidth calculated corresponds to what is referred to as
442  * half-bandwidth. If the elements of the matrix are designated as
443  * a_ij, it corresponds to the maximum value of |i-j| for non-zero
444  * a_ij. As a result, the value also corresponds to the number of
445  * sub- or super-diagonals.
446  *
447  * The bandwith can be calculated elementally as it corresponds to the
448  * maximal elemental bandwith (i.e. the maximal difference in global
449  * DOF index for every element).
450  *
451  * We here calculate the bandwith of the global boundary system (as
452  * used for static condensation).
453  */
455  {
456  int i,j;
457  int cnt = 0;
458  int locSize;
459  int maxId;
460  int minId;
461  int bwidth = -1;
462  for(i = 0; i < m_numPatches; ++i)
463  {
464  locSize = m_numLocalBndCoeffsPerPatch[i];
465  maxId = -1;
466  minId = m_numLocalBndCoeffs+1;
467  for(j = 0; j < locSize; j++)
468  {
470  {
471  if(m_localToGlobalBndMap[cnt+j] > maxId)
472  {
473  maxId = m_localToGlobalBndMap[cnt+j];
474  }
475 
476  if(m_localToGlobalBndMap[cnt+j] < minId)
477  {
478  minId = m_localToGlobalBndMap[cnt+j];
479  }
480  }
481  }
482  bwidth = (bwidth>(maxId-minId))?bwidth:(maxId-minId);
483 
484  cnt+=locSize;
485  }
486 
487  m_bndSystemBandWidth = bwidth;
488  }
489 
490 
491  int AssemblyMap::v_GetLocalToGlobalMap(const int i) const
492  {
493  ASSERTL0(false, "Not defined for this type of mapping.");
494  return 0;
495  }
496 
498  {
499  ASSERTL0(false, "Not defined for this type of mapping.");
500  return 0;
501  }
502 
504  {
505  ASSERTL0(false, "Not defined for this type of mapping.");
506  return 0;
507  }
508 
510  {
511  ASSERTL0(false, "Not defined for this type of mapping.");
512  static Array<OneD,const int> result;
513  return result;
514  }
515 
517  {
518  ASSERTL0(false, "Not defined for this type of mapping.");
519  static Array<OneD, const int> result;
520  return result;
521  }
522 
524  {
525  ASSERTL0(false, "Not defined for this type of mapping.");
526  static Array<OneD, const int> result;
527  return result;
528  }
529 
531  {
532  ASSERTL0(false, "Not defined for this type of mapping.");
533  return 0.0;
534  }
535 
537  {
538  ASSERTL0(false, "Not defined for this type of mapping.");
539  static Array<OneD, NekDouble> result;
540  return result;
541  }
542 
544  const Array<OneD, const NekDouble>& loc,
545  Array<OneD, NekDouble>& global) const
546  {
547  ASSERTL0(false, "Not defined for this type of mapping.");
548  }
549 
551  const NekVector<NekDouble>& loc,
552  NekVector< NekDouble>& global) const
553  {
554  ASSERTL0(false, "Not defined for this type of mapping.");
555  }
556 
558  const Array<OneD, const NekDouble>& global,
559  Array<OneD, NekDouble>& loc) const
560  {
561  ASSERTL0(false, "Not defined for this type of mapping.");
562  }
563 
565  const NekVector<NekDouble>& global,
566  NekVector< NekDouble>& loc) const
567  {
568  ASSERTL0(false, "Not defined for this type of mapping.");
569  }
570 
572  const Array<OneD, const NekDouble> &loc,
573  Array<OneD, NekDouble> &global) const
574  {
575  ASSERTL0(false, "Not defined for this type of mapping.");
576  }
577 
579  const NekVector<NekDouble>& loc,
580  NekVector< NekDouble>& global) const
581  {
582  ASSERTL0(false, "Not defined for this type of mapping.");
583  }
584 
586  Array<OneD, NekDouble>& pGlobal) const
587  {
588  // Do nothing here since multi-level static condensation uses a
589  // AssemblyMap and thus will call this routine in serial.
590  }
591 
593  NekVector< NekDouble>& pGlobal) const
594  {
595  // Do nothing here since multi-level static condensation uses a
596  // AssemblyMap and thus will call this routine in serial.
597  }
598 
600  Array<OneD, NekDouble>& pGlobal,
601  int offset) const
602  {
603  // Do nothing here since multi-level static condensation uses a
604  // AssemblyMap and thus will call this routine in serial.
605  }
606 
608  {
609  ASSERTL0(false, "Not defined for this type of mapping.");
610  return 0;
611  }
612 
614  {
615  ASSERTL0(false, "Not defined for this type of mapping.");
616  return 0;
617  }
618 
620  {
621  ASSERTL0(false, "Not defined for this type of mapping.");
622  return 0;
623  }
624 
626  {
627  ASSERTL0(false, "Not defined for this type of mapping.");
628  return 0;
629  }
630 
632  {
633  ASSERTL0(false, "Not defined for this type of mapping.");
634  return 0;
635  }
636 
638  {
639  ASSERTL0(false, "Not defined for this type of mapping.");
640  return 0;
641  }
642 
644  {
645  ASSERTL0(false, "Not defined for this type of mapping.");
646  return 0;
647  }
648 
650  {
651  ASSERTL0(false, "Not defined for this type of mapping.");
652  return 0;
653  }
654 
656  {
657  ASSERTL0(false, "Not defined for this type of mapping.");
658  static Array<OneD, const int> result;
659  return result;
660  }
661 
662  boost::shared_ptr<AssemblyMap> AssemblyMap::v_LinearSpaceMap(
663  const ExpList &locexp, GlobalSysSolnType solnType)
664  {
665  ASSERTL0(false, "Not defined for this sub class");
666  static boost::shared_ptr<AssemblyMap> result;
667  return result;
668  }
669 
671  {
672  return m_comm;
673  }
674 
675  size_t AssemblyMap::GetHash() const
676  {
677  return m_hash;
678  }
679 
680  int AssemblyMap::GetLocalToGlobalMap(const int i) const
681  {
682  return v_GetLocalToGlobalMap(i);
683  }
684 
686  {
687  return v_GetGlobalToUniversalMap(i);
688  }
689 
691  {
693  }
694 
696  {
697  return v_GetLocalToGlobalMap();
698  }
699 
701  {
702  return v_GetGlobalToUniversalMap();
703  }
704 
706  {
708  }
709 
711  {
712  return v_GetLocalToGlobalSign(i);
713  }
714 
716  {
717  return v_GetLocalToGlobalSign();
718  }
719 
721  const Array<OneD, const NekDouble>& loc,
722  Array<OneD, NekDouble>& global) const
723  {
724  v_LocalToGlobal(loc,global);
725  }
726 
728  const NekVector<NekDouble>& loc,
729  NekVector< NekDouble>& global) const
730  {
731  v_LocalToGlobal(loc,global);
732  }
733 
735  const Array<OneD, const NekDouble>& global,
736  Array<OneD, NekDouble>& loc) const
737  {
738  v_GlobalToLocal(global,loc);
739  }
740 
742  const NekVector<NekDouble>& global,
743  NekVector< NekDouble>& loc) const
744  {
745  v_GlobalToLocal(global,loc);
746  }
747 
749  const Array<OneD, const NekDouble> &loc,
750  Array<OneD, NekDouble> &global) const
751  {
752  v_Assemble(loc,global);
753  }
754 
756  const NekVector<NekDouble>& loc,
757  NekVector< NekDouble>& global) const
758  {
759  v_Assemble(loc,global);
760  }
761 
763  Array<OneD, NekDouble>& pGlobal) const
764  {
765  v_UniversalAssemble(pGlobal);
766  }
767 
769  NekVector< NekDouble>& pGlobal) const
770  {
771  v_UniversalAssemble(pGlobal);
772  }
773 
775  Array<OneD, NekDouble>& pGlobal,
776  int offset) const
777  {
778  v_UniversalAssemble(pGlobal, offset);
779  }
780 
782  {
783  return v_GetFullSystemBandWidth();
784  }
785 
787  {
788  return v_GetNumNonDirVertexModes();
789  }
790 
792  {
793  return v_GetNumNonDirEdgeModes();
794  }
795 
797  {
798  return v_GetNumNonDirFaceModes();
799  }
800 
802  {
803  return v_GetNumDirEdges();
804  }
805 
807  {
808  return v_GetNumDirFaces();
809  }
810 
812  {
813  return v_GetNumNonDirEdges();
814  }
815 
817  {
818  return v_GetNumNonDirFaces();
819  }
820 
822  {
823  return v_GetExtraDirEdges();
824  }
825 
826  boost::shared_ptr<AssemblyMap> AssemblyMap::LinearSpaceMap(const ExpList &locexp, GlobalSysSolnType solnType)
827  {
828  return v_LinearSpaceMap(locexp, solnType);
829  }
830 
831  int AssemblyMap::GetLocalToGlobalBndMap(const int i) const
832  {
833  return m_localToGlobalBndMap[i];
834  }
835 
836  const Array<OneD,const int>&
838  {
839  return m_localToGlobalBndMap;
840  }
841 
843  {
844  return m_signChange;
845  }
846 
847 
850  {
851  return m_localToGlobalBndSign;
852  }
853 
855  {
857  }
858 
860  {
862  }
863 
865  {
866  if(m_signChange)
867  {
868  return m_localToGlobalBndSign[i];
869  }
870  else
871  {
872  return 1.0;
873  }
874  }
875 
876 
878  const int i)
879  {
881  }
882 
883 
885  const int i)
886  {
887  ASSERTL1(i < m_bndCondTraceToGlobalTraceMap.num_elements(),
888  "Index out of range.");
890  }
891 
894  {
895  return m_bndCondTraceToGlobalTraceMap;
896  }
897 
899  {
900  if(m_signChange)
901  {
903  }
904  else
905  {
906  return 1.0;
907  }
908  }
909 
910  const Array<OneD,const int>&
912  {
914  }
915 
916 
918  {
920  }
921 
922 
924  {
925  return m_numLocalDirBndCoeffs;
926  }
927 
929  {
930  return m_numLocalBndCoeffs;
931  }
932 
934  {
935  return m_numGlobalBndCoeffs;
936  }
937 
939  {
940  return m_numLocalCoeffs;
941  }
942 
944  {
945  return m_numGlobalCoeffs;
946  }
947 
949  {
950  return m_systemSingular;
951  }
952 
954  const NekVector<NekDouble>& global,
956  int offset) const
957  {
958  GlobalToLocalBnd(global.GetPtr(), loc.GetPtr(), offset);
959  }
960 
961 
963  const NekVector<NekDouble>& global,
964  NekVector<NekDouble>& loc) const
965  {
966  GlobalToLocalBnd(global.GetPtr(), loc.GetPtr());
967  }
968 
969 
971  const Array<OneD, const NekDouble>& global,
972  Array<OneD,NekDouble>& loc, int offset) const
973  {
974  ASSERTL1(loc.num_elements() >= m_numLocalBndCoeffs,"Local vector is not of correct dimension");
975  ASSERTL1(global.num_elements() >= m_numGlobalBndCoeffs-offset,"Global vector is not of correct dimension");
976 
977  // offset input data by length "offset" for Dirichlet boundary conditions.
979  Vmath::Vcopy(m_numGlobalBndCoeffs-offset, global.get(), 1, tmp.get() + offset, 1);
980 
981  if(m_signChange)
982  {
984  }
985  else
986  {
987  Vmath::Gathr(m_numLocalBndCoeffs, tmp.get(), m_localToGlobalBndMap.get(), loc.get());
988  }
989  }
990 
991 
993  const Array<OneD, const NekDouble>& global,
994  Array<OneD,NekDouble>& loc) const
995  {
996  ASSERTL1(loc.num_elements() >= m_numLocalBndCoeffs,"Local vector is not of correct dimension");
997  ASSERTL1(global.num_elements() >= m_numGlobalBndCoeffs,"Global vector is not of correct dimension");
998 
999  if(m_signChange)
1000  {
1001  Vmath::Gathr(m_numLocalBndCoeffs, m_localToGlobalBndSign.get(), global.get(), m_localToGlobalBndMap.get(), loc.get());
1002  }
1003  else
1004  {
1005  Vmath::Gathr(m_numLocalBndCoeffs, global.get(), m_localToGlobalBndMap.get(), loc.get());
1006  }
1007  }
1008 
1010  const NekVector<NekDouble>& loc,
1011  NekVector<NekDouble>& global,
1012  int offset) const
1013  {
1014  LocalBndToGlobal(loc.GetPtr(), global.GetPtr(), offset);
1015  }
1016 
1017 
1019  const Array<OneD, const NekDouble>& loc,
1020  Array<OneD,NekDouble>& global,
1021  int offset) const
1022  {
1023  ASSERTL1(loc.num_elements() >= m_numLocalBndCoeffs,"Local vector is not of correct dimension");
1024  ASSERTL1(global.num_elements() >= m_numGlobalBndCoeffs-offset,"Global vector is not of correct dimension");
1025 
1026  // offset input data by length "offset" for Dirichlet boundary conditions.
1028 
1029  if(m_signChange)
1030  {
1032  }
1033  else
1034  {
1035  Vmath::Scatr(m_numLocalBndCoeffs, loc.get(), m_localToGlobalBndMap.get(), tmp.get());
1036  }
1037 
1038  UniversalAssembleBnd(tmp);
1039  Vmath::Vcopy(m_numGlobalBndCoeffs-offset, tmp.get()+offset, 1, global.get(), 1);
1040  }
1041 
1043  const NekVector<NekDouble>& loc,
1044  NekVector<NekDouble>& global) const
1045  {
1046  LocalBndToGlobal(loc.GetPtr(), global.GetPtr());
1047  }
1048 
1049 
1051  const Array<OneD, const NekDouble>& loc,
1052  Array<OneD,NekDouble>& global) const
1053  {
1054  ASSERTL1(loc.num_elements() >= m_numLocalBndCoeffs,"Local vector is not of correct dimension");
1055  ASSERTL1(global.num_elements() >= m_numGlobalBndCoeffs,"Global vector is not of correct dimension");
1056 
1057  if(m_signChange)
1058  {
1059  Vmath::Scatr(m_numLocalBndCoeffs, m_localToGlobalBndSign.get(), loc.get(), m_localToGlobalBndMap.get(), global.get());
1060  }
1061  else
1062  {
1063  Vmath::Scatr(m_numLocalBndCoeffs, loc.get(), m_localToGlobalBndMap.get(), global.get());
1064  }
1065  }
1066 
1067 
1069  const NekVector<NekDouble>& loc,
1070  NekVector<NekDouble>& global, int offset) const
1071  {
1072  AssembleBnd(loc.GetPtr(), global.GetPtr(), offset);
1073  }
1074 
1075 
1077  const NekVector<NekDouble>& loc,
1078  NekVector<NekDouble>& global) const
1079  {
1080  AssembleBnd(loc.GetPtr(), global.GetPtr());
1081  }
1082 
1083 
1085  const Array<OneD,const NekDouble>& loc,
1086  Array<OneD, NekDouble>& global, int offset) const
1087  {
1088  ASSERTL1(loc.num_elements() >= m_numLocalBndCoeffs,"Local array is not of correct dimension");
1089  ASSERTL1(global.num_elements() >= m_numGlobalBndCoeffs-offset,"Global array is not of correct dimension");
1091 
1092  if(m_signChange)
1093  {
1095  }
1096  else
1097  {
1098  Vmath::Assmb(m_numLocalBndCoeffs,loc.get(), m_localToGlobalBndMap.get(), tmp.get());
1099  }
1100  UniversalAssembleBnd(tmp);
1101  Vmath::Vcopy(m_numGlobalBndCoeffs-offset, tmp.get() + offset, 1, global.get(), 1);
1102  }
1103 
1104 
1106  const Array<OneD, const NekDouble>& loc,
1107  Array<OneD, NekDouble>& global) const
1108  {
1109  ASSERTL1(loc.num_elements() >= m_numLocalBndCoeffs,"Local vector is not of correct dimension");
1110  ASSERTL1(global.num_elements() >= m_numGlobalBndCoeffs,"Global vector is not of correct dimension");
1111 
1112  Vmath::Zero(m_numGlobalBndCoeffs, global.get(), 1);
1113 
1114  if(m_signChange)
1115  {
1117  loc.get(), m_localToGlobalBndMap.get(), global.get());
1118  }
1119  else
1120  {
1121  Vmath::Assmb(m_numLocalBndCoeffs,loc.get(), m_localToGlobalBndMap.get(), global.get());
1122  }
1123  UniversalAssembleBnd(global);
1124  }
1125 
1127  Array<OneD, NekDouble>& pGlobal) const
1128  {
1129  ASSERTL1(pGlobal.num_elements() == m_numGlobalBndCoeffs,
1130  "Wrong size.");
1131  Gs::Gather(pGlobal, Gs::gs_add, m_bndGsh);
1132  }
1133 
1135  NekVector< NekDouble>& pGlobal) const
1136  {
1137  UniversalAssembleBnd(pGlobal.GetPtr());
1138  }
1139 
1141  Array<OneD, NekDouble>& pGlobal,
1142  int offset) const
1143  {
1144  Array<OneD, NekDouble> tmp(offset);
1145  if (offset > 0) Vmath::Vcopy(offset, pGlobal, 1, tmp, 1);
1146  UniversalAssembleBnd(pGlobal);
1147  if (offset > 0) Vmath::Vcopy(offset, tmp, 1, pGlobal, 1);
1148  }
1149 
1151  {
1152  return m_bndSystemBandWidth;
1153  }
1154 
1156  {
1157  return m_staticCondLevel;
1158  }
1159 
1161  {
1162  return m_numPatches;
1163  }
1164 
1167  {
1169  }
1170 
1171 
1174  {
1176  }
1177 
1178  const AssemblyMapSharedPtr
1180  {
1182  }
1183 
1184  const PatchMapSharedPtr&
1186  const
1187  {
1188  return m_patchMapFromPrevLevel;
1189  }
1190 
1192  {
1193  return !( m_nextLevelLocalToGlobalMap.get() );
1194  }
1195 
1196 
1198  {
1199  return m_solnType;
1200  }
1201 
1203  {
1204  return m_preconType;
1205  }
1206 
1208  {
1209  return m_iterativeTolerance;
1210  }
1211 
1213  {
1214  return m_maxIterations;
1215  }
1216 
1218  {
1219  return m_successiveRHS;
1220  }
1221 
1223  const Array<OneD, const NekDouble>& global,
1224  Array<OneD,NekDouble>& loc)
1225  {
1226  ASSERTL1(loc.num_elements() >= m_numLocalBndCoeffs,"Local vector is not of correct dimension");
1227  ASSERTL1(global.num_elements() >= m_numGlobalBndCoeffs,"Global vector is not of correct dimension");
1228 
1229  Vmath::Gathr(m_numLocalBndCoeffs, global.get(), m_localToGlobalBndMap.get(), loc.get());
1230  }
1231 
1233  std::ostream &out, std::string variable) const
1234  {
1236  = m_session->GetComm()->GetRowComm();
1237  bool isRoot = vRowComm->GetRank() == 0;
1238  int n = vRowComm->GetSize();
1239  int i;
1240 
1241  // Determine number of global degrees of freedom.
1242  int globBndCnt = 0, globDirCnt = 0;
1243 
1244  for (i = 0; i < m_numGlobalBndCoeffs; ++i)
1245  {
1247  {
1248  globBndCnt++;
1249 
1250  if (i < m_numGlobalDirBndCoeffs)
1251  {
1252  globDirCnt++;
1253  }
1254  }
1255  }
1256 
1257  int globCnt = m_numGlobalCoeffs - m_numGlobalBndCoeffs + globBndCnt;
1258 
1259  // Calculate maximum valency
1261  Array<OneD, NekDouble> tmpGlob(m_numGlobalBndCoeffs, 0.0);
1262 
1263  Vmath::Assmb(m_numLocalBndCoeffs, tmpLoc.get(), m_localToGlobalBndMap.get(), tmpGlob.get());
1264  UniversalAssembleBnd(tmpGlob);
1265 
1266  int totGlobDof = globCnt;
1267  int totGlobBndDof = globBndCnt;
1268  int totGlobDirDof = globDirCnt;
1269  int totLocalDof = m_numLocalCoeffs;
1270  int totLocalBndDof = m_numLocalBndCoeffs;
1271  int totLocalDirDof = m_numLocalDirBndCoeffs;
1272 
1273  int meanValence = 0;
1274  int maxValence = 0;
1275  int minValence = 10000000;
1276  for (int i = 0; i < m_numGlobalBndCoeffs; ++i)
1277  {
1279  {
1280  continue;
1281  }
1282 
1283  if (tmpGlob[i] > maxValence)
1284  {
1285  maxValence = tmpGlob[i];
1286  }
1287  if (tmpGlob[i] < minValence)
1288  {
1289  minValence = tmpGlob[i];
1290  }
1291  meanValence += tmpGlob[i];
1292  }
1293 
1294  vRowComm->AllReduce(maxValence, LibUtilities::ReduceMax);
1295  vRowComm->AllReduce(minValence, LibUtilities::ReduceMin);
1296  vRowComm->AllReduce(meanValence, LibUtilities::ReduceSum);
1297  vRowComm->AllReduce(totGlobDof, LibUtilities::ReduceSum);
1298  vRowComm->AllReduce(totGlobBndDof, LibUtilities::ReduceSum);
1299  vRowComm->AllReduce(totGlobDirDof, LibUtilities::ReduceSum);
1300  vRowComm->AllReduce(totLocalDof, LibUtilities::ReduceSum);
1301  vRowComm->AllReduce(totLocalBndDof, LibUtilities::ReduceSum);
1302  vRowComm->AllReduce(totLocalDirDof, LibUtilities::ReduceSum);
1303 
1304  meanValence /= totGlobBndDof;
1305 
1306  if (isRoot)
1307  {
1308  out << "Assembly map statistics for field " << variable << ":"
1309  << endl;
1310  out << " - Number of local/global dof : "
1311  << totLocalDof << " " << totGlobDof << endl;
1312  out << " - Number of local/global boundary dof : "
1313  << totLocalBndDof << " " << totGlobBndDof << endl;
1314  out << " - Number of local/global Dirichlet dof : "
1315  << totLocalDirDof << " " << totGlobDirDof << endl;
1316  out << " - dof valency (min/max/mean) : "
1317  << minValence << " " << maxValence << " " << meanValence
1318  << endl;
1319 
1320  if (n > 1)
1321  {
1322  NekDouble mean = m_numLocalCoeffs, mean2 = mean * mean;
1323  NekDouble minval = mean, maxval = mean;
1324  Array<OneD, NekDouble> tmp(1);
1325 
1326  for (i = 1; i < n; ++i)
1327  {
1328  vRowComm->Recv(i, tmp);
1329  mean += tmp[0];
1330  mean2 += tmp[0]*tmp[0];
1331 
1332  if (tmp[0] > maxval)
1333  {
1334  maxval = tmp[0];
1335  }
1336  if (tmp[0] < minval)
1337  {
1338  minval = tmp[0];
1339  }
1340  }
1341 
1342  out << " - Local dof dist. (min/max/mean/dev) : "
1343  << minval << " " << maxval << " " << (mean / n) << " "
1344  << sqrt(mean2/n - mean*mean/n/n) << endl;
1345 
1346  vRowComm->Block();
1347 
1348  mean = minval = maxval = m_numLocalBndCoeffs;
1349  mean2 = mean * mean;
1350 
1351  for (i = 1; i < n; ++i)
1352  {
1353  vRowComm->Recv(i, tmp);
1354  mean += tmp[0];
1355  mean2 += tmp[0]*tmp[0];
1356 
1357  if (tmp[0] > maxval)
1358  {
1359  maxval = tmp[0];
1360  }
1361  if (tmp[0] < minval)
1362  {
1363  minval = tmp[0];
1364  }
1365  }
1366 
1367  out << " - Local bnd dof dist. (min/max/mean/dev) : "
1368  << minval << " " << maxval << " " << (mean / n) << " "
1369  << sqrt(mean2/n - mean*mean/n/n) << endl;
1370  }
1371  }
1372  else
1373  {
1374  Array<OneD, NekDouble> tmp(1);
1375  tmp[0] = m_numLocalCoeffs;
1376  vRowComm->Send(0, tmp);
1377  vRowComm->Block();
1378  tmp[0] = m_numLocalBndCoeffs;
1379  vRowComm->Send(0, tmp);
1380  }
1381  }
1382  } // namespace
1383 } // namespace
const Array< OneD, const int > & GetBndCondTraceToGlobalTraceMap()
PreconditionerType GetPreconType() const
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:161
bool m_systemSingular
Flag indicating if the system is singular or not.
Definition: AssemblyMap.h:320
const Array< OneD, const int > & GetGlobalToUniversalMap()
bool m_signChange
Flag indicating if modes require sign reversal.
Definition: AssemblyMap.h:345
void PrintStats(std::ostream &out, std::string variable) const
int GetLocalToGlobalBndMap(const int i) const
Retrieve the global index of a given local boundary mode.
virtual int v_GetNumNonDirFaceModes() const
const Array< OneD, NekDouble > & GetLocalToGlobalSign() const
PreconditionerType m_preconType
Type type of preconditioner to use in iterative solver.
Definition: AssemblyMap.h:368
int m_numGlobalBndCoeffs
Total number of global boundary coefficients.
Definition: AssemblyMap.h:314
LibUtilities::CommSharedPtr GetComm()
Retrieves the communicator.
LibUtilities::CommSharedPtr m_comm
Communicator.
Definition: AssemblyMap.h:306
virtual ~AssemblyMap()
Destructor.
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:223
void Gathr(int n, const T *x, const int *y, T *z)
Gather vector z[i] = x[y[i]].
Definition: Vmath.cpp:630
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
#define sign(a, b)
return the sign(b)*a
Definition: Polylib.cpp:22
boost::shared_ptr< AssemblyMap > AssemblyMapSharedPtr
Definition: AssemblyMap.h:53
int GetNumLocalCoeffs() const
Returns the total number of local coefficients.
virtual int v_GetNumNonDirVertexModes() const
static const NekDouble kNekIterativeTol
Array< OneD, int > m_bndCondTraceToGlobalTraceMap
Integer map of bnd cond trace number to global trace number.
Definition: AssemblyMap.h:356
int GetBndSystemBandWidth() const
Returns the bandwidth of the boundary system.
virtual int v_GetNumNonDirFaces() const
size_t GetHash() const
Retrieves the hash of this map.
boost::shared_ptr< BottomUpSubStructuredGraph > BottomUpSubStructuredGraphSharedPtr
bool AtLastLevel() const
Returns true if this is the last level in the multi-level static condensation.
int GetNumPatches() const
Returns the number of patches in this static condensation level.
Array< OneD, const NekDouble > GetLocalToGlobalBndSign() const
Retrieve the sign change for all local boundary modes.
NekDouble GetIterativeTolerance() const
int m_numLocalCoeffs
Total number of local coefficients.
Definition: AssemblyMap.h:331
const Array< OneD, const int > & GetExtraDirEdges()
boost::shared_ptr< SessionReader > SessionReaderSharedPtr
Definition: MeshPartition.h:51
PatchMapSharedPtr m_patchMapFromPrevLevel
Mapping information for previous level in MultiLevel Solver.
Definition: AssemblyMap.h:408
virtual void v_GlobalToLocal(const Array< OneD, const NekDouble > &global, Array< OneD, NekDouble > &loc) const
boost::shared_ptr< PatchMap > PatchMapSharedPtr
const Array< OneD, const int > & GetGlobalToUniversalBndMapUnique()
virtual void v_UniversalAssemble(Array< OneD, NekDouble > &pGlobal) const
const Array< OneD, const int > & GetLocalToGlobalBndMap()
Retrieve the global indices of the local boundary modes.
AssemblyMapSharedPtr m_nextLevelLocalToGlobalMap
Map from the patches of the previous level to the patches of the current level.
Definition: AssemblyMap.h:395
Base class for constructing local to global mapping of degrees of freedom.
Definition: AssemblyMap.h:59
int m_successiveRHS
sucessive RHS for iterative solver
Definition: AssemblyMap.h:377
size_t m_hash
Hash for map.
Definition: AssemblyMap.h:309
void UniversalAssemble(Array< OneD, NekDouble > &pGlobal) const
Base class for all multi-elemental spectral/hp expansions.
Definition: ExpList.h:101
boost::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
Definition: Comm.h:53
int GetNumGlobalDirBndCoeffs() const
Returns the number of global Dirichlet boundary coefficients.
virtual boost::shared_ptr< AssemblyMap > v_LinearSpaceMap(const ExpList &locexp, GlobalSysSolnType solnType)
Generate a linear space mapping from existing mapping.
GlobalSysSolnType GetGlobalSysSolnType() const
Returns the method of solving global systems.
int m_bndSystemBandWidth
The bandwith of the global bnd system.
Definition: AssemblyMap.h:365
NekDouble m_iterativeTolerance
Tolerance for iterative solver.
Definition: AssemblyMap.h:374
Array< OneD, unsigned int > m_numLocalBndCoeffsPerPatch
The number of bnd dofs per patch.
Definition: AssemblyMap.h:388
boost::shared_ptr< AssemblyMap > LinearSpaceMap(const ExpList &locexp, GlobalSysSolnType solnType)
GlobalSysSolnType m_solnType
The solution type of the global system.
Definition: AssemblyMap.h:363
Array< OneD, NekDouble > m_bndCondCoeffsToGlobalCoeffsSign
Integer map of bnd cond coeffs to global coefficients.
Definition: AssemblyMap.h:354
int m_numGlobalDirBndCoeffs
Number of Global Dirichlet Boundary Coefficients.
Definition: AssemblyMap.h:318
NekDouble GetBndCondCoeffsToGlobalCoeffsSign(const int i)
Returns the modal sign associated with a given boundary expansion mode.
int GetStaticCondLevel() const
Returns the level of static condensation for this map.
void GlobalToLocal(const Array< OneD, const NekDouble > &global, Array< OneD, NekDouble > &loc) const
virtual int v_GetNumDirFaces() const
virtual int v_GetFullSystemBandWidth() const
void Scatr(int n, const T *x, const int *y, T *z)
Scatter vector z[y[i]] = x[i].
Definition: Vmath.cpp:659
const PatchMapSharedPtr & GetPatchMapFromPrevLevel(void) const
Returns the patch map from the previous level of the multi-level static condensation.
double NekDouble
void Assmb(int n, const T *x, const int *y, T *z)
Assemble z[y[i]] += x[i]; z should be zero'd first.
Definition: Vmath.cpp:695
void LocalToGlobal(const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global) const
virtual void v_LocalToGlobal(const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global) const
Array< OneD, unsigned int > m_numLocalIntCoeffsPerPatch
The number of int dofs per patch.
Definition: AssemblyMap.h:390
void CalculateBndSystemBandWidth()
Calculates the bandwidth of the boundary system.
Array< OneD, int > m_localToGlobalBndMap
Integer map of local boundary coeffs to global space.
Definition: AssemblyMap.h:348
const Array< OneD, const int > & GetBndCondCoeffsToGlobalCoeffsMap()
Retrieves the global indices corresponding to the boundary expansion modes.
int m_numLocalDirBndCoeffs
Number of Local Dirichlet Boundary Coefficients.
Definition: AssemblyMap.h:316
bool GetSignChange()
Returns true if using a modal expansion requiring a change of sign of some modes. ...
const Array< OneD, const int > & GetLocalToGlobalMap()
virtual void v_Assemble(const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global) const
const Array< OneD, const int > & GetGlobalToUniversalBndMap()
virtual int v_GetNumNonDirEdgeModes() const
Array< OneD, int > m_bndCondCoeffsToGlobalCoeffsMap
Integer map of bnd cond coeffs to global coefficients.
Definition: AssemblyMap.h:352
int m_numLocalBndCoeffs
Number of local boundary coefficients.
Definition: AssemblyMap.h:312
int m_staticCondLevel
The level of recursion in the case of multi-level static condensation.
Definition: AssemblyMap.h:384
Array< OneD, NekDouble > m_localToGlobalBndSign
Integer sign of local boundary coeffs to global space.
Definition: AssemblyMap.h:350
int GetNumGlobalBndCoeffs() const
Returns the total number of global boundary coefficients.
AssemblyMap()
Default constructor.
Definition: AssemblyMap.cpp:77
int m_maxIterations
Maximum iterations for iterative solver.
Definition: AssemblyMap.h:371
const Array< OneD, const unsigned int > & GetNumLocalBndCoeffsPerPatch()
Returns the number of local boundary coefficients in each patch.
void GlobalToLocalBndWithoutSign(const Array< OneD, const NekDouble > &global, Array< OneD, NekDouble > &loc)
int RoundNekDoubleToInt(NekDouble x)
Rounds a double precision number to an integer.
Definition: AssemblyMap.cpp:55
const Array< OneD, const int > & GetGlobalToUniversalMapUnique()
NekDouble GetLocalToGlobalBndSign(const int i) const
Retrieve the sign change of a given local boundary mode.
int GetNumLocalDirBndCoeffs() const
Returns the number of local Dirichlet boundary coefficients.
LibUtilities::SessionReaderSharedPtr m_session
Session object.
Definition: AssemblyMap.h:303
void LocalBndToGlobal(const NekVector< NekDouble > &loc, NekVector< NekDouble > &global, int offset) const
void AssembleBnd(const NekVector< NekDouble > &loc, NekVector< NekDouble > &global, int offset) const
virtual const Array< OneD, NekDouble > & v_GetLocalToGlobalSign() const
virtual const Array< OneD, const int > & v_GetExtraDirEdges()
int GetNumGlobalCoeffs() const
Returns the total number of global coefficients.
int GetNumLocalBndCoeffs() const
Returns the total number of local boundary coefficients.
Array< OneD, int > m_globalToUniversalBndMap
Integer map of process coeffs to universal space.
Definition: AssemblyMap.h:358
Array< OneD, int > m_globalToUniversalBndMapUnique
Integer map of unique process coeffs to universal space (signed)
Definition: AssemblyMap.h:360
virtual const Array< OneD, const int > & v_GetGlobalToUniversalMapUnique()
No Solution type specified.
void UniversalAssembleBnd(Array< OneD, NekDouble > &pGlobal) const
int m_numGlobalCoeffs
Total number of global coefficients.
Definition: AssemblyMap.h:342
void GlobalToLocalBnd(const NekVector< NekDouble > &global, NekVector< NekDouble > &loc, int offset) const
const Array< OneD, const unsigned int > & GetNumLocalIntCoeffsPerPatch()
Returns the number of local interior coefficients in each patch.
virtual int v_GetNumNonDirEdges() const
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.cpp:359
virtual const Array< OneD, const int > & v_GetGlobalToUniversalMap()
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:191
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1047
const AssemblyMapSharedPtr GetNextLevelLocalToGlobalMap() const
Returns the local to global mapping for the next level in the multi-level static condensation.
void Assemble(const Array< OneD, const NekDouble > &loc, Array< OneD, NekDouble > &global) const
Array< OneD, DataType > & GetPtr()
Definition: NekVector.cpp:230
virtual const Array< OneD, const int > & v_GetLocalToGlobalMap()
virtual int v_GetNumDirEdges() const
int m_numPatches
The number of patches (~elements) in the current level.
Definition: AssemblyMap.h:386
bool GetSingularSystem() const
Retrieves if the system is singular (true) or not (false)