#----------------------------------------------------------------------------
# OpenSees
#----------------------------------------------------------------------------
# This file was copied from the Eigen project at
#	https://github.com/libigl/eigen/blob/master/cmake/FindSuperLU.cmake
# Redistribution and modification are subject to the terms and conditions of 
# the Eigen project.
#----------------------------------------------------------------------------

# Umfpack lib usually requires linking to a blas library.
# It is up to the user of this module to find a BLAS and link to it.

if (SUPERLU_INCLUDES AND SUPERLU_LIBRARIES)
  set(SUPERLU_FIND_QUIETLY TRUE)
endif ()

find_path(SUPERLU_INCLUDES
  NAMES
  supermatrix.h
  PATHS
  $ENV{SUPERLUDIR}
  ${INCLUDE_INSTALL_DIR}
  PATH_SUFFIXES
  superlu
  SRC
)

message("Looking for SuperLu in $ENV{SUPERLU_DIR}")

find_library(SUPERLU_LIBRARIES
  NAMES "superlu_5.2.1" "superlu_5.2" "superlu_5.1.1" "superlu_5.1" "superlu_5.0" "superlu_4.3" "superlu_4.2" "superlu_4.1" "superlu_4.0" "superlu_3.1" "superlu_3.0" "superlu"
  PATHS $ENV{SUPERLU_DIR} ${LIB_INSTALL_DIR}
  PATH_SUFFIXES lib
)


if(SUPERLU_INCLUDES AND SUPERLU_LIBRARIES)

  include(CheckCXXSourceCompiles)
  include(CMakePushCheckState)
  cmake_push_check_state()
  
  set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${SUPERLU_INCLUDES})
  
  # check whether struct mem_usage_t is globally defined
  check_cxx_source_compiles("
  typedef int int_t;
  #include <supermatrix.h>
  #include <slu_util.h>
  int main() {
    mem_usage_t mem;
    return 0;
  }"
  SUPERLU_HAS_GLOBAL_MEM_USAGE_T)
  
  
  check_cxx_source_compiles("
  typedef int int_t;
  #include <supermatrix.h>
  #include <superlu_enum_consts.h>
  int main() {
    return SLU_SINGLE;
  }"
  SUPERLU_HAS_CLEAN_ENUMS)
  
  check_cxx_source_compiles("
  typedef int int_t;
  #include <supermatrix.h>
  #include <slu_util.h>
  int main(void)
  {
    GlobalLU_t glu;
    return 0;
  }"
  SUPERLU_HAS_GLOBALLU_T)
  
  if(SUPERLU_HAS_GLOBALLU_T)
    # at least 5.0
    set(SUPERLU_VERSION_VAR "5.0")
  elseif(SUPERLU_HAS_CLEAN_ENUMS)
    # at least 4.3
    set(SUPERLU_VERSION_VAR "4.3")
  elseif(SUPERLU_HAS_GLOBAL_MEM_USAGE_T)
    # at least 4.0
    set(SUPERLU_VERSION_VAR "4.0")
  else()
    set(SUPERLU_VERSION_VAR "3.0")
  endif()
  
  cmake_pop_check_state()
  
  if(SuperLU_FIND_VERSION)
    if(${SUPERLU_VERSION_VAR} VERSION_LESS ${SuperLU_FIND_VERSION})
      set(SUPERLU_VERSION_OK FALSE)
    else()
      set(SUPERLU_VERSION_OK TRUE)
    endif()
  else()
    set(SUPERLU_VERSION_OK TRUE)
  endif()

endif()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(SUPERLU
                                  REQUIRED_VARS SUPERLU_INCLUDES SUPERLU_LIBRARIES SUPERLU_VERSION_OK
                                  VERSION_VAR SUPERLU_VERSION_VAR)

mark_as_advanced(SUPERLU_INCLUDES SUPERLU_LIBRARIES)

