IFEM  90A354
DomainDecomposition.h
Go to the documentation of this file.
1 // $Id$
2 //==============================================================================
12 //==============================================================================
13 
14 #ifndef _DOMAIN_DECOMPOSITION_H
15 #define _DOMAIN_DECOMPOSITION_H
16 
17 #include "Interface.h"
18 #include <map>
19 #include <set>
20 #include <string>
21 #include <vector>
22 #include <cstddef>
23 
24 class ASMbase;
25 class ProcessAdm;
26 class SAMpatch;
27 class SIMbase;
28 
29 using IntVec = std::vector<int>;
30 using IntMat = std::vector<IntVec>;
31 
32 
38 {
39 public:
42  public:
49  OrientIterator(const ASMbase* pch, int orient, int lIdx, int basis, int dim = 2);
50 
55  OrientIterator(const ASMbase* pch, int orient, int lIdx);
56 
58  IntVec::const_iterator begin() { return nodes.begin(); }
60  IntVec::const_iterator end() { return nodes.end(); }
62  size_t size() const { return nodes.size(); }
63 
64  protected:
67  };
68 
70  class SlaveOrder {
71  public:
73  explicit SlaveOrder(const DomainDecomposition& dd_) : dd(dd_) {}
75  SlaveOrder& operator=(const SlaveOrder&) { return *this; }
77  bool operator()(const ASM::Interface& A, const ASM::Interface& B) const
78  {
79  // order by master owner id first
82 
83  // then by lower slave owner id
85  return dd.getPatchOwner(A.slave) < dd.getPatchOwner(B.slave);
86 
87  // then by slave id
88  if (A.slave != B.slave)
89  return A.slave < B.slave;
90 
91  // then by dim
92  if (A.dim != B.dim)
93  return A.dim < B.dim;
94 
95  // then by basis
96  if (A.basis != B.basis)
97  return A.basis < B.basis;
98 
99  // finally by index on master
100  return A.midx < B.midx;
101  }
102  protected:
104  };
105 
106  std::set<ASM::Interface, SlaveOrder> ghostConnections;
107 
110 
114  bool setup(const ProcessAdm& adm, const SIMbase& sim);
115 
120  bool setup(const ProcessAdm& adm, const IntMat& neighs, const IntMat& meqn);
121 
124  void setup(const int neq);
125 
133  std::vector<std::set<int>>
134  getSubdomains(int nx, int ny, int nz, int overlap, size_t block) const;
135 
145  static IntMat calcSubdomains(size_t nel1, size_t nel2, size_t nel3,
146  size_t g1, size_t g2, size_t g3, size_t overlap);
147 
149  int getMinEq(size_t idx = 0) const { return blocks[idx].minEq; }
151  int getMaxEq(size_t idx = 0) const { return blocks[idx].maxEq; }
153  int getNoGlbEqs(size_t idx = 0) const { return blocks[idx].nGlbEqs; }
155  int getMinNode() const { return minNode; }
157  int getMaxNode() const { return maxNode; }
159  int getMinDOF() const { return minDof; }
161  int getMaxDOF() const { return maxDof; }
162 
164  void setPatchOwner(size_t p, size_t owner) { patchOwner[p] = owner; }
165 
167  int getPatchOwner(size_t p) const;
168 
172  int getGlobalEq(int lEq, size_t idx=0) const;
173 
175  const IntVec& getMLGEQ(size_t idx = 0) const
176  { return blocks[idx].MLGEQ; }
177 
180  const std::set<int>& getBlockEqs(size_t idx) const
181  { return blocks[idx+1].localEqs; }
182 
185  const std::map<int,int>& getG2LEQ(size_t idx) const
186  { return blocks[idx].G2LEQ; }
187 
189  const IntVec& getMLGN() const { return MLGN; }
190 
192  const SAMpatch* getSAM() const { return sam; }
193 
195  size_t getNoBlocks() const { return blocks.size()-1; }
196 
198  bool isPartitioned() const { return !myElms.empty(); }
199 
201  const IntVec& getElms() const { return myElms; }
202 
204  void setElms(const IntVec& elms, const std::string& save)
205  { myElms = elms; savePart = save; }
206 
208  void clear();
209 
210 private:
215  static IntMat calcSubdomains1D(size_t nel1, size_t g1, size_t overlap);
216 
223  static IntMat calcSubdomains2D(size_t nel1, size_t nel2,
224  size_t g1, size_t g2, size_t overlap);
225 
234  static IntMat calcSubdomains3D(size_t nel1, size_t nel2, size_t nel3,
235  size_t g1, size_t g2, size_t g3,
236  size_t overlap);
237 
238 #ifdef HAVE_MPI
247  IntVec setupEquationNumbers(const SIMbase& sim,
248  int pidx, int lidx,
249  const std::set<int>& cbasis,
250  int dim, int thick, int orient = 0);
251 
261  void setupNodeNumbers(int basis, IntVec& lNodes,
262  std::set<int>& cbasis,
263  const ASMbase* pch,
264  int dim, int lidx, int thick, int orient = 0);
265 #endif
266 
268  bool calcGlobalNodeNumbers(const ProcessAdm& adm, const SIMbase& sim);
269 
271  bool calcGlobalEqNumbers(const ProcessAdm& adm, const SIMbase& sim);
272 
274  template<class Callback>
275  bool calcGlobalEqNumbersPart(const ProcessAdm& adm, const Callback& cb);
276 
280  bool sanityCheckCorners(const SIMbase& sim);
281 
283  bool graphPartition(const ProcessAdm& adm, const IntMat& neigh);
284 
285  std::map<int,int> patchOwner;
286 
288  struct BlockInfo {
289  int basis;
292  int minEq;
293  int maxEq;
294  int nGlbEqs;
295  std::set<int> localEqs;
296  std::map<int,int> G2LEQ;
297  };
298 
300  std::vector<BlockInfo> blocks;
302  int minDof = 0;
303  int maxDof = 0;
304  int minNode = 0;
305  int maxNode = 0;
306 
307  const SAMpatch* sam = nullptr;
308 
309  std::string savePart;
310 };
311 
312 #endif
std::vector< int > IntVec
General integer vector.
Definition: ASMbase.h:25
std::vector< IntVec > IntMat
General 2D integer matrix.
Definition: ASMbase.h:26
Representation of domain interfaces.
Base class for spline-based finite element (FE) assembly drivers.
Definition: ASMbase.h:70
Iterator for matching nodes on edges/faces with a given orientation and index.
Definition: DomainDecomposition.h:41
OrientIterator(const ASMbase *pch, int orient, int lIdx, int basis, int dim=2)
Constructor.
Definition: DomainDecomposition.C:40
IntVec nodes
Node number on boundary.
Definition: DomainDecomposition.h:66
size_t size() const
Obtain number of nodes.
Definition: DomainDecomposition.h:62
IntVec::const_iterator begin()
Obtain start of node numbers.
Definition: DomainDecomposition.h:58
IntVec::const_iterator end()
Obtain end of node numbers.
Definition: DomainDecomposition.h:60
Functor to order ghost connections.
Definition: DomainDecomposition.h:70
SlaveOrder(const DomainDecomposition &dd_)
The constructor initializes the DomainDecomposition reference.
Definition: DomainDecomposition.h:73
SlaveOrder & operator=(const SlaveOrder &)
Hide ill-formed default assignment operator.
Definition: DomainDecomposition.h:75
const DomainDecomposition & dd
Domain decomposition holding patch owner data.
Definition: DomainDecomposition.h:103
bool operator()(const ASM::Interface &A, const ASM::Interface &B) const
Compare interfaces.
Definition: DomainDecomposition.h:77
Class containing domain decomposition related partitioning.
Definition: DomainDecomposition.h:38
int getNoGlbEqs(size_t idx=0) const
Get total number of equations in a block.
Definition: DomainDecomposition.h:153
std::vector< std::set< int > > getSubdomains(int nx, int ny, int nz, int overlap, size_t block) const
Obtain local subdomains for an equation block.
Definition: DomainDecomposition.C:272
bool calcGlobalNodeNumbers(const ProcessAdm &adm, const SIMbase &sim)
Calculate the global node numbers for given finite element model.
Definition: DomainDecomposition.C:509
int maxNode
Last node we own.
Definition: DomainDecomposition.h:305
bool calcGlobalEqNumbers(const ProcessAdm &adm, const SIMbase &sim)
Calculate the global equation numbers for an element model.
Definition: DomainDecomposition.C:699
const IntVec & getMLGN() const
Obtain local-to-global node mapping.
Definition: DomainDecomposition.h:189
void setElms(const IntVec &elms, const std::string &save)
Set elements in partition.
Definition: DomainDecomposition.h:204
static IntMat calcSubdomains3D(size_t nel1, size_t nel2, size_t nel3, size_t g1, size_t g2, size_t g3, size_t overlap)
Calculates 3D subdomains with a given overlap.
Definition: DomainDecomposition.C:409
int getMaxNode() const
Get last node owned by this process.
Definition: DomainDecomposition.h:157
std::vector< BlockInfo > blocks
Equation mappings for all matrix blocks.
Definition: DomainDecomposition.h:300
bool calcGlobalEqNumbersPart(const ProcessAdm &adm, const Callback &cb)
Calculate the global equation numbers for a partitioned model.
Definition: DomainDecomposition.C:924
bool sanityCheckCorners(const SIMbase &sim)
Sanity check model.
Definition: DomainDecomposition.C:996
size_t getNoBlocks() const
Returns number of matrix blocks.
Definition: DomainDecomposition.h:195
const IntVec & getElms() const
Returns elements in partition.
Definition: DomainDecomposition.h:201
static IntMat calcSubdomains1D(size_t nel1, size_t g1, size_t overlap)
Calculates a 1D partitioning with a given overlap.
Definition: DomainDecomposition.C:338
static IntMat calcSubdomains(size_t nel1, size_t nel2, size_t nel3, size_t g1, size_t g2, size_t g3, size_t overlap)
Calculates subdomains with a given overlap.
Definition: DomainDecomposition.C:324
int getMinEq(size_t idx=0) const
Get first equation owned by this process.
Definition: DomainDecomposition.h:149
bool graphPartition(const ProcessAdm &adm, const IntMat &neigh)
Setup domain decomposition based on graph partitioning.
Definition: DomainDecomposition.C:1338
int getMinNode() const
Get first node owned by this process.
Definition: DomainDecomposition.h:155
DomainDecomposition()
Default constructor.
Definition: DomainDecomposition.h:109
int getPatchOwner(size_t p) const
Get process owning patch p.
Definition: DomainDecomposition.C:1328
int getMinDOF() const
Get first DOF owned by this process.
Definition: DomainDecomposition.h:159
bool isPartitioned() const
Returns whether a graph based partition is used.
Definition: DomainDecomposition.h:198
const SAMpatch * getSAM() const
Returns associated SAM.
Definition: DomainDecomposition.h:192
void clear()
Clear out partitioning information.
Definition: DomainDecomposition.C:1440
std::map< int, int > patchOwner
Process that owns a particular patch.
Definition: DomainDecomposition.h:285
void setPatchOwner(size_t p, size_t owner)
Set owner for a patch.
Definition: DomainDecomposition.h:164
std::set< ASM::Interface, SlaveOrder > ghostConnections
Connections to other processes.
Definition: DomainDecomposition.h:106
IntVec MLGN
Process-local-to-global node numbers.
Definition: DomainDecomposition.h:299
const IntVec & getMLGEQ(size_t idx=0) const
Obtain local-to-global equation mapping.
Definition: DomainDecomposition.h:175
int getMaxEq(size_t idx=0) const
Get last equation owned by this process.
Definition: DomainDecomposition.h:151
const SAMpatch * sam
The assembly handler the DD is constructed for.
Definition: DomainDecomposition.h:307
const std::set< int > & getBlockEqs(size_t idx) const
Obtain local-to-global equation mapping.
Definition: DomainDecomposition.h:180
static IntMat calcSubdomains2D(size_t nel1, size_t nel2, size_t g1, size_t g2, size_t overlap)
Calculates 2D subdomains with a given overlap.
Definition: DomainDecomposition.C:368
int minDof
First DOF we own.
Definition: DomainDecomposition.h:302
const std::map< int, int > & getG2LEQ(size_t idx) const
Obtain global-to-local equation mapping.
Definition: DomainDecomposition.h:185
IntVec myElms
Elements in partition.
Definition: DomainDecomposition.h:301
int minNode
First node we own.
Definition: DomainDecomposition.h:304
std::string savePart
Non-empty to save partitioning to file.
Definition: DomainDecomposition.h:309
int maxDof
Last DOF we own.
Definition: DomainDecomposition.h:303
int getMaxDOF() const
Get last DOF owned by this process.
Definition: DomainDecomposition.h:161
int getGlobalEq(int lEq, size_t idx=0) const
Get global equation number.
Definition: DomainDecomposition.C:977
bool setup(const ProcessAdm &adm, const SIMbase &sim)
Setup domain decomposition.
Definition: DomainDecomposition.C:1082
Class for administration of MPI processes in IFEM library.
Definition: ProcessAdm.h:33
This is a sub-class of SAM with added functionality for spline models.
Definition: SAMpatch.h:29
Base class for NURBS-based FEM simulators.
Definition: SIMbase.h:72
Struct for representing a domain interface.
Definition: Interface.h:24
int dim
Dimension of boundary.
Definition: Interface.h:30
int basis
Basis of boundary.
Definition: Interface.h:31
int midx
Index of boundary on master.
Definition: Interface.h:27
int master
Master patch (global number)
Definition: Interface.h:25
int slave
Slave patch (global number)
Definition: Interface.h:26
Struct with information per matrix block.
Definition: DomainDecomposition.h:288
IntVec MLGEQ
Process-local-to-global equation numbers for block.
Definition: DomainDecomposition.h:291
std::map< int, int > G2LEQ
Maps from local total matrix index to local block index.
Definition: DomainDecomposition.h:296
int components
Components in block.
Definition: DomainDecomposition.h:290
int nGlbEqs
Total matrix size.
Definition: DomainDecomposition.h:294
int maxEq
Last equation we own in block.
Definition: DomainDecomposition.h:293
int minEq
First equation we own in block.
Definition: DomainDecomposition.h:292
int basis
Bases for block.
Definition: DomainDecomposition.h:289
std::set< int > localEqs
Local equations belonging to the block.
Definition: DomainDecomposition.h:295