From e9eecefb4fdc7b7562f9f8aa17aed94f606be746 Mon Sep 17 00:00:00 2001 From: "hanouvit@vz" <vithanousek@seznam.cz> Date: Wed, 4 Jul 2018 15:27:48 +0200 Subject: [PATCH] DisstributedGrid 2D amd 3D refactorization - DistributedGrid_Base template --- .../DistributedMeshes/DistributedGrid_1D.h | 2 - .../DistributedMeshes/DistributedGrid_1D.hpp | 7 - .../DistributedMeshes/DistributedGrid_2D.h | 71 +--- .../DistributedMeshes/DistributedGrid_2D.hpp | 236 ++++-------- .../DistributedMeshes/DistributedGrid_3D.h | 63 +--- .../DistributedMeshes/DistributedGrid_3D.hpp | 352 +++++++----------- .../DistributedGrid_Base.hpp | 2 +- 7 files changed, 237 insertions(+), 496 deletions(-) diff --git a/src/TNL/Meshes/DistributedMeshes/DistributedGrid_1D.h b/src/TNL/Meshes/DistributedMeshes/DistributedGrid_1D.h index f5e8fae01a..833f5723c6 100644 --- a/src/TNL/Meshes/DistributedMeshes/DistributedGrid_1D.h +++ b/src/TNL/Meshes/DistributedMeshes/DistributedGrid_1D.h @@ -28,8 +28,6 @@ class DistributedMesh< Grid< 1, RealType, Device, Index > > : public Distributed using typename DistributedGrid_Base<1, RealType, Device, Index >::PointType; using typename DistributedGrid_Base<1, RealType, Device, Index >::CoordinatesType; - DistributedMesh(); - bool setup( const Config::ParameterContainer& parameters, const String& prefix ); diff --git a/src/TNL/Meshes/DistributedMeshes/DistributedGrid_1D.hpp b/src/TNL/Meshes/DistributedMeshes/DistributedGrid_1D.hpp index 8e01c1351f..8d8c6a049a 100644 --- a/src/TNL/Meshes/DistributedMeshes/DistributedGrid_1D.hpp +++ b/src/TNL/Meshes/DistributedMeshes/DistributedGrid_1D.hpp @@ -14,13 +14,6 @@ namespace TNL { namespace Meshes { namespace DistributedMeshes { -template<typename RealType, typename Device, typename Index > -DistributedMesh< Grid< 1, RealType, Device, Index > >:: -DistributedMesh() -{ - this->domainDecomposition=CoordinatesType( 0 ); -} - template< typename RealType, typename Device, typename Index > bool DistributedMesh< Grid< 1, RealType, Device, Index > >:: diff --git a/src/TNL/Meshes/DistributedMeshes/DistributedGrid_2D.h b/src/TNL/Meshes/DistributedMeshes/DistributedGrid_2D.h index dd4bfae830..20006488f2 100644 --- a/src/TNL/Meshes/DistributedMeshes/DistributedGrid_2D.h +++ b/src/TNL/Meshes/DistributedMeshes/DistributedGrid_2D.h @@ -19,31 +19,20 @@ namespace DistributedMeshes { enum Directions2D { Left = 0 , Right = 1 , Up = 2, Down=3, UpLeft =4, UpRight=5, DownLeft=6, DownRight=7 }; template< typename RealType, typename Device, typename Index > -class DistributedMesh< Grid< 2, RealType, Device, Index > > +class DistributedMesh< Grid< 2, RealType, Device, Index > >: public DistributedGrid_Base<2, RealType, Device, Index > { public: - typedef Index IndexType; - typedef Grid< 2, RealType, Device, IndexType > GridType; - typedef typename GridType::PointType PointType; - typedef Containers::StaticVector< 2, IndexType > CoordinatesType; + using typename DistributedGrid_Base<2, RealType, Device, Index >::IndexType; + using typename DistributedGrid_Base<2, RealType, Device, Index >::GridType; + using typename DistributedGrid_Base<2, RealType, Device, Index >::PointType; + using typename DistributedGrid_Base<2, RealType, Device, Index >::CoordinatesType; - static constexpr int getMeshDimension() { return 2; }; - - - public: - - DistributedMesh(); - - void setDomainDecomposition( const CoordinatesType& domainDecomposition ); - - const CoordinatesType& getDomainDecomposition() const; - - template< int EntityDimension > +/* template< int EntityDimension > IndexType getEntitiesCount() const; template< typename Entity > - IndexType getEntitiesCount() const; + IndexType getEntitiesCount() const;*/ bool setup( const Config::ParameterContainer& parameters, const String& prefix ); @@ -57,54 +46,16 @@ class DistributedMesh< Grid< 2, RealType, Device, Index > > String printProcessCoords() const; String printProcessDistr() const; - - bool isDistributed() const; - - const CoordinatesType& getOverlap() const; - + const int* getNeighbors() const; - - const CoordinatesType& getLocalSize() const; - - //number of elements of global grid - const CoordinatesType& getGlobalSize() const; - - //coordinates of begin of local subdomain without overlaps in global grid - const CoordinatesType& getGlobalBegin() const; - - const CoordinatesType& getLocalGridSize() const; - - const CoordinatesType& getLocalBegin() const; - + void writeProlog( Logger& logger ) const; private : - int getRankOfProcCoord(int x, int y) const; - - GridType globalGrid; - PointType spaceSteps; - PointType localOrigin; - CoordinatesType localSize;//velikost gridu zpracovavane danym uzlem bez prekryvu - CoordinatesType localBegin;//souradnice zacatku zpracovavane vypoctove oblasi - CoordinatesType localGridSize;//velikost lokálnĂho gridu vÄŤetnÄ› pĹ™ekryvĹŻ - CoordinatesType overlap; - CoordinatesType globalSize;//velikost celĂ© sĂtÄ› - CoordinatesType globalBegin; - - - IndexType Dimensions; - bool distributed; - - int rank; - int nproc; - - CoordinatesType domainDecomposition; - CoordinatesType subdomainCoordinates; - int numberOfLarger[2]; - + int getRankOfProcCoord(int x, int y) const; int neighbors[8]; - bool isSet; + }; } // namespace DistributedMeshes diff --git a/src/TNL/Meshes/DistributedMeshes/DistributedGrid_2D.hpp b/src/TNL/Meshes/DistributedMeshes/DistributedGrid_2D.hpp index 66982681e5..7341a9ce29 100644 --- a/src/TNL/Meshes/DistributedMeshes/DistributedGrid_2D.hpp +++ b/src/TNL/Meshes/DistributedMeshes/DistributedGrid_2D.hpp @@ -13,31 +13,10 @@ #include <TNL/Meshes/DistributedMeshes/DistributedGrid_2D.h> namespace TNL { - namespace Meshes { + namespace Meshes { namespace DistributedMeshes { -template< typename RealType, typename Device, typename Index > -DistributedMesh< Grid< 2, RealType, Device, Index > >:: -DistributedMesh() -: domainDecomposition( 0 ), isSet( false ) {} - -template< typename RealType, typename Device, typename Index > -void -DistributedMesh< Grid< 2, RealType, Device, Index > >:: -setDomainDecomposition( const CoordinatesType& domainDecomposition ) -{ - this->domainDecomposition = domainDecomposition; -} - -template< typename RealType, typename Device, typename Index > -const typename DistributedMesh< Grid< 2, RealType, Device, Index > >::CoordinatesType& -DistributedMesh< Grid< 2, RealType, Device, Index > >:: -getDomainDecomposition() const -{ - return this->domainDecomposition; -} - -template< typename RealType, typename Device, typename Index > +/*template< typename RealType, typename Device, typename Index > template< int EntityDimension > Index DistributedMesh< Grid< 2, RealType, Device, Index > >:: @@ -53,7 +32,7 @@ DistributedMesh< Grid< 2, RealType, Device, Index > >:: getEntitiesCount() const { return this->globalGrid. template getEntitiesCount< Entity >(); -} +}*/ template< typename RealType, typename Device, typename Index > bool @@ -74,126 +53,125 @@ setGlobalGrid( const GridType &globalGrid, const CoordinatesType& overlap ) { this->globalGrid = globalGrid; - isSet=true; + this->isSet=true; this->overlap=overlap; for( int i=0; i<8; i++ ) neighbors[i]=-1; - Dimensions= GridType::getMeshDimension(); - spaceSteps=globalGrid.getSpaceSteps(); - distributed=false; + this->Dimensions= GridType::getMeshDimension(); + this->spaceSteps=globalGrid.getSpaceSteps(); + this->distributed=false; if( CommunicatorType::IsInitialized() ) { - rank=CommunicatorType::GetRank(); + this->rank=CommunicatorType::GetRank(); this->nproc=CommunicatorType::GetSize(); //use MPI only if have more than one process if(this->nproc>1) { - distributed=true; + this->distributed=true; } } - if( !distributed ) + if( !this->distributed ) { - subdomainCoordinates[0]=0; - subdomainCoordinates[1]=0; - domainDecomposition[0]=1; - domainDecomposition[1]=1; - localOrigin=globalGrid.getOrigin(); - localGridSize=globalGrid.getDimensions(); - localSize=globalGrid.getDimensions(); - globalSize=globalGrid.getDimensions(); - globalBegin=CoordinatesType(0); - localBegin.x()=0; - localBegin.y()=0; + this->subdomainCoordinates[0]=0; + this->subdomainCoordinates[1]=0; + this->domainDecomposition[0]=1; + this->domainDecomposition[1]=1; + this->localOrigin=globalGrid.getOrigin(); + this->localGridSize=globalGrid.getDimensions(); + this->localSize=globalGrid.getDimensions(); + this->globalBegin=CoordinatesType(0); + this->localBegin.x()=0; + this->localBegin.y()=0; return; } else { + int numberOfLarger[2]; //compute node distribution int dims[ 2 ]; - dims[ 0 ] = domainDecomposition[ 0 ]; - dims[ 1 ] = domainDecomposition[ 1 ]; + dims[ 0 ] = this->domainDecomposition[ 0 ]; + dims[ 1 ] = this->domainDecomposition[ 1 ]; - CommunicatorType::DimsCreate( nproc, 2, dims ); - domainDecomposition[ 0 ] = dims[ 0 ]; - domainDecomposition[ 1 ] = dims[ 1 ]; + CommunicatorType::DimsCreate( this->nproc, 2, dims ); + this->domainDecomposition[ 0 ] = dims[ 0 ]; + this->domainDecomposition[ 1 ] = dims[ 1 ]; - subdomainCoordinates[ 0 ] = rank % domainDecomposition[ 0 ]; - subdomainCoordinates[ 1 ] = rank / domainDecomposition[ 0 ]; + this->subdomainCoordinates[ 0 ] = this->rank % this->domainDecomposition[ 0 ]; + this->subdomainCoordinates[ 1 ] = this->rank / this->domainDecomposition[ 0 ]; - //compute local mesh size - globalSize=globalGrid.getDimensions(); - numberOfLarger[0]=globalGrid.getDimensions().x()%domainDecomposition[0]; - numberOfLarger[1]=globalGrid.getDimensions().y()%domainDecomposition[1]; + //compute local mesh size + numberOfLarger[0]=globalGrid.getDimensions().x()%this->domainDecomposition[0]; + numberOfLarger[1]=globalGrid.getDimensions().y()%this->domainDecomposition[1]; - localSize.x()=(globalGrid.getDimensions().x()/domainDecomposition[0]); - localSize.y()=(globalGrid.getDimensions().y()/domainDecomposition[1]); + this->localSize.x()=(globalGrid.getDimensions().x()/this->domainDecomposition[0]); + this->localSize.y()=(globalGrid.getDimensions().y()/this->domainDecomposition[1]); - if(numberOfLarger[0]>subdomainCoordinates[0]) - localSize.x()+=1; - if(numberOfLarger[1]>subdomainCoordinates[1]) - localSize.y()+=1; + if(numberOfLarger[0]>this->subdomainCoordinates[0]) + this->localSize.x()+=1; + if(numberOfLarger[1]>this->subdomainCoordinates[1]) + this->localSize.y()+=1; - if(numberOfLarger[0]>subdomainCoordinates[0]) - globalBegin.x()=subdomainCoordinates[0]*localSize.x(); + if(numberOfLarger[0]>this->subdomainCoordinates[0]) + this->globalBegin.x()=this->subdomainCoordinates[0]*this->localSize.x(); else - globalBegin.x()=numberOfLarger[0]*(localSize.x()+1)+(subdomainCoordinates[0]-numberOfLarger[0])*localSize.x(); + this->globalBegin.x()=numberOfLarger[0]*(this->localSize.x()+1)+(this->subdomainCoordinates[0]-numberOfLarger[0])*this->localSize.x(); - if(numberOfLarger[1]>subdomainCoordinates[1]) - globalBegin.y()=subdomainCoordinates[1]*localSize.y(); + if(numberOfLarger[1]>this->subdomainCoordinates[1]) + this->globalBegin.y()=this->subdomainCoordinates[1]*this->localSize.y(); else - globalBegin.y()=numberOfLarger[1]*(localSize.y()+1)+(subdomainCoordinates[1]-numberOfLarger[1])*localSize.y(); + this->globalBegin.y()=numberOfLarger[1]*(this->localSize.y()+1)+(this->subdomainCoordinates[1]-numberOfLarger[1])*this->localSize.y(); - localOrigin=globalGrid.getOrigin()+TNL::Containers::tnlDotProduct(globalGrid.getSpaceSteps(),globalBegin-overlap); + this->localOrigin=globalGrid.getOrigin()+TNL::Containers::tnlDotProduct(globalGrid.getSpaceSteps(),this->globalBegin-this->overlap); //nearnodes - if(subdomainCoordinates[0]>0) - neighbors[Left]=getRankOfProcCoord(subdomainCoordinates[0]-1,subdomainCoordinates[1]); - if(subdomainCoordinates[0]<domainDecomposition[0]-1) - neighbors[Right]=getRankOfProcCoord(subdomainCoordinates[0]+1,subdomainCoordinates[1]); - if(subdomainCoordinates[1]>0) - neighbors[Up]=getRankOfProcCoord(subdomainCoordinates[0],subdomainCoordinates[1]-1); - if(subdomainCoordinates[1]<domainDecomposition[1]-1) - neighbors[Down]=getRankOfProcCoord(subdomainCoordinates[0],subdomainCoordinates[1]+1); - if(subdomainCoordinates[0]>0 && subdomainCoordinates[1]>0) - neighbors[UpLeft]=getRankOfProcCoord(subdomainCoordinates[0]-1,subdomainCoordinates[1]-1); - if(subdomainCoordinates[0]>0 && subdomainCoordinates[1]<domainDecomposition[1]-1) - neighbors[DownLeft]=getRankOfProcCoord(subdomainCoordinates[0]-1,subdomainCoordinates[1]+1); - if(subdomainCoordinates[0]<domainDecomposition[0]-1 && subdomainCoordinates[1]>0) - neighbors[UpRight]=getRankOfProcCoord(subdomainCoordinates[0]+1,subdomainCoordinates[1]-1); - if(subdomainCoordinates[0]<domainDecomposition[0]-1 && subdomainCoordinates[1]<domainDecomposition[1]-1) - neighbors[DownRight]=getRankOfProcCoord(subdomainCoordinates[0]+1,subdomainCoordinates[1]+1); - - localBegin=overlap; + if(this->subdomainCoordinates[0]>0) + neighbors[Left]=getRankOfProcCoord(this->subdomainCoordinates[0]-1,this->subdomainCoordinates[1]); + if(this->subdomainCoordinates[0]<this->domainDecomposition[0]-1) + neighbors[Right]=getRankOfProcCoord(this->subdomainCoordinates[0]+1,this->subdomainCoordinates[1]); + if(this->subdomainCoordinates[1]>0) + neighbors[Up]=getRankOfProcCoord(this->subdomainCoordinates[0],this->subdomainCoordinates[1]-1); + if(this->subdomainCoordinates[1]<this->domainDecomposition[1]-1) + neighbors[Down]=getRankOfProcCoord(this->subdomainCoordinates[0],this->subdomainCoordinates[1]+1); + if(this->subdomainCoordinates[0]>0 && this->subdomainCoordinates[1]>0) + neighbors[UpLeft]=getRankOfProcCoord(this->subdomainCoordinates[0]-1,this->subdomainCoordinates[1]-1); + if(this->subdomainCoordinates[0]>0 && this->subdomainCoordinates[1]<this->domainDecomposition[1]-1) + neighbors[DownLeft]=getRankOfProcCoord(this->subdomainCoordinates[0]-1,this->subdomainCoordinates[1]+1); + if(this->subdomainCoordinates[0]<this->domainDecomposition[0]-1 && this->subdomainCoordinates[1]>0) + neighbors[UpRight]=getRankOfProcCoord(this->subdomainCoordinates[0]+1,this->subdomainCoordinates[1]-1); + if(this->subdomainCoordinates[0]<this->domainDecomposition[0]-1 && this->subdomainCoordinates[1]<this->domainDecomposition[1]-1) + neighbors[DownRight]=getRankOfProcCoord(this->subdomainCoordinates[0]+1,this->subdomainCoordinates[1]+1); + + this->localBegin=this->overlap; if(neighbors[Left]==-1) { - localOrigin.x()+=overlap.x()*globalGrid.getSpaceSteps().x(); - localBegin.x()=0; + this->localOrigin.x()+=this->overlap.x()*globalGrid.getSpaceSteps().x(); + this->localBegin.x()=0; } if(neighbors[Up]==-1) { - localOrigin.y()+=overlap.y()*globalGrid.getSpaceSteps().y(); - localBegin.y()=0; + this->localOrigin.y()+=this->overlap.y()*globalGrid.getSpaceSteps().y(); + this->localBegin.y()=0; } - localGridSize=localSize; + this->localGridSize=this->localSize; //Add Overlaps if(neighbors[Left]!=-1) - localGridSize.x()+=overlap.x(); + this->localGridSize.x()+=this->overlap.x(); if(neighbors[Right]!=-1) - localGridSize.x()+=overlap.x(); + this->localGridSize.x()+=this->overlap.x(); if(neighbors[Up]!=-1) - localGridSize.y()+=overlap.y(); + this->localGridSize.y()+=this->overlap.y(); if(neighbors[Down]!=-1) - localGridSize.y()+=overlap.y(); + this->localGridSize.y()+=this->overlap.y(); } } @@ -202,11 +180,11 @@ void DistributedMesh< Grid< 2, RealType, Device, Index > >:: setupGrid( GridType& grid ) { - TNL_ASSERT_TRUE(isSet,"DistributedGrid is not set, but used by SetupGrid"); - grid.setOrigin( localOrigin ); - grid.setDimensions( localGridSize ); + TNL_ASSERT_TRUE(this->isSet,"DistributedGrid is not set, but used by SetupGrid"); + grid.setOrigin( this->localOrigin ); + grid.setDimensions( this->localGridSize ); //compute local proporions by sideefect - grid.setSpaceSteps( spaceSteps ); + grid.setSpaceSteps( this->spaceSteps ); grid.SetDistMesh(this); }; @@ -215,7 +193,7 @@ String DistributedMesh< Grid< 2, RealType, Device, Index > >:: printProcessCoords() const { - return convertToString(subdomainCoordinates[0])+String("-")+convertToString(subdomainCoordinates[1]); + return convertToString(this->subdomainCoordinates[0])+String("-")+convertToString(this->subdomainCoordinates[1]); }; template< typename RealType, typename Device, typename Index > @@ -223,74 +201,18 @@ String DistributedMesh< Grid< 2, RealType, Device, Index > >:: printProcessDistr() const { - return convertToString(domainDecomposition[0])+String("-")+convertToString(domainDecomposition[1]); + return convertToString(this->domainDecomposition[0])+String("-")+convertToString(this->domainDecomposition[1]); }; -template< typename RealType, typename Device, typename Index > -bool -DistributedMesh< Grid< 2, RealType, Device, Index > >:: -isDistributed() const -{ - return this->distributed; -}; - -template< typename RealType, typename Device, typename Index > -const typename DistributedMesh< Grid< 2, RealType, Device, Index > >::CoordinatesType& -DistributedMesh< Grid< 2, RealType, Device, Index > >:: -getOverlap() const -{ - return this->overlap; -}; - template< typename RealType, typename Device, typename Index > const int* DistributedMesh< Grid< 2, RealType, Device, Index > >:: getNeighbors() const { - TNL_ASSERT_TRUE(isSet,"DistributedGrid is not set, but used by getNeighbors"); + TNL_ASSERT_TRUE(this->isSet,"DistributedGrid is not set, but used by getNeighbors"); return this->neighbors; } -template< typename RealType, typename Device, typename Index > -const typename DistributedMesh< Grid< 2, RealType, Device, Index > >::CoordinatesType& -DistributedMesh< Grid< 2, RealType, Device, Index > >:: -getLocalSize() const -{ - return this->localSize; -} - -template< typename RealType, typename Device, typename Index > -const typename DistributedMesh< Grid< 2, RealType, Device, Index > >::CoordinatesType& -DistributedMesh< Grid< 2, RealType, Device, Index > >:: -getGlobalSize() const -{ - return this->globalSize; -} - -template< typename RealType, typename Device, typename Index > -const typename DistributedMesh< Grid< 2, RealType, Device, Index > >::CoordinatesType& -DistributedMesh< Grid< 2, RealType, Device, Index > >:: -getGlobalBegin() const -{ - return this->globalBegin; -} - -template< typename RealType, typename Device, typename Index > -const typename DistributedMesh< Grid< 2, RealType, Device, Index > >::CoordinatesType& -DistributedMesh< Grid< 2, RealType, Device, Index > >:: -getLocalGridSize() const -{ - return this->localGridSize; -} - -template< typename RealType, typename Device, typename Index > -const typename DistributedMesh< Grid< 2, RealType, Device, Index > >::CoordinatesType& -DistributedMesh< Grid< 2, RealType, Device, Index > >:: -getLocalBegin() const -{ - return this->localBegin; -} - template< typename RealType, typename Device, typename Index > void DistributedMesh< Grid< 2, RealType, Device, Index > >:: @@ -304,7 +226,7 @@ int DistributedMesh< Grid< 2, RealType, Device, Index > >:: getRankOfProcCoord(int x, int y) const { - return y*domainDecomposition[0]+x; + return y*this->domainDecomposition[0]+x; } } //namespace DistributedMeshes diff --git a/src/TNL/Meshes/DistributedMeshes/DistributedGrid_3D.h b/src/TNL/Meshes/DistributedMeshes/DistributedGrid_3D.h index d700ee9f6a..8d258da748 100644 --- a/src/TNL/Meshes/DistributedMeshes/DistributedGrid_3D.h +++ b/src/TNL/Meshes/DistributedMeshes/DistributedGrid_3D.h @@ -27,34 +27,28 @@ enum Directions3D { West = 0 , East = 1 , North = 2, South=3, Top =4, Bottom=5, template< typename RealType, typename Device, typename Index > -class DistributedMesh<Grid< 3, RealType, Device, Index >> +class DistributedMesh<Grid< 3, RealType, Device, Index >> : public DistributedGrid_Base<3, RealType, Device, Index > { public: - typedef Index IndexType; - typedef Grid< 3, RealType, Device, IndexType > GridType; - typedef typename GridType::PointType PointType; - typedef Containers::StaticVector< 3, IndexType > CoordinatesType; + using typename DistributedGrid_Base<3, RealType, Device, Index >::IndexType; + using typename DistributedGrid_Base<3, RealType, Device, Index >::GridType; + using typename DistributedGrid_Base<3, RealType, Device, Index >::PointType; + using typename DistributedGrid_Base<3, RealType, Device, Index >::CoordinatesType; static constexpr int getMeshDimension() { return 3; }; - - DistributedMesh(); static void configSetup( Config::ConfigDescription& config ); bool setup( const Config::ParameterContainer& parameters, const String& prefix ); - - void setDomainDecomposition( const CoordinatesType& domainDecomposition ); - - const CoordinatesType& getDomainDecomposition() const; - - template< int EntityDimension > + +/* template< int EntityDimension > IndexType getEntitiesCount() const; template< typename Entity > - IndexType getEntitiesCount() const; + IndexType getEntitiesCount() const; */ template< typename CommunicatorType > void setGlobalGrid( const GridType& globalGrid, @@ -66,54 +60,15 @@ class DistributedMesh<Grid< 3, RealType, Device, Index >> String printProcessDistr() const; - bool isDistributed() const; - - const CoordinatesType& getOverlap() const; - const int* getNeighbors() const; - const CoordinatesType& getLocalSize() const; - - const CoordinatesType& getLocalGridSize() const; - - const CoordinatesType& getLocalBegin() const; - - //number of elements of global grid - const CoordinatesType& getGlobalSize() const; - - //coordinates of begin of local subdomain without overlaps in global grid - const CoordinatesType& getGlobalBegin() const; - void writeProlog( Logger& logger ); private: - int getRankOfProcCoord(int x, int y, int z) const; - - GridType globalGrid; - - PointType spaceSteps; - PointType localOrigin; - CoordinatesType localSize; - CoordinatesType localGridSize; - CoordinatesType localBegin; - CoordinatesType overlap; - CoordinatesType globalSize; - CoordinatesType globalBegin; - - IndexType Dimensions; - bool distributed; - - int rank; - int nproc; - - CoordinatesType domainDecomposition; - CoordinatesType subdomainCoordinates; - int numberOfLarger[3]; - + int getRankOfProcCoord(int x, int y, int z) const; int neighbors[26]; - bool isSet; }; } // namespace DistributedMeshes diff --git a/src/TNL/Meshes/DistributedMeshes/DistributedGrid_3D.hpp b/src/TNL/Meshes/DistributedMeshes/DistributedGrid_3D.hpp index c7527fd264..a648df8be2 100644 --- a/src/TNL/Meshes/DistributedMeshes/DistributedGrid_3D.hpp +++ b/src/TNL/Meshes/DistributedMeshes/DistributedGrid_3D.hpp @@ -16,11 +16,6 @@ namespace TNL { namespace Meshes { namespace DistributedMeshes { -template< typename RealType, typename Device, typename Index > -DistributedMesh< Grid< 3, RealType, Device, Index > >:: -DistributedMesh() -: domainDecomposition( 0 ), isSet( false ) {} - template< typename RealType, typename Device, typename Index > void DistributedMesh< Grid< 3, RealType, Device, Index > >:: @@ -43,23 +38,7 @@ setup( const Config::ParameterContainer& parameters, return true; } -template< typename RealType, typename Device, typename Index > -void -DistributedMesh< Grid< 3, RealType, Device, Index > >:: -setDomainDecomposition( const CoordinatesType& domainDecomposition ) -{ - this->domainDecomposition = domainDecomposition; -} - -template< typename RealType, typename Device, typename Index > -const typename DistributedMesh< Grid< 3, RealType, Device, Index > >::CoordinatesType& -DistributedMesh< Grid< 3, RealType, Device, Index > >:: -getDomainDecomposition() const -{ - return this->domainDecomposition; -} - -template< typename RealType, typename Device, typename Index > +/*template< typename RealType, typename Device, typename Index > template< int EntityDimension > Index DistributedMesh< Grid< 3, RealType, Device, Index > >:: @@ -75,7 +54,7 @@ DistributedMesh< Grid< 3, RealType, Device, Index > >:: getEntitiesCount() const { return this->globalGrid. template getEntitiesCount< Entity >(); -} +}*/ template< typename RealType, typename Device, typename Index > template< typename CommunicatorType > @@ -85,46 +64,45 @@ setGlobalGrid( const GridType &globalGrid, const CoordinatesType& overlap ) { this->globalGrid = globalGrid; - isSet=true; + this->isSet=true; this->overlap=overlap; for (int i=0;i<26;i++) neighbors[i]=-1; - Dimensions= GridType::getMeshDimension(); - spaceSteps=globalGrid.getSpaceSteps(); + this->Dimensions= GridType::getMeshDimension(); + this->spaceSteps=globalGrid.getSpaceSteps(); - distributed=false; + this->distributed=false; if(CommunicatorType::IsInitialized()) { - rank=CommunicatorType::GetRank(); + this->rank=CommunicatorType::GetRank(); this->nproc=CommunicatorType::GetSize(); //use MPI only if have more than one process if(this->nproc>1) { - distributed=true; + this->distributed=true; } } - if(!distributed) + if(!this->distributed) { //Without MPI - subdomainCoordinates[0]=0; - subdomainCoordinates[1]=0; - subdomainCoordinates[2]=0; - - domainDecomposition[0]=1; - domainDecomposition[1]=1; - domainDecomposition[2]=1; - - localOrigin=globalGrid.getOrigin(); - localSize=globalGrid.getDimensions(); - globalSize=globalGrid.getDimensions(); - localGridSize=localSize; - globalBegin=CoordinatesType(0); + this->subdomainCoordinates[0]=0; + this->subdomainCoordinates[1]=0; + this->subdomainCoordinates[2]=0; + + this->domainDecomposition[0]=1; + this->domainDecomposition[1]=1; + this->domainDecomposition[2]=1; + + this->localOrigin=globalGrid.getOrigin(); + this->localSize=globalGrid.getDimensions(); + this->localGridSize=this->localSize; + this->globalBegin=CoordinatesType(0); return; } else @@ -132,148 +110,148 @@ setGlobalGrid( const GridType &globalGrid, //With MPI //compute node distribution int dims[ 3 ]; - dims[ 0 ] = domainDecomposition[ 0 ]; - dims[ 1 ] = domainDecomposition[ 1 ]; - dims[ 2 ] = domainDecomposition[ 2 ]; - - CommunicatorType::DimsCreate( nproc, 3, dims ); - domainDecomposition[ 0 ] = dims[ 0 ]; - domainDecomposition[ 1 ] = dims[ 1 ]; - domainDecomposition[ 2 ] = dims[ 2 ]; - - subdomainCoordinates[ 2 ] = rank / ( domainDecomposition[0] * domainDecomposition[1] ); - subdomainCoordinates[ 1 ] = ( rank % ( domainDecomposition[0] * domainDecomposition[1] ) ) / domainDecomposition[0]; - subdomainCoordinates[ 0 ] = ( rank % ( domainDecomposition[0] * domainDecomposition[1] ) ) % domainDecomposition[0]; - - //compute local mesh size - globalSize=globalGrid.getDimensions(); - numberOfLarger[0]=globalGrid.getDimensions().x()%domainDecomposition[0]; - numberOfLarger[1]=globalGrid.getDimensions().y()%domainDecomposition[1]; - numberOfLarger[2]=globalGrid.getDimensions().z()%domainDecomposition[2]; - - localSize.x()=(globalGrid.getDimensions().x()/domainDecomposition[0]); - localSize.y()=(globalGrid.getDimensions().y()/domainDecomposition[1]); - localSize.z()=(globalGrid.getDimensions().z()/domainDecomposition[2]); - - if(numberOfLarger[0]>subdomainCoordinates[0]) - localSize.x()+=1; - if(numberOfLarger[1]>subdomainCoordinates[1]) - localSize.y()+=1; - if(numberOfLarger[2]>subdomainCoordinates[2]) - localSize.z()+=1; - - if(numberOfLarger[0]>subdomainCoordinates[0]) - globalBegin.x()=subdomainCoordinates[0]*localSize.x(); + int numberOfLarger[3]; + dims[ 0 ] = this->domainDecomposition[ 0 ]; + dims[ 1 ] = this->domainDecomposition[ 1 ]; + dims[ 2 ] = this->domainDecomposition[ 2 ]; + + CommunicatorType::DimsCreate( this->nproc, 3, dims ); + this->domainDecomposition[ 0 ] = dims[ 0 ]; + this->domainDecomposition[ 1 ] = dims[ 1 ]; + this->domainDecomposition[ 2 ] = dims[ 2 ]; + + this->subdomainCoordinates[ 2 ] = this->rank / ( this->domainDecomposition[0] * this->domainDecomposition[1] ); + this->subdomainCoordinates[ 1 ] = ( this->rank % ( this->domainDecomposition[0] * this->domainDecomposition[1] ) ) / this->domainDecomposition[0]; + this->subdomainCoordinates[ 0 ] = ( this->rank % ( this->domainDecomposition[0] * this->domainDecomposition[1] ) ) % this->domainDecomposition[0]; + + //compute local mesh size + numberOfLarger[0]=globalGrid.getDimensions().x()%this->domainDecomposition[0]; + numberOfLarger[1]=globalGrid.getDimensions().y()%this->domainDecomposition[1]; + numberOfLarger[2]=globalGrid.getDimensions().z()%this->domainDecomposition[2]; + + this->localSize.x()=(globalGrid.getDimensions().x()/this->domainDecomposition[0]); + this->localSize.y()=(globalGrid.getDimensions().y()/this->domainDecomposition[1]); + this->localSize.z()=(globalGrid.getDimensions().z()/this->domainDecomposition[2]); + + if(numberOfLarger[0]>this->subdomainCoordinates[0]) + this->localSize.x()+=1; + if(numberOfLarger[1]>this->subdomainCoordinates[1]) + this->localSize.y()+=1; + if(numberOfLarger[2]>this->subdomainCoordinates[2]) + this->localSize.z()+=1; + + if(numberOfLarger[0]>this->subdomainCoordinates[0]) + this->globalBegin.x()=this->subdomainCoordinates[0]*this->localSize.x(); else - globalBegin.x()=numberOfLarger[0]*(localSize.x()+1)+(subdomainCoordinates[0]-numberOfLarger[0])*localSize.x(); + this->globalBegin.x()=numberOfLarger[0]*(this->localSize.x()+1)+(this->subdomainCoordinates[0]-numberOfLarger[0])*this->localSize.x(); - if(numberOfLarger[1]>subdomainCoordinates[1]) - globalBegin.y()=subdomainCoordinates[1]*localSize.y(); + if(numberOfLarger[1]>this->subdomainCoordinates[1]) + this->globalBegin.y()=this->subdomainCoordinates[1]*this->localSize.y(); else - globalBegin.y()=numberOfLarger[1]*(localSize.y()+1)+(subdomainCoordinates[1]-numberOfLarger[1])*localSize.y(); + this->globalBegin.y()=numberOfLarger[1]*(this->localSize.y()+1)+(this->subdomainCoordinates[1]-numberOfLarger[1])*this->localSize.y(); - if(numberOfLarger[2]>subdomainCoordinates[2]) - globalBegin.z()=subdomainCoordinates[2]*localSize.z(); + if(numberOfLarger[2]>this->subdomainCoordinates[2]) + this->globalBegin.z()=this->subdomainCoordinates[2]*this->localSize.z(); else - globalBegin.z()=numberOfLarger[2]*(localSize.z()+1)+(subdomainCoordinates[2]-numberOfLarger[2])*localSize.z(); + this->globalBegin.z()=numberOfLarger[2]*(this->localSize.z()+1)+(this->subdomainCoordinates[2]-numberOfLarger[2])*this->localSize.z(); - localOrigin=globalGrid.getOrigin()+TNL::Containers::tnlDotProduct(globalGrid.getSpaceSteps(),globalBegin-overlap); + this->localOrigin=globalGrid.getOrigin()+TNL::Containers::tnlDotProduct(globalGrid.getSpaceSteps(),this->globalBegin-this->overlap); //nearnodes //X Y Z - if(subdomainCoordinates[0]>0) - neighbors[West]=getRankOfProcCoord(subdomainCoordinates[0]-1,subdomainCoordinates[1],subdomainCoordinates[2]); - if(subdomainCoordinates[0]<domainDecomposition[0]-1) - neighbors[East]=getRankOfProcCoord(subdomainCoordinates[0]+1,subdomainCoordinates[1],subdomainCoordinates[2]); - if(subdomainCoordinates[1]>0) - neighbors[North]=getRankOfProcCoord(subdomainCoordinates[0],subdomainCoordinates[1]-1,subdomainCoordinates[2]); - if(subdomainCoordinates[1]<domainDecomposition[1]-1) - neighbors[South]=getRankOfProcCoord(subdomainCoordinates[0],subdomainCoordinates[1]+1,subdomainCoordinates[2]); - if(subdomainCoordinates[2]>0) - neighbors[Bottom]=getRankOfProcCoord(subdomainCoordinates[0],subdomainCoordinates[1],subdomainCoordinates[2]-1); - if(subdomainCoordinates[2]<domainDecomposition[2]-1) - neighbors[Top]=getRankOfProcCoord(subdomainCoordinates[0],subdomainCoordinates[1],subdomainCoordinates[2]+1); + if(this->subdomainCoordinates[0]>0) + neighbors[West]=getRankOfProcCoord(this->subdomainCoordinates[0]-1,this->subdomainCoordinates[1],this->subdomainCoordinates[2]); + if(this->subdomainCoordinates[0]<this->domainDecomposition[0]-1) + neighbors[East]=getRankOfProcCoord(this->subdomainCoordinates[0]+1,this->subdomainCoordinates[1],this->subdomainCoordinates[2]); + if(this->subdomainCoordinates[1]>0) + neighbors[North]=getRankOfProcCoord(this->subdomainCoordinates[0],this->subdomainCoordinates[1]-1,this->subdomainCoordinates[2]); + if(this->subdomainCoordinates[1]<this->domainDecomposition[1]-1) + neighbors[South]=getRankOfProcCoord(this->subdomainCoordinates[0],this->subdomainCoordinates[1]+1,this->subdomainCoordinates[2]); + if(this->subdomainCoordinates[2]>0) + neighbors[Bottom]=getRankOfProcCoord(this->subdomainCoordinates[0],this->subdomainCoordinates[1],this->subdomainCoordinates[2]-1); + if(this->subdomainCoordinates[2]<this->domainDecomposition[2]-1) + neighbors[Top]=getRankOfProcCoord(this->subdomainCoordinates[0],this->subdomainCoordinates[1],this->subdomainCoordinates[2]+1); //XY - if(subdomainCoordinates[0]>0 && subdomainCoordinates[1]>0) - neighbors[NorthWest]=getRankOfProcCoord(subdomainCoordinates[0]-1,subdomainCoordinates[1]-1,subdomainCoordinates[2]); - if(subdomainCoordinates[0]<domainDecomposition[0]-1 && subdomainCoordinates[1]>0) - neighbors[NorthEast]=getRankOfProcCoord(subdomainCoordinates[0]+1,subdomainCoordinates[1]-1,subdomainCoordinates[2]); - if(subdomainCoordinates[0]>0 && subdomainCoordinates[1]<domainDecomposition[1]-1) - neighbors[SouthWest]=getRankOfProcCoord(subdomainCoordinates[0]-1,subdomainCoordinates[1]+1,subdomainCoordinates[2]); - if(subdomainCoordinates[0]<domainDecomposition[0]-1 && subdomainCoordinates[1]<domainDecomposition[1]-1) - neighbors[SouthEast]=getRankOfProcCoord(subdomainCoordinates[0]+1,subdomainCoordinates[1]+1,subdomainCoordinates[2]); + if(this->subdomainCoordinates[0]>0 && this->subdomainCoordinates[1]>0) + neighbors[NorthWest]=getRankOfProcCoord(this->subdomainCoordinates[0]-1,this->subdomainCoordinates[1]-1,this->subdomainCoordinates[2]); + if(this->subdomainCoordinates[0]<this->domainDecomposition[0]-1 && this->subdomainCoordinates[1]>0) + neighbors[NorthEast]=getRankOfProcCoord(this->subdomainCoordinates[0]+1,this->subdomainCoordinates[1]-1,this->subdomainCoordinates[2]); + if(this->subdomainCoordinates[0]>0 && this->subdomainCoordinates[1]<this->domainDecomposition[1]-1) + neighbors[SouthWest]=getRankOfProcCoord(this->subdomainCoordinates[0]-1,this->subdomainCoordinates[1]+1,this->subdomainCoordinates[2]); + if(this->subdomainCoordinates[0]<this->domainDecomposition[0]-1 && this->subdomainCoordinates[1]<this->domainDecomposition[1]-1) + neighbors[SouthEast]=getRankOfProcCoord(this->subdomainCoordinates[0]+1,this->subdomainCoordinates[1]+1,this->subdomainCoordinates[2]); //XZ - if(subdomainCoordinates[0]>0 && subdomainCoordinates[2]>0) - neighbors[BottomWest]=getRankOfProcCoord(subdomainCoordinates[0]-1,subdomainCoordinates[1],subdomainCoordinates[2]-1); - if(subdomainCoordinates[0]<domainDecomposition[0]-1 && subdomainCoordinates[2]>0) - neighbors[BottomEast]=getRankOfProcCoord(subdomainCoordinates[0]+1,subdomainCoordinates[1],subdomainCoordinates[2]-1); - if(subdomainCoordinates[0]>0 && subdomainCoordinates[2]<domainDecomposition[2]-1) - neighbors[TopWest]=getRankOfProcCoord(subdomainCoordinates[0]-1,subdomainCoordinates[1],subdomainCoordinates[2]+1); - if(subdomainCoordinates[0]<domainDecomposition[0]-1 && subdomainCoordinates[2]<domainDecomposition[2]-1) - neighbors[TopEast]=getRankOfProcCoord(subdomainCoordinates[0]+1,subdomainCoordinates[1],subdomainCoordinates[2]+1); + if(this->subdomainCoordinates[0]>0 && this->subdomainCoordinates[2]>0) + neighbors[BottomWest]=getRankOfProcCoord(this->subdomainCoordinates[0]-1,this->subdomainCoordinates[1],this->subdomainCoordinates[2]-1); + if(this->subdomainCoordinates[0]<this->domainDecomposition[0]-1 && this->subdomainCoordinates[2]>0) + neighbors[BottomEast]=getRankOfProcCoord(this->subdomainCoordinates[0]+1,this->subdomainCoordinates[1],this->subdomainCoordinates[2]-1); + if(this->subdomainCoordinates[0]>0 && this->subdomainCoordinates[2]<this->domainDecomposition[2]-1) + neighbors[TopWest]=getRankOfProcCoord(this->subdomainCoordinates[0]-1,this->subdomainCoordinates[1],this->subdomainCoordinates[2]+1); + if(this->subdomainCoordinates[0]<this->domainDecomposition[0]-1 && this->subdomainCoordinates[2]<this->domainDecomposition[2]-1) + neighbors[TopEast]=getRankOfProcCoord(this->subdomainCoordinates[0]+1,this->subdomainCoordinates[1],this->subdomainCoordinates[2]+1); //YZ - if(subdomainCoordinates[1]>0 && subdomainCoordinates[2]>0) - neighbors[BottomNorth]=getRankOfProcCoord(subdomainCoordinates[0],subdomainCoordinates[1]-1,subdomainCoordinates[2]-1); - if(subdomainCoordinates[1]<domainDecomposition[1]-1 && subdomainCoordinates[2]>0) - neighbors[BottomSouth]=getRankOfProcCoord(subdomainCoordinates[0],subdomainCoordinates[1]+1,subdomainCoordinates[2]-1); - if(subdomainCoordinates[1]>0 && subdomainCoordinates[2]<domainDecomposition[2]-1) - neighbors[TopNorth]=getRankOfProcCoord(subdomainCoordinates[0],subdomainCoordinates[1]-1,subdomainCoordinates[2]+1); - if(subdomainCoordinates[1]<domainDecomposition[1]-1 && subdomainCoordinates[2]<domainDecomposition[2]-1) - neighbors[TopSouth]=getRankOfProcCoord(subdomainCoordinates[0],subdomainCoordinates[1]+1,subdomainCoordinates[2]+1); + if(this->subdomainCoordinates[1]>0 && this->subdomainCoordinates[2]>0) + neighbors[BottomNorth]=getRankOfProcCoord(this->subdomainCoordinates[0],this->subdomainCoordinates[1]-1,this->subdomainCoordinates[2]-1); + if(this->subdomainCoordinates[1]<this->domainDecomposition[1]-1 && this->subdomainCoordinates[2]>0) + neighbors[BottomSouth]=getRankOfProcCoord(this->subdomainCoordinates[0],this->subdomainCoordinates[1]+1,this->subdomainCoordinates[2]-1); + if(this->subdomainCoordinates[1]>0 && this->subdomainCoordinates[2]<this->domainDecomposition[2]-1) + neighbors[TopNorth]=getRankOfProcCoord(this->subdomainCoordinates[0],this->subdomainCoordinates[1]-1,this->subdomainCoordinates[2]+1); + if(this->subdomainCoordinates[1]<this->domainDecomposition[1]-1 && this->subdomainCoordinates[2]<this->domainDecomposition[2]-1) + neighbors[TopSouth]=getRankOfProcCoord(this->subdomainCoordinates[0],this->subdomainCoordinates[1]+1,this->subdomainCoordinates[2]+1); //XYZ - if(subdomainCoordinates[0]>0 && subdomainCoordinates[1]>0 && subdomainCoordinates[2]>0 ) - neighbors[BottomNorthWest]=getRankOfProcCoord(subdomainCoordinates[0]-1,subdomainCoordinates[1]-1,subdomainCoordinates[2]-1); - if(subdomainCoordinates[0]<domainDecomposition[0]-1 && subdomainCoordinates[1]>0 && subdomainCoordinates[2]>0 ) - neighbors[BottomNorthEast]=getRankOfProcCoord(subdomainCoordinates[0]+1,subdomainCoordinates[1]-1,subdomainCoordinates[2]-1); - if(subdomainCoordinates[0]>0 && subdomainCoordinates[1]<domainDecomposition[1]-1 && subdomainCoordinates[2]>0 ) - neighbors[BottomSouthWest]=getRankOfProcCoord(subdomainCoordinates[0]-1,subdomainCoordinates[1]+1,subdomainCoordinates[2]-1); - if(subdomainCoordinates[0]<domainDecomposition[0]-1 && subdomainCoordinates[1]<domainDecomposition[1]-1 && subdomainCoordinates[2]>0 ) - neighbors[BottomSouthEast]=getRankOfProcCoord(subdomainCoordinates[0]+1,subdomainCoordinates[1]+1,subdomainCoordinates[2]-1); - if(subdomainCoordinates[0]>0 && subdomainCoordinates[1]>0 && subdomainCoordinates[2]<domainDecomposition[2]-1 ) - neighbors[TopNorthWest]=getRankOfProcCoord(subdomainCoordinates[0]-1,subdomainCoordinates[1]-1,subdomainCoordinates[2]+1); - if(subdomainCoordinates[0]<domainDecomposition[0]-1 && subdomainCoordinates[1]>0 && subdomainCoordinates[2]<domainDecomposition[2]-1 ) - neighbors[TopNorthEast]=getRankOfProcCoord(subdomainCoordinates[0]+1,subdomainCoordinates[1]-1,subdomainCoordinates[2]+1); - if(subdomainCoordinates[0]>0 && subdomainCoordinates[1]<domainDecomposition[1]-1 && subdomainCoordinates[2]<domainDecomposition[2]-1 ) - neighbors[TopSouthWest]=getRankOfProcCoord(subdomainCoordinates[0]-1,subdomainCoordinates[1]+1,subdomainCoordinates[2]+1); - if(subdomainCoordinates[0]<domainDecomposition[0]-1 && subdomainCoordinates[1]<domainDecomposition[1]-1 && subdomainCoordinates[2]<domainDecomposition[2]-1 ) - neighbors[TopSouthEast]=getRankOfProcCoord(subdomainCoordinates[0]+1,subdomainCoordinates[1]+1,subdomainCoordinates[2]+1); - - - localBegin=overlap; + if(this->subdomainCoordinates[0]>0 && this->subdomainCoordinates[1]>0 && this->subdomainCoordinates[2]>0 ) + neighbors[BottomNorthWest]=getRankOfProcCoord(this->subdomainCoordinates[0]-1,this->subdomainCoordinates[1]-1,this->subdomainCoordinates[2]-1); + if(this->subdomainCoordinates[0]<this->domainDecomposition[0]-1 && this->subdomainCoordinates[1]>0 && this->subdomainCoordinates[2]>0 ) + neighbors[BottomNorthEast]=getRankOfProcCoord(this->subdomainCoordinates[0]+1,this->subdomainCoordinates[1]-1,this->subdomainCoordinates[2]-1); + if(this->subdomainCoordinates[0]>0 && this->subdomainCoordinates[1]<this->domainDecomposition[1]-1 && this->subdomainCoordinates[2]>0 ) + neighbors[BottomSouthWest]=getRankOfProcCoord(this->subdomainCoordinates[0]-1,this->subdomainCoordinates[1]+1,this->subdomainCoordinates[2]-1); + if(this->subdomainCoordinates[0]<this->domainDecomposition[0]-1 && this->subdomainCoordinates[1]<this->domainDecomposition[1]-1 && this->subdomainCoordinates[2]>0 ) + neighbors[BottomSouthEast]=getRankOfProcCoord(this->subdomainCoordinates[0]+1,this->subdomainCoordinates[1]+1,this->subdomainCoordinates[2]-1); + if(this->subdomainCoordinates[0]>0 && this->subdomainCoordinates[1]>0 && this->subdomainCoordinates[2]<this->domainDecomposition[2]-1 ) + neighbors[TopNorthWest]=getRankOfProcCoord(this->subdomainCoordinates[0]-1,this->subdomainCoordinates[1]-1,this->subdomainCoordinates[2]+1); + if(this->subdomainCoordinates[0]<this->domainDecomposition[0]-1 && this->subdomainCoordinates[1]>0 && this->subdomainCoordinates[2]<this->domainDecomposition[2]-1 ) + neighbors[TopNorthEast]=getRankOfProcCoord(this->subdomainCoordinates[0]+1,this->subdomainCoordinates[1]-1,this->subdomainCoordinates[2]+1); + if(this->subdomainCoordinates[0]>0 && this->subdomainCoordinates[1]<this->domainDecomposition[1]-1 && this->subdomainCoordinates[2]<this->domainDecomposition[2]-1 ) + neighbors[TopSouthWest]=getRankOfProcCoord(this->subdomainCoordinates[0]-1,this->subdomainCoordinates[1]+1,this->subdomainCoordinates[2]+1); + if(this->subdomainCoordinates[0]<this->domainDecomposition[0]-1 && this->subdomainCoordinates[1]<this->domainDecomposition[1]-1 && this->subdomainCoordinates[2]<this->domainDecomposition[2]-1 ) + neighbors[TopSouthEast]=getRankOfProcCoord(this->subdomainCoordinates[0]+1,this->subdomainCoordinates[1]+1,this->subdomainCoordinates[2]+1); + + + this->localBegin=this->overlap; if(neighbors[West]==-1) { - localOrigin.x()+=overlap.x()*globalGrid.getSpaceSteps().x(); - localBegin.x()=0; + this->localOrigin.x()+=this->overlap.x()*globalGrid.getSpaceSteps().x(); + this->localBegin.x()=0; } if(neighbors[North]==-1) { - localOrigin.y()+=overlap.y()*globalGrid.getSpaceSteps().y(); - localBegin.y()=0; + this->localOrigin.y()+=this->overlap.y()*globalGrid.getSpaceSteps().y(); + this->localBegin.y()=0; } if(neighbors[Bottom]==-1) { - localOrigin.z()+=overlap.z()*globalGrid.getSpaceSteps().z(); - localBegin.z()=0; + this->localOrigin.z()+=this->overlap.z()*globalGrid.getSpaceSteps().z(); + this->localBegin.z()=0; } - localGridSize=localSize; + this->localGridSize=this->localSize; if(neighbors[West]!=-1) - localGridSize.x()+=overlap.x(); + this->localGridSize.x()+=this->overlap.x(); if(neighbors[East]!=-1) - localGridSize.x()+=overlap.x(); + this->localGridSize.x()+=this->overlap.x(); if(neighbors[North]!=-1) - localGridSize.y()+=overlap.y(); + this->localGridSize.y()+=this->overlap.y(); if(neighbors[South]!=-1) - localGridSize.y()+=overlap.y(); + this->localGridSize.y()+=this->overlap.y(); if(neighbors[Bottom]!=-1) - localGridSize.z()+=overlap.z(); + this->localGridSize.z()+=this->overlap.z(); if(neighbors[Top]!=-1) - localGridSize.z()+=overlap.z(); + this->localGridSize.z()+=this->overlap.z(); } } @@ -282,11 +260,11 @@ void DistributedMesh< Grid< 3, RealType, Device, Index > >:: setupGrid( GridType& grid) { - TNL_ASSERT_TRUE(isSet,"DistributedGrid is not set, but used by SetupGrid"); - grid.setOrigin(localOrigin); - grid.setDimensions(localGridSize); + TNL_ASSERT_TRUE(this->isSet,"DistributedGrid is not set, but used by SetupGrid"); + grid.setOrigin(this->localOrigin); + grid.setDimensions(this->localGridSize); //compute local proportions by side efect - grid.setSpaceSteps(spaceSteps); + grid.setSpaceSteps(this->spaceSteps); grid.SetDistMesh(this); }; @@ -295,7 +273,7 @@ String DistributedMesh< Grid< 3, RealType, Device, Index > >:: printProcessCoords() const { - return convertToString(subdomainCoordinates[0])+String("-")+convertToString(subdomainCoordinates[1])+String("-")+convertToString(subdomainCoordinates[2]); + return convertToString(this->subdomainCoordinates[0])+String("-")+convertToString(this->subdomainCoordinates[1])+String("-")+convertToString(this->subdomainCoordinates[2]); }; template< typename RealType, typename Device, typename Index > @@ -303,74 +281,18 @@ String DistributedMesh< Grid< 3, RealType, Device, Index > >:: printProcessDistr() const { - return convertToString(domainDecomposition[0])+String("-")+convertToString(domainDecomposition[1])+String("-")+convertToString(domainDecomposition[2]); + return convertToString(this->domainDecomposition[0])+String("-")+convertToString(this->domainDecomposition[1])+String("-")+convertToString(this->domainDecomposition[2]); }; -template< typename RealType, typename Device, typename Index > -bool -DistributedMesh< Grid< 3, RealType, Device, Index > >:: -isDistributed() const -{ - return this->distributed; -}; - -template< typename RealType, typename Device, typename Index > -const typename DistributedMesh< Grid< 3, RealType, Device, Index > >::CoordinatesType& -DistributedMesh< Grid< 3, RealType, Device, Index > >:: -getOverlap() const -{ - return this->overlap; -}; - template< typename RealType, typename Device, typename Index > const int* DistributedMesh< Grid< 3, RealType, Device, Index > >:: getNeighbors() const { - TNL_ASSERT_TRUE(isSet,"DistributedGrid is not set, but used by getNeighbors"); + TNL_ASSERT_TRUE(this->isSet,"DistributedGrid is not set, but used by getNeighbors"); return this->neighbors; } -template< typename RealType, typename Device, typename Index > -const typename DistributedMesh< Grid< 3, RealType, Device, Index > >::CoordinatesType& -DistributedMesh< Grid< 3, RealType, Device, Index > >:: -getLocalSize() const -{ - return this->localSize; -} - -template< typename RealType, typename Device, typename Index > -const typename DistributedMesh< Grid< 3, RealType, Device, Index > >::CoordinatesType& -DistributedMesh< Grid< 3, RealType, Device, Index > >:: -getLocalGridSize() const -{ - return this->localGridSize; -} - -template< typename RealType, typename Device, typename Index > -const typename DistributedMesh< Grid< 3, RealType, Device, Index > >::CoordinatesType& -DistributedMesh< Grid< 3, RealType, Device, Index > >:: -getLocalBegin() const -{ - return this->localBegin; -} - -template< typename RealType, typename Device, typename Index > -const typename DistributedMesh< Grid< 3, RealType, Device, Index > >::CoordinatesType& -DistributedMesh< Grid< 3, RealType, Device, Index > >:: -getGlobalSize() const -{ - return this->globalSize; -} - -template< typename RealType, typename Device, typename Index > -const typename DistributedMesh< Grid< 3, RealType, Device, Index > >::CoordinatesType& -DistributedMesh< Grid< 3, RealType, Device, Index > >:: -getGlobalBegin() const -{ - return this->globalBegin; -} - template< typename RealType, typename Device, typename Index > void DistributedMesh< Grid< 3, RealType, Device, Index > >:: @@ -384,7 +306,7 @@ int DistributedMesh< Grid< 3, RealType, Device, Index > >:: getRankOfProcCoord( int x, int y, int z ) const { - return z*domainDecomposition[0]*domainDecomposition[1]+y*domainDecomposition[0]+x; + return z*this->domainDecomposition[0]*this->domainDecomposition[1]+y*this->domainDecomposition[0]+x; } diff --git a/src/TNL/Meshes/DistributedMeshes/DistributedGrid_Base.hpp b/src/TNL/Meshes/DistributedMeshes/DistributedGrid_Base.hpp index 81c2d9a772..b0fade7a36 100644 --- a/src/TNL/Meshes/DistributedMeshes/DistributedGrid_Base.hpp +++ b/src/TNL/Meshes/DistributedMeshes/DistributedGrid_Base.hpp @@ -20,7 +20,7 @@ namespace TNL { template<int dim, typename RealType, typename Device, typename Index > DistributedGrid_Base< dim, RealType, Device, Index >:: DistributedGrid_Base() -: isSet( false ) {} + : domainDecomposition( 0 ), isSet( false ) {} template< int dim, typename RealType, typename Device, typename Index > void -- GitLab