From 6214a918f1dff262e79b1dfe732741512de66f40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20Pep=C3=A8=20Sciarria?= Date: Thu, 5 Jun 2025 16:24:43 +0200 Subject: [PATCH 01/19] add installation of test under samples --- CMakeLists.txt | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c8aaca80..f330e3d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -369,10 +369,35 @@ export( -# Optionally, you can install the headers -#install(DIRECTORY include/ -# DESTINATION include -#) +# Set the installation directory for the test files +set(INSTALL_TEST_DIR "${CMAKE_INSTALL_PREFIX}/test" CACHE PATH "Installation directory for test files") + +function(install_directory_recursive source_dir install_base_dir) # Function to install a directory and its subdirectories recursively + file(GLOB_RECURSE ALL_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/${source_dir}" "${source_dir}/*") + + foreach(FILE_PATH IN LISTS ALL_FILES) + # Construct the full source and destination paths + set(FULL_SOURCE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${source_dir}/${FILE_PATH}") + set(FULL_INSTALL_PATH "${install_base_dir}/${FILE_PATH}") + + # Check if it's a directory + if(IS_DIRECTORY "${FULL_SOURCE_PATH}") + # Create the directory in the install destination + file(MAKE_DIRECTORY "${FULL_INSTALL_PATH}") + else() + # Install the file + install(FILES "${FULL_SOURCE_PATH}" DESTINATION "${install_base_dir}" RENAME "${FILE_PATH}") + endif() + endforeach() +endfunction() + + + +# Install test/fileread directory +install_directory_recursive(samples/simple "${INSTALL_TEST_DIR}/simple") + +# Install test/pdegen directory +install_directory_recursive(samples/advanced "${INSTALL_TEST_DIR}/advanced") From c7c02bf7c02cebfd9d061ab1b09dec0b32409ac2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20Pep=C3=A8=20Sciarria?= Date: Fri, 6 Jun 2025 10:14:38 +0200 Subject: [PATCH 02/19] hot fix, change installation folder name from test to samples --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f330e3d4..aa336657 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -370,7 +370,7 @@ export( # Set the installation directory for the test files -set(INSTALL_TEST_DIR "${CMAKE_INSTALL_PREFIX}/test" CACHE PATH "Installation directory for test files") +set(INSTALL_TEST_DIR "${CMAKE_INSTALL_PREFIX}/samples" CACHE PATH "Installation directory for sample files") function(install_directory_recursive source_dir install_base_dir) # Function to install a directory and its subdirectories recursively file(GLOB_RECURSE ALL_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/${source_dir}" "${source_dir}/*") From 4c19edb2f943bc152d051240129846961c4cddac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20Pep=C3=A8=20Sciarria?= Date: Fri, 6 Jun 2025 10:15:55 +0200 Subject: [PATCH 03/19] add CMakeLists.txt for samples subprojects --- samples/advanced/fileread/CMakeLists.txt | 104 +++++++++++++++ samples/advanced/pdegen/CMakeLists.txt | 158 +++++++++++++++++++++++ samples/simple/fileread/CMakeLists.txt | 119 +++++++++++++++++ samples/simple/pdegen/CMakeLists.txt | 103 +++++++++++++++ 4 files changed, 484 insertions(+) create mode 100644 samples/advanced/fileread/CMakeLists.txt create mode 100644 samples/advanced/pdegen/CMakeLists.txt create mode 100644 samples/simple/fileread/CMakeLists.txt create mode 100644 samples/simple/pdegen/CMakeLists.txt diff --git a/samples/advanced/fileread/CMakeLists.txt b/samples/advanced/fileread/CMakeLists.txt new file mode 100644 index 00000000..5521416f --- /dev/null +++ b/samples/advanced/fileread/CMakeLists.txt @@ -0,0 +1,104 @@ +cmake_minimum_required(VERSION 3.15) +project(AMGExamples Fortran) + +# Installation directories (passed as CMake variables) +set(AMG_INSTALL_DIR "" CACHE PATH "Path to AMG installation") +set(PSBLAS_INSTALL_DIR "" CACHE PATH "Path to PSBLAS installation") + +# Check if installation directories are set +if(NOT AMG_INSTALL_DIR) + message(FATAL_ERROR "AMG_INSTALL_DIR must be set. Use -DAMG_INSTALL_DIR=/path/to/amg when running CMake.") +endif() + +if(NOT PSBLAS_INSTALL_DIR) + message(FATAL_ERROR "PSBLAS_INSTALL_DIR must be set. Use -DPSBLAS_INSTALL_DIR=/path/to/psblas when running CMake.") +endif() + +# Include directories +include_directories( + "." + "${AMG_INSTALL_DIR}/include" + "${AMG_INSTALL_DIR}/modules" + "${PSBLAS_INSTALL_DIR}/include" # Assuming PSBLAS include directory is here +) + +# Fortran module directory +set(CMAKE_Fortran_MODULE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/modules") +set(FMFLAG "-I") # Adjust if needed + +# Library directories +link_directories( + "${AMG_INSTALL_DIR}/lib" + "${PSBLAS_INSTALL_DIR}/lib" +) + +# Libraries +set(AMG_LIBS psb_linsolve amg_prec psb_prec) +set(PSBLAS_LIBS psb_util psb_linsolve psb_prec psb_base) # Example, adjust as needed + +# Executable directory +set(EXEDIR "${CMAKE_CURRENT_BINARY_DIR}/runs") +file(MAKE_DIRECTORY "${EXEDIR}") + +# Source files +set(DFSOBJS amg_df_sample.f90 data_input.f90) +set(SFSOBJS amg_sf_sample.f90 data_input.f90) +set(CFSOBJS amg_cf_sample.f90 data_input.f90) +set(ZFSOBJS amg_zf_sample.f90 data_input.f90) + +# Function to create executable +macro(create_amg_executable target sources) + add_executable(${target} ${sources}) + target_link_libraries(${target} PUBLIC + ${AMG_LIBS} + ${PSBLAS_LIBS} + #${LDLIBS} # Assuming this variable is defined elsewhere if needed + ) + + # Move executable to EXEDIR (post-build) + add_custom_command(TARGET ${target} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E move $ ${EXEDIR} + ) +endmacro() + +# Create executables +create_amg_executable(amg_df_sample ${DFSOBJS}) +create_amg_executable(amg_sf_sample ${SFSOBJS}) +create_amg_executable(amg_cf_sample ${CFSOBJS}) +create_amg_executable(amg_zf_sample ${ZFSOBJS}) + +# Create "runs" directory (if it doesn't exist) +add_custom_target(create_runs_dir + COMMAND ${CMAKE_COMMAND} -E make_directory "${EXEDIR}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Creating runs directory" +) +add_dependencies(amg_df_sample create_runs_dir) +add_dependencies(amg_sf_sample create_runs_dir) +add_dependencies(amg_cf_sample create_runs_dir) +add_dependencies(amg_zf_sample create_runs_dir) + + + +# lib target +add_custom_target(lib + COMMAND ${CMAKE_COMMAND} -E chdir "../../" ${CMAKE_COMMAND} --build . --target library + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Building library" +) + +# verycleanlib target +add_custom_target(verycleanlib + COMMAND ${CMAKE_COMMAND} -E chdir "../../" ${CMAKE_COMMAND} --build . --target veryclean + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Cleaning library" +) + +# Install target (optional) +install(TARGETS + amg_sf_sample + amg_df_sample + amg_cf_sample + amg_zf_sample + DESTINATION bin +) diff --git a/samples/advanced/pdegen/CMakeLists.txt b/samples/advanced/pdegen/CMakeLists.txt new file mode 100644 index 00000000..923c2033 --- /dev/null +++ b/samples/advanced/pdegen/CMakeLists.txt @@ -0,0 +1,158 @@ +cmake_minimum_required(VERSION 3.15) +project(AMGExamples Fortran) + +# Installation directories (passed as CMake variables) +set(AMG_INSTALL_DIR "" CACHE PATH "Path to AMG installation") +set(PSBLAS_INSTALL_DIR "" CACHE PATH "Path to PSBLAS installation") + +# Check if installation directories are set +if(NOT AMG_INSTALL_DIR) + message(FATAL_ERROR "AMG_INSTALL_DIR must be set. Use -DAMG_INSTALL_DIR=/path/to/amg when running CMake.") +endif() + +if(NOT PSBLAS_INSTALL_DIR) + message(FATAL_ERROR "PSBLAS_INSTALL_DIR must be set. Use -DPSBLAS_INSTALL_DIR=/path/to/psblas when running CMake.") +endif() + +# Include directories +include_directories( + "." + "${AMG_INSTALL_DIR}/include" + "${AMG_INSTALL_DIR}/modules" + "${PSBLAS_INSTALL_DIR}/include" +) + +# Fortran module directory +set(CMAKE_Fortran_MODULE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/modules") +set(FMFLAG "-I") + +# Library directories +link_directories( + "${AMG_INSTALL_DIR}/lib" + "${PSBLAS_INSTALL_DIR}/lib" +) + +# Libraries +set(AMG_LIBS psb_linsolve amg_prec psb_prec) +set(PSBLAS_LIBS psb_util psb_linsolve psb_prec psb_base) + +# Executable directory +set(EXEDIR "${CMAKE_CURRENT_BINARY_DIR}/runs") +file(MAKE_DIRECTORY "${EXEDIR}") + +# Source files +set(DGEN2D + amg_d_pde2d_poisson_mod.f90 + amg_d_pde2d_exp_mod.f90 + amg_d_pde2d_gauss_mod.f90 + amg_d_pde2d_box_mod.f90 +) +set(DGEN3D + amg_d_pde3d_poisson_mod.f90 + amg_d_pde3d_exp_mod.f90 + amg_d_pde3d_gauss_mod.f90 + amg_d_pde3d_box_mod.f90 +) +set(SGEN2D + amg_s_pde2d_poisson_mod.f90 + amg_s_pde2d_exp_mod.f90 + amg_s_pde2d_gauss_mod.f90 + amg_s_pde2d_box_mod.f90 +) +set(SGEN3D + amg_s_pde3d_poisson_mod.f90 + amg_s_pde3d_exp_mod.f90 + amg_s_pde3d_gauss_mod.f90 + amg_s_pde3d_box_mod.f90 +) + +# Define executables and their sources +set(amg_d_pde3d_SOURCES + amg_d_pde3d.f90 + amg_d_genpde_mod.f90 + ${DGEN3D} + data_input.f90 +) +set(amg_s_pde3d_SOURCES + amg_s_pde3d.f90 + amg_s_genpde_mod.f90 + ${SGEN3D} + data_input.f90 +) +set(amg_d_pde2d_SOURCES + amg_d_pde2d.f90 + amg_d_genpde_mod.f90 + ${DGEN2D} + data_input.f90 +) +set(amg_s_pde2d_SOURCES + amg_s_pde2d.f90 + amg_s_genpde_mod.f90 + ${SGEN2D} + data_input.f90 +) + +# Function to create executable +macro(create_amg_executable target sources) + add_executable(${target} ${sources}) + target_link_libraries(${target} PUBLIC + ${AMG_LIBS} + ${PSBLAS_LIBS} + + ) + + # Move executable to EXEDIR (post-build) + add_custom_command(TARGET ${target} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E move $ ${EXEDIR} + ) +endmacro() + +# Create executables +create_amg_executable(amg_d_pde3d ${amg_d_pde3d_SOURCES}) +create_amg_executable(amg_s_pde3d ${amg_s_pde3d_SOURCES}) +create_amg_executable(amg_d_pde2d ${amg_d_pde2d_SOURCES}) +create_amg_executable(amg_s_pde2d ${amg_s_pde2d_SOURCES}) + +# Create "runs" directory (if it doesn't exist) +add_custom_target(create_runs_dir + COMMAND ${CMAKE_COMMAND} -E make_directory "${EXEDIR}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Creating runs directory" +) +add_dependencies(amg_d_pde3d create_runs_dir) +add_dependencies(amg_s_pde3d create_runs_dir) +add_dependencies(amg_d_pde2d create_runs_dir) +add_dependencies(amg_s_pde2d create_runs_dir) + + +# lib target +add_custom_target(lib + COMMAND ${CMAKE_COMMAND} -E chdir "../../" ${CMAKE_COMMAND} --build . --target library + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Building library" +) + +# verycleanlib target +add_custom_target(verycleanlib + COMMAND ${CMAKE_COMMAND} -E chdir "../../" ${CMAKE_COMMAND} --build . --target veryclean + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Cleaning library" +) + +# Check target (simulated) +add_custom_target(check + COMMAND ${CMAKE_COMMAND} -E chdir "${EXEDIR}" "${EXEDIR}/amg_d_pde2d" < "amg_pde2d.inp" + COMMAND ${CMAKE_COMMAND} -E chdir "${EXEDIR}" "${EXEDIR}/amg_s_pde2d" < "amg_pde2d.inp" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS amg_d_pde2d amg_s_pde2d + COMMENT "Running check" +) + +# Install target (optional) +install(TARGETS + amg_d_pde3d + amg_s_pde3d + amg_d_pde2d + amg_s_pde2d + DESTINATION bin +) diff --git a/samples/simple/fileread/CMakeLists.txt b/samples/simple/fileread/CMakeLists.txt new file mode 100644 index 00000000..3178f640 --- /dev/null +++ b/samples/simple/fileread/CMakeLists.txt @@ -0,0 +1,119 @@ +cmake_minimum_required(VERSION 3.15) +project(AMGExamples Fortran) + +# Installation directories (passed as CMake variables) +set(AMG_INSTALL_DIR "" CACHE PATH "Path to AMG installation") +set(PSBLAS_INSTALL_DIR "" CACHE PATH "Path to PSBLAS installation") + +# Check if installation directories are set +if(NOT AMG_INSTALL_DIR) + message(FATAL_ERROR "AMG_INSTALL_DIR must be set. Use -DAMG_INSTALL_DIR=/path/to/amg when running CMake.") +endif() + +if(NOT PSBLAS_INSTALL_DIR) + message(FATAL_ERROR "PSBLAS_INSTALL_DIR must be set. Use -DPSBLAS_INSTALL_DIR=/path/to/psblas when running CMake.") +endif() + +# Include directories +include_directories( + "." + "${AMG_INSTALL_DIR}/include" + "${AMG_INSTALL_DIR}/modules" + "${PSBLAS_INSTALL_DIR}/include" +) + +# Fortran module directory +set(CMAKE_Fortran_MODULE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/modules") +set(FMFLAG "-I") + +# Library directories +link_directories( + "${AMG_INSTALL_DIR}/lib" + "${PSBLAS_INSTALL_DIR}/lib" +) + +# Libraries +set(AMG_LIBS psb_linsolve amg_prec psb_prec) +set(PSBLAS_LIBS psb_util psb_linsolve psb_prec psb_base) + +# Executable directory +set(EXEDIR "${CMAKE_CURRENT_BINARY_DIR}/runs") +file(MAKE_DIRECTORY "${EXEDIR}") + +# Source files +set(DMOBJS amg_dexample_ml.f90 data_input.f90) +set(D1OBJS amg_dexample_1lev.f90 data_input.f90) +set(ZMOBJS amg_zexample_ml.f90 data_input.f90) +set(Z1OBJS amg_zexample_1lev.f90 data_input.f90) +set(SMOBJS amg_sexample_ml.f90 data_input.f90) +set(S1OBJS amg_sexample_1lev.f90 data_input.f90) +set(CMOBJS amg_cexample_ml.f90 data_input.f90) +set(C1OBJS amg_cexample_1lev.f90 data_input.f90) + +# Function to create executable +macro(create_amg_executable target sources) + add_executable(${target} ${sources}) + target_link_libraries(${target} PUBLIC + ${AMG_LIBS} + ${PSBLAS_LIBS} + + ) + + # Move executable to EXEDIR (post-build) + add_custom_command(TARGET ${target} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E move $ ${EXEDIR} + ) +endmacro() + +# Create executables +create_amg_executable(amg_dexample_ml ${DMOBJS}) +create_amg_executable(amg_dexample_1lev ${D1OBJS}) +create_amg_executable(amg_zexample_ml ${ZMOBJS}) +create_amg_executable(amg_zexample_1lev ${Z1OBJS}) +create_amg_executable(amg_sexample_ml ${SMOBJS}) +create_amg_executable(amg_sexample_1lev ${S1OBJS}) +create_amg_executable(amg_cexample_ml ${CMOBJS}) +create_amg_executable(amg_cexample_1lev ${C1OBJS}) + +# Create "runs" directory (if it doesn't exist) +add_custom_target(create_runs_dir + COMMAND ${CMAKE_COMMAND} -E make_directory "${EXEDIR}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Creating runs directory" +) +add_dependencies(amg_dexample_ml create_runs_dir) +add_dependencies(amg_dexample_1lev create_runs_dir) +add_dependencies(amg_zexample_ml create_runs_dir) +add_dependencies(amg_zexample_1lev create_runs_dir) +add_dependencies(amg_sexample_ml create_runs_dir) +add_dependencies(amg_sexample_1lev create_runs_dir) +add_dependencies(amg_cexample_ml create_runs_dir) +add_dependencies(amg_cexample_1lev create_runs_dir) + + +# lib target +add_custom_target(lib + COMMAND ${CMAKE_COMMAND} -E chdir "../../" ${CMAKE_COMMAND} --build . --target library + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Building library" +) + +# verycleanlib target +add_custom_target(verycleanlib + COMMAND ${CMAKE_COMMAND} -E chdir "../../" ${CMAKE_COMMAND} --build . --target veryclean + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Cleaning library" +) + +# Install target (optional) +install(TARGETS + amg_dexample_ml + amg_dexample_1lev + amg_zexample_ml + amg_zexample_1lev + amg_sexample_ml + amg_sexample_1lev + amg_cexample_ml + amg_cexample_1lev + DESTINATION bin +) diff --git a/samples/simple/pdegen/CMakeLists.txt b/samples/simple/pdegen/CMakeLists.txt new file mode 100644 index 00000000..fccd6314 --- /dev/null +++ b/samples/simple/pdegen/CMakeLists.txt @@ -0,0 +1,103 @@ +cmake_minimum_required(VERSION 3.15) +project(AMGExamples Fortran) + +# Installation directories (passed as CMake variables) +set(AMG_INSTALL_DIR "" CACHE PATH "Path to AMG installation") +set(PSBLAS_INSTALL_DIR "" CACHE PATH "Path to PSBLAS installation") + +# Check if installation directories are set +if(NOT AMG_INSTALL_DIR) + message(FATAL_ERROR "AMG_INSTALL_DIR must be set. Use -DAMG_INSTALL_DIR=/path/to/amg when running CMake.") +endif() + +if(NOT PSBLAS_INSTALL_DIR) + message(FATAL_ERROR "PSBLAS_INSTALL_DIR must be set. Use -DPSBLAS_INSTALL_DIR=/path/to/psblas when running CMake.") +endif() + +# Include directories +include_directories( + "." + "${AMG_INSTALL_DIR}/include" + "${AMG_INSTALL_DIR}/modules" + "${PSBLAS_INSTALL_DIR}/include" +) + +# Fortran module directory +set(CMAKE_Fortran_MODULE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/modules") +set(FMFLAG "-I") + +# Library directories +link_directories( + "${AMG_INSTALL_DIR}/lib" + "${PSBLAS_INSTALL_DIR}/lib" +) + +# Libraries +set(AMG_LIBS psb_linsolve amg_prec psb_prec) +set(PSBLAS_LIBS psb_util psb_linsolve psb_prec psb_base) # Example, adjust as needed + +# Executable directory +set(EXEDIR "${CMAKE_CURRENT_BINARY_DIR}/runs") +file(MAKE_DIRECTORY "${EXEDIR}") + +# Source files +set(DMOBJS amg_dexample_ml.f90 data_input.f90 amg_dpde_mod.f90) +set(D1OBJS amg_dexample_1lev.f90 data_input.f90 amg_dpde_mod.f90) +set(SMOBJS amg_sexample_ml.f90 data_input.f90 amg_spde_mod.f90) +set(S1OBJS amg_sexample_1lev.f90 data_input.f90 amg_spde_mod.f90) + +# Function to create executable +macro(create_amg_executable target sources) + add_executable(${target} ${sources}) + target_link_libraries(${target} PUBLIC + ${AMG_LIBS} + ${PSBLAS_LIBS} + + ) + + # Move executable to EXEDIR (post-build) + add_custom_command(TARGET ${target} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E move $ ${EXEDIR} + ) +endmacro() + +# Create executables +create_amg_executable(amg_dexample_ml ${DMOBJS}) +create_amg_executable(amg_dexample_1lev ${D1OBJS}) +create_amg_executable(amg_sexample_ml ${SMOBJS}) +create_amg_executable(amg_sexample_1lev ${S1OBJS}) + +# Create "runs" directory (if it doesn't exist) +add_custom_target(create_runs_dir + COMMAND ${CMAKE_COMMAND} -E make_directory "${EXEDIR}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Creating runs directory" +) +add_dependencies(amg_dexample_ml create_runs_dir) +add_dependencies(amg_dexample_1lev create_runs_dir) +add_dependencies(amg_sexample_ml create_runs_dir) +add_dependencies(amg_sexample_1lev create_runs_dir) + + +# lib target +add_custom_target(lib + COMMAND ${CMAKE_COMMAND} -E chdir "../../" ${CMAKE_COMMAND} --build . --target library + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Building library" +) + +# verycleanlib target +add_custom_target(verycleanlib + COMMAND ${CMAKE_COMMAND} -E chdir "../../" ${CMAKE_COMMAND} --build . --target veryclean + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Cleaning library" +) + +# Install target (optional) +install(TARGETS + amg_dexample_ml + amg_dexample_1lev + amg_sexample_ml + amg_sexample_1lev + DESTINATION bin +) From fcf48ee61432239720e9a5ab9b92238db25a455b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20Pep=C3=A8=20Sciarria?= Date: Fri, 6 Jun 2025 16:11:59 +0200 Subject: [PATCH 04/19] hot fix: Config.cmake files now is properly installed --- CMakeLists.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index aa336657..930eccba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -142,7 +142,7 @@ write_basic_package_version_file( COMPATIBILITY SameMajorVersion ) -configure_file("${CMAKE_SOURCE_DIR}/cmake/pkg/${CMAKE_PROJECT_NAME}Config.cmake.in" +configure_file("${CMAKE_SOURCE_DIR}/cmake/${CMAKE_PROJECT_NAME}Config.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${CMAKE_PROJECT_NAME}Config.cmake" @ONLY) install( @@ -354,18 +354,18 @@ message(STATUS "install directory is ${CMAKE_INSTALL_LIBDIR};;;") # FILE "${CMAKE_CURRENT_BINARY_DIR}/amg4psblasTargets.cmake" # NAMESPACE psblas:: #) -export( - EXPORT ${CMAKE_PROJECT_NAME}-targets - FILE "${CMAKE_CURRENT_BINARY_DIR}/psblasTargets.cmake" - NAMESPACE ${CMAKE_PROJECT_NAME}:: -) - export( EXPORT ${CMAKE_PROJECT_NAME}-targets FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}Targets.cmake" NAMESPACE ${CMAKE_PROJECT_NAME}:: ) +#export( +# EXPORT ${CMAKE_PROJECT_NAME}-targets +# FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}Targets.cmake" +# NAMESPACE ${CMAKE_PROJECT_NAME}:: +#) + From 3a42a2597c55360109d984dfb5aefdb7c82b6d09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20Pep=C3=A8=20Sciarria?= Date: Fri, 6 Jun 2025 16:38:50 +0200 Subject: [PATCH 05/19] fix CMake building and compilation --- samples/simple/fileread/CMakeLists.txt | 36 ++++++++++++++++---------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/samples/simple/fileread/CMakeLists.txt b/samples/simple/fileread/CMakeLists.txt index 3178f640..8fd26fa3 100644 --- a/samples/simple/fileread/CMakeLists.txt +++ b/samples/simple/fileread/CMakeLists.txt @@ -14,6 +14,11 @@ if(NOT PSBLAS_INSTALL_DIR) message(FATAL_ERROR "PSBLAS_INSTALL_DIR must be set. Use -DPSBLAS_INSTALL_DIR=/path/to/psblas when running CMake.") endif() + +find_package(psblas REQUIRED PATHS ${PSBLAS_INSTALL_DIR}) +find_package(amg4psblas REQUIRED PATHS ${AMG_INSTALL_DIR}) + + # Include directories include_directories( "." @@ -33,22 +38,24 @@ link_directories( ) # Libraries -set(AMG_LIBS psb_linsolve amg_prec psb_prec) -set(PSBLAS_LIBS psb_util psb_linsolve psb_prec psb_base) +set(AMG_LIBS amg4psblas::amgprec) +set(PSBLAS_LIBS psblas::util psblas::linsolve psblas::prec psblas::base) # Executable directory set(EXEDIR "${CMAKE_CURRENT_BINARY_DIR}/runs") file(MAKE_DIRECTORY "${EXEDIR}") +set(COMMON_SOURCE data_input.f90) + # Source files -set(DMOBJS amg_dexample_ml.f90 data_input.f90) -set(D1OBJS amg_dexample_1lev.f90 data_input.f90) -set(ZMOBJS amg_zexample_ml.f90 data_input.f90) -set(Z1OBJS amg_zexample_1lev.f90 data_input.f90) -set(SMOBJS amg_sexample_ml.f90 data_input.f90) -set(S1OBJS amg_sexample_1lev.f90 data_input.f90) -set(CMOBJS amg_cexample_ml.f90 data_input.f90) -set(C1OBJS amg_cexample_1lev.f90 data_input.f90) +set(DMOBJS ${COMMON_SOURCE} amg_dexample_ml.f90) +set(D1OBJS ${COMMON_SOURCE} amg_dexample_1lev.f90) +set(ZMOBJS ${COMMON_SOURCE} amg_zexample_ml.f90) +set(Z1OBJS ${COMMON_SOURCE} amg_zexample_1lev.f90) +set(SMOBJS ${COMMON_SOURCE} amg_sexample_ml.f90) +set(S1OBJS ${COMMON_SOURCE} amg_sexample_1lev.f90) +set(CMOBJS ${COMMON_SOURCE} amg_cexample_ml.f90) +set(C1OBJS ${COMMON_SOURCE} amg_cexample_1lev.f90) # Function to create executable macro(create_amg_executable target sources) @@ -60,9 +67,12 @@ macro(create_amg_executable target sources) ) # Move executable to EXEDIR (post-build) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E move $ ${EXEDIR} - ) + #add_custom_command(TARGET ${target} POST_BUILD + # COMMAND ${CMAKE_COMMAND} -E move $ ${EXEDIR} + #) + set_target_properties(${target} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${EXEDIR} + ) endmacro() # Create executables From ecaea5b794ca89fd8e67e41387a7374c91f9fc8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20Pep=C3=A8=20Sciarria?= Date: Mon, 9 Jun 2025 09:39:21 +0200 Subject: [PATCH 06/19] hot fix: correct name for amg4psblas libraries --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 930eccba..d658ad70 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -227,7 +227,7 @@ set_target_properties(amgprec PROPERTIES Fortran_MODULE_DIRECTORY "${CMAKE_BINARY_DIR}/modules" POSITION_INDEPENDENT_CODE TRUE - OUTPUT_NAME psb_amgprec + OUTPUT_NAME amg_prec LINKER_LANGUAGE Fortran ) @@ -273,7 +273,7 @@ set_target_properties(amgcbind PROPERTIES Fortran_MODULE_DIRECTORY "${CMAKE_BINARY_DIR}/modules" POSITION_INDEPENDENT_CODE TRUE - OUTPUT_NAME psb_amgcbind + OUTPUT_NAME amg_cbind LINKER_LANGUAGE Fortran ) From cf93042e42dbe8cb0aa556469163a6886bf460d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20Pep=C3=A8=20Sciarria?= Date: Mon, 9 Jun 2025 09:42:08 +0200 Subject: [PATCH 07/19] now the cmake building works and compiles --- samples/simple/fileread/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/simple/fileread/CMakeLists.txt b/samples/simple/fileread/CMakeLists.txt index 8fd26fa3..f4403620 100644 --- a/samples/simple/fileread/CMakeLists.txt +++ b/samples/simple/fileread/CMakeLists.txt @@ -2,11 +2,11 @@ cmake_minimum_required(VERSION 3.15) project(AMGExamples Fortran) # Installation directories (passed as CMake variables) -set(AMG_INSTALL_DIR "" CACHE PATH "Path to AMG installation") +set(AMG4PSBLAS_INSTALL_DIR "" CACHE PATH "Path to AMG installation") set(PSBLAS_INSTALL_DIR "" CACHE PATH "Path to PSBLAS installation") # Check if installation directories are set -if(NOT AMG_INSTALL_DIR) +if(NOT AMG4PSBLAS_INSTALL_DIR) message(FATAL_ERROR "AMG_INSTALL_DIR must be set. Use -DAMG_INSTALL_DIR=/path/to/amg when running CMake.") endif() From 154e88cd69ad4f184c4ab6839b48bf8a81de5892 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20Pep=C3=A8=20Sciarria?= Date: Mon, 9 Jun 2025 09:46:59 +0200 Subject: [PATCH 08/19] hot fix --- samples/simple/fileread/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/samples/simple/fileread/CMakeLists.txt b/samples/simple/fileread/CMakeLists.txt index f4403620..9a5a4bf2 100644 --- a/samples/simple/fileread/CMakeLists.txt +++ b/samples/simple/fileread/CMakeLists.txt @@ -16,14 +16,14 @@ endif() find_package(psblas REQUIRED PATHS ${PSBLAS_INSTALL_DIR}) -find_package(amg4psblas REQUIRED PATHS ${AMG_INSTALL_DIR}) +find_package(amg4psblas REQUIRED PATHS ${AMG4PSBLAS_INSTALL_DIR}) # Include directories include_directories( "." - "${AMG_INSTALL_DIR}/include" - "${AMG_INSTALL_DIR}/modules" + "${AMG4PSBLAS_INSTALL_DIR}/include" + "${AMG4PSBLAS_INSTALL_DIR}/modules" "${PSBLAS_INSTALL_DIR}/include" ) @@ -33,7 +33,7 @@ set(FMFLAG "-I") # Library directories link_directories( - "${AMG_INSTALL_DIR}/lib" + "${AMG4PSBLAS_INSTALL_DIR}/lib" "${PSBLAS_INSTALL_DIR}/lib" ) From 1b8aa1618e02db4a19b25ad02375b61f6f3c105a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20Pep=C3=A8=20Sciarria?= Date: Mon, 9 Jun 2025 10:06:50 +0200 Subject: [PATCH 09/19] fix cmake --- samples/simple/pdegen/CMakeLists.txt | 41 ++++++++++++++++++---------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/samples/simple/pdegen/CMakeLists.txt b/samples/simple/pdegen/CMakeLists.txt index fccd6314..33d1b6d1 100644 --- a/samples/simple/pdegen/CMakeLists.txt +++ b/samples/simple/pdegen/CMakeLists.txt @@ -2,11 +2,11 @@ cmake_minimum_required(VERSION 3.15) project(AMGExamples Fortran) # Installation directories (passed as CMake variables) -set(AMG_INSTALL_DIR "" CACHE PATH "Path to AMG installation") +set(AMG4PSBLAS_INSTALL_DIR "" CACHE PATH "Path to AMG installation") set(PSBLAS_INSTALL_DIR "" CACHE PATH "Path to PSBLAS installation") # Check if installation directories are set -if(NOT AMG_INSTALL_DIR) +if(NOT AMG4PSBLAS_INSTALL_DIR) message(FATAL_ERROR "AMG_INSTALL_DIR must be set. Use -DAMG_INSTALL_DIR=/path/to/amg when running CMake.") endif() @@ -14,11 +14,16 @@ if(NOT PSBLAS_INSTALL_DIR) message(FATAL_ERROR "PSBLAS_INSTALL_DIR must be set. Use -DPSBLAS_INSTALL_DIR=/path/to/psblas when running CMake.") endif() + +find_package(psblas REQUIRED PATHS ${PSBLAS_INSTALL_DIR}) +find_package(amg4psblas REQUIRED PATHS ${AMG4PSBLAS_INSTALL_DIR}) + + # Include directories include_directories( "." - "${AMG_INSTALL_DIR}/include" - "${AMG_INSTALL_DIR}/modules" + "${AMG4PSBLAS_INSTALL_DIR}/include" + "${AMG4PSBLAS_INSTALL_DIR}/modules" "${PSBLAS_INSTALL_DIR}/include" ) @@ -28,23 +33,27 @@ set(FMFLAG "-I") # Library directories link_directories( - "${AMG_INSTALL_DIR}/lib" + "${AMG4PSBLAS_INSTALL_DIR}/lib" "${PSBLAS_INSTALL_DIR}/lib" ) # Libraries -set(AMG_LIBS psb_linsolve amg_prec psb_prec) -set(PSBLAS_LIBS psb_util psb_linsolve psb_prec psb_base) # Example, adjust as needed +set(AMG_LIBS amg4psblas::amgprec) +set(PSBLAS_LIBS psblas::util psblas::linsolve psblas::prec psblas::base) # Executable directory set(EXEDIR "${CMAKE_CURRENT_BINARY_DIR}/runs") file(MAKE_DIRECTORY "${EXEDIR}") +set(COMMON_SOURCE data_input.f90) + + # Source files -set(DMOBJS amg_dexample_ml.f90 data_input.f90 amg_dpde_mod.f90) -set(D1OBJS amg_dexample_1lev.f90 data_input.f90 amg_dpde_mod.f90) -set(SMOBJS amg_sexample_ml.f90 data_input.f90 amg_spde_mod.f90) -set(S1OBJS amg_sexample_1lev.f90 data_input.f90 amg_spde_mod.f90) +set(DMOBJS ${COMMON_SOURCE} amg_dexample_ml.f90 amg_dpde_mod.f90) +set(D1OBJS ${COMMON_SOURCE} amg_dexample_1lev.f90 amg_dpde_mod.f90) +set(SMOBJS ${COMMON_SOURCE} amg_sexample_ml.f90 amg_spde_mod.f90) +set(S1OBJS ${COMMON_SOURCE} amg_sexample_1lev.f90 amg_spde_mod.f90) + # Function to create executable macro(create_amg_executable target sources) @@ -56,11 +65,13 @@ macro(create_amg_executable target sources) ) # Move executable to EXEDIR (post-build) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E move $ ${EXEDIR} - ) + #add_custom_command(TARGET ${target} POST_BUILD + # COMMAND ${CMAKE_COMMAND} -E move $ ${EXEDIR} + #) + set_target_properties(${target} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${EXEDIR} + ) endmacro() - # Create executables create_amg_executable(amg_dexample_ml ${DMOBJS}) create_amg_executable(amg_dexample_1lev ${D1OBJS}) From 60d722ec53f1a763b8a6e6c2d92f0974cc2b2693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20Pep=C3=A8=20Sciarria?= Date: Mon, 9 Jun 2025 10:09:28 +0200 Subject: [PATCH 10/19] fix cmake --- samples/advanced/fileread/CMakeLists.txt | 47 +++++++++++++++--------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/samples/advanced/fileread/CMakeLists.txt b/samples/advanced/fileread/CMakeLists.txt index 5521416f..1ab7286b 100644 --- a/samples/advanced/fileread/CMakeLists.txt +++ b/samples/advanced/fileread/CMakeLists.txt @@ -2,11 +2,11 @@ cmake_minimum_required(VERSION 3.15) project(AMGExamples Fortran) # Installation directories (passed as CMake variables) -set(AMG_INSTALL_DIR "" CACHE PATH "Path to AMG installation") +set(AMG4PSBLAS_INSTALL_DIR "" CACHE PATH "Path to AMG installation") set(PSBLAS_INSTALL_DIR "" CACHE PATH "Path to PSBLAS installation") # Check if installation directories are set -if(NOT AMG_INSTALL_DIR) +if(NOT AMG4PSBLAS_INSTALL_DIR) message(FATAL_ERROR "AMG_INSTALL_DIR must be set. Use -DAMG_INSTALL_DIR=/path/to/amg when running CMake.") endif() @@ -14,37 +14,46 @@ if(NOT PSBLAS_INSTALL_DIR) message(FATAL_ERROR "PSBLAS_INSTALL_DIR must be set. Use -DPSBLAS_INSTALL_DIR=/path/to/psblas when running CMake.") endif() + +find_package(psblas REQUIRED PATHS ${PSBLAS_INSTALL_DIR}) +find_package(amg4psblas REQUIRED PATHS ${AMG4PSBLAS_INSTALL_DIR}) + + # Include directories include_directories( "." - "${AMG_INSTALL_DIR}/include" - "${AMG_INSTALL_DIR}/modules" - "${PSBLAS_INSTALL_DIR}/include" # Assuming PSBLAS include directory is here + "${AMG4PSBLAS_INSTALL_DIR}/include" + "${AMG4PSBLAS_INSTALL_DIR}/modules" + "${PSBLAS_INSTALL_DIR}/include" ) # Fortran module directory set(CMAKE_Fortran_MODULE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/modules") -set(FMFLAG "-I") # Adjust if needed +set(FMFLAG "-I") # Library directories link_directories( - "${AMG_INSTALL_DIR}/lib" + "${AMG4PSBLAS_INSTALL_DIR}/lib" "${PSBLAS_INSTALL_DIR}/lib" ) # Libraries -set(AMG_LIBS psb_linsolve amg_prec psb_prec) -set(PSBLAS_LIBS psb_util psb_linsolve psb_prec psb_base) # Example, adjust as needed +set(AMG_LIBS amg4psblas::amgprec) +set(PSBLAS_LIBS psblas::util psblas::linsolve psblas::prec psblas::base) # Executable directory set(EXEDIR "${CMAKE_CURRENT_BINARY_DIR}/runs") file(MAKE_DIRECTORY "${EXEDIR}") +set(COMMON_SOURCE data_input.f90) + # Source files -set(DFSOBJS amg_df_sample.f90 data_input.f90) -set(SFSOBJS amg_sf_sample.f90 data_input.f90) -set(CFSOBJS amg_cf_sample.f90 data_input.f90) -set(ZFSOBJS amg_zf_sample.f90 data_input.f90) +set(DFSOBJS ${COMMON_SOURCE} amg_df_sample.f90) +set(SFSOBJS ${COMMON_SOURCE} amg_sf_sample.f90) +set(CFSOBJS ${COMMON_SOURCE} amg_cf_sample.f90) +set(ZFSOBJS ${COMMON_SOURCE} amg_zf_sample.f90) + + # Function to create executable macro(create_amg_executable target sources) @@ -52,15 +61,19 @@ macro(create_amg_executable target sources) target_link_libraries(${target} PUBLIC ${AMG_LIBS} ${PSBLAS_LIBS} - #${LDLIBS} # Assuming this variable is defined elsewhere if needed + ) # Move executable to EXEDIR (post-build) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E move $ ${EXEDIR} - ) + #add_custom_command(TARGET ${target} POST_BUILD + # COMMAND ${CMAKE_COMMAND} -E move $ ${EXEDIR} + #) + set_target_properties(${target} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${EXEDIR} + ) endmacro() + # Create executables create_amg_executable(amg_df_sample ${DFSOBJS}) create_amg_executable(amg_sf_sample ${SFSOBJS}) From 9a36a321f296b1e22e70b34db8bcec5f5ec75ead Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20Pep=C3=A8=20Sciarria?= Date: Mon, 9 Jun 2025 10:13:05 +0200 Subject: [PATCH 11/19] fix cmake --- samples/advanced/pdegen/CMakeLists.txt | 51 ++++++++++++++++++-------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/samples/advanced/pdegen/CMakeLists.txt b/samples/advanced/pdegen/CMakeLists.txt index 923c2033..ab559b6d 100644 --- a/samples/advanced/pdegen/CMakeLists.txt +++ b/samples/advanced/pdegen/CMakeLists.txt @@ -2,11 +2,11 @@ cmake_minimum_required(VERSION 3.15) project(AMGExamples Fortran) # Installation directories (passed as CMake variables) -set(AMG_INSTALL_DIR "" CACHE PATH "Path to AMG installation") +set(AMG4PSBLAS_INSTALL_DIR "" CACHE PATH "Path to AMG installation") set(PSBLAS_INSTALL_DIR "" CACHE PATH "Path to PSBLAS installation") # Check if installation directories are set -if(NOT AMG_INSTALL_DIR) +if(NOT AMG4PSBLAS_INSTALL_DIR) message(FATAL_ERROR "AMG_INSTALL_DIR must be set. Use -DAMG_INSTALL_DIR=/path/to/amg when running CMake.") endif() @@ -14,32 +14,46 @@ if(NOT PSBLAS_INSTALL_DIR) message(FATAL_ERROR "PSBLAS_INSTALL_DIR must be set. Use -DPSBLAS_INSTALL_DIR=/path/to/psblas when running CMake.") endif() + +find_package(psblas REQUIRED PATHS ${PSBLAS_INSTALL_DIR}) +find_package(amg4psblas REQUIRED PATHS ${AMG4PSBLAS_INSTALL_DIR}) + + # Include directories include_directories( "." - "${AMG_INSTALL_DIR}/include" - "${AMG_INSTALL_DIR}/modules" + "${AMG4PSBLAS_INSTALL_DIR}/include" + "${AMG4PSBLAS_INSTALL_DIR}/modules" "${PSBLAS_INSTALL_DIR}/include" ) # Fortran module directory set(CMAKE_Fortran_MODULE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/modules") -set(FMFLAG "-I") +set(FMFLAG "-I") # Library directories link_directories( - "${AMG_INSTALL_DIR}/lib" + "${AMG4PSBLAS_INSTALL_DIR}/lib" "${PSBLAS_INSTALL_DIR}/lib" ) # Libraries -set(AMG_LIBS psb_linsolve amg_prec psb_prec) -set(PSBLAS_LIBS psb_util psb_linsolve psb_prec psb_base) +set(AMG_LIBS amg4psblas::amgprec) +set(PSBLAS_LIBS psblas::util psblas::linsolve psblas::prec psblas::base) # Executable directory set(EXEDIR "${CMAKE_CURRENT_BINARY_DIR}/runs") file(MAKE_DIRECTORY "${EXEDIR}") +set(COMMON_SOURCE data_input.f90) + +# Source files +set(DFSOBJS ${COMMON_SOURCE} amg_df_sample.f90) +set(SFSOBJS ${COMMON_SOURCE} amg_sf_sample.f90) +set(CFSOBJS ${COMMON_SOURCE} amg_cf_sample.f90) +set(ZFSOBJS ${COMMON_SOURCE} amg_zf_sample.f90) + + # Source files set(DGEN2D amg_d_pde2d_poisson_mod.f90 @@ -68,30 +82,33 @@ set(SGEN3D # Define executables and their sources set(amg_d_pde3d_SOURCES + ${COMMON_SOURCE} amg_d_pde3d.f90 amg_d_genpde_mod.f90 ${DGEN3D} - data_input.f90 ) set(amg_s_pde3d_SOURCES + ${COMMON_SOURCE} amg_s_pde3d.f90 amg_s_genpde_mod.f90 ${SGEN3D} - data_input.f90 ) set(amg_d_pde2d_SOURCES + ${COMMON_SOURCE} amg_d_pde2d.f90 amg_d_genpde_mod.f90 ${DGEN2D} - data_input.f90 ) set(amg_s_pde2d_SOURCES + ${COMMON_SOURCE} amg_s_pde2d.f90 amg_s_genpde_mod.f90 ${SGEN2D} - data_input.f90 ) + + + # Function to create executable macro(create_amg_executable target sources) add_executable(${target} ${sources}) @@ -102,11 +119,15 @@ macro(create_amg_executable target sources) ) # Move executable to EXEDIR (post-build) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E move $ ${EXEDIR} - ) + #add_custom_command(TARGET ${target} POST_BUILD + # COMMAND ${CMAKE_COMMAND} -E move $ ${EXEDIR} + #) + set_target_properties(${target} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${EXEDIR} + ) endmacro() + # Create executables create_amg_executable(amg_d_pde3d ${amg_d_pde3d_SOURCES}) create_amg_executable(amg_s_pde3d ${amg_s_pde3d_SOURCES}) From 23cf86a797f116346d16796200346e31e80bed5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20Pep=C3=A8=20Sciarria?= Date: Mon, 9 Jun 2025 14:10:45 +0200 Subject: [PATCH 12/19] hot fix: change filename extensions to F90 --- samples/advanced/pdegen/CMakeLists.txt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/samples/advanced/pdegen/CMakeLists.txt b/samples/advanced/pdegen/CMakeLists.txt index ab559b6d..28524278 100644 --- a/samples/advanced/pdegen/CMakeLists.txt +++ b/samples/advanced/pdegen/CMakeLists.txt @@ -83,26 +83,26 @@ set(SGEN3D # Define executables and their sources set(amg_d_pde3d_SOURCES ${COMMON_SOURCE} - amg_d_pde3d.f90 - amg_d_genpde_mod.f90 + amg_d_pde3d.F90 + amg_d_genpde_mod.F90 ${DGEN3D} ) set(amg_s_pde3d_SOURCES ${COMMON_SOURCE} - amg_s_pde3d.f90 - amg_s_genpde_mod.f90 + amg_s_pde3d.F90 + amg_s_genpde_mod.F90 ${SGEN3D} ) set(amg_d_pde2d_SOURCES ${COMMON_SOURCE} - amg_d_pde2d.f90 - amg_d_genpde_mod.f90 + amg_d_pde2d.F90 + amg_d_genpde_mod.F90 ${DGEN2D} ) set(amg_s_pde2d_SOURCES ${COMMON_SOURCE} - amg_s_pde2d.f90 - amg_s_genpde_mod.f90 + amg_s_pde2d.F90 + amg_s_genpde_mod.F90 ${SGEN2D} ) From 7c153de54a1b25715771ea5f552fd4a11794ac88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20Pep=C3=A8=20Sciarria?= Date: Mon, 9 Jun 2025 17:18:37 +0200 Subject: [PATCH 13/19] add cpp file compilation; fix mpi compilation --- CMakeLists.txt | 102 +++++++++++++++++++++++++++++++++++++++-- amgprec/CMakeLists.txt | 26 +++++++++++ 2 files changed, 124 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d658ad70..8aaf1c87 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.10) -project(amg4psblas VERSION 1.0 LANGUAGES C Fortran) +project(amg4psblas VERSION 1.0 LANGUAGES C CXX Fortran) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") @@ -39,7 +39,7 @@ set(LIBDIR "${PSBLAS_INSTALL_DIR}/${PSB_CMAKE_INSTALL_LIBDIR}") # Include directories for the project -include_directories(${PSBLAS_INSTALL_DIR}) +include_directories(${PSBLAS_INSTALL_DIR} ${MPI_INCLUDE_PATH} ) # Include directories for the Fortran compiler @@ -177,6 +177,65 @@ add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure) #---------------------------------- # Determine if we're using Open MPI #--------------------------------- + + + +find_package( MPI REQUIRED Fortran ) + +if(MPI_FOUND) + #----------------------------------------------- + # Work around an issue present on fedora systems + #----------------------------------------------- + if( (MPI_C_LINK_FLAGS MATCHES "noexecstack") OR (MPI_Fortran_LINK_FLAGS MATCHES "noexecstack") ) + message ( WARNING + "The `noexecstack` linker flag was found in the MPI__LINK_FLAGS variable. This is +known to cause segmentation faults for some Fortran codes. See, e.g., +https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71729 or +https://github.com/sourceryinstitute/OpenCoarrays/issues/317. + +`noexecstack` is being replaced with `execstack`" + ) + string(REPLACE "noexecstack" + "execstack" MPI_C_LINK_FLAGS_FIXED ${MPI_C_LINK_FLAGS}) + string(REPLACE "noexecstack" + "execstack" MPI_Fortran_LINK_FLAGS_FIXED ${MPI_Fortran_LINK_FLAGS}) + set(MPI_C_LINK_FLAGS "${MPI_C_LINK_FLAGS_FIXED}" CACHE STRING + "MPI C linking flags" FORCE) + set(MPI_Fortran_LINK_FLAGS "${MPI_Fortran_LINK_FLAGS_FIXED}" CACHE STRING + "MPI Fortran linking flags" FORCE) + + endif() + + message(STATUS "Found MPI: ${MPI_C_LIBRARIES} ${MPI_Fortran_LIBRARIES}") + + #---------------- + # Setup MPI flags + #---------------- + list(REMOVE_DUPLICATES MPI_Fortran_INCLUDE_PATH) + set(CMAKE_C_COMPILE_FLAGS ${CMAKE_C_COMPILE_FLAGS} ${MPI_C_COMPILE_FLAGS}) + set(CMAKE_C_LINK_FLAGS ${CMAKE_C_LINK_FLAGS} ${MPI_C_LINK_FLAGS}) + set(CMAKE_Fortran_COMPILE_FLAGS ${CMAKE_Fortran_COMPILE_FLAGS} ${MPI_Fortran_COMPILE_FLAGS}) + set(CMAKE_Fortran_LINK_FLAGS ${CMAKE_Fortran_LINK_FLAGS} ${MPI_Fortran_LINK_FLAGS}) + include_directories(BEFORE ${MPI_C_INCLUDE_PATH} ${MPI_Fortran_INCLUDE_PATH}) +message(STATUS "${MPI_C_INCLUDE_PATH}; ${MPI_Fortran_INCLUDE_PATH};; ${CMAKE_Fortran_LINK_FLAGS} ;") + if(MPI_Fortran_HAVE_F90_MODULE OR MPI_Fortran_HAVE_F08_MODULE) + add_compile_options(-DPSB_MPI_MOD) + message(STATUS "-DPSB_MPI_MOD") + #add_compile_options(-DSERIAL_MPI) # Is it right?? + #message(STATUS "-DSERIAL_MPI") + endif() + set(PSB_SERIAL_MPI OFF) + +else() + message(STATUS "MPI not found, serial ahead") + add_compile_options(-DPSB_SERIAL_MPI) + add_compile_options(-DPSB_MPI_MOD) + set(PSB_SERIAL_MPI ON) + set(CSERIALMPI "#define PSB_SERIAL_MPI") +endif() + + +message(STATUS "++++++++++++++++++++++++++++++ MPI") if(MPI_FOUND) execute_process(COMMAND ${MPIEXEC} --version OUTPUT_VARIABLE mpi_version_out) @@ -184,8 +243,36 @@ if(MPI_FOUND) message( STATUS "OpenMPI detected") set ( openmpi true ) endif() -endif() + + + set(MPI_H_COPIED FALSE) + set(MPI_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/include") # Define the include directory + + # Create the include directory if it doesn't exist + file(MAKE_DIRECTORY "${MPI_INCLUDE_DIR}") + + foreach(path IN LISTS MPI_INCLUDE_PATH) + # Construct the full path to the mpi.h file + set(mpi_h_path "${path}/mpi.h") + + # Check if the mpi.h file exists + if(EXISTS "${mpi_h_path}") + # Copy the mpi.h file to the include directory + file(COPY "${mpi_h_path}" DESTINATION "${MPI_INCLUDE_DIR}") + message(STATUS "Copied mpi.h from ${mpi_h_path} to ${MPI_INCLUDE_DIR}") + set(MPI_H_COPIED TRUE) + break() # Exit the loop once we've copied the file + endif() + endforeach() + + if(NOT MPI_H_COPIED) + message(WARNING "mpi.h not found in any of the specified paths: ${MPI_INCLUDE_PATH}") + endif() + # Add the created include directory to the project's include directories + include_directories("${MPI_INCLUDE_DIR}") +endif() +message(STATUS "******************************** MPI") #------------------------------------------ @@ -215,13 +302,20 @@ include(${CMAKE_CURRENT_LIST_DIR}/amgprec/CMakeLists.txt) # include amgprec_sou include_directories("${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}") add_library(amgprec_C OBJECT ${amgprec_source_C_files}) +add_library(amgprec_CPP OBJECT ${amgprec_source_CPP_files}) target_link_libraries(amgprec_C #PUBLIC ${LAPACK_LINKER_FLAGS} ${LAPACK_LIBRARIES} ${LAPACK95_LIBRARIES} #PUBLIC ${BLAS_LINKER_FLAGS} ${BLAS_LIBRARIES} ${BLAS95_LIBRARIES} psblas::util psblas::linsolve psblas::prec psblas::ext psblas::cbind psblas::base) #TODO check actual libraries needed -add_library(amgprec ${amgprec_source_files} $) +target_link_libraries(amgprec_CPP + #PUBLIC ${LAPACK_LINKER_FLAGS} ${LAPACK_LIBRARIES} ${LAPACK95_LIBRARIES} + #PUBLIC ${BLAS_LINKER_FLAGS} ${BLAS_LIBRARIES} ${BLAS95_LIBRARIES} + psblas::util psblas::linsolve psblas::prec psblas::ext psblas::cbind psblas::base + ${MPI_LIBRARIES} ) #TODO check actual libraries needed + +add_library(amgprec ${amgprec_source_files} $ $) set_target_properties(amgprec PROPERTIES diff --git a/amgprec/CMakeLists.txt b/amgprec/CMakeLists.txt index 87a91b72..a0fd8f20 100644 --- a/amgprec/CMakeLists.txt +++ b/amgprec/CMakeLists.txt @@ -875,6 +875,32 @@ list(APPEND AMG_amgprec_source_C_files impl/amg_dslud_interface.c) list(APPEND AMG_amgprec_source_C_files impl/amg_zumf_interface.c) list(APPEND AMG_amgprec_source_C_files impl/amg_zslud_interface.c) + +set(AMG_amgprec_source_CPP_files +impl/aggregator/computeCandidateMate.cpp +impl/aggregator/processExposedVertex.cpp +impl/aggregator/processMatchedVertices.cpp +impl/aggregator/algoDistEdgeApproxDomEdgesLinearSearchMesgBndlSmallMateCMP.cpp +impl/aggregator/processCrossEdge.cpp +impl/aggregator/findOwnerOfGhost.cpp +impl/aggregator/MatchBoxPC.cpp +impl/aggregator/queueTransfer.cpp +impl/aggregator/clean.cpp +impl/aggregator/algoDistEdgeApproxDomEdgesLinearSearchMesgBndlSmallMateC.cpp +impl/aggregator/extractUChunk.cpp +impl/aggregator/processMatchedVerticesAndSendMessages.cpp +impl/aggregator/sendBundledMessages.cpp +impl/aggregator/initialize.cpp +impl/aggregator/isAlreadyMatched.cpp +impl/aggregator/processMessages.cpp +impl/aggregator/parallelComputeCandidateMateB.cpp +) + foreach(file IN LISTS AMG_amgprec_source_C_files) list(APPEND amgprec_source_C_files ${CMAKE_CURRENT_LIST_DIR}/${file}) endforeach() + + +foreach(file IN LISTS AMG_amgprec_source_CPP_files) + list(APPEND amgprec_source_CPP_files ${CMAKE_CURRENT_LIST_DIR}/${file}) +endforeach() From 0cb2c1c0c69ea3073e8a5d0493f4d75e0bbc367a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20Pep=C3=A8=20Sciarria?= Date: Tue, 10 Jun 2025 08:37:17 +0200 Subject: [PATCH 14/19] hot fix --- samples/advanced/fileread/CMakeLists.txt | 8 ++++---- samples/advanced/pdegen/CMakeLists.txt | 14 ++++++++------ samples/simple/fileread/CMakeLists.txt | 16 ++++++++-------- samples/simple/pdegen/CMakeLists.txt | 8 ++++---- 4 files changed, 24 insertions(+), 22 deletions(-) diff --git a/samples/advanced/fileread/CMakeLists.txt b/samples/advanced/fileread/CMakeLists.txt index 1ab7286b..c25ca2d5 100644 --- a/samples/advanced/fileread/CMakeLists.txt +++ b/samples/advanced/fileread/CMakeLists.txt @@ -75,10 +75,10 @@ endmacro() # Create executables -create_amg_executable(amg_df_sample ${DFSOBJS}) -create_amg_executable(amg_sf_sample ${SFSOBJS}) -create_amg_executable(amg_cf_sample ${CFSOBJS}) -create_amg_executable(amg_zf_sample ${ZFSOBJS}) +create_amg_executable(amg_df_sample "${DFSOBJS}") +create_amg_executable(amg_sf_sample "${SFSOBJS}") +create_amg_executable(amg_cf_sample "${CFSOBJS}") +create_amg_executable(amg_zf_sample "${ZFSOBJS}") # Create "runs" directory (if it doesn't exist) add_custom_target(create_runs_dir diff --git a/samples/advanced/pdegen/CMakeLists.txt b/samples/advanced/pdegen/CMakeLists.txt index 28524278..eb67f108 100644 --- a/samples/advanced/pdegen/CMakeLists.txt +++ b/samples/advanced/pdegen/CMakeLists.txt @@ -18,13 +18,15 @@ endif() find_package(psblas REQUIRED PATHS ${PSBLAS_INSTALL_DIR}) find_package(amg4psblas REQUIRED PATHS ${AMG4PSBLAS_INSTALL_DIR}) +set(CMAKE_CXX_STANDARD 17) # Include directories include_directories( "." "${AMG4PSBLAS_INSTALL_DIR}/include" "${AMG4PSBLAS_INSTALL_DIR}/modules" - "${PSBLAS_INSTALL_DIR}/include" + "${PSBLAS_INSTALL_DIR}/include" + "${PSBLAS_INSTALL_DIR}/modules" ) # Fortran module directory @@ -115,7 +117,7 @@ macro(create_amg_executable target sources) target_link_libraries(${target} PUBLIC ${AMG_LIBS} ${PSBLAS_LIBS} - + stdc++ ) # Move executable to EXEDIR (post-build) @@ -129,10 +131,10 @@ endmacro() # Create executables -create_amg_executable(amg_d_pde3d ${amg_d_pde3d_SOURCES}) -create_amg_executable(amg_s_pde3d ${amg_s_pde3d_SOURCES}) -create_amg_executable(amg_d_pde2d ${amg_d_pde2d_SOURCES}) -create_amg_executable(amg_s_pde2d ${amg_s_pde2d_SOURCES}) +create_amg_executable(amg_d_pde3d "${amg_d_pde3d_SOURCES}") +create_amg_executable(amg_s_pde3d "${amg_s_pde3d_SOURCES}") +create_amg_executable(amg_d_pde2d "${amg_d_pde2d_SOURCES}") +create_amg_executable(amg_s_pde2d "${amg_s_pde2d_SOURCES}") # Create "runs" directory (if it doesn't exist) add_custom_target(create_runs_dir diff --git a/samples/simple/fileread/CMakeLists.txt b/samples/simple/fileread/CMakeLists.txt index 9a5a4bf2..a3e24f3e 100644 --- a/samples/simple/fileread/CMakeLists.txt +++ b/samples/simple/fileread/CMakeLists.txt @@ -76,14 +76,14 @@ macro(create_amg_executable target sources) endmacro() # Create executables -create_amg_executable(amg_dexample_ml ${DMOBJS}) -create_amg_executable(amg_dexample_1lev ${D1OBJS}) -create_amg_executable(amg_zexample_ml ${ZMOBJS}) -create_amg_executable(amg_zexample_1lev ${Z1OBJS}) -create_amg_executable(amg_sexample_ml ${SMOBJS}) -create_amg_executable(amg_sexample_1lev ${S1OBJS}) -create_amg_executable(amg_cexample_ml ${CMOBJS}) -create_amg_executable(amg_cexample_1lev ${C1OBJS}) +create_amg_executable(amg_dexample_ml "${DMOBJS}") +create_amg_executable(amg_dexample_1lev "${D1OBJS}") +create_amg_executable(amg_zexample_ml "${ZMOBJS}") +create_amg_executable(amg_zexample_1lev "${Z1OBJS}") +create_amg_executable(amg_sexample_ml "${SMOBJS}") +create_amg_executable(amg_sexample_1lev "${S1OBJS}") +create_amg_executable(amg_cexample_ml "${CMOBJS}") +create_amg_executable(amg_cexample_1lev "${C1OBJS}") # Create "runs" directory (if it doesn't exist) add_custom_target(create_runs_dir diff --git a/samples/simple/pdegen/CMakeLists.txt b/samples/simple/pdegen/CMakeLists.txt index 33d1b6d1..025138ca 100644 --- a/samples/simple/pdegen/CMakeLists.txt +++ b/samples/simple/pdegen/CMakeLists.txt @@ -73,10 +73,10 @@ macro(create_amg_executable target sources) ) endmacro() # Create executables -create_amg_executable(amg_dexample_ml ${DMOBJS}) -create_amg_executable(amg_dexample_1lev ${D1OBJS}) -create_amg_executable(amg_sexample_ml ${SMOBJS}) -create_amg_executable(amg_sexample_1lev ${S1OBJS}) +create_amg_executable(amg_dexample_ml "${DMOBJS}") +create_amg_executable(amg_dexample_1lev "${D1OBJS}") +create_amg_executable(amg_sexample_ml "${SMOBJS}") +create_amg_executable(amg_sexample_1lev "${S1OBJS}") # Create "runs" directory (if it doesn't exist) add_custom_target(create_runs_dir From 6c12de02e8a4e1f818c770c0c1db59af25625c67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20Pep=C3=A8=20Sciarria?= Date: Tue, 10 Jun 2025 09:50:56 +0200 Subject: [PATCH 15/19] add cxx mpi version --- CMakeLists.txt | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8aaf1c87..0e1bc5d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,6 +21,9 @@ message(STATUS "psblas directory is ${PSBLAS_INSTALL_DIR};;") message(STATUS "PSBLAS DIRECTORY INC ${INCDIR}; MOD ${MODDIR}; LIB ${LIBDIR};") + +set(CMAKE_CXX_STANDARD 17) # Set cxx standard for the c++ part of the library + # Find the psblas package find_package(psblas REQUIRED PATHS ${PSBLAS_INSTALL_DIR}) @@ -180,7 +183,7 @@ add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure) -find_package( MPI REQUIRED Fortran ) +find_package( MPI REQUIRED Fortran C CXX ) if(MPI_FOUND) #----------------------------------------------- @@ -206,7 +209,7 @@ https://github.com/sourceryinstitute/OpenCoarrays/issues/317. endif() - message(STATUS "Found MPI: ${MPI_C_LIBRARIES} ${MPI_Fortran_LIBRARIES}") + message(STATUS "Found MPI: ${MPI_C_LIBRARIES} - ${MPI_CXX_LIBRARIES} - ${MPI_Fortran_LIBRARIES}") #---------------- # Setup MPI flags @@ -235,7 +238,7 @@ else() endif() -message(STATUS "++++++++++++++++++++++++++++++ MPI") + if(MPI_FOUND) execute_process(COMMAND ${MPIEXEC} --version OUTPUT_VARIABLE mpi_version_out) @@ -272,7 +275,7 @@ if(MPI_FOUND) # Add the created include directory to the project's include directories include_directories("${MPI_INCLUDE_DIR}") endif() -message(STATUS "******************************** MPI") + #------------------------------------------ @@ -293,7 +296,8 @@ configure_file( #--------------------------------------- - +message(STATUS "MPI_LIBRARIES: ${MPI_LIBRARIES}") +message(STATUS "MPI_CXX_LIBRARIES: ${MPI_CXX_LIBRARIES}") @@ -313,7 +317,8 @@ target_link_libraries(amgprec_CPP #PUBLIC ${LAPACK_LINKER_FLAGS} ${LAPACK_LIBRARIES} ${LAPACK95_LIBRARIES} #PUBLIC ${BLAS_LINKER_FLAGS} ${BLAS_LIBRARIES} ${BLAS95_LIBRARIES} psblas::util psblas::linsolve psblas::prec psblas::ext psblas::cbind psblas::base - ${MPI_LIBRARIES} ) #TODO check actual libraries needed + stdc++ + ${MPI_C_LIBRARIES} ${MPI_Fortran_LIBRARIES} ) #TODO check actual libraries needed add_library(amgprec ${amgprec_source_files} $ $) @@ -337,7 +342,8 @@ target_include_directories(amgprec PUBLIC ${INCDIR} ${MODDIR}) target_link_libraries(amgprec #PUBLIC ${LAPACK_LINKER_FLAGS} ${LAPACK_LIBRARIES} ${LAPACK95_LIBRARIES} #PUBLIC ${BLAS_LINKER_FLAGS} ${BLAS_LIBRARIES} ${BLAS95_LIBRARIES} - psblas::util psblas::linsolve psblas::prec psblas::ext psblas::cbind psblas::base) #TODO check actual libraries needed + psblas::util psblas::linsolve psblas::prec psblas::ext psblas::cbind psblas::base + ${MPI_LIBRARIES}) #TODO check actual libraries needed From e429b04600942e85c3d9d15917fb4c64e835637d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20Pep=C3=A8=20Sciarria?= Date: Fri, 13 Jun 2025 13:15:00 +0200 Subject: [PATCH 16/19] work on cpp part of amgprec. Still not working --- CMakeLists.txt | 45 +++++++++++++++++++++++++++++++++++------- amgprec/CMakeLists.txt | 1 + 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0e1bc5d4..1e5e9e8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,8 @@ message(STATUS "psblas directory is ${PSBLAS_INSTALL_DIR};;") message(STATUS "PSBLAS DIRECTORY INC ${INCDIR}; MOD ${MODDIR}; LIB ${LIBDIR};") -set(CMAKE_CXX_STANDARD 17) # Set cxx standard for the c++ part of the library +#set(CMAKE_CXX_STANDARD 17) # Set cxx standard for the c++ part of the library + # Find the psblas package find_package(psblas REQUIRED PATHS ${PSBLAS_INSTALL_DIR}) @@ -33,6 +34,19 @@ else() message(STATUS "Found PSBLAS: ${psblas_LIBRARIES}") endif() +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + # Add -g to the Fortran compiler flags. + # We use STRING(APPEND) to ensure we don't overwrite other important flags. + string(APPEND CMAKE_Fortran_FLAGS " -g") + string(APPEND CMAKE_CXX_FLAGS " -g") + message(STATUS "Fortran and CXX debug flags added: -g") +endif() + + string(APPEND CMAKE_Fortran_FLAGS " -O2") + string(APPEND CMAKE_CXX_FLAGS " -O2") + message(STATUS "Fortran and CXX optimization flags added: -O2") + + # Set the include and library directories based on the provided path #set(TEST_INSTALLDIR "${PSBLAS_INSTALL_DIR}") @@ -189,7 +203,7 @@ if(MPI_FOUND) #----------------------------------------------- # Work around an issue present on fedora systems #----------------------------------------------- - if( (MPI_C_LINK_FLAGS MATCHES "noexecstack") OR (MPI_Fortran_LINK_FLAGS MATCHES "noexecstack") ) + if( (MPI_CXX_LINK_FLAGS MATCHES "noexecstack") OR (MPI_Fortran_LINK_FLAGS MATCHES "noexecstack") ) message ( WARNING "The `noexecstack` linker flag was found in the MPI__LINK_FLAGS variable. This is known to cause segmentation faults for some Fortran codes. See, e.g., @@ -198,10 +212,14 @@ https://github.com/sourceryinstitute/OpenCoarrays/issues/317. `noexecstack` is being replaced with `execstack`" ) + string(REPLACE "noexecstack" + "execstack" MPI_CXX_LINK_FLAGS_FIXED ${MPI_CXX_LINK_FLAGS}) string(REPLACE "noexecstack" "execstack" MPI_C_LINK_FLAGS_FIXED ${MPI_C_LINK_FLAGS}) string(REPLACE "noexecstack" "execstack" MPI_Fortran_LINK_FLAGS_FIXED ${MPI_Fortran_LINK_FLAGS}) + set(MPI_CXX_LINK_FLAGS "${MPI_CXX_LINK_FLAGS_FIXED}" CACHE STRING + "MPI CXX linking flags" FORCE) set(MPI_C_LINK_FLAGS "${MPI_C_LINK_FLAGS_FIXED}" CACHE STRING "MPI C linking flags" FORCE) set(MPI_Fortran_LINK_FLAGS "${MPI_Fortran_LINK_FLAGS_FIXED}" CACHE STRING @@ -211,15 +229,25 @@ https://github.com/sourceryinstitute/OpenCoarrays/issues/317. message(STATUS "Found MPI: ${MPI_C_LIBRARIES} - ${MPI_CXX_LIBRARIES} - ${MPI_Fortran_LIBRARIES}") + + #---------------- + # Setup MPI compilers + #---------------- + set(CMAKE_C_COMPILER ${MPI_C_COMPILER} CACHE FILEPATH "C compiler" FORCE) + set(CMAKE_CXX_COMPILER ${MPI_CXX_COMPILER} CACHE FILEPATH "C++ compiler" FORCE) + set(CMAKE_Fortran_COMPILER ${MPI_Fortran_COMPILER} CACHE FILEPATH "Fortran compiler" FORCE) + #---------------- # Setup MPI flags #---------------- list(REMOVE_DUPLICATES MPI_Fortran_INCLUDE_PATH) set(CMAKE_C_COMPILE_FLAGS ${CMAKE_C_COMPILE_FLAGS} ${MPI_C_COMPILE_FLAGS}) set(CMAKE_C_LINK_FLAGS ${CMAKE_C_LINK_FLAGS} ${MPI_C_LINK_FLAGS}) + set(CMAKE_CXX_COMPILE_FLAGS ${CMAKE_CXX_COMPILE_FLAGS} ${MPI_CXX_COMPILE_FLAGS}) + set(CMAKE_CXX_LINK_FLAGS ${CMAKE_CXX_LINK_FLAGS} ${MPI_CXX_LINK_FLAGS}) set(CMAKE_Fortran_COMPILE_FLAGS ${CMAKE_Fortran_COMPILE_FLAGS} ${MPI_Fortran_COMPILE_FLAGS}) set(CMAKE_Fortran_LINK_FLAGS ${CMAKE_Fortran_LINK_FLAGS} ${MPI_Fortran_LINK_FLAGS}) - include_directories(BEFORE ${MPI_C_INCLUDE_PATH} ${MPI_Fortran_INCLUDE_PATH}) + include_directories(BEFORE ${MPI_C_INCLUDE_PATH} ${MPI_CXX_INCLUDE_PATH} ${MPI_Fortran_INCLUDE_PATH}) message(STATUS "${MPI_C_INCLUDE_PATH}; ${MPI_Fortran_INCLUDE_PATH};; ${CMAKE_Fortran_LINK_FLAGS} ;") if(MPI_Fortran_HAVE_F90_MODULE OR MPI_Fortran_HAVE_F08_MODULE) add_compile_options(-DPSB_MPI_MOD) @@ -273,7 +301,7 @@ if(MPI_FOUND) endif() # Add the created include directory to the project's include directories - include_directories("${MPI_INCLUDE_DIR}") + #include_directories("${MPI_INCLUDE_DIR}") endif() @@ -311,14 +339,16 @@ add_library(amgprec_CPP OBJECT ${amgprec_source_CPP_files}) target_link_libraries(amgprec_C #PUBLIC ${LAPACK_LINKER_FLAGS} ${LAPACK_LIBRARIES} ${LAPACK95_LIBRARIES} #PUBLIC ${BLAS_LINKER_FLAGS} ${BLAS_LIBRARIES} ${BLAS95_LIBRARIES} - psblas::util psblas::linsolve psblas::prec psblas::ext psblas::cbind psblas::base) #TODO check actual libraries needed + psblas::util psblas::linsolve psblas::prec psblas::ext psblas::cbind psblas::base + #${MPI_C_LIBRARIES} + ) #TODO check actual libraries needed target_link_libraries(amgprec_CPP #PUBLIC ${LAPACK_LINKER_FLAGS} ${LAPACK_LIBRARIES} ${LAPACK95_LIBRARIES} #PUBLIC ${BLAS_LINKER_FLAGS} ${BLAS_LIBRARIES} ${BLAS95_LIBRARIES} psblas::util psblas::linsolve psblas::prec psblas::ext psblas::cbind psblas::base stdc++ - ${MPI_C_LIBRARIES} ${MPI_Fortran_LIBRARIES} ) #TODO check actual libraries needed + ${MPI_CXX_LIBRARIES}) #TODO check actual libraries needed add_library(amgprec ${amgprec_source_files} $ $) @@ -343,7 +373,8 @@ target_link_libraries(amgprec #PUBLIC ${LAPACK_LINKER_FLAGS} ${LAPACK_LIBRARIES} ${LAPACK95_LIBRARIES} #PUBLIC ${BLAS_LINKER_FLAGS} ${BLAS_LIBRARIES} ${BLAS95_LIBRARIES} psblas::util psblas::linsolve psblas::prec psblas::ext psblas::cbind psblas::base - ${MPI_LIBRARIES}) #TODO check actual libraries needed + #${MPI_Fortran_LIBRARIES} ${MPI_CXX_LIBRARIES} ${MPI_C_LIBRARIES} + ) #TODO check actual libraries needed diff --git a/amgprec/CMakeLists.txt b/amgprec/CMakeLists.txt index a0fd8f20..f47de40b 100644 --- a/amgprec/CMakeLists.txt +++ b/amgprec/CMakeLists.txt @@ -896,6 +896,7 @@ impl/aggregator/processMessages.cpp impl/aggregator/parallelComputeCandidateMateB.cpp ) + foreach(file IN LISTS AMG_amgprec_source_C_files) list(APPEND amgprec_source_C_files ${CMAKE_CURRENT_LIST_DIR}/${file}) endforeach() From f4e1ba97e939c837c05ed89b81acb3270cdcaa4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20Pep=C3=A8=20Sciarria?= Date: Fri, 13 Jun 2025 13:15:43 +0200 Subject: [PATCH 17/19] add mpi compilation --- samples/advanced/pdegen/CMakeLists.txt | 58 +++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 5 deletions(-) diff --git a/samples/advanced/pdegen/CMakeLists.txt b/samples/advanced/pdegen/CMakeLists.txt index eb67f108..355ec855 100644 --- a/samples/advanced/pdegen/CMakeLists.txt +++ b/samples/advanced/pdegen/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.15) -project(AMGExamples Fortran) +project(AMGExamples Fortran CXX) # Installation directories (passed as CMake variables) set(AMG4PSBLAS_INSTALL_DIR "" CACHE PATH "Path to AMG installation") @@ -18,7 +18,54 @@ endif() find_package(psblas REQUIRED PATHS ${PSBLAS_INSTALL_DIR}) find_package(amg4psblas REQUIRED PATHS ${AMG4PSBLAS_INSTALL_DIR}) -set(CMAKE_CXX_STANDARD 17) + + +find_package(MPI REQUIRED Fortran CXX ) + +if(MPI_FOUND) + + + if( (MPI_CXX_LINK_FLAGS MATCHES "noexecstack") OR (MPI_Fortran_LINK_FLAGS MATCHES "noexecstack") ) + message ( WARNING + "The `noexecstack` linker flag was found in the MPI__LINK_FLAGS variable. This is +known to cause segmentation faults for some Fortran codes. See, e.g., +https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71729 or +https://github.com/sourceryinstitute/OpenCoarrays/issues/317. + +`noexecstack` is being replaced with `execstack`" + ) + string(REPLACE "noexecstack" + "execstack" MPI_CXX_LINK_FLAGS_FIXED ${MPI_CXX_LINK_FLAGS}) + string(REPLACE "noexecstack" + "execstack" MPI_C_LINK_FLAGS_FIXED ${MPI_C_LINK_FLAGS}) + string(REPLACE "noexecstack" + "execstack" MPI_Fortran_LINK_FLAGS_FIXED ${MPI_Fortran_LINK_FLAGS}) + set(MPI_CXX_LINK_FLAGS "${MPI_CXX_LINK_FLAGS_FIXED}" CACHE STRING + "MPI CXX linking flags" FORCE) + set(MPI_C_LINK_FLAGS "${MPI_C_LINK_FLAGS_FIXED}" CACHE STRING + "MPI C linking flags" FORCE) + set(MPI_Fortran_LINK_FLAGS "${MPI_Fortran_LINK_FLAGS_FIXED}" CACHE STRING + "MPI Fortran linking flags" FORCE) + + endif() + + message(STATUS "Found MPI: ${MPI_C_LIBRARIES} - ${MPI_CXX_LIBRARIES} - ${MPI_Fortran_LIBRARIES}") + + + #---------------- + # Setup MPI compiler + #---------------- + set(CMAKE_C_COMPILER ${MPI_C_COMPILER} CACHE FILEPATH "C compiler" FORCE) + set(CMAKE_CXX_COMPILER ${MPI_CXX_COMPILER} CACHE FILEPATH "C++ compiler" FORCE) + set(CMAKE_Fortran_COMPILER ${MPI_Fortran_COMPILER} CACHE FILEPATH "Fortran compiler" FORCE) +endif() + +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + # Add -g to the Fortran compiler flags. + # We use STRING(APPEND) to ensure we don't overwrite other important flags. + string(APPEND CMAKE_Fortran_FLAGS " -g") + message(STATUS "Fortran debug flags added: -g") +endif() # Include directories include_directories( @@ -112,12 +159,12 @@ set(amg_s_pde2d_SOURCES # Function to create executable -macro(create_amg_executable target sources) +function(create_amg_executable target sources) add_executable(${target} ${sources}) target_link_libraries(${target} PUBLIC ${AMG_LIBS} ${PSBLAS_LIBS} - stdc++ + ${MPI_LIBRARIES} ) # Move executable to EXEDIR (post-build) @@ -126,8 +173,9 @@ macro(create_amg_executable target sources) #) set_target_properties(${target} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${EXEDIR} + LINKER_LANGUAGE Fortran ) -endmacro() +endfunction() # Create executables From 372ef708e0282e215af8e83f53108a3cab2bf85b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20Pep=C3=A8=20Sciarria?= Date: Mon, 16 Jun 2025 11:41:39 +0200 Subject: [PATCH 18/19] hot fix: now it build cbind with the right source files --- CMakeLists.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e5e9e8e..a1f0648f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -265,7 +265,8 @@ else() set(CSERIALMPI "#define PSB_SERIAL_MPI") endif() - +add_compile_options(-O3) +add_compile_options($<$:-frecursive>) if(MPI_FOUND) execute_process(COMMAND ${MPIEXEC} --version @@ -350,7 +351,7 @@ target_link_libraries(amgprec_CPP stdc++ ${MPI_CXX_LIBRARIES}) #TODO check actual libraries needed -add_library(amgprec ${amgprec_source_files} $ $) +add_library(amgprec ${amgprec_source_files} $ $ ) set_target_properties(amgprec PROPERTIES @@ -391,14 +392,14 @@ foreach(path IN LISTS amgcbind_header_C_files) endforeach() -add_library(amgcbind_C OBJECT ${amgprec_source_C_files}) +add_library(amgcbind_C OBJECT ${amgcbind_source_C_files}) target_link_libraries(amgcbind_C #PUBLIC ${LAPACK_LINKER_FLAGS} ${LAPACK_LIBRARIES} ${LAPACK95_LIBRARIES} #PUBLIC ${BLAS_LINKER_FLAGS} ${BLAS_LIBRARIES} ${BLAS95_LIBRARIES} psblas::util psblas::linsolve psblas::prec psblas::ext psblas::cbind psblas::base) #TODO check actual libraries needed -add_library(amgcbind ${amgprec_source_files} $) +add_library(amgcbind ${amgcbind_source_files} $) set_target_properties(amgcbind PROPERTIES From 5408e16a4a8fdffa355d5c8b846ffd1582d47ff3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luca=20Pep=C3=A8=20Sciarria?= Date: Mon, 16 Jun 2025 16:46:07 +0200 Subject: [PATCH 19/19] hot fix: add -ffree-line-length-256 compilation flag for fortran --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index a1f0648f..3c53de8f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -324,6 +324,8 @@ configure_file( # Add the AMG libraries #--------------------------------------- +# In your CMakeLists.txt +set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -ffree-line-length-256") message(STATUS "MPI_LIBRARIES: ${MPI_LIBRARIES}") message(STATUS "MPI_CXX_LIBRARIES: ${MPI_CXX_LIBRARIES}")