From 33510158dcbcf81155017003c751835b6ae4352d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Oberhuber?= <oberhuber.tomas@gmail.com>
Date: Tue, 13 Sep 2016 18:03:06 +0200
Subject: [PATCH] Fixed a bug in OpenMP grid traverser.

---
 install                                       |   2 +-
 src/TNL/Meshes/GridDetails/GridTraverser.h    |   4 +-
 .../Meshes/GridDetails/GridTraverser_impl.h   | 105 +++++++++++-------
 src/TNL/Meshes/GridEntity.h                   |   6 +-
 4 files changed, 71 insertions(+), 46 deletions(-)

diff --git a/install b/install
index a48d882e79..e46c01d9b3 100755
--- a/install
+++ b/install
@@ -109,7 +109,7 @@ fi
 
 
 PYTHON_TEST="`python src/Tools/python-path-test.py 2> /dev/null`"
-echo "xxxxx ${PYTHON_TEST} xxxxx\n"
+#echo "xxxxx ${PYTHON_TEST} xxxxx\n"
 if test PYTHON_TEST != "xOK";
 then
     source ${BUILD_PREFIX}/python-version    
diff --git a/src/TNL/Meshes/GridDetails/GridTraverser.h b/src/TNL/Meshes/GridDetails/GridTraverser.h
index 21bda6877d..4696c81907 100644
--- a/src/TNL/Meshes/GridDetails/GridTraverser.h
+++ b/src/TNL/Meshes/GridDetails/GridTraverser.h
@@ -46,8 +46,8 @@ class GridTraverser< Meshes::Grid< 1, Real, Devices::Host, Index > >
       static void
       processEntities(
          const GridPointer& gridPointer,
-         const CoordinatesType& begin,
-         const CoordinatesType& end,
+         const CoordinatesType begin,
+         const CoordinatesType end,
          const CoordinatesType& entityOrientation,
          const CoordinatesType& entityBasis,
          UserData& userData );
diff --git a/src/TNL/Meshes/GridDetails/GridTraverser_impl.h b/src/TNL/Meshes/GridDetails/GridTraverser_impl.h
index 5cf076ee58..5de8f7f231 100644
--- a/src/TNL/Meshes/GridDetails/GridTraverser_impl.h
+++ b/src/TNL/Meshes/GridDetails/GridTraverser_impl.h
@@ -27,19 +27,18 @@ void
 GridTraverser< Meshes::Grid< 1, Real, Devices::Host, Index > >::
 processEntities(
    const GridPointer& gridPointer,
-   const CoordinatesType& begin,
-   const CoordinatesType& end,
+   const CoordinatesType begin,
+   const CoordinatesType end,
    const CoordinatesType& entityOrientation,
    const CoordinatesType& entityBasis,
    UserData& userData )
-{
-
-   
-   GridEntity entity( *gridPointer );
-   entity.setOrientation( entityOrientation );
-   entity.setBasis( entityBasis );
+{   
    if( processOnlyBoundaryEntities )
    {
+      GridEntity entity( *gridPointer );
+      entity.setOrientation( entityOrientation );
+      entity.setBasis( entityBasis );
+
       entity.getCoordinates() = begin;
       entity.refresh();
       EntitiesProcessor::processEntity( entity.getMesh(), userData, entity );
@@ -49,13 +48,28 @@ processEntities(
    }
    else
    {
-      for( entity.getCoordinates().x() = begin.x();
+      //TODO: This does not work with gcc-5.4 and older, should work at gcc 6.x
+      /*for( entity.getCoordinates().x() = begin.x();
            entity.getCoordinates().x() <= end.x();
            entity.getCoordinates().x() ++ )
       {
          entity.refresh();
          EntitiesProcessor::processEntity( entity.getMesh(), userData, entity );
+      }*/ 
+#pragma omp parallel firstprivate( begin, end ) if( Devices::Host::isOMPEnabled() )
+      {
+         GridEntity entity( *gridPointer );
+         entity.setOrientation( entityOrientation );
+         entity.setBasis( entityBasis );
+#pragma omp for 
+         for( IndexType x = begin.x(); x<= end.x(); x ++ )
+         {
+            entity.getCoordinates().x() = x;
+            entity.refresh();
+            EntitiesProcessor::processEntity( entity.getMesh(), userData, entity );
+         }      
       }
+      
    }
 }
 
@@ -221,12 +235,12 @@ processEntities(
    const CoordinatesType& entityBasis,
    UserData& userData )
 {
-   GridEntity entity( *gridPointer );
-   entity.setOrientation( entityOrientation );
-   entity.setBasis( entityBasis );
-
    if( processOnlyBoundaryEntities )
    {
+      GridEntity entity( *gridPointer );
+      entity.setOrientation( entityOrientation );
+      entity.setBasis( entityBasis );
+      
       if( YOrthogonalBoundary )
          for( entity.getCoordinates().x() = begin.x();
               entity.getCoordinates().x() <= end.x();
@@ -254,7 +268,7 @@ processEntities(
    }
    else
    {
-      //TODO: This does not work with gcc-5.4 and older
+      //TODO: This does not work with gcc-5.4 and older, should work at gcc 6.x
 /*#pragma omp parallel for firstprivate( entity, begin, end ) if( Devices::Host::isOMPEnabled() )
       for( entity.getCoordinates().y() = begin.y();
            entity.getCoordinates().y() <= end.y();
@@ -266,15 +280,21 @@ processEntities(
             entity.refresh();
             EntitiesProcessor::processEntity( entity.getMesh(), userData, entity );
          }*/
-#pragma omp parallel for firstprivate( entity, begin, end ) if( Devices::Host::isOMPEnabled() )
-      for( IndexType y = begin.y(); y <= end.y(); y ++ )
-         for( IndexType x = begin.x(); x<= end.x(); x ++ )
-         {
-            entity.getCoordinates().x() = x;
-            entity.getCoordinates().y() = y;
-            entity.refresh();
-            EntitiesProcessor::processEntity( entity.getMesh(), userData, entity );
-         }      
+#pragma omp parallel firstprivate( begin, end ) if( Devices::Host::isOMPEnabled() )
+      {
+         GridEntity entity( *gridPointer );
+         entity.setOrientation( entityOrientation );
+         entity.setBasis( entityBasis );
+#pragma omp for 
+         for( IndexType y = begin.y(); y <= end.y(); y ++ )
+            for( IndexType x = begin.x(); x<= end.x(); x ++ )
+            {
+               entity.getCoordinates().x() = x;
+               entity.getCoordinates().y() = y;
+               entity.refresh();
+               EntitiesProcessor::processEntity( entity.getMesh(), userData, entity );
+            }      
+      }
    }
 }
 
@@ -406,12 +426,12 @@ processEntities(
    const CoordinatesType& entityBasis,
    UserData& userData )
 {
-   GridEntity entity( *gridPointer );
-   entity.setOrientation( entityOrientation );
-   entity.setBasis( entityBasis );
-
    if( processOnlyBoundaryEntities )
    {
+      GridEntity entity( *gridPointer );
+      entity.setOrientation( entityOrientation );
+      entity.setBasis( entityBasis );
+      
       if( ZOrthogonalBoundary )
          for( entity.getCoordinates().y() = begin.y();
               entity.getCoordinates().y() <= end.y();
@@ -460,7 +480,7 @@ processEntities(
    }
    else
    {
-      // TODO: this does not work with gcc-5.4 and older
+      // TODO: this does not work with gcc-5.4 and older, should work at gcc 6.x
 /*#pragma omp parallel for firstprivate( entity, begin, end ) if( Devices::Host::isOMPEnabled() )      
       for( entity.getCoordinates().z() = begin.z();
            entity.getCoordinates().z() <= end.z();
@@ -475,18 +495,23 @@ processEntities(
                entity.refresh();
                EntitiesProcessor::processEntity( entity.getMesh(), userData, entity );
             }*/
-#pragma omp parallel for firstprivate( entity, begin, end ) if( Devices::Host::isOMPEnabled() )
-      for( IndexType z = begin.y(); z <= end.y(); z ++ )
-         for( IndexType y = begin.y(); y <= end.y(); y ++ )
-            for( IndexType x = begin.x(); x<= end.x(); x ++ )
-            {
-               entity.getCoordinates().x() = x;
-               entity.getCoordinates().y() = y;
-               entity.getCoordinates().z() = z;
-               entity.refresh();
-               EntitiesProcessor::processEntity( entity.getMesh(), userData, entity );
-         }      
-      
+#pragma omp parallel firstprivate( begin, end ) if( Devices::Host::isOMPEnabled() )
+      {
+         GridEntity entity( *gridPointer );
+         entity.setOrientation( entityOrientation );
+         entity.setBasis( entityBasis );         
+#pragma omp for
+         for( IndexType z = begin.y(); z <= end.y(); z ++ )
+            for( IndexType y = begin.y(); y <= end.y(); y ++ )
+               for( IndexType x = begin.x(); x<= end.x(); x ++ )
+               {
+                  entity.getCoordinates().x() = x;
+                  entity.getCoordinates().y() = y;
+                  entity.getCoordinates().z() = z;
+                  entity.refresh();
+                  EntitiesProcessor::processEntity( entity.getMesh(), userData, entity );
+            }
+      }      
    }
 }
 
diff --git a/src/TNL/Meshes/GridEntity.h b/src/TNL/Meshes/GridEntity.h
index 51617553dd..0f806f000c 100644
--- a/src/TNL/Meshes/GridEntity.h
+++ b/src/TNL/Meshes/GridEntity.h
@@ -203,9 +203,9 @@ class GridEntity< Meshes::Grid< Dimensions, Real, Device, Index >, Dimensions, C
  
       __cuda_callable__ inline
       GridEntity( const GridType& grid,
-                     const CoordinatesType& coordinates,
-                     const EntityOrientationType& orientation = EntityOrientationType( 0 ),
-                     const EntityBasisType& basis = EntityBasisType( 1 ) );
+                  const CoordinatesType& coordinates,
+                  const EntityOrientationType& orientation = EntityOrientationType( 0 ),
+                  const EntityBasisType& basis = EntityBasisType( 1 ) );
  
       __cuda_callable__ inline
       const CoordinatesType& getCoordinates() const;
-- 
GitLab