set (SOLVERLAB_VERSION_SUBMINOR alpha)
option (SOLVERLAB_WITH_DOCUMENTATION "Generate SOLVERLAB documentation" ON)
-option (SOLVERLAB_WITH_PYTHON "Compile Python interface of SOLVERLAB" ON)
+option (SOLVERLAB_WITH_PYTHON "Generate Python interface of SOLVERLAB using SWIG" ON)
option (SOLVERLAB_WITH_GUI "Compile a Graphic user Interface for SOLVERLAB" OFF)
option (SOLVERLAB_WITH_PACKAGE "Generate RPM, Debian and tarball packages" OFF)
option (SOLVERLAB_WITH_COREFLOWS "Generate COREFLOWS module" ON)
option (SOLVERLAB_WITH_TESTS "Generate SOLVERLAB example tests" ON)
+option (SOLVERLAB_WITH_MPI "Generate a parallel version of SOLVERLAB" OFF)
#Path to installed libraries
set (PETSC_DIR OFF CACHE STRING "PETSc library path" )
set (MEDCOUPLING_ROOT_DIR OFF CACHE STRING "MEDCoupling library path" )
set (PYTHON_ROOT_DIR OFF CACHE STRING "Python library path" )
set (PARAVIEW_ROOT_DIR OFF CACHE STRING "PARAVIEW library path" )
+set (MPI4PY_ROOT_DIR OFF CACHE STRING "MPI4PY library path" )
#url of tarball librairies
-set (DOWNLOAD_PETSC http://ftp.mcs.anl.gov/pub/petsc/release-snapshots/petsc-3.15.0.tar.gz
+set (DOWNLOAD_PETSC http://ftp.mcs.anl.gov/pub/petsc/release-snapshots/petsc-3.16.0.tar.gz
CACHE STRING "PETSc tarball path/url" )
-set (DOWNLOAD_SLEPC https://slepc.upv.es/download/distrib/slepc-3.15.0.tar.gz
+set (DOWNLOAD_SLEPC https://slepc.upv.es/download/distrib/slepc-3.16.0.tar.gz
CACHE STRING "SLEPC tarball path/url" )
set (DOWNLOAD_F2CBLASLAPACK https://www.mcs.anl.gov/petsc/mirror/externalpackages/f2cblaslapack-3.4.2.q4.tar.gz
CACHE STRING "F2CBLASLAPACK tarball path/url" )
CACHE STRING "HDF5 tarball path/url" )
set (DOWNLOAD_MED http://files.salome-platform.org/Salome/other/med-4.1.0.tar.gz
CACHE STRING "MED tarball path/url")
-set (DOWNLOAD_MEDCOUPLING http://files.salome-platform.org/Salome/other/medCoupling-9.6.0.tar.gz
+set (DOWNLOAD_MEDCOUPLING http://files.salome-platform.org/Salome/other/medCoupling-9.7.0.tar.gz
CACHE STRING "MEDCoupling tarball path/url" )
set (DOWNLOAD_OPENMPI https://download.open-mpi.org/release/open-mpi/v3.1/openmpi-3.1.6.tar.gz
CACHE STRING "OPENMPI tarball path/url" )
-set (DOWNLOAD_HYPRE https://github.com/hypre-space/hypre/archive/v2.20.0.zip
+set (DOWNLOAD_HYPRE https://github.com/hypre-space/hypre/archive/v2.23.0.zip
CACHE STRING "HYPRE tarball path/url" )
+set (DOWNLOAD_MPI4PY https://bitbucket.org/mpi4py/mpi4py/downloads/mpi4py-3.1.2.tar.gz
+ CACHE STRING "MPY4PY tarball path/url" )
set (CMAKE_BUILD_TYPE Release CACHE STRING "Installation mode")
endif( DEFINED ENV{MPI_ROOT_DIR} )
endif( DEFINED ENV{MPI_ROOT_DIR} OR DEFINED MPI_ROOT_DIR )
+# Definition of SOLVERLAB_WITH_MPI
if( DEFINED ENV{MPI_HOME} OR MPI_HOME )
set(SOLVERLAB_WITH_MPI ON)
find_package(MPI)
set(SOLVERLAB_WITH_MPI OFF)
endif( DEFINED ENV{MPI_HOME} OR MPI_HOME )
+# Definition of MPI4PY_ROOT_DIR
+if( ${SOLVERLAB_WITH_PYTHON} AND ${SOLVERLAB_WITH_MPI} AND NOT ${MPI4PY_ROOT_DIR})
+ message(STATUS "Defining MPI4PY directory" )
+ if( DEFINED ENV{MPI4PY_ROOT_DIR})
+ set(MPI4PY_ROOT_DIR $ENV{MPI4PY_ROOT_DIR})
+ else( DEFINED ENV{MPI4PY_ROOT_DIR})
+ set(MPI4PY_ROOT_DIR ${PETSC_DIR}/${PETSC_ARCH}/lib/mpi4py)
+ endif( DEFINED ENV{MPI4PY_ROOT_DIR})
+endif(${SOLVERLAB_WITH_PYTHON} AND ${SOLVERLAB_WITH_MPI} AND NOT ${MPI4PY_ROOT_DIR})
+
+if( MPI4PY_ROOT_DIR)
+ message(STATUS "MPI4PY directory is ${MPI4PY_ROOT_DIR}" )
+ SET(CMAKE_SWIG_FLAGS ${CMAKE_SWIG_FLAGS} -DMPI4PY_ROOT_DIR=${MPI4PY_ROOT_DIR})
+endif( MPI4PY_ROOT_DIR)
+
############################
-# Definition of HDF5_HOME #
+# Definition of HDF5_ROOT #
############################
if ( DEFINED ENV{HDF5_ROOT_DIR} OR DEFINED HDF5_ROOT_DIR )
if ( DEFINED ENV{HDF5_ROOT_DIR} )
set(PETSC_INCLUDES /usr/include/petsc /usr/include/petsc/petsc/mpiuni)
set(PETSC_LIBRARIES /usr/lib64/libpetsc.so)
- set(PETSC_VERSION "3.8") #3.8 for fedora 26 , 3.9 for fedora 29 , 3.10 for fedora 30, , 3.12 for fedora 32
+ file(STRINGS /usr/include/petsc/petscversion.h petscversion_file)
+ FOREACH(line ${petscversion_file})
+ string(FIND "${line}" "#define PETSC_VERSION_MAJOR " pos)
+ IF(NOT ${pos} EQUAL -1)
+ string(LENGTH ${line} line_length_major)#length of the line
+ MATH(EXPR petsc_version_major "${line_length_major}-1")#line ends with "x", that counts for 1 character
+ string(SUBSTRING ${line} ${petsc_version_major} 1 PETSC_VERSION_MAJOR)
+ break()
+ ENDIF(NOT ${pos} EQUAL -1)
+ ENDFOREACH(line ${petscversion_file})
+ FOREACH(line ${petscversion_file})
+ string(FIND "${line}" "#define PETSC_VERSION_MINOR " pos)
+ IF(NOT ${pos} EQUAL -1)
+ string(LENGTH ${line} line_length_minor)#length of the line
+ if(${line_length_minor} EQUAL ${line_length_major})
+ MATH(EXPR petsc_version_minor "${line_length_minor}-1")#line ends with "y", that counts for 1 character
+ string(SUBSTRING ${line} ${petsc_version_minor} 1 PETSC_VERSION_MINOR)
+ break()
+ else(${line_length_minor} EQUAL ${line_length_major})
+ MATH(EXPR petsc_version_minor "${line_length_minor}-2")#line ends with "yy", that counts for two characters
+ string(SUBSTRING ${line} ${petsc_version_minor} 2 PETSC_VERSION_MINOR)
+ endif(${line_length_minor} EQUAL ${line_length_major})
+ ENDIF(NOT ${pos} EQUAL -1)
+ ENDFOREACH(line ${petscversion_file})
+ set(PETSC_VERSION ${PETSC_VERSION_MAJOR}.${PETSC_VERSION_MINOR}) #3.8 for fedora 26 , 3.9 for fedora 29 , 3.10 for fedora 30 , 3.12 for fedora 32 , 3.14 for fedora 34 , 3.15 for fedora 35
+ message(STATUS "PETSc detected, version is ${PETSC_VERSION_MAJOR}.${PETSC_VERSION_MINOR}" )
set(CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES}, petsc-devel (>= 3.4)") # This is not fully working yet.
set(PETSC_INSTALL ${PETSC_DIR})
set(SLEPC_DIR /usr/)
set(SLEPC_INCLUDES ${SLEPC_DIR}/include)
set(SLEPC_LIBRARIES ${SLEPC_DIR}/lib/libslepc.so)
+ file(STRINGS /usr/include/slepc/slepcversion.h slepcversion_file)
+ FOREACH(line ${slepcversion_file})
+ string(FIND "${line}" "#define SLEPC_VERSION_MAJOR " pos)
+ IF(NOT ${pos} EQUAL -1)
+ string(LENGTH ${line} line_length_major)#length of the line
+ MATH(EXPR slepc_version_major "${line_length_major}-1")#line ends with "x", that counts for 1 character
+ string(SUBSTRING ${line} ${slepc_version_major} 1 SLEPC_VERSION_MAJOR)
+ break()
+ ENDIF(NOT ${pos} EQUAL -1)
+ ENDFOREACH(line ${slepcversion_file})
+ FOREACH(line ${slepcversion_file})
+ string(FIND "${line}" "#define SLEPC_VERSION_MINOR " pos)
+ IF(NOT ${pos} EQUAL -1)
+ string(LENGTH ${line} line_length_minor)#length of the line
+ if(${line_length_minor} EQUAL ${line_length_major})
+ MATH(EXPR slepc_version_minor "${line_length_minor}-1")#line ends with "y", that counts for 1 character
+ string(SUBSTRING ${line} ${slepc_version_minor} 1 SLEPC_VERSION_MINOR)
+ break()
+ else(${line_length_minor} EQUAL ${line_length_major})
+ MATH(EXPR slepc_version_minor "${line_length_minor}-2")#line ends with "yy", that counts for two characters
+ string(SUBSTRING ${line} ${slepc_version_minor} 2 SLEPC_VERSION_MINOR)
+ endif(${line_length_minor} EQUAL ${line_length_major})
+ ENDIF(NOT ${pos} EQUAL -1)
+ ENDFOREACH(line ${slepcversion_file})
+ set(SLEPC_VERSION ${SLEPC_VERSION_MAJOR}.${SLEPC_VERSION_MINOR}) #3.8 for fedora 26 , 3.9 for fedora 29 , 3.10 for fedora 30 , 3.12 for fedora 32 , 3.14 for fedora 34 , 3.15 for fedora 35
+ message(STATUS "SLEPc detected, version is ${SLEPC_VERSION_MAJOR}.${SLEPC_VERSION_MINOR}" )
set (CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES}, slepc-devel (>= 3.4)") # This is not fully working yet.
else ( IS_DIRECTORY "/usr/include/slepc/" AND EXISTS "/usr/lib64/libslepc.so" )
message( FATAL_ERROR "SLEPc not found in the system" )
URL ${DOWNLOAD_PETSC}
SOURCE_DIR ${PETSC_DIR}
BUILD_IN_SOURCE TRUE
- CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=${PETSC_INSTALL} --with-debugging=0 --download-f2cblaslapack=${DOWNLOAD_F2CBLASLAPACK} --with-fc=0 --download-slepc=${DOWNLOAD_SLEPC} --download-hdf5=${DOWNLOAD_HDF5} --with-mpi=0 # --download-openmpi=${DOWNLOAD_OPENMPI} --download-hypre=${DOWNLOAD_HYPRE}
+ CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=${PETSC_INSTALL} --with-debugging=0 --download-f2cblaslapack=${DOWNLOAD_F2CBLASLAPACK} --with-mpi=0 --with-fc=0 --download-slepc=${DOWNLOAD_SLEPC} --download-hdf5=${DOWNLOAD_HDF5} --with-petsc4py=yes --download-slepc-configure-arguments="--with-slepc4py=yes" # --download-openmpi=${DOWNLOAD_OPENMPI} --download-hypre=${DOWNLOAD_HYPRE} --download-mpi4py=${DOWNLOAD_MPI4PY}
BUILD_COMMAND make all
TEST_COMMAND make check
INSTALL_COMMAND make install
#set(MPI_HOME ${PETSC_INSTALL} )
#set(MPI_LIBRARY ${PETSC_INSTALL}/lib/libmpi.so)
#set(MPIEXEC ${PETSC_INSTALL}/bin/mpiexec)
+ #set(MPI4PY_ROOT_DIR ${PETSC_INSTALL}/lib/mpi4py )
endif ( IS_DIRECTORY "/usr/include/petsc/" AND EXISTS "/usr/lib64/libpetsc.so" )
endif ( DEFINED ENV{PETSC_DIR} OR PETSC_DIR )
find_package(MEDCoupling CONFIG REQUIRED) # CONFIG is important !
message( STATUS "MEDCoupling found. Version is ${MEDCoupling_VERSION}")
-else( DEFINED MEDCOUPLING_ROOT_DIR OR DEFINED ENV{MEDCOUPLING_ROOT_DIR})
+else( MEDCOUPLING_ROOT_DIR OR DEFINED ENV{MEDCOUPLING_ROOT_DIR})
message(STATUS "MEDCoupling will be downloaded and installed from ${DOWNLOAD_MEDCOUPLING}")
set(MEDCOUPLING_ROOT_DIR ${CMAKE_INSTALL_PREFIX}/lib/medcoupling) # Location of the final install
SET(ENV{HDF5_ROOT} ${HDF5_ROOT})#MEDCoupling install process seems to require an environment variable
set( PARAVIEW_LIBRARIES_DIR $ENV{PARAVIEW_ROOT_DIR}/lib)
endif( PARAVIEW_ROOT_DIR )
else( PARAVIEW_ROOT_DIR OR DEFINED ENV{PARAVIEW_ROOT_DIR})
- message(STATUS "PARAVIEW_ROOT_DIR not set. Trying to detect paraview.")
+ message(STATUS "PARAVIEW_ROOT_DIR not set. Trying to detect paraview in the system.")
set( PARAVIEW_INCLUDE_DIR /usr/include/paraview/)
- set( PARAVIEW_LIBRARIES_DIR /usr/lib/paraview/:/usr/lib64/paraview/:/usr/lib64/vtk/:/usr/lib/vtk/)
+ set( PARAVIEW_LIBRARIES_DIR /usr/lib/paraview/:/usr/lib64/paraview/:/usr/lib64/vtk/:/usr/lib/vtk/:/usr/lib/x86_64-linux-gnu)
endif( PARAVIEW_ROOT_DIR OR DEFINED ENV{PARAVIEW_ROOT_DIR})
if ( DEFINED PARAVIEW_VERSION OR DEFINED ENV{PARAVIEW_VERSION} )
set(Python_VERSION_MINOR ${PYTHON_VERSION_MINOR})
ENDIF(${CMAKE_VERSION} VERSION_GREATER "3.12.0")
-#PyQt5 root dir
-IF ( NOT DEFINED PYQT5_ROOT_DIR )
- set(PYQT5_ROOT_DIR $ENV{PYQT5_ROOT_DIR} )
-ENDIF( NOT DEFINED PYQT5_ROOT_DIR )
+message(STATUS "Python version found is ${Python_VERSION}")
#Matplotlib root dir
IF ( NOT DEFINED MATPLOTLIB_ROOT_DIR )
set(MATPLOTLIB_ROOT_DIR $ENV{MATPLOTLIB_ROOT_DIR} )
ENDIF( NOT DEFINED MATPLOTLIB_ROOT_DIR )
-#define HDF5_ROOT_DIR
-IF ( NOT HDF5_ROOT_DIR )
- IF ( ENV{HDF5_ROOT_DIR} )
- set(HDF5_ROOT_DIR $ENV{HDF5_ROOT_DIR} )
- ELSE( ENV{HDF5_ROOT_DIR} )
- set(HDF5_ROOT_DIR ${HDF5_ROOT} )
- ENDIF( ENV{HDF5_ROOT_DIR} )
-ENDIF( NOT HDF5_ROOT_DIR )
-
+#PyQt5 root dir
+IF ( NOT DEFINED PYQT5_ROOT_DIR )
+ set(PYQT5_ROOT_DIR $ENV{PYQT5_ROOT_DIR} )
+ENDIF( NOT DEFINED PYQT5_ROOT_DIR )
#Paraview library paths
set (PV_LIB_DIR /usr/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/dist-packages/paraview/:/usr/lib64/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/vtk/:${MATPLOTLIB_ROOT_DIR}/lib/:${PARAVIEW_LIBRARIES_DIR})
-set (PV_PYTHON_DIR /usr/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/dist-packages/paraview/:/usr/lib64/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/vtk/:/usr/lib64/paraview/site-packages/:/usr/lib64/paraview/site-packages/paraview/:/usr/lib64/paraview/site-packages/vtk/:/usr/lib64/paraview/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/:/usr/lib64/paraview/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/paraview/:/usr/lib64/paraview/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/vtkmodules:/usr/lib/paraview/site-packages/paraview:/usr/lib/paraview/site-packages/paraview/vtk:${PARAVIEW_ROOT_DIR}/lib/:${PARAVIEW_ROOT_DIR}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/:${PARAVIEW_ROOT_DIR}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/vtkmodules/:${MATPLOTLIB_ROOT_DIR}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages:${PYQT5_ROOT_DIR}:${PYQT5_ROOT_DIR}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages)
-
-message(STATUS "Python version found is ${Python_VERSION}")
+set (PV_PYTHON_DIR /usr/lib/python${Python_VERSION_MAJOR}/dist-packages/:/usr/lib/python${Python_VERSION_MAJOR}/dist-packages/paraview/:/usr/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/dist-packages/paraview/:/usr/lib64/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/vtk/:/usr/lib64/paraview/site-packages/:/usr/lib64/paraview/site-packages/paraview/:/usr/lib64/paraview/site-packages/vtk/:/usr/lib64/paraview/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/:/usr/lib64/paraview/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/paraview/:/usr/lib64/paraview/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/vtkmodules:/usr/lib/paraview/site-packages/paraview:/usr/lib/paraview/site-packages/paraview/vtk:${PARAVIEW_ROOT_DIR}/lib/:${PARAVIEW_ROOT_DIR}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/:${PARAVIEW_ROOT_DIR}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/vtkmodules/:${MATPLOTLIB_ROOT_DIR}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages:${PYQT5_ROOT_DIR}:${PYQT5_ROOT_DIR}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages)
+
+# Detection of python-paraview
+string(REPLACE ":" ";" PV_PYTHON_DIR_PATHS "${PV_PYTHON_DIR}")# use semicolon instead of colon in PATH search
+find_file(python-paraview simple.py PATHS ${PV_PYTHON_DIR_PATHS})
+if( ${python-paraview} STREQUAL "python-paraview-NOTFOUND" )
+ message(WARNING "Python Paraview library not found. Post processing will fail in SOLVERLAB scripts.")
+ set(PRELOAD_NETCDF_ON_UBUNTU20 OFF)
+else( ${python-paraview} STREQUAL "python-paraview-NOTFOUND" )
+ if( ${python-paraview} STREQUAL "/usr/lib/python3/dist-packages/paraview/simple.py" )
+ message ( STATUS "Using system Paraview python libraries on Ubuntu 20.04 requires the presence and preload of library netcdf (bug in linkage)." )
+ if( EXISTS "/usr/lib/x86_64-linux-gnu/libnetcdf.so" )
+ message ( STATUS "Library netcdf found in the system. Paraview python libraries should be functional." )
+ set(PRELOAD_NETCDF_ON_UBUNTU20 ON)
+ else( EXISTS "/usr/lib/x86_64-linux-gnu/libnetcdf.so" )
+ message ( WARNING "Library netcdf not found in system. Paraview python libraries may not be functional (bug in linkage)." )
+ set(PRELOAD_NETCDF_ON_UBUNTU20 OFF)
+ endif( EXISTS "/usr/lib/x86_64-linux-gnu/libnetcdf.so" )
+ else( ${python-paraview} STREQUAL "/usr/lib/python3/dist-packages/paraview/simple.py" )
+ message(STATUS "Python Paraview library found. Post processing will work in SOLVERLAB scripts.")
+ set(PRELOAD_NETCDF_ON_UBUNTU20 OFF)
+ endif( ${python-paraview} STREQUAL "/usr/lib/python3/dist-packages/paraview/simple.py" )
+endif( ${python-paraview} STREQUAL "python-paraview-NOTFOUND" )
# Find SWIG
IF ( DEFINED SWIG_ROOT_DIR OR DEFINED ENV{SWIG_ROOT_DIR})
endif(SOLVERLAB_WITH_TESTS)
# Enter subdirectories
+set(CDMATH_WITH_POSTPRO ${SOLVERLAB_WITH_POSTPRO} )
+set(CDMATH_WITH_PETSC ${SOLVERLAB_WITH_PETSC} )
+set(CDMATH_WITH_DOCUMENTATION ${SOLVERLAB_WITH_DOCUMENTATION} )
+set(CDMATH_WITH_PYTHON ${SOLVERLAB_WITH_PYTHON} )
+set(CDMATH_WITH_PACKAGE ${SOLVERLAB_WITH_PACKAGE} )
+set(CDMATH_WITH_TESTS ${SOLVERLAB_WITH_TESTS} )
add_subdirectory (CDMATH)
if(SOLVERLAB_WITH_COREFLOWS)
+ set(COREFLOWS_WITH_DOCUMENTATION ${SOLVERLAB_WITH_DOCUMENTATION} )
+ set(COREFLOWS_WITH_PYTHON ${SOLVERLAB_WITH_PYTHON} )
+ set(COREFLOWS_WITH_GUI ${SOLVERLAB_WITH_GUI} )
+ set(COREFLOWS_WITH_PACKAGE ${SOLVERLAB_WITH_PACKAGE} )
+ set(COREFLOWS_WITH_TESTS ${SOLVERLAB_WITH_TESTS} )
add_subdirectory (CoreFlows)
endif(SOLVERLAB_WITH_COREFLOWS)
@ONLY
)
-