Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[LinearSolvers] Add external lib for parallel Gauss-Seidel #12621

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion applications/LinearSolversApplication/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,11 @@ set( KRATOS_LINEARSOLVERS_APPLICATION_CORE_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/custom_factories/dense_linear_solver_factory.cpp
)

# External libraries for the high order multigrid BuilderAndSolver
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/external_libraries/mcgs"
EXCLUDE_FROM_ALL) # <== prevent MCGS from installing anything on its own
install(TARGETS mcgs DESTINATION libs) # <== install MCGS along other kratos binaries

# Sources for the Python module
file(
GLOB_RECURSE
Expand All @@ -85,7 +90,7 @@ file(
###############################################################
## LinearSolversApplication core library (C++ parts)
add_library( KratosLinearSolversCore SHARED ${KRATOS_LINEARSOLVERS_APPLICATION_CORE_SOURCES} )
target_link_libraries( KratosLinearSolversCore PUBLIC KratosCore )
target_link_libraries( KratosLinearSolversCore PUBLIC KratosCore mcgs )
set_target_properties( KratosLinearSolversCore PROPERTIES COMPILE_DEFINITIONS "LINEARSOLVERS_APPLICATION=EXPORT,API")

target_include_directories(KratosLinearSolversCore SYSTEM PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${KRATOS_LINEAR_SOLVERS_APPLICATION_LIB_INC})
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
cmake_minimum_required(VERSION 3.15.0)
project(mcgs LANGUAGES CXX VERSION 1.0.0)

# Language requirements
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Options
string(TOUPPER ${PROJECT_NAME} PROJECT_NAME_UPPER)

set(${PROJECT_NAME_UPPER}_BUILD_TESTS
OFF
CACHE BOOL
"Compile tests.")

set(${PROJECT_NAME_UPPER}_SHARED_MEMORY_PARALLELISM
"OpenMP"
CACHE STRING "Features/libraries to use for shared memory parallelism.")
set_property(CACHE ${PROJECT_NAME_UPPER}_SHARED_MEMORY_PARALLELISM
PROPERTY STRINGS
"None"
"OpenMP")

# Find dependencies
if (${PROJECT_NAME_UPPER}_SHARED_MEMORY_PARALLELISM MATCHES "OpenMP")
find_package(OpenMP 2 REQUIRED)
endif()

# Define library
add_library(${PROJECT_NAME} SHARED)
target_sources(${PROJECT_NAME} PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/src/color.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/partition.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/reorder.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/solve.cpp")
target_include_directories(${PROJECT_NAME}
PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
INTERFACE "$<INSTALL_INTERFACE:${PROJECT_NAME}/include>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>")
set_target_properties(${PROJECT_NAME} PROPERTIES
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
INSTALL_RPATH "$ORIGIN"
CXX_VISIBILITY_PRESET "hidden")

if (${PROJECT_NAME_UPPER}_SHARED_MEMORY_PARALLELISM MATCHES "OpenMP")
target_link_libraries(${PROJECT_NAME} PRIVATE OpenMP::OpenMP_CXX)
target_compile_definitions(${PROJECT_NAME} PRIVATE ${PROJECT_NAME_UPPER}_OPENMP)
endif()

if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
target_compile_options(${PROJECT_NAME} PRIVATE
-Wall -Wpedantic -Wextra -Werror)
endif()

# Define testrunner
if (${${PROJECT_NAME_UPPER}_BUILD_TESTS})
add_executable(${PROJECT_NAME}_testrunner
"${CMAKE_CURRENT_SOURCE_DIR}/test/main.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/test/parseMatrixMarket.cpp")
target_link_libraries(${PROJECT_NAME}_testrunner PRIVATE ${PROJECT_NAME})
set_target_properties(${PROJECT_NAME}_testrunner PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
endif()

# Package
include(InstallRequiredSystemLibraries)
set(CPACK_PACKAGE_VENDOR "Máté Kelemen")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A simple implementation of multicolor Gauss-Seidel relaxation.")
set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/license.txt")
set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/readme.md")

set(CPACK_GENERATOR "ZIP")
set(CPACK_SOURCE_GENERATOR "ZIP")
set(CPACK_SOURCE_IGNORE_FILES
"/\.git"
"/build"
"/install"
"/\.gitignore"
"/\.cache"
".*\.mm"
".*\.mtx"
".*\.png")
include(CPack)

# Generate CMake config
include(CMakePackageConfigHelpers)
configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
INSTALL_DESTINATION "lib/cmake/${PROJECT_NAME}"
NO_SET_AND_CHECK_MACRO
NO_CHECK_REQUIRED_COMPONENTS_MACRO)
write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
VERSION "${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}"
COMPATIBILITY AnyNewerVersion)

# Install
install(TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}Targets
LIBRARY DESTINATION "lib"
ARCHIVE DESTINATION "lib"
RUNTIME DESTINATION "bin"
INCLUDES DESTINATION "include")
install(EXPORT ${PROJECT_NAME}Targets
FILE ${PROJECT_NAME}Targets.cmake
NAMESPACE ${PROJECT_NAME}::
DESTINATION "lib/cmake/${PROJECT_NAME}")
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/mcgsTargets.cmake")
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
if [%1]==[] (
set buildType=Release
) else (
set buildType=%1
)

cmake -H. -Bbuild -DCMAKE_BUILD_TYPE:STRING=%buildType% -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON -DMCGS_BUILD_TESTS:BOOL=ON
cmake --build build --config %buildType%
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
#!/usr/bin/env bash

scriptName="$(basename ${BASH_SOURCE[0]})"
scriptDir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
projectName="$(basename $scriptDir)"

print_help() {
echo "$scriptName - Configure, build, and install $projectName."
echo "Usage: $scriptName [OPTION [ARGUMENT]]"
echo "-h : print this help and exit."
echo "-p : package after building."
echo "-t build-type : build type [Debug, Release, RelWithDebInfo] (default: Release)."
echo "-j job-count : number of build jobs to launch in parallel (Default: use as many threads as the machine supports)."
echo "-b build-dir : build directory."
echo "-i install-dir : install directory (local directory by default)."
echo "-o [opts] : options/arguments to pass on to CMake. Semicolon (;) delimited, or defined repeatedly."
}

# Default arguments
package=0
buildType="Release"
buildDir="$scriptDir/build"
installDir="$scriptDir/install"
cmakeArguments=""
jobCount=""

while getopts ":h p t: j: b: i: o:" arg; do
case "$arg" in
h) # Print help and exit without doing anything
print_help
exit 0
;;
p) # Package after building
package=1
;;
t) # Set build type
buildType="$OPTARG"
if ! [[ "${buildType}" = "Debug" \
|| "${buildType}" = "RelWithDebInfo" \
|| "${buildType}" = "Release" ]]; then
print_help
echo "Invalid build type: $buildType"
exit 1
fi
;;
j) # Set the number of build jobs
if [[ "$OPTARG" =~ ^[1-9][0-9]*$ ]]; then
jobCount="$OPTARG"
else
echo "Error: invalid number of jobs requested: '$OPTARG'"
exit 1
fi
;;
b) # Set build directory
buildDir="$OPTARG"
;;
i) # Set install directory
installDir="$OPTARG"
;;
o) # Append CMake arguments
cmakeArguments="$cmakeArguments;$OPTARG"
;;
\?) # Unrecognized argument
print_help
echo "Error: unrecognized argument -$OPTARG"
exit 1
;;
esac
done

case "$(uname -s)" in
Linux*)
export cxx=g++
;;
Darwin*)
if [ -z "$jobCount" ]; then
jobCount=$(sysctl -n machdep.cpu.thread_count)
fi

if [ -z "$cxx" ]; then
# Set clang from homebrew
if ! command -v brew &> /dev/null; then
echo "Error: $scriptName requires Homebrew"
exit 1
fi

if ! brew list llvm >/dev/null 2>&1; then
echo "Error: missing dependency: llvm"
echo "Consider running 'brew install llvm'"
exit 1
fi

toolchainRoot="$(brew --prefix llvm)"
toolchainBin="${toolchainRoot}/bin"
toolchainLib="${toolchainRoot}/lib"
toolchainInclude="${toolchainRoot}/include"
export cc="$toolchainBin/clang"
export cxx="$toolchainBin/clang++"
fi
;;
\?)
echo "Error: unsupported OS $(uname -s)"
exit 1
esac

# Create or clear the build directory
if ! [ -d "$buildDir" ]; then
mkdir -p "$buildDir"
else
rm -f "$buildDir/cmake_install.cmake"
rm -f "$buildDir/CMakeCache.txt"
fi

# Generate with CMake
if ! cmake \
"-H$scriptDir" \
"-B$buildDir" \
"-DCMAKE_INSTALL_PREFIX:STRING=$installDir" \
"-DCMAKE_BUILD_TYPE:STRING=$buildType" \
"-DCMAKE_CXX_COMPILER:STRING=$cxx" \
"-DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON" \
"-DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON" \
"-DMCGS_BUILD_TESTS:BOOL=ON" \
$(echo $cmakeArguments | tr '\;' '\n') \
; then
exit 1
fi

# Build and install
if ! cmake --build "$buildDir" --config "$buildType" --target install -j$jobCount; then
exit 1
fi

# Package
if [ $package -eq 1 ]; then
cd "$buildDir"
echo make package
make package
make package_source
fi

# Success
exit 0
Loading
Loading