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
24class ASMbase;
25class ProcessAdm;
26class SAMpatch;
27class SIMbase;
28
29using IntVec = std::vector<int>;
30using IntMat = std::vector<IntVec>;
31
32
38{
39public:
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
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
210private:
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;
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
std::vector< int > IntVec
Convenience type alias.
Definition DomainDecomposition.h:29
Representation of domain interfaces.
Base class for spline-based finite element (FE) assembly drivers.
Definition ASMbase.h:72
Iterator for matching nodes on edges/faces with a given orientation and index.
Definition DomainDecomposition.h:41
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
const DomainDecomposition & dd
Domain decomposition holding patch owner data.
Definition DomainDecomposition.h:103
SlaveOrder & operator=(const SlaveOrder &)
Hide ill-formed default assignment operator.
Definition DomainDecomposition.h:75
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
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
const SAMpatch * getSAM() const
Returns associated SAM.
Definition DomainDecomposition.h:192
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
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
const std::set< int > & getBlockEqs(size_t idx) const
Obtain local-to-global equation mapping.
Definition DomainDecomposition.h:180
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
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
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
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
IntVec myElms
Elements in partition.
Definition DomainDecomposition.h:301
int minNode
First node we own.
Definition DomainDecomposition.h:304
const IntVec & getMLGEQ(size_t idx=0) const
Obtain local-to-global equation mapping.
Definition DomainDecomposition.h:175
const IntVec & getMLGN() const
Obtain local-to-global node mapping.
Definition DomainDecomposition.h:189
std::string savePart
Non-empty to save partitioning to file.
Definition DomainDecomposition.h:309
int maxDof
Last DOF we own.
Definition DomainDecomposition.h:303
const IntVec & getElms() const
Returns elements in partition.
Definition DomainDecomposition.h:201
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
const std::map< int, int > & getG2LEQ(size_t idx) const
Obtain global-to-local equation mapping.
Definition DomainDecomposition.h:185
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