1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
# - Try to find UMFPACK
# Once done this will define
#
# UMFPACK_FOUND - system has UMFPACK
# UMFPACK_INCLUDE_DIRS - include directories for UMFPACK
# UMFPACK_LIBRARIES - libraries for UMFPACK
message(STATUS "Checking for package 'UMFPACK'")
# Find packages that UMFPACK depends on
#set(CMAKE_LIBRARY_PATH ${BLAS_DIR}/lib $ENV{BLAS_DIR}/lib ${CMAKE_LIBRARY_PATH})
find_package(AMD QUIET)
find_package(BLAS QUIET)
find_package(CHOLMOD QUIET)
# Check for header file
find_path(UMFPACK_INCLUDE_DIRS umfpack.h
HINTS ${UMFPACK_DIR}/include $ENV{UMFPACK_DIR}/include ${PETSC_INCLUDE_DIRS} $ENV{PETSC_DIR}/include
PATH_SUFFIXES suitesparse ufsparse
DOC "Directory where the UMFPACK header is located")
mark_as_advanced(UMFPACK_INCLUDE_DIRS)
# Check for UMFPACK library
find_library(UMFPACK_LIBRARY umfpack
HINTS ${UMFPACK_DIR}/lib $ENV{UMFPACK_DIR}/lib ${PETSC_LIBRARY_DIRS} $ENV{PETSC_DIR}/lib
DOC "The UMFPACK library")
mark_as_advanced(UMFPACK_LIBRARY)
# Check for SUITESPARSE library on Apple
if (APPLE)
find_library(SUITESPARSE_LIBRARY SuiteSparse
HINTS ${UMFPACK_DIR}/lib $ENV{UMFPACK_DIR}/lib ${PETSC_LIBRARY_DIRS} $ENV{PETSC_DIR}/lib
DOC "The SUITESPARSE library")
mark_as_advanced(SUITESPARSE_LIBRARY)
endif()
# Check for SUITESPARSECONFIG library
find_library(SUITESPARSECONFIG_LIBRARY suitesparseconfig
HINTS ${UMFPACK_DIR}/lib $ENV{UMFPACK_DIR}/lib ${PETSC_LIBRARY_DIRS} $ENV{PETSC_DIR}/lib
DOC "The SUITESPARSE library")
mark_as_advanced(SUITESPARSECONFIG_LIBRARY)
# Collect libraries
if (AMD_FOUND)
set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARY} ${AMD_LIBRARIES})
endif()
if (BLAS_FOUND)
set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${BLAS_LIBRARIES})
endif()
if (CHOLMOD_FOUND)
set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${CHOLMOD_LIBRARIES})
endif()
if (SUITESPARSE_LIBRARY)
set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${SUITESPARSE_LIBRARY})
endif()
if (SUITESPARSECONFIG_LIBRARY)
set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${SUITESPARSECONFIG_LIBRARY})
endif()
find_program(GFORTRAN_EXECUTABLE gfortran)
if (GFORTRAN_EXECUTABLE)
execute_process(COMMAND ${GFORTRAN_EXECUTABLE} -print-file-name=libgfortran.so
OUTPUT_VARIABLE GFORTRAN_LIBRARY
OUTPUT_STRIP_TRAILING_WHITESPACE)
if (EXISTS "${GFORTRAN_LIBRARY}")
set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${GFORTRAN_LIBRARY})
endif()
endif()
# Try compiling and running test program
if (DOLFIN_SKIP_BUILD_TESTS)
set(UMFPACK_TEST_RUNS TRUE)
elseif (UMFPACK_INCLUDE_DIRS AND UMFPACK_LIBRARIES AND AMD_LIBRARIES)
# Set flags for building test program
set(CMAKE_REQUIRED_INCLUDES ${UMFPACK_INCLUDE_DIRS})
set(CMAKE_REQUIRED_LIBRARIES ${UMFPACK_LIBRARIES})
set(UMFPACK_TEST_LIB_CPP
"${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/umfpack_test_lib.cpp")
file(WRITE ${UMFPACK_TEST_LIB_CPP} "
/* Test program umfpack-ex1.c */
#include <umfpack.h>
int main()
{
int n = 5;
double x[5];
void *Symbolic, *Numeric;
int i;
int Ap[] = { 0, 2, 5, 9, 10, 12 };
int Ai[] = { 0, 1, 0, 2, 4, 1, 2, 3, 4, 2, 1, 4 };
double Ax[] = { 2, 3, 3, -1, 4, 4, -3, 1, 2, 2, 6, 1 };
double b[] = { 8, 45, -3, 3, 19 };
umfpack_di_symbolic(n, n, Ap, Ai, Ax, &Symbolic, NULL, NULL);
umfpack_di_numeric(Ap, Ai, Ax, Symbolic, &Numeric, NULL, NULL);
umfpack_di_free_symbolic(&Symbolic);
umfpack_di_solve(UMFPACK_A, Ap, Ai, Ax, x, b, Numeric, NULL, NULL);
umfpack_di_free_numeric(&Numeric);
return 0;
}
")
try_run(UMFPACK_TEST_LIB_EXITCODE
UMFPACK_TEST_LIB_COMPILED
${CMAKE_CURRENT_BINARY_DIR}
${UMFPACK_TEST_LIB_CPP}
CMAKE_FLAGS
"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}"
"-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}"
COMPILE_OUTPUT_VARIABLE UMFPACK_TEST_LIB_COMPILE_OUTPUT
RUN_OUTPUT_VARIABLE UMFPACK_TEST_LIB_OUTPUT
)
if (UMFPACK_TEST_LIB_COMPILED AND UMFPACK_TEST_LIB_EXITCODE EQUAL 0)
message(STATUS "Performing test UMFPACK_TEST_RUNS - Success")
set(UMFPACK_TEST_RUNS TRUE)
else()
message(STATUS "Performing test UMFPACK_TEST_RUNS - Failed")
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"Failed to run UMFPACK test:\n"
"CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}\n"
"CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}\n"
"CMAKE_REQUIRED_FLAGS: ${CMAKE_REQUIRED_FLAGS}\n"
"UMFPACK_TEST_LIB_EXITCODE: ${UMFPACK_TEST_LIB_EXITCODE}\n"
"UMFPACK_TEST_LIB_COMPILED: ${UMFPACK_TEST_LIB_COMPILED}\n"
"UMFPACK_TEST_LIB_COMPILE_OUTPUT: ${UMFPACK_TEST_LIB_COMPILE_OUTPUT}\n"
"UMFPACK_TEST_LIB_OUTPUT: ${UMFPACK_TEST_LIB_OUTPUT}\n\n")
endif()
# Build and run test program
include(CheckCXXSourceRuns)
check_cxx_source_runs("
/* Test program umfpack-ex1.c */
#include <umfpack.h>
int main()
{
int n = 5;
double x[5];
void *Symbolic, *Numeric;
int i;
int Ap[] = { 0, 2, 5, 9, 10, 12 };
int Ai[] = { 0, 1, 0, 2, 4, 1, 2, 3, 4, 2, 1, 4 };
double Ax[] = { 2, 3, 3, -1, 4, 4, -3, 1, 2, 2, 6, 1 };
double b[] = { 8, 45, -3, 3, 19 };
umfpack_di_symbolic(n, n, Ap, Ai, Ax, &Symbolic, NULL, NULL);
umfpack_di_numeric(Ap, Ai, Ax, Symbolic, &Numeric, NULL, NULL);
umfpack_di_free_symbolic(&Symbolic);
umfpack_di_solve(UMFPACK_A, Ap, Ai, Ax, x, b, Numeric, NULL, NULL);
umfpack_di_free_numeric(&Numeric);
return 0;
}
" UMFPACK_TEST_RUNS)
endif()
# Standard package handling
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(UMFPACK
"UMFPACK could not be found. Be sure to set UMFPACK_DIR."
UMFPACK_LIBRARIES UMFPACK_INCLUDE_DIRS AMD_LIBRARIES BLAS_LIBRARIES
UMFPACK_TEST_RUNS)
|