From 0f2cf5bcf32e36c3312ba13c2910ca4921a93d2d Mon Sep 17 00:00:00 2001
From: Florent Pruvost <florent.pruvost@inria.fr>
Date: Wed, 11 Feb 2015 16:01:36 +0000
Subject: [PATCH] add a FindMUMPS.cmake and FindSCALAPACK.cmake (detects only
 the netlib scalapack lib for now)

---
 cmake_modules/morse/find/FindMUMPS.cmake     | 621 +++++++++++++++++++
 cmake_modules/morse/find/FindSCALAPACK.cmake | 450 ++++++++++++++
 2 files changed, 1071 insertions(+)
 create mode 100644 cmake_modules/morse/find/FindMUMPS.cmake
 create mode 100644 cmake_modules/morse/find/FindSCALAPACK.cmake

diff --git a/cmake_modules/morse/find/FindMUMPS.cmake b/cmake_modules/morse/find/FindMUMPS.cmake
new file mode 100644
index 000000000..ca6a92f62
--- /dev/null
+++ b/cmake_modules/morse/find/FindMUMPS.cmake
@@ -0,0 +1,621 @@
+###
+#
+# @copyright (c) 2009-2014 The University of Tennessee and The University
+#                          of Tennessee Research Foundation.
+#                          All rights reserved.
+# @copyright (c) 2012-2014 Inria. All rights reserved.
+# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved.
+#
+###
+#
+# - Find MUMPS include dirs and libraries
+# Use this module by invoking find_package with the form:
+#  find_package(MUMPS
+#               [REQUIRED]             # Fail with error if mumps is not found
+#               [COMPONENTS <libs>...] # required dependencies
+#              )
+#  COMPONENTS can be one of the following:
+#   MPI: to activate detection of the parallel MPI version (default behaviour)
+#   SEQ: to activate detection of sequential version (exclude MPI version)
+#   SCOTCH: to activate detection of MUMPS linked with SCOTCH
+#   METIS: to activate detection of MUMPS linked with METIS
+# This module finds headers and mumps library.
+# Results are reported in variables:
+#  MUMPS_FOUND           - True if headers and requested libraries were found
+#  MUMPS_INCLUDE_DIRS    - mumps include directories
+#  MUMPS_LIBRARY_DIRS    - Link directories for mumps libraries
+# The user can give specific paths where to find the libraries adding cmake
+# options at configure (ex: cmake path/to/project -DMUMPS_DIR=path/to/mumps):
+#  MUMPS_DIR             - Where to find the base directory of mumps
+#  MUMPS_INCDIR          - Where to find the header files
+#  MUMPS_LIBDIR          - Where to find the library files
+
+#=============================================================================
+# Copyright 2012-2013 Inria
+# Copyright 2012-2013 Emmanuel Agullo
+# Copyright 2012-2013 Mathieu Faverge
+# Copyright 2012      Cedric Castagnede
+# Copyright 2013      Florent Pruvost
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file MORSE-Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of Morse, substitute the full
+#  License text for the above reference.)
+
+
+if (NOT MUMPS_FOUND)
+    set(MUMPS_DIR "" CACHE PATH "Root directory of MUMPS library")
+    if (NOT MUMPS_FIND_QUIETLY)
+        message(STATUS "A cache variable, namely MUMPS_DIR, has been set to specify the install directory of MUMPS")
+    endif()
+endif()
+
+# Try to find MUMPS dependencies if specified as COMPONENTS during the call
+set(MUMPS_LOOK_FOR_SEQ OFF)
+set(MUMPS_LOOK_FOR_MPI ON)
+if( MUMPS_FIND_COMPONENTS )
+    foreach( component ${MUMPS_FIND_COMPONENTS} )
+        if (${component} STREQUAL "SEQ")
+            # means we look for the sequential version of MUMPS (without MPI)
+            set(MUMPS_LOOK_FOR_SEQ ON)
+            set(MUMPS_LOOK_FOR_MPI OFF)
+        endif()
+        if (${component} STREQUAL "MPI")
+            # means we look for the sequential version of MUMPS (without MPI)
+            set(MUMPS_LOOK_FOR_MPI ON)
+            set(MUMPS_LOOK_FOR_SEQ OFF)
+        endif()
+        if (NOT ${component} STREQUAL "SEQ")
+            if(MUMPS_FIND_REQUIRED_${component})
+                find_package(${component} REQUIRED)
+            else()
+                find_package(${component})
+            endif()
+        endif()
+        if(${component}_FOUND)
+            set(MUMPS_${component}_FOUND TRUE)
+            # should we have these variables available in gui modes?
+            if (MPI_FOUND)
+                mark_as_advanced(MPI_LIBRARY)
+                mark_as_advanced(MPI_EXTRA_LIBRARY)
+            endif()
+        else()
+            set(MUMPS_${component}_FOUND FALSE)
+        endif()
+    endforeach()
+endif()
+
+if (NOT MUMPS_FIND_QUIETLY)
+    if (MUMPS_LOOK_FOR_SEQ)
+        message(STATUS "Looking for MUMPS - sequential version (without MPI)")
+    else()
+        message(STATUS "Looking for MUMPS - MPI version -"
+        " if you want to force detection of a sequential "
+        "version use find_package(MUMPS [REQUIRED] COMPONENTS SEQ [...])")
+    endif()
+endif()
+
+if (NOT MUMPS_FIND_QUIETLY)
+    message(STATUS "Looking for MUMPS - PkgConfig not used")
+endif()
+
+# Dependencies detection
+# ----------------------
+
+
+# Required dependencies
+# ---------------------
+
+if (NOT MUMPS_FIND_QUIETLY)
+    message(STATUS "Looking for MUMPS - Try to detect pthread")
+endif()
+if (MUMPS_FIND_REQUIRED)
+    find_package(Threads REQUIRED)
+else()
+    find_package(Threads)
+endif()
+set(MUMPS_EXTRA_LIBRARIES "")
+if( THREADS_FOUND )
+    list(APPEND MUMPS_EXTRA_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
+endif ()
+
+# MUMPS depends on BLAS
+#----------------------
+if (NOT MUMPS_FIND_QUIETLY)
+    message(STATUS "Looking for MUMPS - Try to detect BLAS")
+endif()
+if (MUMPS_FIND_REQUIRED)
+    find_package(BLASEXT REQUIRED)
+else()
+    find_package(BLASEXT)
+endif()
+
+# Optional dependencies
+# ---------------------
+
+# MUMPS may depend on MPI
+#------------------------
+if (NOT MPI_FOUND AND NOT MUMPS_LOOK_FOR_SEQ)
+    if (NOT MUMPS_FIND_QUIETLY)
+        message(STATUS "Looking for MUMPS - Try to detect MPI")
+    endif()
+    # allows to use an external mpi compilation by setting compilers with
+    # -DMPI_C_COMPILER=path/to/mpicc -DMPI_Fortran_COMPILER=path/to/mpif90
+    # at cmake configure
+    if(NOT MPI_C_COMPILER)
+        set(MPI_C_COMPILER mpicc)
+    endif()
+    if (MUMPS_FIND_REQUIRED AND MUMPS_LOOK_FOR_MPI)
+        find_package(MPI REQUIRED)
+    else()
+        find_package(MPI)
+    endif()
+    if (MPI_FOUND)
+        mark_as_advanced(MPI_LIBRARY)
+        mark_as_advanced(MPI_EXTRA_LIBRARY)
+    endif()
+endif (NOT MPI_FOUND AND NOT MUMPS_LOOK_FOR_SEQ)
+
+# MUMPS may depend on ScaLAPACK (if MPI version)
+#-----------------------------------------------
+if (NOT SCALAPACK_FOUND AND NOT MUMPS_LOOK_FOR_SEQ)
+    if (NOT MUMPS_FIND_QUIETLY)
+        message(STATUS "Looking for MUMPS - Try to detect SCALAPACK")
+    endif()
+    # SCALAPACK is a required dependency if MPI is used
+    if (MUMPS_FIND_REQUIRED AND MUMPS_LOOK_FOR_MPI)
+        find_package(SCALAPACK REQUIRED)
+    else()
+        find_package(SCALAPACK)
+    endif()
+endif (NOT SCALAPACK_FOUND AND NOT MUMPS_LOOK_FOR_SEQ)
+
+# MUMPS may depends on SCOTCH
+#----------------------------
+if (NOT SCOTCH_FOUND)
+    if (NOT MUMPS_FIND_QUIETLY)
+        message(STATUS "Looking for MUMPS - Try to detect SCOTCH")
+    endif()
+    if (MUMPS_FIND_REQUIRED AND MUMPS_FIND_REQUIRED_SCOTCH)
+        find_package(SCOTCH REQUIRED)
+    else()
+        find_package(SCOTCH)
+    endif()
+endif()
+
+# MUMPS may depends on METIS
+#---------------------------
+if (NOT METIS_FOUND)
+    if (NOT MUMPS_FIND_QUIETLY)
+        message(STATUS "Looking for MUMPS - Try to detect METIS")
+    endif()
+    if (MUMPS_FIND_REQUIRED AND MUMPS_FIND_REQUIRED_METIS)
+        find_package(METIS REQUIRED)
+    else()
+        find_package(METIS)
+    endif()
+endif()
+
+
+# Looking for MUMPS
+# -----------------
+
+# Looking for include
+# -------------------
+
+# Try to find the mumps header in the given path
+# ----------------------------------------------
+# call cmake macro to find the header path
+if(MUMPS_DIR)
+    set(MUMPS_smumps_c.h_DIRS "MUMPS_smumps_c.h_DIRS-NOTFOUND")
+    find_path(MUMPS_smumps_c.h_DIRS
+      NAMES smumps_c.h
+      HINTS ${MUMPS_DIR}
+      PATH_SUFFIXES "include")
+    set(MUMPS_dmumps_c.h_DIRS "MUMPS_dmumps_c.h_DIRS-NOTFOUND")
+    find_path(MUMPS_dmumps_c.h_DIRS
+      NAMES dmumps_c.h
+      HINTS ${MUMPS_DIR}
+      PATH_SUFFIXES "include")
+    set(MUMPS_cmumps_c.h_DIRS "MUMPS_cmumps_c.h_DIRS-NOTFOUND")
+    find_path(MUMPS_cmumps_c.h_DIRS
+      NAMES cmumps_c.h
+      HINTS ${MUMPS_DIR}
+      PATH_SUFFIXES "include")
+    set(MUMPS_zmumps_c.h_DIRS "MUMPS_zmumps_c.h_DIRS-NOTFOUND")
+    find_path(MUMPS_zmumps_c.h_DIRS
+      NAMES zmumps_c.h
+      HINTS ${MUMPS_DIR}
+      PATH_SUFFIXES "include")
+else()
+    if (MUMPS_FIND_REQUIRED)
+        message(FATAL_ERROR "Looking for mumps -- MUMPS_DIR is not set, to find"
+        " MUMPS please set MUMPS_DIR, the path to MUMPS installation where"
+        " sub-directories include/ and lib/ are located")
+    else()
+        if(NOT MUMPS_FIND_QUIETLY)
+            message(STATUS "Looking for mumps -- MUMPS_DIR is not set, to find"
+            " MUMPS please set MUMPS_DIR, the path to MUMPS installation where"
+            " sub-directories include/ and lib/ are located")
+        endif()
+    endif()
+endif()
+
+# If found, add path to cmake variable
+# ------------------------------------
+# detect which precisions are available
+if (MUMPS_smumps_c.h_DIRS)
+    mark_as_advanced(MUMPS_smumps_c.h_DIRS)
+    set(MUMPS_PREC_S ON)
+    set(MUMPS_INCLUDE_DIRS "${MUMPS_smumps_c.h_DIRS}")
+else ()
+    set(MUMPS_PREC_S OFF)
+    if(NOT MUMPS_FIND_QUIETLY)
+        message(STATUS "Looking for mumps -- smumps_c.h not found")
+    endif()
+endif()
+if (MUMPS_dmumps_c.h_DIRS)
+    mark_as_advanced(MUMPS_dmumps_c.h_DIRS)
+    set(MUMPS_PREC_D ON)
+    set(MUMPS_INCLUDE_DIRS "${MUMPS_dmumps_c.h_DIRS}")
+else ()
+    set(MUMPS_PREC_D OFF)
+    if(NOT MUMPS_FIND_QUIETLY)
+        message(STATUS "Looking for mumps -- dmumps_c.h not found")
+    endif()
+endif()
+if (MUMPS_cmumps_c.h_DIRS)
+    mark_as_advanced(MUMPS_cmumps_c.h_DIRS)
+    set(MUMPS_PREC_C ON)
+    set(MUMPS_INCLUDE_DIRS "${MUMPS_cmumps_c.h_DIRS}")
+else ()
+    set(MUMPS_PREC_C OFF)
+    if(NOT MUMPS_FIND_QUIETLY)
+        message(STATUS "Looking for mumps -- cmumps_c.h not found")
+    endif()
+endif()
+if (MUMPS_zmumps_c.h_DIRS)
+    mark_as_advanced(MUMPS_zmumps_c.h_DIRS)
+    set(MUMPS_PREC_Z ON)
+    set(MUMPS_INCLUDE_DIRS "${MUMPS_zmumps_c.h_DIRS}")
+else ()
+    set(MUMPS_PREC_Z OFF)
+    if(NOT MUMPS_FIND_QUIETLY)
+        message(STATUS "Looking for mumps -- zmumps_c.h not found")
+    endif()
+endif()
+
+# Looking for lib
+# ---------------
+
+# Try to find the mumps lib in the given paths
+# --------------------------------------------
+
+# call cmake macro to find the lib path
+if(MUMPS_DIR)
+    set(MUMPS_smumps_LIBRARY "MUMPS_smumps_LIBRARY-NOTFOUND")
+    find_library(MUMPS_smumps_LIBRARY
+                 NAMES smumps
+                 HINTS ${MUMPS_DIR}
+                 PATH_SUFFIXES lib)
+    set(MUMPS_dmumps_LIBRARY "MUMPS_dmumps_LIBRARY-NOTFOUND")
+    find_library(MUMPS_dmumps_LIBRARY
+                 NAMES dmumps
+                 HINTS ${MUMPS_DIR}
+                 PATH_SUFFIXES lib)
+    set(MUMPS_cmumps_LIBRARY "MUMPS_cmumps_LIBRARY-NOTFOUND")
+    find_library(MUMPS_cmumps_LIBRARY
+                 NAMES cmumps
+                 HINTS ${MUMPS_DIR}
+                 PATH_SUFFIXES lib)
+    set(MUMPS_zmumps_LIBRARY "MUMPS_zmumps_LIBRARY-NOTFOUND")
+    find_library(MUMPS_zmumps_LIBRARY
+                 NAMES zmumps
+                 HINTS ${MUMPS_DIR}
+                 PATH_SUFFIXES lib)
+    set(MUMPS_mumps_common_LIBRARY "MUMPS_mumps_common_LIBRARY-NOTFOUND")
+    find_library(MUMPS_mumps_common_LIBRARY
+                 NAMES mumps_common
+                 HINTS ${MUMPS_DIR}
+                 PATH_SUFFIXES lib)
+    set(MUMPS_mpiseq_LIBRARY "MUMPS_mpiseq_LIBRARY-NOTFOUND")
+    find_library(MUMPS_mpiseq_LIBRARY
+                 NAMES mpiseq
+                 HINTS ${MUMPS_DIR}
+                 PATH_SUFFIXES libseq)
+    set(MUMPS_pord_LIBRARY "MUMPS_pord_LIBRARY-NOTFOUND")
+    find_library(MUMPS_pord_LIBRARY
+                 NAMES pord
+                 HINTS ${MUMPS_DIR}
+                 PATH_SUFFIXES lib)
+else()
+    if (MUMPS_FIND_REQUIRED)
+        message(FATAL_ERROR "Looking for mumps -- MUMPS_DIR is not set, to find"
+        " MUMPS please set MUMPS_DIR, the path to MUMPS installation where"
+        " sub-directories include/ and lib/ are located")
+    else()
+        if(NOT MUMPS_FIND_QUIETLY)
+            message(STATUS "Looking for mumps -- MUMPS_DIR is not set, to find"
+            " MUMPS please set MUMPS_DIR, the path to MUMPS installation where"
+            " sub-directories include/ and lib/ are located")
+        endif()
+    endif()
+endif()
+
+# If found, add path to cmake variable
+# ------------------------------------
+set(MUMPS_LIBRARIES "")
+set(MUMPS_LIBRARY_DIRS "")
+# detect which precisions are available
+if (MUMPS_smumps_LIBRARY)
+    mark_as_advanced(MUMPS_smumps_LIBRARY)
+    list(APPEND MUMPS_LIBRARIES "${MUMPS_smumps_LIBRARY}")
+    get_filename_component(smumps_lib_path ${MUMPS_smumps_LIBRARY} PATH)
+    list(APPEND MUMPS_LIBRARY_DIRS "${smumps_lib_path}")
+else ()
+    set(MUMPS_PREC_S OFF)
+    if(NOT MUMPS_FIND_QUIETLY)
+        message(STATUS "Looking for mumps -- libsmumps.a not found")
+    endif()
+endif()
+if (MUMPS_dmumps_LIBRARY)
+    mark_as_advanced(MUMPS_dmumps_LIBRARY)
+    list(APPEND MUMPS_LIBRARIES "${MUMPS_dmumps_LIBRARY}")
+    get_filename_component(dmumps_lib_path ${MUMPS_dmumps_LIBRARY} PATH)
+    list(APPEND MUMPS_LIBRARY_DIRS "${dmumps_lib_path}")
+else ()
+    set(MUMPS_PREC_D OFF)
+    if(NOT MUMPS_FIND_QUIETLY)
+        message(STATUS "Looking for mumps -- libdmumps.a not found")
+    endif()
+endif()
+if (MUMPS_cmumps_LIBRARY)
+    mark_as_advanced(MUMPS_cmumps_LIBRARY)
+    list(APPEND MUMPS_LIBRARIES "${MUMPS_cmumps_LIBRARY}")
+    get_filename_component(cmumps_lib_path ${MUMPS_cmumps_LIBRARY} PATH)
+    list(APPEND MUMPS_LIBRARY_DIRS "${cmumps_lib_path}")
+else ()
+    set(MUMPS_PREC_C OFF)
+    if(NOT MUMPS_FIND_QUIETLY)
+        message(STATUS "Looking for mumps -- libcmumps.a not found")
+    endif()
+endif()
+if (MUMPS_zmumps_LIBRARY)
+    mark_as_advanced(MUMPS_zmumps_LIBRARY)
+    list(APPEND MUMPS_LIBRARIES "${MUMPS_zmumps_LIBRARY}")
+    get_filename_component(zmumps_lib_path ${MUMPS_zmumps_LIBRARY} PATH)
+    list(APPEND MUMPS_LIBRARY_DIRS "${zmumps_lib_path}")
+else ()
+    set(MUMPS_PREC_Z OFF)
+    if(NOT MUMPS_FIND_QUIETLY)
+        message(STATUS "Looking for mumps -- libzmumps.a not found")
+    endif()
+endif()
+list(REMOVE_DUPLICATES MUMPS_LIBRARY_DIRS)
+# check that one precision arithmetic at least has been discovered
+if (NOT MUMPS_PREC_S AND NOT MUMPS_PREC_D AND NOT MUMPS_PREC_C AND NOT MUMPS_PREC_S)
+    if (MUMPS_FIND_REQUIRED)
+        message(FATAL_ERROR "Looking for mumps -- "
+        "no lib[sdcz]mumps.a have been found in ${MUMPS_DIR}/lib when required")
+    else()
+        if(NOT MUMPS_FIND_QUIETLY)
+            message(STATUS "Looking for mumps -- no lib[sdcz]mumps.a have been found")
+        endif()
+    endif()
+endif()
+# other MUMPS libraries
+if (MUMPS_mumps_common_LIBRARY)
+    mark_as_advanced(MUMPS_mumps_common_LIBRARY)
+    list(APPEND MUMPS_LIBRARIES "${MUMPS_mumps_common_LIBRARY}")
+    get_filename_component(mumps_common_lib_path ${MUMPS_mumps_common_LIBRARY} PATH)
+    list(APPEND MUMPS_LIBRARY_DIRS "${mumps_common_lib_path}")
+else ()
+    if (MUMPS_FIND_REQUIRED)
+        message(FATAL_ERROR "Looking for mumps -- "
+        "libmumps_common.a not found in ${MUMPS_DIR}/lib when required")
+    else()
+        if(NOT MUMPS_FIND_QUIETLY)
+            message(STATUS "Looking for mumps -- libmumps_common.a not found")
+        endif()
+    endif()
+endif()
+if (MUMPS_mpiseq_LIBRARY)
+    mark_as_advanced(MUMPS_mpiseq_LIBRARY)
+    if (MUMPS_LOOK_FOR_SEQ)
+        list(APPEND MUMPS_LIBRARIES "${MUMPS_mpiseq_LIBRARY}")
+        get_filename_component(mpiseq_lib_path ${MUMPS_mpiseq_LIBRARY} PATH)
+        list(APPEND MUMPS_LIBRARY_DIRS "${mpiseq_lib_path}")
+    endif()
+else ()
+    if (MUMPS_FIND_REQUIRED AND MUMPS_LOOK_FOR_SEQ)
+        message(FATAL_ERROR "Looking for mumps -- "
+        "libmpiseq.a not found in ${MUMPS_DIR}/libseq when required")
+    else()
+        if(NOT MUMPS_FIND_QUIETLY)
+            message(STATUS "Looking for mumps -- libmpiseq.a not found")
+        endif()
+    endif()
+endif()
+if (MUMPS_pord_LIBRARY)
+    mark_as_advanced(MUMPS_pord_LIBRARY)
+    list(APPEND MUMPS_LIBRARIES "${MUMPS_pord_LIBRARY}")
+    get_filename_component(pord_lib_path ${MUMPS_pord_LIBRARY} PATH)
+    list(APPEND MUMPS_LIBRARY_DIRS "${pord_lib_path}")
+else ()
+    if (MUMPS_FIND_REQUIRED)
+        message(FATAL_ERROR "Looking for mumps -- "
+        "libpord.a not found in ${MUMPS_DIR}/lib when required")
+    else()
+        if(NOT MUMPS_FIND_QUIETLY)
+            message(STATUS "Looking for mumps -- libpord.a not found")
+        endif()
+    endif()
+endif()
+
+
+if(MUMPS_LIBRARIES)
+    # check a function to validate the find
+    if (MUMPS_INCLUDE_DIRS)
+        set(CMAKE_REQUIRED_INCLUDES "${MUMPS_INCLUDE_DIRS}")
+    endif()
+    set(CMAKE_REQUIRED_FLAGS)
+    foreach(libdir ${MUMPS_LIBRARY_DIRS})
+        if (libdir)
+            set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -L${libdir}")
+        endif()
+    endforeach()
+    set(CMAKE_REQUIRED_LIBRARIES "${MUMPS_LIBRARIES}")
+    if (BLAS_FOUND)
+        if (BLAS_INCLUDE_DIRS)
+            list(APPEND CMAKE_REQUIRED_INCLUDES "${BLAS_INCLUDE_DIRS}")
+        endif()
+        foreach(libdir ${BLAS_LIBRARY_DIRS})
+            if (libdir)
+                set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -L${libdir}")
+            endif()
+        endforeach()
+        list(APPEND CMAKE_REQUIRED_LIBRARIES "${BLAS_LIBRARIES}")
+    endif()
+    if (SCALAPACK_FOUND AND MUMPS_LOOK_FOR_MPI OR MUMPS_FIND_REQUIRED_MPI)
+        if (SCALAPACK_INCLUDE_DIRS)
+            list(APPEND CMAKE_REQUIRED_INCLUDES "${SCALAPACK_INCLUDE_DIRS}")
+        endif()
+        foreach(libdir ${SCALAPACK_LIBRARY_DIRS})
+            if (libdir)
+                set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -L${libdir}")
+            endif()
+        endforeach()
+        list(APPEND CMAKE_REQUIRED_LIBRARIES "${SCALAPACK_LIBRARIES}")
+    endif()
+    if (MPI_FOUND AND MUMPS_LOOK_FOR_MPI OR MUMPS_FIND_REQUIRED_MPI)
+        if (MPI_C_INCLUDE_PATH)
+            list(APPEND CMAKE_REQUIRED_INCLUDES "${MPI_C_INCLUDE_PATH}")
+        endif()
+        list(APPEND CMAKE_REQUIRED_LIBRARIES "${MPI_C_LIBRARIES}")
+    endif()
+    if (MUMPS_FIND_REQUIRED_SCOTCH)
+        if (SCOTCH_INCLUDE_DIRS)
+            list(APPEND CMAKE_REQUIRED_INCLUDES "${SCOTCH_INCLUDE_DIRS}")
+        endif()
+        foreach(libdir ${SCOTCH_LIBRARY_DIRS})
+            if (libdir)
+                set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -L${libdir}")
+            endif()
+        endforeach()
+        list(APPEND CMAKE_REQUIRED_LIBRARIES "${SCOTCH_LIBRARIES}")
+    endif()
+    if (MUMPS_FIND_REQUIRED_METIS)
+        if (METIS_INCLUDE_DIRS)
+            list(APPEND CMAKE_REQUIRED_INCLUDES "${METIS_INCLUDE_DIRS}")
+        endif()
+        foreach(libdir ${METIS_LIBRARY_DIRS})
+            if (libdir)
+                set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -L${libdir}")
+            endif()
+        endforeach()
+        list(APPEND CMAKE_REQUIRED_LIBRARIES "${METIS_LIBRARIES}")
+    endif()
+    if (CMAKE_Fortran_COMPILER MATCHES ".+gfortran.*")
+        list(APPEND CMAKE_REQUIRED_LIBRARIES "-lgfortran")
+    elseif (CMAKE_Fortran_COMPILER MATCHES ".+ifort.*")
+        list(APPEND CMAKE_REQUIRED_LIBRARIES "-lifcore")
+    endif()
+    list(APPEND CMAKE_REQUIRED_LIBRARIES ${MUMPS_EXTRA_LIBRARIES})
+
+    include(CheckFortranFunctionExists)
+    unset(MUMPS_PREC_S_WORKS CACHE)
+    check_fortran_function_exists(smumps MUMPS_PREC_S_WORKS)
+    mark_as_advanced(MUMPS_PREC_S_WORKS)
+    unset(MUMPS_PREC_D_WORKS CACHE)
+    check_fortran_function_exists(dmumps MUMPS_PREC_D_WORKS)
+    mark_as_advanced(MUMPS_PREC_D_WORKS)
+    unset(MUMPS_PREC_C_WORKS CACHE)
+    check_fortran_function_exists(cmumps MUMPS_PREC_C_WORKS)
+    mark_as_advanced(MUMPS_PREC_C_WORKS)
+    unset(MUMPS_PREC_Z_WORKS CACHE)
+    check_fortran_function_exists(zmumps MUMPS_PREC_Z_WORKS)
+    mark_as_advanced(MUMPS_PREC_Z_WORKS)
+
+    set(MUMPS_WORKS FALSE)
+    if(MUMPS_PREC_S_WORKS OR MUMPS_PREC_D_WORKS OR MUMPS_PREC_C_WORKS OR MUMPS_PREC_Z_WORKS)
+        set(MUMPS_WORKS TRUE)
+    endif()
+
+    if (NOT MUMPS_WORKS)
+        if (SCOTCH_FOUND AND NOT MUMPS_FIND_REQUIRED_SCOTCH)
+            if (SCOTCH_INCLUDE_DIRS)
+                list(APPEND CMAKE_REQUIRED_INCLUDES "${SCOTCH_INCLUDE_DIRS}")
+            endif()
+            foreach(libdir ${SCOTCH_LIBRARY_DIRS})
+                if (libdir)
+                    set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -L${libdir}")
+                endif()
+            endforeach()
+            list(APPEND CMAKE_REQUIRED_LIBRARIES "${SCOTCH_LIBRARIES}")
+        endif()
+        check_fortran_function_exists(smumps MUMPS_PREC_S_WORKS)
+        check_fortran_function_exists(dmumps MUMPS_PREC_D_WORKS)
+        check_fortran_function_exists(cmumps MUMPS_PREC_C_WORKS)
+        check_fortran_function_exists(zmumps MUMPS_PREC_Z_WORKS)
+    endif()
+
+    set(MUMPS_WORKS FALSE)
+    if(MUMPS_PREC_S_WORKS OR MUMPS_PREC_D_WORKS OR MUMPS_PREC_C_WORKS OR MUMPS_PREC_Z_WORKS)
+        set(MUMPS_WORKS TRUE)
+    endif()
+
+    if (NOT MUMPS_WORKS)
+        if (METIS_FOUND AND NOT MUMPS_FIND_REQUIRED_METIS)
+            if (METIS_INCLUDE_DIRS)
+                list(APPEND CMAKE_REQUIRED_INCLUDES "${METIS_INCLUDE_DIRS}")
+            endif()
+            foreach(libdir ${METIS_LIBRARY_DIRS})
+                if (libdir)
+                    set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -L${libdir}")
+                endif()
+            endforeach()
+            list(APPEND CMAKE_REQUIRED_LIBRARIES "${METIS_LIBRARIES}")
+        endif()
+        check_fortran_function_exists(smumps MUMPS_PREC_S_WORKS)
+        check_fortran_function_exists(dmumps MUMPS_PREC_D_WORKS)
+        check_fortran_function_exists(cmumps MUMPS_PREC_C_WORKS)
+        check_fortran_function_exists(zmumps MUMPS_PREC_Z_WORKS)
+    endif()
+
+    set(MUMPS_WORKS FALSE)
+    if(MUMPS_PREC_S_WORKS OR MUMPS_PREC_D_WORKS OR MUMPS_PREC_C_WORKS OR MUMPS_PREC_Z_WORKS)
+        set(MUMPS_WORKS TRUE)
+    endif()
+
+    if(MUMPS_WORKS)
+        string(REPLACE " -L" ";" CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
+        set(MUMPS_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}")
+        set(MUMPS_LIBRARY_DIRS "${CMAKE_REQUIRED_FLAGS}")
+        set(MUMPS_INCLUDE_DIRS "${CMAKE_REQUIRED_INCLUDES}")
+    else()
+        if(NOT MUMPS_FIND_QUIETLY)
+            message(STATUS "Looking for MUMPS : test of [sdcz]mumps() fails")
+            message(STATUS "MUMPS_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}")
+            message(STATUS "MUMPS_LIBRARY_DIRS: ${CMAKE_REQUIRED_FLAGS}")
+            message(STATUS "MUMPS_INCLUDE_DIRS: ${CMAKE_REQUIRED_INCLUDES}")
+            message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails")
+            message(STATUS "Looking for mumps : set MUMPS_LIBRARIES to NOTFOUND")
+        endif()
+        set(MUMPS_LIBRARIES "MUMPS_LIBRARIES-NOTFOUND")
+    endif()
+    set(CMAKE_REQUIRED_INCLUDES)
+    set(CMAKE_REQUIRED_FLAGS)
+    set(CMAKE_REQUIRED_LIBRARIES)
+endif(MUMPS_LIBRARIES)
+
+
+# check that MUMPS has been found
+# ---------------------------------
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(MUMPS DEFAULT_MSG
+                                  MUMPS_LIBRARIES)
diff --git a/cmake_modules/morse/find/FindSCALAPACK.cmake b/cmake_modules/morse/find/FindSCALAPACK.cmake
new file mode 100644
index 000000000..4d9151880
--- /dev/null
+++ b/cmake_modules/morse/find/FindSCALAPACK.cmake
@@ -0,0 +1,450 @@
+###
+#
+# @copyright (c) 2009-2014 The University of Tennessee and The University
+#                          of Tennessee Research Foundation.
+#                          All rights reserved.
+# @copyright (c) 2012-2014 Inria. All rights reserved.
+# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved.
+#
+###
+#
+# - Find SCALAPACK library
+# This module finds an installed fortran library that implements the SCALAPACK
+# linear-algebra interface.
+#
+# This module sets the following variables:
+#  SCALAPACK_FOUND - set to true if a library implementing the SCALAPACK interface
+#    is found
+#  SCALAPACK_LINKER_FLAGS - uncached list of required linker flags (excluding -l
+#    and -L).
+#  SCALAPACK_LIBRARIES - uncached list of libraries (using full path name) to
+#    link against to use SCALAPACK
+#  SCALAPACK95_LIBRARIES - uncached list of libraries (using full path name) to
+#    link against to use SCALAPACK95
+#  SCALAPACK95_FOUND - set to true if a library implementing the SCALAPACK f95
+#    interface is found
+#  BLA_STATIC  if set on this determines what kind of linkage we do (static)
+#  BLA_VENDOR  if set checks only the specified vendor, if not set checks
+#     all the possibilities
+#  BLA_F95     if set on tries to find the f95 interfaces for BLAS/SCALAPACK
+# The user can give specific paths where to find the libraries adding cmake
+# options at configure (ex: cmake path/to/project -DSCALAPACK_DIR=path/to/scalapack):
+#  SCALAPACK_DIR            - Where to find the base directory of scalapack
+#  SCALAPACK_INCDIR         - Where to find the header files
+#  SCALAPACK_LIBDIR         - Where to find the library files
+# Note that if BLAS_DIR is set, it will also look for scalapack in it
+### List of vendors (BLA_VENDOR) valid in this module
+##  Intel(mkl), ACML, Apple, NAS, Generic
+
+#=============================================================================
+# Copyright 2007-2009 Kitware, Inc.
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+#  License text for the above reference.)
+
+
+# Set some colors
+if(NOT WIN32)
+    string(ASCII 27 Esc)
+    set(ColourReset "${Esc}[m")
+    set(ColourBold  "${Esc}[1m")
+    set(Red         "${Esc}[31m")
+    set(Green       "${Esc}[32m")
+    set(Yellow      "${Esc}[33m")
+    set(Blue        "${Esc}[34m")
+    set(Magenta     "${Esc}[35m")
+    set(Cyan        "${Esc}[36m")
+    set(White       "${Esc}[37m")
+    set(BoldRed     "${Esc}[1;31m")
+    set(BoldGreen   "${Esc}[1;32m")
+    set(BoldYellow  "${Esc}[1;33m")
+    set(BoldBlue    "${Esc}[1;34m")
+    set(BoldMagenta "${Esc}[1;35m")
+    set(BoldCyan    "${Esc}[1;36m")
+    set(BoldWhite   "${Esc}[1;37m")
+endif()
+
+## Some macros to print status when search for headers and libs
+# This macro informs why the _lib_to_find file has not been found
+macro(Print_Find_Library_Blas_Status _libname _lib_to_find)
+
+    # save _libname upper/lower case
+    string(TOUPPER ${_libname} LIBNAME)
+    string(TOLOWER ${_libname} libname)
+
+    # print status
+    #message(" ")
+    if(${LIBNAME}_LIBDIR)
+        message("${Yellow}${LIBNAME}_LIBDIR is defined but ${_lib_to_find}"
+                "has not been found in ${ARGN}${ColourReset}")
+    else()
+        if(${LIBNAME}_DIR)
+            message("${Yellow}${LIBNAME}_DIR is defined but ${_lib_to_find}"
+                    "has not been found in ${ARGN}${ColourReset}")
+        else()
+            message("${Yellow}${_lib_to_find} not found."
+                    "Nor ${LIBNAME}_DIR neither ${LIBNAME}_LIBDIR"
+                    "are defined so that we look for ${_lib_to_find} in"
+                    "system paths (Linux: LD_LIBRARY_PATH, Windows: LIB,"
+                    "Mac: DYLD_LIBRARY_PATH,"
+                    "CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES,"
+                    "CMAKE_C_IMPLICIT_LINK_DIRECTORIES)${ColourReset}")
+            if(_lib_env)
+                message("${Yellow}${_lib_to_find} has not been found in"
+                        "${_lib_env}${ColourReset}")
+            endif()
+        endif()
+    endif()
+    message("${BoldYellow}Please indicate where to find ${_lib_to_find}. You have three options:\n"
+            "- Option 1: Provide the root directory of the library with cmake option: -D${LIBNAME}_DIR=your/path/to/${libname}/\n"
+            "- Option 2: Provide the directory where to find the library with cmake option: -D${LIBNAME}_LIBDIR=your/path/to/${libname}/lib/\n"
+            "- Option 3: Update your environment variable (Linux: LD_LIBRARY_PATH, Windows: LIB, Mac: DYLD_LIBRARY_PATH)\n"
+            "- Option 4: If your library provides a PkgConfig file, make sure pkg-config finds your library${ColourReset}")
+
+endmacro()
+
+if (NOT SCALAPACK_FOUND)
+    set(SCALAPACK_DIR "" CACHE PATH "Root directory of SCALAPACK library")
+    if (NOT SCALAPACK_FIND_QUIETLY)
+        message(STATUS "A cache variable, namely SCALAPACK_DIR, has been set to specify the install directory of SCALAPACK")
+    endif()
+endif (NOT SCALAPACK_FOUND)
+
+option(SCALAPACK_VERBOSE "Print some additional information during SCALAPACK
+libraries detection" OFF)
+if (BLAS_VERBOSE)
+    set(SCALAPACK_VERBOSE ON)
+endif ()
+set(_scalapack_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
+
+get_property(_LANGUAGES_ GLOBAL PROPERTY ENABLED_LANGUAGES)
+if (NOT _LANGUAGES_ MATCHES Fortran)
+include(CheckFunctionExists)
+else (NOT _LANGUAGES_ MATCHES Fortran)
+include(CheckFortranFunctionExists)
+endif (NOT _LANGUAGES_ MATCHES Fortran)
+
+set(SCALAPACK_FOUND FALSE)
+set(SCALAPACK95_FOUND FALSE)
+
+# TODO: move this stuff to separate module
+
+macro(Check_Scalapack_Libraries LIBRARIES _prefix _name _flags _list _blaslapack _mpi _threads)
+# This macro checks for the existence of the combination of fortran libraries
+# given by _list.  If the combination is found, this macro checks (using the
+# Check_Fortran_Function_Exists macro) whether can link against that library
+# combination using the name of a routine given by _name using the linker
+# flags given by _flags.  If the combination of libraries is found and passes
+# the link test, LIBRARIES is set to the list of complete library paths that
+# have been found.  Otherwise, LIBRARIES is set to FALSE.
+
+# N.B. _prefix is the prefix applied to the names of all cached variables that
+# are generated internally and marked advanced by this macro.
+
+set(_libraries_work TRUE)
+set(${LIBRARIES})
+set(_combined_name)
+if (NOT _libdir)
+  if (BLAS_DIR)
+    list(APPEND _libdir "${BLAS_DIR}")
+    list(APPEND _libdir "${BLAS_DIR}/lib")
+    if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
+        list(APPEND _libdir "${BLAS_DIR}/lib64")
+        list(APPEND _libdir "${BLAS_DIR}/lib/intel64")
+    else()
+        list(APPEND _libdir "${BLAS_DIR}/lib32")
+        list(APPEND _libdir "${BLAS_DIR}/lib/ia32")
+    endif()
+  endif ()
+  if (BLAS_LIBDIR)
+    list(APPEND _libdir "${BLAS_LIBDIR}")
+  endif ()
+  if (SCALAPACK_DIR)
+    list(APPEND _libdir "${SCALAPACK_DIR}")
+    list(APPEND _libdir "${SCALAPACK_DIR}/lib")
+    if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
+        list(APPEND _libdir "${SCALAPACK_DIR}/lib64")
+        list(APPEND _libdir "${SCALAPACK_DIR}/lib/intel64")
+    else()
+        list(APPEND _libdir "${SCALAPACK_DIR}/lib32")
+        list(APPEND _libdir "${SCALAPACK_DIR}/lib/ia32")
+    endif()
+  endif ()
+  if (SCALAPACK_LIBDIR)
+    list(APPEND _libdir "${SCALAPACK_LIBDIR}")
+  endif ()
+  if (WIN32)
+    string(REPLACE ":" ";" _libdir2 "$ENV{LIB}")
+  elseif (APPLE)
+    string(REPLACE ":" ";" _libdir2 "$ENV{DYLD_LIBRARY_PATH}")
+  else ()
+    string(REPLACE ":" ";" _libdir2 "$ENV{LD_LIBRARY_PATH}")
+  endif ()
+  list(APPEND _libdir "${_libdir2}")
+  list(APPEND _libdir "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}")
+  list(APPEND _libdir "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}")
+endif ()
+
+if (SCALAPACK_VERBOSE)
+    message("${Cyan}Try to find SCALAPACK libraries: ${_list}")
+endif ()
+
+foreach(_library ${_list})
+  set(_combined_name ${_combined_name}_${_library})
+
+  if(_libraries_work)
+    if (BLA_STATIC)
+      if (WIN32)
+        set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES})
+      endif ( WIN32 )
+      if (APPLE)
+        set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES})
+      else (APPLE)
+        set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
+      endif (APPLE)
+    else (BLA_STATIC)
+			if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
+        # for ubuntu's libblas3gf and libscalapack3gf packages
+        set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} .so.3gf)
+      endif ()
+    endif (BLA_STATIC)
+    find_library(${_prefix}_${_library}_LIBRARY
+      NAMES ${_library}
+      HINTS ${_libdir}
+      )
+    mark_as_advanced(${_prefix}_${_library}_LIBRARY)
+    # Print status if not found
+    # -------------------------
+    if (NOT ${_prefix}_${_library}_LIBRARY AND NOT SCALAPACK_FIND_QUIETLY AND SCALAPACK_VERBOSE)
+        Print_Find_Library_Blas_Status(scalapack ${_library} ${_libdir})
+    endif ()
+    set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})
+    set(_libraries_work ${${_prefix}_${_library}_LIBRARY})
+  endif(_libraries_work)
+endforeach(_library ${_list})
+
+if(_libraries_work)
+  # Test this combination of libraries.
+  if(UNIX AND BLA_STATIC)
+    set(CMAKE_REQUIRED_LIBRARIES ${_flags} "-Wl,--start-group" ${${LIBRARIES}} ${_blaslapack} "-Wl,--end-group" ${_mpi} ${_threads})
+  else(UNIX AND BLA_STATIC)
+    set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_blaslapack} ${_mpi} ${_threads})
+  endif(UNIX AND BLA_STATIC)
+  if (SCALAPACK_VERBOSE)
+      message("${Cyan}SCALAPACK libs found. Try to compile symbol ${_name} with"
+              "following libraries: ${CMAKE_REQUIRED_LIBRARIES}")
+  endif ()
+  if(NOT SCALAPACK_FOUND)
+    unset(${_prefix}${_combined_name}_WORKS CACHE)
+  endif()
+  if (NOT _LANGUAGES_ MATCHES Fortran)
+    check_function_exists("${_name}_" ${_prefix}${_combined_name}_WORKS)
+  else (NOT _LANGUAGES_ MATCHES Fortran)
+    check_fortran_function_exists(${_name} ${_prefix}${_combined_name}_WORKS)
+  endif (NOT _LANGUAGES_ MATCHES Fortran)
+  set(CMAKE_REQUIRED_LIBRARIES)
+  mark_as_advanced(${_prefix}${_combined_name}_WORKS)
+  set(_libraries_work ${${_prefix}${_combined_name}_WORKS})
+endif(_libraries_work)
+
+ if(_libraries_work)
+   set(${LIBRARIES} ${${LIBRARIES}} ${_blaslapack} ${_mpi} ${_threads})
+ else(_libraries_work)
+    set(${LIBRARIES} FALSE)
+ endif(_libraries_work)
+
+endmacro(Check_Scalapack_Libraries)
+
+
+set(SCALAPACK_LINKER_FLAGS)
+set(SCALAPACK_LIBRARIES)
+set(SCALAPACK95_LIBRARIES)
+
+if (NOT BLAS_FOUND)
+    if(SCALAPACK_FIND_QUIETLY OR NOT SCALAPACK_FIND_REQUIRED)
+        find_package(BLAS)
+    else()
+        find_package(BLAS REQUIRED)
+    endif()
+endif ()
+
+if (NOT LAPACK_FOUND)
+    if(SCALAPACK_FIND_QUIETLY OR NOT SCALAPACK_FIND_REQUIRED)
+        find_package(LAPACK)
+    else()
+        find_package(LAPACK REQUIRED)
+    endif()
+endif ()
+
+if (NOT MPI_FOUND)
+    if(SCALAPACK_FIND_QUIETLY OR NOT SCALAPACK_FIND_REQUIRED)
+        find_package(MPI)
+    else()
+        find_package(MPI REQUIRED)
+    endif()
+endif ()
+
+if(BLAS_FOUND AND LAPACK_FOUND AND MPI_FOUND)
+  set(SCALAPACK_LINKER_FLAGS ${BLAS_LINKER_FLAGS})
+  list(APPEND SCALAPACK_LINKER_FLAGS ${LAPACK_LINKER_FLAGS})
+  if ($ENV{BLA_VENDOR} MATCHES ".+")
+    set(BLA_VENDOR $ENV{BLA_VENDOR})
+  else ($ENV{BLA_VENDOR} MATCHES ".+")
+    if(NOT BLA_VENDOR)
+      set(BLA_VENDOR "All")
+    endif(NOT BLA_VENDOR)
+  endif ($ENV{BLA_VENDOR} MATCHES ".+")
+
+# Generic SCALAPACK library
+if (BLA_VENDOR STREQUAL "Generic" OR
+    BLA_VENDOR STREQUAL "All")
+  if ( NOT SCALAPACK_LIBRARIES )
+    check_scalapack_libraries(
+    SCALAPACK_LIBRARIES
+    SCALAPACK
+    pdgemm
+    ""
+    "scalapack" # scalapack lib to look for
+    "${LAPACK_LIBRARIES};${BLAS_LIBRARIES}" # blas and lapack libs
+    "${MPI_Fortran_LIBRARIES}" # mpi libs
+    ""          # threads libs
+    )
+  endif ( NOT SCALAPACK_LIBRARIES )
+endif ()
+#intel scalapack
+#if (BLA_VENDOR MATCHES "Intel" OR BLA_VENDOR STREQUAL "All")
+#  if (NOT WIN32)
+#    set(LM "-lm")
+#  endif ()
+#  if (_LANGUAGES_ MATCHES C OR _LANGUAGES_ MATCHES CXX)
+#    if(SCALAPACK_FIND_QUIETLY OR NOT SCALAPACK_FIND_REQUIRED)
+#      find_PACKAGE(Threads)
+#    else()
+#      find_package(Threads REQUIRED)
+#    endif()
+#
+#    set(SCALAPACK_SEARCH_LIBS "")
+#
+#    if (BLA_F95)
+#      set(SCALAPACK_mkl_SEARCH_SYMBOL "PDGEMM")
+#      set(_LIBRARIES SCALAPACK95_LIBRARIES)
+#      set(_BLAS_LIBRARIES ${BLAS95_LIBRARIES})
+#      list(APPEND SCALAPACK_SEARCH_LIBS "mkl_scalapack_lp64")
+#    else()
+#      set(SCALAPACK_mkl_SEARCH_SYMBOL "pdgemm")
+#      set(_LIBRARIES SCALAPACK_LIBRARIES)
+#      set(_BLAS_LIBRARIES ${BLAS_LIBRARIES})
+#      list(APPEND SCALAPACK_SEARCH_LIBS "mkl_scalapack_lp64")
+#    endif()
+#
+    # First try empty scalapack libs
+#    if (NOT ${_LIBRARIES})
+#      check_scalapack_libraries(
+#        ${_LIBRARIES}
+#        BLAS
+#        ${SCALAPACK_mkl_SEARCH_SYMBOL}
+#        ""
+#        ""
+#        "${_BLAS_LIBRARIES}"
+#        "mkl_blacs_intelmpi_lp64"
+#        "${CMAKE_THREAD_LIBS_INIT};${LM}"
+#        )
+#    endif ()
+    # Then try the search libs
+#    foreach (IT ${SCALAPACK_SEARCH_LIBS})
+#      if (NOT ${_LIBRARIES})
+#        check_scalapack_libraries(
+#          ${_LIBRARIES}
+#          BLAS
+#          ${SCALAPACK_mkl_SEARCH_SYMBOL}
+#          ""
+#          "${IT}"
+#          "${_BLAS_LIBRARIES}"
+#          "mkl_blacs_intelmpi_lp64"
+#          "${CMAKE_THREAD_LIBS_INIT};${LM}"
+#          )
+#      endif ()
+#    endforeach ()
+#  endif ()
+#endif()
+else(BLAS_FOUND AND LAPACK_FOUND AND MPI_FOUND)
+  message(STATUS "SCALAPACK requires BLAS, LAPACK, and MPI")
+endif(BLAS_FOUND AND LAPACK_FOUND AND MPI_FOUND)
+
+if(BLA_F95)
+ if(SCALAPACK95_LIBRARIES)
+  set(SCALAPACK95_FOUND TRUE)
+ else(SCALAPACK95_LIBRARIES)
+  set(SCALAPACK95_FOUND FALSE)
+ endif(SCALAPACK95_LIBRARIES)
+ if(NOT SCALAPACK_FIND_QUIETLY)
+  if(SCALAPACK95_FOUND)
+    message(STATUS "A library with SCALAPACK95 API found.")
+    message(STATUS "SCALAPACK_LIBRARIES ${SCALAPACK_LIBRARIES}")
+  else(SCALAPACK95_FOUND)
+    message(WARNING "BLA_VENDOR has been set to ${BLA_VENDOR} but SCALAPACK 95 libraries could not be found or check of symbols failed."
+        "\nPlease indicate where to find SCALAPACK libraries. You have three options:\n"
+        "- Option 1: Provide the root directory of SCALAPACK library with cmake option: -DSCALAPACK_DIR=your/path/to/scalapack\n"
+        "- Option 2: Provide the directory where to find BLAS libraries with cmake option: -DBLAS_LIBDIR=your/path/to/blas/libs\n"
+        "- Option 3: Update your environment variable (Linux: LD_LIBRARY_PATH, Windows: LIB, Mac: DYLD_LIBRARY_PATH)\n"
+        "\nTo follow libraries detection more precisely you can activate a verbose mode with -DSCALAPACK_VERBOSE=ON at cmake configure."
+        "\nYou could also specify a BLAS vendor to look for by setting -DBLA_VENDOR=blas_vendor_name."
+        "\nList of possible BLAS vendor: Goto, ATLAS PhiPACK, CXML, DXML, SunPerf, SCSL, SGIMATH, IBMESSL, Intel10_32 (intel mkl v10 32 bit),"
+        "Intel10_64lp (intel mkl v10 64 bit, lp thread model, lp64 model), Intel10_64lp_seq (intel mkl v10 64 bit, sequential code, lp64 model),"
+        "Intel( older versions of mkl 32 and 64 bit), ACML, ACML_MP, ACML_GPU, Apple, NAS, Generic")
+    if(SCALAPACK_FIND_REQUIRED)
+      message(FATAL_ERROR
+      "A required library with SCALAPACK95 API not found. Please specify library location."
+      )
+    else(SCALAPACK_FIND_REQUIRED)
+      message(STATUS
+      "A library with SCALAPACK95 API not found. Please specify library location."
+      )
+    endif(SCALAPACK_FIND_REQUIRED)
+  endif(SCALAPACK95_FOUND)
+ endif(NOT SCALAPACK_FIND_QUIETLY)
+ set(SCALAPACK_FOUND "${SCALAPACK95_FOUND}")
+ set(SCALAPACK_LIBRARIES "${SCALAPACK95_LIBRARIES}")
+else(BLA_F95)
+ if(SCALAPACK_LIBRARIES)
+  set(SCALAPACK_FOUND TRUE)
+ else(SCALAPACK_LIBRARIES)
+  set(SCALAPACK_FOUND FALSE)
+ endif(SCALAPACK_LIBRARIES)
+
+ if(NOT SCALAPACK_FIND_QUIETLY)
+  if(SCALAPACK_FOUND)
+    message(STATUS "A library with SCALAPACK API found.")
+    message(STATUS "SCALAPACK_LIBRARIES ${SCALAPACK_LIBRARIES}")
+  else(SCALAPACK_FOUND)
+    message(WARNING "BLA_VENDOR has been set to ${BLA_VENDOR} but SCALAPACK libraries could not be found or check of symbols failed."
+        "\nPlease indicate where to find SCALAPACK libraries. You have three options:\n"
+        "- Option 1: Provide the root directory of SCALAPACK library with cmake option: -DSCALAPACK_DIR=your/path/to/scalapack\n"
+        "- Option 2: Provide the directory where to find BLAS libraries with cmake option: -DBLAS_LIBDIR=your/path/to/blas/libs\n"
+        "- Option 3: Update your environment variable (Linux: LD_LIBRARY_PATH, Windows: LIB, Mac: DYLD_LIBRARY_PATH)\n"
+        "\nTo follow libraries detection more precisely you can activate a verbose mode with -DSCALAPACK_VERBOSE=ON at cmake configure."
+        "\nYou could also specify a BLAS vendor to look for by setting -DBLA_VENDOR=blas_vendor_name."
+        "\nList of possible BLAS vendor: Goto, ATLAS PhiPACK, CXML, DXML, SunPerf, SCSL, SGIMATH, IBMESSL, Intel10_32 (intel mkl v10 32 bit),"
+        "Intel10_64lp (intel mkl v10 64 bit, lp thread model, lp64 model), Intel10_64lp_seq (intel mkl v10 64 bit, sequential code, lp64 model),"
+        "Intel( older versions of mkl 32 and 64 bit), ACML, ACML_MP, ACML_GPU, Apple, NAS, Generic")
+    if(SCALAPACK_FIND_REQUIRED)
+      message(FATAL_ERROR
+      "A required library with SCALAPACK API not found. Please specify library location."
+      )
+    else(SCALAPACK_FIND_REQUIRED)
+      message(STATUS
+      "A library with SCALAPACK API not found. Please specify library location."
+      )
+    endif(SCALAPACK_FIND_REQUIRED)
+  endif(SCALAPACK_FOUND)
+ endif(NOT SCALAPACK_FIND_QUIETLY)
+endif(BLA_F95)
+
+set(CMAKE_FIND_LIBRARY_SUFFIXES ${_scalapack_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
-- 
GitLab