escript  Revision_4925
finley/src/NodeFile.h
Go to the documentation of this file.
1 
2 /*****************************************************************************
3 *
4 * Copyright (c) 2003-2014 by University of Queensland
5 * http://www.uq.edu.au
6 *
7 * Primary Business: Queensland, Australia
8 * Licensed under the Open Software License version 3.0
9 * http://www.opensource.org/licenses/osl-3.0.php
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 by Centre for Geoscience Computing (GeoComp)
14 *
15 *****************************************************************************/
16 
17 #ifndef __FINLEY_NODEFILE_H__
18 #define __FINLEY_NODEFILE_H__
19 
20 #define MAX_numDim 3
21 
22 #include "Finley.h"
23 #include "NodeMapping.h"
24 #include <paso/Coupler.h>
25 #include <paso/Distribution.h>
26 
27 struct Esys_MPIInfo;
28 
29 namespace finley {
30 
31 class NodeFile
32 {
33 public:
34  NodeFile(int nDim, Esys_MPIInfo *mpiInfo);
35  ~NodeFile();
36 
37  void allocTable(int numNodes);
38  void freeTable();
39 
40  void print() const;
41  inline int getFirstNode() const;
42  inline int getLastNode() const;
43  inline int getGlobalNumNodes() const;
44  inline int* borrowGlobalNodesIndex() const;
45 
46  inline int getFirstReducedNode() const;
47  inline int getLastReducedNode() const;
48  inline int getGlobalNumReducedNodes() const;
49  inline int* borrowGlobalReducedNodesIndex() const;
50 
52  inline int getNumNodes() const;
53  inline int getNumReducedNodes() const;
54  inline int getNumDegreesOfFreedom() const;
55  inline int getNumReducedDegreesOfFreedom() const;
56 
57  inline const std::vector<int>& borrowReducedNodesTarget() const;
58  inline const std::vector<int>& borrowDegreesOfFreedomTarget() const;
59  inline const std::vector<int>& borrowNodesTarget() const;
60  inline const std::vector<int>& borrowReducedDegreesOfFreedomTarget() const;
61 
62  inline const int* borrowTargetReducedNodes() const;
63  inline const int* borrowTargetDegreesOfFreedom() const;
64  inline const int* borrowTargetNodes() const;
65  inline const int* borrowTargetReducedDegreesOfFreedom() const;
66 
67  void createNodeMappings(const std::vector<int>& indexReducedNodes,
68  const std::vector<int>& dofDistribution,
69  const std::vector<int>& nodeDistribution);
71  int createDenseNodeLabeling(std::vector<int>& nodeDistribution,
72  const std::vector<int>& dofDistribution);
73  int createDenseReducedLabeling(const std::vector<short>& reducedMask,
74  bool useNodes);
75  void assignMPIRankToDOFs(std::vector<int>& mpiRankOfDOF, const std::vector<int>& distribution);
76 
77  void copyTable(int offset, int idOffset, int dofOffset, const NodeFile* in);
78  void gather(int* index, const NodeFile* in);
79  void gather_global(const std::vector<int>& index, const NodeFile* in);
80  void scatter(int* index, const NodeFile* in);
81 
82  void setCoordinates(const escript::Data& newX);
83  void setTags(const int newTag, const escript::Data& mask);
84  inline void updateTagList();
85 
86  std::pair<int,int> getDOFRange() const;
87 
88 private:
89  std::pair<int,int> getGlobalIdRange() const;
90  std::pair<int,int> getGlobalDOFRange() const;
91  std::pair<int,int> getGlobalNodeIDIndexRange() const;
92  int prepareLabeling(const std::vector<short>& mask,
93  std::vector<int>& buffer,
94  std::vector<int>& distribution, bool useNodes);
95  void createDOFMappingAndCoupling(bool reduced);
96 
98 
99 public:
101  // these should be private as well.
102 
106 
110  int numNodes;
112  int numDim;
114  int *Id;
116  int *Tag;
118  std::vector<int> tagsInUse;
124  double *Coordinates;
133 
138 
141 
146 
149  int status;
150 };
151 
152 //
153 // implementation of inline methods
154 //
155 
156 inline int NodeFile::getFirstNode() const
157 {
158  return nodesDistribution->getFirstComponent();
159 }
160 
161 inline int NodeFile::getLastNode() const
162 {
163  return nodesDistribution->getLastComponent();
164 }
165 
166 inline int NodeFile::getGlobalNumNodes() const
167 {
168  return nodesDistribution->getGlobalNumComponents();
169 }
170 
172 {
173  return globalNodesIndex;
174 }
175 
177 {
178  return reducedNodesDistribution->getFirstComponent();
179 }
180 
182 {
183  return reducedNodesDistribution->getLastComponent();
184 }
185 
187 {
188  return reducedNodesDistribution->getGlobalNumComponents();
189 }
190 
192 {
194 }
195 
196 inline int NodeFile::getNumNodes() const
197 {
198  return numNodes;
199 }
200 
202 {
204 }
205 
207 {
208  return degreesOfFreedomDistribution->getMyNumComponents();
209 }
210 
212 {
213  return reducedDegreesOfFreedomDistribution->getMyNumComponents();
214 }
215 
216 inline const std::vector<int>& NodeFile::borrowNodesTarget() const
217 {
218  return nodesMapping.map;
219 }
220 
221 inline const std::vector<int>& NodeFile::borrowReducedNodesTarget() const
222 {
223  return reducedNodesMapping.map;
224 }
225 
226 inline const std::vector<int>& NodeFile::borrowDegreesOfFreedomTarget() const
227 {
229 }
230 
231 inline const std::vector<int>& NodeFile::borrowReducedDegreesOfFreedomTarget() const
232 {
234 }
235 
236 inline const int* NodeFile::borrowTargetNodes() const
237 {
238  return &nodesMapping.target[0];
239 }
240 
241 inline const int* NodeFile::borrowTargetReducedNodes() const
242 {
243  return &reducedNodesMapping.target[0];
244 }
245 
246 inline const int* NodeFile::borrowTargetDegreesOfFreedom() const
247 {
248  return &degreesOfFreedomMapping.target[0];
249 }
250 
252 {
254 }
255 
257 {
259 }
260 
261 
262 } // namespace finley
263 
264 #endif // __FINLEY_NODEFILE_H__
265 
int * reducedNodesId
these are the packed versions of Id
Definition: finley/src/NodeFile.h:143
int * globalDegreesOfFreedom
Definition: finley/src/NodeFile.h:122
paso::Connector_ptr degreesOfFreedomConnector
Definition: finley/src/NodeFile.h:139
paso::Distribution_ptr reducedDegreesOfFreedomDistribution
Definition: finley/src/NodeFile.h:137
int getLastReducedNode() const
Definition: finley/src/NodeFile.h:181
int * Id
Id[i] is the id number of node i. It needs to be unique.
Definition: finley/src/NodeFile.h:114
const std::vector< int > & borrowReducedNodesTarget() const
Definition: finley/src/NodeFile.h:221
NodeMapping nodesMapping
Definition: finley/src/NodeFile.h:97
std::vector< int > tagsInUse
vector of tags which are actually used
Definition: finley/src/NodeFile.h:118
int numDim
number of spatial dimensions
Definition: finley/src/NodeFile.h:112
int status
Definition: finley/src/NodeFile.h:149
const std::vector< int > & borrowReducedDegreesOfFreedomTarget() const
Definition: finley/src/NodeFile.h:231
void createDOFMappingAndCoupling(bool reduced)
Definition: finley/src/NodeFile.cpp:785
std::pair< int, int > getGlobalIdRange() const
Definition: finley/src/NodeFile.cpp:249
int * degreesOfFreedomId
Definition: finley/src/NodeFile.h:144
paso::Distribution_ptr degreesOfFreedomDistribution
Definition: finley/src/NodeFile.h:136
void copyTable(int offset, int idOffset, int dofOffset, const NodeFile *in)
Definition: finley/src/NodeFile.cpp:304
NodeMapping degreesOfFreedomMapping
Definition: finley/src/NodeFile.h:104
void allocTable(int numNodes)
allocates the node table within this node file to hold NN nodes.
Definition: finley/src/NodeFile.cpp:108
Struct that holds MPI communicator, rank, size and a tag counter.
Definition: Esys_MPI.h:48
void assignMPIRankToDOFs(std::vector< int > &mpiRankOfDOF, const std::vector< int > &distribution)
Definition: finley/src/NodeFile.cpp:454
int getGlobalNumNodes() const
Definition: finley/src/NodeFile.h:166
const int * borrowTargetDegreesOfFreedom() const
Definition: finley/src/NodeFile.h:246
std::pair< int, int > getDOFRange() const
Definition: finley/src/NodeFile.cpp:238
boost::shared_ptr< Distribution > Distribution_ptr
Definition: Distribution.h:36
NodeFile(int nDim, Esys_MPIInfo *mpiInfo)
Definition: finley/src/NodeFile.cpp:82
void setValuesInUse(const int *values, const int numValues, std::vector< int > &valuesInUse, Esys_MPIInfo *mpiinfo)
Definition: finley/src/Util.cpp:346
void freeTable()
frees the node table within this node file
Definition: finley/src/NodeFile.cpp:144
void gather(int *index, const NodeFile *in)
Definition: finley/src/NodeFile.cpp:341
int getLastNode() const
Definition: finley/src/NodeFile.h:161
int getFirstNode() const
Definition: finley/src/NodeFile.h:156
std::vector< int > target
target[i] defines the target of FEM node i=0,...,numNodes-1
Definition: finley/src/NodeMapping.h:74
int createDenseReducedLabeling(const std::vector< short > &reducedMask, bool useNodes)
Definition: finley/src/NodeFile.cpp:715
int createDenseDOFLabeling()
Definition: finley/src/NodeFile.cpp:538
int * borrowGlobalNodesIndex() const
Definition: finley/src/NodeFile.h:171
paso::Distribution_ptr nodesDistribution
Definition: finley/src/NodeFile.h:134
Definition: finley/src/NodeMapping.h:29
int * borrowGlobalReducedNodesIndex() const
Definition: finley/src/NodeFile.h:191
const std::vector< int > & borrowDegreesOfFreedomTarget() const
Definition: finley/src/NodeFile.h:226
int createDenseNodeLabeling(std::vector< int > &nodeDistribution, const std::vector< int > &dofDistribution)
Definition: finley/src/NodeFile.cpp:601
int getNumTargets() const
returns the number of target nodes (number of items in the map array)
Definition: finley/src/NodeMapping.h:71
Data represents a collection of datapoints.
Definition: Data.h:71
void updateTagList()
Definition: finley/src/NodeFile.h:256
Definition: finley/src/NodeFile.h:31
int * reducedDegreesOfFreedomId
Definition: finley/src/NodeFile.h:145
std::pair< int, int > getGlobalDOFRange() const
Definition: finley/src/NodeFile.cpp:267
void print() const
Definition: finley/src/NodeFile.cpp:171
void setTags(const int newTag, const escript::Data &mask)
sets tags to newTag where mask>0
Definition: finley/src/NodeFile.cpp:217
int getNumDegreesOfFreedom() const
Definition: finley/src/NodeFile.h:206
const int * borrowTargetNodes() const
Definition: finley/src/NodeFile.h:236
void gather_global(const std::vector< int > &index, const NodeFile *in)
Definition: finley/src/NodeFile.cpp:349
void createNodeMappings(const std::vector< int > &indexReducedNodes, const std::vector< int > &dofDistribution, const std::vector< int > &nodeDistribution)
Definition: finley/src/NodeFile.cpp:1000
std::pair< int, int > getGlobalNodeIDIndexRange() const
Definition: finley/src/NodeFile.cpp:286
void scatter(int *index, const NodeFile *in)
Definition: finley/src/NodeFile.cpp:331
void setCoordinates(const escript::Data &newX)
copies the array newX into this->coordinates
Definition: finley/src/NodeFile.cpp:191
int getNumReducedNodes() const
Definition: finley/src/NodeFile.h:201
Esys_MPIInfo * MPIInfo
MPI information.
Definition: finley/src/NodeFile.h:108
boost::shared_ptr< Connector > Connector_ptr
Definition: Coupler.h:35
const int * borrowTargetReducedDegreesOfFreedom() const
Definition: finley/src/NodeFile.h:251
paso::Distribution_ptr reducedNodesDistribution
Definition: finley/src/NodeFile.h:135
NodeMapping reducedNodesMapping
Definition: finley/src/NodeFile.h:103
int * globalReducedNodesIndex
Definition: finley/src/NodeFile.h:130
const std::vector< int > & borrowNodesTarget() const
Definition: finley/src/NodeFile.h:216
NodeMapping reducedDegreesOfFreedomMapping
Definition: finley/src/NodeFile.h:105
std::vector< int > map
maps the target nodes back to the FEM nodes: target[map[i]]=i
Definition: finley/src/NodeMapping.h:76
int prepareLabeling(const std::vector< short > &mask, std::vector< int > &buffer, std::vector< int > &distribution, bool useNodes)
Definition: finley/src/NodeFile.cpp:478
int getNumNodes() const
returns the number of FEM nodes
Definition: finley/src/NodeFile.h:196
double * Coordinates
Coordinates[INDEX2(k,i,numDim)] is the k-th coordinate of node i.
Definition: finley/src/NodeFile.h:124
int * globalReducedDOFIndex
Definition: finley/src/NodeFile.h:127
int numNodes
number of nodes
Definition: finley/src/NodeFile.h:110
const int * borrowTargetReducedNodes() const
Definition: finley/src/NodeFile.h:241
int getGlobalNumReducedNodes() const
Definition: finley/src/NodeFile.h:186
int * Tag
Tag[i] is the tag of node i.
Definition: finley/src/NodeFile.h:116
paso::Connector_ptr reducedDegreesOfFreedomConnector
Definition: finley/src/NodeFile.h:140
int getFirstReducedNode() const
Definition: finley/src/NodeFile.h:176
int getNumReducedDegreesOfFreedom() const
Definition: finley/src/NodeFile.h:211
~NodeFile()
destructor
Definition: finley/src/NodeFile.cpp:101
int * globalNodesIndex
assigns each local reduced node a global unique Id in a dense labeling
Definition: finley/src/NodeFile.h:132