#ifndef PARALLEL_MAPPER_H #define PARALLEL_MAPPER_H #include "parallel/MeshDistributor.h" namespace AMDiS { //todo: request from a problem -> distributor mapper? template< typename size_type > class ParallelMapper_base { MeshDistributor& md; /// the current row in the problem system size_type r; /// the current column in the problem system size_type c; int nComponents; public: ParallelMapper_base(MeshDistributor& md, int nComponents): md(md),r(0),c(0),nComponents(nComponents) { TEST_EXIT_DBG(nComponents > 0)("the system must have at least one component"); } size_type row(size_type r_) { size_type ret = md.mapLocalToGlobal(r_)*nComponents+r; //size_type ret = md.mapLocalToGlobal(r_)+r*md.getNumberOverallDofs() ; return ret; } size_type col(size_type c_) { size_type ret = md.mapLocalToGlobal(c_)*nComponents+c; //size_type ret = md.mapLocalToGlobal(c_)+c*md.getNumberOverallDofs() ; return ret ; } inline MeshDistributor& meshDistributor() { return md; } inline int getNumComponents() { return nComponents; } inline void setRow(size_type r_) { r = r_ ;} inline void setCol(size_type c_) { c = c_; } inline size_type getNumRows() { return md.getNumberOverallDofs() * nComponents; } inline size_type getNumCols() { return md.getNumberOverallDofs() * nComponents; } }; typedef ParallelMapper_base< unsigned int > ParallelMapper; } #endif