diff --git a/Applications/Utils/PartitionMesh/CMakeLists.txt b/Applications/Utils/PartitionMesh/CMakeLists.txt index 0c85505cfd205e2c79fd22f9bf344d2c57187605..9d3455805aa8b32b829ba5d31476602334aa0922 100644 --- a/Applications/Utils/PartitionMesh/CMakeLists.txt +++ b/Applications/Utils/PartitionMesh/CMakeLists.txt @@ -1,14 +1,25 @@ +if(UTILS_PARTMESH_BUILD_WITH_METIS) + include_directories(${METIS_PATH}/libmetis) + include_directories(${METIS_PATH}/programs) -include_directories( - ${CMAKE_SOURCE_DIR}/Utils/PartitionMesh - ${CMAKE_SOURCE_DIR}/BaseLib - ${CMAKE_SOURCE_DIR}/FileIO - ${CMAKE_SOURCE_DIR}/MeshLib -) + set(METIS_SOURCES + ${METIS_PATH}/programs/mpmetis.c + ${METIS_PATH}/programs/cmdline_mpmetis.c + ${METIS_PATH}/programs/io.c + ${METIS_PATH}/programs/stat.c + metis_main.h + ) + ADD_LIBRARY(METIS_Lib STATIC ${METIS_SOURCES} ) + + add_executable(partmesh PartitionMesh.cpp MeshPartitioning.h MeshPartitioning.cpp) + set_target_properties(partmesh PROPERTIES FOLDER Utilities) + target_link_libraries(partmesh FileIO METIS_Lib metis) +else() + add_executable(partmesh PartitionMesh.cpp MeshPartitioning.h MeshPartitioning.cpp) + set_target_properties(partmesh PROPERTIES FOLDER Utilities) + target_link_libraries(partmesh FileIO) +endif() -add_executable(partmesh PartitionMesh.cpp MeshPartitioning.h MeshPartitioning.cpp) -set_target_properties(partmesh PROPERTIES FOLDER Utilities) -target_link_libraries(partmesh FileIO) ADD_VTK_DEPENDENCY(partmesh) #################### diff --git a/Applications/Utils/PartitionMesh/MetisSetup.cmake b/Applications/Utils/PartitionMesh/MetisSetup.cmake new file mode 100644 index 0000000000000000000000000000000000000000..9a0e5910b8f115052426b35224b7c7076a16a01d --- /dev/null +++ b/Applications/Utils/PartitionMesh/MetisSetup.cmake @@ -0,0 +1,28 @@ +MESSAGE( STATUS "The METIS package is copyrighted by the Regents of the University of Minnesota." ) +MESSAGE( STATUS "Please read the license of the METIS package carefully before you use the METIS." ) + +add_definitions(-DUSE_GKREGEX) + +set(GKLIB_PATH "${METIS_PATH}/GKlib" CACHE PATH "path to GKlib") +set(SHARED FALSE CACHE BOOL "build a shared library") + +if(MSVC) + set(METIS_INSTALL FALSE) +else() + set(METIS_INSTALL TRUE) +endif() + +# Configure libmetis library. +if(SHARED) + set(METIS_LIBRARY_TYPE SHARED) +else() + set(METIS_LIBRARY_TYPE STATIC) +endif(SHARED) + +include(${GKLIB_PATH}/GKlibSystem.cmake) +# Add include directories. +include_directories(${GKLIB_PATH}) +include_directories(${METIS_PATH}/include) +# Recursively look for CMakeLists.txt in subdirs. +add_subdirectory("${METIS_PATH}/include") +add_subdirectory("${METIS_PATH}/libmetis") diff --git a/Applications/Utils/PartitionMesh/PartitionMesh.cpp b/Applications/Utils/PartitionMesh/PartitionMesh.cpp index 6537ed30b7edf11bc9a58b47257f1116097f0f4b..bc0982023a0a584749575fcafffbfa64e32ee89f 100644 --- a/Applications/Utils/PartitionMesh/PartitionMesh.cpp +++ b/Applications/Utils/PartitionMesh/PartitionMesh.cpp @@ -16,7 +16,13 @@ #include "logog/include/logog.hpp" -#include "LogogSimpleFormatter.h" +#ifdef BUILD_WITH_METIS +extern "C" { +#include "metis_main.h" +} +#endif + +#include "BaseLib/LogogSimpleFormatter.h" #include "BaseLib/FileTools.h" #include "MeshLib/IO/readMeshFromFile.h" @@ -88,14 +94,36 @@ int main (int argc, char* argv[]) else { const int num_partitions = nparts.getValue(); + std::string str_nparts = std::to_string(num_partitions); + + // With the metis source code being compiled + if (num_partitions > 1) + { +#ifdef BUILD_WITH_METIS + INFO("METIS is running ..."); + const int argc_m = 4; + char *argv_m[argc_m]; + std::string unsc = "-"; // Avoid compilation warning by argv_m[0] = "-"; + argv_m[0] = &unsc[0]; + std::string option = "-gtype=nodal"; + argv_m[1] = &option[0]; + std::string part_mesh_file = file_name_base + ".mesh"; + argv_m[2] = &part_mesh_file[0]; + argv_m[3] = &str_nparts[0]; + + metis_main(argc_m, argv_m); +#endif + } INFO("Partitioning the mesh in the node wise way ..."); // Binary output is default. - mesh->partitionByNodeMETIS(file_name_base, num_partitions, !asci_flag.getValue()); + mesh->partitionByNodeMETIS(file_name_base, num_partitions, + !asci_flag.getValue()); INFO("Write the mesh with renumbered node indicies into VTU"); MeshLib::IO::VtuInterface writer(mesh); - writer.writeToFile(file_name_base + "_node_id_renumbered_partitions_" + std::to_string(num_partitions) + ".vtu"); + writer.writeToFile(file_name_base + "_node_id_renumbered_partitions_" + + str_nparts + ".vtu"); } }