finley/src/NodeFile.h
Go to the documentation of this file.
/*****************************************************************************
*
* Copyright (c) 2003-2017 by The University of Queensland
* http://www.uq.edu.au
*
* Primary Business: Queensland, Australia
* Licensed under the Apache License, version 2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Development until 2012 by Earth Systems Science Computational Center (ESSCC)
* Development 2012-2013 by School of Earth Sciences
* Development from 2014 by Centre for Geoscience Computing (GeoComp)
*
*****************************************************************************/
#ifndef __FINLEY_NODEFILE_H__
#define __FINLEY_NODEFILE_H__
#define MAX_numDim 3
#include "Finley.h"
#include "NodeMapping.h"
#include <escript/Distribution.h>
#ifdef ESYS_HAVE_PASO
#include <paso/Coupler.h>
#endif
#ifdef ESYS_HAVE_TRILINOS
#include <trilinoswrap/types.h>
#endif
namespace escript {
struct IndexList;
}
namespace finley {
class NodeFile
{
public:
NodeFile(int nDim, escript::JMPI MPIInfo);
~NodeFile();
void allocTable(dim_t numNodes);
void freeTable();
void print() const;
inline index_t getFirstNode() const;
inline index_t getLastNode() const;
inline dim_t getGlobalNumNodes() const;
inline const index_t* borrowGlobalNodesIndex() const;
inline index_t getFirstReducedNode() const;
inline index_t getLastReducedNode() const;
inline index_t getGlobalNumReducedNodes() const;
inline const index_t* borrowGlobalReducedNodesIndex() const;
inline dim_t getNumNodes() const;
inline dim_t getNumReducedNodes() const;
inline dim_t getNumDegreesOfFreedom() const;
inline dim_t getNumReducedDegreesOfFreedom() const;
inline dim_t getNumDegreesOfFreedomTargets() const;
inline dim_t getNumReducedDegreesOfFreedomTargets() const;
inline const IndexVector& borrowReducedNodesTarget() const;
inline const IndexVector& borrowDegreesOfFreedomTarget() const;
inline const IndexVector& borrowNodesTarget() const;
inline const IndexVector& borrowReducedDegreesOfFreedomTarget() const;
inline const index_t* borrowTargetReducedNodes() const;
inline const index_t* borrowTargetDegreesOfFreedom() const;
inline const index_t* borrowTargetNodes() const;
inline const index_t* borrowTargetReducedDegreesOfFreedom() const;
inline void updateTagList();
dim_t createDenseDOFLabeling();
dim_t createDenseNodeLabeling(IndexVector& nodeDistribution,
const IndexVector& dofDistribution);
dim_t createDenseReducedLabeling(const std::vector<short>& reducedMask,
bool useNodes);
void createNodeMappings(const IndexVector& indexReducedNodes,
const IndexVector& dofDistribution,
const IndexVector& nodeDistribution);
void assignMPIRankToDOFs(std::vector<int>& mpiRankOfDOF,
const IndexVector& distribution);
void copyTable(index_t offset, index_t idOffset, index_t dofOffset,
const NodeFile* in);
void gather(const index_t* index, const NodeFile* in);
void gather_global(const index_t* index, const NodeFile* in);
void scatter(const index_t* index, const NodeFile* in);
void setCoordinates(const escript::Data& newX);
void setTags(int newTag, const escript::Data& mask);
std::pair<index_t,index_t> getDOFRange() const;
private:
std::pair<index_t,index_t> getGlobalIdRange() const;
std::pair<index_t,index_t> getGlobalDOFRange() const;
std::pair<index_t,index_t> getGlobalNodeIDIndexRange() const;
dim_t prepareLabeling(const std::vector<short>& mask, IndexVector& buffer,
IndexVector& distribution, bool useNodes);
void createDOFMappingAndCoupling(bool reduced);
NodeMapping nodesMapping;
NodeMapping degreesOfFreedomMapping;
NodeMapping reducedDegreesOfFreedomMapping;
dim_t numNodes;
public:
// these should be private as well.
NodeMapping reducedNodesMapping;
escript::JMPI MPIInfo;
int numDim;
index_t* Id;
int* Tag;
std::vector<int> tagsInUse;
index_t* globalDegreesOfFreedom;
double* Coordinates;
index_t* globalReducedDOFIndex;
index_t* globalReducedNodesIndex;
index_t* globalNodesIndex;
escript::Distribution_ptr nodesDistribution;
escript::Distribution_ptr reducedNodesDistribution;
escript::Distribution_ptr degreesOfFreedomDistribution;
escript::Distribution_ptr reducedDegreesOfFreedomDistribution;
#ifdef ESYS_HAVE_PASO
paso::Connector_ptr degreesOfFreedomConnector;
paso::Connector_ptr reducedDegreesOfFreedomConnector;
#endif
#ifdef ESYS_HAVE_TRILINOS
esys_trilinos::const_TrilinosMap_ptr trilinosRowMap;
esys_trilinos::const_TrilinosMap_ptr trilinosReducedRowMap;
esys_trilinos::const_TrilinosMap_ptr trilinosColMap;
esys_trilinos::const_TrilinosMap_ptr trilinosReducedColMap;
#endif
// these are the packed versions of Id
index_t* reducedNodesId;
index_t* degreesOfFreedomId;
index_t* reducedDegreesOfFreedomId;
int status;
};
//
// implementation of inline methods
//
inline index_t NodeFile::getFirstNode() const
{
return nodesDistribution->getFirstComponent();
}
inline index_t NodeFile::getLastNode() const
{
return nodesDistribution->getLastComponent();
}
inline dim_t NodeFile::getGlobalNumNodes() const
{
return nodesDistribution->getGlobalNumComponents();
}
inline const index_t* NodeFile::borrowGlobalNodesIndex() const
{
return globalNodesIndex;
}
inline index_t NodeFile::getFirstReducedNode() const
{
return reducedNodesDistribution->getFirstComponent();
}
inline index_t NodeFile::getLastReducedNode() const
{
return reducedNodesDistribution->getLastComponent();
}
inline dim_t NodeFile::getGlobalNumReducedNodes() const
{
return reducedNodesDistribution->getGlobalNumComponents();
}
inline const index_t* NodeFile::borrowGlobalReducedNodesIndex() const
{
return globalReducedNodesIndex;
}
inline dim_t NodeFile::getNumNodes() const
{
return numNodes;
}
inline dim_t NodeFile::getNumReducedNodes() const
{
return reducedNodesMapping.getNumTargets();
}
inline dim_t NodeFile::getNumDegreesOfFreedom() const
{
return degreesOfFreedomDistribution->getMyNumComponents();
}
inline dim_t NodeFile::getNumReducedDegreesOfFreedom() const
{
return reducedDegreesOfFreedomDistribution->getMyNumComponents();
}
inline dim_t NodeFile::getNumDegreesOfFreedomTargets() const
{
return degreesOfFreedomMapping.getNumTargets();
}
inline dim_t NodeFile::getNumReducedDegreesOfFreedomTargets() const
{
return reducedDegreesOfFreedomMapping.getNumTargets();
}
inline const IndexVector& NodeFile::borrowNodesTarget() const
{
return nodesMapping.map;
}
inline const IndexVector& NodeFile::borrowReducedNodesTarget() const
{
return reducedNodesMapping.map;
}
inline const IndexVector& NodeFile::borrowDegreesOfFreedomTarget() const
{
return degreesOfFreedomMapping.map;
}
inline const IndexVector& NodeFile::borrowReducedDegreesOfFreedomTarget() const
{
return reducedDegreesOfFreedomMapping.map;
}
inline const index_t* NodeFile::borrowTargetNodes() const
{
return &nodesMapping.target[0];
}
inline const index_t* NodeFile::borrowTargetReducedNodes() const
{
return &reducedNodesMapping.target[0];
}
inline const index_t* NodeFile::borrowTargetDegreesOfFreedom() const
{
return &degreesOfFreedomMapping.target[0];
}
inline const index_t* NodeFile::borrowTargetReducedDegreesOfFreedom() const
{
return &reducedDegreesOfFreedomMapping.target[0];
}
inline void NodeFile::updateTagList()
{
util::setValuesInUse(Tag, numNodes, tagsInUse, MPIInfo);
}
} // namespace finley
#endif // __FINLEY_NODEFILE_H__
finley::NodeFile::degreesOfFreedomId
index_t * degreesOfFreedomId
Definition: finley/src/NodeFile.h:203
finley::NodeFile::Id
index_t * Id
Id[i] is the unique ID number of FEM node i.
Definition: finley/src/NodeFile.h:163
finley::NodeFile::nodesDistribution
escript::Distribution_ptr nodesDistribution
MPI distribution of nodes.
Definition: finley/src/NodeFile.h:185
finley::NodeFile::nodesMapping
NodeMapping nodesMapping
Definition: finley/src/NodeFile.h:145
finley::NodeFile::tagsInUse
std::vector< int > tagsInUse
vector of tags which are actually used
Definition: finley/src/NodeFile.h:167
finley::NodeFile::numDim
int numDim
number of spatial dimensions
Definition: finley/src/NodeFile.h:161
finley::NodeFile::status
int status
Definition: finley/src/NodeFile.h:208
finley::NodeFile::degreesOfFreedomDistribution
escript::Distribution_ptr degreesOfFreedomDistribution
Definition: finley/src/NodeFile.h:187
escript
Definition: AbstractContinuousDomain.cpp:22
finley::NodeFile::reducedDegreesOfFreedomDistribution
escript::Distribution_ptr reducedDegreesOfFreedomDistribution
Definition: finley/src/NodeFile.h:188
escript::Distribution_ptr
boost::shared_ptr< Distribution > Distribution_ptr
Definition: Distribution.h:24
finley::NodeFile::degreesOfFreedomMapping
NodeMapping degreesOfFreedomMapping
Definition: finley/src/NodeFile.h:146
escript::DataTypes::IndexVector
std::vector< index_t > IndexVector
Definition: DataTypes.h:62
NodeMapping.h
finley::NodeFile::globalReducedNodesIndex
index_t * globalReducedNodesIndex
Definition: finley/src/NodeFile.h:180
escript::JMPI
boost::shared_ptr< JMPI_ > JMPI
Definition: EsysMPI.h:71
finley::NodeFile::globalDegreesOfFreedom
index_t * globalDegreesOfFreedom
Definition: finley/src/NodeFile.h:172
finley::NodeFile::reducedNodesDistribution
escript::Distribution_ptr reducedNodesDistribution
Definition: finley/src/NodeFile.h:186
finley
A suite of factory methods for creating various finley domains.
Definition: finley/src/Assemble.h:31
finley::NodeFile::reducedNodesId
index_t * reducedNodesId
Definition: finley/src/NodeFile.h:202
dudley::util::setValuesInUse
void setValuesInUse(const int *values, dim_t numValues, std::vector< int > &valuesInUse, escript::JMPI mpiinfo)
Definition: dudley/src/Util.cpp:223
finley::NodeFile::globalReducedDOFIndex
index_t * globalReducedDOFIndex
Definition: finley/src/NodeFile.h:177
escript::DataTypes::index_t
int index_t
type for array/matrix indices used both globally and on each rank
Definition: DataTypes.h:59
finley::NodeMapping
Definition: finley/src/NodeMapping.h:29
escript::Data
Data represents a collection of datapoints.
Definition: Data.h:63
finley::NodeFile
Definition: finley/src/NodeFile.h:40
finley::NodeFile::reducedDegreesOfFreedomId
index_t * reducedDegreesOfFreedomId
Definition: finley/src/NodeFile.h:204
finley::NodeFile::MPIInfo
escript::JMPI MPIInfo
MPI information.
Definition: finley/src/NodeFile.h:159
dudley::util::gather
void gather(int len, const index_t *index, int numData, const double *in, double *out)
Definition: dudley/src/Util.cpp:43
paso::Connector_ptr
boost::shared_ptr< Connector > Connector_ptr
Definition: Coupler.h:37
finley::NodeFile::reducedNodesMapping
NodeMapping reducedNodesMapping
Definition: finley/src/NodeFile.h:156
finley::NodeFile::reducedDegreesOfFreedomMapping
NodeMapping reducedDegreesOfFreedomMapping
Definition: finley/src/NodeFile.h:147
finley::NodeFile::numNodes
dim_t numNodes
number of nodes
Definition: finley/src/NodeFile.h:150
finley::NodeFile::Coordinates
double * Coordinates
Coordinates[INDEX2(k,i,numDim)] is the k-th coordinate of node i.
Definition: finley/src/NodeFile.h:174
Finley.h
finley::NodeFile::Tag
int * Tag
Tag[i] is the tag of node i.
Definition: finley/src/NodeFile.h:165
finley::NodeFile::globalNodesIndex
index_t * globalNodesIndex
assigns each local node a global unique ID in a dense labeling
Definition: finley/src/NodeFile.h:182
escript::DataTypes::dim_t
index_t dim_t
Definition: DataTypes.h:64