escript  Revision_
finley/src/NodeFile.h
Go to the documentation of this file.
1 
2 /*****************************************************************************
3 *
4 * Copyright (c) 2003-2020 by The University of Queensland
5 * http://www.uq.edu.au
6 *
7 * Primary Business: Queensland, Australia
8 * Licensed under the Apache License, version 2.0
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Development until 2012 by Earth Systems Science Computational Center (ESSCC)
12 * Development 2012-2013 by School of Earth Sciences
13 * Development from 2014-2017 by Centre for Geoscience Computing (GeoComp)
14 * Development from 2019 by School of Earth and Environmental Sciences
15 **
16 *****************************************************************************/
17 
18 #ifndef __FINLEY_NODEFILE_H__
19 #define __FINLEY_NODEFILE_H__
20 
21 #define MAX_numDim 3
22 
23 #include "Finley.h"
24 #include "NodeMapping.h"
25 
26 #include <escript/Distribution.h>
27 
28 #ifdef ESYS_HAVE_PASO
29 #include <paso/Coupler.h>
30 #endif
31 #ifdef ESYS_HAVE_TRILINOS
32 #include <trilinoswrap/types.h>
33 #endif
34 
35 namespace escript {
36  struct IndexList;
37 }
38 
39 namespace finley {
40 
41 class NodeFile
42 {
43 public:
44 
47  NodeFile(int nDim, escript::JMPI MPIInfo);
48 
50  ~NodeFile();
51 
54 
56  void freeTable();
57 
58  void print() const;
59 
60  inline index_t getFirstNode() const;
61  inline index_t getLastNode() const;
62  inline dim_t getGlobalNumNodes() const;
63  inline const index_t* borrowGlobalNodesIndex() const;
64 
65  inline index_t getFirstReducedNode() const;
66  inline index_t getLastReducedNode() const;
67  inline index_t getGlobalNumReducedNodes() const;
68  inline const index_t* borrowGlobalReducedNodesIndex() const;
69 
71  inline dim_t getNumNodes() const;
72 
74  inline dim_t getNumReducedNodes() const;
75 
77  inline dim_t getNumDegreesOfFreedom() const;
78 
80  inline dim_t getNumReducedDegreesOfFreedom() const;
81 
83  inline dim_t getNumDegreesOfFreedomTargets() const;
84 
87 
88  inline const IndexVector& borrowReducedNodesTarget() const;
89  inline const IndexVector& borrowDegreesOfFreedomTarget() const;
90  inline const IndexVector& borrowNodesTarget() const;
92 
93  inline const index_t* borrowTargetReducedNodes() const;
94  inline const index_t* borrowTargetDegreesOfFreedom() const;
95 
97  inline const index_t* borrowTargetNodes() const;
98  inline const index_t* borrowTargetReducedDegreesOfFreedom() const;
99 
100  inline void updateTagList();
101 
105 
106  dim_t createDenseNodeLabeling(IndexVector& nodeDistribution,
107  const IndexVector& dofDistribution);
108 
109  dim_t createDenseReducedLabeling(const std::vector<short>& reducedMask,
110  bool useNodes);
111 
112  void createNodeMappings(const IndexVector& indexReducedNodes,
113  const IndexVector& dofDistribution,
114  const IndexVector& nodeDistribution);
115 
116 
117  void assignMPIRankToDOFs(std::vector<int>& mpiRankOfDOF,
118  const IndexVector& distribution);
119 
120  void copyTable(index_t offset, index_t idOffset, index_t dofOffset,
121  const NodeFile* in);
122 
126  void gather(const index_t* index, const NodeFile* in);
127 
128  void gather_global(const index_t* index, const NodeFile* in);
129  void scatter(const index_t* index, const NodeFile* in);
130 
131  void setCoordinates(const escript::Data& newX);
132 
134  void setTags(int newTag, const escript::Data& mask);
135 
136  std::pair<index_t,index_t> getDOFRange() const;
137 
138 private:
139  std::pair<index_t,index_t> getGlobalIdRange() const;
140  std::pair<index_t,index_t> getGlobalDOFRange() const;
141  std::pair<index_t,index_t> getGlobalNodeIDIndexRange() const;
142  dim_t prepareLabeling(const std::vector<short>& mask, IndexVector& buffer,
143  IndexVector& distribution, bool useNodes);
144  void createDOFMappingAndCoupling(bool reduced);
145 
149 
152 
153 public:
155  // these should be private as well.
156 
158 
162  int numDim;
166  int* Tag;
168  std::vector<int> tagsInUse;
169 
175  double* Coordinates;
184 
190 
191 #ifdef ESYS_HAVE_PASO
192  paso::Connector_ptr degreesOfFreedomConnector;
193  paso::Connector_ptr reducedDegreesOfFreedomConnector;
194 #endif
195 #ifdef ESYS_HAVE_TRILINOS
196  esys_trilinos::const_TrilinosMap_ptr trilinosRowMap;
197  esys_trilinos::const_TrilinosMap_ptr trilinosReducedRowMap;
198  esys_trilinos::const_TrilinosMap_ptr trilinosColMap;
199  esys_trilinos::const_TrilinosMap_ptr trilinosReducedColMap;
200 #endif
201 
202  // these are the packed versions of Id
206 
209  int status;
210 };
211 
212 //
213 // implementation of inline methods
214 //
215 
217 {
218  return nodesDistribution->getFirstComponent();
219 }
220 
222 {
223  return nodesDistribution->getLastComponent();
224 }
225 
227 {
228  return nodesDistribution->getGlobalNumComponents();
229 }
230 
232 {
233  return globalNodesIndex;
234 }
235 
237 {
238  return reducedNodesDistribution->getFirstComponent();
239 }
240 
242 {
243  return reducedNodesDistribution->getLastComponent();
244 }
245 
247 {
248  return reducedNodesDistribution->getGlobalNumComponents();
249 }
250 
252 {
254 }
255 
257 {
258  return numNodes;
259 }
260 
262 {
264 }
265 
267 {
268  return degreesOfFreedomDistribution->getMyNumComponents();
269 }
270 
272 {
273  return reducedDegreesOfFreedomDistribution->getMyNumComponents();
274 }
275 
277 {
279 }
280 
282 {
284 }
285 
287 {
288  return nodesMapping.map;
289 }
290 
292 {
293  return reducedNodesMapping.map;
294 }
295 
297 {
299 }
300 
302 {
304 }
305 
307 {
308  return &nodesMapping.target[0];
309 }
310 
312 {
313  return &reducedNodesMapping.target[0];
314 }
315 
317 {
318  return &degreesOfFreedomMapping.target[0];
319 }
320 
322 {
324 }
325 
327 {
329 }
330 
331 
332 } // namespace finley
333 
334 #endif // __FINLEY_NODEFILE_H__
335 
finley::NodeFile::updateTagList
void updateTagList()
Definition: finley/src/NodeFile.h:326
finley::NodeFile::NodeFile
NodeFile(int nDim, escript::JMPI MPIInfo)
Definition: finley/src/NodeFile.cpp:104
finley::NodeFile::globalReducedNodesIndex
index_t * globalReducedNodesIndex
Definition: finley/src/NodeFile.h:181
finley::NodeMapping
Definition: finley/src/NodeMapping.h:30
finley::NodeFile::createDenseDOFLabeling
dim_t createDenseDOFLabeling()
Definition: finley/src/NodeFile.cpp:525
finley::NodeFile::borrowReducedNodesTarget
const IndexVector & borrowReducedNodesTarget() const
Definition: finley/src/NodeFile.h:291
finley::NodeFile::borrowTargetReducedNodes
const index_t * borrowTargetReducedNodes() const
Definition: finley/src/NodeFile.h:311
finley::NodeFile::getGlobalIdRange
std::pair< index_t, index_t > getGlobalIdRange() const
Definition: finley/src/NodeFile.cpp:226
finley::NodeFile::globalDegreesOfFreedom
index_t * globalDegreesOfFreedom
Definition: finley/src/NodeFile.h:173
escript::Distribution_ptr
boost::shared_ptr< Distribution > Distribution_ptr
Definition: Distribution.h:25
finley::NodeFile::borrowGlobalReducedNodesIndex
const index_t * borrowGlobalReducedNodesIndex() const
Definition: finley/src/NodeFile.h:251
finley::NodeFile::getGlobalDOFRange
std::pair< index_t, index_t > getGlobalDOFRange() const
Definition: finley/src/NodeFile.cpp:231
finley::NodeFile::getNumReducedNodes
dim_t getNumReducedNodes() const
returns the number of reduced order FEM nodes (on this rank)
Definition: finley/src/NodeFile.h:261
finley::NodeFile::assignMPIRankToDOFs
void assignMPIRankToDOFs(std::vector< int > &mpiRankOfDOF, const IndexVector &distribution)
Definition: finley/src/NodeFile.cpp:438
finley::NodeFile::Tag
int * Tag
Tag[i] is the tag of node i.
Definition: finley/src/NodeFile.h:166
finley::NodeFile::getFirstNode
index_t getFirstNode() const
Definition: finley/src/NodeFile.h:216
finley::NodeFile::nodesDistribution
escript::Distribution_ptr nodesDistribution
MPI distribution of nodes.
Definition: finley/src/NodeFile.h:186
finley::NodeFile::reducedNodesId
index_t * reducedNodesId
Definition: finley/src/NodeFile.h:203
finley::NodeFile::globalReducedDOFIndex
index_t * globalReducedDOFIndex
Definition: finley/src/NodeFile.h:178
finley::NodeFile::getNumDegreesOfFreedomTargets
dim_t getNumDegreesOfFreedomTargets() const
returns the number of degrees of freedom targets (own and shared)
Definition: finley/src/NodeFile.h:276
finley::NodeFile::numNodes
dim_t numNodes
number of nodes
Definition: finley/src/NodeFile.h:151
finley::NodeFile::reducedNodesMapping
NodeMapping reducedNodesMapping
Definition: finley/src/NodeFile.h:157
finley::NodeFile::gather
void gather(const index_t *index, const NodeFile *in)
Definition: finley/src/NodeFile.cpp:321
finley::NodeFile::createDOFMappingAndCoupling
void createDOFMappingAndCoupling(bool reduced)
Definition: finley/src/NodeFile.cpp:772
finley::NodeFile::getGlobalNodeIDIndexRange
std::pair< index_t, index_t > getGlobalNodeIDIndexRange() const
Definition: finley/src/NodeFile.cpp:236
finley::NodeFile::borrowReducedDegreesOfFreedomTarget
const IndexVector & borrowReducedDegreesOfFreedomTarget() const
Definition: finley/src/NodeFile.h:301
finley::NodeFile::getNumReducedDegreesOfFreedom
dim_t getNumReducedDegreesOfFreedom() const
returns the number of reduced order degrees of freedom (on this rank)
Definition: finley/src/NodeFile.h:271
finley::NodeMapping::target
std::vector< index_t > target
target[i] defines the target of FEM node i=0,...,numNodes-1
Definition: finley/src/NodeMapping.h:82
finley::NodeFile::reducedDegreesOfFreedomMapping
NodeMapping reducedDegreesOfFreedomMapping
Definition: finley/src/NodeFile.h:148
finley::util::setValuesInUse
void setValuesInUse(const int *values, dim_t numValues, std::vector< int > &valuesInUse, escript::JMPI mpiinfo)
Definition: finley/src/Util.cpp:343
finley::NodeFile::getNumNodes
dim_t getNumNodes() const
returns the number of FEM nodes (on this rank)
Definition: finley/src/NodeFile.h:256
finley::NodeFile::createNodeMappings
void createNodeMappings(const IndexVector &indexReducedNodes, const IndexVector &dofDistribution, const IndexVector &nodeDistribution)
Definition: finley/src/NodeFile.cpp:1004
finley::NodeFile::Coordinates
double * Coordinates
Coordinates[INDEX2(k,i,numDim)] is the k-th coordinate of node i.
Definition: finley/src/NodeFile.h:175
escript::Data
Data represents a collection of datapoints.
Definition: Data.h:64
finley::NodeFile::getLastNode
index_t getLastNode() const
Definition: finley/src/NodeFile.h:221
finley::NodeFile::getGlobalNumReducedNodes
index_t getGlobalNumReducedNodes() const
Definition: finley/src/NodeFile.h:246
escript::DataTypes::dim_t
index_t dim_t
Definition: DataTypes.h:65
escript::JMPI
boost::shared_ptr< JMPI_ > JMPI
Definition: EsysMPI.h:72
NodeMapping.h
finley::NodeFile::borrowGlobalNodesIndex
const index_t * borrowGlobalNodesIndex() const
Definition: finley/src/NodeFile.h:231
finley::NodeFile::createDenseReducedLabeling
dim_t createDenseReducedLabeling(const std::vector< short > &reducedMask, bool useNodes)
Definition: finley/src/NodeFile.cpp:702
finley::NodeFile::~NodeFile
~NodeFile()
destructor
Definition: finley/src/NodeFile.cpp:122
finley::NodeFile::MPIInfo
escript::JMPI MPIInfo
MPI information.
Definition: finley/src/NodeFile.h:160
finley::NodeFile::prepareLabeling
dim_t prepareLabeling(const std::vector< short > &mask, IndexVector &buffer, IndexVector &distribution, bool useNodes)
Definition: finley/src/NodeFile.cpp:464
finley::NodeFile::freeTable
void freeTable()
empties the node table and frees all memory
Definition: finley/src/NodeFile.cpp:162
finley::NodeFile::borrowNodesTarget
const IndexVector & borrowNodesTarget() const
Definition: finley/src/NodeFile.h:286
finley::NodeMapping::map
std::vector< index_t > map
maps the target nodes back to the FEM nodes: target[map[i]]=i
Definition: finley/src/NodeMapping.h:84
finley::NodeFile::getFirstReducedNode
index_t getFirstReducedNode() const
Definition: finley/src/NodeFile.h:236
finley::NodeFile::Id
index_t * Id
Id[i] is the unique ID number of FEM node i.
Definition: finley/src/NodeFile.h:164
finley::NodeFile::createDenseNodeLabeling
dim_t createDenseNodeLabeling(IndexVector &nodeDistribution, const IndexVector &dofDistribution)
Definition: finley/src/NodeFile.cpp:588
finley::NodeFile::nodesMapping
NodeMapping nodesMapping
Definition: finley/src/NodeFile.h:146
finley::NodeFile::status
int status
Definition: finley/src/NodeFile.h:209
finley::NodeFile::setCoordinates
void setCoordinates(const escript::Data &newX)
copies the array newX into this->coordinates
Definition: finley/src/NodeFile.cpp:242
finley::NodeFile::print
void print() const
Definition: finley/src/NodeFile.cpp:196
finley::NodeFile::reducedDegreesOfFreedomDistribution
escript::Distribution_ptr reducedDegreesOfFreedomDistribution
Definition: finley/src/NodeFile.h:189
finley::NodeFile::degreesOfFreedomDistribution
escript::Distribution_ptr degreesOfFreedomDistribution
Definition: finley/src/NodeFile.h:188
finley::NodeFile::getDOFRange
std::pair< index_t, index_t > getDOFRange() const
Definition: finley/src/NodeFile.cpp:215
escript::DataTypes::index_t
int index_t
type for array/matrix indices used both globally and on each rank
Definition: DataTypes.h:60
finley::NodeFile::getGlobalNumNodes
dim_t getGlobalNumNodes() const
Definition: finley/src/NodeFile.h:226
finley::NodeFile
Definition: finley/src/NodeFile.h:42
escript
Definition: AbstractContinuousDomain.cpp:23
finley::NodeFile::reducedDegreesOfFreedomId
index_t * reducedDegreesOfFreedomId
Definition: finley/src/NodeFile.h:205
finley::NodeFile::degreesOfFreedomMapping
NodeMapping degreesOfFreedomMapping
Definition: finley/src/NodeFile.h:147
finley::NodeFile::globalNodesIndex
index_t * globalNodesIndex
assigns each local node a global unique ID in a dense labeling
Definition: finley/src/NodeFile.h:183
finley::NodeFile::borrowTargetNodes
const index_t * borrowTargetNodes() const
returns the mapping from local nodes to a target
Definition: finley/src/NodeFile.h:306
Finley.h
finley::NodeFile::reducedNodesDistribution
escript::Distribution_ptr reducedNodesDistribution
Definition: finley/src/NodeFile.h:187
paso::Connector_ptr
boost::shared_ptr< Connector > Connector_ptr
Definition: Coupler.h:38
finley::NodeFile::borrowTargetDegreesOfFreedom
const index_t * borrowTargetDegreesOfFreedom() const
Definition: finley/src/NodeFile.h:316
finley::NodeFile::getNumDegreesOfFreedom
dim_t getNumDegreesOfFreedom() const
returns the number of degrees of freedom (on this rank)
Definition: finley/src/NodeFile.h:266
finley::NodeFile::getLastReducedNode
index_t getLastReducedNode() const
Definition: finley/src/NodeFile.h:241
finley::NodeFile::getNumReducedDegreesOfFreedomTargets
dim_t getNumReducedDegreesOfFreedomTargets() const
returns the number of reduced degrees of freedom targets (own and shared)
Definition: finley/src/NodeFile.h:281
finley::NodeFile::borrowTargetReducedDegreesOfFreedom
const index_t * borrowTargetReducedDegreesOfFreedom() const
Definition: finley/src/NodeFile.h:321
finley::NodeFile::degreesOfFreedomId
index_t * degreesOfFreedomId
Definition: finley/src/NodeFile.h:204
finley::NodeFile::scatter
void scatter(const index_t *index, const NodeFile *in)
Definition: finley/src/NodeFile.cpp:310
finley::NodeFile::gather_global
void gather_global(const index_t *index, const NodeFile *in)
Definition: finley/src/NodeFile.cpp:329
finley::NodeFile::tagsInUse
std::vector< int > tagsInUse
vector of tags which are actually used
Definition: finley/src/NodeFile.h:168
finley
A suite of factory methods for creating various finley domains.
Definition: finley/src/Assemble.h:32
finley::NodeFile::setTags
void setTags(int newTag, const escript::Data &mask)
set tags to newTag where mask > 0
Definition: finley/src/NodeFile.cpp:267
finley::NodeFile::numDim
int numDim
number of spatial dimensions
Definition: finley/src/NodeFile.h:162
finley::NodeFile::allocTable
void allocTable(dim_t numNodes)
allocates the node table within this node file to hold numNodes nodes.
Definition: finley/src/NodeFile.cpp:127
finley::NodeFile::borrowDegreesOfFreedomTarget
const IndexVector & borrowDegreesOfFreedomTarget() const
Definition: finley/src/NodeFile.h:296
finley::NodeFile::copyTable
void copyTable(index_t offset, index_t idOffset, index_t dofOffset, const NodeFile *in)
Definition: finley/src/NodeFile.cpp:285
escript::DataTypes::IndexVector
std::vector< index_t > IndexVector
Definition: DataTypes.h:63
finley::NodeMapping::getNumTargets
dim_t getNumTargets() const
returns the number of target nodes (number of items in the map array)
Definition: finley/src/NodeMapping.h:79