From db83b9457cb3f2438639eca31ceb8c7224e207db Mon Sep 17 00:00:00 2001 From: Ali Hakam <132768426+alihakam830@users.noreply.github.com> Date: Thu, 13 Nov 2025 11:15:03 +0200 Subject: [PATCH 1/4] V2.0.0 (#44) * integrate netcdf * stage zero working * update root cmake * add netcdf reading prints and update readme with example * improve csv file writing * add forcing data * added parsec support * added syncronized file writing and lat-lon parameters * Cleaned stage-zero parsec generator and added the full pipeline script * Fixed data generator for parsec loader * added parsec operations support * add new synthetic generator and parsec jdf files and configurations * fixed configurations and hardware parameters * add climate emulator flag in configure and fix stage-zero starpu version * add climate emulator flag in configure and fix stage-zero starpu version * add starpu generator * add starpu generator * guard Stage Zero API functions with USE_CLIMATE_EMULATOR flag * minior edits * climate emulator flag * remove example guards and minor stage zero fix * resolve threads * adding author and versions * minor fixes renaming mean trend removal * updating handout --------- Co-authored-by: Mahmoud ElKarargy --- CMakeLists.txt | 114 +- FullPipeline.sh | 462 +++++++++ README.md | 18 +- USER_MANUAL.md | 255 ++++- cmake/FindHICMA-X.cmake | 109 ++ cmake/{FindHWLOC.cmake => FindHwloc.cmake} | 7 +- cmake/FindNetCDF.cmake | 133 +++ cmake/FindPnetCDF.cmake | 74 ++ cmake/ImportChameleon.cmake | 11 +- cmake/ImportHDF5.cmake | 44 + cmake/ImportHiCMAX.cmake | 42 + cmake/ImportHwloc.cmake | 2 +- cmake/ImportNetCDF.cmake | 40 + cmake/ImportNlohmannJSON.cmake | 39 + cmake/ImportPnetCDF.cmake | 45 + cmake/ImportStarsH.cmake | 32 +- cmake/macros/BuildDependency.cmake | 26 +- configurations/config.json | 63 ++ configure | 56 +- docs/ExaGeoStatCPP-handout.png | Bin 748012 -> 1413384 bytes examples/CMakeLists.txt | 30 +- examples/climate-emulator/CMakeLists.txt | 16 + examples/climate-emulator/ClimateEmulator.cpp | 42 + .../SyntheticDataGeneration.cpp | 1 - examples/data-loader/CSVLoader.cpp | 1 - examples/end-to-end/DataGeneration.cpp | 4 +- .../end-to-end/DataGenerationAndModeling.cpp | 4 +- .../DataGenerationAndPrediction.cpp | 4 +- .../DataGenerationModelingAndPrediction.cpp | 4 +- examples/end-to-end/DataModeling.cpp | 4 +- examples/end-to-end/DataPrediction.cpp | 4 +- examples/mean-trend-removal/CMakeLists.txt | 16 + .../mean-trend-removal/MeanTrendRemoval.cpp | 41 + inst/include/api/ExaGeoStat.hpp | 35 +- inst/include/common/Definitions.hpp | 21 +- .../include/configurations/Configurations.hpp | 357 +++---- inst/include/configurations/Parser.hpp | 61 ++ inst/include/configurations/Validator.hpp | 141 +++ inst/include/data-analyzer/DataAnalyzer.hpp | 65 ++ .../include/data-generators/DataGenerator.hpp | 4 +- .../concrete/MeanTrendRemovalGenerator.hpp | 250 +++++ .../MeanTrendRemovalGeneratorParsec.hpp | 250 +++++ .../concrete/SyntheticGenerator.hpp | 41 +- .../concrete/runtime/ParsecGenerator.hpp | 86 ++ .../concrete/runtime/StarpuGenerator.hpp | 86 ++ inst/include/data-loader/DataLoader.hpp | 29 + .../data-loader/concrete/CSVLoader.hpp | 10 +- .../data-loader/concrete/ParsecLoader.hpp | 121 +++ .../data-transformer/DataTransformer.hpp | 60 ++ inst/include/data-units/DescriptorData.hpp | 15 +- .../descriptor/ExaGeoStatDescriptor.hpp | 7 + .../descriptor/concrete/ParsecDescriptor.hpp | 58 ++ inst/include/hardware/ExaGeoStatHardware.hpp | 83 ++ inst/include/kernels/Kernel.hpp | 2 + inst/include/kernels/concrete/TrendModel.hpp | 72 ++ .../chameleon/ChameleonImplementation.hpp | 5 + inst/include/results/Results.hpp | 132 +-- .../runtime-solver/RuntimeSolverFactory.hpp | 52 + .../runtime-solver/RuntimeSolverMethods.hpp | 54 + .../concrete/ParsecRuntimeSolver.hpp | 107 ++ .../concrete/StarpuRuntimeSolver.hpp | 62 ++ .../runtime/parsec/JDFHelperFunctions.h | 86 ++ inst/include/runtime/parsec/ParsecHeader.h | 16 + .../runtime/parsec/jdf/JobDescriptionFormat.h | 325 ++++++ inst/include/utilities/EnumStringParser.hpp | 4 + src/CMakeLists.txt | 26 +- src/Rcpp-adapters/FunctionsAdapter.cpp | 21 +- src/api/ExaGeoStat.cpp | 128 ++- src/configurations/CMakeLists.txt | 2 + src/configurations/Configurations.cpp | 590 +++-------- src/configurations/Parser.cpp | 81 ++ src/configurations/Validator.cpp | 337 ++++++ src/data-analyzer/CMakeLists.txt | 17 + src/data-analyzer/DataAnalyzer.cpp | 61 ++ src/data-generators/DataGenerator.cpp | 65 +- src/data-generators/concrete/CMakeLists.txt | 29 +- .../concrete/MeanTrendRemovalGenerator.cpp | 867 ++++++++++++++++ .../MeanTrendRemovalGeneratorParsec.cpp | 975 ++++++++++++++++++ .../concrete/SyntheticGenerator.cpp | 93 +- .../concrete/runtime/ParsecGenerator.cpp | 206 ++++ .../concrete/runtime/StarpuGenerator.cpp | 98 ++ src/data-loader/DataLoader.cpp | 69 +- src/data-loader/concrete/CMakeLists.txt | 18 +- src/data-loader/concrete/CSVLoader.cpp | 52 +- src/data-loader/concrete/ParsecLoader.cpp | 286 +++++ src/data-transformer/CMakeLists.txt | 17 + src/data-transformer/DataTransformer.cpp | 113 ++ src/data-units/CMakeLists.txt | 4 +- src/data-units/DescriptorData.cpp | 82 +- .../descriptor/ExaGeoStatDescriptor.cpp | 31 +- .../descriptor/concrete/CMakeLists.txt | 22 +- .../descriptor/concrete/ParsecDescriptor.cpp | 34 + src/hardware/ExaGeoStatHardware.cpp | 158 ++- src/helpers/CommunicatorMPI.cpp | 17 +- src/kernels/concrete/TrendModel.cpp | 91 ++ src/linear-algebra-solvers/CMakeLists.txt | 13 +- .../concrete/CMakeLists.txt | 23 +- src/prediction/Prediction.cpp | 5 +- src/results/Results.cpp | 185 ++-- src/runtime-solver/CMakeLists.txt | 19 + src/runtime-solver/RuntimeSolverFactory.cpp | 36 + src/runtime-solver/concrete/CMakeLists.txt | 27 + .../concrete/ParsecRuntimeSolver.cpp | 600 +++++++++++ .../concrete/StarpuRuntimeSolver.cpp | 79 ++ src/runtime/CMakeLists.txt | 7 +- src/runtime/parsec/CMakeLists.txt | 17 +- src/runtime/parsec/JDFHelperFunctions.c | 199 ++++ src/runtime/parsec/ParsecFunctions.cpp | 88 +- src/runtime/parsec/jdf/CMakeLists.txt | 56 + src/runtime/parsec/jdf/DMatrixDet.jdf | 145 +++ src/runtime/parsec/jdf/DMatrixGeneration.jdf | 791 ++++++++++++++ src/runtime/parsec/jdf/DMatrixSetDiagonal.jdf | 91 ++ src/runtime/parsec/jdf/DMatrixSum.jdf | 119 +++ src/runtime/parsec/jdf/DZGeneration.jdf | 90 ++ src/runtime/parsec/jdf/DZSum.jdf | 114 ++ src/runtime/parsec/jdf/DifferenceDouble.jdf | 92 ++ src/runtime/parsec/jdf/ForwardSHT.jdf | 290 ++++++ src/runtime/parsec/jdf/ForwardSHTReshape.jdf | 236 +++++ src/runtime/parsec/jdf/GetMatrixNorm.jdf | 139 +++ src/runtime/parsec/jdf/InverseSHT.jdf | 162 +++ src/runtime/parsec/jdf/MatrixCompress.jdf | 409 ++++++++ src/runtime/parsec/jdf/MeanSquaredError.jdf | 96 ++ src/runtime/parsec/jdf/ReadCSV.jdf | 123 +++ src/runtime/parsec/jdf/ReadCSVComplex.jdf | 133 +++ src/runtime/parsec/jdf/ReadCSVTimeSlot.jdf | 123 +++ src/runtime/parsec/jdf/ReadCSVToComplex.jdf | 130 +++ .../parsec/jdf/ReadCSVToComplexTimeSlot.jdf | 154 +++ tests/cpp-tests/CMakeLists.txt | 27 +- .../configurations/TestConfigurations.cpp | 104 +- .../concrete/TestSyntheticGenerator.cpp | 1 - tests/cpp-tests/prediction/TestPrediction.cpp | 11 +- 131 files changed, 12603 insertions(+), 1361 deletions(-) create mode 100755 FullPipeline.sh create mode 100644 cmake/FindHICMA-X.cmake rename cmake/{FindHWLOC.cmake => FindHwloc.cmake} (96%) create mode 100644 cmake/FindNetCDF.cmake create mode 100644 cmake/FindPnetCDF.cmake create mode 100644 cmake/ImportHDF5.cmake create mode 100644 cmake/ImportHiCMAX.cmake create mode 100644 cmake/ImportNetCDF.cmake create mode 100644 cmake/ImportNlohmannJSON.cmake create mode 100644 cmake/ImportPnetCDF.cmake create mode 100644 configurations/config.json create mode 100644 examples/climate-emulator/CMakeLists.txt create mode 100644 examples/climate-emulator/ClimateEmulator.cpp create mode 100644 examples/mean-trend-removal/CMakeLists.txt create mode 100644 examples/mean-trend-removal/MeanTrendRemoval.cpp create mode 100644 inst/include/configurations/Parser.hpp create mode 100644 inst/include/configurations/Validator.hpp create mode 100644 inst/include/data-analyzer/DataAnalyzer.hpp create mode 100644 inst/include/data-generators/concrete/MeanTrendRemovalGenerator.hpp create mode 100644 inst/include/data-generators/concrete/MeanTrendRemovalGeneratorParsec.hpp create mode 100644 inst/include/data-generators/concrete/runtime/ParsecGenerator.hpp create mode 100644 inst/include/data-generators/concrete/runtime/StarpuGenerator.hpp create mode 100644 inst/include/data-loader/concrete/ParsecLoader.hpp create mode 100644 inst/include/data-transformer/DataTransformer.hpp create mode 100644 inst/include/data-units/descriptor/concrete/ParsecDescriptor.hpp create mode 100644 inst/include/kernels/concrete/TrendModel.hpp create mode 100644 inst/include/runtime-solver/RuntimeSolverFactory.hpp create mode 100644 inst/include/runtime-solver/RuntimeSolverMethods.hpp create mode 100644 inst/include/runtime-solver/concrete/ParsecRuntimeSolver.hpp create mode 100644 inst/include/runtime-solver/concrete/StarpuRuntimeSolver.hpp create mode 100644 inst/include/runtime/parsec/JDFHelperFunctions.h create mode 100644 inst/include/runtime/parsec/ParsecHeader.h create mode 100644 inst/include/runtime/parsec/jdf/JobDescriptionFormat.h create mode 100644 src/configurations/Parser.cpp create mode 100644 src/configurations/Validator.cpp create mode 100644 src/data-analyzer/CMakeLists.txt create mode 100644 src/data-analyzer/DataAnalyzer.cpp create mode 100644 src/data-generators/concrete/MeanTrendRemovalGenerator.cpp create mode 100644 src/data-generators/concrete/MeanTrendRemovalGeneratorParsec.cpp create mode 100644 src/data-generators/concrete/runtime/ParsecGenerator.cpp create mode 100644 src/data-generators/concrete/runtime/StarpuGenerator.cpp create mode 100644 src/data-loader/concrete/ParsecLoader.cpp create mode 100644 src/data-transformer/CMakeLists.txt create mode 100644 src/data-transformer/DataTransformer.cpp create mode 100644 src/data-units/descriptor/concrete/ParsecDescriptor.cpp create mode 100644 src/kernels/concrete/TrendModel.cpp create mode 100644 src/runtime-solver/CMakeLists.txt create mode 100644 src/runtime-solver/RuntimeSolverFactory.cpp create mode 100644 src/runtime-solver/concrete/CMakeLists.txt create mode 100644 src/runtime-solver/concrete/ParsecRuntimeSolver.cpp create mode 100644 src/runtime-solver/concrete/StarpuRuntimeSolver.cpp create mode 100644 src/runtime/parsec/JDFHelperFunctions.c create mode 100644 src/runtime/parsec/jdf/CMakeLists.txt create mode 100644 src/runtime/parsec/jdf/DMatrixDet.jdf create mode 100644 src/runtime/parsec/jdf/DMatrixGeneration.jdf create mode 100644 src/runtime/parsec/jdf/DMatrixSetDiagonal.jdf create mode 100644 src/runtime/parsec/jdf/DMatrixSum.jdf create mode 100644 src/runtime/parsec/jdf/DZGeneration.jdf create mode 100644 src/runtime/parsec/jdf/DZSum.jdf create mode 100644 src/runtime/parsec/jdf/DifferenceDouble.jdf create mode 100644 src/runtime/parsec/jdf/ForwardSHT.jdf create mode 100644 src/runtime/parsec/jdf/ForwardSHTReshape.jdf create mode 100644 src/runtime/parsec/jdf/GetMatrixNorm.jdf create mode 100644 src/runtime/parsec/jdf/InverseSHT.jdf create mode 100644 src/runtime/parsec/jdf/MatrixCompress.jdf create mode 100644 src/runtime/parsec/jdf/MeanSquaredError.jdf create mode 100644 src/runtime/parsec/jdf/ReadCSV.jdf create mode 100644 src/runtime/parsec/jdf/ReadCSVComplex.jdf create mode 100644 src/runtime/parsec/jdf/ReadCSVTimeSlot.jdf create mode 100644 src/runtime/parsec/jdf/ReadCSVToComplex.jdf create mode 100644 src/runtime/parsec/jdf/ReadCSVToComplexTimeSlot.jdf diff --git a/CMakeLists.txt b/CMakeLists.txt index 33cd5e58..366ae6e7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,24 +18,42 @@ cmake_minimum_required(VERSION 3.20 FATAL_ERROR) cmake_policy(SET CMP0048 NEW) # Set project options -option(USE_CUDA "Use Cuda, if available" false) -option(USE_MPI "Use MPI, if available" false) +option(USE_CUDA "Use CUDA, if available" OFF) +option(USE_MPI "Use MPI, if available" OFF) option(BUILD_TESTS "Option to enable building tests" OFF) option(BUILD_HEAVY_TESTS "Option to enable building heavy tests, This may take a lot of time" OFF) option(BUILD_EXAMPLES "Option to enable building examples" ON) option(BUILD_DOCS "Build documentation in docs directory" ON) option(USE_R "Enable the use of R and Rcpp in the project" OFF) option(CREATE_PACKAGE "Enable a packaging system for distribution" OFF) +option(USE_CLIMATE_EMULATOR "Enable climate emulator examples and NetCDF support" OFF) +# Declare the RUNTIME_TYPE variable with a default value +set(RUNTIME_TYPE "starpu" CACHE STRING "Specify the runtime type (e.g., starpu or parsec)") # Cmake Module Paths set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH}") - if (${BUILD_SHARED_LIBS}) set(BLA_STATIC OFF) else () set(BLA_STATIC ON) endif () +# Project Name and Version +project(ExaGeoStatCPP VERSION 2.0.0 DESCRIPTION "ExaGeoStatCPP is a parallel high performance unified framework for geostatistics on manycore systems.") +set(CMAKE_CXX_EXTENSIONS OFF) +string(TOUPPER ${RUNTIME_TYPE} RUNTIME_TYPE) + +# Default path for default configuration json file +add_definitions( + -DDEFAULT_CONFIGURATION_PATH="${PROJECT_SOURCE_DIR}/configurations/config.json" +) + +if(RUNTIME_TYPE STREQUAL "PARSEC") + message(STATUS "MPI is required to be enabled in order to use PaRSEC") + set(USE_MPI ON) + set(USE_HICMA OFF) +endif() + # Select toolchain based on whether CUDA is enabled or not if (USE_CUDA) message("") @@ -60,9 +78,6 @@ else () include(toolchains/GccToolchain) endif () -# Project Name and Version -project(ExaGeoStatCPP VERSION 1.0.0 DESCRIPTION "ExaGeoStatCPP is a parallel high performance unified framework for geostatistics on manycore systems.") - # Show the current version of CMake. message(STATUS "CMAKE VERSION: ${CMAKE_VERSION}") # Enable C++ language @@ -122,30 +137,56 @@ include(ImportHwloc) list(APPEND STARPU_COMPONENT_LIST "HWLOC") string(REPLACE ";" " " STARPU_COMPONENT_STRING "${STARPU_COMPONENT_LIST}") -# ExaGeoStatCPP depends on StarPU runtime -# ------------------------------- -include(ImportStarPu) - -# ExaGeoStatCPP depends on GSL +# ExaGeoStatCPP depends on NLOHMANN # ------------------------------- -include(ImportGSL) +include(ImportNlohmannJSON) # ExaGeoStatCPP depends on NLOPT # ------------------------------- include(ImportNLOPT) -# ExaGeoStatCPP depends on HiCMA +# ExaGeoStatCPP depends on GSL # ------------------------------- -if (USE_HICMA) - add_definitions(-DUSE_HICMA=TRUE) - include(ImportHCore) - include(ImportStarsH) - include(ImportHiCMA) -endif () +include(ImportGSL) -# ExaGeoStatCPP depends on Chameleon -# ------------------------------- -include(ImportChameleon) +# NetCDF is only needed for climate emulator +if (USE_CLIMATE_EMULATOR) + message(STATUS "Climate Emulator enabled: including NetCDF support") + include(ImportNetCDF) + add_definitions(-DUSE_NETCDF=TRUE) + add_definitions(-DUSE_CLIMATE_EMULATOR=TRUE) +endif() + +message("---------------------------------------- ${RUNTIME_TYPE}") +if(RUNTIME_TYPE STREQUAL "STARPU") + message(STATUS "Using StarPU as the runtime") + # ExaGeoStatCPP depends on StarPU runtime + # ------------------------------- + include(ImportStarPu) + + # ExaGeoStatCPP depends on HiCMA + # ------------------------------- + if (USE_HICMA) + add_definitions(-DUSE_HICMA=TRUE) + include(ImportHCore) + include(ImportStarsH) + include(ImportHiCMA) + endif () + # ExaGeoStatCPP depends on Chameleon + # ------------------------------- + include(ImportChameleon) + +elseif(RUNTIME_TYPE STREQUAL "PARSEC") + message(STATUS "Using PaRSEC as the runtime") + + # ExaGeoStatCPP depends on HiCMA-X for PaRSEC + # ------------------------------- + include(ImportStarsH) + include(ImportHCore) + include(ImportHiCMAX) +else() + message(FATAL_ERROR "Unknown RUNTIME_TYPE: ${RUNTIME_TYPE}. Supported values are 'STARPU' or 'PARSEC'.") +endif() # ExaGeoStatCPP depends on LAPACK/BLASPP # ------------------------------- @@ -180,10 +221,16 @@ if (USE_R) endif () endif () - # Add src Directory to expose added libraries add_subdirectory(src) +# Define USE_STARPU or USE_RUNTIME based on the selected runtime +if(RUNTIME_TYPE STREQUAL "STARPU") + target_compile_definitions(${PROJECT_NAME} PUBLIC DEFAULT_RUNTIME=1) +elseif(RUNTIME_TYPE STREQUAL "PARSEC") + target_compile_definitions(${PROJECT_NAME} PUBLIC DEFAULT_RUNTIME=0) +endif() + # Creates a new INTERFACE library target named ${PROJECT_NAME}_INTERFACE. # The INTERFACE keyword specifies that this library will not be built, but instead will only be used for its properties. add_library(${PROJECT_NAME}_INTERFACE INTERFACE) @@ -225,15 +272,26 @@ endif () message(" \n \t ** Configurations of ExaGeoStatCPP and installation of dependence is done successfully ** ") message("\t - Export the following line to avoid re-install dependencies each time. -") message("\t ----------------------------------------------------------------------------------------------------------------------------------- ") -message("\t export PKG_CONFIG_PATH=${CMAKE_INSTALL_PREFIX}/CHAMELEON/lib/pkgconfig:$PKG_CONFIG_PATH") -message("\t export PKG_CONFIG_PATH=${CMAKE_INSTALL_PREFIX}/STARPU/lib/pkgconfig:$PKG_CONFIG_PATH") +message("\t export PKG_CONFIG_PATH=${CMAKE_INSTALL_PREFIX}/NLOHMANN_JSON/share/pkgconfig:$PKG_CONFIG_PATH") message("\t export PKG_CONFIG_PATH=${CMAKE_INSTALL_PREFIX}/HWLOC/lib/pkgconfig:$PKG_CONFIG_PATH") -message("\t export PKG_CONFIG_PATH=${CMAKE_INSTALL_PREFIX}/GSL/lib/pkgconfig:$PKG_CONFIG_PATH") message("\t export PKG_CONFIG_PATH=${CMAKE_INSTALL_PREFIX}/NLOPT/lib/pkgconfig:${CMAKE_INSTALL_PREFIX}/NLOPT/lib64/pkgconfig:$PKG_CONFIG_PATH") -if(USE_HICMA) +message("\t export PKG_CONFIG_PATH=${CMAKE_INSTALL_PREFIX}/GSL/lib/pkgconfig:$PKG_CONFIG_PATH") +if(RUNTIME_TYPE STREQUAL "STARPU") + message("\t export PKG_CONFIG_PATH=${CMAKE_INSTALL_PREFIX}/STARPU/lib/pkgconfig:$PKG_CONFIG_PATH") + message("\t export PKG_CONFIG_PATH=${CMAKE_INSTALL_PREFIX}/CHAMELEON/lib/pkgconfig:$PKG_CONFIG_PATH") + if(USE_HICMA) + message("\t export PKG_CONFIG_PATH=${CMAKE_INSTALL_PREFIX}/STARSH/lib/pkgconfig:$PKG_CONFIG_PATH") + message("\t export PKG_CONFIG_PATH=${CMAKE_INSTALL_PREFIX}/HCORE/lib/pkgconfig:$PKG_CONFIG_PATH") + message("\t export PKG_CONFIG_PATH=${CMAKE_INSTALL_PREFIX}/HICMA/lib/pkgconfig:$PKG_CONFIG_PATH") + endif() +elseif(RUNTIME_TYPE STREQUAL "PARSEC") message("\t export PKG_CONFIG_PATH=${CMAKE_INSTALL_PREFIX}/STARSH/lib/pkgconfig:$PKG_CONFIG_PATH") message("\t export PKG_CONFIG_PATH=${CMAKE_INSTALL_PREFIX}/HCORE/lib/pkgconfig:$PKG_CONFIG_PATH") - message("\t export PKG_CONFIG_PATH=${CMAKE_INSTALL_PREFIX}/HICMA/lib/pkgconfig:$PKG_CONFIG_PATH") + message("\t export PKG_CONFIG_PATH=${CMAKE_INSTALL_PREFIX}/HICMA-X/lib/pkgconfig:${CMAKE_INSTALL_PREFIX}/HICMA-X/lib64/pkgconfig:${CMAKE_INSTALL_PREFIX}/HICMA-X/lib64:$PKG_CONFIG_PATH") +endif() +if(USE_CLIMATE_EMULATOR) + message("\t export PKG_CONFIG_PATH=${CMAKE_INSTALL_PREFIX}/NETCDF/lib/pkgconfig:$PKG_CONFIG_PATH") + message("\t export PKG_CONFIG_PATH=${CMAKE_INSTALL_PREFIX}/PNETCDF/lib/pkgconfig:$PKG_CONFIG_PATH") endif() message("\t ----------------------------------------------------------------------------------------------------------------------------------- \n") diff --git a/FullPipeline.sh b/FullPipeline.sh new file mode 100755 index 00000000..9dcfaefb --- /dev/null +++ b/FullPipeline.sh @@ -0,0 +1,462 @@ +#!/bin/bash +################################################################################ +# Copyright (c) 2017-2025 King Abdullah University of Science and Technology, +# All rights reserved. +# ExaGeoStat is a software package, provided by King Abdullah University of Science and Technology (KAUST). +# +# @file FullPipeline.sh +# @brief Synchronized Mean Trend Removal Processing - Processes each latitude band +# independently but writes to SHARED output files and runs the Climate Emulator. +# @version 2.0.0 +# @author Ali Hakam +# @author Mahmoud ElKarargy +# @author Sameh Abdulah +# @date 2025-11-12 +################################################################################ + +# Color codes for terminal output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[0;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +#============================================================================== +# CONFIGURATION - Edit these values for your setup OR override via command line +#============================================================================== + +# Default values (can be overridden by command-line arguments) +# Mean Trend Removal Configuration +total_latitudes=72 +lon=144 +startyear=2000 +endyear=2002 +data_path="/path/to/ERA_data/" +forcing_data_path="/path/to/forcing_new.csv" +resultspath="/path/to/results/" + +# Pipeline Configuration +MeanTrendRemoval_BIN="./bin/examples/mean-trend-removal/Example_Mean_Trend_Removal" +mpi_processes=2 +parallel_jobs=10 + +# Climate Emulator Configuration +run_climate_emulator=false +EMULATOR_BIN="./bin/examples/climate-emulator/Example_Climate_Emulator" +N=5184 +dts=72 +timeslot=100 +ObjectsNumber=72 +add_diagonal=10 +Accuracy=0 +band_dense=1000 +hnb=300 +verbose="detailed" +gpus=0 + +# Parse command-line arguments to override defaults +while [[ $# -gt 0 ]]; do + case $1 in + --lats=*) + total_latitudes="${1#*=}" + shift + ;; + --lon=*) + lon="${1#*=}" + shift + ;; + --startyear=*) + startyear="${1#*=}" + shift + ;; + --endyear=*) + endyear="${1#*=}" + shift + ;; + --data-path=*) + data_path="${1#*=}" + shift + ;; + --forcing-data-path=*) + forcing_data_path="${1#*=}" + shift + ;; + --resultspath=*) + resultspath="${1#*=}" + shift + ;; + --mpi-processes=*) + mpi_processes="${1#*=}" + shift + ;; + --parallel-jobs=*) + parallel_jobs="${1#*=}" + shift + ;; + --cores=*) + cores="${1#*=}" + shift + ;; + --run-climate-emulator) + run_climate_emulator=true + shift + ;; + --N=*) + N="${1#*=}" + shift + ;; + --dts=*) + dts="${1#*=}" + shift + ;; + --timeslot=*) + timeslot="${1#*=}" + shift + ;; + --ObjectsNumber=*) + ObjectsNumber="${1#*=}" + shift + ;; + --cores=*) + cores="${1#*=}" + shift + ;; + --add-diagonal=*) + add_diagonal="${1#*=}" + shift + ;; + --Accuracy=*) + Accuracy="${1#*=}" + shift + ;; + --band-dense=*) + band_dense="${1#*=}" + shift + ;; + --hnb=*) + hnb="${1#*=}" + shift + ;; + --verbose=*) + verbose="${1#*=}" + shift + ;; + --gpus=*) + gpus="${1#*=}" + shift + ;; + --help|-h) + echo "Usage: $0 [OPTIONS]" + echo "" + echo -e "${BLUE}===== REQUIRED Mean Trend Removal Options =====${NC}" + echo " --lats=N Number of latitude bands to process" + echo " --lon=N Number of longitudes per latitude" + echo " --startyear=YYYY Starting year for data processing" + echo " --endyear=YYYY Ending year for data processing" + echo " --data-path=PATH Path to NetCDF data directory" + echo " --forcing-data-path=PATH Path to forcing data file" + echo " --resultspath=PATH Output directory path" + echo "" + echo -e "${BLUE}===== OPTIONAL Pipeline Options =====${NC}" + echo " --mpi-processes=N MPI processes per job (default: $mpi_processes)" + echo " --parallel-jobs=N Number of parallel jobs (default: $parallel_jobs)" + echo " --cores=N Cores for Mean Trend Removal and Emulator (default: auto-calculated)" + echo "" + echo -e "${BLUE}===== Climate Emulator Options =====${NC}" + echo " --run-climate-emulator Run climate emulator after Mean Trend Removal" + echo " --N=N Spatial problem size (default: $N)" + echo " --dts=N Dense tile size (default: $dts)" + echo " --timeslot=N Number of z files to process (default: $timeslot)" + echo " --ObjectsNumber=N Objects number (default: $ObjectsNumber)" + echo " --add-diagonal=N Diagonal value (default: $add_diagonal)" + echo " --Accuracy=N Accuracy (default: $Accuracy)" + echo " --band-dense=N Band dense DP (default: $band_dense)" + echo " --hnb=N HNB (default: $hnb)" + echo " --verbose=MODE Verbose mode (default: $verbose)" + echo " --gpus=N Number of GPUs (default: $gpus)" + echo "" + echo -e "${BLUE}===== Parameter Relationships =====${NC}" + echo "Mean Trend Removal Output:" + echo " - Creates: lats × lon spatial locations" + echo " - Generates: 365 × 24 × (endyear-startyear+1) z_*.csv files" + echo " - Each z file contains one timeslot for all spatial locations" + echo " - Processing time scales with: locations × years × optimization_iterations" + echo "" + echo "Climate Emulator Constraints:" + echo " - N should be equal to dts² (e.g., N=5184 requires dts=72)" + echo " - N should be ≤ (lats × lon) from Mean Trend Removal output" + echo " - timeslot: number of z files to read (max = Mean Trend Removal output count)" + echo "" + echo -e "${BLUE}===== Examples =====${NC}" + echo " 1. Mean Trend Removal only (3 years of data):" + echo " $0 --lats=72 --lon=144 --startyear=2020 --endyear=2022 \\" + echo " --data-path=/path/to/ERA_data/ --forcing-data-path=/path/to/forcing.csv \\" + echo " --resultspath=/path/to/results/ --parallel-jobs=10 --cores=4" + echo "" + echo " 2. Full Pipeline (Mean Trend Removal + Climate Emulator):" + echo " $0 --lats=72 --lon=144 --startyear=2020 --endyear=2022 \\" + echo " --data-path=/path/to/ERA_data/ --forcing-data-path=/path/to/forcing.csv \\" + echo " --resultspath=/path/to/results/ --parallel-jobs=10 --cores=4 \\" + echo " --run-climate-emulator --N=5184 --dts=72 --timeslot=3000" + echo "" + exit 0 + ;; + *) + echo "Unknown option: $1" + echo "Use --help for usage information" + exit 1 + ;; + esac +done + +# Calculate optimal cores per job to avoid oversubscription (if not manually set) +cpu_cores=$(nproc) +if [[ -z "$cores" ]]; then + cores=$((cpu_cores / parallel_jobs)) + + # Ensure at least 1 core per job, but not more than total cores + if [ $cores -lt 1 ]; then + cores=1 + elif [ $cores -gt $cpu_cores ]; then + cores=$cpu_cores + fi +fi + +#============================================================================== +# YOU USUALLY DON'T NEED TO EDIT BELOW THIS LINE +#============================================================================== + +echo "" +echo -e "${BLUE}==========================================" +echo -e " MeanTrendRemoval Pipeline" +echo -e "==========================================${NC}" +echo "" +echo "Configuration:" +echo " Years: ${startyear}-${endyear} ($((endyear - startyear + 1)) years)" +echo " Grid: ${total_latitudes} latitudes × ${lon} longitudes" +echo " Data path: ${data_path}" +echo " Forcing: ${forcing_data_path}" +echo " Results: ${resultspath}" +echo " Binary: ${MeanTrendRemoval_BIN}" +echo "" +echo "Parallelization:" +echo " System cores: ${cpu_cores}" +echo " Parallel jobs: ${parallel_jobs} (1 latitude per job)" +echo " MPI ranks/job: ${mpi_processes}" +echo " Cores/job: ${cores}" +echo "" +years=$((endyear - startyear + 1)) +time_slots=$((365 * 24 * years)) +echo "Expected output: ${time_slots} timeslot files (z_*.csv) + 1 params.csv" +echo "==========================================" +echo "" + +# Check for Climate Emulator auxiliary files if emulator is enabled +if [ "$run_climate_emulator" = true ]; then + echo -e "${RED}⚠ Climate Emulator Check:" + echo " The Climate Emulator requires pre-computed auxiliary files in the results directory." + echo " Required files (example for dts=720): 720_Et1.csv, 720_Et2.csv, 720_Ep.csv, etc." + echo -e " Please copy auxiliary files to the results directory before running.${NC}" + echo "" +fi + +# Create shared output directory +mkdir -p "${resultspath}" + +# Clear existing output files for clean start (optional - comment out if you want to append to existing) +echo "Clearing existing output files for clean start..." +rm -f "${resultspath}"/z_*.csv +rm -f "${resultspath}"/params.csv +rm -f "${resultspath}"/lat_*_output.log +rm -f "${resultspath}"/climate_emulator.log +echo "✓ Output files and logs cleared" +echo "Files will be created on-demand by the C++ processes" +echo "" + +# Create a lock directory for coordination +lock_dir="${resultspath}/.locks" +rm -rf "${lock_dir}" +mkdir -p "${lock_dir}" + +# Counter for active background jobs +active_jobs=0 + +# Process each latitude +for lat in $(seq 0 $((total_latitudes - 1))); do + + echo "[$(date +%H:%M:%S)] Starting latitude ${lat}..." + + # Run this latitude in background + ( + mpirun -n ${mpi_processes} ${MeanTrendRemoval_BIN} \ + --kernel=trend_model \ + --lon=${lon} \ + --lat=${lat} \ + --dts="$dts" \ + --startyear=${startyear} \ + --endyear=${endyear} \ + --data-path=${data_path} \ + --forcing-data-path=${forcing_data_path} \ + --resultspath=${resultspath} \ + --starting-theta=0.9 \ + --lb=0.001 \ + --ub=0.95 \ + --tolerance=7 \ + --max-mle-iterations=30 \ + --mean-trend-removal \ + --log \ + --cores=${cores} \ + --gpus=0 \ + --p=1 \ + --q=1 \ + > "${resultspath}/lat_${lat}_output.log" 2>&1 + + if [ $? -eq 0 ]; then + echo -e "[$(date +%H:%M:%S)] ${GREEN}✓ Latitude ${lat} complete${NC}" + touch "${lock_dir}/lat_${lat}.done" + else + echo -e "[$(date +%H:%M:%S)] ${RED}✗ Latitude ${lat} FAILED${NC}" + touch "${lock_dir}/lat_${lat}.failed" + fi + ) & + + # Increase counter + ((active_jobs++)) + + # If we've reached the limit, wait for one to finish + if [ ${active_jobs} -ge ${parallel_jobs} ]; then + wait -n # Wait for any one job to finish + ((active_jobs--)) + fi +done + +# Wait for all remaining jobs to finish +echo "" +echo "[$(date +%H:%M:%S)] Waiting for remaining jobs to complete..." +wait + +echo "" +echo -e "${BLUE}==========================================" +echo -e " Mean Trend Removal Processing Complete" +echo -e "==========================================${NC}" + +# Show summary +completed=$(find "${lock_dir}" -name "*.done" | wc -l) +failed=$(find "${lock_dir}" -name "*.failed" | wc -l) + +echo "" +echo "Job Summary:" +echo " ✓ Completed: ${completed}/${total_latitudes} latitudes" +if [ ${failed} -gt 0 ]; then + echo -e " ${RED}✗ Failed: ${failed} latitude(s)${NC}" +fi + +# Check output file sizes +echo "" +echo "Output Verification:" +if [ -f "${resultspath}/params.csv" ]; then + param_lines=$(wc -l < "${resultspath}/params.csv") + expected_param_lines=$((total_latitudes * lon)) + if [ ${param_lines} -eq ${expected_param_lines} ]; then + echo " ✓ params.csv: ${param_lines}/${expected_param_lines} lines" + else + echo -e " ${RED}⚠ params.csv: ${param_lines}/${expected_param_lines} lines (MISMATCH)${NC}" + fi +else + echo -e " ${RED}✗ params.csv: FILE NOT FOUND${NC}" +fi + +z_files=$(ls "${resultspath}"/z_*.csv 2>/dev/null | wc -l) +expected_z_lines=$((total_latitudes * lon)) +if [ ${z_files} -gt 0 ]; then + first_z_file=$(ls "${resultspath}"/z_*.csv | head -1) + z_lines=$(wc -l < "${first_z_file}") + if [ ${z_lines} -eq ${expected_z_lines} ]; then + echo " ✓ Z files: ${z_files} files (${z_lines}/${expected_z_lines} lines each)" + else + echo -e " ${RED}⚠ Z files: ${z_files} files (${z_lines}/${expected_z_lines} lines each - MISMATCH)${NC}" + fi +else + echo -e " ${RED}✗ Z files: NO FILES FOUND${NC}" +fi + +echo "" +echo "Results location: ${resultspath}" + +if [ ${completed} -lt ${total_latitudes} ]; then + echo "" + echo -e "${RED}⚠ Failed Jobs - Check Logs:" + for lat in $(seq 0 $((total_latitudes - 1))); do + if [ -f "${lock_dir}/lat_${lat}.failed" ]; then + echo " - Latitude ${lat}: ${resultspath}/lat_${lat}_output.log" + fi + done + echo -e "==========================================${NC}" + echo "" + exit 1 +fi + +echo "==========================================" +echo "" + +# Run Climate Emulator if requested +if [ "$run_climate_emulator" = true ]; then + echo "" + echo -e "${BLUE}==========================================" + echo -e " Climate Emulator" + echo -e "==========================================${NC}" + echo "" + + if [ ! -f "$EMULATOR_BIN" ]; then + echo -e "${RED}ERROR: Climate Emulator binary not found: $EMULATOR_BIN${NC}" + exit 1 + fi + + emulator_log="${resultspath}/climate_emulator.log" + + echo "Configuration:" + echo " Binary: $EMULATOR_BIN" + echo " Problem size: $N" + echo " Tile size: $dts" + echo " Timeslots: $timeslot" + echo " Objects: $ObjectsNumber" + echo " Cores: $cores" + echo " Input data: $resultspath" + echo " Log file: $emulator_log" + echo "" + + echo "Running Climate Emulator (output logged to $emulator_log)..." + + "$EMULATOR_BIN" \ + --N="$N" \ + --dts="$dts" \ + --timeslot="$timeslot" \ + --ObjectsNumber="$ObjectsNumber" \ + --cores="$cores" \ + --add-diagonal="$add_diagonal" \ + --Accuracy="$Accuracy" \ + --banddensedp="$band_dense" \ + --hnb="$hnb" \ + --verbose="$verbose" \ + --gpus="$gpus" \ + --data_path="$resultspath" \ + > "${emulator_log}" 2>&1 + + EMULATOR_EXIT=$? + + echo "" + if [ $EMULATOR_EXIT -eq 0 ]; then + echo "Climate Emulator finished." + echo " Check log: $emulator_log" + echo "==========================================" + echo "" + echo -e "${RED}✗ Climate Emulator failed with exit code: $EMULATOR_EXIT${NC}" + echo " Check log: $emulator_log" + echo "==========================================" + echo "" + exit $EMULATOR_EXIT + fi +else + echo "✓ Pipeline complete!" + echo "" +fi diff --git a/README.md b/README.md index 519af79a..d858a12b 100644 --- a/README.md +++ b/README.md @@ -72,20 +72,28 @@ To build and run this software, you will need: ### C++ source code installation To install the `ExaGeoStatCPP` project locally (C++ version), run the following commands in your terminal: -1. Clone the project from the remote gitHub repository into your local machine using the following command +1. Clone the project: ```bash git clone https://github.com/ecrc/ExaGeoStatCPP.git ``` -2. Change your current directory by getting into the `ExaGeoStatCPP` project directory +2. Navigate to the cloned directory: ```bash cd ExaGeoStatCPP ``` -3. Run `configure` script (use the `-h` flag for help, to know the supported options and their corresponding flags). This step is **not required** when using R. +3. Run `configure` script (use the `-h` flag for help, to know the supported options and their corresponding flags). This step is **not required** when using R. + + **Basic configuration:** ```bash ./configure -e ``` + + **To enable the Global Climate Emulator:** + ```bash + ./configure -e --climate-emulator + ``` + Note: If using StarPU (default), only Mean-Trend-Removal will be built. For full Climate-Emulator, add `--use-parsec`. 4. Run `clean_build.sh` (use the `-h` flag for help, to know the needed arguments to run with your specific options). This step is **not required** when using R. ```bash @@ -96,6 +104,7 @@ To install the `ExaGeoStatCPP` project locally (C++ version), run the following ```bash export PKG_CONFIG_PATH=$PWD/installdir/_deps/DEPENDENCY_NAME/lib/pkgconfig:$PKG_CONFIG_PATH ``` + or copy/paste the output pkg-config paths from the configure step Now, you can use the pkg-config executable to collect compiler and linker flags for ExaGeoStatCPP. @@ -237,7 +246,8 @@ predict_data( This example walks through initializing hardware, simulating spatial data, estimating model parameters, and making predictions using **ExaGeoStatCPP** in R. -> Please take a look at the end-to-end examples as a reference for using all the operations. +> **Note:** Please take a look at the end-to-end examples in the `examples/` directory as a reference for using all the operations. + ## Contributing Find detailed information on how to contribute to ExaGeoStatCPP [here](CONTRIBUTING.md) diff --git a/USER_MANUAL.md b/USER_MANUAL.md index 6b95b532..09574e0f 100644 --- a/USER_MANUAL.md +++ b/USER_MANUAL.md @@ -8,11 +8,12 @@ 4. [Arguments](#arguments) 5. [List of Descriptors](#list-of-descriptors) 6. [Supported operations](#supported-operations) -7. [Manuals](#Manuals) -8. [Contributing](#contributing) +7. [Global Climate Emulator](#climate-data-processing) +8. [Manuals](#Manuals) +9. [Contributing](#contributing) ## ExaGeoStatCPP -> Current Version of ExaGeoStatCPP: 1.1.0 +> Current Version of ExaGeoStatCPP: 2.0.0 ### Supported Operations: 1. (Data Generation): Generating large geospatial synthetic datasets using dense, Diagonal Super-Tile (DST) and Tile Low-Rank (TLR) approximation techniques. 2. (Data Modeling): Modeling large geospatial datasets on dense, DST and TLR approximation techniques through the Maximum likelihood Estimation (MLE) operation. @@ -80,6 +81,8 @@ * To enable packaging system for distribution, add `-p` disabled by default. * To enable showing code warnings, add `-w` disabled by default. * To manually set mkl as blas vendor, add `--use-mkl`. MKL is required as blas vendor and it's automatically detected but in some environments it need to be manually set. +* To enable PaRSEC as a runtime system, add `--use-parsec`, StarPU is enabled by default. +* To enable climate emulator examples (Mean Trend Removal + Climate Emulator), add `--climate-emulator` disabled by default. **Note:** Climate Emulator requires `--use-parsec`. Mean Trend Removal works with both StarPU and PaRSEC. ## Building @@ -98,7 +101,10 @@ ## Arguments -These are the arguments that you can specify when running any C++ example. +These are the arguments that you can specify when running any C++ example. +**Please note that the arguments are not case-sensitive**, and you can use variations such as `-`, `_`, or capitalized forms for the same argument name. +For example, `MaxRank`, `max-rank`, `max_rank`, `Max_Rank` ,`Maxrank` , `MaxrAnk` and `Max-Rank` are all considered equivalent. + * {Mandatory} To set the problem size (N) --N= @@ -152,13 +158,13 @@ These are the arguments that you can specify when running any C++ example. --oub= * {Optional} To set the initial theta - --itheta= + --initial_theta= * {Optional} To set the target theta --ttheta= * {Optional} To set the estimated theta - --etheta= + --estimated_theta= * {Optional} To set the seed value, the default is 0 --seed= @@ -181,6 +187,102 @@ These are the arguments that you can specify when running any C++ example. --log +### Mean Trend Removal and Climate Processing Arguments + +* {Mandatory for Mean Trend Removal} To set the number of longitude points + + --lon= + +* {Mandatory for Mean Trend Removal} To set the latitude band index + + --lat= + +* {Mandatory for Mean Trend Removal} To set the starting year for data processing + + --startyear= + +* {Mandatory for Mean Trend Removal} To set the ending year for data processing + + --endyear= + +* {Mandatory for Mean Trend Removal} To set the path to forcing data file + + --forcing-data-path= + +* {Optional} To set the results/output directory path + + --resultspath= + +* {Optional} To set the starting theta value for MLE, default is 0.9 + + --starting-theta= + +* {Optional} To set the lower bound for optimization, default is 0.001 + + --lb= + +* {Optional} To set the upper bound for optimization, default is 0.95 + + --ub= + +* {Optional} To set the optimization tolerance, default is 7 + + --tolerance= + +* {Optional} To set the maximum MLE iterations, default is 30 + + --max-mle-iterations= + +* {Mandatory for Mean Trend Removal} To enable Mean Trend Removal mode + + --mean-trend-removal + +* {Mandatory for Climate Emulator} To set the number of objects + + --ObjectsNumber= + +* {Mandatory for Climate Emulator} To set the number of time points to process (z_*.csv files) + + --timeslot= + +* {Optional} To set the diagonal addition value for regularization, default is 0 + + --add-diagonal= + +* {Optional} To set the accuracy threshold for low-rank approximation (0 = full rank), default is 0 + + --Accuracy= + +* {Optional} To set the band size for dense computations (double precision), default is 0 + + --banddensedp= + +* {Optional} To set the HNB parameter for matrix operations, default is 0 + + --hnb= + +* {Optional} To set the band size for dense operations (used in pipeline), default is 1000 + + --band-dense= + +### Full Pipeline Arguments + +* {Mandatory for Pipeline} To set the total number of latitude bands to process + + --lats= + +* {Optional} To set the number of MPI processes per job, default is 2 + + --mpi-processes= + +* {Optional} To set the number of parallel jobs, default is 10 + + --parallel-jobs= + +* {Optional} To enable Climate Emulator after Mean Trend Removal + + --run-climate-emulator + ## List of Descriptors ### Covariance Matrix Descriptors 1. DESCRIPTOR_C: Covariance matrix C descriptor @@ -223,10 +325,12 @@ These are the arguments that you can specify when running any C++ example. ### Provide Arguments To use any operations, you must initially supply the necessary arguments -to the operation via the Configurations module. There are two methods available +to the operation via the Configurations module. +This program is configured by default through a json file of default values. You can either change the configuration arguments +in the json file or provide them through command line. There are two methods available for setting your arguments: -1. Provide your arguments with the command line. +1. Provide your arguments with the command line, this overwrites the json configuration. ```c++ // Create a new configuration object. Configurations configurations; @@ -436,6 +540,141 @@ ExaGeoStat::ExaGeoStatPrediction(configurations, data, z_matrix); idw_error = idw(train_data=list(locations_x, locations_y, z_value), test_data=list(test_x, test_y), kernel=kernel, dts=dts, estimated_theta=estimated_theta, test_measurements=test_measurements) ``` +## Global Climate Emulator + +ExaGeoStatCPP provides specialized tools for climate data analysis through two main components: + +### Mean Trend Removal - Data Preprocessing + +**Purpose:** Removes mean trends from climate time series data and produces normalized residuals for further analysis. + +**Runtime:** Works with both StarPU and PaRSEC. + +**Configuration:** +```bash +# With StarPU (default) +./configure -e --climate-emulator + +# With PaRSEC +./configure -e --climate-emulator --use-parsec +``` + +**Basic Usage:** +```bash +mpirun -n 2 ./bin/examples/mean-trend-removal/Example_Mean_Trend_Removal \ + --kernel=trend_model \ + --lon=144 --lat=0 --dts=720 \ + --startyear=2020 --endyear=2020 \ + --data-path=/path/to/ERA_data/ \ + --forcing-data-path=/path/to/forcing_new.csv \ + --resultspath=/path/to/results/ \ + --starting-theta=0.9 \ + --lb=0.001 \ + --ub=0.95 \ + --tolerance=7 \ + --max-mle-iterations=30 \ + --mean-trend-removal \ + --cores=4 \ + --gpus=0 \ + --p=1 \ + --q=1 +``` + +**Outputs:** +- `z_*.csv` files: Normalized residuals (one file per time point) +- `params.csv`: Optimized parameters for each location + +### Climate Emulator - Statistical Modeling + +**Purpose:** Builds statistical models from Mean Trend Removal residuals to emulate climate behavior. + +**Runtime:** Requires PaRSEC (StarPU not supported). + +**Configuration:** +```bash +./configure -e --climate-emulator --use-parsec +``` + +**Prerequisites:** +1. Mean Trend Removal output files (`z_*.csv` and `params.csv`) +2. Auxiliary files matching your grid size: `_Et1.csv`, `_Et2.csv`, `_Ep.csv` + +**Basic Usage:** +```bash +./bin/examples/climate-emulator/Example_Climate_Emulator \ + --N=5184 \ + --dts=72 \ + --timeslot=4000 \ + --ObjectsNumber=72 \ + --cores=1 \ + --add-diagonal=10 \ + --Accuracy=0 \ + --banddensedp=1000 \ + --hnb=300 \ + --verbose=detailed \ + --gpus=0 \ + --data_path=/path/to/results/ +``` + +**Key Parameters:** +- `N`: Spatial problem size (typically `dts²`, e.g., N=5184 for dts=72) +- `timeslot`: Number of time points to process (z_*.csv files) +- `data_path`: Directory containing Mean Trend Removal outputs + +### Full Pipeline Script + +**Purpose:** Automates processing of multiple latitude bands in parallel. + +**Script:** `FullPipeline.sh` + +**Mean Trend Removal Processing:** +```bash +./FullPipeline.sh \ + --lats=720 \ + --lon=1440 \ + --startyear=2000 \ + --endyear=2022 \ + --data-path=/path/to/ERA_data/ \ + --forcing-data-path=/path/to/forcing_new.csv \ + --resultspath=/path/to/results/ \ + --mpi-processes=5 \ + --parallel-jobs=40 \ + --cores=5 +``` + +**Full Pipeline (Mean Trend Removal + Climate Emulator):** +```bash +./FullPipeline.sh \ + --lats=720 \ + --lon=1440 \ + --startyear=2020 \ + --endyear=2022 \ + --data-path=/path/to/ERA_data/ \ + --forcing-data-path=/path/to/forcing_new.csv \ + --resultspath=/path/to/results/ \ + --mpi-processes=5 \ + --parallel-jobs=40 \ + --cores=5 \ + --run-climate-emulator \ + --N=518400 \ + --dts=720 \ + --timeslot=4000 \ + --ObjectsNumber=720 \ + --add-diagonal=10 \ + --Accuracy=0 \ + --band-dense=1000 \ + --hnb=1000 \ + --verbose=detailed \ + --gpus=0 +``` + +**Important Notes:** +- Climate Emulator requires PaRSEC runtime +- Mean Trend Removal works with both StarPU and PaRSEC +- Ensure `parallel-jobs × cores ≤ available CPU cores` +- For detailed parameter descriptions, see the [Arguments](#arguments) section + + ## Manuals - Find a detailed Manual for R functions in [ExaGeoStatCPP-R-Interface-Manual](docs/ExaGeoStat-R-Interface-Manual.pdf) - Find a detailed Manual for C++ functions in [ExaGeoStatC-CPP-Manual](docs/ExaGeoStat-CPP-Manual.pdf) diff --git a/cmake/FindHICMA-X.cmake b/cmake/FindHICMA-X.cmake new file mode 100644 index 00000000..bb2a045e --- /dev/null +++ b/cmake/FindHICMA-X.cmake @@ -0,0 +1,109 @@ + +# Copyright (c) 2017-2024 King Abdullah University of Science and Technology, +# All rights reserved. +# ExaGeoStat is a software package, provided by King Abdullah University of Science and Technology (KAUST). + +# @file FindHICMA-X.cmake +# @brief This is a CMakeLists file for finding HiCMA-X and link and include it's headers +# @version 2.0.0 +# @author Mahmoud ElKarargy +# @date 2024-09-28 + +# Include pkg-config +find_package(PkgConfig QUIET) + +# Try to find dplasma and parsec via pkg-config +if(PKG_CONFIG_FOUND) + pkg_check_modules(DPLASMA_PKG dplasma) + pkg_check_modules(PARSEC_PKG parsec) + if(DPLASMA_PKG_FOUND AND PARSEC_PKG_FOUND) + # Try to find the HICMA-X or hicma-x path in the library directories + string(FIND "${PARSEC_PKG_LIBRARY_DIRS}" "HICMA-X" HICMA_X_START) + if(HICMA_X_START EQUAL -1) + string(FIND "${PARSEC_PKG_LIBRARY_DIRS}" "hicma-x" HICMA_X_START) + endif() + if(HICMA_X_START GREATER -1) + # Extract the full path to HICMA-X or hicma-x and set the include directory + string(REGEX MATCH "([^;]*(HICMA-X|hicma-x)[^;]*/lib)" HICMA_X_LIB_PATH "${PARSEC_PKG_LIBRARY_DIRS}") + get_filename_component(HICMA_X_ROOT "${HICMA_X_LIB_PATH}" DIRECTORY) # Go one level up + set(HICMA-X_INCLUDE_DIRS "${HICMA_X_ROOT}/include") # Set the include path + endif() + # TODO: This is not generalized for the case of hicma installed manually + set(HICMA_X_SRC_DIR ${HICMA_X_ROOT}/hicma-x-src) + set(HICMA_X_BIN_DIR ${HICMA_X_ROOT}/bin) + set(HICMA-X_FOUND TRUE) + set(HICMA-X_LIBRARIES ${DPLASMA_PKG_LIBRARIES} ${PARSEC_PKG_LIBRARIES}) + set(HICMA-X_LIBRARY_DIRS "${HICMA_X_LIB_PATH}") + # Add a search for lib64 directories and set HICMA-X_LIBRARY_DIRS_DEP + set(HICMA-X_LIBRARY_DIRS_DEP "${HICMA_X_LIB_PATH}64") + + find_library(HICMA_PARSEC_LIB hicma_parsec PATHS ${HICMA-X_LIBRARY_DIRS_DEP}) + + if(HICMA_PARSEC_LIB) + list(APPEND HICMA-X_LIBRARIES ${HICMA_PARSEC_LIB}) + else() + message(FATAL_ERROR "libhicma_parsec.so not found") + endif() + + endif() +endif() + +# Fallback: Manual search if pkg-config fails or HICMA-X path isn't set +if(NOT HICMA-X_FOUND) + # Improved search to handle multiple possible paths and fallback for include directories + find_path(HICMA-X_INCLUDE_DIR + NAMES hicma.h + PATHS + ${CMAKE_CURRENT_LIST_DIR}/../hicma-x/include + /usr/local/include/hicma-x + /usr/local/include + /usr/include/hicma-x + /usr/include + DOC "Path to HICMA-X include directory" + ) + + # Search for the main HICMA-X library + find_library(HICMA-X_LIBRARY + NAMES hicma-x + PATHS + ${CMAKE_CURRENT_LIST_DIR}/../hicma-x/lib + /usr/local/lib + /usr/lib + DOC "Path to HICMA-X library" + ) + + # Search for the hicma_parsec library in the lib64 directory if it's not found in the standard lib + find_library(HICMA_PARSEC_LIB + NAMES hicma_parsec + PATHS + ${CMAKE_CURRENT_LIST_DIR}/../hicma-x/lib64 + /usr/local/lib64 + /usr/lib64 + DOC "Path to HICMA-Parsec library" + ) + + # Check if both the include directory and libraries were found + if(HICMA-X_INCLUDE_DIR AND HICMA-X_LIBRARY AND HICMA_PARSEC_LIB) + set(HICMA-X_FOUND TRUE) + # Combine the found libraries + set(HICMA-X_LIBRARIES ${HICMA-X_LIBRARY} ${HICMA_PARSEC_LIB}) + # Set the include directory + set(HICMA-X_INCLUDE_DIRS "${HICMA-X_INCLUDE_DIR}") + # Include both lib and lib64 directories + # TODO: This paths are not generalized, if the install is not with the same dir. + set(HICMA-X_LIBRARY_DIRS "${HICMA-X_LIBRARY}/lib") + set(HICMA-X_LIBRARY_DIRS_DEP "${HICMA-X_LIBRARY}/lib64") + else() + set(HICMA-X_FOUND FALSE) + endif() +endif() + +# Mark the variables as advanced to keep the CMake GUI clean +mark_as_advanced(HICMA-X_INCLUDE_DIR HICMA-X_LIBRARY HICMA_PARSEC_LIB) + +# Provide feedback on whether the library was found +if(HICMA-X_FOUND) + message(STATUS "Found HICMA-X") +else() + message("Could not find HICMA-X or its dependencies (dplasma, parsec)") +endif() diff --git a/cmake/FindHWLOC.cmake b/cmake/FindHwloc.cmake similarity index 96% rename from cmake/FindHWLOC.cmake rename to cmake/FindHwloc.cmake index 2613be08..5b333b4b 100644 --- a/cmake/FindHWLOC.cmake +++ b/cmake/FindHwloc.cmake @@ -13,6 +13,7 @@ # Hwloc_FOUND - True if hwloc was found # Hwloc_INCLUDE_DIRS - include directories for hwloc # Hwloc_LIBRARIES - link against these libraries to use hwloc +# Hwloc_LIBRARY_DIRS - directories where hwloc libraries are found # Hwloc_VERSION - version # Hwloc_CFLAGS - include directories as compiler flags # Hwloc_LDLFAGS - link paths and libs as compiler flags @@ -171,6 +172,9 @@ else() list(GET Hwloc_VERSION_PARSED 1 Hwloc_VERSION_MINOR) set(Hwloc_VERSION_MINOR "${Hwloc_VERSION_MINOR}" CACHE STRING "Minor version of Hwloc") + # Capture the library directories + set(Hwloc_LIBRARY_DIRS ${Hwloc_LIBRARY_DIRS} CACHE STRING "Directories where hwloc libraries are found") + include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Hwloc DEFAULT_MSG Hwloc_LIBRARIES) @@ -184,5 +188,4 @@ else() endif() endif() - -endif() +endif() \ No newline at end of file diff --git a/cmake/FindNetCDF.cmake b/cmake/FindNetCDF.cmake new file mode 100644 index 00000000..70522ff1 --- /dev/null +++ b/cmake/FindNetCDF.cmake @@ -0,0 +1,133 @@ +#[==[ +Provides the following variables: + + * `NetCDF_FOUND`: Whether NetCDF was found or not. + * `NetCDF_INCLUDE_DIRS`: Include directories necessary to use NetCDF. + * `NetCDF_LIBRARIES`: Libraries necessary to use NetCDF. + * `NetCDF_VERSION`: The version of NetCDF found. + * `NetCDF::NetCDF`: A target to use with `target_link_libraries`. + * `NetCDF_HAS_PARALLEL`: Whether or not NetCDF was found with parallel IO support. +#]==] + +function(FindNetCDF_get_is_parallel_aware include_dir) + file(STRINGS "${include_dir}/netcdf_meta.h" _netcdf_lines + REGEX "#define[ \t]+NC_HAS_PARALLEL[ \t]") + string(REGEX REPLACE ".*NC_HAS_PARALLEL[ \t]*([0-1]+).*" "\\1" _netcdf_has_parallel "${_netcdf_lines}") + if (_netcdf_has_parallel) + set(NetCDF_HAS_PARALLEL TRUE PARENT_SCOPE) + else() + set(NetCDF_HAS_PARALLEL FALSE PARENT_SCOPE) + endif() +endfunction() + +find_package(PkgConfig QUIET) +if (PkgConfig_FOUND) + pkg_check_modules(_NetCDF QUIET netcdf IMPORTED_TARGET) + if (_NetCDF_FOUND) + # Forward the variables in a consistent way. + set(NetCDF_FOUND "${_NetCDF_FOUND}") + set(NetCDF_INCLUDE_DIRS "${_NetCDF_INCLUDE_DIRS}") + set(NetCDF_LIBRARIES "${_NetCDF_LIBRARIES}") + set(NetCDF_VERSION "${_NetCDF_VERSION}") + set(NetCDF_LIBRARY_DIRS "${_NetCDF_LIBRARY_DIRS}") + + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(NetCDF + REQUIRED_VARS NetCDF_LIBRARIES + # This is not required because system-default include paths are not + # reported by `FindPkgConfig`, so this might be empty. Assume that if we + # have a library, the include directories are fine (if any) since + # PkgConfig reported that the package was found. + # NetCDF_INCLUDE_DIRS + VERSION_VAR NetCDF_VERSION) + + if (NOT TARGET NetCDF::NetCDF) + add_library(NetCDF::NetCDF INTERFACE IMPORTED) + set_target_properties(NetCDF::NetCDF PROPERTIES + INTERFACE_LINK_LIBRARIES "PkgConfig::_NetCDF") + endif () + + FindNetCDF_get_is_parallel_aware("${_NetCDF_INCLUDEDIR}") + # Skip the rest of the logic in this file. + return () + endif () +endif () + +# Try to find a CMake-built NetCDF. +find_package(netCDF CONFIG QUIET) +if (netCDF_FOUND) + # Forward the variables in a consistent way. + set(NetCDF_FOUND "${netCDF_FOUND}") + set(NetCDF_INCLUDE_DIRS "${netCDF_INCLUDE_DIR}") + set(NetCDF_LIBRARIES "${netCDF_LIBRARIES}") + set(NetCDF_LIBRARY_DIRS "${netCDF_LIBRARY_DIRS}") + set(NetCDF_VERSION "${NetCDFVersion}") + + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(NetCDF + REQUIRED_VARS NetCDF_INCLUDE_DIRS NetCDF_LIBRARIES + VERSION_VAR NetCDF_VERSION) + + if (NOT TARGET NetCDF::NetCDF) + add_library(NetCDF::NetCDF INTERFACE IMPORTED) + if (TARGET "netCDF::netcdf") + # 4.7.3 + set_target_properties(NetCDF::NetCDF PROPERTIES + INTERFACE_LINK_LIBRARIES "netCDF::netcdf") + elseif (TARGET "netcdf") + set_target_properties(NetCDF::NetCDF PROPERTIES + INTERFACE_LINK_LIBRARIES "netcdf") + else () + set_target_properties(NetCDF::NetCDF PROPERTIES + INTERFACE_LINK_LIBRARIES "${netCDF_LIBRARIES}") + endif () + endif () + + FindNetCDF_get_is_parallel_aware("${NetCDF_INCLUDE_DIRS}") + # Skip the rest of the logic in this file. + return () +endif () + +find_path(NetCDF_INCLUDE_DIR + NAMES netcdf.h + DOC "netcdf include directories") +mark_as_advanced(NetCDF_INCLUDE_DIR) + +find_library(NetCDF_LIBRARY + NAMES netcdf + DOC "netcdf library") +mark_as_advanced(NetCDF_LIBRARY) + +if (NetCDF_INCLUDE_DIR) + file(STRINGS "${NetCDF_INCLUDE_DIR}/netcdf_meta.h" _netcdf_version_lines + REGEX "#define[ \t]+NC_VERSION_(MAJOR|MINOR|PATCH|NOTE)") + string(REGEX REPLACE ".*NC_VERSION_MAJOR *\([0-9]*\).*" "\\1" _netcdf_version_major "${_netcdf_version_lines}") + string(REGEX REPLACE ".*NC_VERSION_MINOR *\([0-9]*\).*" "\\1" _netcdf_version_minor "${_netcdf_version_lines}") + string(REGEX REPLACE ".*NC_VERSION_PATCH *\([0-9]*\).*" "\\1" _netcdf_version_patch "${_netcdf_version_lines}") + string(REGEX REPLACE ".*NC_VERSION_NOTE *\"\([^\"]*\)\".*" "\\1" _netcdf_version_note "${_netcdf_version_lines}") + set(NetCDF_VERSION "${_netcdf_version_major}.${_netcdf_version_minor}.${_netcdf_version_patch}${_netcdf_version_note}") + unset(_netcdf_version_major) + unset(_netcdf_version_minor) + unset(_netcdf_version_patch) + unset(_netcdf_version_note) + unset(_netcdf_version_lines) + + FindNetCDF_get_is_parallel_aware("${NetCDF_INCLUDE_DIR}") +endif () + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(NetCDF + REQUIRED_VARS NetCDF_LIBRARY NetCDF_INCLUDE_DIR + VERSION_VAR NetCDF_VERSION) + +if (NetCDF_FOUND) + set(NetCDF_INCLUDE_DIRS "${NetCDF_INCLUDE_DIR}") + set(NetCDF_LIBRARIES "${NetCDF_LIBRARY}") + + if (NOT TARGET NetCDF::NetCDF) + add_library(NetCDF::NetCDF UNKNOWN IMPORTED) + set_target_properties(NetCDF::NetCDF PROPERTIES + IMPORTED_LOCATION "${NetCDF_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${NetCDF_INCLUDE_DIR}") + endif () +endif () diff --git a/cmake/FindPnetCDF.cmake b/cmake/FindPnetCDF.cmake new file mode 100644 index 00000000..47de7476 --- /dev/null +++ b/cmake/FindPnetCDF.cmake @@ -0,0 +1,74 @@ + +# Copyright (c) 2017-2024 King Abdullah University of Science and Technology, +# All rights reserved. +# ExaGeoStat is a software package, provided by King Abdullah University of Science and Technology (KAUST). + +# @file FindPnetCDF.cmake +# @brief A CMake module to locate the Parallel NetCDF library using pkg-config if available. +# @version 2.0.0 +# @author Mahmoud ElKarargy +# @date 2024-11-23 + +# This module defines the following variables: +# - PnetCDF_FOUND : True if the library is found +# - PnetCDF_INCLUDE_DIRS : Path to the include directory +# - PnetCDF_LIBRARIES : The library to link against +# - PnetCDF_VERSION : Version of the library + +find_package(PkgConfig) + +if(PkgConfig_FOUND) + # Use pkg-config to locate PnetCDF + pkg_check_modules(PnetCDF QUIET pnetcdf) + if(PnetCDF_FOUND) + # Assign include directories and libraries from pkg-config + set(PnetCDF_INCLUDE_DIRS ${PnetCDF_INCLUDE_DIRS} ${PnetCDF_INCLUDEDIR}) + set(PnetCDF_LIBRARIES ${PnetCDF_LIBRARIES}) + set(PnetCDF_VERSION ${PnetCDF_VERSION}) + endif() +endif() + +# Fallback if pkg-config failed or did not provide include directories +if(NOT PnetCDF_INCLUDE_DIRS) + find_path(PnetCDF_INCLUDE_DIR + NAMES pnetcdf.h + HINTS ENV PNETCDF_DIR + PATH_SUFFIXES include + ) + set(PnetCDF_INCLUDE_DIRS ${PnetCDF_INCLUDE_DIR}) +endif() + +if(NOT PnetCDF_LIBRARIES) + find_library(PnetCDF_LIBRARY + NAMES pnetcdf + HINTS ENV PNETCDF_DIR + PATH_SUFFIXES lib + ) + set(PnetCDF_LIBRARIES ${PnetCDF_LIBRARY}) +endif() + +if(PnetCDF_INCLUDE_DIRS AND PnetCDF_LIBRARIES) + set(PnetCDF_FOUND TRUE) +else() + set(PnetCDF_FOUND FALSE) +endif() + +# Detect version from header file if not set +if(PnetCDF_FOUND AND NOT PnetCDF_VERSION) + file(READ "${PnetCDF_INCLUDE_DIRS}/pnetcdf.h" PNETCDF_HEADER_CONTENTS) + string(REGEX MATCH "#define PNETCDF_VERSION_MAJOR ([0-9]+)" _major_match "${PNETCDF_HEADER_CONTENTS}") + string(REGEX MATCH "#define PNETCDF_VERSION_MINOR ([0-9]+)" _minor_match "${PNETCDF_HEADER_CONTENTS}") + string(REGEX MATCH "#define PNETCDF_VERSION_PATCH ([0-9]+)" _patch_match "${PNETCDF_HEADER_CONTENTS}") + if(_major_match AND _minor_match AND _patch_match) + string(REGEX REPLACE ".* ([0-9]+).*" "\\1" PNETCDF_VERSION_MAJOR "${_major_match}") + string(REGEX REPLACE ".* ([0-9]+).*" "\\1" PNETCDF_VERSION_MINOR "${_minor_match}") + string(REGEX REPLACE ".* ([0-9]+).*" "\\1" PNETCDF_VERSION_PATCH "${_patch_match}") + set(PnetCDF_VERSION "${PNETCDF_VERSION_MAJOR}.${PNETCDF_VERSION_MINOR}.${PNETCDF_VERSION_PATCH}") + endif() +endif() + +# Print debug information +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(PnetCDF REQUIRED_VARS PnetCDF_INCLUDE_DIRS PnetCDF_LIBRARIES VERSION_VAR PnetCDF_VERSION) + +mark_as_advanced(PnetCDF_INCLUDE_DIRS PnetCDF_LIBRARIES) \ No newline at end of file diff --git a/cmake/ImportChameleon.cmake b/cmake/ImportChameleon.cmake index 650db197..40ac42db 100644 --- a/cmake/ImportChameleon.cmake +++ b/cmake/ImportChameleon.cmake @@ -38,8 +38,13 @@ ImportDependency(${name} ${tag} ${version} ${url} "${flag}" "" ${is_cmake} ${is_ # Additional include directories for Chameleon are specified, ensuring the project can find Chameleon's headers. # The AFTER keyword specifies that these directories should be searched after the default ones. include_directories(AFTER ${CHAMELEON_DIR_FOUND}/include/coreblas) -include_directories(${CHAMELEON_DIR_FOUND}/chameleon-src) -include_directories(${CHAMELEON_DIR_FOUND}) +if(NOT CHAMELEON_DIR_FOUND) + set(CHAMELEON_DIR_FOUND ${CMAKE_INSTALL_PREFIX}/CHAMELEON) +else() + include_directories(${CHAMELEON_DIR_FOUND}) +endif() +message(STATUS "CHAMELEON_DIR_FOUND: ${CHAMELEON_DIR_FOUND}") +include_directories(${CHAMELEON_DIR_FOUND}/chameleon-src) # Print a status message indicating the completion of Chameleon's inclusion process. -message(STATUS "${name} done") +message(STATUS "${name} done") \ No newline at end of file diff --git a/cmake/ImportHDF5.cmake b/cmake/ImportHDF5.cmake new file mode 100644 index 00000000..37b8430e --- /dev/null +++ b/cmake/ImportHDF5.cmake @@ -0,0 +1,44 @@ + +# Copyright (c) 2017-2024 King Abdullah University of Science and Technology, +# All rights reserved. +# ExaGeoStat is a software package, provided by King Abdullah University of Science and Technology (KAUST). + +# @file ImportHDF5.cmake +# @brief Checks for the HDF5 library and includes it in the project if it is not already present. +# @version 2.0.0 +# @author Mahmoud ElKarargy +# @author Sameh Abdulah +# @date 2024-11-14 + +# Configuration settings for the integration of the NLOPT library +# 'name' is assigned to "NLOPT", serving as the identifier for this library within the script. +set(name "HDF5") +# 'tag' defines "hdf5-1_12_0" as the version tag of NLOPT, indicating the specific release to be utilized. +set(tag "hdf5-1_12_0") +# 'version' specifies "1.12.0" as the version of the NLOPT library, ensuring compatibility with the project's requirements. +set(version "0") +# 'flag' is intended for additional configuration options during the build process. A space is placed as a placeholder. +set(flag \--enable-parallel-tests) +# 'is_cmake' indicates that NLOPT uses CMake for its build system, which is set to ON. +set(is_cmake OFF) +# 'is_git' denotes that the NLOPT source code is hosted in a Git repository, which is set to ON. +set(is_git ON) +# 'auto_gen' signals whether autogen scripts are required for the build process, which is set to OFF for NLOPT. +set(auto_gen OFF) +# 'url' provides the location of the NLOPT source code repository on GitHub. +set(url "https://github.com/HDFGroup/hdf5") + +if (NOT DEFINED ${name}_ROOT OR ${name}_ROOT STREQUAL "") + set(${name}_ROOT "${CMAKE_INSTALL_PREFIX}/${name}") +endif() +# The 'ImportDependency' macro script, located in the 'macros' directory, is included for managing the import and setup of the NLOPT library. +include(macros/ImportDependency) +# The 'ImportDependency' macro is invoked with the above-defined parameters to handle the detection, fetching, and integration of NLOPT into the project. +ImportDependency(${name} ${tag} ${version} ${url} "${flag}" "" ${is_cmake} ${is_git} ${auto_gen}) + +set(ENV{LIBRARY_PATH} "${CMAKE_INSTALL_PREFIX}/${name}/lib:$ENV{LIBRARY_PATH}") +set(ENV{CPATH} "${CMAKE_INSTALL_PREFIX}/${name}/include:$ENV{CPATH}") + +message("${CMAKE_INSTALL_PREFIX}/${name}/lib") +# A status message is outputted to indicate the successful integration of the NLOPT library into the project. +message(STATUS "${name} done") diff --git a/cmake/ImportHiCMAX.cmake b/cmake/ImportHiCMAX.cmake new file mode 100644 index 00000000..6bdc2a79 --- /dev/null +++ b/cmake/ImportHiCMAX.cmake @@ -0,0 +1,42 @@ +# Copyright (c) 2017-2024 King Abdullah University of Science and Technology, +# All rights reserved. +# ExaGeoStat is a software package, provided by King Abdullah University of Science and Technology (KAUST). + +# @file ImportHiCMAX.cmake +# @brief Find and include HiCMA-X library as a dependency. +# @version 2.0.0 +# @author Mahmoud ElKarargy +# @author Sameh Abdulah +# @date 2024-09-21 + +# Configuration settings for integrating the HICMA-X library into the project +# 'name' sets the identifier for the HICMA-X library within this script to "HICMA-X". +set(name "HICMA-X") +# Set the version tag for HiCMA-X. +set(tag "FIX-package-installation-MK") +# Flags to configure the build for HiCMA-X, including precision settings for DPLASMA +# and disabling GPU support for both CUDA and HIP. +set(flags '-DDPLASMA_PRECISIONS="s;d"' \-DPARSEC_WITH_DEVEL_HEADERS=ON \-DCMAKE_Fortran_FLAGS="-Wno-main" + \-DPARSEC_GPU_WITH_HIP=OFF \-DPARSEC_GPU_WITH_CUDA=OFF \-DPARSEC_HAVE_CUDA=OFF \-DPARSEC_DIST_SHORT_LIMIT=0 + \-DPARSEC_DIST_COLLECTIVES=ON \-DPARSEC_HAVE_DEV_CUDA_SUPPORT=OFF \-DDPLASMA_HAVE_CUDA=OFF \-DBLA_VENDOR=${BLA_VENDOR}) +# Indicates that HiCMA-X uses CMake for its build system. +set(is_cmake ON) +# Indicates that HiCMA-X is hosted on a Git repository. +set(is_git ON) +# Indicates that autogen scripts are not required for HiCMA-X. +set(auto_gen OFF) +# Set the URL of the HiCMA-X GitHub repository. +set(url "https://github.com/SAbdulah/hicma-x-dev.git") +# Include the macro to import HiCMA-X as a dependency. +include(macros/ImportDependency) + +# Use the ImportDependency macro to handle fetching, detecting, and setting up HiCMA-X. +ImportDependency(${name} ${tag} "" ${url} "${flags}" "" ${is_cmake} ${is_git} ${auto_gen}) + +# Include necessary directories for HiCMA-X and its dependencies. +include_directories(${HICMA_X_SRC_DIR}) +include_directories(${HICMA_X_SRC_DIR}/dplasma/src) +include_directories(${HICMA_X_SRC_DIR}/hicma_parsec) +include_directories(${HICMA_X_SRC_DIR}/bin/dplasma/src) +# Display a status message indicating that HiCMA-X has been successfully included. +message(STATUS "HiCMA-X done") diff --git a/cmake/ImportHwloc.cmake b/cmake/ImportHwloc.cmake index 5f632725..9607943f 100644 --- a/cmake/ImportHwloc.cmake +++ b/cmake/ImportHwloc.cmake @@ -12,7 +12,7 @@ # Configuration settings for integrating the HWLOC library # 'name' sets the identifier for the HWLOC library within this script to "HWLOC". -set(name "HWLOC") +set(name "Hwloc") # 'tag' specifies "hwloc-2.10.0" as the version tag, identifying a specific release of HWLOC to be used. set(tag "hwloc-2.10.0") # 'version' defines "2.10.0" as the version of HWLOC, ensuring it meets project compatibility requirements. diff --git a/cmake/ImportNetCDF.cmake b/cmake/ImportNetCDF.cmake new file mode 100644 index 00000000..d794db7f --- /dev/null +++ b/cmake/ImportNetCDF.cmake @@ -0,0 +1,40 @@ + +# Copyright (c) 2017-2024 King Abdullah University of Science and Technology, +# All rights reserved. +# ExaGeoStat is a software package, provided by King Abdullah University of Science and Technology (KAUST). + +# @file ImportNetCDF.cmake +# @brief Checks for the NetCDF library and includes it in the project if it is not already present. +# @version 2.0.0 +# @author Mahmoud ElKarargy +# @author Sameh Abdulah +# @date 2024-11-14 + +include(ImportHDF5) +include(ImportPnetCDF) + +# Configuration settings for the integration of the NLOPT library +# 'name' is assigned to "NLOPT", serving as the identifier for this library within the script. +set(name "NetCDF") +# 'tag' defines "v2.7.1" as the version tag of NLOPT, indicating the specific release to be utilized. +set(tag "v4.7.4") +# 'version' specifies "2.7.1" as the version of the NLOPT library, ensuring compatibility with the project's requirements. +set(version "4.7.4") +# 'flag' is intended for additional configuration options during the build process. A space is placed as a placeholder. +set(flag \--enable-pnetcdf ) +# 'is_cmake' indicates that NLOPT uses CMake for its build system, which is set to ON. +set(is_cmake OFF) +# 'is_git' denotes that the NLOPT source code is hosted in a Git repository, which is set to ON. +set(is_git ON) +# 'auto_gen' signals whether autogen scripts are required for the build process, which is set to OFF for NLOPT. +set(auto_gen OFF) +# 'url' provides the location of the NLOPT source code repository on GitHub. +set(url "https://github.com/Unidata/netcdf-c") + +# The 'ImportDependency' macro script, located in the 'macros' directory, is included for managing the import and setup of the NLOPT library. +include(macros/ImportDependency) +# The 'ImportDependency' macro is invoked with the above-defined parameters to handle the detection, fetching, and integration of NLOPT into the project. +ImportDependency(${name} ${tag} ${version} ${url} "${flag}" "" ${is_cmake} ${is_git} ${auto_gen}) + +# A status message is outputted to indicate the successful integration of the NLOPT library into the project. +message(STATUS "${name} done") diff --git a/cmake/ImportNlohmannJSON.cmake b/cmake/ImportNlohmannJSON.cmake new file mode 100644 index 00000000..67227b9e --- /dev/null +++ b/cmake/ImportNlohmannJSON.cmake @@ -0,0 +1,39 @@ + +# Copyright (c) 2017-2024 King Abdullah University of Science and Technology, +# All rights reserved. +# ExaGeoStat is a software package, provided by King Abdullah University of Science and Technology (KAUST). + +# @file ImportNlohmannJSON.cmake +# @brief Checks for the nlohmann library and includes it in the project if it is not already present. +# @version 1.1.0 +# @author Mahmoud ElKarargy +# @date 2024-12-25 + +# Configurations for integrating the nlohmann +# 'name' is assigned "NlohmannJSON" to identify the nlohmann Library within this script. +set(name "nlohmann_json") +# 'tag' specifies the version tag "v3.11.2" for the nlohmann library, indicating the exact version to be used. +set(tag "v3.11.2") +# 'version' sets "3.11.2" as the version of the nlohmann library, ensuring compatibility with project requirements. +set(version "3.11.2") +# 'flag' is available for additional configuration options during build or installation, but remains empty here. +set(flag "") +# 'is_cmake' indicates whether nlohmann uses CMake for building. +set(is_cmake ON) +# 'is_git' denotes if nlohmann's source code is hosted in a Git repository. +set(is_git ON) +# 'auto_gen' signifies the need for autogen scripts in the build process. Here, it is set to OFF, indicating they are not needed. +set(auto_gen OFF) +# 'url' provides the download location for the nlohmann source code. +set(url "https://github.com/nlohmann/json.git") + +# Include the 'ImportDependency' macro, responsible for managing the GSL library's import and setup process. +include(macros/ImportDependency) +# Execute the 'ImportDependency' macro with the previously established parameters to handle the detection, downloading, and integration of nlohmann. +ImportDependency(${name} ${tag} ${version} ${url} "${flag}" "" ${is_cmake} ${is_git} ${auto_gen}) + +# Add nlohmann_json to the project's list of linked libraries, making its functionality accessible within the project. +list(APPEND LIBS nlohmann_json::nlohmann_json) + +# Output a message signaling the successful integration of the nlohmann library into the project. +message(STATUS "${name} done") diff --git a/cmake/ImportPnetCDF.cmake b/cmake/ImportPnetCDF.cmake new file mode 100644 index 00000000..1b588c31 --- /dev/null +++ b/cmake/ImportPnetCDF.cmake @@ -0,0 +1,45 @@ + +# Copyright (c) 2017-2024 King Abdullah University of Science and Technology, +# All rights reserved. +# ExaGeoStat is a software package, provided by King Abdullah University of Science and Technology (KAUST). + +# @file ImportPnetCDF.cmake +# @brief Checks for the PnetCDF library and includes it in the project if it is not already present. +# @version 2.0.0 +# @author Mahmoud ElKarargy +# @author Sameh Abdulah +# @date 2024-11-14 + +# Compute MPI installation root from the MPI C++ compiler path +if (DEFINED MPI_CXX_COMPILER) + get_filename_component(MPI_COMPILER_DIR "${MPI_CXX_COMPILER}" DIRECTORY) # .../bin + get_filename_component(MPI_ROOT "${MPI_COMPILER_DIR}" DIRECTORY) # parent of bin +else() + message(FATAL_ERROR "MPI_CXX_COMPILER not set; cannot locate MPI installation") +endif() + +# Configuration settings for the integration of the NLOPT library +# 'name' is assigned to "NLOPT", serving as the identifier for this library within the script. +set(name "PnetCDF") +# 'tag' defines "PnetCDF-1_12_0" as the version tag of NLOPT, indicating the specific release to be utilized. +set(tag "tag.v1.10.0") +# 'version' specifies "1.12.0" as the version of the NLOPT library, ensuring compatibility with the project's requirements. +set(version "1.10.0") +# 'flag' is intended for additional configuration options during the build process. A space is placed as a placeholder. +set(flag \--enable-shared \--with-mpi=${MPI_ROOT}) +# 'is_cmake' indicates that NLOPT uses CMake for its build system, which is set to ON. +set(is_cmake OFF) +# 'is_git' denotes that the NLOPT source code is hosted in a Git repository, which is set to ON. +set(is_git ON) +# 'auto_gen' signals whether autogen scripts are required for the build process, which is set to OFF for NLOPT. +set(auto_gen ON) +# 'url' provides the location of the NLOPT source code repository on GitHub. +set(url "https://github.com/Parallel-NetCDF/PnetCDF") + +# The 'ImportDependency' macro script, located in the 'macros' directory, is included for managing the import and setup of the NLOPT library. +include(macros/ImportDependency) +# The 'ImportDependency' macro is invoked with the above-defined parameters to handle the detection, fetching, and integration of NLOPT into the project. +ImportDependency(${name} ${tag} ${version} ${url} "${flag}" "" ${is_cmake} ${is_git} ${auto_gen}) + +# A status message is outputted to indicate the successful integration of the NLOPT library into the project. +message(STATUS "${name} done") diff --git a/cmake/ImportStarsH.cmake b/cmake/ImportStarsH.cmake index 0fd9cde5..da715722 100644 --- a/cmake/ImportStarsH.cmake +++ b/cmake/ImportStarsH.cmake @@ -5,33 +5,43 @@ # @file CMakeLists.txt # @brief Find and include STARSH library as a dependency. -# @version 1.1.0 +# @version 2.0.0 # @author Mahmoud ElKarargy # @author Sameh Abdulah -# @date 2023-03-13 +# @date 2024-09-28 # Configuration parameters for integrating the STARSH library # 'name' is set to "STARSH" to identify the STARSH library within this script. set(name "STARSH") -# 'tag' specifies "v0.3.1" as the version tag for STARSH, denoting the exact release to be used. -set(tag "v0.3.1") -# 'version' sets "0.3.1" as the version of the STARSH library, ensuring it aligns with project requirements. -set(version "0.3.1") + +# Check the value of RUNTIME_TYPE and configure STARSH accordingly +if(RUNTIME_TYPE STREQUAL "STARPU") + # Default values for STARPU runtime + set(STARSH_TAG "v0.3.1") + set(STARSH_VERSION "0.3.1") + set(STARSH_URL "https://github.com/ecrc/stars-h.git") + message(STATUS "RUNTIME_TYPE is STARPU. Using default STARSH configuration.") + +elseif(RUNTIME_TYPE STREQUAL "PARSEC") + # Custom values for PARSEC runtime + set(STARSH_TAG "sabdulah/non-gaussian-kernel") + set(STARSH_VERSION "0") + set(STARSH_URL "https://github.com/SAbdulah/stars-h.git") + message(STATUS "RUNTIME_TYPE is PARSEC. Using custom STARSH configuration for PARSEC.") +endif() + # 'flag' is used for additional build configuration options, specifically disabling StarPU and optionally enabling MPI. -set(flag \-DSTARPU=OFF \-DMPI=${USE_MPI}) +set(flag \-DSTARPU=OFF \-DMPI=${USE_MPI} \-DBLA_VENDOR=${BLA_VENDOR}) # 'is_cmake' indicates that STARSH uses CMake as its build system, set to ON. set(is_cmake ON) # 'is_git' denotes that the source code for STARSH is hosted on a Git repository, set to ON. set(is_git ON) # 'auto_gen' signals whether autogen scripts are needed for the build process; it is set to OFF for STARSH. set(auto_gen OFF) -# 'url' provides the GitHub repository URL for STARSH, specifying the source code's location. -set(url "https://github.com/ecrc/stars-h.git") - # The 'ImportDependency' macro, located in the 'macros' directory, is included to manage the import and setup of the STARSH library. include(macros/ImportDependency) # The 'ImportDependency' macro is called with the configuration parameters set above to manage the detection, fetching, and setup of STARSH. -ImportDependency(${name} ${tag} ${version} ${url} "${flag}" "" ${is_cmake} ${is_git} ${auto_gen}) +ImportDependency(${name} ${STARSH_TAG} ${STARSH_VERSION} ${STARSH_URL} "${flag}" "" ${is_cmake} ${is_git} ${auto_gen}) # A message is output to indicate the successful integration of the STARSH library into the project. message(STATUS "${name} done") diff --git a/cmake/macros/BuildDependency.cmake b/cmake/macros/BuildDependency.cmake index 50f5c125..56531c0a 100644 --- a/cmake/macros/BuildDependency.cmake +++ b/cmake/macros/BuildDependency.cmake @@ -73,11 +73,24 @@ macro(BuildDependency raw_name url tag flags is_using_cmake is_using_git auto_ge else () # For non-CMake projects, run autogen.sh if auto_generation is true, then configure the project with specified flags. if (${auto_generation}) - execute_process(COMMAND ./autogen.sh - WORKING_DIRECTORY ${${name}_srcpath} - COMMAND_ERROR_IS_FATAL ANY) # Halt on error + if (EXISTS "${${name}_srcpath}/autogen.sh") + message(STATUS "autogen.sh found. Running ./autogen.sh.") + execute_process( + COMMAND ./autogen.sh + WORKING_DIRECTORY ${${name}_srcpath} + COMMAND_ERROR_IS_FATAL ANY + ) + else () + message(STATUS "autogen.sh not found. Running autoreconf -i.") + execute_process( + COMMAND autoreconf -i + WORKING_DIRECTORY ${${name}_srcpath} + COMMAND_ERROR_IS_FATAL ANY + ) + endif () endif () - execute_process(COMMAND ./configure --prefix=${CMAKE_INSTALL_PREFIX}/${capital_name} ${flags} + execute_process( + COMMAND ./configure --prefix=${CMAKE_INSTALL_PREFIX}/${capital_name} ${flags} CFLAGS=-fPIC WORKING_DIRECTORY ${${name}_srcpath} COMMAND_ERROR_IS_FATAL ANY) # Halt on error endif () @@ -85,6 +98,11 @@ macro(BuildDependency raw_name url tag flags is_using_cmake is_using_git auto_ge # Include the ProcessorCount module to determine the number of CPUs for parallel build and install commands. include(ProcessorCount) ProcessorCount(N) + # Subtract 5 from N, ensuring it doesn't go below 0 + math(EXPR N "${N} - 5") + if (N LESS 0) + set(N 1) + endif() # Build the project using make, with parallel jobs based on processor count. This applies to both CMake and non-CMake projects. if (${is_using_cmake}) execute_process(COMMAND make -j ${N} diff --git a/configurations/config.json b/configurations/config.json new file mode 100644 index 00000000..857dbd34 --- /dev/null +++ b/configurations/config.json @@ -0,0 +1,63 @@ +{ + "N": "16", + "Kernel": "UnivariateMaternStationary", + "P": "1", + "Q": "1", + "Timeslot": "1", + "Computation": "exact", + "Precision": "double", + "Cores": "1", + "Gpus": "0", + "Dts": "8", + "Lts": "0", + "Band": "0", + "MaxRank": "0", + "HNB": "0", + "GenMaxRank": "0", + "CompMaxRank": "0", + "AutoBand": "0", + "BandDenseSP": "0", + "BandLowRankDP": "0", + "BandDenseHP": "0", + "ObservationsFile": "./configurations/observations.dat", + "Seed": "0", + "LogPath": "configurations", + "Ooc": "false", + "ApproximationMode": "1", + "Log": "true", + "IsNonGaussian": "false", + "Verbose": "standard", + "BandDensedp": "0", + "BandDense": "0", + "ObjectsNumber": "0", + "AdaptiveDecision": "0", + "AddDiagonal": "0", + "FileTimeSlot": "1", + "FileNumber": "0", + "EnableInverse": "false", + "Mpiio": "true", + "Dimension": "2D", + "IsSynthetic": "true", + "DataPath": "", + "RecoveryFile": "", + "FileLogPath": "logs.log", + "FileLogName": "logs.log", + "DistanceMetric": "euclidean", + "MaxMleIterations": "1", + "Accuracy": "0", + "Tolerance": "1", + "ZMiss": "1", + "Mspe": "false", + "Idw": "false", + "MloeMmom": "false", + "Fisher": "false", + "ObservationNumber": "0", + "NetCDFDataPath": "", + "ForcingDataPath": "", + "StartYear": "2000", + "EndYear": "2001", + "MeanTrendRemoval": "false", + "IsClimateEmulator": "false", + "Lat": "0", + "Lon": "0" +} diff --git a/configure b/configure index 6f95f233..bf7c2cd1 100755 --- a/configure +++ b/configure @@ -67,6 +67,7 @@ BLAS_VENDOR="" PACKAGE="OFF" RUNTIME_TYPE="starpu" SHOW_WARNINGS="OFF" +USE_CLIMATE_EMULATOR="OFF" COMPILE_FLAGS="-Wl,--no-as-needed -w -fpic" DEVELOPER_WARNINGS="-Wno-dev" @@ -74,13 +75,19 @@ for arg in "$@" do case $arg in --use-mkl) - echo "${GREEN}MKL as a BLA vendor${NC}" + printf "%b\n" "${GREEN}MKL as a BLA vendor${NC}" BLAS_VENDOR="Intel10_64lp" ;; --use-parsec) - echo "${GREEN}Parsec as a runtime${NC}" + printf "%b\n" "${GREEN}PaRSEC as a runtime${NC}" RUNTIME_TYPE="parsec" ;; + --climate-emulator) + printf "%b\n" "${GREEN}Climate Emulator examples enabled (Climate-Emulator + mean-trend-removal)${NC}" + USE_CLIMATE_EMULATOR="ON" + USE_MPI="ON" + printf "%b\n" "${GREEN}MPI auto-enabled (required for NetCDF)${NC}" + ;; *) # Collect non-option arguments as a space-delimited string params="$params $arg" @@ -95,47 +102,47 @@ eval set -- $params while getopts ":tevhHi:cmpTwr" opt; do case $opt in i) ##### Define installation path ##### - echo "${YELLOW}Installation path set to $OPTARG.${NC}" + printf "%b\n" "${YELLOW}Installation path set to $OPTARG.${NC}" INSTALL_PREFIX=$OPTARG ;; t) ##### Building tests enabled ##### - echo "${GREEN}Building tests enabled.${NC}" + printf "%b\n" "${GREEN}Building tests enabled.${NC}" BUILDING_TESTS="ON" ;; T) ##### Building heavy tests enabled ##### - echo "${GREEN}Building heavy tests enabled.${NC}" + printf "%b\n" "${GREEN}Building heavy tests enabled.${NC}" BUILDING_HEAVY_TESTS="ON" ;; e) ##### Building examples enabled ##### - echo "${GREEN}Building examples enabled.${NC}" + printf "%b\n" "${GREEN}Building examples enabled.${NC}" BUILDING_EXAMPLES="ON" ;; H) ##### Using HiCMA ##### - echo "${GREEN}Using HiCMA.${NC}" + printf "%b\n" "${GREEN}Using HiCMA.${NC}" USE_HiCMA="ON" ;; c) ##### Using cuda enabled ##### - echo "${GREEN}Cuda enabled ${NC}" + printf "%b\n" "${GREEN}Cuda enabled ${NC}" USE_CUDA="ON" ;; m) ##### Using MPI enabled ##### - echo "${GREEN}MPI enabled ${NC}" + printf "%b\n" "${GREEN}MPI enabled ${NC}" USE_MPI="ON" ;; v) ##### printing full output of make ##### - echo "${GREEN}printing make with details.${NC}" + printf "%b\n" "${GREEN}printing make with details.${NC}" VERBOSE="ON" ;; p) ##### Enabling packaging system for distribution ##### - echo "${GREEN}CPACK enabled${NC}" + printf "%b\n" "${GREEN}CPACK enabled${NC}" PACKAGE=ON ;; w) ##### Enable showing all the warnings ##### - echo "${GREEN}Showing Warnings is enabled${NC}" + printf "%b\n" "${GREEN}Showing Warnings is enabled${NC}" SHOW_WARNINGS="ON" ;; r) ##### Enable R and Rcpp support ##### - echo "${GREEN}R is enabled${NC}" + printf "%b\n" "${GREEN}R is enabled${NC}" USE_R="ON" ;; \?) ##### Error unknown option ##### @@ -149,8 +156,9 @@ while getopts ":tevhHi:cmpTwr" opt; do h) ##### Prints the help ##### echo "Usage of $(basename "$0"):" echo "" - printf "%20s %s\n" "--use-mkl :" "to use MKL as a BLA vendor." - printf "%20s %s\n" "--use-parsec :" "to use parsec runtime." + printf "%20s %s\n" "--use-mkl :" "to use Intel MKL as the default BLAS library." + printf "%20s %s\n" "--use-parsec :" "to use PaRSEC runtime." + printf "%20s %s\n" "--climate-emulator :" "to enable climate emulator examples (If no PaRSEC, so just the mean trend removal will be enabled)." printf "%20s %s\n" "-i [path] :" "specify installation path, default = ${PWD}/installdir/_deps/" printf "%20s %s\n" "-t :" "to enable building tests." printf "%20s %s\n" "-T :" "to enable building heavy tests." @@ -169,28 +177,29 @@ while getopts ":tevhHi:cmpTwr" opt; do esac done + if [ -z "$BUILDING_TESTS" ]; then BUILDING_TESTS="OFF" - echo "${RED}Building tests disabled.${NC}" + printf "%b\n" "${RED}Building tests disabled.${NC}" fi if [ -z "$BUILDING_EXAMPLES" ]; then BUILDING_EXAMPLES="OFF" - echo "${RED}Building examples disabled.${NC}" + printf "%b\n" "${RED}Building examples disabled.${NC}" fi if [ -z "$USE_HiCMA" ]; then - echo "${RED}Using HiCMA is disabled.${NC}" + printf "%b\n" "${RED}Using HiCMA is disabled.${NC}" fi if [ -z "$USE_CUDA" ]; then USE_CUDA="OFF" - echo "${RED}Using CUDA disabled${NC}" + printf "%b\n" "${RED}Using CUDA disabled${NC}" fi if [ -z "$USE_MPI" ]; then USE_MPI="OFF" - echo "${RED}Using MPI disabled${NC}" + printf "%b\n" "${RED}Using MPI disabled${NC}" fi if [ "$SHOW_WARNINGS" = "ON" ]; then @@ -202,12 +211,12 @@ fi if [ -z "$USE_R" ]; then USE_R="OFF" - echo "${RED}Using R is disabled${NC}" + printf "%b\n" "${RED}Using R is disabled${NC}" fi -echo "${BLUE}Installation path set to $INSTALL_PREFIX.${NC}" +printf "%b\n" "${BLUE}Installation path set to $INSTALL_PREFIX.${NC}" echo "" -echo "${YELLOW}Use -h to print the usages of exageostat-cpp flags.${NC}" +printf "%b\n" "${YELLOW}Use -h to print the usages of exageostat-cpp flags.${NC}" echo "" # cleaning bin @@ -237,6 +246,7 @@ fi -DBUILD_HEAVY_TESTS="${BUILDING_HEAVY_TESTS}" \ -DBUILD_EXAMPLES="${BUILDING_EXAMPLES}" \ -DUSE_HICMA="${USE_HiCMA}" \ + -DUSE_CLIMATE_EMULATOR="${USE_CLIMATE_EMULATOR}" \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=${VERBOSE} \ -DUSE_CUDA="${USE_CUDA}" \ -DUSE_MPI="${USE_MPI}" \ diff --git a/docs/ExaGeoStatCPP-handout.png b/docs/ExaGeoStatCPP-handout.png index 1bd401bcc80dda12375de4165a8784a72616c83c..23aa38dc5f54c64b461668a34413c657f51b0b20 100644 GIT binary patch literal 1413384 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�@i+?hp?*FYYQTOe?C%yFIOLQ6h4j+4j`;h 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