From 026a9410906f6bceff395c26dc32abf640e57ba8 Mon Sep 17 00:00:00 2001
From: Michael Kuron <mkuron@icp.uni-stuttgart.de>
Date: Fri, 6 Apr 2018 17:14:24 +0200
Subject: [PATCH] Intel 2018 OpenMP support and fix for -qopenmp in 2015 and
 higher

Also adds OpenMP support for macOS (requires Xcode 7.0, CMake 3.12 and separate libomp from MacPorts/Homebrew)
---
 CMakeLists.txt           | 24 ++++++------------------
 src/core/Abort.cpp       |  2 +-
 src/core/math/Random.cpp |  2 +-
 src/core/math/Random.h   | 10 +++++-----
 4 files changed, 13 insertions(+), 25 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 85125dcaf..a48d27e4b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1027,26 +1027,14 @@ endif()
 option ( WALBERLA_THREAD_SAFE_LOGGING "Enables/Disables thread-safe logging" ON )
 
 if ( WALBERLA_BUILD_WITH_OPENMP )
-    if ( WALBERLA_CXX_COMPILER_IS_INTEL )
-       add_flag ( CMAKE_C_FLAGS   "-openmp" )
-       add_flag ( CMAKE_CXX_FLAGS "-openmp" )
-    elseif ( CMAKE_COMPILER_IS_GNUCXX )
-      add_flag ( CMAKE_C_FLAGS   "-fopenmp" )
-      add_flag ( CMAKE_CXX_FLAGS "-fopenmp" )
-    elseif ( WALBERLA_CXX_COMPILER_IS_CLANG )
-       add_flag ( CMAKE_C_FLAGS   "-fopenmp" )
-       add_flag ( CMAKE_CXX_FLAGS "-fopenmp" )
-    elseif ( WALBERLA_CXX_COMPILER_IS_MSVC )
-      add_flag ( CMAKE_C_FLAGS   "/openmp" )
-      add_flag ( CMAKE_CXX_FLAGS "/openmp" )
-    elseif ( WALBERLA_CXX_COMPILER_IS_IBM )
-      add_flag ( CMAKE_C_FLAGS   "-qsmp=omp" )
-      add_flag ( CMAKE_CXX_FLAGS "-qsmp=omp" )
-      # There has been an internal compiler error with the IBM compiler, so WALBERLA_THREAD_SAFE_LOGGING is disabled by default for this compiler
-      set ( WALBERLA_THREAD_SAFE_LOGGING OFF CACHE BOOL "Enables/Disables thread-safe logging" FORCE )
-    elseif ( WALBERLA_CXX_COMPILER_IS_NEC )
+    if ( WALBERLA_CXX_COMPILER_IS_NEC )
       add_flag ( CMAKE_C_FLAGS   "-Popenmp" )
       add_flag ( CMAKE_CXX_FLAGS "-Popenmp" )
+    else()
+      find_package( OpenMP )
+      add_flag ( CMAKE_C_FLAGS   "${OpenMP_C_FLAGS}" )
+      add_flag ( CMAKE_CXX_FLAGS "${OpenMP_CXX_FLAGS}" )
+      list ( APPEND SERVICE_LIBS ${OpenMP_CXX_LIBRARIES} )
     endif()
 else()
     if ( WALBERLA_CXX_COMPILER_IS_CRAY )
diff --git a/src/core/Abort.cpp b/src/core/Abort.cpp
index 910dcb209..1ff3ad2cb 100644
--- a/src/core/Abort.cpp
+++ b/src/core/Abort.cpp
@@ -63,7 +63,7 @@ void Abort::defaultAbort( const std::string & logMessage, const std::string & ca
 
 
 #ifdef _OPENMP
-   #pragma omp critical (abort)
+   #pragma omp critical (Abort_abort)
    {
 #endif
 
diff --git a/src/core/math/Random.cpp b/src/core/math/Random.cpp
index 72707f208..5acdc01d3 100644
--- a/src/core/math/Random.cpp
+++ b/src/core/math/Random.cpp
@@ -43,7 +43,7 @@ std::mt19937 & getGenerator() // std::mt19937_64
 void seedRandomGenerator( const std::mt19937::result_type & seed )
 {
 #ifdef _OPENMP
-   #pragma omp critical (random)
+   #pragma omp critical (Random_random)
 #endif
    internal::getGenerator().seed( seed );
 }
diff --git a/src/core/math/Random.h b/src/core/math/Random.h
index ec61aa51d..d63d2e7ed 100644
--- a/src/core/math/Random.h
+++ b/src/core/math/Random.h
@@ -59,7 +59,7 @@ INT intRandom( const INT min, const INT max, std::mt19937 & generator )
 
    INT value;
 #ifdef _OPENMP
-   #pragma omp critical (random)
+   #pragma omp critical (Random_random)
 #endif
    { value = distribution( generator ); }
 
@@ -76,7 +76,7 @@ inline char intRandom<char>( const char min, const char max, std::mt19937 & gene
 
    char value;
 #ifdef _OPENMP
-   #pragma omp critical (random)
+   #pragma omp critical (Random_random)
 #endif
    { value = static_cast<char>( distribution( generator ) ); }
 
@@ -93,7 +93,7 @@ inline unsigned char intRandom<unsigned char>( const unsigned char min, const un
 
    unsigned char value;
 #ifdef _OPENMP
-   #pragma omp critical (random)
+   #pragma omp critical (Random_random)
 #endif
    { value = static_cast<unsigned char>( distribution( generator ) ); }
 
@@ -110,7 +110,7 @@ inline signed char intRandom<signed char>( const signed char min, const signed c
 
    signed char value;
 #ifdef _OPENMP
-   #pragma omp critical (random)
+   #pragma omp critical (Random_random)
 #endif
    { value = static_cast<signed char>( distribution( generator ) ); }
 
@@ -168,7 +168,7 @@ REAL realRandom( const REAL min = REAL(0), const REAL max = REAL(1), std::mt1993
 
    REAL value;
 #ifdef _OPENMP
-   #pragma omp critical (random)
+   #pragma omp critical (Random_random)
 #endif
    { value = distribution( generator ); }
 
-- 
GitLab