amdis_parallel.cmake 5.38 KB
Newer Older
1 2
if (ENABLE_PARALLEL_DOMAIN)
    option(ENABLE_ZOLTAN "Add support for the Parallel Partitioning suite Zoltan" false)
3 4
    option(ENABLE_PARALLEL_SOLVERS "Add some problem dependent solver, e.g. Feti, Navier-Stokes and Cahn-Hilliard" true)
    mark_as_advanced(ENABLE_PARALLEL_SOLVERS)
5

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
    add_library(amdis_parallel INTERFACE)
    target_sources(amdis PRIVATE
        ${SOURCE_DIR}/parallel/DofComm.cc
        ${SOURCE_DIR}/parallel/CheckerPartitioner.cc
        ${SOURCE_DIR}/parallel/ElementObjectDatabase.cc
        ${SOURCE_DIR}/parallel/InteriorBoundary.cc
        ${SOURCE_DIR}/parallel/MeshDistributor.cc
        ${SOURCE_DIR}/parallel/MeshLevelData.cc
        ${SOURCE_DIR}/parallel/MeshManipulation.cc
        ${SOURCE_DIR}/parallel/MeshPartitioner.cc
        ${SOURCE_DIR}/parallel/MpiHelper.cc
        ${SOURCE_DIR}/parallel/ParallelDofMapping.cc
        ${SOURCE_DIR}/parallel/ParallelProblemStat.cc
        ${SOURCE_DIR}/parallel/ParallelSolver.cc
        ${SOURCE_DIR}/parallel/PeriodicMap.cc
        ${SOURCE_DIR}/parallel/ParMetisPartitioner.cc
        ${SOURCE_DIR}/parallel/StdMpi.cc
    )
24

25 26
    target_sources(amdis_debug INTERFACE
        ${SOURCE_DIR}/parallel/ParallelDebug.cc
27
    )
28

29 30
    target_compile_definitions(amdis_parallel INTERFACE
	   HAVE_PARALLEL_DOMAIN_AMDIS=1)
31

32 33
    # MPI is required
    find_package(MPI REQUIRED)
34 35 36 37 38 39 40
    target_include_directories(amdis_parallel INTERFACE
        ${MPI_CXX_INCLUDE_PATH})
    target_compile_options(amdis_parallel INTERFACE
        ${MPI_CXX_COMPILE_FLAGS})
    string(STRIP " ${MPI_CXX_LINK_FLAGS} " MPI_CXX_LINK_FLAGS_)
    target_link_libraries(amdis_parallel INTERFACE
      ${MPI_CXX_LINK_FLAGS_} ${MPI_CXX_LIBRARIES})
41

42 43 44 45
    # PETSc library is required
    set(PETSC_EXECUTABLE_RUNS ON)
    include(find_petsc)
    if (PETSc_FOUND)
46
        target_include_directories(amdis_parallel INTERFACE
47
            ${PETSC_DIR}/include
48
            ${PETSC_DIR}/${PETSC_ARCH}/include)
49

50
        # parmetis is required
51
        find_file(PARMETIS_HEADER_FILE "parmetis.h" HINTS ${PETSC_DIR}/include ${PARMETIS_DIR}/include )
52 53 54 55 56 57
        if (PARMETIS_HEADER_FILE)
            get_filename_component(PARMETIS_INCLUDE_PATH "${PARMETIS_HEADER_FILE}" PATH CACHE)
            target_include_directories(amdis_parallel INTERFACE ${PARMETIS_INCLUDE_PATH})
        else()
            message(FATAL_ERROR "Could not find ParMetis header file 'parmetis.h'!")
        endif (PARMETIS_HEADER_FILE)
58

59 60
        # add support for the zoltan library
        if (ENABLE_ZOLTAN)
61
            find_file(ZOLTAN_HEADER_FILE "zoltan_cpp.h" HINTS ${ZOLTAN_DIR}/include ${PETSC_DIR}/include)
62 63
            if (ZOLTAN_HEADER_FILE)
                get_filename_component(ZOLTAN_HEADER_DIR "${ZOLTAN_HEADER_FILE}" PATH CACHE)
64
                target_include_directories(amdis_parallel INTERFACE ${ZOLTAN_HEADER_DIR})
65 66 67
            else()
                message(FATAL_ERROR "Could not find Zoltan include file 'zoltan_cpp.h'!")
            endif(ZOLTAN_HEADER_FILE)
68

69 70 71 72
            target_compile_definitions(amdis_parallel INTERFACE HAVE_ZOLTAN=1)
            target_sources(amdis PRIVATE
                ${SOURCE_DIR}/parallel/ZoltanPartitioner.cc)
        endif (ENABLE_ZOLTAN)
73

74 75 76 77 78
        if (ENABLE_BDDCML)
            target_compile_definitions(amdis_parallel INTERFACE HAVE_BDDCML=1)
            target_sources(amdis PRIVATE
                ${SOURCE_DIR}/parallel/BddcMlSolver.cc)
        endif (ENABLE_BDDCML)
79

80 81 82 83 84 85 86 87 88 89
        # add some more source-files that need petsc
        target_sources(amdis PRIVATE
            ${SOURCE_DIR}/parallel/MatrixNnzStructure.cc
            ${SOURCE_DIR}/parallel/ParallelCoarseSpaceSolver.cc
            ${SOURCE_DIR}/parallel/PetscHelper.cc
            ${SOURCE_DIR}/parallel/PetscSolver.cc
            ${SOURCE_DIR}/parallel/PetscSolverGlobalMatrix.cc
            ${SOURCE_DIR}/parallel/PetscSolverGlobalBlockMatrix.cc
            ${SOURCE_DIR}/solver/PetscTypes.cc
        )
90

91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
        if (ENABLE_PARALLEL_SOLVERS)
            target_sources(amdis PRIVATE
                ${SOURCE_DIR}/parallel/PetscSolverFeti.cc
                ${SOURCE_DIR}/parallel/PetscSolverFetiDebug.cc
                ${SOURCE_DIR}/parallel/PetscSolverFetiMonitor.cc
                ${SOURCE_DIR}/parallel/PetscSolverFetiOperators.cc
                ${SOURCE_DIR}/parallel/PetscSolverFetiTimings.cc
                ${SOURCE_DIR}/parallel/PetscSolverNavierStokes.cc
                ${SOURCE_DIR}/parallel/PetscSolverNSCH.cc
                ${SOURCE_DIR}/parallel/PetscSolverCahnHilliard2.cc
                ${SOURCE_DIR}/parallel/PetscSolverCahnHilliard.cc
                ${SOURCE_DIR}/parallel/PetscSolverSchur.cc
            )
            target_compile_definitions(amdis_parallel INTERFACE
                HAVE_PARALLEL_SOLVERS=1)
        endif (ENABLE_PARALLEL_SOLVERS)
107

108 109 110
        target_compile_definitions(amdis_parallel INTERFACE
            HAVE_PARALLEL_PETSC=1
            PETSC_VERSION=${PETSC_VERSION})
111

112
        target_link_libraries(amdis amdis_parallel ${PETSC_LIBRARIES} blas lapack)
113
    endif (PETSc_FOUND)
114

115 116
    # specify how to install this target:
    # -----------------------------------
117

118 119
    file(GLOB AMDIS_PARALLEL_HEADERS "${SOURCE_DIR}/parallel/*.h")
    install(FILES ${AMDIS_PARALLEL_HEADERS} DESTINATION include/amdis/parallel/)
120 121 122 123

    install(FILES
        ${BASE_DIR}/cmake3/ResolveCompilerPaths.cmake
        ${BASE_DIR}/cmake3/FindPackageMultipass.cmake
124 125
        ${BASE_DIR}/cmake3/find_petsc.cmake
        DESTINATION share/amdis/)
126
endif (ENABLE_PARALLEL_DOMAIN)