diff --git a/CMakeModules/morse/find/FindFFTW.cmake b/CMakeModules/morse/find/FindFFTW.cmake
index f259c58feb78c7f1a576456b5e68f90d807d379e..c9163a369f0ba55a5d6e68c64741c4d7a045b399 100644
--- a/CMakeModules/morse/find/FindFFTW.cmake
+++ b/CMakeModules/morse/find/FindFFTW.cmake
@@ -9,6 +9,8 @@
 ###
 #
 # - Find FFTW Version 3 include dirs and libraries
+# Default configuration will find the real double precision fftw library version
+# without THREADS|OMP.
 # Use this module by invoking find_package with the form:
 #  find_package(FFTW
 #               [REQUIRED] # Fail with error if fftw is not found
@@ -16,10 +18,10 @@
 #
 #  COMPONENTS can be some of the following:
 #   - MKL:     to detect the FFTW from Intel MKL
+#   - ESSL:    to detect the FFTW from IBM ESSL
 #   - THREADS: to detect the Threads version of FFTW
 #   - OMP:     to detect the OpenMP version of FFTW
 #   - SIMPLE:  to detect the FFTW simple precision fftw3f
-#   - DOUBLE:  to detect the FFTW double precision fftw3 (default)
 #   - LONG:    to detect the FFTW long double precision fftw3l
 #   - QUAD:    to detect the FFTW quadruple precision fftw3q
 #
@@ -50,7 +52,7 @@
 # Copyright 2012-2013 Emmanuel Agullo
 # Copyright 2012-2013 Mathieu Faverge
 # Copyright 2012      Cedric Castagnede
-# Copyright 2013      Florent Pruvost
+# Copyright 2013-2016 Florent Pruvost
 #
 # Distributed under the OSI-approved BSD License (the "License");
 # see accompanying file MORSE-Copyright.txt for details.
@@ -72,10 +74,10 @@ endif()
 
 # Set the version to find
 set(FFTW_LOOK_FOR_MKL OFF)
+set(FFTW_LOOK_FOR_ESSL OFF)
 set(FFTW_LOOK_FOR_THREADS OFF)
 set(FFTW_LOOK_FOR_OMP OFF)
 set(FFTW_LOOK_FOR_FFTW_SIMPLE OFF)
-set(FFTW_LOOK_FOR_FFTW_DOUBLE ON)
 set(FFTW_LOOK_FOR_FFTW_LONG OFF)
 set(FFTW_LOOK_FOR_FFTW_QUAD OFF)
 
@@ -92,28 +94,18 @@ if( FFTW_FIND_COMPONENTS )
     if (${component} STREQUAL "SIMPLE")
       # means we look for FFTW simple precision (fftw3f)
       set(FFTW_LOOK_FOR_FFTW_SIMPLE ON)
-      set(FFTW_LOOK_FOR_FFTW_DOUBLE OFF)
-      set(FFTW_LOOK_FOR_FFTW_LONG OFF)
-      set(FFTW_LOOK_FOR_FFTW_QUAD OFF)
-    endif()
-    if (${component} STREQUAL "DOUBLE")
-      # means we look for FFTW double precision (fftw3)
-      set(FFTW_LOOK_FOR_FFTW_SIMPLE OFF)
-      set(FFTW_LOOK_FOR_FFTW_DOUBLE ON)
       set(FFTW_LOOK_FOR_FFTW_LONG OFF)
       set(FFTW_LOOK_FOR_FFTW_QUAD OFF)
     endif()
     if (${component} STREQUAL "LONG")
       # means we look for FFTW long double precision (fftw3l)
       set(FFTW_LOOK_FOR_FFTW_SIMPLE OFF)
-      set(FFTW_LOOK_FOR_FFTW_DOUBLE OFF)
       set(FFTW_LOOK_FOR_FFTW_LONG ON)
       set(FFTW_LOOK_FOR_FFTW_QUAD OFF)
     endif()
     if (${component} STREQUAL "QUAD")
       # means we look for FFTW quad precision (fftw3q)
       set(FFTW_LOOK_FOR_FFTW_SIMPLE OFF)
-      set(FFTW_LOOK_FOR_FFTW_DOUBLE OFF)
       set(FFTW_LOOK_FOR_FFTW_LONG OFF)
       set(FFTW_LOOK_FOR_FFTW_QUAD ON)
     endif()
@@ -121,18 +113,47 @@ if( FFTW_FIND_COMPONENTS )
       # means we look for the Intel MKL version of FFTW
       set(FFTW_LOOK_FOR_MKL ON)
       if (FFTW_LOOK_FOR_FFTW_LONG)
-	message(WARNING "Looking for FFTW -- long precision functions do not exist in MKL FFTW")
-	set(FFTW_LOOK_FOR_FFTW_LONG OFF)
+        if (NOT FFTW_FIND_QUIETLY)
+          message(WARNING "Looking for FFTW -- long precision functions do not exist in MKL FFTW")
+        endif()
+        set(FFTW_LOOK_FOR_FFTW_LONG OFF)
+      endif()
+      if (FFTW_LOOK_FOR_FFTW_QUAD)
+        if (NOT FFTW_FIND_QUIETLY)
+          message(WARNING "Looking for FFTW -- quadruple functions do not exist in MKL FFTW")
+        endif()
+        set(FFTW_LOOK_FOR_FFTW_QUAD OFF)
+      endif()
+    endif()
+    if (${component} STREQUAL "ESSL")
+      # means we look for the Intel MKL version of FFTW
+      set(FFTW_LOOK_FOR_ESSL ON)
+      if (FFTW_LOOK_FOR_FFTW_LONG)
+        if (NOT FFTW_FIND_QUIETLY)
+          message(WARNING "Looking for FFTW -- long precision functions do not exist in FFTW_ESSL")
+        endif()
+        set(FFTW_LOOK_FOR_FFTW_LONG OFF)
       endif()
       if (FFTW_LOOK_FOR_FFTW_QUAD)
-	message(WARNING "Looking for FFTW -- quadruple functions do not exist in MKL FFTW")
-	set(FFTW_LOOK_FOR_FFTW_QUAD OFF)
+        if (NOT FFTW_FIND_QUIETLY)
+          message(WARNING "Looking for FFTW -- quadruple functions do not exist in FFTW_ESSL")
+        endif()
+        set(FFTW_LOOK_FOR_FFTW_QUAD OFF)
+      endif()
+      if (FFTW_LOOK_FOR_OMP)
+        if (NOT FFTW_FIND_QUIETLY)
+          message(WARNING "Looking for FFTW -- FFTW_ESSL does not use OpenMP")
+        endif()
+        set(FFTW_LOOK_FOR_OMP OFF)
       endif()
     endif()
   endforeach()
 endif()
 
 if (FFTW_LOOK_FOR_THREADS)
+  if (NOT FFTW_FIND_QUIETLY)
+    message(STATUS "FFTW looks for threads")
+  endif()
   if (FFTW_FIND_REQUIRED AND FFTW_FIND_REQUIRED_THREADS)
     find_package(Threads REQUIRED)
   else()
@@ -140,23 +161,51 @@ if (FFTW_LOOK_FOR_THREADS)
   endif()
 endif()
 
+if (FFTW_LOOK_FOR_OMP)
+  if (NOT FFTW_FIND_QUIETLY)
+    message(STATUS "FFTW looks for openmp")
+  endif()
+  if (FFTW_FIND_REQUIRED AND FFTW_FIND_REQUIRED_OMP)
+    find_package(OpenMP REQUIRED)
+  else()
+    find_package(OpenMP)
+  endif()
+endif()
+
 if (FFTW_LOOK_FOR_MKL)
+  if (NOT FFTW_FIND_QUIETLY)
+    message(STATUS "FFTW looks for threads and Intel MKL")
+  endif()
+  if (FFTW_LOOK_FOR_THREADS)
+    set(BLA_VENDOR "Intel10_64lp")
+  else()
+    set(BLA_VENDOR "Intel10_64lp_seq")
+  endif()
   if (FFTW_FIND_REQUIRED AND FFTW_FIND_REQUIRED_MKL)
     find_package(Threads REQUIRED)
+    find_package(BLASEXT REQUIRED)
   else()
     find_package(Threads)
+    find_package(BLASEXT)
   endif()
 endif()
 
-if (FFTW_LOOK_FOR_OMP)
-  if (FFTW_FIND_REQUIRED AND FFTW_FIND_REQUIRED_OMP)
-    find_package(OpenMP REQUIRED)
+if (FFTW_LOOK_FOR_ESSL)
+  if (NOT FFTW_FIND_QUIETLY)
+    message(STATUS "FFTW looks for IBM ESSL")
+  endif()
+  if (FFTW_LOOK_FOR_THREADS)
+    set(BLA_VENDOR "IBMESSLMT")
   else()
-    find_package(OpenMP)
+    set(BLA_VENDOR "IBMESSL")
+  endif()
+  if (FFTW_FIND_REQUIRED AND FFTW_FIND_REQUIRED_ESSL)
+    find_package(BLASEXT REQUIRED)
+  else()
+    find_package(BLASEXT)
   endif()
 endif()
 
-
 set(ENV_FFTW_DIR "$ENV{FFTW_DIR}")
 set(ENV_FFTW_INCDIR "$ENV{FFTW_INCDIR}")
 set(ENV_FFTW_LIBDIR "$ENV{FFTW_LIBDIR}")
@@ -165,61 +214,153 @@ if ( FFTW_DIR OR ( FFTW_INCDIR AND FFTW_LIBDIR) OR ENV_FFTW_DIR OR (ENV_FFTW_INC
   set(FFTW_GIVEN_BY_USER "TRUE")
 endif()
 
+
 # Optionally use pkg-config to detect include/library dirs (if pkg-config is available)
 # -------------------------------------------------------------------------------------
-include(FindPkgConfig)
-find_package(PkgConfig QUIET)
-if( PKG_CONFIG_EXECUTABLE AND NOT FFTW_GIVEN_BY_USER )
-
-  if(FFTW_LOOK_FOR_FFTW_SIMPLE)
-    pkg_search_module(FFTW3F fftw3f)
-    pkg_search_module(FFTW3 fftw3)
-  elseif(FFTW_LOOK_FOR_FFTW_LONG)
-	pkg_search_module(FFTW3L fftw3l)
-    pkg_search_module(FFTW3 fftw3)
-  elseif(FFTW_LOOK_FOR_FFTW_QUAD)
-    pkg_search_module(FFTW3Q fftw3q)
-    pkg_search_module(FFTW3 fftw3)
-  else()
-    pkg_search_module(FFTW3 fftw3)
-  endif()
-
-  if (NOT FFTW_FIND_QUIETLY)
-    if (FFTW_FOUND AND FFTW_LIBRARIES)
-      message(STATUS "Looking for FFTW - found using PkgConfig")
-      #if(NOT FFTW_INCLUDE_DIRS)
-      #    message("${Magenta}FFTW_INCLUDE_DIRS is empty using PkgConfig."
-      #        "Perhaps the path to hwloc headers is already present in your"
-      #        "C(PLUS)_INCLUDE_PATH environment variable.${ColourReset}")
-      #endif()
+if (NOT FFTW_LOOK_FOR_MKL AND NOT FFTW_LOOK_FOR_ESSL)
+  include(FindPkgConfig)
+  find_package(PkgConfig QUIET)
+  if( PKG_CONFIG_EXECUTABLE AND NOT FFTW_GIVEN_BY_USER )
+
+    set(FFTW_INCLUDE_DIRS)
+    set(FFTW_LIBRARY_DIRS)
+    set(FFTW_LIBRARIES)
+
+    if(FFTW_LOOK_FOR_FFTW_SIMPLE)
+      pkg_search_module(FFTW3F fftw3f)
+      pkg_search_module(FFTW3 fftw3)
+      if (FFTW3F_FOUND)
+        if (NOT FFTW_FIND_QUIETLY)
+          message(STATUS "Looking for FFTW3F - found using PkgConfig")
+        endif()
+        if (FFTW3F_LIBRARIES)
+          list(APPEND FFTW_LIBRARIES "${FFTW3F_LIBRARIES}")
+        endif()
+        if(FFTW3F_INCLUDE_DIRS)
+          list(APPEND FFTW_INCLUDE_DIRS "${FFTW3F_INCLUDE_DIRS}")
+        else()
+          if (NOT FFTW_FIND_QUIETLY)
+            message(WARNING "FFTW3F_INCLUDE_DIRS is empty using PkgConfig."
+            "Perhaps the path to fftw3f headers is already present in your"
+            "CPATH/C(PLUS)_INCLUDE_PATH environment variables.")
+          endif()
+        endif()
+        if(FFTW3F_LIBRARY_DIRS)
+          list(APPEND FFTW_LIBRARY_DIRS "${FFTW3F_LIBRARY_DIRS}")
+        endif()
+      else(FFTW3F_FOUND)
+        if (NOT FFTW_FIND_QUIETLY)
+          message(STATUS "Looking for FFTW3F - not found using PkgConfig."
+          "Perhaps you should add the directory containing fftw3f.pc to"
+          "the PKG_CONFIG_PATH environment variable.")
+        endif()
+      endif(FFTW3F_FOUND)
+    elseif(FFTW_LOOK_FOR_FFTW_LONG)
+      pkg_search_module(FFTW3L fftw3l)
+      pkg_search_module(FFTW3 fftw3)
+      if (FFTW3L_FOUND)
+        if (NOT FFTW_FIND_QUIETLY)
+          message(STATUS "Looking for FFTW3L - found using PkgConfig")
+        endif()
+        if (FFTW3L_LIBRARIES)
+          list(APPEND FFTW_LIBRARIES "${FFTW3L_LIBRARIES}")
+        endif()
+        if(FFTW3L_INCLUDE_DIRS)
+          list(APPEND FFTW_INCLUDE_DIRS "${FFTW3L_INCLUDE_DIRS}")
+        else()
+          if (NOT FFTW_FIND_QUIETLY)
+            message(WARNING "FFTW3L_INCLUDE_DIRS is empty using PkgConfig."
+            "Perhaps the path to fftw3l headers is already present in your"
+            "CPATH/C(PLUS)_INCLUDE_PATH environment variables.")
+          endif()
+        endif()
+        if(FFTW3L_LIBRARY_DIRS)
+          list(APPEND FFTW_LIBRARY_DIRS "${FFTW3L_LIBRARY_DIRS}")
+        endif()
+      else(FFTW3L_FOUND)
+        if (NOT FFTW_FIND_QUIETLY)
+          message(STATUS "Looking for FFTW3L - not found using PkgConfig."
+          "Perhaps you should add the directory containing fftw3l.pc to"
+          "the PKG_CONFIG_PATH environment variable.")
+        endif()
+      endif(FFTW3L_FOUND)
+    elseif(FFTW_LOOK_FOR_FFTW_QUAD)
+      pkg_search_module(FFTW3Q fftw3q)
+      pkg_search_module(FFTW3 fftw3)
+      if (FFTW3Q_FOUND)
+        if (NOT FFTW_FIND_QUIETLY)
+          message(STATUS "Looking for FFTW3Q - found using PkgConfig")
+        endif()
+        if (FFTW3Q_LIBRARIES)
+          list(APPEND FFTW_LIBRARIES "${FFTW3Q_LIBRARIES}")
+        endif()
+        if(FFTW3Q_INCLUDE_DIRS)
+          list(APPEND FFTW_INCLUDE_DIRS "${FFTW3Q_INCLUDE_DIRS}")
+        else()
+          if (NOT FFTW_FIND_QUIETLY)
+            message(WARNING "FFTW3Q_INCLUDE_DIRS is empty using PkgConfig."
+            "Perhaps the path to fftw3q headers is already present in your"
+            "CPATH/C(PLUS)_INCLUDE_PATH environment variables.")
+          endif()
+        endif()
+        if(FFTW3Q_LIBRARY_DIRS)
+          list(APPEND FFTW_LIBRARY_DIRS "${FFTW3Q_LIBRARY_DIRS}")
+        endif()
+      else(FFTW3Q_FOUND)
+        if (NOT FFTW_FIND_QUIETLY)
+          message(STATUS "Looking for FFTW3Q - not found using PkgConfig."
+          "Perhaps you should add the directory containing fftw3q.pc to"
+          "the PKG_CONFIG_PATH environment variable.")
+        endif()
+      endif(FFTW3Q_FOUND)
     else()
-      message("${Magenta}Looking for FFTW - not found using PkgConfig."
-	"Perhaps you should add the directory containing fftw3.pc to"
-	"the PKG_CONFIG_PATH environment variable.${ColourReset}")
+      pkg_search_module(FFTW3 fftw3)
     endif()
-  endif()
+    if (FFTW3_FOUND)
+      if (NOT FFTW_FIND_QUIETLY)
+        message(STATUS "Looking for FFTW3 - found using PkgConfig")
+      endif()
+      if (FFTW3_LIBRARIES)
+        list(APPEND FFTW_LIBRARIES "${FFTW3_LIBRARIES}")
+      endif()
+      if(FFTW3_INCLUDE_DIRS)
+        list(APPEND FFTW_INCLUDE_DIRS "${FFTW3_INCLUDE_DIRS}")
+      else()
+        if (NOT FFTW_FIND_QUIETLY)
+          message(WARNING "FFTW3_INCLUDE_DIRS is empty using PkgConfig."
+          "Perhaps the path to fftw3 headers is already present in your"
+          "CPATH/C(PLUS)_INCLUDE_PATH environment variables.")
+        endif()
+      endif()
+      if(FFTW3_LIBRARY_DIRS)
+        list(APPEND FFTW_LIBRARY_DIRS "${FFTW3_LIBRARY_DIRS}")
+      endif()
+    else(FFTW3_FOUND)
+      if (NOT FFTW_FIND_QUIETLY)
+        message(STATUS "Looking for FFTW3 - not found using PkgConfig."
+        "Perhaps you should add the directory containing fftw3.pc to"
+        "the PKG_CONFIG_PATH environment variable.")
+      endif()
+    endif(FFTW3_FOUND)
 
-  set(FFTW_INCLUDE_DIRS_DEP "${FFTW_INCLUDE_DIRS}")
-  set(FFTW_LIBRARY_DIRS_DEP "${FFTW_LIBRARY_DIRS}")
-  set(FFTW_LIBRARIES_DEP)
-  if( FFTW3Q_LIBRARIES )
-	list(APPEND FFTW_LIBRARIES_DEP "${FFTW3Q_LIBRARIES}")
-  endif()
-  if( FFTW3L_LIBRARIES )
-	list(APPEND FFTW_LIBRARIES_DEP "${FFTW3L_LIBRARIES}")
-  endif()
-  if( FFTW3F_LIBRARIES )
-	list(APPEND FFTW_LIBRARIES_DEP "${FFTW3F_LIBRARIES}")
-  endif()
-if( FFTW3_LIBRARIES )
-	list(APPEND FFTW_LIBRARIES_DEP "${FFTW3_LIBRARIES}")
-endif()
-  set(FFTW_WORKS TRUE)
+    set(FFTW_INCLUDE_DIRS_DEP "${FFTW_INCLUDE_DIRS}")
+    set(FFTW_LIBRARY_DIRS_DEP "${FFTW_LIBRARY_DIRS}")
+    set(FFTW_LIBRARIES_DEP    "${FFTW_LIBRARIES}"   )
 
-endif( PKG_CONFIG_EXECUTABLE AND NOT FFTW_GIVEN_BY_USER )
+    if (FFTW_LIBRARIES)
+      set(FFTW_WORKS TRUE)
+    endif()
 
+  endif( PKG_CONFIG_EXECUTABLE AND NOT FFTW_GIVEN_BY_USER )
 
-if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT FFTW_FOUND) OR (FFTW_GIVEN_BY_USER) )
+endif(NOT FFTW_LOOK_FOR_MKL AND NOT FFTW_LOOK_FOR_ESSL)
+
+if( (NOT PKG_CONFIG_EXECUTABLE) OR
+       (PKG_CONFIG_EXECUTABLE AND NOT FFTW_FOUND) OR
+       FFTW_GIVEN_BY_USER OR
+       FFTW_LOOK_FOR_MKL  OR
+       FFTW_LOOK_FOR_ESSL
+  )
 
   # Looking for include
   # -------------------
@@ -262,39 +403,45 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT FFTW_FOUND) OR
   # set paths where to look for
   set(PATH_TO_LOOK_FOR "${_inc_env}")
 
+  if (FFTW_LOOK_FOR_ESSL)
+    set(FFTW3_HEADER_TO_FIND "fftw3_essl.h")
+  else()
+    set(FFTW3_HEADER_TO_FIND "fftw3.h")
+  endif()
+
   # Try to find the fftw header in the given paths
   # -------------------------------------------------
   # call cmake macro to find the header path
   if(FFTW_INCDIR)
-    set(FFTW_fftw3.h_DIRS "FFTW_fftw3.h_DIRS-NOTFOUND")
-    find_path(FFTW_fftw3.h_DIRS
-      NAMES fftw3.h
+    set(FFTW_${FFTW3_HEADER_TO_FIND}_DIRS "FFTW_${FFTW3_HEADER_TO_FIND}_DIRS-NOTFOUND")
+    find_path(FFTW_${FFTW3_HEADER_TO_FIND}_DIRS
+      NAMES ${FFTW3_HEADER_TO_FIND}
       HINTS ${FFTW_INCDIR})
   else()
     if(FFTW_DIR)
-      set(FFTW_fftw3.h_DIRS "FFTW_fftw3.h_DIRS-NOTFOUND")
-      find_path(FFTW_fftw3.h_DIRS
-	NAMES fftw3.h
+      set(FFTW_${FFTW3_HEADER_TO_FIND}_DIRS "FFTW_${FFTW3_HEADER_TO_FIND}_DIRS-NOTFOUND")
+      find_path(FFTW_${FFTW3_HEADER_TO_FIND}_DIRS
+	NAMES ${FFTW3_HEADER_TO_FIND}
 	HINTS ${FFTW_DIR}
 	PATH_SUFFIXES "include" "include/fftw")
     else()
-      set(FFTW_fftw3.h_DIRS "FFTW_fftw3.h_DIRS-NOTFOUND")
-      find_path(FFTW_fftw3.h_DIRS
-	NAMES fftw3.h
+      set(FFTW_${FFTW3_HEADER_TO_FIND}_DIRS "FFTW_${FFTW3_HEADER_TO_FIND}_DIRS-NOTFOUND")
+      find_path(FFTW_${FFTW3_HEADER_TO_FIND}_DIRS
+	NAMES ${FFTW3_HEADER_TO_FIND}
 	HINTS ${PATH_TO_LOOK_FOR}
 	PATH_SUFFIXES "fftw")
     endif()
   endif()
-  mark_as_advanced(FFTW_fftw3.h_DIRS)
+  mark_as_advanced(FFTW_${FFTW3_HEADER_TO_FIND}_DIRS)
 
   # Add path to cmake variable
   # ------------------------------------
-  if (FFTW_fftw3.h_DIRS)
-    set(FFTW_INCLUDE_DIRS "${FFTW_fftw3.h_DIRS}")
+  if (FFTW_${FFTW3_HEADER_TO_FIND}_DIRS)
+    set(FFTW_INCLUDE_DIRS "${FFTW_${FFTW3_HEADER_TO_FIND}_DIRS}")
   else ()
     set(FFTW_INCLUDE_DIRS "FFTW_INCLUDE_DIRS-NOTFOUND")
     if(NOT FFTW_FIND_QUIETLY)
-      message(STATUS "Looking for FFTW -- fftw3.h not found")
+      message(STATUS "Looking for FFTW -- ${FFTW3_HEADER_TO_FIND} not found")
     endif()
   endif ()
 
@@ -350,52 +497,21 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT FFTW_FOUND) OR
   if(FFTW_LOOK_FOR_FFTW_SIMPLE)
     set(FFTW_PREC "f")
     set(FFTW_PREC_TESTFUNC "s")
-  elseif(FFTW_LOOK_FOR_FFTW_DOUBLE)
-    set(FFTW_PREC "")
-    set(FFTW_PREC_TESTFUNC "d")
   elseif(FFTW_LOOK_FOR_FFTW_LONG)
     set(FFTW_PREC "l")
     set(FFTW_PREC_TESTFUNC "l")
   elseif(FFTW_LOOK_FOR_FFTW_QUAD)
     set(FFTW_PREC "q")
     set(FFTW_PREC_TESTFUNC "q")
+  else()
+    set(FFTW_PREC "")
+    set(FFTW_PREC_TESTFUNC "d")
   endif()
 
-  if (FFTW_LOOK_FOR_MKL)
-
-    set(FFTW_libs_to_find "mkl_intel_lp64;mkl_sequential;mkl_core")
-
-    # Try to find the MKL fftw lib in the given paths
-    # -----------------------------------------------
-
-    # call cmake macro to find the lib path
-    if(FFTW_LIBDIR)
-      foreach(fftw_lib ${FFTW_libs_to_find})
-	set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND")
-	find_library(FFTW_${fftw_lib}_LIBRARY
-	  NAMES ${fftw_lib}
-	  HINTS ${FFTW_LIBDIR})
-      endforeach()
-    else()
-      if(FFTW_DIR)
-	foreach(fftw_lib ${FFTW_libs_to_find})
-	  set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND")
-	  find_library(FFTW_${fftw_lib}_LIBRARY
-	    NAMES ${fftw_lib}
-	    HINTS ${FFTW_DIR}
-	    PATH_SUFFIXES lib lib32 lib64)
-	endforeach()
-      else()
-	foreach(fftw_lib ${FFTW_libs_to_find})
-	  set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND")
-	  find_library(FFTW_${fftw_lib}_LIBRARY
-	    NAMES ${fftw_lib}
-	    HINTS ${PATH_TO_LOOK_FOR})
-	endforeach()
-      endif()
-    endif()
+  set(FFTW_LIBRARIES "")
+  set(FFTW_LIBRARY_DIRS "")
 
-  else(FFTW_LOOK_FOR_MKL)
+  if(NOT FFTW_LOOK_FOR_MKL)
 
     if (FFTW_LOOK_FOR_THREADS)
       set(FFTW_libs_to_find "fftw3${FFTW_PREC}_threads;fftw3${FFTW_PREC};fftw3")
@@ -404,6 +520,15 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT FFTW_FOUND) OR
     else()
       set(FFTW_libs_to_find "fftw3${FFTW_PREC};fftw3")
     endif()
+    if (FFTW_LOOK_FOR_FFTW_QUAD)
+      if (NOT FFTW_LOOK_FOR_MKL AND NOT FFTW_LOOK_FOR_ESSL)
+        list(APPEND FFTW_libs_to_find "quadmath")
+      endif()
+    endif()
+
+    if (FFTW_LOOK_FOR_ESSL)
+      set(FFTW_libs_to_find "fftw3_essl")
+    endif()
 
     # Try to find the fftw lib in the given paths
     # ----------------------------------------------
@@ -411,56 +536,147 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT FFTW_FOUND) OR
     # call cmake macro to find the lib path
     if(FFTW_LIBDIR)
       foreach(fftw_lib ${FFTW_libs_to_find})
-	set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND")
-	find_library(FFTW_${fftw_lib}_LIBRARY
-	  NAMES ${fftw_lib}
-	  HINTS ${FFTW_LIBDIR})
+        set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND")
+          find_library(FFTW_${fftw_lib}_LIBRARY
+          NAMES ${fftw_lib}
+          HINTS ${FFTW_LIBDIR})
       endforeach()
     else()
       if(FFTW_DIR)
-	foreach(fftw_lib ${FFTW_libs_to_find})
-	  set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND")
-	  find_library(FFTW_${fftw_lib}_LIBRARY
-	    NAMES ${fftw_lib}
-	    HINTS ${FFTW_DIR}
-	    PATH_SUFFIXES lib lib32 lib64)
-	endforeach()
+        foreach(fftw_lib ${FFTW_libs_to_find})
+          set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND")
+          find_library(FFTW_${fftw_lib}_LIBRARY
+          NAMES ${fftw_lib}
+          HINTS ${FFTW_DIR}
+          PATH_SUFFIXES lib lib32 lib64)
+        endforeach()
       else()
-	foreach(fftw_lib ${FFTW_libs_to_find})
-	  set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND")
-	  find_library(FFTW_${fftw_lib}_LIBRARY
-	    NAMES ${fftw_lib}
-	    HINTS ${PATH_TO_LOOK_FOR})
-	endforeach()
+        foreach(fftw_lib ${FFTW_libs_to_find})
+          set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND")
+          find_library(FFTW_${fftw_lib}_LIBRARY
+          NAMES ${fftw_lib}
+          HINTS ${PATH_TO_LOOK_FOR})
+        endforeach()
       endif()
     endif()
 
-  endif(FFTW_LOOK_FOR_MKL)
+    # If found, add path to cmake variable
+    # ------------------------------------
+    foreach(fftw_lib ${FFTW_libs_to_find})
+
+      if (FFTW_${fftw_lib}_LIBRARY)
+        get_filename_component(${fftw_lib}_lib_path "${FFTW_${fftw_lib}_LIBRARY}" PATH)
+        # set cmake variables
+        list(APPEND FFTW_LIBRARIES "${FFTW_${fftw_lib}_LIBRARY}")
+        list(APPEND FFTW_LIBRARY_DIRS "${${fftw_lib}_lib_path}")
+      else ()
+        list(APPEND FFTW_LIBRARIES "${FFTW_${fftw_lib}_LIBRARY}")
+        if (NOT FFTW_FIND_QUIETLY)
+          message(STATUS "Looking for FFTW -- lib ${fftw_lib} not found")
+        endif()
+      endif ()
+      mark_as_advanced(FFTW_${fftw_lib}_LIBRARY)
 
-  # If found, add path to cmake variable
-  # ------------------------------------
-  set(FFTW_LIBRARIES "")
-  set(FFTW_LIBRARY_DIRS "")
-  foreach(fftw_lib ${FFTW_libs_to_find})
-
-    if (FFTW_${fftw_lib}_LIBRARY)
-      get_filename_component(${fftw_lib}_lib_path "${FFTW_${fftw_lib}_LIBRARY}" PATH)
-      # set cmake variables
-      list(APPEND FFTW_LIBRARIES "${FFTW_${fftw_lib}_LIBRARY}")
-      list(APPEND FFTW_LIBRARY_DIRS "${${fftw_lib}_lib_path}")
-    else ()
-      list(APPEND FFTW_LIBRARIES "${FFTW_${fftw_lib}_LIBRARY}")
+    endforeach()
+
+    # check if one lib is NOTFOUND
+    foreach(lib ${FFTW_LIBRARIES})
+        if (NOT lib)
+            set(FFTW_LIBRARIES "FFTW_LIBRARIES-NOTFOUND")
+        endif()
+    endforeach()
+
+  endif(NOT FFTW_LOOK_FOR_MKL)
+
+  if (FFTW_LOOK_FOR_MKL OR FFTW_LOOK_FOR_ESSL)
+
+    # FFTW relies on blas libs
+    if (FFTW_LOOK_FOR_THREADS)
+      if (FFTW_LOOK_FOR_MKL)
+        if (BLAS_PAR_LIBRARIES)
+          list(APPEND FFTW_LIBRARIES "${BLAS_PAR_LIBRARIES}")
+          if (NOT FFTW_FIND_QUIETLY)
+            message(STATUS "Multithreaded FFTW has been found: ${FFTW_LIBRARIES}")
+          endif()
+        else()
+          if (NOT FFTW_FIND_QUIETLY)
+            if (FFTW_FIND_REQUIRED AND FFTW_FIND_REQUIRED_MKL)
+              message(FATAL_ERROR "FFTW is required but not found.")
+            else()
+              message(STATUS "Multithreaded FFTW not found.")
+            endif()
+          endif()
+        endif(BLAS_PAR_LIBRARIES)
+      elseif (FFTW_LOOK_FOR_ESSL)
+        if (FFTW_LIBRARIES AND BLAS_PAR_LIBRARIES)
+          list(APPEND FFTW_LIBRARIES "${BLAS_PAR_LIBRARIES}")
+          if (NOT FFTW_FIND_QUIETLY)
+            message(STATUS "Multithreaded FFTW has been found: ${FFTW_LIBRARIES}")
+          endif()
+        else()
+          if (NOT FFTW_FIND_QUIETLY)
+            if (FFTW_FIND_REQUIRED AND FFTW_FIND_REQUIRED_MKL)
+              message(FATAL_ERROR "FFTW is required but not found.")
+            else()
+              message(STATUS "Multithreaded FFTW not found.")
+            endif()
+          endif()
+        endif(FFTW_LIBRARIES AND BLAS_PAR_LIBRARIES)
+      endif()
+    else(FFTW_LOOK_FOR_THREADS)
+      if (FFTW_LOOK_FOR_MKL)
+        if (BLAS_SEQ_LIBRARIES)
+          list(APPEND FFTW_LIBRARIES "${BLAS_SEQ_LIBRARIES}")
+          if (NOT FFTW_FIND_QUIETLY)
+            message(STATUS "FFTW has been found: ${FFTW_LIBRARIES}")
+          endif()
+        else()
+          if (NOT FFTW_FIND_QUIETLY)
+           if (FFTW_FIND_REQUIRED AND FFTW_FIND_REQUIRED_MKL)
+             message(FATAL_ERROR "FFTW is required but not found.")
+           else()
+             message(STATUS "FFTW not found.")
+           endif()
+          endif()
+        endif(BLAS_SEQ_LIBRARIES)
+      elseif (FFTW_LOOK_FOR_ESSL)
+        if (FFTW_LIBRARIES AND BLAS_SEQ_LIBRARIES)
+          list(APPEND FFTW_LIBRARIES "${BLAS_SEQ_LIBRARIES}")
+          if (NOT FFTW_FIND_QUIETLY)
+            message(STATUS "FFTW has been found: ${FFTW_LIBRARIES}")
+          endif()
+        else()
+          if (NOT FFTW_FIND_QUIETLY)
+           if (FFTW_FIND_REQUIRED AND FFTW_FIND_REQUIRED_MKL)
+             message(FATAL_ERROR "FFTW is required but not found.")
+           else()
+             message(STATUS "FFTW not found.")
+           endif()
+          endif()
+        endif(FFTW_LIBRARIES AND BLAS_SEQ_LIBRARIES)
+      endif()
+    endif(FFTW_LOOK_FOR_THREADS)
+
+    if (BLAS_LIBRARY_DIRS)
+      list(APPEND FFTW_LIBRARY_DIRS "${BLAS_LIBRARY_DIRS}")
+    else()
       if (NOT FFTW_FIND_QUIETLY)
-	message(STATUS "Looking for FFTW -- lib ${fftw_lib} not found")
+        message(WARNING "FFTW_LIBRARY_DIRS may not be complete because BLAS_LIBRARY_DIRS is empty.")
       endif()
-    endif ()
-    mark_as_advanced(FFTW_${fftw_lib}_LIBRARY)
+    endif()
 
-  endforeach()
+  endif(FFTW_LOOK_FOR_MKL OR FFTW_LOOK_FOR_ESSL)
 
   list(REMOVE_DUPLICATES FFTW_INCLUDE_DIRS)
   list(REMOVE_DUPLICATES FFTW_LIBRARY_DIRS)
 
+  # check if one lib is NOTFOUND
+  foreach(lib ${FFTW_LIBRARIES})
+      if (NOT lib)
+          set(FFTW_LIBRARIES "FFTW_LIBRARIES-NOTFOUND")
+      endif()
+  endforeach()
+
   # check a function to validate the find
   if(FFTW_LIBRARIES)
 
@@ -484,21 +700,21 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT FFTW_FOUND) OR
     endif()
     # OMP
     if(FFTW_LOOK_FOR_OMP)
-      if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
-	# either gomp ...
-	#set(REQUIRED_FLAGS "-fopenmp")
-	#list(APPEND REQUIRED_LIBS "-lgomp")
-	# or iomp5
-	list(APPEND REQUIRED_LIBS "-liomp5")
-      elseif (CMAKE_C_COMPILER_ID STREQUAL "Intel")
-	list(APPEND REQUIRED_LIBS "-liomp5")
-      endif()
+      set(REQUIRED_FLAGS "-fopenmp")
+      #if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
+      #  # either gomp ...
+      #  list(APPEND REQUIRED_LIBS "-lgomp")
+      #  # or iomp5
+      #  list(APPEND REQUIRED_LIBS "-liomp5")
+      #elseif (CMAKE_C_COMPILER_ID STREQUAL "Intel")
+      #  list(APPEND REQUIRED_LIBS "-liomp5")
+      #endif()
     endif()
     # MKL
     if(FFTW_LOOK_FOR_MKL)
       list(APPEND REQUIRED_LIBS "${CMAKE_THREAD_LIBS_INIT}")
       if (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
-	list(APPEND REQUIRED_LDFLAGS "-Wl,--no-as-needed")
+        list(APPEND REQUIRED_LDFLAGS "-Wl,--no-as-needed")
       endif()
     endif()
     # m
@@ -521,7 +737,11 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT FFTW_FOUND) OR
     # test link
     unset(FFTW_WORKS CACHE)
     include(CheckFunctionExists)
-    check_function_exists(${FFTW_PREC_TESTFUNC}fftw_execute_ FFTW_WORKS)
+    if (FFTW_LOOK_FOR_ESSL)
+      check_function_exists(${FFTW_PREC_TESTFUNC}fftw_execute FFTW_WORKS)
+    else()
+      check_function_exists(${FFTW_PREC_TESTFUNC}fftw_execute_ FFTW_WORKS)
+    endif()
     mark_as_advanced(FFTW_WORKS)
 
     if(FFTW_WORKS)
@@ -550,7 +770,12 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT FFTW_FOUND) OR
     set(CMAKE_REQUIRED_LIBRARIES)
   endif(FFTW_LIBRARIES)
 
-endif( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT FFTW_FOUND) OR (FFTW_GIVEN_BY_USER) )
+endif( (NOT PKG_CONFIG_EXECUTABLE) OR
+       (PKG_CONFIG_EXECUTABLE AND NOT FFTW_FOUND) OR
+       FFTW_GIVEN_BY_USER OR
+       FFTW_LOOK_FOR_MKL  OR
+       FFTW_LOOK_FOR_ESSL
+     )
 
 if (FFTW_LIBRARIES)
   list(GET FFTW_LIBRARIES 0 first_lib)