escript
Revision_
|
00001 00002 /***************************************************************************** 00003 * 00004 * Copyright (c) 2003-2014 by University of Queensland 00005 * http://www.uq.edu.au 00006 * 00007 * Primary Business: Queensland, Australia 00008 * Licensed under the Open Software License version 3.0 00009 * http://www.opensource.org/licenses/osl-3.0.php 00010 * 00011 * Development until 2012 by Earth Systems Science Computational Center (ESSCC) 00012 * Development 2012-2013 by School of Earth Sciences 00013 * Development from 2014 by Centre for Geoscience Computing (GeoComp) 00014 * 00015 *****************************************************************************/ 00016 00017 #ifndef __FINLEY_NODEFILE_H__ 00018 #define __FINLEY_NODEFILE_H__ 00019 00020 #define MAX_numDim 3 00021 00022 #include "Finley.h" 00023 #include "NodeMapping.h" 00024 #include <paso/Coupler.h> 00025 #include <paso/Distribution.h> 00026 00027 struct Esys_MPIInfo; 00028 00029 namespace finley { 00030 00031 class NodeFile 00032 { 00033 public: 00034 NodeFile(int nDim, Esys_MPIInfo *mpiInfo); 00035 ~NodeFile(); 00036 00037 void allocTable(int numNodes); 00038 void freeTable(); 00039 00040 void print() const; 00041 inline int getFirstNode() const; 00042 inline int getLastNode() const; 00043 inline int getGlobalNumNodes() const; 00044 inline int* borrowGlobalNodesIndex() const; 00045 00046 inline int getFirstReducedNode() const; 00047 inline int getLastReducedNode() const; 00048 inline int getGlobalNumReducedNodes() const; 00049 inline int* borrowGlobalReducedNodesIndex() const; 00050 00052 inline int getNumNodes() const; 00053 inline int getNumReducedNodes() const; 00054 inline int getNumDegreesOfFreedom() const; 00055 inline int getNumReducedDegreesOfFreedom() const; 00056 00057 inline const std::vector<int>& borrowReducedNodesTarget() const; 00058 inline const std::vector<int>& borrowDegreesOfFreedomTarget() const; 00059 inline const std::vector<int>& borrowNodesTarget() const; 00060 inline const std::vector<int>& borrowReducedDegreesOfFreedomTarget() const; 00061 00062 inline const int* borrowTargetReducedNodes() const; 00063 inline const int* borrowTargetDegreesOfFreedom() const; 00064 inline const int* borrowTargetNodes() const; 00065 inline const int* borrowTargetReducedDegreesOfFreedom() const; 00066 00067 void createNodeMappings(const std::vector<int>& indexReducedNodes, 00068 const std::vector<int>& dofDistribution, 00069 const std::vector<int>& nodeDistribution); 00070 int createDenseDOFLabeling(); 00071 int createDenseNodeLabeling(std::vector<int>& nodeDistribution, 00072 const std::vector<int>& dofDistribution); 00073 int createDenseReducedLabeling(const std::vector<short>& reducedMask, 00074 bool useNodes); 00075 void assignMPIRankToDOFs(std::vector<int>& mpiRankOfDOF, const std::vector<int>& distribution); 00076 00077 void copyTable(int offset, int idOffset, int dofOffset, const NodeFile* in); 00078 void gather(int* index, const NodeFile* in); 00079 void gather_global(const std::vector<int>& index, const NodeFile* in); 00080 void scatter(int* index, const NodeFile* in); 00081 00082 void setCoordinates(const escript::Data& newX); 00083 void setTags(const int newTag, const escript::Data& mask); 00084 inline void updateTagList(); 00085 00086 std::pair<int,int> getDOFRange() const; 00087 00088 private: 00089 std::pair<int,int> getGlobalIdRange() const; 00090 std::pair<int,int> getGlobalDOFRange() const; 00091 std::pair<int,int> getGlobalNodeIDIndexRange() const; 00092 int prepareLabeling(const std::vector<short>& mask, 00093 std::vector<int>& buffer, 00094 std::vector<int>& distribution, bool useNodes); 00095 void createDOFMappingAndCoupling(bool reduced); 00096 00097 NodeMapping nodesMapping; 00098 00099 public: 00101 // these should be private as well. 00102 00103 NodeMapping reducedNodesMapping; 00104 NodeMapping degreesOfFreedomMapping; 00105 NodeMapping reducedDegreesOfFreedomMapping; 00106 00108 Esys_MPIInfo *MPIInfo; 00110 int numNodes; 00112 int numDim; 00114 int *Id; 00116 int *Tag; 00118 std::vector<int> tagsInUse; 00122 int* globalDegreesOfFreedom; 00124 double *Coordinates; 00127 int *globalReducedDOFIndex; 00130 int *globalReducedNodesIndex; 00132 int *globalNodesIndex; 00133 00134 paso::Distribution_ptr nodesDistribution; 00135 paso::Distribution_ptr reducedNodesDistribution; 00136 paso::Distribution_ptr degreesOfFreedomDistribution; 00137 paso::Distribution_ptr reducedDegreesOfFreedomDistribution; 00138 00139 paso::Connector_ptr degreesOfFreedomConnector; 00140 paso::Connector_ptr reducedDegreesOfFreedomConnector; 00141 00143 int *reducedNodesId; 00144 int *degreesOfFreedomId; 00145 int *reducedDegreesOfFreedomId; 00146 00149 int status; 00150 }; 00151 00152 // 00153 // implementation of inline methods 00154 // 00155 00156 inline int NodeFile::getFirstNode() const 00157 { 00158 return nodesDistribution->getFirstComponent(); 00159 } 00160 00161 inline int NodeFile::getLastNode() const 00162 { 00163 return nodesDistribution->getLastComponent(); 00164 } 00165 00166 inline int NodeFile::getGlobalNumNodes() const 00167 { 00168 return nodesDistribution->getGlobalNumComponents(); 00169 } 00170 00171 inline int* NodeFile::borrowGlobalNodesIndex() const 00172 { 00173 return globalNodesIndex; 00174 } 00175 00176 inline int NodeFile::getFirstReducedNode() const 00177 { 00178 return reducedNodesDistribution->getFirstComponent(); 00179 } 00180 00181 inline int NodeFile::getLastReducedNode() const 00182 { 00183 return reducedNodesDistribution->getLastComponent(); 00184 } 00185 00186 inline int NodeFile::getGlobalNumReducedNodes() const 00187 { 00188 return reducedNodesDistribution->getGlobalNumComponents(); 00189 } 00190 00191 inline int* NodeFile::borrowGlobalReducedNodesIndex() const 00192 { 00193 return globalReducedNodesIndex; 00194 } 00195 00196 inline int NodeFile::getNumNodes() const 00197 { 00198 return numNodes; 00199 } 00200 00201 inline int NodeFile::getNumReducedNodes() const 00202 { 00203 return reducedNodesMapping.getNumTargets(); 00204 } 00205 00206 inline int NodeFile::getNumDegreesOfFreedom() const 00207 { 00208 return degreesOfFreedomDistribution->getMyNumComponents(); 00209 } 00210 00211 inline int NodeFile::getNumReducedDegreesOfFreedom() const 00212 { 00213 return reducedDegreesOfFreedomDistribution->getMyNumComponents(); 00214 } 00215 00216 inline const std::vector<int>& NodeFile::borrowNodesTarget() const 00217 { 00218 return nodesMapping.map; 00219 } 00220 00221 inline const std::vector<int>& NodeFile::borrowReducedNodesTarget() const 00222 { 00223 return reducedNodesMapping.map; 00224 } 00225 00226 inline const std::vector<int>& NodeFile::borrowDegreesOfFreedomTarget() const 00227 { 00228 return degreesOfFreedomMapping.map; 00229 } 00230 00231 inline const std::vector<int>& NodeFile::borrowReducedDegreesOfFreedomTarget() const 00232 { 00233 return reducedDegreesOfFreedomMapping.map; 00234 } 00235 00236 inline const int* NodeFile::borrowTargetNodes() const 00237 { 00238 return &nodesMapping.target[0]; 00239 } 00240 00241 inline const int* NodeFile::borrowTargetReducedNodes() const 00242 { 00243 return &reducedNodesMapping.target[0]; 00244 } 00245 00246 inline const int* NodeFile::borrowTargetDegreesOfFreedom() const 00247 { 00248 return °reesOfFreedomMapping.target[0]; 00249 } 00250 00251 inline const int* NodeFile::borrowTargetReducedDegreesOfFreedom() const 00252 { 00253 return &reducedDegreesOfFreedomMapping.target[0]; 00254 } 00255 00256 inline void NodeFile::updateTagList() 00257 { 00258 util::setValuesInUse(Tag, numNodes, tagsInUse, MPIInfo); 00259 } 00260 00261 00262 } // namespace finley 00263 00264 #endif // __FINLEY_NODEFILE_H__ 00265