Skip to content
Snippets Groups Projects
Commit e4ea829c authored by Praetorius, Simon's avatar Praetorius, Simon
Browse files

Feature/petsc cmake

parent 792d38c6
No related branches found
No related tags found
No related merge requests found
include(AmdisCXXFeatures)
include(AddAmdisExecutable)
set(BACKEND "ISTL" CACHE STRING "LinearAlgebra backend. One of MTL, EIGEN, ISTL")
set_property(CACHE BACKEND PROPERTY STRINGS "MTL" "EIGEN" "ISTL")
if (NOT BACKEND)
set(BACKEND "ISTL" CACHE STRING "LinearAlgebra backend. One of MTL, EIGEN, PETSC, ISTL")
set_property(CACHE BACKEND PROPERTY STRINGS "MTL" "EIGEN" "ISTL" "PETSC")
endif (NOT BACKEND)
if (BACKEND STREQUAL "MTL" OR BACKEND STREQUAL "MTL4")
find_package(MTL REQUIRED)
set(HAVE_MTL MTL_FOUND)
set(HAVE_MTL TRUE)
if (MTL_FOUND)
message(STATUS " Found MTL, version: ${MTL_VERSION}")
dune_register_package_flags(LIBRARIES MTL::MTL COMPILE_DEFINITIONS "ENABLE_MTL=1")
endif (MTL_FOUND)
elseif (BACKEND STREQUAL "EIGEN" OR BACKEND STREQUAL "EIGEN3")
find_package(Eigen3 REQUIRED 3.3.5)
set(HAVE_EIGEN EIGEN_FOUND)
set(HAVE_EIGEN TRUE)
if (EIGEN3_FOUND)
message(STATUS " Found Eigen3, version: ${Eigen3_VERSION}")
dune_register_package_flags(LIBRARIES Eigen3::Eigen COMPILE_DEFINITIONS "ENABLE_EIGEN=1")
endif (EIGEN3_FOUND)
elseif (BACKEND STREQUAL "PETSC")
find_package(PETSc REQUIRED)
if (PETSc_FOUND)
set(HAVE_PETSC TRUE)
dune_register_package_flags(LIBRARIES PETSc::PETSc COMPILE_DEFINITIONS "ENABLE_PETSC=1")
endif (PETSc_FOUND)
elseif (BACKEND STREQUAL "ISTL")
if (NOT dune-istl_FOUND)
message(FATAL_ERROR "Need dune-istl, MTL, or Eigen3 as linear algebra backend. Change flag BACKEND!")
message(FATAL_ERROR "Need dune-istl, MTL, PETSc, or Eigen3 as linear algebra backend. Change flag BACKEND!")
endif ()
else ()
message(FATAL_ERROR "BACKEND must be one of MTL, EIGEN, ISTL")
message(FATAL_ERROR "BACKEND must be one of MTL, EIGEN, PETSC, ISTL")
endif ()
set(DUNE_CUSTOM_PKG_CONFIG_SECTION "set(BACKEND \"${BACKEND}\")")
\ No newline at end of file
# FindPETSc.cmake
#
# Finds the PETSc library
#
# This will define the following variables
#
# PETSc_FOUND
# PETSc_VERSION
#
# and the following imported targets
#
# PETSc::PETSc
#
# Author: Simon Praetorius <simon.praetorius@tu-dresden.de>
include(FindPkgConfig)
if (NOT PKG_CONFIG_FOUND)
message(FATAL_ERROR "Can not find PkgConfig!")
endif()
mark_as_advanced(PETSc_FOUND PETSc_VERSION PETSC_PKG_CONFIG)
find_path(PETSC_PKG_CONFIG "PETSc.pc"
HINTS
${PETSC_DIR}
${PETSC_ROOT}
ENV PETSC_DIR
ENV PETSC_ROOT
ENV PKG_CONFIG_PATH
PATHS
/etc/alternatives
/usr/lib/petsc
/usr/lib/petsc/linux-gnu-cxx-opt
/usr/lib/petsc/linux-gnu-c-opt
PATH_SUFFIXES lib/pkgconfig/
)
if (PETSC_PKG_CONFIG)
set(ENV{PKG_CONFIG_PATH} "${PETSC_PKG_CONFIG}:$ENV{PKG_CONFIG_PATH}")
endif (PETSC_PKG_CONFIG)
if (PETSc_FIND_VERSION)
pkg_check_modules(PETSC PETSc>=${PETSc_FIND_VERSION})
else ()
pkg_check_modules(PETSC PETSc)
endif ()
if (PETSC_STATIC_FOUND)
set(_prefix PETSC_STATIC)
elseif (PETSC_FOUND)
set(_prefix PETSC)
endif ()
set(PETSc_VERSION "${${_prefix}_VERSION}")
if ((PETSC_STATIC_FOUND OR PETSC_FOUND) AND NOT TARGET PETSc::PETSc)
add_library(PETSc::PETSc INTERFACE IMPORTED GLOBAL)
if (${_prefix}_INCLUDE_DIRS)
set_property(TARGET PETSc::PETSc PROPERTY
INTERFACE_INCLUDE_DIRECTORIES "${${_prefix}_INCLUDE_DIRS}")
endif ()
if (${_prefix}_LINK_LIBRARIES)
set_property(TARGET PETSc::PETSc PROPERTY
INTERFACE_LINK_LIBRARIES "${${_prefix}_LINK_LIBRARIES}")
else ()
# extract the absolute paths of link libraries from the LDFLAGS
include(PkgConfigLinkLibraries)
pkg_config_link_libraries(${_prefix} _libs)
set_property(TARGET PETSc::PETSc PROPERTY
INTERFACE_LINK_LIBRARIES "${_libs}")
unset(_libs)
endif ()
if (${_prefix}_LDFLAGS_OTHER)
set_property(TARGET PETSc::PETSc PROPERTY
INTERFACE_LINK_OPTIONS "${${_prefix}_LDFLAGS_OTHER}")
endif ()
if (${_prefix}_CFLAGS_OTHER)
set_property(TARGET PETSc::PETSc PROPERTY
INTERFACE_COMPILE_OPTIONS "${${_prefix}_CFLAGS_OTHER}")
endif ()
endif ()
unset(_prefix)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(PETSc
REQUIRED_VARS PETSc_VERSION
VERSION_VAR PETSc_VERSION
)
# text for feature summary
set_package_properties("PETSc" PROPERTIES
DESCRIPTION "Portable, Extensible Toolkit for Scientific Computation")
\ No newline at end of file
# PkgConfigLinkLibraries.cmake
#
# Scan the LDFLAGS returned by pkg-config for library directories and
# libraries and figure out the absolute paths of that libraries in the
# given directories.
#
# This macro is extracted from FindPkgConfig.cmake
#
# This will define the following macro
#
# pkg_config_link_libraries(PREFIX, OUTPUT)
#
# .. cmake_macro:: pkg_config_link_libraries
#
# .. cmake_brief::
#
# Creates a list ob absolute path for link libraries
#
# .. cmake_param:: PREFIX
# :single:
#
# The module prefix (including _STATIC for static libraries)
#
# .. cmake_param:: OUTPUT
# :single:
#
# The name of the output list of absolute paths
#
#
# Author: Simon Praetorius <simon.praetorius@tu-dresden.de>
macro(pkg_config_link_libraries _prefix _output)
unset(_search_paths)
foreach (flag IN LISTS ${_prefix}_LDFLAGS)
if (flag MATCHES "^-L(.*)")
list(APPEND _search_paths ${CMAKE_MATCH_1})
continue()
endif()
if (flag MATCHES "^-l(.*)")
set(_pkg_search "${CMAKE_MATCH_1}")
else()
continue()
endif()
if(_search_paths)
# Firstly search in -L paths
find_library(pkgcfg_lib_${_prefix}_${_pkg_search}
NAMES ${_pkg_search}
HINTS ${_search_paths} NO_DEFAULT_PATH)
endif()
find_library(pkgcfg_lib_${_prefix}_${_pkg_search}
NAMES ${_pkg_search}
${_find_opts})
list(APPEND ${_output} "${pkgcfg_lib_${_prefix}_${_pkg_search}}")
endforeach()
endmacro(pkg_config_link_libraries)
\ No newline at end of file
......@@ -40,12 +40,15 @@
/* Define to the revision of amdis */
#define AMDIS_VERSION_REVISION @AMDIS_VERSION_REVISION@
/* Define to ENABLE_MTL if the MTL library is available */
/* Define to true if the MTL library is available */
#cmakedefine HAVE_MTL 1
/* Define to ENABLE_EIGEN if the Eigen3 library is available */
/* Define to true if the Eigen3 library is available */
#cmakedefine HAVE_EIGEN 1
/* Define to true if the PETSc library is available */
#cmakedefine HAVE_PETSC ENABLE_PETSC
/* some detected compiler features may be used in AMDiS */
#cmakedefine AMDIS_HAS_CXX_FOLD_EXPRESSIONS 1
#cmakedefine AMDIS_HAS_CXX_CONSTEXPR_IF 1
......
......@@ -4,6 +4,10 @@
#include "Environment.hpp"
#if HAVE_PETSC
#include <petscsys.h>
#endif
// AMDiS includes
#include <amdis/Initfile.hpp>
#include <amdis/Output.hpp>
......@@ -17,13 +21,17 @@ namespace AMDiS
Parameters::init(initFileName);
}
Environment::Environment(int& argc, char**& argv, std::string const& initFileName)
: Environment(initFileName)
{
auto& helper = Dune::MPIHelper::instance(argc, argv);
#if HAVE_PETSC
PetscInitialize(&argc, &argv, PETSC_NULL, PETSC_NULL);
petscInitialized_ = true;
#endif
auto& mpi = Mpi::instance();
mpi.registerMpiHelper(helper);
mpi.registerMpiHelper(Dune::MPIHelper::instance(argc, argv));
Parameters::clearData();
if (initFileName.empty()) {
......@@ -34,4 +42,13 @@ namespace AMDiS
}
}
Environment::~Environment()
{
#if HAVE_PETSC
if (petscInitialized_)
PetscFinalize();
#endif
}
} // end namespace AMDiS
......@@ -56,6 +56,9 @@ namespace AMDiS
/// or the provided initfile filename.
Environment(int& argc, char**& argv, std::string const& initFileName = "");
/// Finishes MPI and PETSc
~Environment();
/// Return the MPI_Rank of the current processor.
static int mpiRank()
{
......@@ -67,6 +70,15 @@ namespace AMDiS
{
return Mpi::instance().size();
}
/// Return the MPI_Comm object (or a fake communicator)
static typename Dune::MPIHelper::MPICommunicator comm()
{
return Dune::MPIHelper::getCommunicator();
}
private:
bool petscInitialized_ = false;
};
} // end namespace AMDiS
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment