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