escript  Revision_
NodeFile.h
Go to the documentation of this file.
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 &degreesOfFreedomMapping.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