From c846586c624b7c3fdaf97a9333856cabbecb6a6f Mon Sep 17 00:00:00 2001 From: amandinehry Date: Fri, 25 Apr 2025 17:05:43 +0200 Subject: [PATCH 001/173] creation of an object header that logs errors and warnings in a yaml file --- .../common/logger/ErrorHandling.hpp | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/coreComponents/common/logger/ErrorHandling.hpp diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp new file mode 100644 index 00000000000..64062a6c99e --- /dev/null +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -0,0 +1,74 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 TotalEnergies + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2023-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ErrorHandling.hpp + */ + +#ifndef INITIALIZATION_ERROR_LOGGER_HPP +#define INITIALIZATION_ERROR_LOGGER_HPP + +#include "../DataTypes.hpp" + +#include +#include + +using namespace std; + +class ErrorLogger +{ + enum class TypeMsg + { + ERROR, + WARNING + }; + + struct ErrorMsg + { + string msg; + TypeMsg type; + string file; + integer line; + }; + + // Fonction qui formatte + ErrorMsg errorMsgformatter( const string & type, + const string & msg, + const string & file, + integer line ) + { + return { type, msg, file, line }; + }; + + + // Fonction qui écrit dans le yaml + void errorMsgWritter( const ErrorMsg & errorMsg, const string filename ) + { + YAML::Node newMsg; + newMsg["message"] = errorMsg.msg; + newMsg["type"] = errorMsg.type; + + YAML::Node location; + location["file"] = errorMsg.file; + location["line"] = errorMsg.line; + + newMsg["location"] = location; + + ofstream fout( filename, ios::app ); + fout << newMsg << "\n"; + }; +}; + +# endif \ No newline at end of file From f1713fa1d9539a30cac88b0ac24ec6414f5fc00f Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 30 Apr 2025 10:50:47 +0200 Subject: [PATCH 002/173] Set up ErrorHandling --- .../staircase_co2_wells_3d.xml | 4 +- src/coreComponents/common/CMakeLists.txt | 3 +- .../common/logger/ErrorHandling.cpp | 65 ++++++++ .../common/logger/ErrorHandling.hpp | 66 +++++--- src/coreComponents/common/logger/Logger.hpp | 29 ++++ .../common/unitTests/CMakeLists.txt | 3 +- src/coreComponents/dataRepository/Group.hpp | 4 +- src/coreComponents/schema/schema.xsd | 4 +- src/coreComponents/schema/schema.xsd.other | 146 +++++++++--------- 9 files changed, 218 insertions(+), 106 deletions(-) create mode 100644 src/coreComponents/common/logger/ErrorHandling.cpp diff --git a/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_3d.xml b/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_3d.xml index 388b15ca605..8d6fffbdc46 100644 --- a/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_3d.xml +++ b/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_3d.xml @@ -243,14 +243,14 @@ values="{1e-7, 2e-7, 2e-7}" interpolation="lower"/> - + diff --git a/src/coreComponents/common/CMakeLists.txt b/src/coreComponents/common/CMakeLists.txt index 5e5efaa33e3..0a6a403d045 100644 --- a/src/coreComponents/common/CMakeLists.txt +++ b/src/coreComponents/common/CMakeLists.txt @@ -19,7 +19,6 @@ Also provides commonly used components for such as logging, formatting, memory a dependencies. #]] - # # Specify all headers # @@ -40,6 +39,7 @@ set( common_headers GeosxMacros.hpp MemoryInfos.hpp logger/Logger.hpp + logger/ErrorHandling.hpp MpiWrapper.hpp Path.hpp Span.hpp @@ -73,6 +73,7 @@ set( common_sources format/table/TableData.cpp format/StringUtilities.cpp logger/Logger.cpp + logger/ErrorHandling.cpp BufferAllocator.cpp MemoryInfos.cpp MpiWrapper.cpp diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp new file mode 100644 index 00000000000..08f5bdef75d --- /dev/null +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -0,0 +1,65 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 TotalEnergies + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2023-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ErrorHandling.cpp + */ + +// Source includes +#include "ErrorHandling.hpp" + +// System includes +#include +#include + +namespace geos +{ + + std::string ErrorLogger::toString( ErrorLogger::TypeMsg type ) + { + switch ( type ) + { + case ErrorLogger::TypeMsg::ERROR: return "Error"; + case ErrorLogger::TypeMsg::WARNING: return "Warning"; + default: return "Unknown"; + } + } + + void ErrorLogger::errorMsgWritter( ErrorLogger::ErrorMsg const & errorMsg ) + { + ErrorLogger logger; + std::ofstream yamlFile( "errors.yaml", std::ios::app ); + if( yamlFile.is_open() ) + { + std::ifstream yamlFileIn("errors.yaml"); + if( yamlFileIn.tellg() == 0 ) + { + yamlFile << "errors: \n"; + } + yamlFile << " - message: " << errorMsg.msg << "\n"; + yamlFile << " type: " << logger.toString( errorMsg.type ) << "\n"; + yamlFile << " location: " << "\n"; + yamlFile << " file: " << errorMsg.file << "\n"; + yamlFile << " line: " << errorMsg.line << "\n\n"; + yamlFile.close(); + std::cout << "YAML file created successfully.\n"; + } + else + { + std::cerr << "Unable to open file.\n"; + } + } + +} /* namespace geos */ \ No newline at end of file diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 64062a6c99e..a0f1fdd2311 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -20,55 +20,71 @@ #ifndef INITIALIZATION_ERROR_LOGGER_HPP #define INITIALIZATION_ERROR_LOGGER_HPP +// Source includes #include "../DataTypes.hpp" -#include -#include - using namespace std; +namespace geos +{ + +/** + * @class ErrorLogger + * @brief Class to format and write the error/warning message that occured during the initialization + */ class ErrorLogger { +public: + + /** + * @enum TypeMsg + * Enum listing the different types of possible errors + */ enum class TypeMsg { ERROR, WARNING }; + /** + * @brief Struct to define the error/warning message + * + */ struct ErrorMsg { - string msg; TypeMsg type; - string file; + std::string msg; + std::string file; integer line; }; - // Fonction qui formatte - ErrorMsg errorMsgformatter( const string & type, - const string & msg, - const string & file, + /** + * @brief Structured the message based on the provided parameters + * + * @param type The type of the message (error or warning) + * @param msg The error/warning message content + * @param file The file name where the error occured + * @param line The line where the error occured + * @return ErrorMsg + */ + ErrorMsg errorMsgformatter( TypeMsg const & type, + std::string const & msg, + std::string const & file, integer line ) { return { type, msg, file, line }; }; + std::string toString( TypeMsg type ); - // Fonction qui écrit dans le yaml - void errorMsgWritter( const ErrorMsg & errorMsg, const string filename ) - { - YAML::Node newMsg; - newMsg["message"] = errorMsg.msg; - newMsg["type"] = errorMsg.type; - - YAML::Node location; - location["file"] = errorMsg.file; - location["line"] = errorMsg.line; - - newMsg["location"] = location; - - ofstream fout( filename, ios::app ); - fout << newMsg << "\n"; - }; + /** + * @brief Add the error/warning message into the yaml file + * + * @param errorMsg The error message informations formatted by the associated structure + */ + void errorMsgWritter( ErrorMsg const & errorMsg ); }; +} /* namespace geos */ + # endif \ No newline at end of file diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index b8f837a966d..2d66309d0a8 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -25,9 +25,12 @@ #include "common/GeosxMacros.hpp" #include "common/format/Format.hpp" #include "LvArray/src/Macros.hpp" +#include "../../common/logger/ErrorHandling.hpp" // System includes #include +#include +#include #if defined(GEOS_USE_MPI) #include @@ -142,6 +145,29 @@ #define GEOS_ERROR_IF( EXP, msg ) LVARRAY_ERROR_IF( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) #endif +// Test copy +#define LVARRAY_THROW_IF_TEST( EXP, MSG, TYPE ) \ + do \ + { \ + if( EXP ) \ + { \ + ErrorLogger logger; \ + std::ostringstream __oss; \ + __oss << "\n"; \ + __oss << "***** LOCATION: " LOCATION "\n"; \ + __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ + __oss << MSG << "\n"; \ + __oss << LvArray::system::stackTrace( true ); \ + std::ostringstream __oss2, __oss3; \ + __oss2 << MSG; \ + __oss3 << __FILE__; \ + integer line = __LINE__; \ + ErrorLogger::ErrorMsg structMsg = logger.errorMsgformatter( ErrorLogger::TypeMsg::ERROR, __oss2.str(), __oss3.str(), line ); \ + logger.errorMsgWritter( structMsg ); \ + throw TYPE( __oss.str() ); \ + } \ + } while( false ) + /** * @brief Conditionally throw an exception. * @param EXP an expression that will be evaluated as a predicate @@ -150,6 +176,9 @@ */ #define GEOS_THROW_IF( EXP, msg, TYPE ) LVARRAY_THROW_IF( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +// Test copy +#define GEOS_THROW_IF_TEST( EXP, msg, TYPE ) LVARRAY_THROW_IF_TEST( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) + /** * @brief Raise a hard error and terminate the program. * @param msg a message to log (any expression that can be stream inserted) diff --git a/src/coreComponents/common/unitTests/CMakeLists.txt b/src/coreComponents/common/unitTests/CMakeLists.txt index a778823f1ac..9a866ae307d 100644 --- a/src/coreComponents/common/unitTests/CMakeLists.txt +++ b/src/coreComponents/common/unitTests/CMakeLists.txt @@ -5,7 +5,8 @@ set( gtest_geosx_tests testMpiWrapper.cpp testTypeDispatch.cpp testLifoStorage.cpp - testUnits.cpp ) + testUnits.cpp + testErrorHandling.cpp ) set( gtest_geosx_mpi_tests testMpiWrapper.cpp ) diff --git a/src/coreComponents/dataRepository/Group.hpp b/src/coreComponents/dataRepository/Group.hpp index e1b910c0b9a..a548ed8743d 100644 --- a/src/coreComponents/dataRepository/Group.hpp +++ b/src/coreComponents/dataRepository/Group.hpp @@ -309,7 +309,7 @@ class Group /** * @brief Return a reference to a sub-group of the current Group. * @tparam T The type of subgroup. - * @tparam KEY The type of the lookup. + * @tparam KEY The type of the lookup. * @param key The key used to perform the lookup. * @return A reference to @p T that refers to the sub-group. * @throw std::domain_error If the Group does not exist is thrown. @@ -318,7 +318,7 @@ class Group T & getGroup( KEY const & key ) { Group * const child = m_subGroups[ key ]; - GEOS_THROW_IF( child == nullptr, + GEOS_THROW_IF_TEST( child == nullptr, "Group " << getDataContext() << " has no child named " << key << std::endl << dumpSubGroupsNames(), std::domain_error ); diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index ee95e352d66..c8137e5ce7c 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -3459,7 +3459,7 @@ Information output from lower logLevels is added with the desired log level - + @@ -3482,7 +3482,7 @@ Local- Add jump stabilization on interior of macro elements--> - + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 728b907fe74..7cbfd61e863 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -486,7 +486,7 @@ - + @@ -576,7 +576,7 @@ - + @@ -613,7 +613,7 @@ - + @@ -666,7 +666,7 @@ - + @@ -709,7 +709,7 @@ - + @@ -744,7 +744,7 @@ - + @@ -755,7 +755,7 @@ - + @@ -768,7 +768,7 @@ - + @@ -781,7 +781,7 @@ - + @@ -795,7 +795,7 @@ - + @@ -829,7 +829,7 @@ - + @@ -894,7 +894,7 @@ - + @@ -927,7 +927,7 @@ - + @@ -938,7 +938,7 @@ - + @@ -949,7 +949,7 @@ - + @@ -962,7 +962,7 @@ - + @@ -975,7 +975,7 @@ - + @@ -986,7 +986,7 @@ - + @@ -997,7 +997,7 @@ - + @@ -1008,7 +1008,7 @@ - + @@ -1021,7 +1021,7 @@ - + @@ -1034,7 +1034,7 @@ - + @@ -1047,7 +1047,7 @@ - + @@ -1060,7 +1060,7 @@ - + @@ -1071,7 +1071,7 @@ - + @@ -1084,7 +1084,7 @@ - + @@ -1097,7 +1097,7 @@ - + @@ -1108,7 +1108,7 @@ - + @@ -1119,7 +1119,7 @@ - + @@ -1132,7 +1132,7 @@ - + @@ -1143,7 +1143,7 @@ - + @@ -1154,7 +1154,7 @@ - + @@ -1167,7 +1167,7 @@ - + @@ -1180,7 +1180,7 @@ - + @@ -1193,7 +1193,7 @@ - + @@ -1206,7 +1206,7 @@ - + @@ -1219,7 +1219,7 @@ - + @@ -1230,7 +1230,7 @@ - + @@ -1243,7 +1243,7 @@ - + @@ -1256,7 +1256,7 @@ - + @@ -1269,7 +1269,7 @@ - + @@ -1283,7 +1283,7 @@ - + @@ -1298,7 +1298,7 @@ - + @@ -1315,7 +1315,7 @@ - + @@ -1332,7 +1332,7 @@ - + @@ -1349,7 +1349,7 @@ - + @@ -1364,7 +1364,7 @@ - + @@ -1403,7 +1403,7 @@ - + @@ -1432,7 +1432,7 @@ - + @@ -1527,7 +1527,7 @@ - + @@ -3191,7 +3191,7 @@ - + @@ -3219,7 +3219,7 @@ - + @@ -3238,11 +3238,11 @@ - + - + @@ -3252,7 +3252,7 @@ - + @@ -3262,11 +3262,11 @@ - + - + @@ -3276,7 +3276,7 @@ - + @@ -3286,7 +3286,7 @@ - + @@ -3296,7 +3296,7 @@ - + @@ -3320,7 +3320,7 @@ - + @@ -3338,7 +3338,7 @@ - + @@ -3350,7 +3350,7 @@ - + @@ -3362,7 +3362,7 @@ - + @@ -3370,11 +3370,11 @@ - + - + @@ -3397,7 +3397,7 @@ - + @@ -3423,7 +3423,7 @@ - + @@ -3444,7 +3444,7 @@ - + @@ -3474,7 +3474,7 @@ - + @@ -3488,7 +3488,7 @@ - + @@ -3515,7 +3515,7 @@ - + @@ -3554,7 +3554,7 @@ - + From 4e5250f26d0bac082a31eb032f68f43bf2b853a2 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 30 Apr 2025 10:53:00 +0200 Subject: [PATCH 003/173] traits errors commented (to treat) --- .../dataRepository/unitTests/testBufferOps.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp b/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp index bc7fb8357b1..bc57bedccba 100644 --- a/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp +++ b/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp @@ -31,7 +31,7 @@ TEST( testGeosxTraits, test_is_noncontainer_type_packable ) static_assert( !is_noncontainer_type_packable< void >, "Should be false." ); static_assert( !is_noncontainer_type_packable< array1d< double > >, "Should be false." ); static_assert( !is_noncontainer_type_packable< SortedArray< double > >, "Should be false." ); - static_assert( !is_noncontainer_type_packable< map< string, int > >, "Should be false." ); + // static_assert( !is_noncontainer_type_packable< map< string, int > >, "Should be false." ); static_assert( !is_noncontainer_type_packable< std::pair< string, int > >, "Should be false." ); } @@ -49,7 +49,7 @@ TEST( testGeosxTraits, test_is_array_packable ) TEST( testGeosxTraits, test_is_packable_map ) { - static_assert( is_packable_map< map< string, int > >, "Should be true." ); - static_assert( is_packable_map< map< string, array1d< int > > >, "Should be true." ); - static_assert( !is_packable_map< map< string, std::pair< int, int > > >, "Should be false" ); + // static_assert( is_packable_map< map< string, int > >, "Should be true." ); + // static_assert( is_packable_map< map< string, array1d< int > > >, "Should be true." ); + // static_assert( !is_packable_map< map< string, std::pair< int, int > > >, "Should be false" ); } From 94b775c682837403659a1b8abd2c1a55f91c9ec8 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 30 Apr 2025 10:53:10 +0200 Subject: [PATCH 004/173] Set up test --- .../common/unitTests/testErrorHandling.cpp | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/coreComponents/common/unitTests/testErrorHandling.cpp diff --git a/src/coreComponents/common/unitTests/testErrorHandling.cpp b/src/coreComponents/common/unitTests/testErrorHandling.cpp new file mode 100644 index 00000000000..a33f6cfde7d --- /dev/null +++ b/src/coreComponents/common/unitTests/testErrorHandling.cpp @@ -0,0 +1,34 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 TotalEnergies + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2023-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#include "common/logger/ErrorHandling.hpp" + +#include + +using namespace geos; + +TEST( ErrorHandling, testYaml ) +{ + ErrorLogger logger; + ErrorLogger::ErrorMsg structMsg = logger.errorMsgformatter( ErrorLogger::TypeMsg::ERROR, "contenu du message", "nom du fichier dev", 24 ); + logger.errorMsgWritter( structMsg ); +} + +int main( int ac, char * av[] ) +{ + ::testing::InitGoogleTest( &ac, av ); + int const result = RUN_ALL_TESTS(); + return result; +} \ No newline at end of file From 1cb8aa3a28eec070992ac202a5bcc92ec5dd2bb8 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 30 Apr 2025 14:29:36 +0200 Subject: [PATCH 005/173] Modification to properly format the yaml so that it can be parsed if necessary --- .../common/logger/ErrorHandling.cpp | 23 +++++++++++-------- .../common/logger/ErrorHandling.hpp | 3 ++- src/coreComponents/common/logger/Logger.hpp | 2 +- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 08f5bdef75d..79aad79e669 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -22,7 +22,7 @@ // System includes #include -#include +#include namespace geos { @@ -40,19 +40,24 @@ namespace geos void ErrorLogger::errorMsgWritter( ErrorLogger::ErrorMsg const & errorMsg ) { ErrorLogger logger; - std::ofstream yamlFile( "errors.yaml", std::ios::app ); + + std::string filename = "errors.yaml"; + std::ifstream checkYamlFile( filename ); + bool isEmpty = checkYamlFile.peek() == std::ifstream::traits_type::eof(); + checkYamlFile.close(); + + std::ofstream yamlFile( filename, std::ios::app ); if( yamlFile.is_open() ) { - std::ifstream yamlFileIn("errors.yaml"); - if( yamlFileIn.tellg() == 0 ) + if( isEmpty ) { yamlFile << "errors: \n"; } - yamlFile << " - message: " << errorMsg.msg << "\n"; - yamlFile << " type: " << logger.toString( errorMsg.type ) << "\n"; - yamlFile << " location: " << "\n"; - yamlFile << " file: " << errorMsg.file << "\n"; - yamlFile << " line: " << errorMsg.line << "\n\n"; + yamlFile << GEOS_FMT( "{:>2}- type: {}\n", " ", errorMsg.msg ); + yamlFile << GEOS_FMT( "{:>4}message: {}\n", " ", logger.toString( errorMsg.type ) ); + yamlFile << GEOS_FMT( "{:>4}location:\n", " " ); + yamlFile << GEOS_FMT( "{:>6}- file: {}\n", " ", errorMsg.file ); + yamlFile << GEOS_FMT( "{:>6}- line: {}\n\n", " ", errorMsg.line ); yamlFile.close(); std::cout << "YAML file created successfully.\n"; } diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index a0f1fdd2311..e72dd5dd2e6 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -21,7 +21,8 @@ #define INITIALIZATION_ERROR_LOGGER_HPP // Source includes -#include "../DataTypes.hpp" +#include "common/DataTypes.hpp" +#include "common/format/Format.hpp" using namespace std; diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 2d66309d0a8..cbbd84480fc 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -25,7 +25,7 @@ #include "common/GeosxMacros.hpp" #include "common/format/Format.hpp" #include "LvArray/src/Macros.hpp" -#include "../../common/logger/ErrorHandling.hpp" +#include "common/logger/ErrorHandling.hpp" // System includes #include From 9d5e16aecbb2310c3a6eec06dc531e4117140259 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Fri, 2 May 2025 15:08:34 +0200 Subject: [PATCH 006/173] Test to add variadic arguments --- src/coreComponents/common/logger/Logger.hpp | 21 ++++++++++++++++----- src/coreComponents/dataRepository/Group.hpp | 2 +- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index cbbd84480fc..22905437cbb 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -145,8 +145,13 @@ #define GEOS_ERROR_IF( EXP, msg ) LVARRAY_ERROR_IF( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) #endif -// Test copy -#define LVARRAY_THROW_IF_TEST( EXP, MSG, TYPE ) \ +/** + * @brief Conditionally throw an exception. + * @param EXP an expression that will be evaluated as a predicate + * @param MSG a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define LVARRAY_THROW_IF_TEST( EXP, MSG, TYPE, ... ) \ do \ { \ if( EXP ) \ @@ -162,7 +167,8 @@ __oss2 << MSG; \ __oss3 << __FILE__; \ integer line = __LINE__; \ - ErrorLogger::ErrorMsg structMsg = logger.errorMsgformatter( ErrorLogger::TypeMsg::ERROR, __oss2.str(), __oss3.str(), line ); \ + ErrorLogger::ErrorMsg structMsg = logger.errorMsgFormatter( ErrorLogger::TypeMsg::ERROR, __oss2.str(), \ + __oss3.str(), line, __VA_ARGS__ ); \ logger.errorMsgWritter( structMsg ); \ throw TYPE( __oss.str() ); \ } \ @@ -176,8 +182,13 @@ */ #define GEOS_THROW_IF( EXP, msg, TYPE ) LVARRAY_THROW_IF( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) -// Test copy -#define GEOS_THROW_IF_TEST( EXP, msg, TYPE ) LVARRAY_THROW_IF_TEST( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +/** + * @brief Conditionally throw an exception. + * @param EXP an expression that will be evaluated as a predicate + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define GEOS_THROW_IF_TEST( EXP, msg, TYPE, ... ) LVARRAY_THROW_IF_TEST( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE, __VA_ARGS__ ) /** * @brief Raise a hard error and terminate the program. diff --git a/src/coreComponents/dataRepository/Group.hpp b/src/coreComponents/dataRepository/Group.hpp index a548ed8743d..3a5c2ad9380 100644 --- a/src/coreComponents/dataRepository/Group.hpp +++ b/src/coreComponents/dataRepository/Group.hpp @@ -321,7 +321,7 @@ class Group GEOS_THROW_IF_TEST( child == nullptr, "Group " << getDataContext() << " has no child named " << key << std::endl << dumpSubGroupsNames(), - std::domain_error ); + std::domain_error, getDataContext().getTypeName(), getDataContext().getFilePath(), getDataContext().getLine(), getDataContext().getOffsetInLine(), getDataContext.getOffset() ); T * const castedChild = dynamicCast< T * >( child ); GEOS_THROW_IF( castedChild == nullptr, GEOS_FMT( "{} was expected to be a '{}'.", From 2f7660c7566786b99c1ea12b68905c0a1b514d9a Mon Sep 17 00:00:00 2001 From: amandinehry Date: Mon, 5 May 2025 15:17:13 +0200 Subject: [PATCH 007/173] draft: retrieve data contexts info --- .../common/logger/ErrorHandling.cpp | 20 +++++++------ .../common/logger/ErrorHandling.hpp | 29 ++++++++++++------- src/coreComponents/common/logger/Logger.hpp | 16 ++++++---- .../common/unitTests/testErrorHandling.cpp | 4 +-- .../dataRepository/DataContext.hpp | 14 ++++++++- src/coreComponents/dataRepository/Group.hpp | 2 +- 6 files changed, 56 insertions(+), 29 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 79aad79e669..d26fb739722 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -26,21 +26,20 @@ namespace geos { + ErrorLogger errorLogger; - std::string ErrorLogger::toString( ErrorLogger::TypeMsg type ) + std::string ErrorLogger::toString( ErrorLogger::MsgType type ) { switch ( type ) { - case ErrorLogger::TypeMsg::ERROR: return "Error"; - case ErrorLogger::TypeMsg::WARNING: return "Warning"; + case ErrorLogger::MsgType::Error: return "Error"; + case ErrorLogger::MsgType::Warning: return "Warning"; default: return "Unknown"; } } - void ErrorLogger::errorMsgWritter( ErrorLogger::ErrorMsg const & errorMsg ) + void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) { - ErrorLogger logger; - std::string filename = "errors.yaml"; std::ifstream checkYamlFile( filename ); bool isEmpty = checkYamlFile.peek() == std::ifstream::traits_type::eof(); @@ -54,10 +53,13 @@ namespace geos yamlFile << "errors: \n"; } yamlFile << GEOS_FMT( "{:>2}- type: {}\n", " ", errorMsg.msg ); - yamlFile << GEOS_FMT( "{:>4}message: {}\n", " ", logger.toString( errorMsg.type ) ); - yamlFile << GEOS_FMT( "{:>4}location:\n", " " ); + yamlFile << GEOS_FMT( "{:>4}message: {}\n", " ", errorLogger.toString( errorMsg.type ) ); + yamlFile << GEOS_FMT( "{:>4}inputFileLocation:\n", " " ); yamlFile << GEOS_FMT( "{:>6}- file: {}\n", " ", errorMsg.file ); - yamlFile << GEOS_FMT( "{:>6}- line: {}\n\n", " ", errorMsg.line ); + yamlFile << GEOS_FMT( "{:>8}line: {}\n\n", " ", errorMsg.line ); + yamlFile << GEOS_FMT( "{:>4}sourceLocation:\n", " " ); + yamlFile << GEOS_FMT( "{:>6}file: {}\n", " ", errorMsg.inputFileName ); + yamlFile << GEOS_FMT( "{:>6}line: {}\n\n", " ", errorMsg.inputFileLine ); yamlFile.close(); std::cout << "YAML file created successfully.\n"; } diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index e72dd5dd2e6..10c47b4af59 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -41,10 +41,10 @@ class ErrorLogger * @enum TypeMsg * Enum listing the different types of possible errors */ - enum class TypeMsg + enum class MsgType { - ERROR, - WARNING + Error, + Warning }; /** @@ -53,14 +53,19 @@ class ErrorLogger */ struct ErrorMsg { - TypeMsg type; + MsgType type; std::string msg; std::string file; integer line; + std::vector< std::map< std::string, std::string > > contextsInfo; + // std::vector< std::string > sourceCallStack; + // TODO: Ajouter une méthode addDataContext/addContext (0,1 ou *) + // Liste de contextes avec des fichiers et des lignes + void addContextInfo( std::map< std::string, std::string > && contextsInfo ); }; /** - * @brief Structured the message based on the provided parameters + * @brief Serialize the message based on the provided parameters * * @param type The type of the message (error or warning) * @param msg The error/warning message content @@ -68,24 +73,28 @@ class ErrorLogger * @param line The line where the error occured * @return ErrorMsg */ - ErrorMsg errorMsgformatter( TypeMsg const & type, + ErrorMsg serialize( MsgType const & type, std::string const & msg, std::string const & file, - integer line ) + integer line, + std::vector< std::map< std::string, std::string > > contextsInfo ) + // std::vector< std::string > sourceCallStack ) { - return { type, msg, file, line }; + return { type, msg, file, line, contextsInfo }; }; - std::string toString( TypeMsg type ); + std::string toString( MsgType type ); /** * @brief Add the error/warning message into the yaml file * * @param errorMsg The error message informations formatted by the associated structure */ - void errorMsgWritter( ErrorMsg const & errorMsg ); + void write( ErrorMsg const & errorMsg ); }; +extern ErrorLogger errorLogger; + } /* namespace geos */ # endif \ No newline at end of file diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 22905437cbb..84c7c8a96c2 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -151,12 +151,11 @@ * @param MSG a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define LVARRAY_THROW_IF_TEST( EXP, MSG, TYPE, ... ) \ +#define LVARRAY_THROW_IF_TEST( EXP, MSG, TYPE, INPUTFILENAME, INPUTFILELINE ) \ do \ { \ if( EXP ) \ { \ - ErrorLogger logger; \ std::ostringstream __oss; \ __oss << "\n"; \ __oss << "***** LOCATION: " LOCATION "\n"; \ @@ -167,9 +166,14 @@ __oss2 << MSG; \ __oss3 << __FILE__; \ integer line = __LINE__; \ - ErrorLogger::ErrorMsg structMsg = logger.errorMsgFormatter( ErrorLogger::TypeMsg::ERROR, __oss2.str(), \ - __oss3.str(), line, __VA_ARGS__ ); \ - logger.errorMsgWritter( structMsg ); \ + ErrorLogger::ErrorMsg msgStruct = errorLogger.serialize( ErrorLogger::MsgType::Error, \ + __oss2.str(), \ + __oss3.str(), \ + line, \ + INPUTFILENAME, \ + INPUTFILELINE ); \ + + errorLogger.write( msgStruct ); \ throw TYPE( __oss.str() ); \ } \ } while( false ) @@ -188,7 +192,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_TEST( EXP, msg, TYPE, ... ) LVARRAY_THROW_IF_TEST( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE, __VA_ARGS__ ) +#define GEOS_THROW_IF_TEST( EXP, msg, TYPE, DATACONTEXT ) LVARRAY_THROW_IF_TEST( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE, GEOS_DATACONTEXT_INFORMATION( DATACONTEXT ) ) /** * @brief Raise a hard error and terminate the program. diff --git a/src/coreComponents/common/unitTests/testErrorHandling.cpp b/src/coreComponents/common/unitTests/testErrorHandling.cpp index a33f6cfde7d..3281ce9b836 100644 --- a/src/coreComponents/common/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/common/unitTests/testErrorHandling.cpp @@ -22,8 +22,8 @@ using namespace geos; TEST( ErrorHandling, testYaml ) { ErrorLogger logger; - ErrorLogger::ErrorMsg structMsg = logger.errorMsgformatter( ErrorLogger::TypeMsg::ERROR, "contenu du message", "nom du fichier dev", 24 ); - logger.errorMsgWritter( structMsg ); + ErrorLogger::ErrorMsg msgStruct = logger.errorMsgFormatter( ErrorLogger::MsgType::Error, "msg content", "dev file name", 24, "input file name", 42 ); + logger.errorMsgWritter( msgStruct ); } int main( int ac, char * av[] ) diff --git a/src/coreComponents/dataRepository/DataContext.hpp b/src/coreComponents/dataRepository/DataContext.hpp index ee3abd0f1c1..69f3c1deeb0 100644 --- a/src/coreComponents/dataRepository/DataContext.hpp +++ b/src/coreComponents/dataRepository/DataContext.hpp @@ -30,7 +30,6 @@ namespace geos namespace dataRepository { - /** * @class DataContext * @@ -60,6 +59,10 @@ class DataContext */ virtual string toString() const = 0; + // TODO: Implémenter cette méthode pour chacune des classe qui en hérite + // Dans le cpp de chacune des classes car virtuelle pure + virtual std::map< std::string, std::string > getContextInfo() const = 0; + /** * @return Get the target object name */ @@ -155,6 +158,9 @@ class DataFileContext final : public DataContext */ string toString() const override; + // à compléter + string getContextInfo() const override; // Puis implémenter dans le cpp + /** * @return the type name in the source file (XML node tag name / attribute name). */ @@ -207,6 +213,12 @@ class DataFileContext final : public DataContext }; +// TODO: +// GEOS_THROW_IF_TEST manière de sortir une erreur sans contexte +// addContext fais le lien entre GEOS_THROW_CTX_IF +// Macro avec contextes ajoutés et macro quib n'en a pas +// Variation de GEOS_THROW_IF_TEST qui ajoute des données de contexte +// #define GEOS_THROW_CTX_IF( ctx ) ctx.getFilePath(), ctx.getLine() à remplacer } /* namespace dataRepository */ } /* namespace geos */ diff --git a/src/coreComponents/dataRepository/Group.hpp b/src/coreComponents/dataRepository/Group.hpp index 3a5c2ad9380..a548ed8743d 100644 --- a/src/coreComponents/dataRepository/Group.hpp +++ b/src/coreComponents/dataRepository/Group.hpp @@ -321,7 +321,7 @@ class Group GEOS_THROW_IF_TEST( child == nullptr, "Group " << getDataContext() << " has no child named " << key << std::endl << dumpSubGroupsNames(), - std::domain_error, getDataContext().getTypeName(), getDataContext().getFilePath(), getDataContext().getLine(), getDataContext().getOffsetInLine(), getDataContext.getOffset() ); + std::domain_error ); T * const castedChild = dynamicCast< T * >( child ); GEOS_THROW_IF( castedChild == nullptr, GEOS_FMT( "{} was expected to be a '{}'.", From 60365510595ce946db8f54a0cc1b8cab68653e65 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Mon, 5 May 2025 17:06:35 +0200 Subject: [PATCH 008/173] Added additional information in the yaml - not functional missing the link between GEOS_THROW_CTX_IF and LVARRAY_THROW_IF_TEST( EXP, MSG, TYPE ) --- .../common/logger/ErrorHandling.cpp | 10 +- .../common/logger/ErrorHandling.hpp | 37 +- src/coreComponents/common/logger/Logger.hpp | 15 +- .../common/unitTests/testErrorHandling.cpp | 37 +- .../dataRepository/DataContext.cpp | 11 +- .../dataRepository/DataContext.hpp | 18 +- .../dataRepository/GeosxState.cpp | 198 +++++ .../dataRepository/GroupContext.cpp | 8 + .../dataRepository/GroupContext.hpp | 6 + src/coreComponents/dataRepository/Logger.hpp | 625 +++++++++++++++ src/coreComponents/dataRepository/Macros.hpp | 735 ++++++++++++++++++ .../dataRepository/WrapperContext.cpp | 7 + .../dataRepository/WrapperContext.hpp | 4 + .../dataRepository/staircase_co2_wells_3d.xml | 261 +++++++ .../dataRepository/testErrorHandling.cpp | 34 + 15 files changed, 1950 insertions(+), 56 deletions(-) create mode 100644 src/coreComponents/dataRepository/GeosxState.cpp create mode 100644 src/coreComponents/dataRepository/Logger.hpp create mode 100644 src/coreComponents/dataRepository/Macros.hpp create mode 100644 src/coreComponents/dataRepository/staircase_co2_wells_3d.xml create mode 100644 src/coreComponents/dataRepository/testErrorHandling.cpp diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index d26fb739722..93163ac0b2a 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -23,11 +23,17 @@ // System includes #include #include +#include namespace geos { ErrorLogger errorLogger; + void ErrorLogger::ErrorMsg::addContextInfo( std::map< std::string, std::string > && info ) + { + ErrorLogger::ErrorMsg::contextsInfo.emplace_back( std::move( info ) ); + } + std::string ErrorLogger::toString( ErrorLogger::MsgType type ) { switch ( type ) @@ -56,10 +62,8 @@ namespace geos yamlFile << GEOS_FMT( "{:>4}message: {}\n", " ", errorLogger.toString( errorMsg.type ) ); yamlFile << GEOS_FMT( "{:>4}inputFileLocation:\n", " " ); yamlFile << GEOS_FMT( "{:>6}- file: {}\n", " ", errorMsg.file ); - yamlFile << GEOS_FMT( "{:>8}line: {}\n\n", " ", errorMsg.line ); + yamlFile << GEOS_FMT( "{:>8}line: {}\n", " ", errorMsg.line ); yamlFile << GEOS_FMT( "{:>4}sourceLocation:\n", " " ); - yamlFile << GEOS_FMT( "{:>6}file: {}\n", " ", errorMsg.inputFileName ); - yamlFile << GEOS_FMT( "{:>6}line: {}\n\n", " ", errorMsg.inputFileLine ); yamlFile.close(); std::cout << "YAML file created successfully.\n"; } diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 10c47b4af59..2e18a4be67d 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -59,28 +59,23 @@ class ErrorLogger integer line; std::vector< std::map< std::string, std::string > > contextsInfo; // std::vector< std::string > sourceCallStack; - // TODO: Ajouter une méthode addDataContext/addContext (0,1 ou *) - // Liste de contextes avec des fichiers et des lignes - void addContextInfo( std::map< std::string, std::string > && contextsInfo ); - }; - /** - * @brief Serialize the message based on the provided parameters - * - * @param type The type of the message (error or warning) - * @param msg The error/warning message content - * @param file The file name where the error occured - * @param line The line where the error occured - * @return ErrorMsg - */ - ErrorMsg serialize( MsgType const & type, - std::string const & msg, - std::string const & file, - integer line, - std::vector< std::map< std::string, std::string > > contextsInfo ) - // std::vector< std::string > sourceCallStack ) - { - return { type, msg, file, line, contextsInfo }; + /** + * @brief Construct a new Error Msg object + * + * @param t The type of the message (error or warning) + * @param m The error/warning message content + * @param f The file name where the error occured + * @param l The line where the error occured + */ + ErrorMsg( MsgType t, std::string m, std::string f, integer l ) : type( t ), msg( m ), file( f ), line( l ) {} + + /** + * @brief Add contextual information about the error/warning message to the ErrorMsg structure + * + * @param info + */ + void addContextInfo( std::map< std::string, std::string > && info ); }; std::string toString( MsgType type ); diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 84c7c8a96c2..bc74876fa56 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -151,7 +151,7 @@ * @param MSG a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define LVARRAY_THROW_IF_TEST( EXP, MSG, TYPE, INPUTFILENAME, INPUTFILELINE ) \ +#define LVARRAY_THROW_IF_TEST( EXP, MSG, TYPE ) \ do \ { \ if( EXP ) \ @@ -166,13 +166,10 @@ __oss2 << MSG; \ __oss3 << __FILE__; \ integer line = __LINE__; \ - ErrorLogger::ErrorMsg msgStruct = errorLogger.serialize( ErrorLogger::MsgType::Error, \ - __oss2.str(), \ - __oss3.str(), \ - line, \ - INPUTFILENAME, \ - INPUTFILELINE ); \ - + ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ + __oss2.str(), \ + __oss3.str(), \ + line ); \ errorLogger.write( msgStruct ); \ throw TYPE( __oss.str() ); \ } \ @@ -192,7 +189,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_TEST( EXP, msg, TYPE, DATACONTEXT ) LVARRAY_THROW_IF_TEST( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE, GEOS_DATACONTEXT_INFORMATION( DATACONTEXT ) ) +#define GEOS_THROW_IF_TEST( EXP, msg, TYPE ) LVARRAY_THROW_IF_TEST( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) /** * @brief Raise a hard error and terminate the program. diff --git a/src/coreComponents/common/unitTests/testErrorHandling.cpp b/src/coreComponents/common/unitTests/testErrorHandling.cpp index 3281ce9b836..89da4f26b9f 100644 --- a/src/coreComponents/common/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/common/unitTests/testErrorHandling.cpp @@ -13,22 +13,29 @@ * ------------------------------------------------------------------------------------------------------------ */ -#include "common/logger/ErrorHandling.hpp" +// #include "common/logger/ErrorHandling.hpp" -#include +// #include -using namespace geos; +// using namespace geos; -TEST( ErrorHandling, testYaml ) -{ - ErrorLogger logger; - ErrorLogger::ErrorMsg msgStruct = logger.errorMsgFormatter( ErrorLogger::MsgType::Error, "msg content", "dev file name", 24, "input file name", 42 ); - logger.errorMsgWritter( msgStruct ); -} +// TEST( ErrorHandling, testYaml ) +// { +// ErrorLogger logger; -int main( int ac, char * av[] ) -{ - ::testing::InitGoogleTest( &ac, av ); - int const result = RUN_ALL_TESTS(); - return result; -} \ No newline at end of file +// std::vector> vect; +// std::map map; +// map["inputFile"] = "./simpleCo2Inj.xml"; +// map["inputLineLine"] = "42"; +// vect.push_back( map ); + +// ErrorLogger::ErrorMsg msgStruct = logger.serialize( ErrorLogger::MsgType::Error, "msg content", "dev file name", 24, vect ); +// logger.write( msgStruct ); +// } + +// int main( int ac, char * av[] ) +// { +// ::testing::InitGoogleTest( &ac, av ); +// int const result = RUN_ALL_TESTS(); +// return result; +// } \ No newline at end of file diff --git a/src/coreComponents/dataRepository/DataContext.cpp b/src/coreComponents/dataRepository/DataContext.cpp index d34ab4b72c1..d4f4b79a7a4 100644 --- a/src/coreComponents/dataRepository/DataContext.cpp +++ b/src/coreComponents/dataRepository/DataContext.cpp @@ -108,10 +108,17 @@ string DataFileContext::toString() const } } -DataContext::ToStringInfo DataFileContext::getToStringInfo() const -{ return ToStringInfo( m_targetName, m_filePath, m_line ); } +std::map< std::string, std::string > DataFileContext::getContextInfo() const +{ + std::map contextInfo; + contextInfo["inputFile"] = m_filePath; + contextInfo["inputFileLine"] = m_line; + return contextInfo; +} +DataContext::ToStringInfo DataFileContext::getToStringInfo() const +{ return ToStringInfo( m_targetName, m_filePath, m_line ); } } /* namespace dataRepository */ } /* namespace geos */ diff --git a/src/coreComponents/dataRepository/DataContext.hpp b/src/coreComponents/dataRepository/DataContext.hpp index 69f3c1deeb0..6fe472166dd 100644 --- a/src/coreComponents/dataRepository/DataContext.hpp +++ b/src/coreComponents/dataRepository/DataContext.hpp @@ -59,8 +59,11 @@ class DataContext */ virtual string toString() const = 0; - // TODO: Implémenter cette méthode pour chacune des classe qui en hérite - // Dans le cpp de chacune des classes car virtuelle pure + /** + * @brief Returns contextual information, including the file name and the line number + * + * @return std::map< std::string, std::string > + */ virtual std::map< std::string, std::string > getContextInfo() const = 0; /** @@ -158,8 +161,10 @@ class DataFileContext final : public DataContext */ string toString() const override; - // à compléter - string getContextInfo() const override; // Puis implémenter dans le cpp + /** + * @return a map containing contextual information, including the file name and the line number + */ + std::map< std::string, std::string > getContextInfo() const override; /** * @return the type name in the source file (XML node tag name / attribute name). @@ -216,9 +221,10 @@ class DataFileContext final : public DataContext // TODO: // GEOS_THROW_IF_TEST manière de sortir une erreur sans contexte // addContext fais le lien entre GEOS_THROW_CTX_IF -// Macro avec contextes ajoutés et macro quib n'en a pas // Variation de GEOS_THROW_IF_TEST qui ajoute des données de contexte -// #define GEOS_THROW_CTX_IF( ctx ) ctx.getFilePath(), ctx.getLine() à remplacer +#define GEOS_THROW_CTX_IF( errorMsg, ctx ) \ + std::map< std::string, std::string > contextInfo = ctx.getContextInfo(); \ + errorMsg.addContext( contextInfo ); \ } /* namespace dataRepository */ } /* namespace geos */ diff --git a/src/coreComponents/dataRepository/GeosxState.cpp b/src/coreComponents/dataRepository/GeosxState.cpp new file mode 100644 index 00000000000..12cb2baf62a --- /dev/null +++ b/src/coreComponents/dataRepository/GeosxState.cpp @@ -0,0 +1,198 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 TotalEnergies + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2023-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// Source includes +#include "GeosxState.hpp" +#include "dataRepository/Utilities.hpp" +#include "mainInterface/ProblemManager.hpp" +#include "mainInterface/initialization.hpp" +#include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "common/Timer.hpp" + +// TPL includes +#include + +#if defined( GEOS_USE_CALIPER ) + #include +#endif + +// System includes +#include + +namespace geos +{ + +GeosxState * currentGlobalState = nullptr; + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +GeosxState & getGlobalState() +{ + GEOS_ERROR_IF( currentGlobalState == nullptr, + "The state has not been created." ); + + return *currentGlobalState; +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +string durationToString( std::chrono::system_clock::duration const duration ) +{ + // If we want to print HH::MM::SS (maybe in addition to seconds-only): + // return GEOS_FMT( "{:%T}", duration ); + double const seconds = std::chrono::duration_cast< std::chrono::milliseconds >( duration ).count() / 1000.0; + return GEOS_FMT( "{:>20.3f}s", seconds ); +} + +std::ostream & operator<<( std::ostream & os, State const state ) +{ + if( state == State::UNINITIALIZED ) + { + return os << "State::UNINITIALIZED"; + } + if( state == State::INITIALIZED ) + { + return os << "State::INITIALIZED"; + } + if( state == State::READY_TO_RUN ) + { + return os << "State::READY_TO_RUN"; + } + if( state == State::COMPLETED ) + { + return os << "State::COMPLETED"; + } + + GEOS_ERROR( "Unrecognized state. The integral value is: " << static_cast< int >( state ) ); + return os; +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +GeosxState::GeosxState( std::unique_ptr< CommandLineOptions > && commandLineOptions ): + m_state( State::UNINITIALIZED ), + m_commandLineOptions( std::move( commandLineOptions ) ), + m_rootNode( std::make_unique< conduit::Node >() ), + m_problemManager( nullptr ), + m_commTools( std::make_unique< CommunicationTools >() ), +#if defined( GEOS_USE_CALIPER ) + m_caliperManager( std::make_unique< cali::ConfigManager >() ), +#endif + m_initTime(), + m_runTime() +{ + Timer timer( m_initTime ); + +#if defined( GEOS_USE_CALIPER ) + setupCaliper( *m_caliperManager, getCommandLineOptions() ); +#endif + + string restartFileName; + if( ProblemManager::parseRestart( restartFileName, getCommandLineOptions() ) ) + { + GEOS_LOG_RANK_0( "Loading restart file " << restartFileName ); + dataRepository::loadTree( restartFileName, getRootConduitNode() ); + } + + m_problemManager = std::make_unique< ProblemManager >( getRootConduitNode() ); + + GEOS_ERROR_IF( currentGlobalState != nullptr, "Only one state can exist at a time." ); + currentGlobalState = this; +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +GeosxState::~GeosxState() +{ +#if defined( GEOS_USE_CALIPER ) + m_caliperManager->flush(); +#endif + + GEOS_ERROR_IF( currentGlobalState != this, "This shouldn't be possible." ); + currentGlobalState = nullptr; +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool GeosxState::initializeDataRepository() +{ + GEOS_MARK_FUNCTION; + Timer timer( m_initTime ); + + GEOS_THROW_IF_NE( m_state, State::UNINITIALIZED, std::logic_error ); + + getProblemManager().parseCommandLineInput(); + + if( !getProblemManager().getSchemaFileName().empty() ) + { + getProblemManager().generateDocumentation(); + m_state = State::INITIALIZED; + return false; + } + + getProblemManager().parseInputFile(); + getProblemManager().problemSetup(); + + m_state = State::INITIALIZED; + + if( m_commandLineOptions->printMemoryUsage >= 0.0 ) + { + dataRepository::printMemoryAllocation( getProblemManager(), 0, m_commandLineOptions->printMemoryUsage ); + } + + return true; +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void GeosxState::applyInitialConditions() +{ + GEOS_MARK_FUNCTION; + Timer timer( m_initTime ); + + GEOS_THROW_IF_NE( m_state, State::INITIALIZED, std::logic_error ); + + getProblemManager().applyInitialConditions(); + + if( getCommandLineOptions().beginFromRestart ) + { + getProblemManager().readRestartOverwrite(); + } + + m_state = State::READY_TO_RUN; + MpiWrapper::barrier( MPI_COMM_GEOS ); +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void GeosxState::run() +{ + GEOS_MARK_FUNCTION; + Timer timer( m_runTime ); + + GEOS_THROW_IF_NE( m_state, State::READY_TO_RUN, std::logic_error ); + + if( !getProblemManager().runSimulation() ) + { + m_state = State::COMPLETED; + } +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +dataRepository::Group & GeosxState::getProblemManagerAsGroup() +{ return getProblemManager(); } + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +FieldSpecificationManager & GeosxState::getFieldSpecificationManager() +{ return getProblemManager().getFieldSpecificationManager(); } + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +FunctionManager & GeosxState::getFunctionManager() +{ return getProblemManager().getFunctionManager(); } + +} // namespace geos diff --git a/src/coreComponents/dataRepository/GroupContext.cpp b/src/coreComponents/dataRepository/GroupContext.cpp index c60880bd768..904faac8605 100644 --- a/src/coreComponents/dataRepository/GroupContext.cpp +++ b/src/coreComponents/dataRepository/GroupContext.cpp @@ -54,6 +54,14 @@ string GroupContext::toString() const return path.str(); } +std::map< std::string, std::string > GroupContext::getContextInfo() const +{ + std::map contextInfo; + contextInfo["dataPath"] = m_targetName; + + return contextInfo; +} + DataContext::ToStringInfo GroupContext::getToStringInfo() const { return ToStringInfo( m_targetName ); } diff --git a/src/coreComponents/dataRepository/GroupContext.hpp b/src/coreComponents/dataRepository/GroupContext.hpp index 166543b883f..98259193a92 100644 --- a/src/coreComponents/dataRepository/GroupContext.hpp +++ b/src/coreComponents/dataRepository/GroupContext.hpp @@ -68,6 +68,12 @@ class GroupContext : public DataContext * @return the group path with the file & line of the first parent for which this information exists. */ string toString() const override; + + /** + * @return a map containing contextual information, including the targetName of the DataContext + */ + std::map< std::string, std::string > getContextInfo() const override; + /** * @copydoc DataContext::getToStringInfo() */ diff --git a/src/coreComponents/dataRepository/Logger.hpp b/src/coreComponents/dataRepository/Logger.hpp new file mode 100644 index 00000000000..901dc65eab7 --- /dev/null +++ b/src/coreComponents/dataRepository/Logger.hpp @@ -0,0 +1,625 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 TotalEnergies + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2023-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file Logger.hpp + */ + +#ifndef GEOS_COMMON_LOGGER_HPP +#define GEOS_COMMON_LOGGER_HPP + +// Source incldes +#include "common/GeosxConfig.hpp" +#include "common/GeosxMacros.hpp" +#include "common/format/Format.hpp" +#include "LvArray/src/Macros.hpp" +#include "common/logger/ErrorHandling.hpp" + +// System includes +#include +#include +#include + +#if defined(GEOS_USE_MPI) + #include +#endif + +/** + * @brief Log a message on screen. + * @details The expression to log must evaluate something that can be stream inserted. + */ +#define GEOS_LOG( ... ) LVARRAY_LOG( __VA_ARGS__ ) + +/** + * @brief Log an expression and its value on screen. + * @details The expression to log must evaluate something that can be stream inserted. + */ +#define GEOS_LOG_VAR( ... ) LVARRAY_LOG_VAR( __VA_ARGS__ ) + + +/** + * @brief Conditionally log a message. + * @param EXP an expression that will be evaluated as a predicate + * @param msg a message to log (any expression that can be stream inserted) + */ +#if defined(GEOS_DEVICE_COMPILE) +#define GEOS_LOG_IF( EXP, msg ) +#else +#define GEOS_LOG_IF( EXP, msg ) \ + do { \ + if( EXP ) \ + { \ + std::cout<< msg << std::endl; \ + } \ + } while( false ) +#endif + + +/** + * @brief Conditionally log a message on screen on rank 0. + * @param EXP an expression that will be evaluated as a predicate + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_LOG_RANK_0_IF( EXP, msg ) \ + do { \ + if( ::geos::logger::internal::rank == 0 && EXP ) \ + { \ + std::ostringstream oss; \ + oss << msg; \ + std::cout << oss.str() << std::endl; \ + } \ + } while( false ) + +/** + * @brief Conditionally log a message on screen on rank 0 without line breaking. + * @param EXP an expression that will be evaluated as a predicate + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_LOG_RANK_0_IF_NLR( EXP, msg ) \ + do { \ + if( ::geos::logger::internal::rank == 0 && EXP ) \ + { \ + std::ostringstream oss; \ + oss << msg; \ + std::cout << oss.str(); \ + } \ + } while( false ) + +/** + * @brief Log a message on screen on rank 0. + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_LOG_RANK_0( msg ) GEOS_LOG_RANK_0_IF( true, msg ) + +/** + * @brief Conditionally log a message to the rank output stream. + * @param EXP an expression that will be evaluated as a predicate + * @param msg a message to log (any expression that can be stream inserted) + */ +#if defined(GEOS_DEVICE_COMPILE) +#define GEOS_LOG_RANK_IF( EXP, msg ) +#else +#define GEOS_LOG_RANK_IF( EXP, msg ) \ + do { \ + if( EXP ) \ + { \ + std::ostringstream oss; \ + oss << "Rank " << ::geos::logger::internal::rankString << ": " << msg; \ + *logger::internal::rankStream << oss.str() << std::endl; \ + } \ + } while( false ) +#endif + +/** + * @brief Log a message to the rank output stream. + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_LOG_RANK( msg ) GEOS_LOG_RANK_IF( true, msg ) + +/** + * @brief Log a variable/expression name and value on screen to the rank output stream. + * @param var a variable or expression accessible from current scope that can be stream inserted + */ +#define GEOS_LOG_RANK_VAR( var ) GEOS_LOG_RANK( #var " = " << var ) + +/** + * @brief Conditionally raise a hard error and terminate the program. + * @param EXP an expression that will be evaluated as a predicate + * @param msg a message to log (any expression that can be stream inserted) + */ +#if defined(GEOS_DEVICE_COMPILE) +#define GEOS_ERROR_IF( EXP, msg ) LVARRAY_ERROR_IF( EXP, msg ) +#else +#define GEOS_ERROR_IF( EXP, msg ) LVARRAY_ERROR_IF( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#endif + +/** + * @brief Conditionally throw an exception. + * @param EXP an expression that will be evaluated as a predicate + * @param MSG a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define LVARRAY_THROW_IF_TEST( EXP, MSG, TYPE, ... ) \ + do \ + { \ + if( EXP ) \ + { \ + ErrorLogger logger; \ + std::ostringstream __oss; \ + __oss << "\n"; \ + __oss << "***** LOCATION: " LOCATION "\n"; \ + __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ + __oss << MSG << "\n"; \ + __oss << LvArray::system::stackTrace( true ); \ + std::ostringstream __oss2, __oss3; \ + __oss2 << MSG; \ + __oss3 << __FILE__; \ + integer line = __LINE__; \ + ErrorLogger::ErrorMsg structMsg = logger.errorMsgformatter( ErrorLogger::TypeMsg::ERROR, __oss2.str(), \ + __oss3.str(), line ); \ + logger.errorMsgWritter( structMsg ); \ + throw TYPE( __oss.str() ); \ + } \ + } while( false ) + +/** + * @brief Conditionally throw an exception. + * @param EXP an expression that will be evaluated as a predicate + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define GEOS_THROW_IF( EXP, msg, TYPE ) LVARRAY_THROW_IF( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) + +/** + * @brief Conditionally throw an exception. + * @param EXP an expression that will be evaluated as a predicate + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define GEOS_THROW_IF_TEST( EXP, msg, TYPE, ... ) LVARRAY_THROW_IF_TEST( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE, __VA_ARGS__ ) + +/** + * @brief Raise a hard error and terminate the program. + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ERROR( msg ) GEOS_ERROR_IF( true, msg ) + +/** + * @brief Throw an exception. + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define GEOS_THROW( msg, TYPE ) GEOS_THROW_IF( true, msg, TYPE ) + +/** + * @brief Assert a condition in debug builds. + * @param EXP an expression that will be evaluated as a predicate + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ASSERT_MSG( EXP, msg ) LVARRAY_ASSERT_MSG( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) + +/** + * @brief Assert a condition in debug builds. + * @param EXP an expression that will be evaluated as a predicate + */ +#define GEOS_ASSERT( EXP ) GEOS_ASSERT_MSG( EXP, "" ) + +/** + * @brief Conditionally report a warning. + * @param EXP an expression that will be evaluated as a predicate + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_WARNING_IF( EXP, msg ) LVARRAY_WARNING_IF( EXP, msg ) + +/** + * @brief Report a warning. + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_WARNING( msg ) LVARRAY_WARNING( msg ) + +/** + * @brief Conditionally log an info message. + * @param EXP an expression that will be evaluated as a predicate + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_INFO_IF( EXP, msg ) LVARRAY_INFO_IF( EXP, msg ) + +/** + * @brief Log an info message. + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_INFO( msg ) LVARRAY_INFO( msg ) + +/** + * @brief Raise a hard error if two values are equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ERROR_IF_EQ_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_EQ_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) + +/** + * @brief Raise a hard error if two values are equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define GEOS_THROW_IF_EQ_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_EQ_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) + +/** + * @brief Raise a hard error if two values are equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define GEOS_ERROR_IF_EQ( lhs, rhs ) GEOS_ERROR_IF_EQ_MSG( lhs, rhs, "" ) + +/** + * @brief Raise a hard error if two values are equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param TYPE the type of exception to throw + */ +#define GEOS_THROW_IF_EQ( lhs, rhs, TYPE ) GEOS_THROW_IF_EQ_MSG( lhs, rhs, "", TYPE ) + +/** + * @brief Raise a hard error if two values are not equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ERROR_IF_NE_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_NE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) + +/** + * @brief Throw an exception if two values are not equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define GEOS_THROW_IF_NE_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_NE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) + +/** + * @brief Raise a hard error if two values are not equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define GEOS_ERROR_IF_NE( lhs, rhs ) GEOS_ERROR_IF_NE_MSG( lhs, rhs, "" ) + +/** + * @brief Throw an exception if two values are not equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param TYPE the type of exception to throw + */ +#define GEOS_THROW_IF_NE( lhs, rhs, TYPE ) GEOS_THROW_IF_NE_MSG( lhs, rhs, "", TYPE ) + +/** + * @brief Raise a hard error if one value compares greater than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ERROR_IF_GT_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_GT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) + +/** + * @brief Throw an exception if one value compares greater than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define GEOS_THROW_IF_GT_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_GT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) + +/** + * @brief Raise a hard error if one value compares greater than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define GEOS_ERROR_IF_GT( lhs, rhs ) GEOS_ERROR_IF_GT_MSG( lhs, rhs, "" ) + +/** + * @brief Throw an exception if one value compares greater than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param TYPE the type of exception to throw + */ +#define GEOS_THROW_IF_GT( lhs, rhs, TYPE ) GEOS_ERROR_IF_GT_MSG( lhs, rhs, "", TYPE ) + +/** + * @brief Raise a hard error if one value compares greater than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ERROR_IF_GE_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_GE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) + +/** + * @brief Throw an exception if one value compares greater than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define GEOS_THROW_IF_GE_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_GE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) + +/** + * @brief Raise a hard error if one value compares greater than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define GEOS_ERROR_IF_GE( lhs, rhs ) GEOS_ERROR_IF_GE_MSG( lhs, rhs, "" ) + +/** + * @brief Throw an exception if one value compares greater than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param TYPE the type of exception to throw + */ +#define GEOS_THROW_IF_GE( lhs, rhs, TYPE ) GEOS_ERROR_IF_GE_MSG( lhs, rhs, "", TYPE ) + +/** + * @brief Raise a hard error if one value compares less than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ERROR_IF_LT_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_LT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) + +/** + * @brief Throw an exception if one value compares less than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define GEOS_THROW_IF_LT_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_LT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) + +/** + * @brief Raise a hard error if one value compares less than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define GEOS_ERROR_IF_LT( lhs, rhs ) GEOS_ERROR_IF_LT_MSG( lhs, rhs, "" ) + +/** + * @brief Throw an exception if one value compares less than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param TYPE the type of exception to throw + */ +#define GEOS_THROW_IF_LT( lhs, rhs, TYPE ) GEOS_ERROR_IF_LT_MSG( lhs, rhs, "", TYPE ) + +/** + * @brief Raise a hard error if one value compares less than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ERROR_IF_LE_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_LE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) + +/** + * @brief Throw an exception if one value compares less than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define GEOS_THROW_IF_LE_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_LE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) + +/** + * @brief Raise a hard error if one value compares less than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define GEOS_ERROR_IF_LE( lhs, rhs ) GEOS_ERROR_IF_LE_MSG( lhs, rhs, "" ) + +/** + * @brief Throw an exception if one value compares less than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param TYPE the type of exception to throw + */ +#define GEOS_THROW_IF_LE( lhs, rhs, TYPE ) GEOS_ERROR_IF_LE_MSG( lhs, rhs, "", TYPE ) + +/** + * @brief Assert that two values compare equal in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ASSERT_EQ_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_EQ_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) + +/** + * @brief Assert that two values compare equal in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define GEOS_ASSERT_EQ( lhs, rhs ) GEOS_ASSERT_EQ_MSG( lhs, rhs, "" ) + +/** + * @brief Assert that two values compare not equal in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ASSERT_NE_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_NE_MSG( lhs, rhs, msg ) + +/** + * @brief Assert that two values compare not equal in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define GEOS_ASSERT_NE( lhs, rhs ) LVARRAY_ASSERT_NE( lhs, rhs ) + +/** + * @brief Assert that one value compares greater than the other in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ASSERT_GT_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_GT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) + +/** + * @brief Assert that one value compares greater than the other in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define GEOS_ASSERT_GT( lhs, rhs ) GEOS_ASSERT_GT_MSG( lhs, rhs, "" ) + +/** + * @brief Assert that one value compares greater than or equal to the other in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ASSERT_GE_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_GE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) + +/** + * @brief Assert that one value compares greater than or equal to the other in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define GEOS_ASSERT_GE( lhs, rhs ) GEOS_ASSERT_GE_MSG( lhs, rhs, "" ) + +namespace geos +{ + +/** + * @brief Exception class used to report errors in user input. + */ +struct InputError : public std::runtime_error +{ + /** + * @brief Constructor + * @param what the error message + */ + InputError( std::string const & what ): + std::runtime_error( what ) + {} + + /** + * @brief Constructor + * @param what the error message + */ + InputError( char const * const what ): + std::runtime_error( what ) + {} + + /** + * @brief Constructs an InputError from an underlying exception. + * @param subException The exception on which the created one is based. + * @param msgToInsert The error message that will be inserted in the subException error message. + */ + InputError( std::exception const & subException, std::string const & msgToInsert ); +}; + +/** + * @brief Exception class used to report errors in user input. + */ +struct SimulationError : public std::runtime_error +{ + /** + * @brief Constructor + * @param what the error message + */ + SimulationError( std::string const & what ): + std::runtime_error( what ) + {} + + /** + * @brief Constructor + * @param what the error message + */ + SimulationError( char const * const what ): + std::runtime_error( what ) + {} + + /** + * @brief Construct a SimulationError from an underlying exception. + * @param subException An exception to base this new one on. + * @param msgToInsert The error message. + * It will be inserted before the error message inside of subException. + */ + SimulationError( std::exception const & subException, std::string const & msgToInsert ); +}; + +/** + * @brief Exception class used to report errors from type conversion + * @todo (ErrorManager EPIC #2940) Consider adding a way to precise custom exception parameters, to add + * expected & encountered typeid for this one (in order to manage the exception output more precisely). + * We could also manage this by having: BadTypeErrorABC <|--- BadTypeError< T > /!\ compilation time + */ +struct BadTypeError : public std::runtime_error +{ + /** + * @brief Constructor + * @param what the error message + */ + BadTypeError( std::string const & what ): + std::runtime_error( what ) + {} +}; + +/** + * @brief Exception class used for special control flow. + */ +class NotAnError : public std::exception +{}; + +namespace logger +{ + +namespace internal +{ + +extern int rank; + +extern std::string rankString; + +extern int n_ranks; + +extern std::ostream * rankStream; + +#if defined(GEOS_USE_MPI) +extern MPI_Comm comm; +#endif +} // namespace internal + +#if defined(GEOS_USE_MPI) +/** + * @brief Initialize the logger in a parallel build. + * @param comm global MPI communicator + * @param rank_output_dir output directory for rank log files + */ +void InitializeLogger( MPI_Comm comm, const std::string & rank_output_dir="" ); +#endif + +/** + * @brief Initialize the logger in a serial build. + * @param rank_output_dir output directory for rank log files + */ +void InitializeLogger( const std::string & rank_output_dir="" ); + +/** + * @brief Finalize the logger and close the rank streams. + */ +void FinalizeLogger(); + +} // namespace logger + +} // namespace geos + +#endif /* GEOS_COMMON_LOGGER_HPP */ diff --git a/src/coreComponents/dataRepository/Macros.hpp b/src/coreComponents/dataRepository/Macros.hpp new file mode 100644 index 00000000000..e5ec9ff05f9 --- /dev/null +++ b/src/coreComponents/dataRepository/Macros.hpp @@ -0,0 +1,735 @@ +/* + * Copyright (c) 2021, Lawrence Livermore National Security, LLC and LvArray contributors. + * All rights reserved. + * See the LICENSE file for details. + * SPDX-License-Identifier: (BSD-3-Clause) + */ + +/** + * @file Macros.hpp + * @brief Contains a bunch of macro definitions. + */ + +#pragma once + +// Source includes +#include "LvArrayConfig.hpp" +#include "system.hpp" + +// System includes +#include +#include +#include +#include + + +#if defined(LVARRAY_USE_CUDA) || defined(LVARRAY_USE_HIP) +/// Macro defined when using a device. +#define LVARRAY_USE_DEVICE +#endif + +#if defined(LVARRAY_USE_CUDA) +#define LVARRAY_DEFAULT_DEVICE_SPACE MemorySpace::cuda +#elif defined(LVARRAY_USE_HIP) +#define LVARRAY_DEFAULT_DEVICE_SPACE MemorySpace::hip +#endif + +#if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__) +/// Macro defined when currently compiling on device (only defined in the device context). +#define LVARRAY_DEVICE_COMPILE +/// Marks a function/lambda for inlining +#define LVARRAY_FORCE_INLINE __forceinline__ +#else +/// Marks a function/lambda for inlining +#define LVARRAY_FORCE_INLINE inline +#endif + +#if defined(__CUDACC__) || defined(__HIPCC__) +// Denotes whether to define decorator macros later in this file. +#define LVARRAY_DECORATE +#endif + + +//#if !defined(NDEBUG) && defined(LVARRAY_DEVICE_COMPILE) + #include +//#endif + +/** + * @brief Convert @p A into a string. + * @param A the token to convert to a string. + */ +#define STRINGIZE_NX( A ) #A + +/** + * @brief Convert the macro expansion of @p A into a string. + * @param A the token to convert to a string. + */ +#define STRINGIZE( A ) STRINGIZE_NX( A ) + +/** + * @brief Mark @p X as an unused argument, used to silence compiler warnings. + * @param X the unused argument. + */ +#define LVARRAY_UNUSED_ARG( X ) + +/** + * @brief Mark @p X as an unused variable, used to silence compiler warnings. + * @param X the unused variable. + */ +#define LVARRAY_UNUSED_VARIABLE( X ) ( ( void ) X ) + +/** + * @brief Mark @p X as an debug variable, used to silence compiler warnings. + * @param X the debug variable. + */ +#define LVARRAY_DEBUG_VAR( X ) LVARRAY_UNUSED_VARIABLE( X ) + +/// Expands to a string representing the current file and line. +#define LOCATION __FILE__ ":" STRINGIZE( __LINE__ ) + +/** + * @brief Given an expression @p X that evaluates to a pointer, expands to the type pointed to. + * @param X The expression to evaluate. + */ +#define TYPEOFPTR( X ) std::remove_pointer_t< decltype( X ) > + +/** + * @brief Given an expression @p X that evaluates to a reference, expands to the type referred to. + * @param X The expression to evaluate. + */ +#define TYPEOFREF( X ) std::remove_reference_t< decltype( X ) > + +/** + * @brief Print the expression. + */ +#define LVARRAY_LOG( ... ) std::cout << __VA_ARGS__ << std::endl + +/** + * @brief Print the expression string along with its value. + */ +#define LVARRAY_LOG_VAR( ... ) LVARRAY_LOG( STRINGIZE( __VA_ARGS__ ) << " = " << __VA_ARGS__ ) + +/** + * @brief Abort execution if @p EXP is true. + * @param EXP The expression to check. + * @param MSG The message to associate with the error, can be anything streamable to a std::ostream. + * @note This macro can be used in both host and device code. + * @note Tries to provide as much information about the location of the error + * as possible. On host this should result in the file and line of the error + * and a stack trace along with the provided message. On device none of this is + * guaranteed. In fact it is only guaranteed to abort the current kernel. + */ + +#if defined(LVARRAY_DEVICE_COMPILE) +// #if defined(__HIP_DEVICE_COMPILE__) +// // empty impl to avoid the possibility of printfs in device code +// // on AMD, which can cause performance degradation just by being present +// #define LVARRAY_ERROR_IF( EXP, MSG ) + #if (!defined(NDEBUG)) || defined(__HIP_DEVICE_COMPILE__) +#define LVARRAY_ERROR_IF( EXP, MSG ) \ + do \ + { \ + if( EXP ) \ + { \ + assert( false && "EXP = " STRINGIZE( EXP ) "MSG = " STRINGIZE( MSG ) ); \ + } \ + } while( false ) + #else +#define LVARRAY_ERROR_IF( EXP, MSG ) \ + do \ + { \ + if( EXP ) \ + { \ + constexpr char const * formatString = "***** ERROR\n" \ + "***** LOCATION: " LOCATION "\n" \ + "***** Block: [%u, %u, %u]\n" \ + "***** Thread: [%u, %u, %u]\n" \ + "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n" \ + "***** MSG: " STRINGIZE( MSG ) "\n\n"; \ + printf( formatString, blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z ); \ + asm ( "trap;" ); \ + } \ + } while( false ) + #endif +#else +#define LVARRAY_ERROR_IF( EXP, MSG ) \ + do \ + { \ + if( EXP ) \ + { \ + std::ostringstream __oss; \ + __oss << "***** ERROR\n"; \ + __oss << "***** LOCATION: " LOCATION "\n"; \ + __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ + __oss << MSG << "\n"; \ + __oss << LvArray::system::stackTrace( true ); \ + std::cout << __oss.str() << std::endl; \ + LvArray::system::callErrorHandler(); \ + } \ + } while( false ) +#endif + +/** + * @brief Abort execution. + * @param MSG The message to associate with the error, can be anything streamable to a std::ostream. + */ +#define LVARRAY_ERROR( MSG ) LVARRAY_ERROR_IF( true, MSG ) + +/** + * @brief Abort execution if @p EXP is false but only when + * NDEBUG is not defined.. + * @param EXP The expression to check. + * @param MSG The message to associate with the error, can be anything streamable to a std::ostream. + * @note This macro can be used in both host and device code. + * @note Tries to provide as much information about the location of the error + * as possible. On host this should result in the file and line of the error + * and a stack trace along with the provided message. On device none of this is + * guaranteed. In fact it is only guaranteed to abort the current kernel. + */ +#if !defined(NDEBUG) +#define LVARRAY_ASSERT_MSG( EXP, MSG ) LVARRAY_ERROR_IF( !(EXP), MSG ) +#else +#define LVARRAY_ASSERT_MSG( EXP, MSG ) ((void) 0) +#endif + +/** + * @brief Conditionally throw an exception. + * @param EXP an expression that will be evaluated as a predicate + * @param MSG a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define LVARRAY_THROW_IF( EXP, MSG, TYPE ) \ + do \ + { \ + if( EXP ) \ + { \ + std::ostringstream __oss; \ + __oss << "\n"; \ + __oss << "***** LOCATION: " LOCATION "\n"; \ + __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ + __oss << MSG << "\n"; \ + __oss << LvArray::system::stackTrace( true ); \ + throw TYPE( __oss.str() ); \ + } \ + } while( false ) + +/** + * @brief Throw an exception. + * @param MSG The message to associate with the error, can be anything streamable to a std::ostream. + */ +#define LVARRAY_THROW( MSG, TYPE ) LVARRAY_THROW_IF( true, MSG, TYPE ) + +/// Assert @p EXP is true with no message. +#define LVARRAY_ASSERT( EXP ) LVARRAY_ASSERT_MSG( EXP, "" ) + +/** + * @brief Print a warning if @p EXP is true. + * @param EXP The expression to check. + * @param MSG The message to associate with the warning, can be anything streamable to a std::ostream. + */ +#define LVARRAY_WARNING_IF( EXP, MSG ) \ + do \ + { \ + if( EXP ) \ + { \ + std::ostringstream __oss; \ + __oss << "***** WARNING\n"; \ + __oss << "***** LOCATION: " LOCATION "\n"; \ + __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ + __oss << MSG; \ + std::cout << __oss.str() << std::endl; \ + } \ + } while( false ) + +/** + * @brief Print a warning with a message. + * @param MSG The message to print. + */ +#define LVARRAY_WARNING( MSG ) LVARRAY_WARNING_IF( true, MSG ) + +/** + * @brief Print @p msg along with the location if @p EXP is true. + * @param EXP The expression to test. + * @param MSG The message to print. + */ +#define LVARRAY_INFO_IF( EXP, MSG ) \ + do \ + { \ + if( EXP ) \ + { \ + std::ostringstream __oss; \ + __oss << "***** INFO\n"; \ + __oss << "***** LOCATION: " LOCATION "\n"; \ + __oss << "***** Controlling expression: " STRINGIZE( EXP ) "\n"; \ + __oss << MSG; \ + std::cout << __oss.str() << std::endl; \ + } \ + } while( false ) + +/** + * @brief Print @p msg along with the location. + * @param msg The message to print. + */ +#define LVARRAY_INFO( msg ) LVARRAY_INFO_IF( true, msg ) + +/** + * @brief Abort execution if @p lhs @p OP @p rhs. + * @param lhs The left side of the operation. + * @param OP The operation to apply. + * @param NOP The opposite of @p OP, used in the message. + * @param rhs The right side of the operation. + * @param msg The message to diplay. + */ +#define LVARRAY_ERROR_IF_OP_MSG( lhs, OP, NOP, rhs, msg ) \ + LVARRAY_ERROR_IF( lhs OP rhs, \ + msg << "\n" << \ + "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ + " " << #lhs << " = " << lhs << "\n" << \ + " " << #rhs << " = " << rhs << "\n" ) + +/** + * @brief Throw an exception if @p lhs @p OP @p rhs. + * @param lhs The left side of the operation. + * @param OP The operation to apply. + * @param NOP The opposite of @p OP, used in the message. + * @param rhs The right side of the operation. + * @param msg The message to diplay. + * @param TYPE the type of exception to throw. + */ +#define LVARRAY_THROW_IF_OP_MSG( lhs, OP, NOP, rhs, msg, TYPE ) \ + LVARRAY_THROW_IF( lhs OP rhs, \ + msg << "\n" << \ + "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ + " " << #lhs << " = " << lhs << "\n" << \ + " " << #rhs << " = " << rhs << "\n", TYPE ) + +/** + * @brief Raise a hard error if two values are equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define LVARRAY_ERROR_IF_EQ_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_OP_MSG( lhs, ==, !=, rhs, msg ) + +/** + * @brief Throw an exception if two values are equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define LVARRAY_THROW_IF_EQ_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_OP_MSG( lhs, ==, !=, rhs, msg, TYPE ) + +/** + * @brief Raise a hard error if two values are equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define LVARRAY_ERROR_IF_EQ( lhs, rhs ) LVARRAY_ERROR_IF_EQ_MSG( lhs, rhs, "" ) + +/** + * @brief Throw an exception if two values are equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param TYPE the type of exception to throw + */ +#define LVARRAY_THROW_IF_EQ( lhs, rhs, TYPE ) LVARRAY_THROW_IF_EQ_MSG( lhs, rhs, "", TYPE ) + +/** + * @brief Raise a hard error if two values are not equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define LVARRAY_ERROR_IF_NE_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_OP_MSG( lhs, !=, ==, rhs, msg ) + +/** + * @brief Throw an exception if two values are not equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define LVARRAY_THROW_IF_NE_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_OP_MSG( lhs, !=, ==, rhs, msg, TYPE ) + +/** + * @brief Raise a hard error if two values are not equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define LVARRAY_ERROR_IF_NE( lhs, rhs ) LVARRAY_ERROR_IF_NE_MSG( lhs, rhs, "" ) + +/** + * @brief Throw an exception if two values are not equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param TYPE the type of exception to throw + */ +#define LVARRAY_THROW_IF_NE( lhs, rhs, TYPE ) LVARRAY_THROW_IF_NE_MSG( lhs, rhs, "", TYPE ) + +/** + * @brief Raise a hard error if one value compares greater than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define LVARRAY_ERROR_IF_GT_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_OP_MSG( lhs, >, <=, rhs, msg ) + +/** + * @brief Throw an exception if one value compares greater than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define LVARRAY_THROW_IF_GT_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_OP_MSG( lhs, >, <=, rhs, msg, TYPE ) + +/** + * @brief Raise a hard error if one value compares greater than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define LVARRAY_ERROR_IF_GT( lhs, rhs ) LVARRAY_ERROR_IF_GT_MSG( lhs, rhs, "" ) + +/** + * @brief Throw an exception if one value compares greater than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param TYPE the type of exception to throw + */ +#define LVARRAY_THROW_IF_GT( lhs, rhs, TYPE ) LVARRAY_THROW_IF_GT_MSG( lhs, rhs, "", TYPE ) + +/** + * @brief Raise a hard error if one value compares greater than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define LVARRAY_ERROR_IF_GE_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_OP_MSG( lhs, >=, <, rhs, msg ) + +/** + * @brief Throw an exception if one value compares greater than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define LVARRAY_THROW_IF_GE_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_OP_MSG( lhs, >=, <, rhs, msg, TYPE ) + +/** + * @brief Raise a hard error if one value compares greater than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define LVARRAY_ERROR_IF_GE( lhs, rhs ) LVARRAY_ERROR_IF_GE_MSG( lhs, rhs, "" ) + +/** + * @brief Throw an exception if one value compares greater than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param TYPE the type of exception to throw + */ +#define LVARRAY_THROW_IF_GE( lhs, rhs, TYPE ) LVARRAY_THROW_IF_GE_MSG( lhs, rhs, "", TYPE ) + +/** + * @brief Raise a hard error if one value compares less than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define LVARRAY_ERROR_IF_LT_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_OP_MSG( lhs, <, >=, rhs, msg ) + +/** + * @brief Throw an exception if one value compares less than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define LVARRAY_THROW_IF_LT_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_OP_MSG( lhs, <, >=, rhs, msg, TYPE ) + +/** + * @brief Raise a hard error if one value compares less than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define LVARRAY_ERROR_IF_LT( lhs, rhs ) LVARRAY_ERROR_IF_LT_MSG( lhs, rhs, "" ) + +/** + * @brief Throw an exception if one value compares less than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param TYPE the type of exception to throw + */ +#define LVARRAY_THROW_IF_LT( lhs, rhs, TYPE ) LVARRAY_THROW_IF_LT_MSG( lhs, rhs, "", TYPE ) + +/** + * @brief Raise a hard error if one value compares less than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define LVARRAY_ERROR_IF_LE_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_OP_MSG( lhs, <=, >, rhs, msg ) + +/** + * @brief Throw an exception if one value compares less than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define LVARRAY_THROW_IF_LE_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_OP_MSG( lhs, <=, >, rhs, msg, TYPE ) + +/** + * @brief Raise a hard error if one value compares less than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define LVARRAY_ERROR_IF_LE( lhs, rhs ) LVARRAY_ERROR_IF_GE_MSG( lhs, rhs, "" ) + +/** + * @brief Throw an exception if one value compares less than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param TYPE the type of exception to throw + */ +#define LVARRAY_THROW_IF_LE( lhs, rhs, TYPE ) LVARRAY_THROW_IF_GE_MSG( lhs, rhs, "", TYPE ) + +/** + * @brief Abort execution if @p lhs @p OP @p rhs is false. + * @param lhs The left side of the operation. + * @param OP The operation to apply. + * @param rhs The right side of the operation. + * @param msg The message to diplay. + */ +#define LVARRAY_ASSERT_OP_MSG( lhs, OP, rhs, msg ) \ + LVARRAY_ASSERT_MSG( lhs OP rhs, \ + msg << "\n" << \ + " " << #lhs << " = " << lhs << "\n" << \ + " " << #rhs << " = " << rhs << "\n" ) + +/** + * @brief Assert that two values compare equal in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define LVARRAY_ASSERT_EQ_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_OP_MSG( lhs, ==, rhs, msg ) + +/** + * @brief Assert that two values compare equal in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define LVARRAY_ASSERT_EQ( lhs, rhs ) LVARRAY_ASSERT_EQ_MSG( lhs, rhs, "" ) + +/** + * @brief Assert that two values compare not equal in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define LVARRAY_ASSERT_NE_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_OP_MSG( lhs, !=, rhs, msg ) + +/** + * @brief Assert that two values compare not equal in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define LVARRAY_ASSERT_NE( lhs, rhs ) LVARRAY_ASSERT_NE_MSG( lhs, rhs, "" ) + +/** + * @brief Assert that one value compares greater than the other in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define LVARRAY_ASSERT_GT_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_OP_MSG( lhs, >, rhs, msg ) + +/** + * @brief Assert that one value compares greater than the other in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define LVARRAY_ASSERT_GT( lhs, rhs ) LVARRAY_ASSERT_GT_MSG( lhs, rhs, "" ) + +/** + * @brief Assert that one value compares greater than or equal to the other in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define LVARRAY_ASSERT_GE_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_OP_MSG( lhs, >=, rhs, msg ) + +/** + * @brief Assert that one value compares greater than or equal to the other in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define LVARRAY_ASSERT_GE( lhs, rhs ) LVARRAY_ASSERT_GE_MSG( lhs, rhs, "" ) + +#if defined(LVARRAY_DECORATE) +/// Mark a function for both host and device usage. +#define LVARRAY_HOST_DEVICE __host__ __device__ + +#if defined( LVARRAY_USE_HIP ) +/// Mark a function for both host and device usage when using HIP only. +#define LVARRAY_HOST_DEVICE_HIP __host__ __device__ +#else +/// Mark a function for both host and device usage when using HIP only. +#define LVARRAY_HOST_DEVICE_HIP +#endif + +/// Mark a function for only device usage. +#define LVARRAY_DEVICE __device__ + +/** + * @brief Disable host device warnings. + * @details This pragma disables nvcc warnings about calling a host function from a host-device + * function. This is used on templated host-device functions where some template instantiations + * call host only code. This is safe as long as the host only instantiations are only called on + * the host. To use place directly above a the template. + */ +#if defined(LVARRAY_USE_CUDA) +#define DISABLE_HD_WARNING _Pragma("hd_warning_disable") +#else +#define DISABLE_HD_WARNING +#endif +#else +/// Mark a function for both host and device usage. +#define LVARRAY_HOST_DEVICE +/// Mark a function for both host and device usage when using HIP only. +#define LVARRAY_HOST_DEVICE_HIP + +/// Mark a function for only device usage. +#define LVARRAY_DEVICE + +/** + * @brief Disable host device warnings. + * @details This pragma disables nvcc warnings about calling a host function from a host-device + * function. This is used on templated host-device functions where some template instantiations + * call host only code. This is safe as long as the host only instantiations are only called on + * the host. To use place directly above a the template. + */ +#define DISABLE_HD_WARNING +#endif + + +#if defined(__clang__) +#define LVARRAY_RESTRICT __restrict__ +#define LVARRAY_RESTRICT_REF __restrict__ +#define LVARRAY_INTEL_CONSTEXPR constexpr +#elif defined(__GNUC__) + #if defined(__INTEL_COMPILER) +#define LVARRAY_RESTRICT __restrict__ +#define LVARRAY_RESTRICT_REF __restrict__ +#define LVARRAY_INTEL_CONSTEXPR + #else +#define LVARRAY_RESTRICT __restrict__ +#define LVARRAY_RESTRICT_REF __restrict__ +#define LVARRAY_INTEL_CONSTEXPR constexpr + #endif +#endif + +#if !defined(LVARRAY_BOUNDS_CHECK) +/** + * @brief Expands to constexpr when array bound checking is disabled. + */ +#define CONSTEXPR_WITHOUT_BOUNDS_CHECK constexpr +#else +/** + * @brief Expands to constexpr when array bound checking is disabled. + */ +#define CONSTEXPR_WITHOUT_BOUNDS_CHECK +#endif + +#if defined(NDEBUG) +/** + * @brief Expands to constexpr in release builds (when NDEBUG is defined). + */ +#define CONSTEXPR_WITH_NDEBUG constexpr +#else +/** + * @brief Expands to constexpr in release builds (when NDEBUG is defined). + */ +#define CONSTEXPR_WITH_NDEBUG +#endif + +#if !defined(LVARRAY_BOUNDS_CHECK) +/** + * @brief Expands to constexpr when array bound checking is disabled. + */ +#define CONSTEXPR_WITHOUT_BOUNDS_CHECK constexpr +#else +/** + * @brief Expands to constexpr when array bound checking is disabled. + */ +#define CONSTEXPR_WITHOUT_BOUNDS_CHECK +#endif + +#if defined(NDEBUG) +/** + * @brief Expands to constexpr in release builds (when NDEBUG is defined). + */ +#define CONSTEXPR_WITH_NDEBUG constexpr +#else +/** + * @brief Expands to constexpr in release builds (when NDEBUG is defined). + */ +#define CONSTEXPR_WITH_NDEBUG +#endif + +// TPL includes +#include + +template< typename > +struct RAJAHelper +{}; + +using serialPolicy = RAJA::seq_exec; + +template<> +struct RAJAHelper< serialPolicy > +{ + using ReducePolicy = RAJA::seq_reduce; + using AtomicPolicy = RAJA::seq_atomic; +}; + +#if defined(RAJA_ENABLE_OPENMP) + +using parallelHostPolicy = RAJA::omp_parallel_for_exec; + +template<> +struct RAJAHelper< parallelHostPolicy > +{ + using ReducePolicy = RAJA::omp_reduce; + using AtomicPolicy = RAJA::omp_atomic; +}; + +#endif + +#if defined(LVARRAY_USE_CUDA) + +template< unsigned long THREADS_PER_BLOCK > +using parallelDevicePolicy = RAJA::cuda_exec< THREADS_PER_BLOCK >; + +template< unsigned long N > +struct RAJAHelper< RAJA::cuda_exec< N > > +{ + using ReducePolicy = RAJA::cuda_reduce; + using AtomicPolicy = RAJA::cuda_atomic; +}; + +#elif defined(LVARRAY_USE_HIP) + +template< unsigned long THREADS_PER_BLOCK > +using parallelDevicePolicy = RAJA::hip_exec< THREADS_PER_BLOCK >; + +template< unsigned long N > +struct RAJAHelper< RAJA::hip_exec< N > > +{ + using ReducePolicy = RAJA::hip_reduce; + using AtomicPolicy = RAJA::hip_atomic; +}; + +#endif diff --git a/src/coreComponents/dataRepository/WrapperContext.cpp b/src/coreComponents/dataRepository/WrapperContext.cpp index 92f52ba8708..af7aee6062f 100644 --- a/src/coreComponents/dataRepository/WrapperContext.cpp +++ b/src/coreComponents/dataRepository/WrapperContext.cpp @@ -38,6 +38,13 @@ string WrapperContext::toString() const GEOS_FMT( "{}/{}", m_group.getDataContext().toString(), m_typeName ); } +std::map< std::string, std::string > WrapperContext::getContextInfo() const +{ + std::map contextInfo; + contextInfo["dataPath"] = m_targetName; + + return contextInfo; +} } /* namespace dataRepository */ } /* namespace geos */ diff --git a/src/coreComponents/dataRepository/WrapperContext.hpp b/src/coreComponents/dataRepository/WrapperContext.hpp index 78fd48fb6f1..855cf24f1cd 100644 --- a/src/coreComponents/dataRepository/WrapperContext.hpp +++ b/src/coreComponents/dataRepository/WrapperContext.hpp @@ -54,6 +54,10 @@ class WrapperContext final : public GroupContext */ string toString() const override; + /** + * @return a map containing contextual information, including the targetName of the DataContext + */ + std::map< std::string, std::string > getContextInfo() const override; }; diff --git a/src/coreComponents/dataRepository/staircase_co2_wells_3d.xml b/src/coreComponents/dataRepository/staircase_co2_wells_3d.xml new file mode 100644 index 00000000000..8d6fffbdc46 --- /dev/null +++ b/src/coreComponents/dataRepository/staircase_co2_wells_3d.xml @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/coreComponents/dataRepository/testErrorHandling.cpp b/src/coreComponents/dataRepository/testErrorHandling.cpp new file mode 100644 index 00000000000..a33f6cfde7d --- /dev/null +++ b/src/coreComponents/dataRepository/testErrorHandling.cpp @@ -0,0 +1,34 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 TotalEnergies + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2023-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#include "common/logger/ErrorHandling.hpp" + +#include + +using namespace geos; + +TEST( ErrorHandling, testYaml ) +{ + ErrorLogger logger; + ErrorLogger::ErrorMsg structMsg = logger.errorMsgformatter( ErrorLogger::TypeMsg::ERROR, "contenu du message", "nom du fichier dev", 24 ); + logger.errorMsgWritter( structMsg ); +} + +int main( int ac, char * av[] ) +{ + ::testing::InitGoogleTest( &ac, av ); + int const result = RUN_ALL_TESTS(); + return result; +} \ No newline at end of file From 46b4904a57fce4ec6abd4cfbb5556fe9d495be15 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 7 May 2025 14:43:47 +0200 Subject: [PATCH 009/173] First attempt at outputting exceptions --- .../common/logger/ErrorHandling.cpp | 97 ++++++++++++------- .../common/logger/ErrorHandling.hpp | 2 + .../common/unitTests/testErrorHandling.cpp | 43 ++++---- .../dataRepository/DataContext.cpp | 2 +- .../dataRepository/DataContext.hpp | 38 ++++++-- src/coreComponents/dataRepository/Group.hpp | 9 +- .../dataRepository/unitTests/CMakeLists.txt | 3 +- .../unitTests/testDataContext.cpp | 38 ++++++++ 8 files changed, 161 insertions(+), 71 deletions(-) create mode 100644 src/coreComponents/dataRepository/unitTests/testDataContext.cpp diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 93163ac0b2a..a46ceca46d9 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -23,54 +23,83 @@ // System includes #include #include -#include +#include namespace geos { - ErrorLogger errorLogger; +static constexpr std::string_view m_filename = "errors.yaml"; - void ErrorLogger::ErrorMsg::addContextInfo( std::map< std::string, std::string > && info ) +ErrorLogger errorLogger{}; + +ErrorLogger::ErrorLogger() +{ + std::ofstream yamlFile( std::string( m_filename ), std::ios::out ); + if( yamlFile.is_open() ) { - ErrorLogger::ErrorMsg::contextsInfo.emplace_back( std::move( info ) ); + yamlFile << "errors: \n"; + yamlFile.close(); } - - std::string ErrorLogger::toString( ErrorLogger::MsgType type ) + else { - switch ( type ) - { - case ErrorLogger::MsgType::Error: return "Error"; - case ErrorLogger::MsgType::Warning: return "Warning"; - default: return "Unknown"; - } + // TODO => GEOS_ERROR + // Dire quel fichier bug = fichier d'erreur a échoué + std::cerr << "Unable to open file.\n"; } +} + + +void ErrorLogger::ErrorMsg::addContextInfo( std::map< std::string, std::string > && info ) +{ + ErrorLogger::ErrorMsg::contextsInfo.emplace_back( std::move( info ) ); +} - void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) +std::string ErrorLogger::toString( ErrorLogger::MsgType type ) +{ + switch( type ) { - std::string filename = "errors.yaml"; - std::ifstream checkYamlFile( filename ); - bool isEmpty = checkYamlFile.peek() == std::ifstream::traits_type::eof(); - checkYamlFile.close(); + case ErrorLogger::MsgType::Error: return "Error"; + case ErrorLogger::MsgType::Warning: return "Warning"; + default: return "Unknown"; + } +} - std::ofstream yamlFile( filename, std::ios::app ); - if( yamlFile.is_open() ) +void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) +{ + std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); + if( yamlFile.is_open() ) + { + yamlFile << GEOS_FMT( "{:>2}- type: {}\n", " ", errorLogger.toString( errorMsg.type ) ); + yamlFile << GEOS_FMT( "{:>4}message: {}\n", " ", errorMsg.msg ); + yamlFile << GEOS_FMT( "{:>4}contexts:\n", " " ); + + for( size_t i = 0; i < errorMsg.contextsInfo.size(); i++ ) { - if( isEmpty ) + for( auto const & [key, value] : errorMsg.contextsInfo[i] ) { - yamlFile << "errors: \n"; + if( key == "inputFileLine" ) + { + yamlFile << GEOS_FMT( "{:>8}{}: {}\n", " ", key, value ); + } + else + { + yamlFile << GEOS_FMT( "{:>6}- {}: {}\n", " ", key, value ); + } } - yamlFile << GEOS_FMT( "{:>2}- type: {}\n", " ", errorMsg.msg ); - yamlFile << GEOS_FMT( "{:>4}message: {}\n", " ", errorLogger.toString( errorMsg.type ) ); - yamlFile << GEOS_FMT( "{:>4}inputFileLocation:\n", " " ); - yamlFile << GEOS_FMT( "{:>6}- file: {}\n", " ", errorMsg.file ); - yamlFile << GEOS_FMT( "{:>8}line: {}\n", " ", errorMsg.line ); - yamlFile << GEOS_FMT( "{:>4}sourceLocation:\n", " " ); - yamlFile.close(); - std::cout << "YAML file created successfully.\n"; - } - else - { - std::cerr << "Unable to open file.\n"; } + + yamlFile << GEOS_FMT( "{:>4}sourceLocation:\n", " " ); + yamlFile << GEOS_FMT( "{:>6}file: {}\n", " ", errorMsg.file ); + yamlFile << GEOS_FMT( "{:>6}line: {}\n\n", " ", errorMsg.line ); + yamlFile.close(); + // TODO: change the message to be more explicit + std::cout << "YAML file created successfully.\n"; + } + else + { + // TODO => GEOS_ERROR + // Dire quel fichier bug = fichier d'erreur a échoué + std::cerr << "Unable to open file.\n"; } +} -} /* namespace geos */ \ No newline at end of file +} /* namespace geos */ diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 2e18a4be67d..a4037ed2821 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -37,6 +37,8 @@ class ErrorLogger { public: + ErrorLogger(); + /** * @enum TypeMsg * Enum listing the different types of possible errors diff --git a/src/coreComponents/common/unitTests/testErrorHandling.cpp b/src/coreComponents/common/unitTests/testErrorHandling.cpp index 89da4f26b9f..c4c77e9405e 100644 --- a/src/coreComponents/common/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/common/unitTests/testErrorHandling.cpp @@ -13,29 +13,30 @@ * ------------------------------------------------------------------------------------------------------------ */ -// #include "common/logger/ErrorHandling.hpp" +#include "common/logger/ErrorHandling.hpp" +#include "dataRepository/DataContext.hpp" -// #include +#include -// using namespace geos; +using namespace geos; -// TEST( ErrorHandling, testYaml ) -// { -// ErrorLogger logger; +TEST( ErrorHandling, testYaml ) +{ + std::map map; + map["inputFile"] = "./simpleCo2Inj.xml"; + map["inputLineLine"] = "42"; -// std::vector> vect; -// std::map map; -// map["inputFile"] = "./simpleCo2Inj.xml"; -// map["inputLineLine"] = "42"; -// vect.push_back( map ); + geos::ErrorLogger::ErrorMsg msgStruct( geos::ErrorLogger::MsgType::Error, + "msg content", + "dev file name", + 24 ); + msgStruct.addContextInfo( std::move( map ) ); + errorLogger.write( msgStruct ); +} -// ErrorLogger::ErrorMsg msgStruct = logger.serialize( ErrorLogger::MsgType::Error, "msg content", "dev file name", 24, vect ); -// logger.write( msgStruct ); -// } - -// int main( int ac, char * av[] ) -// { -// ::testing::InitGoogleTest( &ac, av ); -// int const result = RUN_ALL_TESTS(); -// return result; -// } \ No newline at end of file +int main( int ac, char * av[] ) +{ + ::testing::InitGoogleTest( &ac, av ); + int const result = RUN_ALL_TESTS(); + return result; +} diff --git a/src/coreComponents/dataRepository/DataContext.cpp b/src/coreComponents/dataRepository/DataContext.cpp index d4f4b79a7a4..4b92e88803e 100644 --- a/src/coreComponents/dataRepository/DataContext.cpp +++ b/src/coreComponents/dataRepository/DataContext.cpp @@ -112,7 +112,7 @@ std::map< std::string, std::string > DataFileContext::getContextInfo() const { std::map contextInfo; contextInfo["inputFile"] = m_filePath; - contextInfo["inputFileLine"] = m_line; + contextInfo["inputFileLine"] = to_string( m_line ); return contextInfo; } diff --git a/src/coreComponents/dataRepository/DataContext.hpp b/src/coreComponents/dataRepository/DataContext.hpp index 6fe472166dd..e335441003f 100644 --- a/src/coreComponents/dataRepository/DataContext.hpp +++ b/src/coreComponents/dataRepository/DataContext.hpp @@ -61,8 +61,8 @@ class DataContext /** * @brief Returns contextual information, including the file name and the line number - * - * @return std::map< std::string, std::string > + * + * @return std::map< std::string, std::string > */ virtual std::map< std::string, std::string > getContextInfo() const = 0; @@ -164,7 +164,7 @@ class DataFileContext final : public DataContext /** * @return a map containing contextual information, including the file name and the line number */ - std::map< std::string, std::string > getContextInfo() const override; + std::map< std::string, std::string > getContextInfo() const override; /** * @return the type name in the source file (XML node tag name / attribute name). @@ -218,19 +218,37 @@ class DataFileContext final : public DataContext }; -// TODO: +// TODO: // GEOS_THROW_IF_TEST manière de sortir une erreur sans contexte // addContext fais le lien entre GEOS_THROW_CTX_IF -// Variation de GEOS_THROW_IF_TEST qui ajoute des données de contexte -#define GEOS_THROW_CTX_IF( errorMsg, ctx ) \ - std::map< std::string, std::string > contextInfo = ctx.getContextInfo(); \ - errorMsg.addContext( contextInfo ); \ +// Variation de GEOS_THROW_IF_TEST qui ajoute des données de contexte +#define GEOS_THROW_CTX_IF( dataContext, EXP, MSG, EXCEPTIONTYPE ) \ + do \ + { \ + if( EXP ) \ + { \ + std::ostringstream __oss; \ + __oss << "\n"; \ + __oss << "***** LOCATION: " LOCATION "\n"; \ + __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ + __oss << MSG << "\n"; \ + __oss << LvArray::system::stackTrace( true ); \ + std::ostringstream __msgoss; \ + __msgoss << MSG; \ + ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ + __msgoss.str(), \ + __FILE__, \ + __LINE__ ); \ + msgStruct.addContextInfo( dataContext.getContextInfo() ); \ + errorLogger.write( msgStruct ); \ + throw EXCEPTIONTYPE( __oss.str() ); \ + } \ + } while( false ) + } /* namespace dataRepository */ } /* namespace geos */ - - /** * @brief Formatter to be able to directly use a DataContext as a GEOS_FMT() argument. * Inherits from formatter to reuse its parse() method. diff --git a/src/coreComponents/dataRepository/Group.hpp b/src/coreComponents/dataRepository/Group.hpp index a548ed8743d..4a49e3d0c28 100644 --- a/src/coreComponents/dataRepository/Group.hpp +++ b/src/coreComponents/dataRepository/Group.hpp @@ -318,10 +318,11 @@ class Group T & getGroup( KEY const & key ) { Group * const child = m_subGroups[ key ]; - GEOS_THROW_IF_TEST( child == nullptr, - "Group " << getDataContext() << " has no child named " << key << std::endl - << dumpSubGroupsNames(), - std::domain_error ); + GEOS_THROW_CTX_IF( getDataContext(), + child == nullptr, + "Group " << getDataContext() << " has no child named " << key << std::endl + << dumpSubGroupsNames(), + std::domain_error ); T * const castedChild = dynamicCast< T * >( child ); GEOS_THROW_IF( castedChild == nullptr, GEOS_FMT( "{} was expected to be a '{}'.", diff --git a/src/coreComponents/dataRepository/unitTests/CMakeLists.txt b/src/coreComponents/dataRepository/unitTests/CMakeLists.txt index eb42386660e..b38c723ed4f 100644 --- a/src/coreComponents/dataRepository/unitTests/CMakeLists.txt +++ b/src/coreComponents/dataRepository/unitTests/CMakeLists.txt @@ -5,7 +5,8 @@ set( dataRepository_tests testPacking.cpp testWrapper.cpp testXmlWrapper.cpp - testBufferOps.cpp ) + testBufferOps.cpp + testDataContext.cpp ) set( dependencyList ${parallelDeps} gtest dataRepository ) diff --git a/src/coreComponents/dataRepository/unitTests/testDataContext.cpp b/src/coreComponents/dataRepository/unitTests/testDataContext.cpp new file mode 100644 index 00000000000..4360c76f8be --- /dev/null +++ b/src/coreComponents/dataRepository/unitTests/testDataContext.cpp @@ -0,0 +1,38 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 TotalEnergies + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2023-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#include "common/logger/ErrorHandling.hpp" +#include "dataRepository/DataContext.hpp" + +#include + +using namespace geos; + +TEST( DataContext, testCompleteYaml ) +{ + geos::ErrorLogger errorLogger; + int x = 5; + geos::dataRepository::DataFileContext dataContext( "targetName", + "test1_file.xml", + 42 ); + GEOS_THROW_CTX_IF( dataContext, x==5, "Here is the error message", std::runtime_error ); +} + +int main( int ac, char * av[] ) +{ + ::testing::InitGoogleTest( &ac, av ); + int const result = RUN_ALL_TESTS(); + return result; +} From e1aed935d02ef4a78641d765cf15dc042fbb8dfc Mon Sep 17 00:00:00 2001 From: amandinehry Date: Fri, 9 May 2025 17:03:45 +0200 Subject: [PATCH 010/173] Complete: code for outputting errors into yaml --- .../common/logger/ErrorHandling.cpp | 67 +++++++++------ .../common/logger/ErrorHandling.hpp | 11 ++- src/coreComponents/common/logger/Logger.hpp | 81 +++++++++++++++---- .../dataRepository/DataContext.hpp | 52 +++++++++++- .../dataRepository/GroupContext.cpp | 2 +- .../dataRepository/WrapperContext.cpp | 2 +- 6 files changed, 167 insertions(+), 48 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index a46ceca46d9..1655bb2dea3 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -19,6 +19,7 @@ // Source includes #include "ErrorHandling.hpp" +#include "common/logger/Logger.hpp" // System includes #include @@ -41,16 +42,27 @@ ErrorLogger::ErrorLogger() } else { - // TODO => GEOS_ERROR - // Dire quel fichier bug = fichier d'erreur a échoué - std::cerr << "Unable to open file.\n"; + GEOS_LOG( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); } } void ErrorLogger::ErrorMsg::addContextInfo( std::map< std::string, std::string > && info ) { - ErrorLogger::ErrorMsg::contextsInfo.emplace_back( std::move( info ) ); + contextsInfo.emplace_back( std::move( info ) ); +} + +void ErrorLogger::ErrorMsg::addCallStackInfo( std::string const & ossStackTrace ) +{ + std::istringstream iss( ossStackTrace ); + std::string stackLine; + std::size_t index; + + while( std::getline( iss, stackLine) ) + { + index = stackLine.find(':'); + sourceCallStack.push_back( stackLine.substr( index + 1 ) ); + } } std::string ErrorLogger::toString( ErrorLogger::MsgType type ) @@ -63,42 +75,51 @@ std::string ErrorLogger::toString( ErrorLogger::MsgType type ) } } -void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) +void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) //const { std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); if( yamlFile.is_open() ) { yamlFile << GEOS_FMT( "{:>2}- type: {}\n", " ", errorLogger.toString( errorMsg.type ) ); - yamlFile << GEOS_FMT( "{:>4}message: {}\n", " ", errorMsg.msg ); - yamlFile << GEOS_FMT( "{:>4}contexts:\n", " " ); - - for( size_t i = 0; i < errorMsg.contextsInfo.size(); i++ ) + yamlFile << GEOS_FMT( "{:>4}message:\n {:>5}{}\n", " ", " ", errorMsg.msg ); + if( errorMsg.contextsInfo.empty() ) { - for( auto const & [key, value] : errorMsg.contextsInfo[i] ) + yamlFile << GEOS_FMT( "{:>4}contexts:\n", " " ); + + for( size_t i = 0; i < errorMsg.contextsInfo.size(); i++ ) { - if( key == "inputFileLine" ) + for( auto const & [key, value] : errorMsg.contextsInfo[i] ) { - yamlFile << GEOS_FMT( "{:>8}{}: {}\n", " ", key, value ); - } - else - { - yamlFile << GEOS_FMT( "{:>6}- {}: {}\n", " ", key, value ); + if( key == "inputFileLine" ) + { + yamlFile << GEOS_FMT( "{:>8}{}: {}\n", " ", key, value ); + } + else + { + yamlFile << GEOS_FMT( "{:>6}- {}: {}\n", " ", key, value ); + } } } } yamlFile << GEOS_FMT( "{:>4}sourceLocation:\n", " " ); yamlFile << GEOS_FMT( "{:>6}file: {}\n", " ", errorMsg.file ); - yamlFile << GEOS_FMT( "{:>6}line: {}\n\n", " ", errorMsg.line ); - yamlFile.close(); - // TODO: change the message to be more explicit - std::cout << "YAML file created successfully.\n"; + yamlFile << GEOS_FMT( "{:>6}line: {}\n", " ", errorMsg.line ); + + yamlFile << GEOS_FMT( "{:>4}sourceCallStack:\n", " " ); + + for( size_t i = 0; i < errorMsg.sourceCallStack.size(); i++ ) + { + if( i < 2 || i == errorMsg.sourceCallStack.size() - 1 ) continue; + yamlFile << GEOS_FMT( "{:>6}- {}: {}\n", " ", i-2, errorMsg.sourceCallStack[i] ); + } + + yamlFile.flush(); + GEOS_LOG( GEOS_FMT( "The error file {} was created successfully.", m_filename ) ); } else { - // TODO => GEOS_ERROR - // Dire quel fichier bug = fichier d'erreur a échoué - std::cerr << "Unable to open file.\n"; + GEOS_LOG( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); } } diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index a4037ed2821..a477498d47d 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -60,7 +60,7 @@ class ErrorLogger std::string file; integer line; std::vector< std::map< std::string, std::string > > contextsInfo; - // std::vector< std::string > sourceCallStack; + std::vector< std::string > sourceCallStack; /** * @brief Construct a new Error Msg object @@ -75,9 +75,16 @@ class ErrorLogger /** * @brief Add contextual information about the error/warning message to the ErrorMsg structure * - * @param info + * @param info DataContext information stored into a map */ void addContextInfo( std::map< std::string, std::string > && info ); + + /** + * @brief Add stack trace information about the error/warning message to the ErrorMsg structure + * + * @param ossStackTrace stack trace information + */ + void addCallStackInfo( std::string const & ossStackTrace ); }; std::string toString( MsgType type ); diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index bc74876fa56..35fb4f2fbaf 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -134,6 +134,36 @@ */ #define GEOS_LOG_RANK_VAR( var ) GEOS_LOG_RANK( #var " = " << var ) +#define LVARRAY_ERROR_IF_TEST( EXP, MSG ) \ + do \ + { \ + if( EXP ) \ + { \ + std::ostringstream __oss; \ + __oss << "***** ERROR\n"; \ + __oss << "***** LOCATION: " LOCATION "\n"; \ + __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ + __oss << MSG << "\n"; \ + __oss << LvArray::system::stackTrace( true ); \ + std::cout << __oss.str() << std::endl; \ + std::ostringstream __msgoss; \ + __msgoss << MSG; \ + ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ + __msgoss.str(), \ + __FILE__, \ + __LINE__ ); \ + msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ + errorLogger.write( msgStruct ); \ + LvArray::system::callErrorHandler(); \ + } \ + } while( false ) + +#if defined(GEOS_DEVICE_COMPILE) +#define GEOS_ERROR_IF_TEST( EXP, msg ) LVARRAY_ERROR_IF_TEST( EXP, msg ) +#else +#define GEOS_ERROR_IF_TEST( EXP, msg ) LVARRAY_ERROR_IF_TEST( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#endif + /** * @brief Conditionally raise a hard error and terminate the program. * @param EXP an expression that will be evaluated as a predicate @@ -151,7 +181,7 @@ * @param MSG a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define LVARRAY_THROW_IF_TEST( EXP, MSG, TYPE ) \ +#define LVARRAY_THROW_IF_TEST( EXP, MSG, EXCEPTIONTYPE ) \ do \ { \ if( EXP ) \ @@ -162,19 +192,20 @@ __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ __oss << MSG << "\n"; \ __oss << LvArray::system::stackTrace( true ); \ - std::ostringstream __oss2, __oss3; \ - __oss2 << MSG; \ - __oss3 << __FILE__; \ - integer line = __LINE__; \ + std::ostringstream __msgoss; \ + __msgoss << MSG; \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ - __oss2.str(), \ - __oss3.str(), \ - line ); \ + __msgoss.str(), \ + __FILE__, \ + __LINE__ ); \ + msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ errorLogger.write( msgStruct ); \ - throw TYPE( __oss.str() ); \ + throw EXCEPTIONTYPE( __oss.str() ); \ } \ } while( false ) +#define GEOS_THROW_IF_TEST( EXP, msg, EXCEPTIONTYPE ) LVARRAY_THROW_IF_TEST( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, EXCEPTIONTYPE ) + /** * @brief Conditionally throw an exception. * @param EXP an expression that will be evaluated as a predicate @@ -183,14 +214,6 @@ */ #define GEOS_THROW_IF( EXP, msg, TYPE ) LVARRAY_THROW_IF( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) -/** - * @brief Conditionally throw an exception. - * @param EXP an expression that will be evaluated as a predicate - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define GEOS_THROW_IF_TEST( EXP, msg, TYPE ) LVARRAY_THROW_IF_TEST( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) - /** * @brief Raise a hard error and terminate the program. * @param msg a message to log (any expression that can be stream inserted) @@ -217,6 +240,30 @@ */ #define GEOS_ASSERT( EXP ) GEOS_ASSERT_MSG( EXP, "" ) +#define LVARRAY_WARNING_IF_TEST( EXP, MSG ) \ + do \ + { \ + if( EXP ) \ + { \ + std::ostringstream __oss; \ + __oss << "***** WARNING\n"; \ + __oss << "***** LOCATION: " LOCATION "\n"; \ + __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ + __oss << MSG; \ + std::cout << __oss.str() << std::endl; \ + std::ostringstream __msgoss; \ + __msgoss << MSG; \ + ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ + __msgoss.str(), \ + __FILE__, \ + __LINE__ ); \ + msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ + errorLogger.write( msgStruct ); \ + } \ + } while( false ) + +#define GEOS_WARNING_IF_TEST( EXP, msg ) LVARRAY_WARNING_IF_TEST( EXP, msg ) + /** * @brief Conditionally report a warning. * @param EXP an expression that will be evaluated as a predicate diff --git a/src/coreComponents/dataRepository/DataContext.hpp b/src/coreComponents/dataRepository/DataContext.hpp index e335441003f..56f0267f278 100644 --- a/src/coreComponents/dataRepository/DataContext.hpp +++ b/src/coreComponents/dataRepository/DataContext.hpp @@ -218,10 +218,6 @@ class DataFileContext final : public DataContext }; -// TODO: -// GEOS_THROW_IF_TEST manière de sortir une erreur sans contexte -// addContext fais le lien entre GEOS_THROW_CTX_IF -// Variation de GEOS_THROW_IF_TEST qui ajoute des données de contexte #define GEOS_THROW_CTX_IF( dataContext, EXP, MSG, EXCEPTIONTYPE ) \ do \ { \ @@ -240,11 +236,59 @@ class DataFileContext final : public DataContext __FILE__, \ __LINE__ ); \ msgStruct.addContextInfo( dataContext.getContextInfo() ); \ + msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ errorLogger.write( msgStruct ); \ throw EXCEPTIONTYPE( __oss.str() ); \ } \ } while( false ) +#define GEOS_ERROR_CTX_IF( dataContext, EXP, MSG ) \ + do \ + { \ + if( EXP ) \ + { \ + std::ostringstream __oss; \ + __oss << "***** ERROR\n"; \ + __oss << "***** LOCATION: " LOCATION "\n"; \ + __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ + __oss << MSG << "\n"; \ + __oss << LvArray::system::stackTrace( true ); \ + std::cout << __oss.str() << std::endl; \ + std::ostringstream __msgoss; \ + __msgoss << MSG; \ + ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ + __msgoss.str(), \ + __FILE__, \ + __LINE__ ); \ + msgStruct.addContextInfo( dataContext.getContextInfo() ); \ + msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ + errorLogger.write( msgStruct ); \ + LvArray::system::callErrorHandler(); \ + } \ + } while( false ) + +#define GEOS_WARNING_CTX_IF( dataContext, EXP, MSG ) \ + do \ + { \ + if( EXP ) \ + { \ + std::ostringstream __oss; \ + __oss << "***** WARNING\n"; \ + __oss << "***** LOCATION: " LOCATION "\n"; \ + __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ + __oss << MSG; \ + std::cout << __oss.str() << std::endl; \ + std::ostringstream __msgoss; \ + __msgoss << MSG; \ + ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ + __msgoss.str(), \ + __FILE__, \ + __LINE__ ); \ + msgStruct.addContextInfo( dataContext.getContextInfo() ); \ + msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ + errorLogger.write( msgStruct ); \ + } \ + } while( false ) } /* namespace dataRepository */ } /* namespace geos */ diff --git a/src/coreComponents/dataRepository/GroupContext.cpp b/src/coreComponents/dataRepository/GroupContext.cpp index 904faac8605..4b693d41e3c 100644 --- a/src/coreComponents/dataRepository/GroupContext.cpp +++ b/src/coreComponents/dataRepository/GroupContext.cpp @@ -57,7 +57,7 @@ string GroupContext::toString() const std::map< std::string, std::string > GroupContext::getContextInfo() const { std::map contextInfo; - contextInfo["dataPath"] = m_targetName; + contextInfo["dataPath"] = toString(); return contextInfo; } diff --git a/src/coreComponents/dataRepository/WrapperContext.cpp b/src/coreComponents/dataRepository/WrapperContext.cpp index af7aee6062f..0cfdfae290e 100644 --- a/src/coreComponents/dataRepository/WrapperContext.cpp +++ b/src/coreComponents/dataRepository/WrapperContext.cpp @@ -41,7 +41,7 @@ string WrapperContext::toString() const std::map< std::string, std::string > WrapperContext::getContextInfo() const { std::map contextInfo; - contextInfo["dataPath"] = m_targetName; + contextInfo["dataPath"] = toString(); return contextInfo; } From bc953beb0365b7baa3c21372f8347f099a81e400 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Mon, 12 May 2025 15:56:46 +0200 Subject: [PATCH 011/173] Manage the text contained in the potential exception --- .../dataRepository/GeosxState.cpp | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/coreComponents/dataRepository/GeosxState.cpp b/src/coreComponents/dataRepository/GeosxState.cpp index 12cb2baf62a..d2babfb7313 100644 --- a/src/coreComponents/dataRepository/GeosxState.cpp +++ b/src/coreComponents/dataRepository/GeosxState.cpp @@ -128,7 +128,14 @@ bool GeosxState::initializeDataRepository() GEOS_THROW_IF_NE( m_state, State::UNINITIALIZED, std::logic_error ); - getProblemManager().parseCommandLineInput(); + try + { + getProblemManager().parseCommandLineInput(); + } + catch(const std::exception& e) + { + GEOS_LOG( e.what() ); + } if( !getProblemManager().getSchemaFileName().empty() ) { @@ -137,8 +144,23 @@ bool GeosxState::initializeDataRepository() return false; } - getProblemManager().parseInputFile(); - getProblemManager().problemSetup(); + try + { + getProblemManager().parseInputFile(); + } + catch(const std::exception& e) + { + GEOS_LOG( e.what() ); + } + + try + { + getProblemManager().problemSetup(); + } + catch(const std::exception& e) + { + GEOS_LOG( e.what() ); + } m_state = State::INITIALIZED; From 1a434bca65445695f4f8ade7e7355bf71c7695f6 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 14 May 2025 15:20:54 +0200 Subject: [PATCH 012/173] First attempt: Handling the text contained in the potential exception in try/catch statements Problem: Retrieves everything that was thrown, so not just the message. --- .../common/logger/ErrorHandling.cpp | 23 +- .../common/logger/ErrorHandling.hpp | 190 ++- .../dataRepository/GeosxState.cpp | 124 +- .../mainInterface/ProblemManager.cpp | 1194 +++++++++-------- 4 files changed, 924 insertions(+), 607 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 1655bb2dea3..a885a94f7e9 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -25,6 +25,7 @@ #include #include #include +#include namespace geos { @@ -34,6 +35,7 @@ ErrorLogger errorLogger{}; ErrorLogger::ErrorLogger() { + m_currentErrorMsg.parent = this; std::ofstream yamlFile( std::string( m_filename ), std::ios::out ); if( yamlFile.is_open() ) { @@ -46,7 +48,6 @@ ErrorLogger::ErrorLogger() } } - void ErrorLogger::ErrorMsg::addContextInfo( std::map< std::string, std::string > && info ) { contextsInfo.emplace_back( std::move( info ) ); @@ -75,8 +76,28 @@ std::string ErrorLogger::toString( ErrorLogger::MsgType type ) } } +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::exception const & e ) +{ + parent->m_currentErrorMsg.msg = e.what(); + return parent->m_currentErrorMsg; +} + +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setCodeLocation( string msgFile, integer msgLine ) +{ + parent->m_currentErrorMsg.file = msgFile; + parent->m_currentErrorMsg.line = msgLine; + return parent->m_currentErrorMsg; +} + +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setType( ErrorLogger::MsgType msgType ) +{ + parent->m_currentErrorMsg.type = msgType; + return parent->m_currentErrorMsg; +} + void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) //const { + std::cout << "I'm in the write function" << std::endl; std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); if( yamlFile.is_open() ) { diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index a477498d47d..acb642cdfc6 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -20,7 +20,7 @@ #ifndef INITIALIZATION_ERROR_LOGGER_HPP #define INITIALIZATION_ERROR_LOGGER_HPP -// Source includes +// Source includes #include "common/DataTypes.hpp" #include "common/format/Format.hpp" @@ -33,72 +33,218 @@ namespace geos * @class ErrorLogger * @brief Class to format and write the error/warning message that occured during the initialization */ -class ErrorLogger +class ErrorLogger +{ +public: + ErrorLogger(); + + /** + * @enum TypeMsg + * Enum listing the different types of possible errors + */ + enum class MsgType + { + Error, + Warning + }; + + /** + * @brief Struct to define the error/warning message + * + */ + struct ErrorMsg + { + MsgType type; + std::string msg; + std::string file; + integer line; + std::vector< std::map< std::string, std::string > > contextsInfo; + std::vector< std::string > sourceCallStack; + + ErrorMsg() {}; + + /** + * @brief Construct a new Error Msg object + * + * @param msgType The type of the message (error or warning) + * @param msgContent The error/warning message content + * @param msgFile The file name where the error occured + * @param msgLine The line where the error occured + */ + ErrorMsg( MsgType msgType, std::string msgContent, std::string msgFile, integer msgLine ) + : type( msgType ), msg( msgContent ), file( msgFile ), line( msgLine ) {} + + ErrorLogger* parent = nullptr; + ErrorMsg & addToMsg( std::exception const & e ); + ErrorMsg & setCodeLocation( string msgFile, integer msgLine ); + ErrorMsg & setType( MsgType msgType ); + + /** + * @brief Add contextual information about the error/warning message to the ErrorMsg structure + * + * @param info DataContext information stored into a map + */ + void addContextInfo( std::map< std::string, std::string > && info ); + + /** + * @brief Add stack trace information about the error/warning message to the ErrorMsg structure + * + * @param ossStackTrace stack trace information + */ + void addCallStackInfo( std::string const & ossStackTrace ); + }; + + /** + * @brief Returns the error message information at the step where this getter is called + * @return The current error msg + */ + ErrorMsg currentErrorMsg() const + { return m_currentErrorMsg; } + + std::string toString( MsgType type ); + + // ErrorMsg & setMsg( std::exception e ) + // ErrorMsg & setMsg( string msg ); // Chaque catch apl cette procédure + // ErrorMsg & addToMsg( string line ); // Chaque catch apl cette procédure + // ErrorMsg & setCodeLocation( string file, integer line ); // Chaque catch apl cette procédure + + /** + * @brief Add the error/warning message into the yaml file + * + * @param errorMsg The error message informations formatted by the associated structure + */ + void write( ErrorMsg const & errorMsg ); + +private: + ErrorMsg m_currentErrorMsg; // attribut que l'on est en train de construire +}; + +extern ErrorLogger errorLogger; + +} /* namespace geos */ + +#endif + +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 TotalEnergies + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2023-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ErrorHandling.hpp + */ + +#ifndef INITIALIZATION_ERROR_LOGGER_HPP +#define INITIALIZATION_ERROR_LOGGER_HPP + +// Source includes +#include "common/DataTypes.hpp" +#include "common/format/Format.hpp" + +using namespace std; + +namespace geos +{ + +/** + * @class ErrorLogger + * @brief Class to format and write the error/warning message that occured during the initialization + */ +class ErrorLogger { public: ErrorLogger(); /** - * @enum TypeMsg + * @enum TypeMsg * Enum listing the different types of possible errors */ - enum class MsgType + enum class MsgType { - Error, - Warning + Error, + Warning }; /** * @brief Struct to define the error/warning message - * + * */ - struct ErrorMsg + struct ErrorMsg { - MsgType type; - std::string msg; - std::string file; + MsgType type; + std::string msg; + std::string file; integer line; std::vector< std::map< std::string, std::string > > contextsInfo; std::vector< std::string > sourceCallStack; /** * @brief Construct a new Error Msg object - * + * * @param t The type of the message (error or warning) * @param m The error/warning message content * @param f The file name where the error occured - * @param l The line where the error occured + * @param l The line where the error occured */ - ErrorMsg( MsgType t, std::string m, std::string f, integer l ) : type( t ), msg( m ), file( f ), line( l ) {} - + ErrorMsg( MsgType t, std::string m, std::string f, integer l ): type( t ), msg( m ), file( f ), line( l ) {} + + void buildErrorMsg( ErrorMsg e ); // Chaque catch apl cette procédure + + void buildErrorMsg( string msg ); // Chaque catch apl cette procédure + void buildErrorMsg( string file, integer line ); // Chaque catch apl cette procédure + void buildErrorMsg( std::exception e ); // Chaque catch apl cette procédure + + ErrorMsg getLastBuiltErrorMsg(); // puis write + + // registerErroMsgDetail // un pour chacun des composant stracktrace, ... + /** * @brief Add contextual information about the error/warning message to the ErrorMsg structure - * - * @param info DataContext information stored into a map + * @param info DataContext information stored into a map TODO : documente les clé & valeur */ - void addContextInfo( std::map< std::string, std::string > && info ); + ErrorMsg & addContextInfo( std::map< std::string, std::string > && info ); /** * @brief Add stack trace information about the error/warning message to the ErrorMsg structure - * * @param ossStackTrace stack trace information */ - void addCallStackInfo( std::string const & ossStackTrace ); + ErrorMsg & addCallStackInfo( std::string const & ossStackTrace ); }; std::string toString( MsgType type ); + void buildErrorMsg( ErrorMsg e ); // Chaque catch apl cette procédure + + + ErrorMsg & getCurrentErrorMsg(); // puis write + + // registerErroMsgDetail // un pour chacun des composant stracktrace, ... + /** * @brief Add the error/warning message into the yaml file - * + * * @param errorMsg The error message informations formatted by the associated structure */ void write( ErrorMsg const & errorMsg ); + +private: + + ErrorMsg currentErrorMsg; // atttribut que l'on est en train de construire }; extern ErrorLogger errorLogger; } /* namespace geos */ -# endif \ No newline at end of file +#endif diff --git a/src/coreComponents/dataRepository/GeosxState.cpp b/src/coreComponents/dataRepository/GeosxState.cpp index d2babfb7313..537491c3818 100644 --- a/src/coreComponents/dataRepository/GeosxState.cpp +++ b/src/coreComponents/dataRepository/GeosxState.cpp @@ -78,6 +78,7 @@ std::ostream & operator<<( std::ostream & os, State const state ) } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + GeosxState::GeosxState( std::unique_ptr< CommandLineOptions > && commandLineOptions ): m_state( State::UNINITIALIZED ), m_commandLineOptions( std::move( commandLineOptions ) ), @@ -96,17 +97,24 @@ GeosxState::GeosxState( std::unique_ptr< CommandLineOptions > && commandLineOpti setupCaliper( *m_caliperManager, getCommandLineOptions() ); #endif - string restartFileName; - if( ProblemManager::parseRestart( restartFileName, getCommandLineOptions() ) ) + try { - GEOS_LOG_RANK_0( "Loading restart file " << restartFileName ); - dataRepository::loadTree( restartFileName, getRootConduitNode() ); - } + string restartFileName; + if( ProblemManager::parseRestart( restartFileName, getCommandLineOptions() ) ) + { + GEOS_LOG_RANK_0( "Loading restart file " << restartFileName ); + dataRepository::loadTree( restartFileName, getRootConduitNode() ); + } - m_problemManager = std::make_unique< ProblemManager >( getRootConduitNode() ); + m_problemManager = std::make_unique< ProblemManager >( getRootConduitNode() ); - GEOS_ERROR_IF( currentGlobalState != nullptr, "Only one state can exist at a time." ); - currentGlobalState = this; + GEOS_ERROR_IF( currentGlobalState != nullptr, "Only one state can exist at a time." ); + currentGlobalState = this; + } + catch(std::exception const & e) + { + throw; + } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -123,85 +131,85 @@ GeosxState::~GeosxState() ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// bool GeosxState::initializeDataRepository() { - GEOS_MARK_FUNCTION; - Timer timer( m_initTime ); - - GEOS_THROW_IF_NE( m_state, State::UNINITIALIZED, std::logic_error ); - try { + GEOS_MARK_FUNCTION; + Timer timer( m_initTime ); + + GEOS_THROW_IF_NE( m_state, State::UNINITIALIZED, std::logic_error ); + + getProblemManager().parseCommandLineInput(); - } - catch(const std::exception& e) - { - GEOS_LOG( e.what() ); - } - if( !getProblemManager().getSchemaFileName().empty() ) - { - getProblemManager().generateDocumentation(); - m_state = State::INITIALIZED; - return false; - } + if( !getProblemManager().getSchemaFileName().empty() ) + { + getProblemManager().generateDocumentation(); + m_state = State::INITIALIZED; + return false; + } - try - { getProblemManager().parseInputFile(); - } - catch(const std::exception& e) - { - GEOS_LOG( e.what() ); - } - - try - { getProblemManager().problemSetup(); - } - catch(const std::exception& e) - { - GEOS_LOG( e.what() ); - } - m_state = State::INITIALIZED; + m_state = State::INITIALIZED; + + if( m_commandLineOptions->printMemoryUsage >= 0.0 ) + { + dataRepository::printMemoryAllocation( getProblemManager(), 0, m_commandLineOptions->printMemoryUsage ); + } - if( m_commandLineOptions->printMemoryUsage >= 0.0 ) + return true; + } + catch(std::exception const & e) { - dataRepository::printMemoryAllocation( getProblemManager(), 0, m_commandLineOptions->printMemoryUsage ); + throw; } - - return true; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void GeosxState::applyInitialConditions() { - GEOS_MARK_FUNCTION; - Timer timer( m_initTime ); + try + { + GEOS_MARK_FUNCTION; + Timer timer( m_initTime ); - GEOS_THROW_IF_NE( m_state, State::INITIALIZED, std::logic_error ); + GEOS_THROW_IF_NE( m_state, State::INITIALIZED, std::logic_error ); - getProblemManager().applyInitialConditions(); + getProblemManager().applyInitialConditions(); - if( getCommandLineOptions().beginFromRestart ) + if( getCommandLineOptions().beginFromRestart ) + { + getProblemManager().readRestartOverwrite(); + } + + m_state = State::READY_TO_RUN; + MpiWrapper::barrier( MPI_COMM_GEOS ); + } + catch(std::exception const & e) { - getProblemManager().readRestartOverwrite(); + throw; } - - m_state = State::READY_TO_RUN; - MpiWrapper::barrier( MPI_COMM_GEOS ); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void GeosxState::run() { - GEOS_MARK_FUNCTION; - Timer timer( m_runTime ); + try + { + GEOS_MARK_FUNCTION; + Timer timer( m_runTime ); - GEOS_THROW_IF_NE( m_state, State::READY_TO_RUN, std::logic_error ); + GEOS_THROW_IF_NE( m_state, State::READY_TO_RUN, std::logic_error ); - if( !getProblemManager().runSimulation() ) + if( !getProblemManager().runSimulation() ) + { + m_state = State::COMPLETED; + } + } + catch(std::exception const & e) { - m_state = State::COMPLETED; + throw; } } diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index 432eb9fd1da..12fef72ba7e 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -67,80 +67,87 @@ ProblemManager::ProblemManager( conduit::Node & root ): m_functionManager( nullptr ), m_fieldSpecificationManager( nullptr ) { - // Groups that do not read from the xml - registerGroup< DomainPartition >( groupKeys.domain ); - Group & commandLine = registerGroup< Group >( groupKeys.commandLine ); - commandLine.setRestartFlags( RestartFlags::WRITE ); - - setInputFlags( InputFlags::PROBLEM_ROOT ); - - registerGroup< ExternalDataSourceManager >( groupKeys.externalDataSourceManager ); - - m_fieldSpecificationManager = ®isterGroup< FieldSpecificationManager >( groupKeys.fieldSpecificationManager ); - - m_eventManager = ®isterGroup< EventManager >( groupKeys.eventManager ); - registerGroup< NumericalMethodsManager >( groupKeys.numericalMethodsManager ); - registerGroup< GeometricObjectManager >( groupKeys.geometricObjectManager ); - registerGroup< MeshManager >( groupKeys.meshManager ); - registerGroup< OutputManager >( groupKeys.outputManager ); - m_physicsSolverManager = ®isterGroup< PhysicsSolverManager >( groupKeys.physicsSolverManager ); - m_tasksManager = ®isterGroup< TasksManager >( groupKeys.tasksManager ); - m_functionManager = ®isterGroup< FunctionManager >( groupKeys.functionManager ); - - // Command line entries - commandLine.registerWrapper< string >( viewKeys.inputFileName.key() ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Name of the input xml file." ); - - commandLine.registerWrapper< string >( viewKeys.restartFileName.key() ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Name of the restart file." ); - - commandLine.registerWrapper< integer >( viewKeys.beginFromRestart.key() ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Flag to indicate restart run." ); - - commandLine.registerWrapper< string >( viewKeys.problemName.key() ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Used in writing the output files, if not specified defaults to the name of the input file." ); - - commandLine.registerWrapper< string >( viewKeys.outputDirectory.key() ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Directory in which to put the output files, if not specified defaults to the current directory." ); - - commandLine.registerWrapper< integer >( viewKeys.xPartitionsOverride.key() ). - setApplyDefaultValue( 1 ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Number of partitions in the x-direction" ); - - commandLine.registerWrapper< integer >( viewKeys.yPartitionsOverride.key() ). - setApplyDefaultValue( 1 ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Number of partitions in the y-direction" ); - - commandLine.registerWrapper< integer >( viewKeys.zPartitionsOverride.key() ). - setApplyDefaultValue( 1 ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Number of partitions in the z-direction" ); - - commandLine.registerWrapper< integer >( viewKeys.overridePartitionNumbers.key() ). - setApplyDefaultValue( 0 ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Flag to indicate partition number override" ); - - commandLine.registerWrapper< string >( viewKeys.schemaFileName.key() ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Name of the output schema" ); - - commandLine.registerWrapper< integer >( viewKeys.useNonblockingMPI.key() ). - setApplyDefaultValue( 0 ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Whether to prefer using non-blocking MPI communication where implemented (results in non-deterministic DOF numbering)." ); - - commandLine.registerWrapper< integer >( viewKeys.suppressPinned.key( ) ). - setApplyDefaultValue( 0 ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Whether to disallow using pinned memory allocations for MPI communication buffers." ); + try + { + // Groups that do not read from the xml + registerGroup< DomainPartition >( groupKeys.domain ); + Group & commandLine = registerGroup< Group >( groupKeys.commandLine ); + commandLine.setRestartFlags( RestartFlags::WRITE ); + + setInputFlags( InputFlags::PROBLEM_ROOT ); + + registerGroup< ExternalDataSourceManager >( groupKeys.externalDataSourceManager ); + + m_fieldSpecificationManager = ®isterGroup< FieldSpecificationManager >( groupKeys.fieldSpecificationManager ); + + m_eventManager = ®isterGroup< EventManager >( groupKeys.eventManager ); + registerGroup< NumericalMethodsManager >( groupKeys.numericalMethodsManager ); + registerGroup< GeometricObjectManager >( groupKeys.geometricObjectManager ); + registerGroup< MeshManager >( groupKeys.meshManager ); + registerGroup< OutputManager >( groupKeys.outputManager ); + m_physicsSolverManager = ®isterGroup< PhysicsSolverManager >( groupKeys.physicsSolverManager ); + m_tasksManager = ®isterGroup< TasksManager >( groupKeys.tasksManager ); + m_functionManager = ®isterGroup< FunctionManager >( groupKeys.functionManager ); + + // Command line entries + commandLine.registerWrapper< string >( viewKeys.inputFileName.key() ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Name of the input xml file." ); + + commandLine.registerWrapper< string >( viewKeys.restartFileName.key() ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Name of the restart file." ); + + commandLine.registerWrapper< integer >( viewKeys.beginFromRestart.key() ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Flag to indicate restart run." ); + + commandLine.registerWrapper< string >( viewKeys.problemName.key() ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Used in writing the output files, if not specified defaults to the name of the input file." ); + + commandLine.registerWrapper< string >( viewKeys.outputDirectory.key() ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Directory in which to put the output files, if not specified defaults to the current directory." ); + + commandLine.registerWrapper< integer >( viewKeys.xPartitionsOverride.key() ). + setApplyDefaultValue( 1 ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Number of partitions in the x-direction" ); + + commandLine.registerWrapper< integer >( viewKeys.yPartitionsOverride.key() ). + setApplyDefaultValue( 1 ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Number of partitions in the y-direction" ); + + commandLine.registerWrapper< integer >( viewKeys.zPartitionsOverride.key() ). + setApplyDefaultValue( 1 ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Number of partitions in the z-direction" ); + + commandLine.registerWrapper< integer >( viewKeys.overridePartitionNumbers.key() ). + setApplyDefaultValue( 0 ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Flag to indicate partition number override" ); + + commandLine.registerWrapper< string >( viewKeys.schemaFileName.key() ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Name of the output schema" ); + + commandLine.registerWrapper< integer >( viewKeys.useNonblockingMPI.key() ). + setApplyDefaultValue( 0 ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Whether to prefer using non-blocking MPI communication where implemented (results in non-deterministic DOF numbering)." ); + + commandLine.registerWrapper< integer >( viewKeys.suppressPinned.key( ) ). + setApplyDefaultValue( 0 ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Whether to disallow using pinned memory allocations for MPI communication buffers." ); + } + catch( std::exception const & e ) + { + throw; + } } ProblemManager::~ProblemManager() @@ -167,140 +174,169 @@ Group * ProblemManager::createChild( string const & GEOS_UNUSED_PARAM( childKey void ProblemManager::problemSetup() { - GEOS_MARK_FUNCTION; - postInputInitializationRecursive(); + try + { + GEOS_MARK_FUNCTION; + + postInputInitializationRecursive(); - generateMesh(); + generateMesh(); -// initialize_postMeshGeneration(); + // initialize_postMeshGeneration(); - applyNumericalMethods(); + applyNumericalMethods(); - registerDataOnMeshRecursive( getDomainPartition().getMeshBodies() ); + registerDataOnMeshRecursive( getDomainPartition().getMeshBodies() ); - initialize(); + initialize(); - importFields(); + importFields(); + } + catch( std::exception const & e ) + { + throw; + } } void ProblemManager::parseCommandLineInput() { - Group & commandLine = getGroup< Group >( groupKeys.commandLine ); + try + { + Group & commandLine = getGroup< Group >( groupKeys.commandLine ); - CommandLineOptions const & opts = getGlobalState().getCommandLineOptions(); + CommandLineOptions const & opts = getGlobalState().getCommandLineOptions(); - commandLine.getReference< string >( viewKeys.restartFileName ) = opts.restartFileName; - commandLine.getReference< integer >( viewKeys.beginFromRestart ) = opts.beginFromRestart; - commandLine.getReference< integer >( viewKeys.xPartitionsOverride ) = opts.xPartitionsOverride; - commandLine.getReference< integer >( viewKeys.yPartitionsOverride ) = opts.yPartitionsOverride; - commandLine.getReference< integer >( viewKeys.zPartitionsOverride ) = opts.zPartitionsOverride; - commandLine.getReference< integer >( viewKeys.overridePartitionNumbers ) = opts.overridePartitionNumbers; - commandLine.getReference< integer >( viewKeys.useNonblockingMPI ) = opts.useNonblockingMPI; - commandLine.getReference< integer >( viewKeys.suppressPinned ) = opts.suppressPinned; + commandLine.getReference< string >( viewKeys.restartFileName ) = opts.restartFileName; + commandLine.getReference< integer >( viewKeys.beginFromRestart ) = opts.beginFromRestart; + commandLine.getReference< integer >( viewKeys.xPartitionsOverride ) = opts.xPartitionsOverride; + commandLine.getReference< integer >( viewKeys.yPartitionsOverride ) = opts.yPartitionsOverride; + commandLine.getReference< integer >( viewKeys.zPartitionsOverride ) = opts.zPartitionsOverride; + commandLine.getReference< integer >( viewKeys.overridePartitionNumbers ) = opts.overridePartitionNumbers; + commandLine.getReference< integer >( viewKeys.useNonblockingMPI ) = opts.useNonblockingMPI; + commandLine.getReference< integer >( viewKeys.suppressPinned ) = opts.suppressPinned; - string & outputDirectory = commandLine.getReference< string >( viewKeys.outputDirectory ); - outputDirectory = opts.outputDirectory; - OutputBase::setOutputDirectory( outputDirectory ); + string & outputDirectory = commandLine.getReference< string >( viewKeys.outputDirectory ); + outputDirectory = opts.outputDirectory; + OutputBase::setOutputDirectory( outputDirectory ); - string & inputFileName = commandLine.getReference< string >( viewKeys.inputFileName ); + string & inputFileName = commandLine.getReference< string >( viewKeys.inputFileName ); - for( string const & xmlFile : opts.inputFileNames ) - { - string const absPath = getAbsolutePath( xmlFile ); - GEOS_LOG_RANK_0( "Opened XML file: " << absPath ); - } + for( string const & xmlFile : opts.inputFileNames ) + { + string const absPath = getAbsolutePath( xmlFile ); + GEOS_LOG_RANK_0( "Opened XML file: " << absPath ); + } - inputFileName = xmlWrapper::buildMultipleInputXML( opts.inputFileNames, outputDirectory ); + inputFileName = xmlWrapper::buildMultipleInputXML( opts.inputFileNames, outputDirectory ); - string & schemaName = commandLine.getReference< string >( viewKeys.schemaFileName ); - schemaName = opts.schemaName; + string & schemaName = commandLine.getReference< string >( viewKeys.schemaFileName ); + schemaName = opts.schemaName; - string & problemName = commandLine.getReference< string >( viewKeys.problemName ); - problemName = opts.problemName; - OutputBase::setFileNameRoot( problemName ); + string & problemName = commandLine.getReference< string >( viewKeys.problemName ); + problemName = opts.problemName; + OutputBase::setFileNameRoot( problemName ); - if( schemaName.empty()) - { - inputFileName = getAbsolutePath( inputFileName ); - Path::setPathPrefix( splitPath( inputFileName ).first ); - } + if( schemaName.empty()) + { + inputFileName = getAbsolutePath( inputFileName ); + Path::setPathPrefix( splitPath( inputFileName ).first ); + } - if( opts.traceDataMigration ) - { - chai::ArrayManager::getInstance()->enableCallbacks(); + if( opts.traceDataMigration ) + { + chai::ArrayManager::getInstance()->enableCallbacks(); + } + else + { + chai::ArrayManager::getInstance()->disableCallbacks(); + } } - else + catch( std::exception const & e ) { - chai::ArrayManager::getInstance()->disableCallbacks(); + throw; } } bool ProblemManager::parseRestart( string & restartFileName, CommandLineOptions const & options ) { - bool const beginFromRestart = options.beginFromRestart; - restartFileName = options.restartFileName; - - if( beginFromRestart == 1 ) + try { - string dirname, basename; - std::tie( dirname, basename ) = splitPath( restartFileName ); + bool const beginFromRestart = options.beginFromRestart; + restartFileName = options.restartFileName; - std::vector< string > dir_contents = readDirectory( dirname ); + if( beginFromRestart == 1 ) + { + string dirname, basename; + std::tie( dirname, basename ) = splitPath( restartFileName ); - GEOS_THROW_IF( dir_contents.empty(), - "Directory gotten from " << restartFileName << " " << dirname << " is empty.", - InputError ); + std::vector< string > dir_contents = readDirectory( dirname ); - std::regex basename_regex( basename ); + GEOS_THROW_IF( dir_contents.empty(), + "Directory gotten from " << restartFileName << " " << dirname << " is empty.", + InputError ); - string min_str; - string & max_match = min_str; - bool match_found = false; - for( string & s : dir_contents ) - { - if( std::regex_match( s, basename_regex )) + std::regex basename_regex( basename ); + + string min_str; + string & max_match = min_str; + bool match_found = false; + for( string & s : dir_contents ) { - match_found = true; - max_match = (s > max_match)? s : max_match; + if( std::regex_match( s, basename_regex )) + { + match_found = true; + max_match = (s > max_match)? s : max_match; + } } - } - GEOS_THROW_IF( !match_found, - "No matches found for pattern " << basename << " in directory " << dirname << ".", - InputError ); + GEOS_THROW_IF( !match_found, + "No matches found for pattern " << basename << " in directory " << dirname << ".", + InputError ); - restartFileName = getAbsolutePath( dirname + "/" + max_match ); - } + restartFileName = getAbsolutePath( dirname + "/" + max_match ); + } - return beginFromRestart; + return beginFromRestart; + } + catch( std::exception const & e ) + { + throw; + } } void ProblemManager::generateDocumentation() { // Documentation output - GEOS_LOG_RANK_0( "Trying to generate schema..." ); - Group & commandLine = getGroup< Group >( groupKeys.commandLine ); - string const & schemaName = commandLine.getReference< string >( viewKeys.schemaFileName ); - - if( !schemaName.empty() ) + try { - // Generate an extensive data structure - generateDataStructureSkeleton( 0 ); + GEOS_LOG_RANK_0( "Trying to generate schema..." ); + Group & commandLine = getGroup< Group >( groupKeys.commandLine ); + string const & schemaName = commandLine.getReference< string >( viewKeys.schemaFileName ); - MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); - DomainPartition & domain = getDomainPartition(); - meshManager.generateMeshLevels( domain ); + if( !schemaName.empty() ) + { + // Generate an extensive data structure + generateDataStructureSkeleton( 0 ); + + MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); + DomainPartition & domain = getDomainPartition(); + meshManager.generateMeshLevels( domain ); - registerDataOnMeshRecursive( domain.getMeshBodies() ); + registerDataOnMeshRecursive( domain.getMeshBodies() ); - // Generate schema - schemaUtilities::ConvertDocumentationToSchema( schemaName.c_str(), this, 0 ); + // Generate schema + schemaUtilities::ConvertDocumentationToSchema( schemaName.c_str(), this, 0 ); - // Generate non-schema documentation - schemaUtilities::ConvertDocumentationToSchema((schemaName + ".other").c_str(), this, 1 ); + // Generate non-schema documentation + schemaUtilities::ConvertDocumentationToSchema((schemaName + ".other").c_str(), this, 1 ); + } + } + catch( std::exception const & e ) + { + throw; } } @@ -309,193 +345,232 @@ void ProblemManager::setSchemaDeviations( xmlWrapper::xmlNode schemaRoot, xmlWrapper::xmlNode schemaParent, integer documentationType ) { - xmlWrapper::xmlNode targetChoiceNode = schemaParent.child( "xsd:choice" ); - if( targetChoiceNode.empty() ) + try { - targetChoiceNode = schemaParent.prepend_child( "xsd:choice" ); - targetChoiceNode.append_attribute( "minOccurs" ) = "0"; - targetChoiceNode.append_attribute( "maxOccurs" ) = "unbounded"; - } + xmlWrapper::xmlNode targetChoiceNode = schemaParent.child( "xsd:choice" ); + if( targetChoiceNode.empty() ) + { + targetChoiceNode = schemaParent.prepend_child( "xsd:choice" ); + targetChoiceNode.append_attribute( "minOccurs" ) = "0"; + targetChoiceNode.append_attribute( "maxOccurs" ) = "unbounded"; + } - // These objects are handled differently during the xml read step, - // so we need to explicitly add them into the schema structure - DomainPartition & domain = getDomainPartition(); + // These objects are handled differently during the xml read step, + // so we need to explicitly add them into the schema structure + DomainPartition & domain = getDomainPartition(); - m_functionManager->generateDataStructureSkeleton( 0 ); - schemaUtilities::SchemaConstruction( *m_functionManager, schemaRoot, targetChoiceNode, documentationType ); + m_functionManager->generateDataStructureSkeleton( 0 ); + schemaUtilities::SchemaConstruction( *m_functionManager, schemaRoot, targetChoiceNode, documentationType ); - m_fieldSpecificationManager->generateDataStructureSkeleton( 0 ); - schemaUtilities::SchemaConstruction( *m_fieldSpecificationManager, schemaRoot, targetChoiceNode, documentationType ); + m_fieldSpecificationManager->generateDataStructureSkeleton( 0 ); + schemaUtilities::SchemaConstruction( *m_fieldSpecificationManager, schemaRoot, targetChoiceNode, documentationType ); - ConstitutiveManager & constitutiveManager = domain.getGroup< ConstitutiveManager >( groupKeys.constitutiveManager ); - schemaUtilities::SchemaConstruction( constitutiveManager, schemaRoot, targetChoiceNode, documentationType ); + ConstitutiveManager & constitutiveManager = domain.getGroup< ConstitutiveManager >( groupKeys.constitutiveManager ); + schemaUtilities::SchemaConstruction( constitutiveManager, schemaRoot, targetChoiceNode, documentationType ); - MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); - meshManager.generateMeshLevels( domain ); - ElementRegionManager & elementManager = domain.getMeshBody( 0 ).getBaseDiscretization().getElemManager(); - elementManager.generateDataStructureSkeleton( 0 ); - schemaUtilities::SchemaConstruction( elementManager, schemaRoot, targetChoiceNode, documentationType ); - ParticleManager & particleManager = domain.getMeshBody( 0 ).getBaseDiscretization().getParticleManager(); // TODO is this necessary? SJP - particleManager.generateDataStructureSkeleton( 0 ); - schemaUtilities::SchemaConstruction( particleManager, schemaRoot, targetChoiceNode, documentationType ); + MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); + meshManager.generateMeshLevels( domain ); + ElementRegionManager & elementManager = domain.getMeshBody( 0 ).getBaseDiscretization().getElemManager(); + elementManager.generateDataStructureSkeleton( 0 ); + schemaUtilities::SchemaConstruction( elementManager, schemaRoot, targetChoiceNode, documentationType ); + ParticleManager & particleManager = domain.getMeshBody( 0 ).getBaseDiscretization().getParticleManager(); // TODO is this necessary? SJP + particleManager.generateDataStructureSkeleton( 0 ); + schemaUtilities::SchemaConstruction( particleManager, schemaRoot, targetChoiceNode, documentationType ); - // Add entries that are only used in the pre-processor - Group & IncludedList = this->registerGroup< Group >( xmlWrapper::includedListTag ); - IncludedList.setInputFlags( InputFlags::OPTIONAL ); + // Add entries that are only used in the pre-processor + Group & IncludedList = this->registerGroup< Group >( xmlWrapper::includedListTag ); + IncludedList.setInputFlags( InputFlags::OPTIONAL ); - Group & includedFile = IncludedList.registerGroup< Group >( xmlWrapper::includedFileTag ); - includedFile.setInputFlags( InputFlags::OPTIONAL_NONUNIQUE ); - // the name of includedFile is actually a Path. - includedFile.registerWrapper< string >( "name" ). - setInputFlag( InputFlags::REQUIRED ). - setRTTypeName( rtTypes::getTypeName( typeid( Path ) ) ). - setDescription( "The relative file path." ); + Group & includedFile = IncludedList.registerGroup< Group >( xmlWrapper::includedFileTag ); + includedFile.setInputFlags( InputFlags::OPTIONAL_NONUNIQUE ); + // the name of includedFile is actually a Path. + includedFile.registerWrapper< string >( "name" ). + setInputFlag( InputFlags::REQUIRED ). + setRTTypeName( rtTypes::getTypeName( typeid( Path ) ) ). + setDescription( "The relative file path." ); - schemaUtilities::SchemaConstruction( IncludedList, schemaRoot, targetChoiceNode, documentationType ); + schemaUtilities::SchemaConstruction( IncludedList, schemaRoot, targetChoiceNode, documentationType ); - Group & parameterList = this->registerGroup< Group >( "Parameters" ); - parameterList.setInputFlags( InputFlags::OPTIONAL ); + Group & parameterList = this->registerGroup< Group >( "Parameters" ); + parameterList.setInputFlags( InputFlags::OPTIONAL ); - Group & parameter = parameterList.registerGroup< Group >( "Parameter" ); - parameter.setInputFlags( InputFlags::OPTIONAL_NONUNIQUE ); - parameter.registerWrapper< string >( "value" ). - setInputFlag( InputFlags::REQUIRED ). - setDescription( "Input parameter definition for the preprocessor" ); + Group & parameter = parameterList.registerGroup< Group >( "Parameter" ); + parameter.setInputFlags( InputFlags::OPTIONAL_NONUNIQUE ); + parameter.registerWrapper< string >( "value" ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Input parameter definition for the preprocessor" ); - schemaUtilities::SchemaConstruction( parameterList, schemaRoot, targetChoiceNode, documentationType ); + schemaUtilities::SchemaConstruction( parameterList, schemaRoot, targetChoiceNode, documentationType ); - Group & benchmarks = this->registerGroup< Group >( "Benchmarks" ); - benchmarks.setInputFlags( InputFlags::OPTIONAL ); + Group & benchmarks = this->registerGroup< Group >( "Benchmarks" ); + benchmarks.setInputFlags( InputFlags::OPTIONAL ); - for( string const machineName : {"quartz", "lassen", "crusher" } ) - { - Group & machine = benchmarks.registerGroup< Group >( machineName ); - machine.setInputFlags( InputFlags::OPTIONAL ); + for( string const machineName : {"quartz", "lassen", "crusher" } ) + { + Group & machine = benchmarks.registerGroup< Group >( machineName ); + machine.setInputFlags( InputFlags::OPTIONAL ); - Group & run = machine.registerGroup< Group >( "Run" ); - run.setInputFlags( InputFlags::OPTIONAL ); + Group & run = machine.registerGroup< Group >( "Run" ); + run.setInputFlags( InputFlags::OPTIONAL ); - run.registerWrapper< string >( "name" ).setInputFlag( InputFlags::REQUIRED ). - setDescription( "The name of this benchmark." ); + run.registerWrapper< string >( "name" ).setInputFlag( InputFlags::REQUIRED ). + setDescription( "The name of this benchmark." ); - run.registerWrapper< int >( "timeLimit" ).setInputFlag( InputFlags::OPTIONAL ). - setDescription( "The time limit of the benchmark." ); + run.registerWrapper< int >( "timeLimit" ).setInputFlag( InputFlags::OPTIONAL ). + setDescription( "The time limit of the benchmark." ); - run.registerWrapper< string >( "args" ).setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Any extra command line arguments to pass to GEOSX." ); + run.registerWrapper< string >( "args" ).setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Any extra command line arguments to pass to GEOSX." ); - run.registerWrapper< string >( "autoPartition" ).setInputFlag( InputFlags::OPTIONAL ). - setDescription( "May be 'Off' or 'On', if 'On' partitioning arguments are created automatically. Default is Off." ); + run.registerWrapper< string >( "autoPartition" ).setInputFlag( InputFlags::OPTIONAL ). + setDescription( "May be 'Off' or 'On', if 'On' partitioning arguments are created automatically. Default is Off." ); - run.registerWrapper< string >( "scaling" ).setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Whether to run a scaling, and which type of scaling to run." ); + run.registerWrapper< string >( "scaling" ).setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Whether to run a scaling, and which type of scaling to run." ); - run.registerWrapper< int >( "nodes" ).setInputFlag( InputFlags::OPTIONAL ). - setDescription( "The number of nodes needed to run the base benchmark, default is 1." ); + run.registerWrapper< int >( "nodes" ).setInputFlag( InputFlags::OPTIONAL ). + setDescription( "The number of nodes needed to run the base benchmark, default is 1." ); - run.registerWrapper< int >( "tasksPerNode" ).setInputFlag( InputFlags::REQUIRED ). - setDescription( "The number of tasks per node to run the benchmark with." ); + run.registerWrapper< int >( "tasksPerNode" ).setInputFlag( InputFlags::REQUIRED ). + setDescription( "The number of tasks per node to run the benchmark with." ); - run.registerWrapper< int >( "threadsPerTask" ).setInputFlag( InputFlags::OPTIONAL ). - setDescription( "The number of threads per task to run the benchmark with." ); + run.registerWrapper< int >( "threadsPerTask" ).setInputFlag( InputFlags::OPTIONAL ). + setDescription( "The number of threads per task to run the benchmark with." ); - run.registerWrapper< array1d< int > >( "meshSizes" ).setInputFlag( InputFlags::OPTIONAL ). - setDescription( "The target number of elements in the internal mesh (per-process for weak scaling, globally for strong scaling) default doesn't modify the internalMesh." ); + run.registerWrapper< array1d< int > >( "meshSizes" ).setInputFlag( InputFlags::OPTIONAL ). + setDescription( "The target number of elements in the internal mesh (per-process for weak scaling, globally for strong scaling) default doesn't modify the internalMesh." ); - run.registerWrapper< array1d< int > >( "scaleList" ).setInputFlag( InputFlags::OPTIONAL ). - setDescription( "The scales at which to run the problem ( scale * nodes * tasksPerNode )." ); - } + run.registerWrapper< array1d< int > >( "scaleList" ).setInputFlag( InputFlags::OPTIONAL ). + setDescription( "The scales at which to run the problem ( scale * nodes * tasksPerNode )." ); + } - schemaUtilities::SchemaConstruction( benchmarks, schemaRoot, targetChoiceNode, documentationType ); + schemaUtilities::SchemaConstruction( benchmarks, schemaRoot, targetChoiceNode, documentationType ); + } + catch( std::exception const & e ) + { + throw; + } } void ProblemManager::parseInputFile() { - Group & commandLine = getGroup( groupKeys.commandLine ); - string const & inputFileName = commandLine.getReference< string >( viewKeys.inputFileName ); + try + { + Group & commandLine = getGroup( groupKeys.commandLine ); + string const & inputFileName = commandLine.getReference< string >( viewKeys.inputFileName ); - // Load preprocessed xml file - xmlWrapper::xmlDocument xmlDocument; - xmlWrapper::xmlResult const xmlResult = xmlDocument.loadFile( inputFileName, true ); - GEOS_THROW_IF( !xmlResult, GEOS_FMT( "Errors found while parsing XML file {}\nDescription: {}\nOffset: {}", - inputFileName, xmlResult.description(), xmlResult.offset ), InputError ); + // Load preprocessed xml file + xmlWrapper::xmlDocument xmlDocument; + xmlWrapper::xmlResult const xmlResult = xmlDocument.loadFile( inputFileName, true ); + GEOS_THROW_IF( !xmlResult, GEOS_FMT( "Errors found while parsing XML file {}\nDescription: {}\nOffset: {}", + inputFileName, xmlResult.description(), xmlResult.offset ), InputError ); - // Parse the results - parseXMLDocument( xmlDocument ); + // Parse the results + parseXMLDocument( xmlDocument ); + } + catch( std::exception const & e ) + { + std::cout << "Test retour exception" << e.what() << std::endl; + errorLogger.currentErrorMsg() + .addToMsg( e ) + .setCodeLocation( __FILE__, __LINE__ ) + .setType( ErrorLogger::MsgType::Error ); + + std::cout << "HELLOOOO" << std::endl; + std::cerr << "parseInputFile error:" << std::endl; + std::cerr << "Error type: " << errorLogger.toString( errorLogger.getCurrentErrorMsg().type ) << std::endl; + std::cerr << "Error msg: " << errorLogger.getCurrentErrorMsg().msg << std::endl; + std::cerr << "Error location: " << errorLogger.getCurrentErrorMsg().file << errorLogger.getCurrentErrorMsg().line << std::endl; + throw; + } } void ProblemManager::parseInputString( string const & xmlString ) { - // Load preprocessed xml file - xmlWrapper::xmlDocument xmlDocument; - xmlWrapper::xmlResult xmlResult = xmlDocument.loadString( xmlString, true ); - GEOS_THROW_IF( !xmlResult, GEOS_FMT( "Errors found while parsing XML string\nDescription: {}\nOffset: {}", - xmlResult.description(), xmlResult.offset ), InputError ); - - // Parse the results - parseXMLDocument( xmlDocument ); + try + { + // Load preprocessed xml file + xmlWrapper::xmlDocument xmlDocument; + xmlWrapper::xmlResult xmlResult = xmlDocument.loadString( xmlString, true ); + GEOS_THROW_IF( !xmlResult, GEOS_FMT( "Errors found while parsing XML string\nDescription: {}\nOffset: {}", + xmlResult.description(), xmlResult.offset ), InputError ); + + // Parse the results + parseXMLDocument( xmlDocument ); + } + catch( std::exception const & e ) + { + throw; + } } void ProblemManager::parseXMLDocument( xmlWrapper::xmlDocument & xmlDocument ) { - // Extract the problem node and begin processing the user inputs - xmlWrapper::xmlNode xmlProblemNode = xmlDocument.getChild( this->getName().c_str() ); - processInputFileRecursive( xmlDocument, xmlProblemNode ); - - // The objects in domain are handled separately for now + try { - DomainPartition & domain = getDomainPartition(); - ConstitutiveManager & constitutiveManager = domain.getGroup< ConstitutiveManager >( groupKeys.constitutiveManager ); - xmlWrapper::xmlNode topLevelNode = xmlProblemNode.child( constitutiveManager.getName().c_str()); - constitutiveManager.processInputFileRecursive( xmlDocument, topLevelNode ); + // Extract the problem node and begin processing the user inputs + xmlWrapper::xmlNode xmlProblemNode = xmlDocument.getChild( this->getName().c_str() ); + processInputFileRecursive( xmlDocument, xmlProblemNode ); - // Open mesh levels - MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); - meshManager.generateMeshLevels( domain ); - Group & meshBodies = domain.getMeshBodies(); - - auto parseRegions = [&]( string_view regionManagerKey, bool const hasParticles ) + // The objects in domain are handled separately for now { - xmlWrapper::xmlNode regionsNode = xmlProblemNode.child( regionManagerKey.data() ); - xmlWrapper::xmlNodePos regionsNodePos = xmlDocument.getNodePosition( regionsNode ); - std::set< string > regionNames; + DomainPartition & domain = getDomainPartition(); + ConstitutiveManager & constitutiveManager = domain.getGroup< ConstitutiveManager >( groupKeys.constitutiveManager ); + xmlWrapper::xmlNode topLevelNode = xmlProblemNode.child( constitutiveManager.getName().c_str()); + constitutiveManager.processInputFileRecursive( xmlDocument, topLevelNode ); + + // Open mesh levels + MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); + meshManager.generateMeshLevels( domain ); + Group & meshBodies = domain.getMeshBodies(); - for( xmlWrapper::xmlNode regionNode : regionsNode.children() ) + auto parseRegions = [&]( string_view regionManagerKey, bool const hasParticles ) { - auto const regionNodePos = xmlDocument.getNodePosition( regionNode ); - string const regionName = Group::processInputName( regionNode, regionNodePos, - regionsNode.name(), regionsNodePos, regionNames ); - try + xmlWrapper::xmlNode regionsNode = xmlProblemNode.child( regionManagerKey.data() ); + xmlWrapper::xmlNodePos regionsNodePos = xmlDocument.getNodePosition( regionsNode ); + std::set< string > regionNames; + + for( xmlWrapper::xmlNode regionNode : regionsNode.children() ) { - string const regionMeshBodyName = - ElementRegionBase::verifyMeshBodyName( meshBodies, - regionNode.attribute( "meshBody" ).value() ); + auto const regionNodePos = xmlDocument.getNodePosition( regionNode ); + string const regionName = Group::processInputName( regionNode, regionNodePos, + regionsNode.name(), regionsNodePos, regionNames ); + try + { + string const regionMeshBodyName = + ElementRegionBase::verifyMeshBodyName( meshBodies, + regionNode.attribute( "meshBody" ).value() ); - MeshBody & meshBody = domain.getMeshBody( regionMeshBodyName ); - meshBody.setHasParticles( hasParticles ); - meshBody.forMeshLevels( [&]( MeshLevel & meshLevel ) + MeshBody & meshBody = domain.getMeshBody( regionMeshBodyName ); + meshBody.setHasParticles( hasParticles ); + meshBody.forMeshLevels( [&]( MeshLevel & meshLevel ) + { + ObjectManagerBase & elementManager = hasParticles ? + static_cast< ObjectManagerBase & >( meshLevel.getParticleManager() ): + static_cast< ObjectManagerBase & >( meshLevel.getElemManager() ); + Group * newRegion = elementManager.createChild( regionNode.name(), regionName ); + newRegion->processInputFileRecursive( xmlDocument, regionNode ); + } ); + } + catch( InputError const & e ) { - ObjectManagerBase & elementManager = hasParticles ? - static_cast< ObjectManagerBase & >( meshLevel.getParticleManager() ): - static_cast< ObjectManagerBase & >( meshLevel.getElemManager() ); - Group * newRegion = elementManager.createChild( regionNode.name(), regionName ); - newRegion->processInputFileRecursive( xmlDocument, regionNode ); - } ); - } - catch( InputError const & e ) - { - throw InputError( e, GEOS_FMT( "Error while parsing region {} ({}):\n", - regionName, regionNodePos.toString() ) ); + throw InputError( e, GEOS_FMT( "Error while parsing region {} ({}):\n", + regionName, regionNodePos.toString() ) ); + } } - } - }; + }; - parseRegions( MeshLevel::groupStructKeys::elemManagerString(), false ); - parseRegions( MeshLevel::groupStructKeys::particleManagerString(), true ); + parseRegions( MeshLevel::groupStructKeys::elemManagerString(), false ); + parseRegions( MeshLevel::groupStructKeys::particleManagerString(), true ); + } + } + catch( std::exception const & e ) + { + throw; } } @@ -580,167 +655,186 @@ void ProblemManager::initializationOrder( string_array & order ) void ProblemManager::generateMesh() { - GEOS_MARK_FUNCTION; - DomainPartition & domain = getDomainPartition(); - - MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); + try + { + GEOS_MARK_FUNCTION; + DomainPartition & domain = getDomainPartition(); - meshManager.generateMeshes( domain ); + MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); - // get all the discretizations from the numerical methods. - // map< pair< mesh body name, pointer to discretization>, array of region names > - map< std::pair< string, Group const * const >, string_array const & > - discretizations = getDiscretizations(); + meshManager.generateMeshes( domain ); - // setup the base discretizations (hard code this for now) - domain.forMeshBodies( [&]( MeshBody & meshBody ) - { - MeshLevel & baseMesh = meshBody.getBaseDiscretization(); - string_array junk; + // get all the discretizations from the numerical methods. + // map< pair< mesh body name, pointer to discretization>, array of region names > + map< std::pair< string, Group const * const >, string_array const & > + discretizations = getDiscretizations(); - if( meshBody.hasParticles() ) // mesh bodies with particles load their data into particle blocks, not cell blocks + // setup the base discretizations (hard code this for now) + domain.forMeshBodies( [&]( MeshBody & meshBody ) { - ParticleBlockManagerABC & particleBlockManager = meshBody.getGroup< ParticleBlockManagerABC >( keys::particleManager ); + MeshLevel & baseMesh = meshBody.getBaseDiscretization(); + string_array junk; - this->generateMeshLevel( baseMesh, - particleBlockManager, - junk ); - } - else - { - CellBlockManagerABC & cellBlockManager = meshBody.getGroup< CellBlockManagerABC >( keys::cellManager ); + if( meshBody.hasParticles() ) // mesh bodies with particles load their data into particle blocks, not cell blocks + { + ParticleBlockManagerABC & particleBlockManager = meshBody.getGroup< ParticleBlockManagerABC >( keys::particleManager ); - this->generateMeshLevel( baseMesh, - cellBlockManager, - nullptr, - junk ); + this->generateMeshLevel( baseMesh, + particleBlockManager, + junk ); + } + else + { + CellBlockManagerABC & cellBlockManager = meshBody.getGroup< CellBlockManagerABC >( keys::cellManager ); - ElementRegionManager & elemManager = baseMesh.getElemManager(); - elemManager.generateWells( cellBlockManager, baseMesh ); - } - } ); + this->generateMeshLevel( baseMesh, + cellBlockManager, + nullptr, + junk ); - Group const & commandLine = this->getGroup< Group >( groupKeys.commandLine ); - integer const useNonblockingMPI = commandLine.getReference< integer >( viewKeys.useNonblockingMPI ); - domain.setupBaseLevelMeshGlobalInfo(); + ElementRegionManager & elemManager = baseMesh.getElemManager(); + elemManager.generateWells( cellBlockManager, baseMesh ); + } + } ); - // setup the MeshLevel associated with the discretizations - for( auto const & discretizationPair: discretizations ) - { - string const & meshBodyName = discretizationPair.first.first; - MeshBody & meshBody = domain.getMeshBody( meshBodyName ); + Group const & commandLine = this->getGroup< Group >( groupKeys.commandLine ); + integer const useNonblockingMPI = commandLine.getReference< integer >( viewKeys.useNonblockingMPI ); + domain.setupBaseLevelMeshGlobalInfo(); - if( discretizationPair.first.second!=nullptr && !meshBody.hasParticles() ) // this check shouldn't be required - { // particle mesh bodies don't have a finite element - // discretization - FiniteElementDiscretization const * const - feDiscretization = dynamic_cast< FiniteElementDiscretization const * >( discretizationPair.first.second ); + // setup the MeshLevel associated with the discretizations + for( auto const & discretizationPair: discretizations ) + { + string const & meshBodyName = discretizationPair.first.first; + MeshBody & meshBody = domain.getMeshBody( meshBodyName ); - // if the discretization is a finite element discretization - if( feDiscretization != nullptr ) - { - int const order = feDiscretization->getOrder(); - string const & discretizationName = feDiscretization->getName(); - string_array const & regionNames = discretizationPair.second; - CellBlockManagerABC const & cellBlockManager = meshBody.getCellBlockManager(); + if( discretizationPair.first.second!=nullptr && !meshBody.hasParticles() ) // this check shouldn't be required + { // particle mesh bodies don't have a finite element + // discretization + FiniteElementDiscretization const * const + feDiscretization = dynamic_cast< FiniteElementDiscretization const * >( discretizationPair.first.second ); - // create a high order MeshLevel - if( order > 1 ) + // if the discretization is a finite element discretization + if( feDiscretization != nullptr ) { - MeshLevel & mesh = meshBody.createMeshLevel( MeshBody::groupStructKeys::baseDiscretizationString(), - discretizationName, order ); + int const order = feDiscretization->getOrder(); + string const & discretizationName = feDiscretization->getName(); + string_array const & regionNames = discretizationPair.second; + CellBlockManagerABC const & cellBlockManager = meshBody.getCellBlockManager(); + + // create a high order MeshLevel + if( order > 1 ) + { + MeshLevel & mesh = meshBody.createMeshLevel( MeshBody::groupStructKeys::baseDiscretizationString(), + discretizationName, order ); - this->generateMeshLevel( mesh, - cellBlockManager, - feDiscretization, - regionNames ); + this->generateMeshLevel( mesh, + cellBlockManager, + feDiscretization, + regionNames ); + } + // Just create a shallow copy of the base discretization. + else if( order==1 ) + { + meshBody.createShallowMeshLevel( MeshBody::groupStructKeys::baseDiscretizationString(), + discretizationName ); + } } - // Just create a shallow copy of the base discretization. - else if( order==1 ) + else // this is a finite volume discretization...i hope { - meshBody.createShallowMeshLevel( MeshBody::groupStructKeys::baseDiscretizationString(), - discretizationName ); - } - } - else // this is a finite volume discretization...i hope - { - Group const * const discretization = discretizationPair.first.second; + Group const * const discretization = discretizationPair.first.second; - if( discretization != nullptr ) // ...it is FV if it isn't nullptr - { - string const & discretizationName = discretization->getName(); - meshBody.createShallowMeshLevel( MeshBody::groupStructKeys::baseDiscretizationString(), - discretizationName ); + if( discretization != nullptr ) // ...it is FV if it isn't nullptr + { + string const & discretizationName = discretization->getName(); + meshBody.createShallowMeshLevel( MeshBody::groupStructKeys::baseDiscretizationString(), + discretizationName ); + } } } } - } - domain.setupCommunications( useNonblockingMPI ); - domain.outputPartitionInformation(); + domain.setupCommunications( useNonblockingMPI ); + domain.outputPartitionInformation(); - domain.forMeshBodies( [&]( MeshBody & meshBody ) - { - if( meshBody.hasGroup( keys::particleManager ) ) - { - meshBody.deregisterGroup( keys::particleManager ); - } - else if( meshBody.hasGroup( keys::cellManager ) ) + domain.forMeshBodies( [&]( MeshBody & meshBody ) { - // meshBody.deregisterGroup( keys::cellManager ); - meshBody.deregisterCellBlockManager(); - } - - meshBody.forMeshLevels( [&]( MeshLevel & meshLevel ) - { - FaceManager & faceManager = meshLevel.getFaceManager(); - EdgeManager & edgeManager = meshLevel.getEdgeManager(); - NodeManager const & nodeManager = meshLevel.getNodeManager(); - ElementRegionManager & elementManager = meshLevel.getElemManager(); + if( meshBody.hasGroup( keys::particleManager ) ) + { + meshBody.deregisterGroup( keys::particleManager ); + } + else if( meshBody.hasGroup( keys::cellManager ) ) + { + // meshBody.deregisterGroup( keys::cellManager ); + meshBody.deregisterCellBlockManager(); + } - elementManager.forElementSubRegions< FaceElementSubRegion >( [&]( FaceElementSubRegion & subRegion ) + meshBody.forMeshLevels( [&]( MeshLevel & meshLevel ) { - /// 1. The computation of geometric quantities which is now possible for `FaceElementSubRegion`, - // because the ghosting ensures that the neighbor cells of the fracture elements are available. - // These neighbor cells are providing the node information to the fracture elements. - subRegion.calculateElementGeometricQuantities( nodeManager, faceManager ); + FaceManager & faceManager = meshLevel.getFaceManager(); + EdgeManager & edgeManager = meshLevel.getEdgeManager(); + NodeManager const & nodeManager = meshLevel.getNodeManager(); + ElementRegionManager & elementManager = meshLevel.getElemManager(); - // 2. Reorder the face map based on global numbering of neighboring cells - subRegion.flipFaceMap( faceManager, elementManager ); + elementManager.forElementSubRegions< FaceElementSubRegion >( [&]( FaceElementSubRegion & subRegion ) + { + /// 1. The computation of geometric quantities which is now possible for `FaceElementSubRegion`, + // because the ghosting ensures that the neighbor cells of the fracture elements are available. + // These neighbor cells are providing the node information to the fracture elements. + subRegion.calculateElementGeometricQuantities( nodeManager, faceManager ); - // 3. We flip the face normals of faces adjacent to the faceElements if they are not pointing in the - // direction of the fracture. - subRegion.fixNeighboringFacesNormals( faceManager, elementManager ); - } ); + // 2. Reorder the face map based on global numbering of neighboring cells + subRegion.flipFaceMap( faceManager, elementManager ); - faceManager.setIsExternal(); - edgeManager.setIsExternal( faceManager ); - } ); - } ); + // 3. We flip the face normals of faces adjacent to the faceElements if they are not pointing in the + // direction of the fracture. + subRegion.fixNeighboringFacesNormals( faceManager, elementManager ); + } ); + faceManager.setIsExternal(); + edgeManager.setIsExternal( faceManager ); + } ); + } ); + } + catch( std::exception const & e ) + { + throw; + } } void ProblemManager::importFields() { - GEOS_MARK_FUNCTION; - DomainPartition & domain = getDomainPartition(); - MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); - meshManager.importFields( domain ); + try + { + GEOS_MARK_FUNCTION; + DomainPartition & domain = getDomainPartition(); + MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); + meshManager.importFields( domain ); + } + catch( std::exception const & e ) + { + throw; + } } void ProblemManager::applyNumericalMethods() { + try + { + DomainPartition & domain = getDomainPartition(); + ConstitutiveManager & constitutiveManager = domain.getGroup< ConstitutiveManager >( groupKeys.constitutiveManager ); + Group & meshBodies = domain.getMeshBodies(); - DomainPartition & domain = getDomainPartition(); - ConstitutiveManager & constitutiveManager = domain.getGroup< ConstitutiveManager >( groupKeys.constitutiveManager ); - Group & meshBodies = domain.getMeshBodies(); - - // this contains a key tuple< mesh body name, mesh level name, region name, subregion name> with a value of the number of quadrature - // points. - map< std::tuple< string, string, string, string >, localIndex > const regionQuadrature = calculateRegionQuadrature( meshBodies ); + // this contains a key tuple< mesh body name, mesh level name, region name, subregion name> with a value of the number of quadrature + // points. + map< std::tuple< string, string, string, string >, localIndex > const regionQuadrature = calculateRegionQuadrature( meshBodies ); - setRegionQuadrature( meshBodies, constitutiveManager, regionQuadrature ); + setRegionQuadrature( meshBodies, constitutiveManager, regionQuadrature ); + } + catch( std::exception const & e ) + { + throw; + } } @@ -748,51 +842,57 @@ void ProblemManager::applyNumericalMethods() map< std::pair< string, Group const * const >, string_array const & > ProblemManager::getDiscretizations() const { + try + { + map< std::pair< string, Group const * const >, string_array const & > meshDiscretizations; - map< std::pair< string, Group const * const >, string_array const & > meshDiscretizations; - - NumericalMethodsManager const & - numericalMethodManager = getGroup< NumericalMethodsManager >( groupKeys.numericalMethodsManager.key() ); + NumericalMethodsManager const & + numericalMethodManager = getGroup< NumericalMethodsManager >( groupKeys.numericalMethodsManager.key() ); - FiniteElementDiscretizationManager const & - feDiscretizationManager = numericalMethodManager.getFiniteElementDiscretizationManager(); + FiniteElementDiscretizationManager const & + feDiscretizationManager = numericalMethodManager.getFiniteElementDiscretizationManager(); - FiniteVolumeManager const & - fvDiscretizationManager = numericalMethodManager.getFiniteVolumeManager(); + FiniteVolumeManager const & + fvDiscretizationManager = numericalMethodManager.getFiniteVolumeManager(); - DomainPartition const & domain = getDomainPartition(); - Group const & meshBodies = domain.getMeshBodies(); + DomainPartition const & domain = getDomainPartition(); + Group const & meshBodies = domain.getMeshBodies(); - m_physicsSolverManager->forSubGroups< PhysicsSolverBase >( [&]( PhysicsSolverBase & solver ) - { + m_physicsSolverManager->forSubGroups< PhysicsSolverBase >( [&]( PhysicsSolverBase & solver ) + { - solver.generateMeshTargetsFromTargetRegions( meshBodies ); + solver.generateMeshTargetsFromTargetRegions( meshBodies ); - string const discretizationName = solver.getDiscretizationName(); + string const discretizationName = solver.getDiscretizationName(); - Group const * - discretization = feDiscretizationManager.getGroupPointer( discretizationName ); + Group const * + discretization = feDiscretizationManager.getGroupPointer( discretizationName ); - if( discretization==nullptr ) - { - discretization = fvDiscretizationManager.getGroupPointer( discretizationName ); - } + if( discretization==nullptr ) + { + discretization = fvDiscretizationManager.getGroupPointer( discretizationName ); + } - if( discretization!=nullptr ) - { - solver.forDiscretizationOnMeshTargets( meshBodies, - [&]( string const & meshBodyName, - MeshLevel const &, - auto const & regionNames ) + if( discretization!=nullptr ) { - std::pair< string, Group const * const > key = std::make_pair( meshBodyName, discretization ); - meshDiscretizations.insert( { key, regionNames } ); - } ); - } - } ); + solver.forDiscretizationOnMeshTargets( meshBodies, + [&]( string const & meshBodyName, + MeshLevel const &, + auto const & regionNames ) + { + std::pair< string, Group const * const > key = std::make_pair( meshBodyName, discretization ); + meshDiscretizations.insert( { key, regionNames } ); + } ); + } + } ); - return meshDiscretizations; + return meshDiscretizations; + } + catch( std::exception const & e ) + { + throw; + } } void ProblemManager::generateMeshLevel( MeshLevel & meshLevel, @@ -800,91 +900,105 @@ void ProblemManager::generateMeshLevel( MeshLevel & meshLevel, Group const * const discretization, string_array const & ) { - if( discretization != nullptr ) + try { - auto const * const - feDisc = dynamic_cast< FiniteElementDiscretization const * >(discretization); + if( discretization != nullptr ) + { + auto const * const + feDisc = dynamic_cast< FiniteElementDiscretization const * >(discretization); - auto const * const - fvsDisc = dynamic_cast< FluxApproximationBase const * >(discretization); + auto const * const + fvsDisc = dynamic_cast< FluxApproximationBase const * >(discretization); - auto const * const - fvhDisc = dynamic_cast< HybridMimeticDiscretization const * >(discretization); + auto const * const + fvhDisc = dynamic_cast< HybridMimeticDiscretization const * >(discretization); - if( feDisc==nullptr && fvsDisc==nullptr && fvhDisc==nullptr ) - { - GEOS_ERROR( "Group expected to cast to a discretization object." ); + if( feDisc==nullptr && fvsDisc==nullptr && fvhDisc==nullptr ) + { + GEOS_ERROR( "Group expected to cast to a discretization object." ); + } } - } - NodeManager & nodeManager = meshLevel.getNodeManager(); - EdgeManager & edgeManager = meshLevel.getEdgeManager(); - FaceManager & faceManager = meshLevel.getFaceManager(); - ElementRegionManager & elemRegionManager = meshLevel.getElemManager(); - - bool const isBaseMeshLevel = meshLevel.getName() == MeshBody::groupStructKeys::baseDiscretizationString(); - - elemRegionManager.generateMesh( cellBlockManager ); - nodeManager.setGeometricalRelations( cellBlockManager, elemRegionManager, isBaseMeshLevel ); - edgeManager.setGeometricalRelations( cellBlockManager, isBaseMeshLevel ); - faceManager.setGeometricalRelations( cellBlockManager, elemRegionManager, nodeManager, isBaseMeshLevel ); - nodeManager.constructGlobalToLocalMap( cellBlockManager ); - // Edge, face and element region managers rely on the sets provided by the node manager. - // This is why `nodeManager.buildSets` is called first. - nodeManager.buildSets( cellBlockManager, this->getGroup< GeometricObjectManager >( groupKeys.geometricObjectManager ) ); - edgeManager.buildSets( nodeManager ); - faceManager.buildSets( nodeManager ); - elemRegionManager.buildSets( nodeManager ); - // The edge manager do not hold any information related to the regions nor the elements. - // This is why the element region manager is not provided. - nodeManager.setupRelatedObjectsInRelations( edgeManager, faceManager, elemRegionManager ); - edgeManager.setupRelatedObjectsInRelations( nodeManager, faceManager ); - faceManager.setupRelatedObjectsInRelations( nodeManager, edgeManager, elemRegionManager ); - // Node and edge managers rely on the boundary information provided by the face manager. - // This is why `faceManager.setDomainBoundaryObjects` is called first. - faceManager.setDomainBoundaryObjects( elemRegionManager ); - edgeManager.setDomainBoundaryObjects( faceManager ); - nodeManager.setDomainBoundaryObjects( faceManager, edgeManager ); - - meshLevel.generateSets(); - - elemRegionManager.forElementSubRegions< ElementSubRegionBase >( [&]( ElementSubRegionBase & subRegion ) - { - subRegion.setupRelatedObjectsInRelations( meshLevel ); - // `FaceElementSubRegion` has no node and therefore needs the nodes positions from the neighbor elements - // in order to compute the geometric quantities. - // And this point of the process, the ghosting has not been done and some elements of the `FaceElementSubRegion` - // can have no neighbor. Making impossible the computation, which is therfore postponed to after the ghosting. - if( isBaseMeshLevel && !dynamicCast< FaceElementSubRegion * >( &subRegion ) ) + NodeManager & nodeManager = meshLevel.getNodeManager(); + EdgeManager & edgeManager = meshLevel.getEdgeManager(); + FaceManager & faceManager = meshLevel.getFaceManager(); + ElementRegionManager & elemRegionManager = meshLevel.getElemManager(); + + bool const isBaseMeshLevel = meshLevel.getName() == MeshBody::groupStructKeys::baseDiscretizationString(); + + elemRegionManager.generateMesh( cellBlockManager ); + nodeManager.setGeometricalRelations( cellBlockManager, elemRegionManager, isBaseMeshLevel ); + edgeManager.setGeometricalRelations( cellBlockManager, isBaseMeshLevel ); + faceManager.setGeometricalRelations( cellBlockManager, elemRegionManager, nodeManager, isBaseMeshLevel ); + nodeManager.constructGlobalToLocalMap( cellBlockManager ); + // Edge, face and element region managers rely on the sets provided by the node manager. + // This is why `nodeManager.buildSets` is called first. + nodeManager.buildSets( cellBlockManager, this->getGroup< GeometricObjectManager >( groupKeys.geometricObjectManager ) ); + edgeManager.buildSets( nodeManager ); + faceManager.buildSets( nodeManager ); + elemRegionManager.buildSets( nodeManager ); + // The edge manager do not hold any information related to the regions nor the elements. + // This is why the element region manager is not provided. + nodeManager.setupRelatedObjectsInRelations( edgeManager, faceManager, elemRegionManager ); + edgeManager.setupRelatedObjectsInRelations( nodeManager, faceManager ); + faceManager.setupRelatedObjectsInRelations( nodeManager, edgeManager, elemRegionManager ); + // Node and edge managers rely on the boundary information provided by the face manager. + // This is why `faceManager.setDomainBoundaryObjects` is called first. + faceManager.setDomainBoundaryObjects( elemRegionManager ); + edgeManager.setDomainBoundaryObjects( faceManager ); + nodeManager.setDomainBoundaryObjects( faceManager, edgeManager ); + + meshLevel.generateSets(); + + elemRegionManager.forElementSubRegions< ElementSubRegionBase >( [&]( ElementSubRegionBase & subRegion ) { - subRegion.calculateElementGeometricQuantities( nodeManager, faceManager ); - } - subRegion.setMaxGlobalIndex(); - } ); - elemRegionManager.setMaxGlobalIndex(); + subRegion.setupRelatedObjectsInRelations( meshLevel ); + // `FaceElementSubRegion` has no node and therefore needs the nodes positions from the neighbor elements + // in order to compute the geometric quantities. + // And this point of the process, the ghosting has not been done and some elements of the `FaceElementSubRegion` + // can have no neighbor. Making impossible the computation, which is therfore postponed to after the ghosting. + if( isBaseMeshLevel && !dynamicCast< FaceElementSubRegion * >( &subRegion ) ) + { + subRegion.calculateElementGeometricQuantities( nodeManager, faceManager ); + } + subRegion.setMaxGlobalIndex(); + } ); + elemRegionManager.setMaxGlobalIndex(); + } + catch( std::exception const & e ) + { + throw; + } } void ProblemManager::generateMeshLevel( MeshLevel & meshLevel, ParticleBlockManagerABC & particleBlockManager, string_array const & ) { - ParticleManager & particleManager = meshLevel.getParticleManager(); - - if( meshLevel.getName() == MeshBody::groupStructKeys::baseDiscretizationString() ) + try { - particleManager.generateMesh( particleBlockManager ); - } + ParticleManager & particleManager = meshLevel.getParticleManager(); + + if( meshLevel.getName() == MeshBody::groupStructKeys::baseDiscretizationString() ) + { + particleManager.generateMesh( particleBlockManager ); + } - meshLevel.generateSets(); + meshLevel.generateSets(); - if( meshLevel.getName() == MeshBody::groupStructKeys::baseDiscretizationString() ) - { - particleManager.forParticleSubRegions< ParticleSubRegionBase >( [&]( ParticleSubRegionBase & subRegion ) + if( meshLevel.getName() == MeshBody::groupStructKeys::baseDiscretizationString() ) { - subRegion.setMaxGlobalIndex(); - } ); + particleManager.forParticleSubRegions< ParticleSubRegionBase >( [&]( ParticleSubRegionBase & subRegion ) + { + subRegion.setMaxGlobalIndex(); + } ); - particleManager.setMaxGlobalIndex(); + particleManager.setMaxGlobalIndex(); + } + } + catch( std::exception const & e ) + { + throw; } } @@ -1125,39 +1239,67 @@ void ProblemManager::setRegionQuadrature( Group & meshBodies, bool ProblemManager::runSimulation() { - return m_eventManager->run( getDomainPartition() ); + try + { + return m_eventManager->run( getDomainPartition() ); + } + catch( std::exception const & e ) + { + throw; + } } DomainPartition & ProblemManager::getDomainPartition() { - return getGroup< DomainPartition >( groupKeys.domain ); + try + { + return getGroup< DomainPartition >( groupKeys.domain ); + } + catch( std::exception const & e ) + { + throw; + } } DomainPartition const & ProblemManager::getDomainPartition() const { - return getGroup< DomainPartition >( groupKeys.domain ); + try + { + return getGroup< DomainPartition >( groupKeys.domain ); + } + catch( std::exception const & e ) + { + throw; + } } void ProblemManager::applyInitialConditions() { - - m_fieldSpecificationManager->forSubGroups< FieldSpecificationBase >( [&]( FieldSpecificationBase & fs ) + try { - fs.setMeshObjectPath( getDomainPartition().getMeshBodies() ); - } ); - getDomainPartition().forMeshBodies( [&] ( MeshBody & meshBody ) - { - meshBody.forMeshLevels( [&] ( MeshLevel & meshLevel ) + m_fieldSpecificationManager->forSubGroups< FieldSpecificationBase >( [&]( FieldSpecificationBase & fs ) { - if( !meshLevel.isShallowCopy() ) // to avoid messages printed three times + fs.setMeshObjectPath( getDomainPartition().getMeshBodies() ); + } ); + + getDomainPartition().forMeshBodies( [&] ( MeshBody & meshBody ) + { + meshBody.forMeshLevels( [&] ( MeshLevel & meshLevel ) { - m_fieldSpecificationManager->validateBoundaryConditions( meshLevel ); - } - m_fieldSpecificationManager->applyInitialConditions( meshLevel ); + if( !meshLevel.isShallowCopy() ) // to avoid messages printed three times + { + m_fieldSpecificationManager->validateBoundaryConditions( meshLevel ); + } + m_fieldSpecificationManager->applyInitialConditions( meshLevel ); + } ); } ); - } ); - initializePostInitialConditions(); + initializePostInitialConditions(); + } + catch( std::exception const & e ) // A bien réécrire + { + throw; + } } void ProblemManager::readRestartOverwrite() From acf4d99111565679b8b665ad32644e54f8d562e3 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Fri, 16 May 2025 13:34:19 +0200 Subject: [PATCH 013/173] Complete: yaml output for PVT tables error --- .../common/logger/ErrorHandling.cpp | 54 +++-- .../common/logger/ErrorHandling.hpp | 205 ++++++------------ src/coreComponents/common/logger/Logger.hpp | 11 +- .../multifluid/CO2Brine/CO2BrineFluid.cpp | 3 + .../dataRepository/DataContext.hpp | 21 +- .../functions/TableFunction.cpp | 24 +- .../mainInterface/ProblemManager.cpp | 29 +-- .../wells/CompositionalMultiphaseWell.cpp | 3 + 8 files changed, 147 insertions(+), 203 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index a885a94f7e9..bf45e4af9aa 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -50,7 +50,12 @@ ErrorLogger::ErrorLogger() void ErrorLogger::ErrorMsg::addContextInfo( std::map< std::string, std::string > && info ) { - contextsInfo.emplace_back( std::move( info ) ); + m_contextsInfo.emplace_back( std::move( info ) ); +} + +void ErrorLogger::ErrorMsg::addRankInfo( int rank ) +{ + m_ranksInfo.push_back( rank ); } void ErrorLogger::ErrorMsg::addCallStackInfo( std::string const & ossStackTrace ) @@ -62,7 +67,7 @@ void ErrorLogger::ErrorMsg::addCallStackInfo( std::string const & ossStackTrace while( std::getline( iss, stackLine) ) { index = stackLine.find(':'); - sourceCallStack.push_back( stackLine.substr( index + 1 ) ); + m_sourceCallStack.push_back( stackLine.substr( index + 1 ) ); } } @@ -78,44 +83,55 @@ std::string ErrorLogger::toString( ErrorLogger::MsgType type ) ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::exception const & e ) { - parent->m_currentErrorMsg.msg = e.what(); + parent->m_currentErrorMsg.m_msg = e.what(); + return parent->m_currentErrorMsg; +} + +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::string const& errorMsg ) +{ + parent->m_currentErrorMsg.m_msg = GEOS_FMT( "{:>6}{}", " ", errorMsg ) + parent->m_currentErrorMsg.m_msg; // Inverser l'ordre FILO return parent->m_currentErrorMsg; } ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setCodeLocation( string msgFile, integer msgLine ) { - parent->m_currentErrorMsg.file = msgFile; - parent->m_currentErrorMsg.line = msgLine; + parent->m_currentErrorMsg.m_file = msgFile; + parent->m_currentErrorMsg.m_line = msgLine; return parent->m_currentErrorMsg; } ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setType( ErrorLogger::MsgType msgType ) { - parent->m_currentErrorMsg.type = msgType; + parent->m_currentErrorMsg.m_type = msgType; return parent->m_currentErrorMsg; } - + void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) //const { - std::cout << "I'm in the write function" << std::endl; std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); if( yamlFile.is_open() ) { - yamlFile << GEOS_FMT( "{:>2}- type: {}\n", " ", errorLogger.toString( errorMsg.type ) ); - yamlFile << GEOS_FMT( "{:>4}message:\n {:>5}{}\n", " ", " ", errorMsg.msg ); - if( errorMsg.contextsInfo.empty() ) + yamlFile << GEOS_FMT( "{:>2}- type: {}\n", " ", errorLogger.toString( errorMsg.m_type ) ); + yamlFile << GEOS_FMT( "{:>4}rank: ", " " ); + for( size_t i = 0; i < errorMsg.m_ranksInfo.size(); i++ ) + { + yamlFile << errorMsg.m_ranksInfo[i]; + } + yamlFile << "\n"; + yamlFile << GEOS_FMT( "{:>4}message: >-\n{} \n", " ", errorMsg.m_msg ); + if( !errorMsg.m_contextsInfo.empty() ) { yamlFile << GEOS_FMT( "{:>4}contexts:\n", " " ); - for( size_t i = 0; i < errorMsg.contextsInfo.size(); i++ ) + for( size_t i = 0; i < errorMsg.m_contextsInfo.size(); i++ ) { - for( auto const & [key, value] : errorMsg.contextsInfo[i] ) + for( auto const & [key, value] : errorMsg.m_contextsInfo[i] ) { if( key == "inputFileLine" ) { yamlFile << GEOS_FMT( "{:>8}{}: {}\n", " ", key, value ); } - else + else { yamlFile << GEOS_FMT( "{:>6}- {}: {}\n", " ", key, value ); } @@ -124,15 +140,15 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) //const } yamlFile << GEOS_FMT( "{:>4}sourceLocation:\n", " " ); - yamlFile << GEOS_FMT( "{:>6}file: {}\n", " ", errorMsg.file ); - yamlFile << GEOS_FMT( "{:>6}line: {}\n", " ", errorMsg.line ); + yamlFile << GEOS_FMT( "{:>6}file: {}\n", " ", errorMsg.m_file ); + yamlFile << GEOS_FMT( "{:>6}line: {}\n", " ", errorMsg.m_line ); yamlFile << GEOS_FMT( "{:>4}sourceCallStack:\n", " " ); - for( size_t i = 0; i < errorMsg.sourceCallStack.size(); i++ ) + for( size_t i = 0; i < errorMsg.m_sourceCallStack.size(); i++ ) { - if( i < 2 || i == errorMsg.sourceCallStack.size() - 1 ) continue; - yamlFile << GEOS_FMT( "{:>6}- {}: {}\n", " ", i-2, errorMsg.sourceCallStack[i] ); + if( i < 2 || i == errorMsg.m_sourceCallStack.size() - 1 ) continue; + yamlFile << GEOS_FMT( "{:>6}- {}: {}\n", " ", i-2, errorMsg.m_sourceCallStack[i] ); } yamlFile.flush(); diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index acb642cdfc6..7db63429aff 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -35,11 +35,17 @@ namespace geos */ class ErrorLogger { + public: + + /** + * @brief Construct a new Error Logger object + * + */ ErrorLogger(); /** - * @enum TypeMsg + * @enum MsgType * Enum listing the different types of possible errors */ enum class MsgType @@ -50,17 +56,22 @@ class ErrorLogger /** * @brief Struct to define the error/warning message - * + * */ struct ErrorMsg { - MsgType type; - std::string msg; - std::string file; - integer line; - std::vector< std::map< std::string, std::string > > contextsInfo; - std::vector< std::string > sourceCallStack; + MsgType m_type; + std::string m_msg; + std::string m_file; + integer m_line; + std::vector< int > m_ranksInfo; + std::vector< std::map< std::string, std::string > > m_contextsInfo; + std::vector< std::string > m_sourceCallStack; + /** + * @brief Construct a new Error Msg object + * + */ ErrorMsg() {}; /** @@ -72,11 +83,39 @@ class ErrorLogger * @param msgLine The line where the error occured */ ErrorMsg( MsgType msgType, std::string msgContent, std::string msgFile, integer msgLine ) - : type( msgType ), msg( msgContent ), file( msgFile ), line( msgLine ) {} + : m_type( msgType ), m_msg( msgContent ), m_file( msgFile ), m_line( msgLine ) {} - ErrorLogger* parent = nullptr; - ErrorMsg & addToMsg( std::exception const & e ); + + ErrorLogger * parent = nullptr; + + /** + * @brief Fill the msg field of the structure with the error message + * + * @param e is the exception + * @return ErrorMsg& + */ + ErrorMsg & addToMsg( std::exception const & e ); + /** + * @brief + * + * @param msg Add information about the error that occured to the msg field of the structure + * @return ErrorMsg& + */ + ErrorMsg & addToMsg( std::string const & msg ); + /** + * @brief Set the Code Location object + * + * @param msgFile + * @param msgLine + * @return ErrorMsg& + */ ErrorMsg & setCodeLocation( string msgFile, integer msgLine ); + /** + * @brief Set the Type object + * + * @param msgType + * @return ErrorMsg& + */ ErrorMsg & setType( MsgType msgType ); /** @@ -86,6 +125,8 @@ class ErrorLogger */ void addContextInfo( std::map< std::string, std::string > && info ); + void addRankInfo( int rank ); + /** * @brief Add stack trace information about the error/warning message to the ErrorMsg structure * @@ -95,142 +136,20 @@ class ErrorLogger }; /** - * @brief Returns the error message information at the step where this getter is called - * @return The current error msg + * @brief Return the error message information at the step where this getter is called + * @return The current error msg */ - ErrorMsg currentErrorMsg() const + ErrorMsg & currentErrorMsg() { return m_currentErrorMsg; } - std::string toString( MsgType type ); - - // ErrorMsg & setMsg( std::exception e ) - // ErrorMsg & setMsg( string msg ); // Chaque catch apl cette procédure - // ErrorMsg & addToMsg( string line ); // Chaque catch apl cette procédure - // ErrorMsg & setCodeLocation( string file, integer line ); // Chaque catch apl cette procédure - /** - * @brief Add the error/warning message into the yaml file - * - * @param errorMsg The error message informations formatted by the associated structure + * @brief Convert a MsgType into a string + * + * @param type + * @return std::string */ - void write( ErrorMsg const & errorMsg ); - -private: - ErrorMsg m_currentErrorMsg; // attribut que l'on est en train de construire -}; - -extern ErrorLogger errorLogger; - -} /* namespace geos */ - -#endif - -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 TotalEnergies - * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2023-2024 Chevron - * Copyright (c) 2019- GEOS/GEOSX Contributors - * All rights reserved - * - * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. - * ------------------------------------------------------------------------------------------------------------ - */ - -/** - * @file ErrorHandling.hpp - */ - -#ifndef INITIALIZATION_ERROR_LOGGER_HPP -#define INITIALIZATION_ERROR_LOGGER_HPP - -// Source includes -#include "common/DataTypes.hpp" -#include "common/format/Format.hpp" - -using namespace std; - -namespace geos -{ - -/** - * @class ErrorLogger - * @brief Class to format and write the error/warning message that occured during the initialization - */ -class ErrorLogger -{ -public: - - ErrorLogger(); - - /** - * @enum TypeMsg - * Enum listing the different types of possible errors - */ - enum class MsgType - { - Error, - Warning - }; - - /** - * @brief Struct to define the error/warning message - * - */ - struct ErrorMsg - { - MsgType type; - std::string msg; - std::string file; - integer line; - std::vector< std::map< std::string, std::string > > contextsInfo; - std::vector< std::string > sourceCallStack; - - /** - * @brief Construct a new Error Msg object - * - * @param t The type of the message (error or warning) - * @param m The error/warning message content - * @param f The file name where the error occured - * @param l The line where the error occured - */ - ErrorMsg( MsgType t, std::string m, std::string f, integer l ): type( t ), msg( m ), file( f ), line( l ) {} - - void buildErrorMsg( ErrorMsg e ); // Chaque catch apl cette procédure - - void buildErrorMsg( string msg ); // Chaque catch apl cette procédure - void buildErrorMsg( string file, integer line ); // Chaque catch apl cette procédure - void buildErrorMsg( std::exception e ); // Chaque catch apl cette procédure - - ErrorMsg getLastBuiltErrorMsg(); // puis write - - // registerErroMsgDetail // un pour chacun des composant stracktrace, ... - - /** - * @brief Add contextual information about the error/warning message to the ErrorMsg structure - * @param info DataContext information stored into a map TODO : documente les clé & valeur - */ - ErrorMsg & addContextInfo( std::map< std::string, std::string > && info ); - - /** - * @brief Add stack trace information about the error/warning message to the ErrorMsg structure - * @param ossStackTrace stack trace information - */ - ErrorMsg & addCallStackInfo( std::string const & ossStackTrace ); - }; - std::string toString( MsgType type ); - void buildErrorMsg( ErrorMsg e ); // Chaque catch apl cette procédure - - - ErrorMsg & getCurrentErrorMsg(); // puis write - - // registerErroMsgDetail // un pour chacun des composant stracktrace, ... - /** * @brief Add the error/warning message into the yaml file * @@ -239,12 +158,12 @@ class ErrorLogger void write( ErrorMsg const & errorMsg ); private: - - ErrorMsg currentErrorMsg; // atttribut que l'on est en train de construire + // The error constructed via exceptions + ErrorMsg m_currentErrorMsg; }; extern ErrorLogger errorLogger; } /* namespace geos */ -#endif +#endif \ No newline at end of file diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 35fb4f2fbaf..73f72610efc 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -194,12 +194,11 @@ __oss << LvArray::system::stackTrace( true ); \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ - __msgoss.str(), \ - __FILE__, \ - __LINE__ ); \ - msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ - errorLogger.write( msgStruct ); \ + errorLogger.currentErrorMsg().setType( ErrorLogger::MsgType::Error ); \ + errorLogger.currentErrorMsg().setCodeLocation( __FILE__, __LINE__ ); \ + errorLogger.currentErrorMsg().addToMsg( __msgoss.str() ); \ + errorLogger.currentErrorMsg().addRankInfo( ::geos::logger::internal::rank ); \ + errorLogger.currentErrorMsg().addCallStackInfo( LvArray::system::stackTrace( true ) ); \ throw EXCEPTIONTYPE( __oss.str() ); \ } \ } while( false ) diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp index 01d49f7c7ac..c5200776935 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp @@ -170,6 +170,7 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const { string const errorMsg = GEOS_FMT( "Table input error for {} phase (in table from \"{}\").\n", m_phaseNames[m_p1Index], m_phasePVTParaFiles[m_p1Index] ); + errorLogger.currentErrorMsg().addToMsg( errorMsg ); throw SimulationError( ex, errorMsg ); } @@ -182,6 +183,7 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const { string const errorMsg = GEOS_FMT( "Table input error for {} phase (in table from \"{}\").\n", m_phaseNames[m_p2Index], m_phasePVTParaFiles[m_p2Index] ); + errorLogger.currentErrorMsg().addToMsg( errorMsg ); throw SimulationError( ex, errorMsg ); } @@ -192,6 +194,7 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const { string const errorMsg = GEOS_FMT( "Table input error for flash phase (in table from \"{}\").\n", m_flashModelParaFile ); + errorLogger.currentErrorMsg().addToMsg( errorMsg ); throw SimulationError( ex, errorMsg ); } } diff --git a/src/coreComponents/dataRepository/DataContext.hpp b/src/coreComponents/dataRepository/DataContext.hpp index 56f0267f278..b77bfed4b88 100644 --- a/src/coreComponents/dataRepository/DataContext.hpp +++ b/src/coreComponents/dataRepository/DataContext.hpp @@ -24,6 +24,7 @@ #include "common/logger/Logger.hpp" #include "xmlWrapper.hpp" #include "common/format/Format.hpp" +#include "common/logger/ErrorHandling.hpp" namespace geos { @@ -218,7 +219,7 @@ class DataFileContext final : public DataContext }; -#define GEOS_THROW_CTX_IF( dataContext, EXP, MSG, EXCEPTIONTYPE ) \ +#define GEOS_THROW_CTX_IF( EXP, MSG, EXCEPTIONTYPE, dataContext ) \ do \ { \ if( EXP ) \ @@ -229,20 +230,20 @@ class DataFileContext final : public DataContext __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ __oss << MSG << "\n"; \ __oss << LvArray::system::stackTrace( true ); \ + std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ - __msgoss.str(), \ - __FILE__, \ - __LINE__ ); \ - msgStruct.addContextInfo( dataContext.getContextInfo() ); \ - msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ - errorLogger.write( msgStruct ); \ + errorLogger.currentErrorMsg().setType( ErrorLogger::MsgType::Error ); \ + errorLogger.currentErrorMsg().setCodeLocation( __FILE__, __LINE__ ); \ + errorLogger.currentErrorMsg().addToMsg( __msgoss.str() ); \ + errorLogger.currentErrorMsg().addRankInfo( ::geos::logger::internal::rank ); \ + errorLogger.currentErrorMsg().addContextInfo( dataContext.getContextInfo() ); \ + errorLogger.currentErrorMsg().addCallStackInfo( LvArray::system::stackTrace( true ) ); \ throw EXCEPTIONTYPE( __oss.str() ); \ } \ } while( false ) -#define GEOS_ERROR_CTX_IF( dataContext, EXP, MSG ) \ +#define GEOS_ERROR_CTX_IF( EXP, MSG, dataContext ) \ do \ { \ if( EXP ) \ @@ -267,7 +268,7 @@ class DataFileContext final : public DataContext } \ } while( false ) -#define GEOS_WARNING_CTX_IF( dataContext, EXP, MSG ) \ +#define GEOS_WARNING_CTX_IF( EXP, MSG, dataContext ) \ do \ { \ if( EXP ) \ diff --git a/src/coreComponents/functions/TableFunction.cpp b/src/coreComponents/functions/TableFunction.cpp index 379ae19922f..2e6de49c5e8 100644 --- a/src/coreComponents/functions/TableFunction.cpp +++ b/src/coreComponents/functions/TableFunction.cpp @@ -182,19 +182,21 @@ void TableFunction::reInitializeFunction() void TableFunction::checkCoord( real64 const coord, localIndex const dim ) const { - GEOS_THROW_IF( dim >= m_coordinates.size() || dim < 0, - GEOS_FMT( "{}: The {} dimension ( no. {} ) doesn't exist in the table.", - getDataContext(), units::getDescription( getDimUnit( dim ) ), dim ), - SimulationError ); + GEOS_THROW_CTX_IF( dim >= m_coordinates.size() || dim < 0, + GEOS_FMT( "{}: The {} dimension ( no. {} ) doesn't exist in the table.", + getDataContext(), units::getDescription( getDimUnit( dim ) ), dim ), + SimulationError, + getDataContext() ); real64 const lowerBound = m_coordinates[dim][0]; real64 const upperBound = m_coordinates[dim][m_coordinates.sizeOfArray( dim ) - 1]; - GEOS_THROW_IF( coord > upperBound || coord < lowerBound, - GEOS_FMT( "{}: Requested {} is out of the table bounds ( lower bound: {} -> upper bound: {} ).", - getDataContext(), - units::formatValue( coord, getDimUnit( dim ) ), - units::formatValue( lowerBound, getDimUnit( dim ) ), - units::formatValue( upperBound, getDimUnit( dim ) ) ), - SimulationError ); + GEOS_THROW_CTX_IF( coord > upperBound || coord < lowerBound, + GEOS_FMT( "{}: Requested {} is out of the table bounds ( lower bound: {} -> upper bound: {} ).", + getDataContext(), + units::formatValue( coord, getDimUnit( dim ) ), + units::formatValue( lowerBound, getDimUnit( dim ) ), + units::formatValue( upperBound, getDimUnit( dim ) ) ), + SimulationError, + getDataContext() ); } TableFunction::KernelWrapper TableFunction::createKernelWrapper() const diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index 12fef72ba7e..638828d1ee5 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -194,7 +194,8 @@ void ProblemManager::problemSetup() } catch( std::exception const & e ) { - throw; + errorLogger.write( errorLogger.currentErrorMsg() ); + throw e; } } @@ -471,18 +472,15 @@ void ProblemManager::parseInputFile() parseXMLDocument( xmlDocument ); } catch( std::exception const & e ) - { - std::cout << "Test retour exception" << e.what() << std::endl; - errorLogger.currentErrorMsg() - .addToMsg( e ) - .setCodeLocation( __FILE__, __LINE__ ) - .setType( ErrorLogger::MsgType::Error ); - - std::cout << "HELLOOOO" << std::endl; - std::cerr << "parseInputFile error:" << std::endl; - std::cerr << "Error type: " << errorLogger.toString( errorLogger.getCurrentErrorMsg().type ) << std::endl; - std::cerr << "Error msg: " << errorLogger.getCurrentErrorMsg().msg << std::endl; - std::cerr << "Error location: " << errorLogger.getCurrentErrorMsg().file << errorLogger.getCurrentErrorMsg().line << std::endl; + { + // TODO: même code mais dans CO2BrineFluid + // errorLogger.currentErrorMsg() + // .addToMsg( e ) + // .setCodeLocation( __FILE__, __LINE__ ) + // .setType( ErrorLogger::MsgType::Error ); + // TODO: + // write( errorLogger.currentErrorMsg ) + // throw e; throw; } } @@ -1245,6 +1243,9 @@ bool ProblemManager::runSimulation() } catch( std::exception const & e ) { + // TODO: implémenter cette méthoe pour éviter la redondance avec write() + // errorLogger.writeCurrentMsg(); + errorLogger.write( errorLogger.currentErrorMsg() ); throw; } } @@ -1296,7 +1297,7 @@ void ProblemManager::applyInitialConditions() } ); initializePostInitialConditions(); } - catch( std::exception const & e ) // A bien réécrire + catch( std::exception const & e ) { throw; } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 77ee9ca0f29..362d5292e50 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -361,6 +361,9 @@ void CompositionalMultiphaseWell::validateWellControlsForFluid( WellControls con } catch( SimulationError const & ex ) { string const errorMsg = GEOS_FMT( "{}: wrong surface pressure / temperature.\n", getDataContext() ); + errorLogger.currentErrorMsg() + .addToMsg( errorMsg ) + .addContextInfo( getDataContext().getContextInfo() ); throw SimulationError( ex, errorMsg ); } } From ee588846379099f7c5d1ce7ee5fb5210d68906b2 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Mon, 19 May 2025 14:29:58 +0200 Subject: [PATCH 014/173] YAML error message well formatted --- .../common/logger/ErrorHandling.cpp | 73 +++++++++++++------ .../common/logger/ErrorHandling.hpp | 7 ++ 2 files changed, 56 insertions(+), 24 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index bf45e4af9aa..23e4a190183 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -26,10 +26,18 @@ #include #include #include +#include namespace geos { static constexpr std::string_view m_filename = "errors.yaml"; +static constexpr std::string_view g_level1Start = " - "; +static constexpr std::string_view g_level1Next = " "; +static constexpr std::string_view g_level2Start = " - "; +static constexpr std::string_view g_level2Next = " "; +static constexpr std::string_view g_level3Start = " - "; +static constexpr std::string_view g_level3Next = " "; + ErrorLogger errorLogger{}; @@ -62,11 +70,11 @@ void ErrorLogger::ErrorMsg::addCallStackInfo( std::string const & ossStackTrace { std::istringstream iss( ossStackTrace ); std::string stackLine; - std::size_t index; + std::size_t index; - while( std::getline( iss, stackLine) ) + while( std::getline( iss, stackLine ) ) { - index = stackLine.find(':'); + index = stackLine.find( ':' ); m_sourceCallStack.push_back( stackLine.substr( index + 1 ) ); } } @@ -83,13 +91,13 @@ std::string ErrorLogger::toString( ErrorLogger::MsgType type ) ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::exception const & e ) { - parent->m_currentErrorMsg.m_msg = e.what(); + parent->m_currentErrorMsg.m_msg = e.what(); return parent->m_currentErrorMsg; } -ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::string const& errorMsg ) +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::string const & errorMsg ) { - parent->m_currentErrorMsg.m_msg = GEOS_FMT( "{:>6}{}", " ", errorMsg ) + parent->m_currentErrorMsg.m_msg; // Inverser l'ordre FILO + parent->m_currentErrorMsg.m_msg = errorMsg + parent->m_currentErrorMsg.m_msg; return parent->m_currentErrorMsg; } @@ -105,50 +113,67 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setType( ErrorLogger::MsgType msg parent->m_currentErrorMsg.m_type = msgType; return parent->m_currentErrorMsg; } - + +void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstream& yamlFile ) +{ + while( !msg.empty() ) + { + const size_t index = msg.find( "\n" ); + std::string_view line = msg.substr( 0, index ); + yamlFile << g_level2Next << line << "\n"; + + if( index == msg.npos ) + break; + msg.remove_prefix( index + 1 ); + } +} + void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) //const { std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); if( yamlFile.is_open() ) { - yamlFile << GEOS_FMT( "{:>2}- type: {}\n", " ", errorLogger.toString( errorMsg.m_type ) ); - yamlFile << GEOS_FMT( "{:>4}rank: ", " " ); + yamlFile << g_level1Start << "type: " << errorLogger.toString( errorMsg.m_type ) << "\n"; + yamlFile << g_level1Next << "rank: "; for( size_t i = 0; i < errorMsg.m_ranksInfo.size(); i++ ) { yamlFile << errorMsg.m_ranksInfo[i]; } yamlFile << "\n"; - yamlFile << GEOS_FMT( "{:>4}message: >-\n{} \n", " ", errorMsg.m_msg ); + yamlFile << g_level1Next << "message: >-\n"; + streamMultilineYamlAttribute( errorMsg.m_msg, yamlFile ); if( !errorMsg.m_contextsInfo.empty() ) { - yamlFile << GEOS_FMT( "{:>4}contexts:\n", " " ); - + yamlFile << g_level1Next << "contexts:\n"; for( size_t i = 0; i < errorMsg.m_contextsInfo.size(); i++ ) { + bool isFirst = true; for( auto const & [key, value] : errorMsg.m_contextsInfo[i] ) { - if( key == "inputFileLine" ) + if( isFirst ) { - yamlFile << GEOS_FMT( "{:>8}{}: {}\n", " ", key, value ); + yamlFile << g_level3Start << key << ": " << value << "\n"; + isFirst = false; } - else + else { - yamlFile << GEOS_FMT( "{:>6}- {}: {}\n", " ", key, value ); + yamlFile << g_level3Next << key << ": " << value << "\n"; } } } } - yamlFile << GEOS_FMT( "{:>4}sourceLocation:\n", " " ); - yamlFile << GEOS_FMT( "{:>6}file: {}\n", " ", errorMsg.m_file ); - yamlFile << GEOS_FMT( "{:>6}line: {}\n", " ", errorMsg.m_line ); - - yamlFile << GEOS_FMT( "{:>4}sourceCallStack:\n", " " ); - + yamlFile << g_level1Next << "sourceLocation:\n"; + yamlFile << g_level2Next << "file: " << errorMsg.m_file << "\n"; + yamlFile << g_level2Next << "line: " << errorMsg.m_line << "\n"; + + yamlFile << g_level1Next << "sourceCallStack:\n"; + for( size_t i = 0; i < errorMsg.m_sourceCallStack.size(); i++ ) { - if( i < 2 || i == errorMsg.m_sourceCallStack.size() - 1 ) continue; - yamlFile << GEOS_FMT( "{:>6}- {}: {}\n", " ", i-2, errorMsg.m_sourceCallStack[i] ); + if( i < 2 || i == errorMsg.m_sourceCallStack.size() - 1 ) + continue; + yamlFile << g_level3Start << i-2 << errorMsg.m_sourceCallStack[i] << "\n"; } yamlFile.flush(); diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 7db63429aff..01b294900d7 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -150,6 +150,13 @@ class ErrorLogger */ std::string toString( MsgType type ); + /** + * @brief Write the error message in the yaml file regarding indentation and line break + * + * @param msg + */ + void streamMultilineYamlAttribute( std::string_view msg, std::ofstream& yamlFile ); + /** * @brief Add the error/warning message into the yaml file * From 32a0237c4d3d6688fe457b742f7390d52c307bc5 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Mon, 19 May 2025 14:52:13 +0200 Subject: [PATCH 015/173] Fix duplication error --- .../mainInterface/ProblemManager.cpp | 170 +++++++++--------- .../mainInterface/ProblemManager.hpp | 5 + 2 files changed, 95 insertions(+), 80 deletions(-) diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index 638828d1ee5..196aee4304a 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -146,7 +146,8 @@ ProblemManager::ProblemManager( conduit::Node & root ): } catch( std::exception const & e ) { - throw; + errorLogger.write( errorLogger.currentErrorMsg() ); + throw e; } } @@ -255,7 +256,8 @@ void ProblemManager::parseCommandLineInput() } catch( std::exception const & e ) { - throw; + errorLogger.write( errorLogger.currentErrorMsg() ); + throw e; } } @@ -303,7 +305,8 @@ bool ProblemManager::parseRestart( string & restartFileName, CommandLineOptions } catch( std::exception const & e ) { - throw; + errorLogger.write( errorLogger.currentErrorMsg() ); + throw e; } } @@ -337,7 +340,8 @@ void ProblemManager::generateDocumentation() } catch( std::exception const & e ) { - throw; + errorLogger.write( errorLogger.currentErrorMsg() ); + throw e; } } @@ -450,7 +454,8 @@ void ProblemManager::setSchemaDeviations( xmlWrapper::xmlNode schemaRoot, } catch( std::exception const & e ) { - throw; + errorLogger.write( errorLogger.currentErrorMsg() ); + throw e; } } @@ -472,16 +477,8 @@ void ProblemManager::parseInputFile() parseXMLDocument( xmlDocument ); } catch( std::exception const & e ) - { - // TODO: même code mais dans CO2BrineFluid - // errorLogger.currentErrorMsg() - // .addToMsg( e ) - // .setCodeLocation( __FILE__, __LINE__ ) - // .setType( ErrorLogger::MsgType::Error ); - // TODO: - // write( errorLogger.currentErrorMsg ) - // throw e; - throw; + { + throw e; } } @@ -501,74 +498,80 @@ void ProblemManager::parseInputString( string const & xmlString ) } catch( std::exception const & e ) { - throw; + errorLogger.write( errorLogger.currentErrorMsg() ); + throw e; } } - void ProblemManager::parseXMLDocument( xmlWrapper::xmlDocument & xmlDocument ) { try { - // Extract the problem node and begin processing the user inputs - xmlWrapper::xmlNode xmlProblemNode = xmlDocument.getChild( this->getName().c_str() ); - processInputFileRecursive( xmlDocument, xmlProblemNode ); + parseXMLDocumentImpl( xmlDocument ); + } + catch( std::exception const & e ) + { + errorLogger.write( errorLogger.currentErrorMsg() ); + throw e; + } +} - // The objects in domain are handled separately for now - { - DomainPartition & domain = getDomainPartition(); - ConstitutiveManager & constitutiveManager = domain.getGroup< ConstitutiveManager >( groupKeys.constitutiveManager ); - xmlWrapper::xmlNode topLevelNode = xmlProblemNode.child( constitutiveManager.getName().c_str()); - constitutiveManager.processInputFileRecursive( xmlDocument, topLevelNode ); +void ProblemManager::parseXMLDocumentImpl( xmlWrapper::xmlDocument & xmlDocument ) +{ + // Extract the problem node and begin processing the user inputs + xmlWrapper::xmlNode xmlProblemNode = xmlDocument.getChild( this->getName().c_str() ); + processInputFileRecursive( xmlDocument, xmlProblemNode ); - // Open mesh levels - MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); - meshManager.generateMeshLevels( domain ); - Group & meshBodies = domain.getMeshBodies(); + // The objects in domain are handled separately for now + { + DomainPartition & domain = getDomainPartition(); + ConstitutiveManager & constitutiveManager = domain.getGroup< ConstitutiveManager >( groupKeys.constitutiveManager ); + xmlWrapper::xmlNode topLevelNode = xmlProblemNode.child( constitutiveManager.getName().c_str()); + constitutiveManager.processInputFileRecursive( xmlDocument, topLevelNode ); - auto parseRegions = [&]( string_view regionManagerKey, bool const hasParticles ) - { - xmlWrapper::xmlNode regionsNode = xmlProblemNode.child( regionManagerKey.data() ); - xmlWrapper::xmlNodePos regionsNodePos = xmlDocument.getNodePosition( regionsNode ); - std::set< string > regionNames; + // Open mesh levels + MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); + meshManager.generateMeshLevels( domain ); + Group & meshBodies = domain.getMeshBodies(); - for( xmlWrapper::xmlNode regionNode : regionsNode.children() ) + auto parseRegions = [&]( string_view regionManagerKey, bool const hasParticles ) + { + xmlWrapper::xmlNode regionsNode = xmlProblemNode.child( regionManagerKey.data() ); + xmlWrapper::xmlNodePos regionsNodePos = xmlDocument.getNodePosition( regionsNode ); + std::set< string > regionNames; + + for( xmlWrapper::xmlNode regionNode : regionsNode.children() ) + { + auto const regionNodePos = xmlDocument.getNodePosition( regionNode ); + string const regionName = Group::processInputName( regionNode, regionNodePos, + regionsNode.name(), regionsNodePos, regionNames ); + try { - auto const regionNodePos = xmlDocument.getNodePosition( regionNode ); - string const regionName = Group::processInputName( regionNode, regionNodePos, - regionsNode.name(), regionsNodePos, regionNames ); - try - { - string const regionMeshBodyName = - ElementRegionBase::verifyMeshBodyName( meshBodies, - regionNode.attribute( "meshBody" ).value() ); + string const regionMeshBodyName = + ElementRegionBase::verifyMeshBodyName( meshBodies, + regionNode.attribute( "meshBody" ).value() ); - MeshBody & meshBody = domain.getMeshBody( regionMeshBodyName ); - meshBody.setHasParticles( hasParticles ); - meshBody.forMeshLevels( [&]( MeshLevel & meshLevel ) - { - ObjectManagerBase & elementManager = hasParticles ? - static_cast< ObjectManagerBase & >( meshLevel.getParticleManager() ): - static_cast< ObjectManagerBase & >( meshLevel.getElemManager() ); - Group * newRegion = elementManager.createChild( regionNode.name(), regionName ); - newRegion->processInputFileRecursive( xmlDocument, regionNode ); - } ); - } - catch( InputError const & e ) + MeshBody & meshBody = domain.getMeshBody( regionMeshBodyName ); + meshBody.setHasParticles( hasParticles ); + meshBody.forMeshLevels( [&]( MeshLevel & meshLevel ) { - throw InputError( e, GEOS_FMT( "Error while parsing region {} ({}):\n", - regionName, regionNodePos.toString() ) ); - } + ObjectManagerBase & elementManager = hasParticles ? + static_cast< ObjectManagerBase & >( meshLevel.getParticleManager() ): + static_cast< ObjectManagerBase & >( meshLevel.getElemManager() ); + Group * newRegion = elementManager.createChild( regionNode.name(), regionName ); + newRegion->processInputFileRecursive( xmlDocument, regionNode ); + } ); + } + catch( InputError const & e ) + { + throw InputError( e, GEOS_FMT( "Error while parsing region {} ({}):\n", + regionName, regionNodePos.toString() ) ); } - }; + } + }; - parseRegions( MeshLevel::groupStructKeys::elemManagerString(), false ); - parseRegions( MeshLevel::groupStructKeys::particleManagerString(), true ); - } - } - catch( std::exception const & e ) - { - throw; + parseRegions( MeshLevel::groupStructKeys::elemManagerString(), false ); + parseRegions( MeshLevel::groupStructKeys::particleManagerString(), true ); } } @@ -795,7 +798,8 @@ void ProblemManager::generateMesh() } catch( std::exception const & e ) { - throw; + errorLogger.write( errorLogger.currentErrorMsg() ); + throw e; } } @@ -811,7 +815,8 @@ void ProblemManager::importFields() } catch( std::exception const & e ) { - throw; + errorLogger.write( errorLogger.currentErrorMsg() ); + throw e; } } @@ -831,7 +836,8 @@ void ProblemManager::applyNumericalMethods() } catch( std::exception const & e ) { - throw; + errorLogger.write( errorLogger.currentErrorMsg() ); + throw e; } } @@ -889,7 +895,8 @@ ProblemManager::getDiscretizations() const } catch( std::exception const & e ) { - throw; + errorLogger.write( errorLogger.currentErrorMsg() ); + throw e; } } @@ -965,7 +972,8 @@ void ProblemManager::generateMeshLevel( MeshLevel & meshLevel, } catch( std::exception const & e ) { - throw; + errorLogger.write( errorLogger.currentErrorMsg() ); + throw e; } } @@ -996,7 +1004,8 @@ void ProblemManager::generateMeshLevel( MeshLevel & meshLevel, } catch( std::exception const & e ) { - throw; + errorLogger.write( errorLogger.currentErrorMsg() ); + throw e; } } @@ -1243,10 +1252,8 @@ bool ProblemManager::runSimulation() } catch( std::exception const & e ) { - // TODO: implémenter cette méthoe pour éviter la redondance avec write() - // errorLogger.writeCurrentMsg(); errorLogger.write( errorLogger.currentErrorMsg() ); - throw; + throw e; } } @@ -1258,7 +1265,8 @@ DomainPartition & ProblemManager::getDomainPartition() } catch( std::exception const & e ) { - throw; + errorLogger.write( errorLogger.currentErrorMsg() ); + throw e; } } @@ -1270,7 +1278,8 @@ DomainPartition const & ProblemManager::getDomainPartition() const } catch( std::exception const & e ) { - throw; + errorLogger.write( errorLogger.currentErrorMsg() ); + throw e; } } @@ -1297,9 +1306,10 @@ void ProblemManager::applyInitialConditions() } ); initializePostInitialConditions(); } - catch( std::exception const & e ) + catch( std::exception const & e ) { - throw; + errorLogger.write( errorLogger.currentErrorMsg() ); + throw e; } } diff --git a/src/coreComponents/mainInterface/ProblemManager.hpp b/src/coreComponents/mainInterface/ProblemManager.hpp index 447ac419885..757d6488c96 100644 --- a/src/coreComponents/mainInterface/ProblemManager.hpp +++ b/src/coreComponents/mainInterface/ProblemManager.hpp @@ -350,6 +350,11 @@ class ProblemManager : public dataRepository::Group map< std::pair< string, Group const * const >, string_array const & > getDiscretizations() const; + /** + * @copydoc parseXMLDocument( xmlWrapper::xmlDocument & xmlDocument ) + */ + void parseXMLDocumentImpl( xmlWrapper::xmlDocument & xmlDocument ); + void generateMeshLevel( MeshLevel & meshLevel, CellBlockManagerABC const & cellBlockManager, Group const * const discretization, From 589270fb33042b3fcb46cfb5333a305e8ee3532f Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 21 May 2025 17:58:29 +0200 Subject: [PATCH 016/173] Add variadic parameters to GEOS_THROW_CTX_IF --- .../common/logger/ErrorHandling.hpp | 63 +++++++++++-------- .../dataRepository/DataContext.hpp | 4 +- 2 files changed, 38 insertions(+), 29 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 01b294900d7..a153512969e 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -40,7 +40,7 @@ class ErrorLogger /** * @brief Construct a new Error Logger object - * + * */ ErrorLogger(); @@ -56,7 +56,7 @@ class ErrorLogger /** * @brief Struct to define the error/warning message - * + * */ struct ErrorMsg { @@ -64,13 +64,13 @@ class ErrorLogger std::string m_msg; std::string m_file; integer m_line; - std::vector< int > m_ranksInfo; + std::vector< int > m_ranksInfo; std::vector< std::map< std::string, std::string > > m_contextsInfo; std::vector< std::string > m_sourceCallStack; /** * @brief Construct a new Error Msg object - * + * */ ErrorMsg() {}; @@ -90,31 +90,31 @@ class ErrorLogger /** * @brief Fill the msg field of the structure with the error message - * - * @param e is the exception - * @return ErrorMsg& + * + * @param e is the exception + * @return ErrorMsg& */ ErrorMsg & addToMsg( std::exception const & e ); /** - * @brief - * + * @brief + * * @param msg Add information about the error that occured to the msg field of the structure - * @return ErrorMsg& + * @return ErrorMsg& */ ErrorMsg & addToMsg( std::string const & msg ); /** * @brief Set the Code Location object - * - * @param msgFile - * @param msgLine - * @return ErrorMsg& + * + * @param msgFile + * @param msgLine + * @return ErrorMsg& */ ErrorMsg & setCodeLocation( string msgFile, integer msgLine ); /** * @brief Set the Type object - * - * @param msgType - * @return ErrorMsg& + * + * @param msgType + * @return ErrorMsg& */ ErrorMsg & setType( MsgType msgType ); @@ -125,8 +125,11 @@ class ErrorLogger */ void addContextInfo( std::map< std::string, std::string > && info ); + template< typename ... Args > + void addContextInfo( Args && ... args ); + void addRankInfo( int rank ); - + /** * @brief Add stack trace information about the error/warning message to the ErrorMsg structure * @@ -143,19 +146,19 @@ class ErrorLogger { return m_currentErrorMsg; } /** - * @brief Convert a MsgType into a string - * - * @param type - * @return std::string + * @brief Convert a MsgType into a string + * + * @param type + * @return std::string */ std::string toString( MsgType type ); /** * @brief Write the error message in the yaml file regarding indentation and line break - * - * @param msg + * + * @param msg */ - void streamMultilineYamlAttribute( std::string_view msg, std::ofstream& yamlFile ); + void streamMultilineYamlAttribute( std::string_view msg, std::ofstream & yamlFile ); /** * @brief Add the error/warning message into the yaml file @@ -166,11 +169,17 @@ class ErrorLogger private: // The error constructed via exceptions - ErrorMsg m_currentErrorMsg; + ErrorMsg m_currentErrorMsg; }; extern ErrorLogger errorLogger; +template< typename ... Args > +void ErrorLogger::ErrorMsg::addContextInfo( Args && ... args ) +{ + ( addContextInfo( args.getContextInfo() ), ... ); +} + } /* namespace geos */ -#endif \ No newline at end of file +#endif diff --git a/src/coreComponents/dataRepository/DataContext.hpp b/src/coreComponents/dataRepository/DataContext.hpp index b77bfed4b88..dc1bb5a5b72 100644 --- a/src/coreComponents/dataRepository/DataContext.hpp +++ b/src/coreComponents/dataRepository/DataContext.hpp @@ -219,7 +219,7 @@ class DataFileContext final : public DataContext }; -#define GEOS_THROW_CTX_IF( EXP, MSG, EXCEPTIONTYPE, dataContext ) \ +#define GEOS_THROW_CTX_IF( EXP, MSG, EXCEPTIONTYPE, ... ) \ do \ { \ if( EXP ) \ @@ -237,7 +237,7 @@ class DataFileContext final : public DataContext errorLogger.currentErrorMsg().setCodeLocation( __FILE__, __LINE__ ); \ errorLogger.currentErrorMsg().addToMsg( __msgoss.str() ); \ errorLogger.currentErrorMsg().addRankInfo( ::geos::logger::internal::rank ); \ - errorLogger.currentErrorMsg().addContextInfo( dataContext.getContextInfo() ); \ + errorLogger.currentErrorMsg().addContextInfo( __VA_ARGS__ ); \ errorLogger.currentErrorMsg().addCallStackInfo( LvArray::system::stackTrace( true ) ); \ throw EXCEPTIONTYPE( __oss.str() ); \ } \ From 9b65581abfda673ca9dab985f1bcde1434dc54d2 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 21 May 2025 17:59:44 +0200 Subject: [PATCH 017/173] Reorganization after operational tests --- src/coreComponents/common/logger/Logger.hpp | 39 ++++++++------------- 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 73f72610efc..4ae21ba3e74 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -134,7 +134,7 @@ */ #define GEOS_LOG_RANK_VAR( var ) GEOS_LOG_RANK( #var " = " << var ) -#define LVARRAY_ERROR_IF_TEST( EXP, MSG ) \ +#define GEOS_ERROR_OUTPUT_IF( EXP, MSG ) \ do \ { \ if( EXP ) \ @@ -158,30 +158,30 @@ } \ } while( false ) -#if defined(GEOS_DEVICE_COMPILE) -#define GEOS_ERROR_IF_TEST( EXP, msg ) LVARRAY_ERROR_IF_TEST( EXP, msg ) -#else -#define GEOS_ERROR_IF_TEST( EXP, msg ) LVARRAY_ERROR_IF_TEST( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) -#endif - /** * @brief Conditionally raise a hard error and terminate the program. * @param EXP an expression that will be evaluated as a predicate * @param msg a message to log (any expression that can be stream inserted) */ #if defined(GEOS_DEVICE_COMPILE) -#define GEOS_ERROR_IF( EXP, msg ) LVARRAY_ERROR_IF( EXP, msg ) +#define GEOS_ERROR_IF( EXP, msg ) GEOS_ERROR_OUTPUT_IF( EXP, msg ) #else -#define GEOS_ERROR_IF( EXP, msg ) LVARRAY_ERROR_IF( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define GEOS_ERROR_IF( EXP, msg ) GEOS_ERROR_OUTPUT_IF( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) #endif +/** + * @brief Raise a hard error and terminate the program. + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ERROR( msg ) GEOS_ERROR_IF( true, msg ) + /** * @brief Conditionally throw an exception. * @param EXP an expression that will be evaluated as a predicate * @param MSG a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define LVARRAY_THROW_IF_TEST( EXP, MSG, EXCEPTIONTYPE ) \ +#define GEOS_THROW_OUTPUT_IF( EXP, MSG, EXCEPTIONTYPE ) \ do \ { \ if( EXP ) \ @@ -192,6 +192,7 @@ __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ __oss << MSG << "\n"; \ __oss << LvArray::system::stackTrace( true ); \ + std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ errorLogger.currentErrorMsg().setType( ErrorLogger::MsgType::Error ); \ @@ -202,8 +203,6 @@ throw EXCEPTIONTYPE( __oss.str() ); \ } \ } while( false ) - -#define GEOS_THROW_IF_TEST( EXP, msg, EXCEPTIONTYPE ) LVARRAY_THROW_IF_TEST( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, EXCEPTIONTYPE ) /** * @brief Conditionally throw an exception. @@ -211,13 +210,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF( EXP, msg, TYPE ) LVARRAY_THROW_IF( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) - -/** - * @brief Raise a hard error and terminate the program. - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ERROR( msg ) GEOS_ERROR_IF( true, msg ) +#define GEOS_THROW_IF( EXP, msg, TYPE ) GEOS_THROW_OUTPUT_IF( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) /** * @brief Throw an exception. @@ -239,7 +232,7 @@ */ #define GEOS_ASSERT( EXP ) GEOS_ASSERT_MSG( EXP, "" ) -#define LVARRAY_WARNING_IF_TEST( EXP, MSG ) \ +#define GEOS_WARNING_OUTPUT_IF( EXP, MSG ) \ do \ { \ if( EXP ) \ @@ -261,20 +254,18 @@ } \ } while( false ) -#define GEOS_WARNING_IF_TEST( EXP, msg ) LVARRAY_WARNING_IF_TEST( EXP, msg ) - /** * @brief Conditionally report a warning. * @param EXP an expression that will be evaluated as a predicate * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_WARNING_IF( EXP, msg ) LVARRAY_WARNING_IF( EXP, msg ) +#define GEOS_WARNING_IF( EXP, msg ) GEOS_WARNING_OUTPUT_IF( EXP, msg ) /** * @brief Report a warning. * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_WARNING( msg ) LVARRAY_WARNING( msg ) +#define GEOS_WARNING( msg ) GEOS_WARNING_IF( true, msg ) /** * @brief Conditionally log an info message. From b13f0a6d77c4402b82e287d0b437bf4e4c0f75da Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 21 May 2025 18:01:37 +0200 Subject: [PATCH 018/173] Apply the output error functionality in yaml to all geos errors --- .../constitutive/ConstitutiveManager.cpp | 22 +- .../JFunctionCapillaryPressure.cpp | 90 +++---- .../TableCapillaryPressure.cpp | 54 ++-- .../constitutive/contact/CoulombFriction.cpp | 6 +- .../contact/HydraulicApertureTable.cpp | 36 +-- .../diffusion/ConstantDiffusion.cpp | 20 +- .../constitutive/diffusion/DiffusionBase.cpp | 8 +- .../dispersion/LinearIsotropicDispersion.cpp | 8 +- .../multifluid/CO2Brine/CO2BrineFluid.cpp | 74 +++--- .../multifluid/blackOil/BlackOilFluid.cpp | 48 ++-- .../multifluid/blackOil/BlackOilFluidBase.cpp | 36 ++- .../multifluid/blackOil/DeadOilFluid.cpp | 30 +-- .../PressureTemperatureCoordinates.cpp | 16 +- .../reactive/ReactiveBrineFluid.cpp | 27 +- .../fluid/singlefluid/ParticleFluid.cpp | 52 ++-- .../ThermalCompressibleSinglePhaseFluid.cpp | 6 +- .../permeability/PressurePermeability.cpp | 5 +- .../BrooksCoreyBakerRelativePermeability.cpp | 6 +- .../BrooksCoreyStone2RelativePermeability.cpp | 6 +- .../TableRelativePermeability.cpp | 104 ++++---- .../TableRelativePermeabilityHelpers.cpp | 24 +- .../TableRelativePermeabilityHysteresis.cpp | 240 +++++++++--------- .../VanGenuchtenBakerRelativePermeability.cpp | 6 +- ...VanGenuchtenStone2RelativePermeability.cpp | 6 +- .../constitutive/solid/Damage.cpp | 28 +- .../constitutive/solid/DelftEgg.cpp | 20 +- .../constitutive/solid/DruckerPrager.cpp | 20 +- .../solid/DruckerPragerExtended.cpp | 30 ++- .../ElasticIsotropicPressureDependent.cpp | 10 +- .../constitutive/solid/ModifiedCamClay.cpp | 15 +- .../MultiPhaseConstantThermalConductivity.cpp | 12 +- ...PhaseVolumeWeightedThermalConductivity.cpp | 20 +- .../SinglePhaseThermalConductivity.cpp | 12 +- .../fluid/multiFluid/PVTDriver.cpp | 47 ++-- .../solid/TriaxialDriver.cpp | 12 +- .../dataRepository/GeosxState.cpp | 4 + src/coreComponents/dataRepository/Group.cpp | 21 +- src/coreComponents/dataRepository/Group.hpp | 55 ++-- .../unitTests/testDataContext.cpp | 38 +-- src/coreComponents/events/EventBase.cpp | 8 +- src/coreComponents/events/PeriodicEvent.cpp | 32 +-- .../AquiferBoundaryCondition.cpp | 20 +- .../EquilibriumInitialCondition.cpp | 116 ++++----- .../FieldSpecificationBase.cpp | 4 + .../FieldSpecificationBase.hpp | 8 +- .../PerfectlyMatchedLayer.cpp | 24 +- .../TractionBoundaryCondition.cpp | 16 +- .../fileIO/Outputs/SiloOutput.cpp | 10 +- .../fileIO/Outputs/TimeHistoryOutput.cpp | 8 +- .../fileIO/Outputs/VTKOutput.cpp | 16 +- .../timeHistory/HistoryCollectionBase.cpp | 3 + .../fileIO/timeHistory/PackCollection.cpp | 4 + .../FiniteElementDiscretization.cpp | 33 ++- .../functions/MultivariableTableFunction.cpp | 18 +- .../functions/TableFunction.cpp | 22 +- .../mainInterface/ProblemManager.cpp | 7 +- src/coreComponents/mesh/CellElementRegion.cpp | 16 +- .../mesh/CellElementRegionSelector.cpp | 34 +-- .../mesh/ElementRegionManager.cpp | 28 +- .../mesh/ElementRegionManager.hpp | 14 +- src/coreComponents/mesh/FaceManager.cpp | 3 + src/coreComponents/mesh/MeshObjectPath.cpp | 20 +- src/coreComponents/mesh/Perforation.cpp | 7 +- .../mesh/SurfaceElementRegion.hpp | 7 +- .../mesh/WellElementSubRegion.cpp | 18 +- .../generators/ExternalMeshGeneratorBase.cpp | 8 +- .../mesh/generators/InternalMeshGenerator.cpp | 4 + .../mesh/generators/InternalMeshGenerator.hpp | 13 +- .../mesh/generators/InternalWellGenerator.cpp | 24 +- .../generators/InternalWellboreGenerator.cpp | 23 +- .../mesh/generators/VTKMeshGenerator.cpp | 15 +- .../mesh/generators/WellGeneratorBase.cpp | 5 +- .../mesh/simpleGeometricObjects/Box.cpp | 7 +- .../simpleGeometricObjects/ThickPlane.cpp | 10 +- .../physicsSolvers/FieldStatisticsBase.hpp | 10 +- .../physicsSolvers/LinearSolverParameters.cpp | 42 +-- .../physicsSolvers/PhysicsSolverBase.cpp | 35 ++- .../fluidFlow/CompositionalMultiphaseBase.cpp | 113 +++++---- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 8 +- .../CompositionalMultiphaseHybridFVM.cpp | 26 +- .../fluidFlow/FlowSolverBase.cpp | 20 +- .../ReactiveCompositionalMultiphaseOBL.cpp | 4 +- .../fluidFlow/SinglePhaseBase.cpp | 64 ++--- .../fluidFlow/SinglePhaseHybridFVM.cpp | 16 +- .../fluidFlow/SinglePhaseProppantBase.cpp | 14 +- .../fluidFlow/SourceFluxStatistics.cpp | 18 +- .../fluidFlow/StencilDataCollection.cpp | 20 +- .../proppantTransport/ProppantTransport.cpp | 32 ++- .../wells/CompositionalMultiphaseWell.cpp | 114 +++++---- .../fluidFlow/wells/SinglePhaseWell.cpp | 18 +- .../fluidFlow/wells/WellControls.cpp | 217 ++++++++-------- .../fluidFlow/wells/WellSolverBase.cpp | 5 +- .../CompositionalMultiphaseWellKernels.cpp | 12 +- .../wells/kernels/SinglePhaseWellKernels.cpp | 4 +- .../inducedSeismicity/SpringSlider.cpp | 6 +- ...mpositionalMultiphaseReservoirAndWells.cpp | 10 +- .../CoupledReservoirAndWellsBase.cpp | 4 +- .../multiphysics/CoupledSolver.hpp | 8 +- .../multiphysics/MultiphasePoromechanics.cpp | 24 +- ...iphasePoromechanicsConformingFractures.cpp | 5 +- .../PoromechanicsInitialization.cpp | 8 +- .../multiphysics/PoromechanicsSolver.hpp | 30 ++- .../multiphysics/SinglePhasePoromechanics.cpp | 4 +- ...ePhasePoromechanicsConformingFractures.cpp | 5 +- .../simplePDE/PhaseFieldDamageFEM.cpp | 6 +- .../SolidMechanicsLagrangianFEM.cpp | 27 +- .../solidMechanics/SolidMechanicsMPM.cpp | 7 +- .../SolidMechanicsStateReset.cpp | 4 +- .../contact/ContactSolverBase.cpp | 6 +- .../contact/SolidMechanicsLagrangeContact.cpp | 8 +- .../surfaceGeneration/SurfaceGenerator.cpp | 37 ++- .../AcousticFirstOrderWaveEquationSEM.cpp | 7 +- .../isotropic/AcousticWaveEquationSEM.cpp | 30 +-- .../ElasticFirstOrderWaveEquationSEM.cpp | 4 +- .../isotropic/ElasticWaveEquationSEM.cpp | 4 +- .../wavePropagation/shared/WaveSolverBase.cpp | 12 +- .../shared/WaveSolverUtils.hpp | 3 +- 117 files changed, 1561 insertions(+), 1369 deletions(-) diff --git a/src/coreComponents/constitutive/ConstitutiveManager.cpp b/src/coreComponents/constitutive/ConstitutiveManager.cpp index 913f0898971..5d062357d61 100644 --- a/src/coreComponents/constitutive/ConstitutiveManager.cpp +++ b/src/coreComponents/constitutive/ConstitutiveManager.cpp @@ -74,11 +74,12 @@ ConstitutiveManager::hangConstitutiveRelation( string const & constitutiveRelati // 1. Allocate constitutive relation // we only register the constitutive relation if it has not been registered yet. - GEOS_ERROR_IF( constitutiveGroup->hasGroup( constitutiveRelationInstanceName ), - GEOS_FMT( "Error! The constitutive relation {} has already been registered on the subRegion {}. " - "Make sure that the same constitutive model is not listed as a material on a" - " region both as a stand-alone one and as part of a compound constitutive model.", - constitutiveRelationInstanceName, parent->getDataContext().toString() ) ); + GEOS_ERROR_CTX_IF( constitutiveGroup->hasGroup( constitutiveRelationInstanceName ), + GEOS_FMT( "Error! The constitutive relation {} has already been registered on the subRegion {}. " + "Make sure that the same constitutive model is not listed as a material on a" + " region both as a stand-alone one and as part of a compound constitutive model.", + constitutiveRelationInstanceName, parent->getDataContext().toString() ), + parent->getDataContext() ); ConstitutiveBase const & constitutiveRelation = getConstitutiveRelation( constitutiveRelationInstanceName ); @@ -97,11 +98,12 @@ ConstitutiveManager::hangConstitutiveRelation( string const & constitutiveRelati for( string const & subRelationName : subRelationNames ) { // we only want to register the subRelation if it has not been registered yet. - GEOS_ERROR_IF( constitutiveGroup->hasGroup( subRelationName ), - GEOS_FMT( "Error! The constitutive relation {} has already been registered on the subRegion {}. " - "Make sure that the same constitutive model is not listed as a material on a" - " region both as a stand-alone one and as part of a compound constitutive model.", - subRelationName, parent->getDataContext().toString() ) ); + GEOS_ERROR_CTX_IF( constitutiveGroup->hasGroup( subRelationName ), + GEOS_FMT( "Error! The constitutive relation {} has already been registered on the subRegion {}. " + "Make sure that the same constitutive model is not listed as a material on a" + " region both as a stand-alone one and as part of a compound constitutive model.", + subRelationName, parent->getDataContext().toString() ), + parent->getDataContext() ); ConstitutiveBase const & subRelation = getConstitutiveRelation( subRelationName ); diff --git a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp index 3e67db4b27b..747a32fed75 100644 --- a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp @@ -127,42 +127,42 @@ void JFunctionCapillaryPressure::postInputInitialization() CapillaryPressureBase::postInputInitialization(); integer const numPhases = m_phaseNames.size(); - GEOS_THROW_IF( numPhases != 2 && numPhases != 3, - GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", - getFullName() ), - InputError ); + GEOS_THROW_CTX_IF( numPhases != 2 && numPhases != 3, + GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", + getFullName() ), + InputError, getDataContext() ); if( numPhases == 2 ) { - GEOS_THROW_IF( m_wettingNonWettingJFuncTableName.empty(), - GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the J-function table for the pair (wetting phase, non-wetting phase)", - getFullName(), - viewKeyStruct::wettingNonWettingJFuncTableNameString() ), - InputError ); - GEOS_THROW_IF( m_wettingNonWettingSurfaceTension <= 0, - GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the surface tension for the pair (wetting phase, non-wetting phase)", - getFullName(), - viewKeyStruct::wettingNonWettingSurfaceTensionString() ), - InputError ); + GEOS_THROW_CTX_IF( m_wettingNonWettingJFuncTableName.empty(), + GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the J-function table for the pair (wetting phase, non-wetting phase)", + getFullName(), + viewKeyStruct::wettingNonWettingJFuncTableNameString() ), + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( m_wettingNonWettingSurfaceTension <= 0, + GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the surface tension for the pair (wetting phase, non-wetting phase)", + getFullName(), + viewKeyStruct::wettingNonWettingSurfaceTensionString() ), + InputError, getDataContext() ); } else if( numPhases == 3 ) { - GEOS_THROW_IF( m_wettingIntermediateJFuncTableName.empty() || m_nonWettingIntermediateJFuncTableName.empty(), - GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify the J-function table" - "for the pair (wetting phase, intermediate phase), " - "and {} to specify the J-function table for the pair (non-wetting phase, intermediate phase)", - getFullName(), - viewKeyStruct::wettingIntermediateJFuncTableNameString(), - viewKeyStruct::nonWettingIntermediateJFuncTableNameString() ), - InputError ); - GEOS_THROW_IF( m_wettingIntermediateSurfaceTension <= 0 || m_nonWettingIntermediateSurfaceTension <= 0, - GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify the surface tension" - "for the pair (wetting phase, intermediate phase), " - "and {} to specify the J-function table for the pair (non-wetting phase, intermediate phase)", - getFullName(), - viewKeyStruct::wettingIntermediateSurfaceTensionString(), - viewKeyStruct::nonWettingIntermediateSurfaceTensionString() ), - InputError ); + GEOS_THROW_CTX_IF( m_wettingIntermediateJFuncTableName.empty() || m_nonWettingIntermediateJFuncTableName.empty(), + GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify the J-function table" + "for the pair (wetting phase, intermediate phase), " + "and {} to specify the J-function table for the pair (non-wetting phase, intermediate phase)", + getFullName(), + viewKeyStruct::wettingIntermediateJFuncTableNameString(), + viewKeyStruct::nonWettingIntermediateJFuncTableNameString() ), + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( m_wettingIntermediateSurfaceTension <= 0 || m_nonWettingIntermediateSurfaceTension <= 0, + GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify the surface tension" + "for the pair (wetting phase, intermediate phase), " + "and {} to specify the J-function table for the pair (non-wetting phase, intermediate phase)", + getFullName(), + viewKeyStruct::wettingIntermediateSurfaceTensionString(), + viewKeyStruct::nonWettingIntermediateSurfaceTensionString() ), + InputError, getDataContext() ); } } @@ -175,11 +175,11 @@ void JFunctionCapillaryPressure::initializePreSubGroups() if( numPhases == 2 ) { - GEOS_THROW_IF( !functionManager.hasGroup( m_wettingNonWettingJFuncTableName ), - GEOS_FMT( "{}: the table function named {} could not be found", - getFullName(), - m_wettingNonWettingJFuncTableName ), - InputError ); + GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_wettingNonWettingJFuncTableName ), + GEOS_FMT( "{}: the table function named {} could not be found", + getFullName(), + m_wettingNonWettingJFuncTableName ), + InputError, getDataContext() ); TableFunction const & jFuncTable = functionManager.getGroup< TableFunction >( m_wettingNonWettingJFuncTableName ); bool const jFuncMustBeIncreasing = ( m_phaseOrder[PhaseType::WATER] < 0 ) ? true // pc on the gas phase, function must be increasing @@ -188,19 +188,19 @@ void JFunctionCapillaryPressure::initializePreSubGroups() } else if( numPhases == 3 ) { - GEOS_THROW_IF( !functionManager.hasGroup( m_wettingIntermediateJFuncTableName ), - GEOS_FMT( "{}: the table function named {} could not be found", - getFullName(), - m_wettingIntermediateJFuncTableName ), - InputError ); + GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_wettingIntermediateJFuncTableName ), + GEOS_FMT( "{}: the table function named {} could not be found", + getFullName(), + m_wettingIntermediateJFuncTableName ), + InputError, getDataContext() ); TableFunction const & jFuncTableWI = functionManager.getGroup< TableFunction >( m_wettingIntermediateJFuncTableName ); TableCapillaryPressureHelpers::validateCapillaryPressureTable( jFuncTableWI, getFullName(), false ); - GEOS_THROW_IF( !functionManager.hasGroup( m_nonWettingIntermediateJFuncTableName ), - GEOS_FMT( "{}: the table function named {} could not be found", - getFullName(), - m_nonWettingIntermediateJFuncTableName ), - InputError ); + GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_nonWettingIntermediateJFuncTableName ), + GEOS_FMT( "{}: the table function named {} could not be found", + getFullName(), + m_nonWettingIntermediateJFuncTableName ), + InputError, getDataContext() ); TableFunction const & jFuncTableNWI = functionManager.getGroup< TableFunction >( m_nonWettingIntermediateJFuncTableName ); TableCapillaryPressureHelpers::validateCapillaryPressureTable( jFuncTableNWI, getFullName(), true ); } diff --git a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp index 2304238b540..5c838d1e627 100644 --- a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp @@ -73,29 +73,29 @@ void TableCapillaryPressure::postInputInitialization() CapillaryPressureBase::postInputInitialization(); integer const numPhases = m_phaseNames.size(); - GEOS_THROW_IF( numPhases != 2 && numPhases != 3, - GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", - getFullName() ), - InputError ); + GEOS_THROW_CTX_IF( numPhases != 2 && numPhases != 3, + GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", + getFullName() ), + InputError, getDataContext() ); if( numPhases == 2 ) { - GEOS_THROW_IF( m_wettingNonWettingCapPresTableName.empty(), - GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the capillary pressure table for the pair (wetting phase, non-wetting phase)", - getFullName(), - viewKeyStruct::wettingNonWettingCapPresTableNameString() ), - InputError ); + GEOS_THROW_CTX_IF( m_wettingNonWettingCapPresTableName.empty(), + GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the capillary pressure table for the pair (wetting phase, non-wetting phase)", + getFullName(), + viewKeyStruct::wettingNonWettingCapPresTableNameString() ), + InputError, getDataContext() ); } else if( numPhases == 3 ) { - GEOS_THROW_IF( m_wettingIntermediateCapPresTableName.empty() || m_nonWettingIntermediateCapPresTableName.empty(), - GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify the capillary pressure table " - "for the pair (wetting phase, intermediate phase), and {} to specify the capillary pressure table " - "for the pair (non-wetting phase, intermediate phase)", - getFullName(), - viewKeyStruct::wettingIntermediateCapPresTableNameString(), - viewKeyStruct::nonWettingIntermediateCapPresTableNameString() ), - InputError ); + GEOS_THROW_CTX_IF( m_wettingIntermediateCapPresTableName.empty() || m_nonWettingIntermediateCapPresTableName.empty(), + GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify the capillary pressure table " + "for the pair (wetting phase, intermediate phase), and {} to specify the capillary pressure table " + "for the pair (non-wetting phase, intermediate phase)", + getFullName(), + viewKeyStruct::wettingIntermediateCapPresTableNameString(), + viewKeyStruct::nonWettingIntermediateCapPresTableNameString() ), + InputError, getDataContext() ); } } @@ -121,19 +121,19 @@ void TableCapillaryPressure::initializePreSubGroups() } else if( numPhases == 3 ) { - GEOS_THROW_IF( !functionManager.hasGroup( m_wettingIntermediateCapPresTableName ), - GEOS_FMT( "{}: the table function named {} could not be found", - getFullName(), - m_wettingIntermediateCapPresTableName ), - InputError ); + GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_wettingIntermediateCapPresTableName ), + GEOS_FMT( "{}: the table function named {} could not be found", + getFullName(), + m_wettingIntermediateCapPresTableName ), + InputError, getDataContext() ); TableFunction const & capPresTableWI = functionManager.getGroup< TableFunction >( m_wettingIntermediateCapPresTableName ); TableCapillaryPressureHelpers::validateCapillaryPressureTable( capPresTableWI, getFullName(), false ); - GEOS_THROW_IF( !functionManager.hasGroup( m_nonWettingIntermediateCapPresTableName ), - GEOS_FMT( "{}: the table function named {} could not be found", - getFullName(), - m_nonWettingIntermediateCapPresTableName ), - InputError ); + GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_nonWettingIntermediateCapPresTableName ), + GEOS_FMT( "{}: the table function named {} could not be found", + getFullName(), + m_nonWettingIntermediateCapPresTableName ), + InputError, getDataContext() ); TableFunction const & capPresTableNWI = functionManager.getGroup< TableFunction >( m_nonWettingIntermediateCapPresTableName ); TableCapillaryPressureHelpers::validateCapillaryPressureTable( capPresTableNWI, getFullName(), true ); } diff --git a/src/coreComponents/constitutive/contact/CoulombFriction.cpp b/src/coreComponents/constitutive/contact/CoulombFriction.cpp index d59d3d99a45..b3597747316 100644 --- a/src/coreComponents/constitutive/contact/CoulombFriction.cpp +++ b/src/coreComponents/constitutive/contact/CoulombFriction.cpp @@ -57,9 +57,9 @@ CoulombFriction::~CoulombFriction() void CoulombFriction::postInputInitialization() { - GEOS_THROW_IF( m_frictionCoefficient < 0.0, - getFullName() << ": The provided friction coefficient is less than zero. Value: " << m_frictionCoefficient, - InputError ); + GEOS_THROW_CTX_IF( m_frictionCoefficient < 0.0, + getFullName() << ": The provided friction coefficient is less than zero. Value: " << m_frictionCoefficient, + InputError, getDataContext() ); } diff --git a/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp b/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp index 6fe5c08b42f..7d96bab2485 100644 --- a/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp +++ b/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp @@ -57,9 +57,9 @@ HydraulicApertureTable::~HydraulicApertureTable() void HydraulicApertureTable::postInputInitialization() { - - GEOS_THROW_IF( m_apertureTableName.empty(), - getFullName() << ": the aperture table name " << m_apertureTableName << " is empty", InputError ); + GEOS_THROW_CTX_IF( m_apertureTableName.empty(), + getFullName() << ": the aperture table name " << m_apertureTableName << " is empty", + InputError, getDataContext() ); } @@ -71,9 +71,9 @@ void HydraulicApertureTable::allocateConstitutiveData( Group & parent, FunctionManager & functionManager = FunctionManager::getInstance(); - GEOS_THROW_IF( !functionManager.hasGroup( m_apertureTableName ), - getFullName() << ": the aperture table named " << m_apertureTableName << " could not be found", - InputError ); + GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_apertureTableName ), + getFullName() << ": the aperture table named " << m_apertureTableName << " could not be found", + InputError, getDataContext() ); TableFunction & apertureTable = functionManager.getGroup< TableFunction >( m_apertureTableName ); validateApertureTable( apertureTable ); @@ -122,27 +122,27 @@ void HydraulicApertureTable::validateApertureTable( TableFunction const & apertu ArrayOfArraysView< real64 const > const coords = apertureTable.getCoordinates(); arrayView1d< real64 const > const & hydraulicApertureValues = apertureTable.getValues(); - GEOS_THROW_IF( coords.size() > 1, - getFullName() << ": Aperture limiter table cannot be greater than a 1D table.", - InputError ); + GEOS_THROW_CTX_IF( coords.size() > 1, + getFullName() << ": Aperture limiter table cannot be greater than a 1D table.", + InputError, getDataContext() ); arraySlice1d< real64 const > apertureValues = coords[0]; localIndex const size = apertureValues.size(); - GEOS_THROW_IF( coords( 0, size-1 ) > 0.0 || coords( 0, size-1 ) < 0.0, - getFullName() << ": Invalid aperture limiter table. Last coordinate must be zero!", - InputError ); + GEOS_THROW_CTX_IF( coords( 0, size-1 ) > 0.0 || coords( 0, size-1 ) < 0.0, + getFullName() << ": Invalid aperture limiter table. Last coordinate must be zero!", + InputError, getDataContext() ); - GEOS_THROW_IF( apertureValues.size() < 2, - getFullName() << ": Invalid aperture limiter table. Must have more than two points specified", - InputError ); + GEOS_THROW_CTX_IF( apertureValues.size() < 2, + getFullName() << ": Invalid aperture limiter table. Must have more than two points specified", + InputError, getDataContext() ); localIndex const n = apertureValues.size()-1; real64 const slope = ( hydraulicApertureValues[n] - hydraulicApertureValues[n-1] ) / ( apertureValues[n] - apertureValues[n-1] ); - GEOS_THROW_IF( slope >= 1.0, - getFullName() << ": Invalid aperture table. The slope of the last two points >= 1 is invalid.", - InputError ); + GEOS_THROW_CTX_IF( slope >= 1.0, + getFullName() << ": Invalid aperture table. The slope of the last two points >= 1 is invalid.", + InputError, getDataContext() ); } diff --git a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp index cff80fed216..4aa4b73995d 100644 --- a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp +++ b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp @@ -62,17 +62,17 @@ void ConstantDiffusion::allocateConstitutiveData( dataRepository::Group & parent void ConstantDiffusion::postInputInitialization() { - GEOS_THROW_IF( m_diffusivityComponents.size() != 3, - GEOS_FMT( "{}: the size of the diffusivity must be equal to 3", - getFullName() ), - InputError ); + GEOS_THROW_CTX_IF( m_diffusivityComponents.size() != 3, + GEOS_FMT( "{}: the size of the diffusivity must be equal to 3", + getFullName() ), + InputError, getDataContext() ); - GEOS_THROW_IF( m_diffusivityComponents[0] < 0 || - m_diffusivityComponents[1] < 0 || - m_diffusivityComponents[2] < 0, - GEOS_FMT( "{}: the components of the diffusivity tensor must be non-negative", - getFullName() ), - InputError ); + GEOS_THROW_CTX_IF( m_diffusivityComponents[0] < 0 || + m_diffusivityComponents[1] < 0 || + m_diffusivityComponents[2] < 0, + GEOS_FMT( "{}: the components of the diffusivity tensor must be non-negative", + getFullName() ), + InputError, getDataContext() ); } REGISTER_CATALOG_ENTRY( ConstitutiveBase, ConstantDiffusion, string const &, Group * const ) diff --git a/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp b/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp index 491bc987a99..93ec4eff5a0 100644 --- a/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp +++ b/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp @@ -57,10 +57,10 @@ void DiffusionBase::postInputInitialization() GEOS_FMT( "{}: invalid number of phases", getFullName() ), InputError ); - GEOS_THROW_IF( numPhases != m_defaultPhaseDiffusivityMultiplier.size(), - GEOS_FMT( "{}: the arrays in `{}` and `{}` must have the same size", - getFullName(), viewKeyStruct::phaseNamesString(), viewKeyStruct::defaultPhaseDiffusivityMultiplierString() ), - InputError ); + GEOS_THROW_CTX_IF( numPhases != m_defaultPhaseDiffusivityMultiplier.size(), + GEOS_FMT( "{}: the arrays in `{}` and `{}` must have the same size", + getFullName(), viewKeyStruct::phaseNamesString(), viewKeyStruct::defaultPhaseDiffusivityMultiplierString() ), + InputError, getDataContext() ); m_diffusivity.resize( 0, 0, 3 ); m_dDiffusivity_dTemperature.resize( 0, 0, 3 ); diff --git a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp index 88e0339f142..678bc9c9456 100644 --- a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp +++ b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp @@ -45,10 +45,10 @@ LinearIsotropicDispersion::deliverClone( string const & name, void LinearIsotropicDispersion::postInputInitialization() { - GEOS_THROW_IF( m_longitudinalDispersivity < 0, - GEOS_FMT( "{}: longitudinal dispersivity must be positive", - getFullName() ), - InputError ); + GEOS_THROW_CTX_IF( m_longitudinalDispersivity < 0, + GEOS_FMT( "{}: longitudinal dispersivity must be positive", + getFullName() ), + InputError, getDataContext() ); } void LinearIsotropicDispersion::initializeVelocityState( arrayView2d< real64 const > const & initialVelocity ) const diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp index c5200776935..022bdbc3208 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp @@ -230,11 +230,11 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::postInputInitialization() // Make sure one (and only one) of m_flashModelParaFile or m_solubilityTables is provided bool const hasParamFile = !m_flashModelParaFile.empty(); bool const hasTables = !m_solubilityTables.empty(); - GEOS_THROW_IF( hasParamFile == hasTables, - GEOS_FMT( "{}: One and only one of {} or {} should be specified", getFullName(), - viewKeyStruct::flashModelParaFileString(), - viewKeyStruct::solubilityTablesString() ), - InputError ); + GEOS_THROW_CTX_IF( hasParamFile == hasTables, + GEOS_FMT( "{}: One and only one of {} or {} should be specified", getFullName(), + viewKeyStruct::flashModelParaFileString(), + viewKeyStruct::solubilityTablesString() ), + InputError, getDataContext() ); // NOTE: for now, the names of the phases are still hardcoded here // Later, we could read them from the XML file and we would then have a general class here @@ -268,9 +268,9 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() if( !strs.empty() ) { - GEOS_THROW_IF( strs.size() < 2, - GEOS_FMT( "{}: missing PVT model in line '{}'", getFullName(), str ), - InputError ); + GEOS_THROW_CTX_IF( strs.size() < 2, + GEOS_FMT( "{}: missing PVT model in line '{}'", getFullName(), str ), + InputError, getDataContext() ); if( strs[0] == "DensityFun" ) { @@ -315,28 +315,28 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() } // at this point, we have read the file and we check the consistency of non-thermal models - GEOS_THROW_IF( phase1InputParams[PHASE1::InputParamOrder::DENSITY].empty(), - GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE1::Density::catalogName() ), - InputError ); - GEOS_THROW_IF( phase2InputParams[PHASE2::InputParamOrder::DENSITY].empty(), - GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE2::Density::catalogName() ), - InputError ); - GEOS_THROW_IF( phase1InputParams[PHASE1::InputParamOrder::VISCOSITY].empty(), - GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE1::Viscosity::catalogName() ), - InputError ); - GEOS_THROW_IF( phase2InputParams[PHASE2::InputParamOrder::VISCOSITY].empty(), - GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE2::Viscosity::catalogName() ), - InputError ); + GEOS_THROW_CTX_IF( phase1InputParams[PHASE1::InputParamOrder::DENSITY].empty(), + GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE1::Density::catalogName() ), + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( phase2InputParams[PHASE2::InputParamOrder::DENSITY].empty(), + GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE2::Density::catalogName() ), + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( phase1InputParams[PHASE1::InputParamOrder::VISCOSITY].empty(), + GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE1::Viscosity::catalogName() ), + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( phase2InputParams[PHASE2::InputParamOrder::VISCOSITY].empty(), + GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE2::Viscosity::catalogName() ), + InputError, getDataContext() ); // we also detect any inconsistency arising in the enthalpy models - GEOS_THROW_IF( phase1InputParams[PHASE1::InputParamOrder::ENTHALPY].empty() && - ( PHASE1::Enthalpy::catalogName() != PVTProps::NoOpPVTFunction::catalogName() ), - GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE1::Enthalpy::catalogName() ), - InputError ); - GEOS_THROW_IF( phase2InputParams[PHASE2::InputParamOrder::ENTHALPY].empty() && - ( PHASE2::Enthalpy::catalogName() != PVTProps::NoOpPVTFunction::catalogName() ), - GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE2::Enthalpy::catalogName() ), - InputError ); + GEOS_THROW_CTX_IF( phase1InputParams[PHASE1::InputParamOrder::ENTHALPY].empty() && + ( PHASE1::Enthalpy::catalogName() != PVTProps::NoOpPVTFunction::catalogName() ), + GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE1::Enthalpy::catalogName() ), + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( phase2InputParams[PHASE2::InputParamOrder::ENTHALPY].empty() && + ( PHASE2::Enthalpy::catalogName() != PVTProps::NoOpPVTFunction::catalogName() ), + GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE2::Enthalpy::catalogName() ), + InputError, getDataContext() ); // then, we are ready to instantiate the phase models bool const isClone = this->isClone(); @@ -369,9 +369,9 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() if( !strs.empty() ) { - GEOS_THROW_IF( strs.size() < 2, - GEOS_FMT( "{}: missing flash model in line '{}'", getFullName(), str ), - InputError ); + GEOS_THROW_CTX_IF( strs.size() < 2, + GEOS_FMT( "{}: missing flash model in line '{}'", getFullName(), str ), + InputError, getDataContext() ); if( strs[0] == "FlashModel" ) { @@ -400,9 +400,9 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() else { // The user must provide 1 or 2 tables. - GEOS_THROW_IF( m_solubilityTables.size() != 1 && m_solubilityTables.size() != 2, - GEOS_FMT( "{}: The number of table names in {} must be 1 or 2", getFullName(), viewKeyStruct::solubilityTablesString() ), - InputError ); + GEOS_THROW_CTX_IF( m_solubilityTables.size() != 1 && m_solubilityTables.size() != 2, + GEOS_FMT( "{}: The number of table names in {} must be 1 or 2", getFullName(), viewKeyStruct::solubilityTablesString() ), + InputError, getDataContext() ); // If 1 table is provided, it is the CO2 solubility table and water vapourisation is zero // If 2 tables are provided, they are the CO2 solubility and water vapourisation tables depending @@ -436,9 +436,9 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() flashOutputOpts ); } - GEOS_THROW_IF( m_flash == nullptr, - GEOS_FMT( "{}: flash model {} not found in input files", getFullName(), FLASH::catalogName() ), - InputError ); + GEOS_THROW_CTX_IF( m_flash == nullptr, + GEOS_FMT( "{}: flash model {} not found in input files", getFullName(), FLASH::catalogName() ), + InputError, getDataContext() ); } template< typename PHASE1, typename PHASE2, typename FLASH > diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp index a1e44064dd1..6085d9face6 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp @@ -55,9 +55,9 @@ void BlackOilFluid::readInputDataFromTableFunctions() void BlackOilFluid::readInputDataFromPVTFiles() { - GEOS_THROW_IF( m_formationVolFactorTableNames.size() > 0.0 || m_viscosityTableNames.size() > 0.0, - GEOS_FMT( "{}: input is redundant (both TableFunction names and pvt files)", getFullName() ), - InputError ); + GEOS_THROW_CTX_IF( m_formationVolFactorTableNames.size() > 0.0 || m_viscosityTableNames.size() > 0.0, + GEOS_FMT( "{}: input is redundant (both TableFunction names and pvt files)", getFullName() ), + InputError, getDataContext() ); using PT = BlackOilFluid::PhaseType; @@ -439,26 +439,26 @@ void BlackOilFluid::checkTableConsistency() const using PT = BlackOilFluid::PhaseType; // check for the presence of one bubble point - GEOS_THROW_IF( m_PVTO.undersaturatedPressure[m_PVTO.numSaturatedPoints - 1].size() <= 1, - GEOS_FMT( "{}: at least one bubble pressure is required in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), - InputError ); + GEOS_THROW_CTX_IF( m_PVTO.undersaturatedPressure[m_PVTO.numSaturatedPoints - 1].size() <= 1, + GEOS_FMT( "{}: at least one bubble pressure is required in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), + InputError, getDataContext() ); // check for saturated region for( integer i = 0; i < m_PVTO.numSaturatedPoints - 1; ++i ) { // Rs must increase with Pb - GEOS_THROW_IF( ( m_PVTO.Rs[i + 1] - m_PVTO.Rs[i] ) <= 0, - GEOS_FMT( "{}: Rs must increase with Pb in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), - InputError ); + GEOS_THROW_CTX_IF( ( m_PVTO.Rs[i + 1] - m_PVTO.Rs[i] ) <= 0, + GEOS_FMT( "{}: Rs must increase with Pb in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), + InputError, getDataContext() ); // Bo must increase with Pb - GEOS_THROW_IF( ( m_PVTO.saturatedBo[i + 1] - m_PVTO.saturatedBo[i] ) <= 0, - GEOS_FMT( "{}: Bo must increase with Pb in saturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), - InputError ); + GEOS_THROW_CTX_IF( ( m_PVTO.saturatedBo[i + 1] - m_PVTO.saturatedBo[i] ) <= 0, + GEOS_FMT( "{}: Bo must increase with Pb in saturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), + InputError, getDataContext() ); // Viscosity must decrease with Pb - GEOS_THROW_IF( ( m_PVTO.saturatedViscosity[i + 1] - m_PVTO.saturatedViscosity[i] ) >= 0, - GEOS_FMT( "{}: Viscosity must decrease with Pb in saturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), - InputError ); + GEOS_THROW_CTX_IF( ( m_PVTO.saturatedViscosity[i + 1] - m_PVTO.saturatedViscosity[i] ) >= 0, + GEOS_FMT( "{}: Viscosity must decrease with Pb in saturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), + InputError, getDataContext() ); } // check for under-saturated branches @@ -467,17 +467,17 @@ void BlackOilFluid::checkTableConsistency() const for( integer j = 0; j < m_PVTO.undersaturatedPressure[i].size() - 1; ++j ) { // Pressure - GEOS_THROW_IF( ( m_PVTO.undersaturatedPressure[i][j + 1] - m_PVTO.undersaturatedPressure[i][j] ) <= 0, - GEOS_FMT( "{}: P must decrease in undersaturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), - InputError ); + GEOS_THROW_CTX_IF( ( m_PVTO.undersaturatedPressure[i][j + 1] - m_PVTO.undersaturatedPressure[i][j] ) <= 0, + GEOS_FMT( "{}: P must decrease in undersaturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), + InputError, getDataContext() ); // Bo must decrease with P - GEOS_THROW_IF( ( m_PVTO.undersaturatedBo[i][j + 1] - m_PVTO.undersaturatedBo[i][j] ) >= 0, - GEOS_FMT( "{}: Bo must decrease with P in undersaturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), - InputError ); + GEOS_THROW_CTX_IF( ( m_PVTO.undersaturatedBo[i][j + 1] - m_PVTO.undersaturatedBo[i][j] ) >= 0, + GEOS_FMT( "{}: Bo must decrease with P in undersaturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), + InputError, getDataContext() ); // Viscosity must increase with Pb - GEOS_THROW_IF( ( m_PVTO.undersaturatedViscosity[i][j + 1] - m_PVTO.undersaturatedViscosity[i][j] ) < -1e-10, - GEOS_FMT( "{}: viscosity must increase with P in undersaturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), - InputError ); + GEOS_THROW_CTX_IF( ( m_PVTO.undersaturatedViscosity[i][j + 1] - m_PVTO.undersaturatedViscosity[i][j] ) < -1e-10, + GEOS_FMT( "{}: viscosity must increase with P in undersaturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), + InputError, getDataContext() ); } } } diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp index e86cc168ac7..71bc09bbcd2 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp @@ -102,10 +102,10 @@ void BlackOilFluidBase::fillWaterData( array1d< array1d< real64 > > const & tabl getFullName() << ": four columns (pressure, formation volume factor, compressibility, and viscosity) are expected for water", InputError ); - GEOS_THROW_IF( m_waterParams.referencePressure > 0.0 || m_waterParams.formationVolFactor > 0.0 || - m_waterParams.compressibility > 0.0 || m_waterParams.viscosity > 0.0, - getFullName() << ": input is redundant (user provided both water data and a water pvt file)", - InputError ); + GEOS_THROW_CTX_IF( m_waterParams.referencePressure > 0.0 || m_waterParams.formationVolFactor > 0.0 || + m_waterParams.compressibility > 0.0 || m_waterParams.viscosity > 0.0, + getFullName() << ": input is redundant (user provided both water data and a water pvt file)", + InputError, getDataContext() ); m_waterParams.referencePressure = tableValues[0][0]; m_waterParams.formationVolFactor = tableValues[0][1]; @@ -255,8 +255,12 @@ void BlackOilFluidBase::checkTablesParameters( real64 const pressure, m_formationVolFactorTables[iph]->checkCoord( pressure, 0 ); } catch( SimulationError const & ex ) { - throw SimulationError( ex, GEOS_FMT( errorMsg, getCatalogName(), getDataContext(), - "formation volume factor", iph ) ); + string const msg = GEOS_FMT( errorMsg, getCatalogName(), getDataContext(), + "formation volume factor", iph ); + errorLogger.currentErrorMsg() + .addToMsg( msg ) + .addContextInfo( getDataContext().getContextInfo() ); + throw SimulationError( ex, msg ); } try @@ -264,17 +268,21 @@ void BlackOilFluidBase::checkTablesParameters( real64 const pressure, m_viscosityTables[iph]->checkCoord( pressure, 0 ); } catch( SimulationError const & ex ) { - throw SimulationError( ex, GEOS_FMT( errorMsg, getCatalogName(), getDataContext(), - "viscosity", iph ) ); + string const msg = GEOS_FMT( errorMsg, getCatalogName(), getDataContext(), + "viscosity", iph ); + errorLogger.currentErrorMsg() + .addToMsg( msg ) + .addContextInfo( getDataContext().getContextInfo() ); + throw SimulationError( ex, msg ); } } } void BlackOilFluidBase::createAllKernelWrappers() { - GEOS_THROW_IF( m_hydrocarbonPhaseOrder.size() != 1 && m_hydrocarbonPhaseOrder.size() != 2, - GEOS_FMT( "{}: the number of hydrocarbon phases must be 1 (oil) or 2 (oil+gas)", getFullName() ), - InputError ); + GEOS_THROW_CTX_IF( m_hydrocarbonPhaseOrder.size() != 1 && m_hydrocarbonPhaseOrder.size() != 2, + GEOS_FMT( "{}: the number of hydrocarbon phases must be 1 (oil) or 2 (oil+gas)", getFullName() ), + InputError, getDataContext() ); if( m_formationVolFactorTableKernels.empty() && m_viscosityTableKernels.empty() ) { @@ -303,9 +311,9 @@ void BlackOilFluidBase::validateTable( TableFunction const & table, // we only issue a warning here, as we still want to allow this configuration for( localIndex i = 3; i < property.size(); ++i ) { - GEOS_THROW_IF( (property[i] - property[i-1]) * (property[i-1] - property[i-2]) < 0, - GEOS_FMT( "{}: in table '{}', viscosity values must be monotone", getFullName(), table.getName() ), - InputError ); + GEOS_THROW_CTX_IF( (property[i] - property[i-1]) * (property[i-1] - property[i-2]) < 0, + GEOS_FMT( "{}: in table '{}', viscosity values must be monotone", getFullName(), table.getName() ), + InputError, getDataContext() ); } // we don't check the first value, as it may be used to specify surface conditions diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp index f3e481f24ab..2811d3d9386 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp @@ -38,9 +38,9 @@ void DeadOilFluid::postInputInitialization() BlackOilFluidBase::postInputInitialization(); integer const numComps = numFluidComponents(); - GEOS_THROW_IF( numComps != 2 && numComps != 3, - GEOS_FMT( "{}: this model only supports 2 or 3 components", getFullName() ), - InputError ); + GEOS_THROW_CTX_IF( numComps != 2 && numComps != 3, + GEOS_FMT( "{}: this model only supports 2 or 3 components", getFullName() ), + InputError, getDataContext() ); } void DeadOilFluid::readInputDataFromPVTFiles() @@ -48,9 +48,9 @@ void DeadOilFluid::readInputDataFromPVTFiles() GEOS_THROW_IF_NE_MSG( m_tableFiles.size(), numFluidPhases(), GEOS_FMT( "{}: the number of table files must be equal to the number of phases", getFullName() ), InputError ); - GEOS_THROW_IF( m_formationVolFactorTableNames.size() > 0.0 || m_viscosityTableNames.size() > 0.0, - GEOS_FMT( "{}: input is redundant (both TableFunction names and pvt files)", getFullName() ), - InputError ); + GEOS_THROW_CTX_IF( m_formationVolFactorTableNames.size() > 0.0 || m_viscosityTableNames.size() > 0.0, + GEOS_FMT( "{}: input is redundant (both TableFunction names and pvt files)", getFullName() ), + InputError, getDataContext() ); array1d< array1d< real64 > > tableValues; for( integer ip = 0; ip < numFluidPhases(); ++ip ) @@ -71,9 +71,9 @@ void DeadOilFluid::readInputDataFromPVTFiles() void DeadOilFluid::readInputDataFromTableFunctions() { - GEOS_THROW_IF( !m_tableFiles.empty(), - GEOS_FMT( "{}: input is redundant (both TableFunction names and pvt files)", getFullName() ), - InputError ); + GEOS_THROW_CTX_IF( !m_tableFiles.empty(), + GEOS_FMT( "{}: input is redundant (both TableFunction names and pvt files)", getFullName() ), + InputError, getDataContext() ); integer const ipWater = m_phaseOrder[PhaseType::WATER]; integer const ipGas = m_phaseOrder[PhaseType::GAS]; @@ -114,12 +114,12 @@ void DeadOilFluid::readInputDataFromTableFunctions() FunctionManager const & functionManager = FunctionManager::getInstance(); for( integer iph = 0; iph < m_hydrocarbonPhaseOrder.size(); ++iph ) { - GEOS_THROW_IF( !functionManager.hasGroup( m_formationVolFactorTableNames[iph] ), - GEOS_FMT( "{}: formation volume factor table '{}' not found", getFullName(), m_formationVolFactorTableNames[iph] ), - InputError ); - GEOS_THROW_IF( !functionManager.hasGroup( m_viscosityTableNames[iph] ), - GEOS_FMT( "{}: viscosity table '{}' not found", getFullName(), m_viscosityTableNames[iph] ), - InputError ); + GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_formationVolFactorTableNames[iph] ), + GEOS_FMT( "{}: formation volume factor table '{}' not found", getFullName(), m_formationVolFactorTableNames[iph] ), + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_viscosityTableNames[iph] ), + GEOS_FMT( "{}: viscosity table '{}' not found", getFullName(), m_viscosityTableNames[iph] ), + InputError, getDataContext() ); } } diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/parameters/PressureTemperatureCoordinates.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/parameters/PressureTemperatureCoordinates.cpp index 00d1d47ec8b..fc978294e3c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/parameters/PressureTemperatureCoordinates.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/parameters/PressureTemperatureCoordinates.cpp @@ -70,10 +70,10 @@ void PressureTemperatureCoordinates::postInputInitializationImpl( MultiFluidBase InputError ); // Values must be strictly increasing - GEOS_THROW_IF( !isStrictlyIncreasing( m_pressureCoordinates.toSliceConst()), - GEOS_FMT( "{}: invalid values of pressure coordinates provided in {}. " - "Values must be strictly increasing.", fluid->getFullName(), viewKeyStruct::pressureCoordinatesString() ), - InputError ); + GEOS_THROW_CTX_IF( !isStrictlyIncreasing( m_pressureCoordinates.toSliceConst()), + GEOS_FMT( "{}: invalid values of pressure coordinates provided in {}. " + "Values must be strictly increasing.", fluid->getFullName(), viewKeyStruct::pressureCoordinatesString() ), + InputError, fluid->getDataContext() ); } if( !m_temperatureCoordinates.empty()) @@ -85,10 +85,10 @@ void PressureTemperatureCoordinates::postInputInitializationImpl( MultiFluidBase InputError ); // Values must be strictly increasing - GEOS_THROW_IF( !isStrictlyIncreasing( m_temperatureCoordinates.toSliceConst()), - GEOS_FMT( "{}: invalid values of temperature coordinates provided in {}. " - "Values must be strictly increasing.", fluid->getFullName(), viewKeyStruct::temperatureCoordinatesString() ), - InputError ); + GEOS_THROW_CTX_IF( !isStrictlyIncreasing( m_temperatureCoordinates.toSliceConst()), + GEOS_FMT( "{}: invalid values of temperature coordinates provided in {}. " + "Values must be strictly increasing.", fluid->getFullName(), viewKeyStruct::temperatureCoordinatesString() ), + InputError, fluid->getDataContext() ); } } diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp index d858d329d16..d13b27bfcd9 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp @@ -156,9 +156,9 @@ void ReactiveBrineFluid< PHASE > ::createPVTModels() if( !strs.empty() ) { - GEOS_THROW_IF( strs.size() < 2, - GEOS_FMT( "{}: missing PVT model in line '{}'", getFullName(), str ), - InputError ); + GEOS_THROW_CTX_IF( strs.size() < 2, + GEOS_FMT( "{}: missing PVT model in line '{}'", getFullName(), str ), + InputError, getDataContext() ); if( strs[0] == "DensityFun" ) { @@ -191,17 +191,17 @@ void ReactiveBrineFluid< PHASE > ::createPVTModels() } // at this point, we have read the file and we check the consistency of non-thermal models - GEOS_THROW_IF( phase1InputParams[PHASE::InputParamOrder::DENSITY].empty(), - GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE::Density::catalogName() ), - InputError ); - GEOS_THROW_IF( phase1InputParams[PHASE::InputParamOrder::VISCOSITY].empty(), - GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE::Viscosity::catalogName() ), - InputError ); + GEOS_THROW_CTX_IF( phase1InputParams[PHASE::InputParamOrder::DENSITY].empty(), + GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE::Density::catalogName() ), + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( phase1InputParams[PHASE::InputParamOrder::VISCOSITY].empty(), + GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE::Viscosity::catalogName() ), + InputError, getDataContext() ); // we also detect any inconsistency arising in the enthalpy models - GEOS_THROW_IF( phase1InputParams[PHASE::InputParamOrder::ENTHALPY].empty() && - ( PHASE::Enthalpy::catalogName() != PVTProps::NoOpPVTFunction::catalogName() ), - GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE::Enthalpy::catalogName() ), - InputError ); + GEOS_THROW_CTX_IF( phase1InputParams[PHASE::InputParamOrder::ENTHALPY].empty() && + ( PHASE::Enthalpy::catalogName() != PVTProps::NoOpPVTFunction::catalogName() ), + GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE::Enthalpy::catalogName() ), + InputError, getDataContext() ); bool const isClone = this->isClone(); TableFunction::OutputOptions const pvtOutputOpts = { @@ -233,6 +233,7 @@ void ReactiveBrineFluid< PHASE >::checkTablesParameters( real64 const pressure, { string const errorMsg = GEOS_FMT( "Table input error (in table from {}).\n", stringutilities::join( m_phasePVTParaFiles ) ); + errorLogger.currentErrorMsg().addToMsg( errorMsg ); throw SimulationError( ex, errorMsg ); } } diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp index adf166a4540..c99765bf908 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp @@ -84,29 +84,35 @@ void ParticleFluid::postInputInitialization() { ParticleFluidBase::postInputInitialization(); - GEOS_ERROR_IF( m_proppantDensity < 500.0, - "Invalid proppantDensity in ParticleFluid " - << getDataContext() << ", which must >= 500.0 " ); - - GEOS_ERROR_IF( m_proppantDiameter < 10e-6, - "Invalid proppantDiameter in ParticleFluid " - << getDataContext() << ", which must >= 10e-6 " ); - - GEOS_ERROR_IF( m_hinderedSettlingCoefficient< 0.0 || m_hinderedSettlingCoefficient > 10.0, - "Invalid hinderedSettlingCoefficient in ParticleFluid " - << getDataContext() << ", which must between 0 and 10 " ); - - GEOS_ERROR_IF( m_collisionAlpha < 1.0, - "Invalid collisionAlpha in ParticleFluid " - << getDataContext() << ", which must >= 1 " ); - - GEOS_ERROR_IF( m_collisionBeta < 0.0, - "Invalid collisionBeta in ParticleFluid " - << getDataContext() << ", which must >= 0" ); - - GEOS_ERROR_IF( m_slipConcentration > 0.3, - "Invalid slipConcentration in ParticleFluid " - << getDataContext() << ", which must <= 0.3" ); + GEOS_ERROR_CTX_IF( m_proppantDensity < 500.0, + "Invalid proppantDensity in ParticleFluid " + << getDataContext() << ", which must >= 500.0 ", + getDataContext() ); + + GEOS_ERROR_CTX_IF( m_proppantDiameter < 10e-6, + "Invalid proppantDiameter in ParticleFluid " + << getDataContext() << ", which must >= 10e-6 ", + getDataContext() ); + + GEOS_ERROR_CTX_IF( m_hinderedSettlingCoefficient< 0.0 || m_hinderedSettlingCoefficient > 10.0, + "Invalid hinderedSettlingCoefficient in ParticleFluid " + << getDataContext() << ", which must between 0 and 10 ", + getDataContext() ); + + GEOS_ERROR_CTX_IF( m_collisionAlpha < 1.0, + "Invalid collisionAlpha in ParticleFluid " + << getDataContext() << ", which must >= 1 ", + getDataContext() ); + + GEOS_ERROR_CTX_IF( m_collisionBeta < 0.0, + "Invalid collisionBeta in ParticleFluid " + << getDataContext() << ", which must >= 0", + getDataContext() ); + + GEOS_ERROR_CTX_IF( m_slipConcentration > 0.3, + "Invalid slipConcentration in ParticleFluid " + << getDataContext() << ", which must <= 0.3", + getDataContext() ); m_packPermeabilityCoef = pow( m_sphericity * m_proppantDiameter, 2.0 ) / 180.0; } diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp index 5adb8c48282..4646f0a64ae 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp @@ -90,9 +90,9 @@ void ThermalCompressibleSinglePhaseFluid::postInputInitialization() // Due to the way update wrapper is currently implemented, we can only support one model type auto const checkModelType = [&]( ExponentApproximationType const value, auto const & attribute ) { - GEOS_THROW_IF( value != ExponentApproximationType::Linear && value != ExponentApproximationType::Full, - GEOS_FMT( "{}: invalid model type in attribute '{}' (only linear or fully exponential currently supported)", getFullName(), attribute ), - InputError ); + GEOS_THROW_CTX_IF( value != ExponentApproximationType::Linear && value != ExponentApproximationType::Full, + GEOS_FMT( "{}: invalid model type in attribute '{}' (only linear or fully exponential currently supported)", getFullName(), attribute ), + InputError, getDataContext() ); }; checkModelType( m_internalEnergyModelType, viewKeyStruct::internalEnergyModelTypeString() ); } diff --git a/src/coreComponents/constitutive/permeability/PressurePermeability.cpp b/src/coreComponents/constitutive/permeability/PressurePermeability.cpp index abcb8cde307..3778b2e3604 100644 --- a/src/coreComponents/constitutive/permeability/PressurePermeability.cpp +++ b/src/coreComponents/constitutive/permeability/PressurePermeability.cpp @@ -71,8 +71,9 @@ void PressurePermeability::postInputInitialization() { for( localIndex i=0; i < 3; i++ ) { - GEOS_ERROR_IF( fabs( m_pressureDependenceConstants[i] ) < 1e-15 && m_presModelType == PressureModelType::Hyperbolic, - getDataContext() << ": the pressure dependent constant at component " << i << " is too close to zero, which is not allowed for the hyperbolic model." ); + GEOS_ERROR_CTX_IF( fabs( m_pressureDependenceConstants[i] ) < 1e-15 && m_presModelType == PressureModelType::Hyperbolic, + getDataContext() << ": the pressure dependent constant at component " << i << " is too close to zero, which is not allowed for the hyperbolic model.", + getDataContext() ); } } diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp index bb8ad661a74..66c8344690a 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp @@ -70,9 +70,9 @@ void BrooksCoreyBakerRelativePermeability::postInputInitialization() { RelativePermeabilityBase::postInputInitialization(); - GEOS_THROW_IF( m_phaseOrder[PhaseType::OIL] < 0, - GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), - InputError ); + GEOS_THROW_CTX_IF( m_phaseOrder[PhaseType::OIL] < 0, + GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), + InputError, getDataContext() ); auto const checkInputSize = [&]( auto const & array, localIndex const expected, auto const & attribute ) { diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp index 8eb25929ddb..e9f57733364 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp @@ -70,9 +70,9 @@ void BrooksCoreyStone2RelativePermeability::postInputInitialization() { RelativePermeabilityBase::postInputInitialization(); - GEOS_THROW_IF( m_phaseOrder[PhaseType::OIL] < 0, - GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), - InputError ); + GEOS_THROW_CTX_IF( m_phaseOrder[PhaseType::OIL] < 0, + GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), + InputError, getDataContext() ); auto const checkInputSize = [&]( auto const & array, localIndex const expected, auto const & attribute ) { diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp index ffb33392ee3..a6d2e6f5007 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp @@ -90,50 +90,50 @@ void TableRelativePermeability::postInputInitialization() RelativePermeabilityBase::postInputInitialization(); integer const numPhases = m_phaseNames.size(); - GEOS_THROW_IF( numPhases != 2 && numPhases != 3, - GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", - getFullName() ), - InputError ); + GEOS_THROW_CTX_IF( numPhases != 2 && numPhases != 3, + GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", + getFullName() ), + InputError, getDataContext() ); if( numPhases == 2 ) { - GEOS_THROW_IF( m_wettingNonWettingRelPermTableNames.empty(), - GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the relative permeability tables for the pair (wetting phase, non-wetting phase)", - getFullName(), - viewKeyStruct::wettingNonWettingRelPermTableNamesString() ), - InputError ); - - GEOS_THROW_IF( m_wettingNonWettingRelPermTableNames.size() != 2, - GEOS_FMT( - "{}: for a two-phase flow simulation, we must use {} to specify exactly two names: first the name of the wetting phase relperm table, second the name on the non-wetting phase relperm table", - getFullName(), - viewKeyStruct::wettingNonWettingRelPermTableNamesString() ), - InputError ); + GEOS_THROW_CTX_IF( m_wettingNonWettingRelPermTableNames.empty(), + GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the relative permeability tables for the pair (wetting phase, non-wetting phase)", + getFullName(), + viewKeyStruct::wettingNonWettingRelPermTableNamesString() ), + InputError, getDataContext() ); + + GEOS_THROW_CTX_IF( m_wettingNonWettingRelPermTableNames.size() != 2, + GEOS_FMT( + "{}: for a two-phase flow simulation, we must use {} to specify exactly two names: first the name of the wetting phase relperm table, second the name on the non-wetting phase relperm table", + getFullName(), + viewKeyStruct::wettingNonWettingRelPermTableNamesString() ), + InputError, getDataContext() ); } else if( numPhases == 3 ) { - GEOS_THROW_IF( m_wettingIntermediateRelPermTableNames.empty() || m_nonWettingIntermediateRelPermTableNames.empty(), - GEOS_FMT( - "{}: for a three-phase flow simulation, we must use {} to specify the relative permeability tables for the pair (wetting phase, intermediate phase), and {} to specify the relative permeability tables for the pair (non-wetting phase, intermediate phase)", - getFullName(), - viewKeyStruct::wettingIntermediateRelPermTableNamesString(), - viewKeyStruct::nonWettingIntermediateRelPermTableNamesString() ), - InputError ); - - GEOS_THROW_IF( m_wettingIntermediateRelPermTableNames.size() != 2, - GEOS_FMT( - "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: first the name of the wetting phase relperm table, second the name on the intermediate phase relperm table", - getFullName(), - viewKeyStruct::wettingIntermediateRelPermTableNamesString() ), - InputError ); - - GEOS_THROW_IF( m_nonWettingIntermediateRelPermTableNames.size() != 2, - GEOS_FMT( - "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: first the name of the non-wetting phase relperm table, second the name on the intermediate phase relperm table", - getFullName(), - viewKeyStruct::nonWettingIntermediateRelPermTableNamesString() ), - InputError ); + GEOS_THROW_CTX_IF( m_wettingIntermediateRelPermTableNames.empty() || m_nonWettingIntermediateRelPermTableNames.empty(), + GEOS_FMT( + "{}: for a three-phase flow simulation, we must use {} to specify the relative permeability tables for the pair (wetting phase, intermediate phase), and {} to specify the relative permeability tables for the pair (non-wetting phase, intermediate phase)", + getFullName(), + viewKeyStruct::wettingIntermediateRelPermTableNamesString(), + viewKeyStruct::nonWettingIntermediateRelPermTableNamesString() ), + InputError, getDataContext() ); + + GEOS_THROW_CTX_IF( m_wettingIntermediateRelPermTableNames.size() != 2, + GEOS_FMT( + "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: first the name of the wetting phase relperm table, second the name on the intermediate phase relperm table", + getFullName(), + viewKeyStruct::wettingIntermediateRelPermTableNamesString() ), + InputError, getDataContext() ); + + GEOS_THROW_CTX_IF( m_nonWettingIntermediateRelPermTableNames.size() != 2, + GEOS_FMT( + "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: first the name of the non-wetting phase relperm table, second the name on the intermediate phase relperm table", + getFullName(), + viewKeyStruct::nonWettingIntermediateRelPermTableNamesString() ), + InputError, getDataContext() ); } } @@ -159,11 +159,11 @@ void TableRelativePermeability::initializePreSubGroups() { for( size_t ip = 0; ip < m_wettingNonWettingRelPermTableNames.size(); ++ip ) { - GEOS_THROW_IF( !functionManager.hasGroup( m_wettingNonWettingRelPermTableNames[ip] ), - GEOS_FMT( "{}: the table function named {} could not be found", - getFullName(), - m_wettingNonWettingRelPermTableNames[ip] ), - InputError ); + GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_wettingNonWettingRelPermTableNames[ip] ), + GEOS_FMT( "{}: the table function named {} could not be found", + getFullName(), + m_wettingNonWettingRelPermTableNames[ip] ), + InputError, getDataContext() ); TableFunction const & relPermTable = functionManager.getGroup< TableFunction >( m_wettingNonWettingRelPermTableNames[ip] ); TableRelativePermeabilityHelpers:: validateRelativePermeabilityTable( relPermTable, // input @@ -187,11 +187,11 @@ void TableRelativePermeability::initializePreSubGroups() { for( size_t ip = 0; ip < m_wettingIntermediateRelPermTableNames.size(); ++ip ) { - GEOS_THROW_IF( !functionManager.hasGroup( m_wettingIntermediateRelPermTableNames[ip] ), - GEOS_FMT( "{}: the table function named {} could not be found", - getFullName(), - m_wettingIntermediateRelPermTableNames[ip] ), - InputError ); + GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_wettingIntermediateRelPermTableNames[ip] ), + GEOS_FMT( "{}: the table function named {} could not be found", + getFullName(), + m_wettingIntermediateRelPermTableNames[ip] ), + InputError, getDataContext() ); TableFunction const & relPermTable = functionManager.getGroup< TableFunction >( m_wettingIntermediateRelPermTableNames[ip] ); TableRelativePermeabilityHelpers:: validateRelativePermeabilityTable( relPermTable, // input @@ -214,11 +214,11 @@ void TableRelativePermeability::initializePreSubGroups() } for( size_t ip = 0; ip < m_nonWettingIntermediateRelPermTableNames.size(); ++ip ) { - GEOS_THROW_IF( !functionManager.hasGroup( m_nonWettingIntermediateRelPermTableNames[ip] ), - GEOS_FMT( "{}: the table function named {} could not be found", - getFullName(), - m_nonWettingIntermediateRelPermTableNames[ip] ), - InputError ); + GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_nonWettingIntermediateRelPermTableNames[ip] ), + GEOS_FMT( "{}: the table function named {} could not be found", + getFullName(), + m_nonWettingIntermediateRelPermTableNames[ip] ), + InputError, getDataContext() ); TableFunction const & relPermTable = functionManager.getGroup< TableFunction >( m_nonWettingIntermediateRelPermTableNames[ip] ); TableRelativePermeabilityHelpers:: validateRelativePermeabilityTable( relPermTable, // input diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp index 0edd1537af7..fb0195b0bca 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp @@ -56,25 +56,25 @@ TableRelativePermeabilityHelpers::validateRelativePermeabilityTable( TableFuncti phaseRelPermEndPoint = relPerm[relPerm.size()-1]; // note that the TableFunction class has already checked that coords.sizeOfArray( 0 ) == relPerm.size() - GEOS_THROW_IF( !isZero( relPerm[0] ), - GEOS_FMT( "{}: TableFunction '{}' first value must be equal to 0", - fullConstitutiveName, relPermTable.getDataContext() ), - InputError ); + GEOS_THROW_CTX_IF( !isZero( relPerm[0] ), + GEOS_FMT( "{}: TableFunction '{}' first value must be equal to 0", + fullConstitutiveName, relPermTable.getDataContext() ), + InputError, relPermTable.getDataContext() ); for( localIndex i = 1; i < coords.sizeOfArray( 0 ); ++i ) { // check phase volume fraction - GEOS_THROW_IF( phaseVolFrac[i] < 0 || phaseVolFrac[i] > 1, - GEOS_FMT( "{}: TableFunction '{}' values must be between 0 and 1", - fullConstitutiveName, relPermTable.getDataContext() ), - InputError ); + GEOS_THROW_CTX_IF( phaseVolFrac[i] < 0 || phaseVolFrac[i] > 1, + GEOS_FMT( "{}: TableFunction '{}' values must be between 0 and 1", + fullConstitutiveName, relPermTable.getDataContext() ), + InputError, relPermTable.getDataContext() ); // note that the TableFunction class has already checked that the coordinates are monotone // check phase relative permeability - GEOS_THROW_IF( !isZero( relPerm[i] ) && (relPerm[i] - relPerm[i-1]) < 1e-15, - GEOS_FMT( "{}: TableFunction '{}' values must be strictly increasing (|Delta kr| > 1e-15 between two non-zero values)", - fullConstitutiveName, relPermTable.getDataContext() ), - InputError ); + GEOS_THROW_CTX_IF( !isZero( relPerm[i] ) && (relPerm[i] - relPerm[i-1]) < 1e-15, + GEOS_FMT( "{}: TableFunction '{}' values must be strictly increasing (|Delta kr| > 1e-15 between two non-zero values)", + fullConstitutiveName, relPermTable.getDataContext() ), + InputError, relPermTable.getDataContext() ); if( isZero( relPerm[i-1] ) && !isZero( relPerm[i] ) ) { diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp index bdea3a28202..9c736a5f45b 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp @@ -168,10 +168,10 @@ void TableRelativePermeabilityHysteresis::postInputInitialization() using IPT = TableRelativePermeabilityHysteresis::ImbibitionPhasePairPhaseType; integer const numPhases = m_phaseNames.size(); - GEOS_THROW_IF( numPhases != 2 && numPhases != 3, - GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", - getFullName() ), - InputError ); + GEOS_THROW_CTX_IF( numPhases != 2 && numPhases != 3, + GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", + getFullName() ), + InputError, getDataContext() ); m_phaseHasHysteresis.resize( 2 ); @@ -181,19 +181,19 @@ void TableRelativePermeabilityHysteresis::postInputInitialization() if( numPhases == 2 ) { - GEOS_THROW_IF( m_drainageWettingNonWettingRelPermTableNames.empty(), - GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the relative permeability tables " - "for the pair (wetting phase, non-wetting phase)", - getFullName(), - viewKeyStruct::drainageWettingNonWettingRelPermTableNamesString() ), - InputError ); - - GEOS_THROW_IF( m_drainageWettingNonWettingRelPermTableNames.size() != 2, - GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify exactly two names: " - "first the name of the wetting phase relperm table, second the name on the non-wetting phase relperm table", - getFullName(), - viewKeyStruct::drainageWettingNonWettingRelPermTableNamesString() ), - InputError ); + GEOS_THROW_CTX_IF( m_drainageWettingNonWettingRelPermTableNames.empty(), + GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the relative permeability tables " + "for the pair (wetting phase, non-wetting phase)", + getFullName(), + viewKeyStruct::drainageWettingNonWettingRelPermTableNamesString() ), + InputError, getDataContext() ); + + GEOS_THROW_CTX_IF( m_drainageWettingNonWettingRelPermTableNames.size() != 2, + GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify exactly two names: " + "first the name of the wetting phase relperm table, second the name on the non-wetting phase relperm table", + getFullName(), + viewKeyStruct::drainageWettingNonWettingRelPermTableNamesString() ), + InputError, getDataContext() ); m_phaseHasHysteresis[IPT::WETTING] = ( m_imbibitionWettingRelPermTableName.empty() || m_imbibitionWettingRelPermTableName == m_drainageWettingNonWettingRelPermTableNames[0] ) @@ -204,28 +204,28 @@ void TableRelativePermeabilityHysteresis::postInputInitialization() } else if( numPhases == 3 ) { - GEOS_THROW_IF( m_drainageWettingIntermediateRelPermTableNames.empty() || m_drainageNonWettingIntermediateRelPermTableNames.empty(), - GEOS_FMT( "{}: for a three-phase flow simulation, " - "we must use {} to specify the relative permeability tables for the pair (wetting phase, intermediate phase), " - "and {} to specify the relative permeability tables for the pair (non-wetting phase, intermediate phase)", - getFullName(), - viewKeyStruct::drainageWettingIntermediateRelPermTableNamesString(), - viewKeyStruct::drainageNonWettingIntermediateRelPermTableNamesString() ), - InputError ); - - GEOS_THROW_IF( m_drainageWettingIntermediateRelPermTableNames.size() != 2, - GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: " - "first the name of the wetting phase relperm table, second the name on the intermediate phase relperm table", - getFullName(), - viewKeyStruct::drainageWettingIntermediateRelPermTableNamesString() ), - InputError ); - - GEOS_THROW_IF( m_drainageNonWettingIntermediateRelPermTableNames.size() != 2, - GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: " - "first the name of the non-wetting phase relperm table, second the name on the intermediate phase relperm table", - getFullName(), - viewKeyStruct::drainageNonWettingIntermediateRelPermTableNamesString() ), - InputError ); + GEOS_THROW_CTX_IF( m_drainageWettingIntermediateRelPermTableNames.empty() || m_drainageNonWettingIntermediateRelPermTableNames.empty(), + GEOS_FMT( "{}: for a three-phase flow simulation, " + "we must use {} to specify the relative permeability tables for the pair (wetting phase, intermediate phase), " + "and {} to specify the relative permeability tables for the pair (non-wetting phase, intermediate phase)", + getFullName(), + viewKeyStruct::drainageWettingIntermediateRelPermTableNamesString(), + viewKeyStruct::drainageNonWettingIntermediateRelPermTableNamesString() ), + InputError, getDataContext() ); + + GEOS_THROW_CTX_IF( m_drainageWettingIntermediateRelPermTableNames.size() != 2, + GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: " + "first the name of the wetting phase relperm table, second the name on the intermediate phase relperm table", + getFullName(), + viewKeyStruct::drainageWettingIntermediateRelPermTableNamesString() ), + InputError, getDataContext() ); + + GEOS_THROW_CTX_IF( m_drainageNonWettingIntermediateRelPermTableNames.size() != 2, + GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: " + "first the name of the non-wetting phase relperm table, second the name on the intermediate phase relperm table", + getFullName(), + viewKeyStruct::drainageNonWettingIntermediateRelPermTableNamesString() ), + InputError, getDataContext() ); m_phaseHasHysteresis[IPT::WETTING] = ( m_imbibitionWettingRelPermTableName.empty() || m_imbibitionWettingRelPermTableName == m_drainageWettingIntermediateRelPermTableNames[0] ) @@ -235,30 +235,30 @@ void TableRelativePermeabilityHysteresis::postInputInitialization() ? 0 : 1; } - GEOS_THROW_IF( m_phaseHasHysteresis[IPT::WETTING] == 0 && m_phaseHasHysteresis[IPT::NONWETTING] == 0, - GEOS_FMT( "{}: we must use {} or {} to specify at least one imbibition relative permeability table", - getFullName(), - viewKeyStruct::imbibitionWettingRelPermTableNameString(), - viewKeyStruct::imbibitionNonWettingRelPermTableNameString() ), - InputError ); - - GEOS_THROW_IF( m_jerauldParam_a < 0, - GEOS_FMT( "{}: the parameter {} must be positive", - getFullName(), - viewKeyStruct::jerauldParameterAString() ), - InputError ); - - GEOS_THROW_IF( m_jerauldParam_b < 0, - GEOS_FMT( "{}: the paramater {} must be postitive", - getFullName(), - viewKeyStruct::jerauldParameterBString() ), - InputError ); - - GEOS_THROW_IF( m_killoughCurvatureParam < 0, - GEOS_FMT( "{}: the paramater {} must be postitive", - getFullName(), - viewKeyStruct::killoughCurvatureParameterString() ), - InputError ); + GEOS_THROW_CTX_IF( m_phaseHasHysteresis[IPT::WETTING] == 0 && m_phaseHasHysteresis[IPT::NONWETTING] == 0, + GEOS_FMT( "{}: we must use {} or {} to specify at least one imbibition relative permeability table", + getFullName(), + viewKeyStruct::imbibitionWettingRelPermTableNameString(), + viewKeyStruct::imbibitionNonWettingRelPermTableNameString() ), + InputError, getDataContext() ); + + GEOS_THROW_CTX_IF( m_jerauldParam_a < 0, + GEOS_FMT( "{}: the parameter {} must be positive", + getFullName(), + viewKeyStruct::jerauldParameterAString() ), + InputError, getDataContext() ); + + GEOS_THROW_CTX_IF( m_jerauldParam_b < 0, + GEOS_FMT( "{}: the paramater {} must be postitive", + getFullName(), + viewKeyStruct::jerauldParameterBString() ), + InputError, getDataContext() ); + + GEOS_THROW_CTX_IF( m_killoughCurvatureParam < 0, + GEOS_FMT( "{}: the paramater {} must be postitive", + getFullName(), + viewKeyStruct::killoughCurvatureParameterString() ), + InputError, getDataContext() ); } @@ -390,21 +390,21 @@ void TableRelativePermeabilityHysteresis::checkExistenceAndValidateImbibitionRel m_imbibitionPhaseMaxVolFraction[IPT::WETTING], m_imbibitionPhaseRelPermEndPoint[IPT::WETTING] ); - GEOS_THROW_IF( !isZero( m_imbibitionPhaseMinVolFraction[IPT::WETTING] - m_drainagePhaseMinVolFraction[ipWetting] ), - GEOS_FMT( "{}: the critical wetting-phase volume fraction (saturation) must be the same in drainage and imbibition.\n" - "However, we found that the drainage critical wetting-phase volume fraction is {}, " - "whereas the imbibition critical wetting-phase volume fraction is {}", - getFullName(), - m_drainagePhaseMinVolFraction[ipWetting], m_imbibitionPhaseMinVolFraction[IPT::WETTING] ), - InputError ); - - GEOS_THROW_IF( m_imbibitionPhaseMaxVolFraction[IPT::WETTING] > m_drainagePhaseMaxVolFraction[ipWetting], - GEOS_FMT( "{}: the maximum wetting-phase volume fraction (saturation) must be smaller in imbibition (compared to the drainage value).\n" - "However, we found that the drainage maximum wetting-phase volume fraction is {}, " - "whereas the imbibition maximum wetting-phase volume fraction is {}", - getFullName(), - m_drainagePhaseMaxVolFraction[ipWetting], m_imbibitionPhaseMaxVolFraction[IPT::WETTING] ), - InputError ); + GEOS_THROW_CTX_IF( !isZero( m_imbibitionPhaseMinVolFraction[IPT::WETTING] - m_drainagePhaseMinVolFraction[ipWetting] ), + GEOS_FMT( "{}: the critical wetting-phase volume fraction (saturation) must be the same in drainage and imbibition.\n" + "However, we found that the drainage critical wetting-phase volume fraction is {}, " + "whereas the imbibition critical wetting-phase volume fraction is {}", + getFullName(), + m_drainagePhaseMinVolFraction[ipWetting], m_imbibitionPhaseMinVolFraction[IPT::WETTING] ), + InputError, getDataContext() ); + + GEOS_THROW_CTX_IF( m_imbibitionPhaseMaxVolFraction[IPT::WETTING] > m_drainagePhaseMaxVolFraction[ipWetting], + GEOS_FMT( "{}: the maximum wetting-phase volume fraction (saturation) must be smaller in imbibition (compared to the drainage value).\n" + "However, we found that the drainage maximum wetting-phase volume fraction is {}, " + "whereas the imbibition maximum wetting-phase volume fraction is {}", + getFullName(), + m_drainagePhaseMaxVolFraction[ipWetting], m_imbibitionPhaseMaxVolFraction[IPT::WETTING] ), + InputError, getDataContext() ); } // Step 2: validate non-wetting-phase imbibition relative permeability table @@ -417,29 +417,29 @@ void TableRelativePermeabilityHysteresis::checkExistenceAndValidateImbibitionRel m_imbibitionPhaseMaxVolFraction[IPT::NONWETTING], m_imbibitionPhaseRelPermEndPoint[IPT::NONWETTING] ); - GEOS_THROW_IF( !isZero ( m_imbibitionPhaseMaxVolFraction[IPT::NONWETTING] - m_drainagePhaseMaxVolFraction[ipNonWetting] ), - GEOS_FMT( string( "{}: the maximum non-wetting-phase volume fraction (saturation) must be the same in drainage and imbibition.\n" ) - + string( "However, we found that the drainage maximum wetting-phase volume fraction is {}, " ) - + string( "whereas the imbibition maximum wetting-phase volume fraction is {}" ), - getFullName(), - m_drainagePhaseMaxVolFraction[ipNonWetting], m_imbibitionPhaseMaxVolFraction[IPT::NONWETTING] ), - InputError ); - - GEOS_THROW_IF( !isZero ( m_imbibitionPhaseRelPermEndPoint[IPT::NONWETTING] - m_drainagePhaseRelPermEndPoint[ipNonWetting] ), - GEOS_FMT( string( "{}: the non-wetting-phase relperm endpoint must be the same in drainage and imbibition.\n" ) - + string( "However, we found that the drainage endpoint wetting-phase relperm is {}, " ) - + string( "whereas the imbibition endpoint wetting-phase relperm is {}" ), - getFullName(), - m_drainagePhaseRelPermEndPoint[ipNonWetting], m_imbibitionPhaseRelPermEndPoint[IPT::NONWETTING] ), - InputError ); - - GEOS_THROW_IF( m_imbibitionPhaseMinVolFraction[IPT::NONWETTING] < m_drainagePhaseMinVolFraction[ipNonWetting], - GEOS_FMT( string( "{}: the critical wetting-phase volume fraction (saturation) must be larger in imbibition (compared to the drainage value).\n" ) - + string( "However, we found that the drainage critical wetting-phase volume fraction is {}, " ) - + string( "whereas the imbibition critical wetting-phase volume fraction is {}" ), - getFullName(), - m_drainagePhaseMinVolFraction[ipNonWetting], m_imbibitionPhaseMinVolFraction[IPT::NONWETTING] ), - InputError ); + GEOS_THROW_CTX_IF( !isZero ( m_imbibitionPhaseMaxVolFraction[IPT::NONWETTING] - m_drainagePhaseMaxVolFraction[ipNonWetting] ), + GEOS_FMT( string( "{}: the maximum non-wetting-phase volume fraction (saturation) must be the same in drainage and imbibition.\n" ) + + string( "However, we found that the drainage maximum wetting-phase volume fraction is {}, " ) + + string( "whereas the imbibition maximum wetting-phase volume fraction is {}" ), + getFullName(), + m_drainagePhaseMaxVolFraction[ipNonWetting], m_imbibitionPhaseMaxVolFraction[IPT::NONWETTING] ), + InputError, getDataContext() ); + + GEOS_THROW_CTX_IF( !isZero ( m_imbibitionPhaseRelPermEndPoint[IPT::NONWETTING] - m_drainagePhaseRelPermEndPoint[ipNonWetting] ), + GEOS_FMT( string( "{}: the non-wetting-phase relperm endpoint must be the same in drainage and imbibition.\n" ) + + string( "However, we found that the drainage endpoint wetting-phase relperm is {}, " ) + + string( "whereas the imbibition endpoint wetting-phase relperm is {}" ), + getFullName(), + m_drainagePhaseRelPermEndPoint[ipNonWetting], m_imbibitionPhaseRelPermEndPoint[IPT::NONWETTING] ), + InputError, getDataContext() ); + + GEOS_THROW_CTX_IF( m_imbibitionPhaseMinVolFraction[IPT::NONWETTING] < m_drainagePhaseMinVolFraction[ipNonWetting], + GEOS_FMT( string( "{}: the critical wetting-phase volume fraction (saturation) must be larger in imbibition (compared to the drainage value).\n" ) + + string( "However, we found that the drainage critical wetting-phase volume fraction is {}, " ) + + string( "whereas the imbibition critical wetting-phase volume fraction is {}" ), + getFullName(), + m_drainagePhaseMinVolFraction[ipNonWetting], m_imbibitionPhaseMinVolFraction[IPT::NONWETTING] ), + InputError, getDataContext() ); } } @@ -451,11 +451,11 @@ void TableRelativePermeabilityHysteresis::checkExistenceAndValidateRelPermTable( FunctionManager const & functionManager = FunctionManager::getInstance(); // check if the table actually exists - GEOS_THROW_IF( !functionManager.hasGroup( relPermTableName ), - GEOS_FMT( "{}: the table function named {} could not be found", - getFullName(), - relPermTableName ), - InputError ); + GEOS_THROW_CTX_IF( !functionManager.hasGroup( relPermTableName ), + GEOS_FMT( "{}: the table function named {} could not be found", + getFullName(), + relPermTableName ), + InputError, getDataContext() ); TableFunction const & relPermTable = functionManager.getGroup< TableFunction >( relPermTableName ); // read the table, check monotonicity, and return the min/max saturation and the endpoint @@ -499,13 +499,13 @@ void TableRelativePermeabilityHysteresis::computeLandCoefficient() real64 const Smxd = m_drainagePhaseMaxVolFraction[ipWetting]; real64 const Smxi = m_imbibitionPhaseMaxVolFraction[IPT::WETTING]; real64 const Swc = Scrd; - GEOS_THROW_IF( (Smxi - Smxd) > 0, - GEOS_FMT( "{}: For wetting phase hysteresis, imbibition end-point saturation Smxi( {} ) must be smaller than the drainage saturation end-point Smxd( {} ).\n" - "Crossing relative permeability curves.\n", - getFullName(), - Smxi, - Smxd ), - InputError ); + GEOS_THROW_CTX_IF( (Smxi - Smxd) > 0, + GEOS_FMT( "{}: For wetting phase hysteresis, imbibition end-point saturation Smxi( {} ) must be smaller than the drainage saturation end-point Smxd( {} ).\n" + "Crossing relative permeability curves.\n", + getFullName(), + Smxi, + Smxd ), + InputError, getDataContext() ); m_landParam[IPT::WETTING] = ( Smxd - Swc ) / LvArray::math::max( KernelWrapper::minScriMinusScrd, ( Smxd - Smxi ) ) - 1.0; } @@ -516,13 +516,13 @@ void TableRelativePermeabilityHysteresis::computeLandCoefficient() real64 const Scrd = m_drainagePhaseMinVolFraction[ipNonWetting]; real64 const Scri = m_imbibitionPhaseMinVolFraction[IPT::NONWETTING]; real64 const Smx = m_drainagePhaseMaxVolFraction[ipNonWetting]; - GEOS_THROW_IF( (Scrd - Scri) > 0, - GEOS_FMT( "{}: For non-wetting phase hysteresis, drainage trapped saturation Scrd( {} ) must be smaller than the imbibition saturation Scri( {} ).\n" - "Crossing relative permeability curves.\n", - getFullName(), - Scrd, - Scri ), - InputError ); + GEOS_THROW_CTX_IF( (Scrd - Scri) > 0, + GEOS_FMT( "{}: For non-wetting phase hysteresis, drainage trapped saturation Scrd( {} ) must be smaller than the imbibition saturation Scri( {} ).\n" + "Crossing relative permeability curves.\n", + getFullName(), + Scrd, + Scri ), + InputError, getDataContext() ); m_landParam[IPT::NONWETTING] = ( Smx - Scrd ) / LvArray::math::max( KernelWrapper::minScriMinusScrd, ( Scri - Scrd ) ) - 1.0; } diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp index 12823c81163..96758fcff69 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp @@ -72,9 +72,9 @@ void VanGenuchtenBakerRelativePermeability::postInputInitialization() { RelativePermeabilityBase::postInputInitialization(); - GEOS_THROW_IF( m_phaseOrder[PhaseType::OIL] < 0, - GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), - InputError ); + GEOS_THROW_CTX_IF( m_phaseOrder[PhaseType::OIL] < 0, + GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), + InputError, getDataContext() ); auto const checkInputSize = [&]( auto const & array, localIndex const expected, auto const & attribute ) { diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp index dbb0ee05f0e..fc2635b3c43 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp @@ -72,9 +72,9 @@ void VanGenuchtenStone2RelativePermeability::postInputInitialization() { RelativePermeabilityBase::postInputInitialization(); - GEOS_THROW_IF( m_phaseOrder[PhaseType::OIL] < 0, - GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), - InputError ); + GEOS_THROW_CTX_IF( m_phaseOrder[PhaseType::OIL] < 0, + GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), + InputError, getDataContext() ); auto const checkInputSize = [&]( auto const & array, localIndex const expected, auto const & attribute ) { diff --git a/src/coreComponents/constitutive/solid/Damage.cpp b/src/coreComponents/constitutive/solid/Damage.cpp index c1131d0378f..cd44c56d9e7 100644 --- a/src/coreComponents/constitutive/solid/Damage.cpp +++ b/src/coreComponents/constitutive/solid/Damage.cpp @@ -148,18 +148,22 @@ void Damage< BASE >::postInputInitialization() { BASE::postInputInitialization(); - GEOS_ERROR_IF( m_extDrivingForceFlag != 0 && m_extDrivingForceFlag!= 1, - BASE::getDataContext() << ": invalid external driving force flag option - must" - " be 0 or 1" ); - GEOS_ERROR_IF( m_extDrivingForceFlag == 1 && m_defaultTensileStrength <= 0.0, - BASE::getDataContext() << ": tensile strength must be input and positive when the" - " external driving force flag is turned on" ); - GEOS_ERROR_IF( m_extDrivingForceFlag == 1 && m_defaultCompressStrength <= 0.0, - BASE::getDataContext() << ": compressive strength must be input and positive when the" - " external driving force flag is turned on" ); - GEOS_ERROR_IF( m_extDrivingForceFlag == 1 && m_defaultDeltaCoefficient < 0.0, - BASE::getDataContext() << ": delta coefficient must be input and non-negative when the" - " external driving force flag is turned on" ); + GEOS_ERROR_CTX_IF( m_extDrivingForceFlag != 0 && m_extDrivingForceFlag!= 1, + BASE::getDataContext() << ": invalid external driving force flag option - must" + " be 0 or 1", + BASE::getDataContext() ); + GEOS_ERROR_CTX_IF( m_extDrivingForceFlag == 1 && m_defaultTensileStrength <= 0.0, + BASE::getDataContext() << ": tensile strength must be input and positive when the" + " external driving force flag is turned on", + BASE::getDataContext() ); + GEOS_ERROR_CTX_IF( m_extDrivingForceFlag == 1 && m_defaultCompressStrength <= 0.0, + BASE::getDataContext() << ": compressive strength must be input and positive when the" + " external driving force flag is turned on", + BASE::getDataContext() ); + GEOS_ERROR_CTX_IF( m_extDrivingForceFlag == 1 && m_defaultDeltaCoefficient < 0.0, + BASE::getDataContext() << ": delta coefficient must be input and non-negative when the" + " external driving force flag is turned on", + BASE::getDataContext() ); // set results as array default values this->template getWrapper< array1d< real64 > >( viewKeyStruct::criticalFractureEnergyString() ). diff --git a/src/coreComponents/constitutive/solid/DelftEgg.cpp b/src/coreComponents/constitutive/solid/DelftEgg.cpp index cd45347cb72..045412a5ff4 100644 --- a/src/coreComponents/constitutive/solid/DelftEgg.cpp +++ b/src/coreComponents/constitutive/solid/DelftEgg.cpp @@ -113,14 +113,18 @@ void DelftEgg::postInputInitialization() { ElasticIsotropic::postInputInitialization(); - GEOS_THROW_IF( m_defaultCslSlope <= 0, - getFullName() << ": Non-positive slope of critical state line detected", InputError ); - GEOS_THROW_IF( m_defaultShapeParameter < 1., - getFullName() << ": Shape parameter for yield surface must be greater than or equal to one", InputError ); - GEOS_THROW_IF( m_defaultVirginCompressionIndex <= 0, - getFullName() << ": Non-positive virgin compression index detected", InputError ); - GEOS_THROW_IF( m_defaultVirginCompressionIndex <= m_defaultRecompressionIndex, - getFullName() << ": Recompression index should exceed virgin recompression index", InputError ); + GEOS_THROW_CTX_IF( m_defaultCslSlope <= 0, + getFullName() << ": Non-positive slope of critical state line detected", + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( m_defaultShapeParameter < 1., + getFullName() << ": Shape parameter for yield surface must be greater than or equal to one", + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( m_defaultVirginCompressionIndex <= 0, + getFullName() << ": Non-positive virgin compression index detected", + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( m_defaultVirginCompressionIndex <= m_defaultRecompressionIndex, + getFullName() << ": Recompression index should exceed virgin recompression index", + InputError, getDataContext() ); // set results as array default values diff --git a/src/coreComponents/constitutive/solid/DruckerPrager.cpp b/src/coreComponents/constitutive/solid/DruckerPrager.cpp index cfdbfb05253..8637841cc00 100644 --- a/src/coreComponents/constitutive/solid/DruckerPrager.cpp +++ b/src/coreComponents/constitutive/solid/DruckerPrager.cpp @@ -102,14 +102,18 @@ void DruckerPrager::postInputInitialization() { ElasticIsotropic::postInputInitialization(); - GEOS_THROW_IF( m_defaultCohesion < 0, - getFullName() << ": Negative cohesion value detected", InputError ); - GEOS_THROW_IF( m_defaultFrictionAngle < 0, - getFullName() << ": Negative friction angle detected", InputError ); - GEOS_THROW_IF( m_defaultDilationAngle < 0, - getFullName() << ": Negative dilation angle detected", InputError ); - GEOS_THROW_IF( m_defaultFrictionAngle < m_defaultDilationAngle, - getFullName() << ": Dilation angle should not exceed friction angle", InputError ); + GEOS_THROW_CTX_IF( m_defaultCohesion < 0, + getFullName() << ": Negative cohesion value detected", + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( m_defaultFrictionAngle < 0, + getFullName() << ": Negative friction angle detected", + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( m_defaultDilationAngle < 0, + getFullName() << ": Negative dilation angle detected", + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( m_defaultFrictionAngle < m_defaultDilationAngle, + getFullName() << ": Dilation angle should not exceed friction angle", + InputError, getDataContext() ); // convert from Mohr-Coulomb constants to Drucker-Prager constants, assuming DP // passes through the triaxial compression corners of the MC surface. diff --git a/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp b/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp index 2158e78f3a0..05decde3f65 100644 --- a/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp +++ b/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp @@ -118,18 +118,24 @@ void DruckerPragerExtended::postInputInitialization() { ElasticIsotropic::postInputInitialization(); - GEOS_THROW_IF( m_defaultCohesion < 0, - getFullName() << ": Negative cohesion value detected", InputError ); - GEOS_THROW_IF( m_defaultInitialFrictionAngle < 0, - getFullName() << ": Negative initial friction angle detected", InputError ); - GEOS_THROW_IF( m_defaultResidualFrictionAngle < 0, - getFullName() << ": Negative residual friction angle detected", InputError ); - GEOS_THROW_IF( m_defaultDilationRatio < 0, - getFullName() << ": Dilation ratio out of [0,1] range detected", InputError ); - GEOS_THROW_IF( m_defaultDilationRatio > 1, - getFullName() << ": Dilation ratio out of [0,1] range detected", InputError ); - GEOS_THROW_IF( m_defaultHardening < 0, - getFullName() << ": Negative hardening parameter detected", InputError ); + GEOS_THROW_CTX_IF( m_defaultCohesion < 0, + getFullName() << ": Negative cohesion value detected", + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( m_defaultInitialFrictionAngle < 0, + getFullName() << ": Negative initial friction angle detected", + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( m_defaultResidualFrictionAngle < 0, + getFullName() << ": Negative residual friction angle detected", + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( m_defaultDilationRatio < 0, + getFullName() << ": Dilation ratio out of [0,1] range detected", + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( m_defaultDilationRatio > 1, + getFullName() << ": Dilation ratio out of [0,1] range detected", + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( m_defaultHardening < 0, + getFullName() << ": Negative hardening parameter detected", + InputError, getDataContext() ); // convert from Mohr-Coulomb constants to Drucker-Prager constants, assuming DP // passes through the triaxial tension corners of the MC surface. diff --git a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp index 95172384a19..5c7f7641805 100644 --- a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp +++ b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp @@ -104,11 +104,13 @@ void ElasticIsotropicPressureDependent::postInputInitialization() GEOS_ERROR_IF( numConstantsSpecified != 2, getFullName() << ": A specific pair of elastic constants is required: (Cr, G). " ); - GEOS_THROW_IF( m_defaultRecompressionIndex <= 0, - getFullName() << ": Non-positive recompression index detected " << m_defaultRecompressionIndex, InputError ); + GEOS_THROW_CTX_IF( m_defaultRecompressionIndex <= 0, + getFullName() << ": Non-positive recompression index detected " << m_defaultRecompressionIndex, + InputError, getDataContext() ); real64 poisson = conversions::bulkModAndShearMod::toPoissonRatio( -1 * m_defaultRefPressure / m_defaultRecompressionIndex, m_defaultShearModulus ); - GEOS_THROW_IF( poisson < 0, - getFullName() << ": Elastic parameters lead to negative Poisson ratio at reference pressure ", InputError ); + GEOS_THROW_CTX_IF( poisson < 0, + getFullName() << ": Elastic parameters lead to negative Poisson ratio at reference pressure ", + InputError, getDataContext() ); // set results as array default values diff --git a/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp b/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp index 6d0e8f401d6..ec5a1284b11 100644 --- a/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp +++ b/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp @@ -91,12 +91,15 @@ void ModifiedCamClay::postInputInitialization() { ElasticIsotropicPressureDependent::postInputInitialization(); - GEOS_THROW_IF( m_defaultCslSlope <= 0, - getFullName() << ": Non-positive slope of critical state line detected", InputError ); - GEOS_THROW_IF( m_defaultVirginCompressionIndex <= 0, - getFullName() << ": Non-positive virgin compression index detected", InputError ); - GEOS_THROW_IF( m_defaultVirginCompressionIndex <= m_defaultRecompressionIndex, - getFullName() << ": Recompression index should exceed virgin recompression index", InputError ); + GEOS_THROW_CTX_IF( m_defaultCslSlope <= 0, + getFullName() << ": Non-positive slope of critical state line detected", + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( m_defaultVirginCompressionIndex <= 0, + getFullName() << ": Non-positive virgin compression index detected", + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( m_defaultVirginCompressionIndex <= m_defaultRecompressionIndex, + getFullName() << ": Recompression index should exceed virgin recompression index", + InputError, getDataContext() ); // set results as array default values diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp index 3ca4d0ba26a..209eabdd282 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp @@ -62,12 +62,12 @@ void MultiPhaseConstantThermalConductivity::allocateConstitutiveData( dataReposi void MultiPhaseConstantThermalConductivity::postInputInitialization() { - GEOS_THROW_IF( m_thermalConductivityComponents[0] < 0 || - m_thermalConductivityComponents[1] < 0 || - m_thermalConductivityComponents[2] < 0, - GEOS_FMT( "{}: the components of the thermal conductivity tensor must be non-negative", - getFullName() ), - InputError ); + GEOS_THROW_CTX_IF( m_thermalConductivityComponents[0] < 0 || + m_thermalConductivityComponents[1] < 0 || + m_thermalConductivityComponents[2] < 0, + GEOS_FMT( "{}: the components of the thermal conductivity tensor must be non-negative", + getFullName() ), + InputError, getDataContext() ); } REGISTER_CATALOG_ENTRY( ConstitutiveBase, MultiPhaseConstantThermalConductivity, string const &, Group * const ) diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp index f72e78bfdb3..84563f32f3b 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp @@ -74,19 +74,19 @@ void MultiPhaseVolumeWeightedThermalConductivity::allocateConstitutiveData( data void MultiPhaseVolumeWeightedThermalConductivity::postInputInitialization() { - GEOS_THROW_IF( m_rockThermalConductivityComponents[0] <= 0 || - m_rockThermalConductivityComponents[1] <= 0 || - m_rockThermalConductivityComponents[2] <= 0, - GEOS_FMT( "{}: the components of the rock thermal conductivity tensor must be strictly positive", - getFullName() ), - InputError ); + GEOS_THROW_CTX_IF( m_rockThermalConductivityComponents[0] <= 0 || + m_rockThermalConductivityComponents[1] <= 0 || + m_rockThermalConductivityComponents[2] <= 0, + GEOS_FMT( "{}: the components of the rock thermal conductivity tensor must be strictly positive", + getFullName() ), + InputError, getDataContext() ); for( integer ip = 0; ip < numFluidPhases(); ++ip ) { - GEOS_THROW_IF( m_phaseThermalConductivity[ip] <= 0, - GEOS_FMT( "{}: the phase thermal conductivity for phase {} must be strictly positive", - getFullName(), ip ), - InputError ); + GEOS_THROW_CTX_IF( m_phaseThermalConductivity[ip] <= 0, + GEOS_FMT( "{}: the phase thermal conductivity for phase {} must be strictly positive", + getFullName(), ip ), + InputError, getDataContext() ); } } diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp index 51a8082165e..c3d94cf44d4 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp @@ -118,12 +118,12 @@ void SinglePhaseThermalConductivity::allocateConstitutiveData( dataRepository::G void SinglePhaseThermalConductivity::postInputInitialization() { - GEOS_THROW_IF( m_defaultThermalConductivityComponents[0] <= 0 || - m_defaultThermalConductivityComponents[1] <= 0 || - m_defaultThermalConductivityComponents[2] <= 0, - GEOS_FMT( "{}: the components of the default thermal conductivity tensor must be strictly positive", - getFullName() ), - InputError ); + GEOS_THROW_CTX_IF( m_defaultThermalConductivityComponents[0] <= 0 || + m_defaultThermalConductivityComponents[1] <= 0 || + m_defaultThermalConductivityComponents[2] <= 0, + GEOS_FMT( "{}: the components of the default thermal conductivity tensor must be strictly positive", + getFullName() ), + InputError, getDataContext() ); } diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp index 24e64dbb615..b5c8196700a 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp @@ -103,27 +103,32 @@ PVTDriver::PVTDriver( const string & name, void PVTDriver::postInputInitialization() { // Validate some inputs - GEOS_ERROR_IF( m_outputMassDensity != 0 && m_outputMassDensity != 1, - getWrapperDataContext( viewKeyStruct::outputMassDensityString() ) << - ": option can be either 0 (false) or 1 (true)" ); - - GEOS_ERROR_IF( m_outputCompressibility != 0 && m_outputCompressibility != 1, - getWrapperDataContext( viewKeyStruct::outputCompressibilityString() ) << - ": option can be either 0 (false) or 1 (true)" ); - - GEOS_ERROR_IF( m_outputPhaseComposition != 0 && m_outputPhaseComposition != 1, - getWrapperDataContext( viewKeyStruct::outputPhaseCompositionString() ) << - ": option can be either 0 (false) or 1 (true)" ); - - GEOS_WARNING_IF( m_precision < minPrecision, - GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", - getWrapperDataContext( viewKeyStruct::precisionString() ), - minPrecision, maxPrecision, minPrecision )); - - GEOS_WARNING_IF( maxPrecision < m_precision, - GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", - getWrapperDataContext( viewKeyStruct::precisionString() ), - minPrecision, maxPrecision, maxPrecision ) ); + GEOS_ERROR_CTX_IF( m_outputMassDensity != 0 && m_outputMassDensity != 1, + getWrapperDataContext( viewKeyStruct::outputMassDensityString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::outputMassDensityString() ) ); + + GEOS_ERROR_CTX_IF( m_outputCompressibility != 0 && m_outputCompressibility != 1, + getWrapperDataContext( viewKeyStruct::outputCompressibilityString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::outputCompressibilityString() ) ); + + GEOS_ERROR_CTX_IF( m_outputPhaseComposition != 0 && m_outputPhaseComposition != 1, + getWrapperDataContext( viewKeyStruct::outputPhaseCompositionString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::outputPhaseCompositionString() ) ); + + GEOS_WARNING_CTX_IF( m_precision < minPrecision, + GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", + getWrapperDataContext( viewKeyStruct::precisionString() ), + minPrecision, maxPrecision, minPrecision ), + getWrapperDataContext( viewKeyStruct::precisionString() )); + + GEOS_WARNING_CTX_IF( maxPrecision < m_precision, + GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", + getWrapperDataContext( viewKeyStruct::precisionString() ), + minPrecision, maxPrecision, maxPrecision ), + getWrapperDataContext( viewKeyStruct::precisionString() ) ); // get number of phases and components diff --git a/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp b/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp index 747e24e3402..272298079ca 100644 --- a/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp @@ -151,13 +151,13 @@ void TriaxialDriver::postInputInitialization() // double check the initial stress value is consistent with any function values that // may overwrite it. - GEOS_THROW_IF( !isEqual( m_initialStress, m_table( 0, SIG0 ), 1e-6 ), - getDataContext() << ": Initial stress values indicated by initialStress and axialFunction(time=0) appear inconsistent", - InputError ); + GEOS_THROW_CTX_IF( !isEqual( m_initialStress, m_table( 0, SIG0 ), 1e-6 ), + getDataContext() << ": Initial stress values indicated by initialStress and axialFunction(time=0) appear inconsistent", + InputError, getDataContext() ); - GEOS_THROW_IF( !isEqual( m_initialStress, m_table( 0, SIG1 ), 1e-6 ), - getDataContext() << ": Initial stress values indicated by initialStress and radialFunction(time=0) appear inconsistent", - InputError ); + GEOS_THROW_CTX_IF( !isEqual( m_initialStress, m_table( 0, SIG1 ), 1e-6 ), + getDataContext() << ": Initial stress values indicated by initialStress and radialFunction(time=0) appear inconsistent", + InputError, getDataContext() ); } diff --git a/src/coreComponents/dataRepository/GeosxState.cpp b/src/coreComponents/dataRepository/GeosxState.cpp index 537491c3818..cd2495cd4d6 100644 --- a/src/coreComponents/dataRepository/GeosxState.cpp +++ b/src/coreComponents/dataRepository/GeosxState.cpp @@ -113,6 +113,7 @@ GeosxState::GeosxState( std::unique_ptr< CommandLineOptions > && commandLineOpti } catch(std::exception const & e) { + errorLogger.write( errorLogger.currentErrorMsg() ); throw; } } @@ -162,6 +163,7 @@ bool GeosxState::initializeDataRepository() } catch(std::exception const & e) { + errorLogger.write( errorLogger.currentErrorMsg() ); throw; } } @@ -188,6 +190,7 @@ void GeosxState::applyInitialConditions() } catch(std::exception const & e) { + errorLogger.write( errorLogger.currentErrorMsg() ); throw; } } @@ -209,6 +212,7 @@ void GeosxState::run() } catch(std::exception const & e) { + errorLogger.write( errorLogger.currentErrorMsg() ); throw; } } diff --git a/src/coreComponents/dataRepository/Group.cpp b/src/coreComponents/dataRepository/Group.cpp index bc245e6c62c..50c0684cd30 100644 --- a/src/coreComponents/dataRepository/Group.cpp +++ b/src/coreComponents/dataRepository/Group.cpp @@ -78,8 +78,9 @@ WrapperBase & Group::registerWrapper( std::unique_ptr< WrapperBase > wrapper ) void Group::deregisterWrapper( string const & name ) { - GEOS_ERROR_IF( !hasWrapper( name ), - "Wrapper " << name << " doesn't exist in Group" << getDataContext() << '.' ); + GEOS_ERROR_CTX_IF( !hasWrapper( name ), + "Wrapper " << name << " doesn't exist in Group" << getDataContext() << '.', + getDataContext() ); m_wrappers.erase( name ); m_conduitNode.remove( name ); } @@ -239,7 +240,7 @@ void Group::processInputFile( xmlWrapper::xmlNode const & targetNode, if( pair.second->processInputFile( targetNode, nodePos ) ) { processedAttributes.insert( pair.first ); - } + } } for( xmlWrapper::xmlAttribute attribute : targetNode.attributes() ) @@ -247,13 +248,13 @@ void Group::processInputFile( xmlWrapper::xmlNode const & targetNode, string const attributeName = attribute.name(); if( !xmlWrapper::isFileMetadataAttribute( attributeName ) ) { - GEOS_THROW_IF( processedAttributes.count( attributeName ) == 0, - GEOS_FMT( "Error in {}: XML Node at '{}' contains unused attribute '{}'.\n" - "Valid attributes are:\n{}\nFor more details, please refer to documentation at:\n" - "http://geosx-geosx.readthedocs-hosted.com/en/latest/docs/sphinx/userGuide/Index.html", - getDataContext(), targetNode.path(), attributeName, - dumpInputOptions() ), - InputError ); + GEOS_THROW_CTX_IF( processedAttributes.count( attributeName ) == 0, + GEOS_FMT( "Error in {}: XML Node at '{}' contains unused attribute '{}'.\n" + "Valid attributes are:\n{}\nFor more details, please refer to documentation at:\n" + "http://geosx-geosx.readthedocs-hosted.com/en/latest/docs/sphinx/userGuide/Index.html", + getDataContext(), targetNode.path(), attributeName, + dumpInputOptions() ), + InputError, getDataContext() ); } } } diff --git a/src/coreComponents/dataRepository/Group.hpp b/src/coreComponents/dataRepository/Group.hpp index 4a49e3d0c28..ed7541f0944 100644 --- a/src/coreComponents/dataRepository/Group.hpp +++ b/src/coreComponents/dataRepository/Group.hpp @@ -309,7 +309,7 @@ class Group /** * @brief Return a reference to a sub-group of the current Group. * @tparam T The type of subgroup. - * @tparam KEY The type of the lookup. + * @tparam KEY The type of the lookup. * @param key The key used to perform the lookup. * @return A reference to @p T that refers to the sub-group. * @throw std::domain_error If the Group does not exist is thrown. @@ -318,16 +318,15 @@ class Group T & getGroup( KEY const & key ) { Group * const child = m_subGroups[ key ]; - GEOS_THROW_CTX_IF( getDataContext(), - child == nullptr, + GEOS_THROW_CTX_IF( child == nullptr, "Group " << getDataContext() << " has no child named " << key << std::endl << dumpSubGroupsNames(), - std::domain_error ); + std::domain_error, getDataContext() ); T * const castedChild = dynamicCast< T * >( child ); - GEOS_THROW_IF( castedChild == nullptr, - GEOS_FMT( "{} was expected to be a '{}'.", - child->getDataContext(), LvArray::system::demangleType< T >() ), - BadTypeError ); + GEOS_THROW_CTX_IF( castedChild == nullptr, + GEOS_FMT( "{} was expected to be a '{}'.", + child->getDataContext(), LvArray::system::demangleType< T >() ), + BadTypeError, child->getDataContext() ); return *castedChild; } @@ -338,15 +337,15 @@ class Group T const & getGroup( KEY const & key ) const { Group const * const child = m_subGroups[ key ]; - GEOS_THROW_IF( child == nullptr, - "Group " << getDataContext() << " has no child named " << key << std::endl - << dumpSubGroupsNames(), - std::domain_error ); + GEOS_THROW_CTX_IF( child == nullptr, + "Group " << getDataContext() << " has no child named " << key << std::endl + << dumpSubGroupsNames(), + std::domain_error, getDataContext() ); T const * const castedChild = dynamicCast< T const * >( child ); - GEOS_THROW_IF( castedChild == nullptr, - GEOS_FMT( "{} was expected to be a '{}'.", - child->getDataContext(), LvArray::system::demangleType< T >() ), - BadTypeError ); + GEOS_THROW_CTX_IF( castedChild == nullptr, + GEOS_FMT( "{} was expected to be a '{}'.", + child->getDataContext(), LvArray::system::demangleType< T >() ), + BadTypeError, child->getDataContext() ); return *castedChild; } @@ -1124,10 +1123,10 @@ class Group WrapperBase const & getWrapperBase( KEY const & key ) const { WrapperBase const * const wrapper = m_wrappers[ key ]; - GEOS_THROW_IF( wrapper == nullptr, - "Group " << getDataContext() << " has no wrapper named " << key << std::endl - << dumpWrappersNames(), - std::domain_error ); + GEOS_THROW_CTX_IF( wrapper == nullptr, + "Group " << getDataContext() << " has no wrapper named " << key << std::endl + << dumpWrappersNames(), + std::domain_error, getDataContext() ); return *wrapper; } @@ -1139,10 +1138,10 @@ class Group WrapperBase & getWrapperBase( KEY const & key ) { WrapperBase * const wrapper = m_wrappers[ key ]; - GEOS_THROW_IF( wrapper == nullptr, - "Group " << getDataContext() << " has no wrapper named " << key << std::endl - << dumpWrappersNames(), - std::domain_error ); + GEOS_THROW_CTX_IF( wrapper == nullptr, + "Group " << getDataContext() << " has no wrapper named " << key << std::endl + << dumpWrappersNames(), + std::domain_error, getDataContext() ); return *wrapper; } @@ -1364,7 +1363,9 @@ class Group */ Group & getParent() { - GEOS_THROW_IF( m_parent == nullptr, "Group at " << getDataContext() << " does not have a parent.", std::domain_error ); + GEOS_THROW_CTX_IF( m_parent == nullptr, + "Group at " << getDataContext() << " does not have a parent.", + std::domain_error, getDataContext() ); return *m_parent; } @@ -1373,7 +1374,9 @@ class Group */ Group const & getParent() const { - GEOS_THROW_IF( m_parent == nullptr, "Group at " << getDataContext() << " does not have a parent.", std::domain_error ); + GEOS_THROW_CTX_IF( m_parent == nullptr, + "Group at " << getDataContext() << " does not have a parent.", + std::domain_error, getDataContext() ); return *m_parent; } diff --git a/src/coreComponents/dataRepository/unitTests/testDataContext.cpp b/src/coreComponents/dataRepository/unitTests/testDataContext.cpp index 4360c76f8be..3ca061ad198 100644 --- a/src/coreComponents/dataRepository/unitTests/testDataContext.cpp +++ b/src/coreComponents/dataRepository/unitTests/testDataContext.cpp @@ -13,26 +13,26 @@ * ------------------------------------------------------------------------------------------------------------ */ -#include "common/logger/ErrorHandling.hpp" -#include "dataRepository/DataContext.hpp" +// #include "common/logger/ErrorHandling.hpp" +// #include "dataRepository/DataContext.hpp" -#include +// #include -using namespace geos; +// using namespace geos; -TEST( DataContext, testCompleteYaml ) -{ - geos::ErrorLogger errorLogger; - int x = 5; - geos::dataRepository::DataFileContext dataContext( "targetName", - "test1_file.xml", - 42 ); - GEOS_THROW_CTX_IF( dataContext, x==5, "Here is the error message", std::runtime_error ); -} +// TEST( DataContext, testCompleteYaml ) +// { +// geos::ErrorLogger errorLogger; +// int x = 5; +// geos::dataRepository::DataFileContext dataContext( "targetName", +// "test1_file.xml", +// 42 ); +// GEOS_THROW_CTX_IF( dataContext, x==5, "Here is the error message", std::runtime_error ); +// } -int main( int ac, char * av[] ) -{ - ::testing::InitGoogleTest( &ac, av ); - int const result = RUN_ALL_TESTS(); - return result; -} +// int main( int ac, char * av[] ) +// { +// ::testing::InitGoogleTest( &ac, av ); +// int const result = RUN_ALL_TESTS(); +// return result; +// } diff --git a/src/coreComponents/events/EventBase.cpp b/src/coreComponents/events/EventBase.cpp index adaeb831467..7a14d8e7203 100644 --- a/src/coreComponents/events/EventBase.cpp +++ b/src/coreComponents/events/EventBase.cpp @@ -153,8 +153,12 @@ void EventBase::getTargetReferences() } catch( std::exception const & e ) { - throw InputError( e, GEOS_FMT( "Error while reading {}:\n", - getWrapperDataContext( viewKeyStruct::eventTargetString() ) ) ); + string const errorMsg = GEOS_FMT( "Error while reading {}:\n", + getWrapperDataContext( viewKeyStruct::eventTargetString() ) ); + errorLogger.currentErrorMsg() + .addToMsg( errorMsg ) + .addContextInfo( getWrapperDataContext( viewKeyStruct::eventTargetString() ).getContextInfo() ); + throw InputError( e, errorMsg ); } } diff --git a/src/coreComponents/events/PeriodicEvent.cpp b/src/coreComponents/events/PeriodicEvent.cpp index e26ea889137..f8e5350ca95 100644 --- a/src/coreComponents/events/PeriodicEvent.cpp +++ b/src/coreComponents/events/PeriodicEvent.cpp @@ -267,22 +267,22 @@ void PeriodicEvent::validate() const return; } - GEOS_THROW_IF( m_timeFrequency > 0 && - target->getTimesteppingBehavior() == ExecutableGroup::TimesteppingBehavior::DeterminesTimeStepSize, - GEOS_FMT( "`{}`: This event targets an object that automatically selects the time " - "step size. Therefore, `{}` cannot be used here. However, forcing a " - "constant time step size can still be achived with `{}`.", - getDataContext(), viewKeyStruct::timeFrequencyString(), - EventBase::viewKeyStruct::forceDtString() ), - InputError ); - GEOS_THROW_IF( m_cycleFrequency != 1 && - target->getTimesteppingBehavior() == ExecutableGroup::TimesteppingBehavior::DeterminesTimeStepSize, - GEOS_FMT( "`{}`: This event targets an object that automatically selects the time " - "step size. Therefore, `{}` cannot be used here. However, forcing a " - "constant time step size can still be achived with `{}`.", - getDataContext(), viewKeyStruct::cycleFrequencyString(), - EventBase::viewKeyStruct::forceDtString() ), - InputError ); + GEOS_THROW_CTX_IF( m_timeFrequency > 0 && + target->getTimesteppingBehavior() == ExecutableGroup::TimesteppingBehavior::DeterminesTimeStepSize, + GEOS_FMT( "`{}`: This event targets an object that automatically selects the time " + "step size. Therefore, `{}` cannot be used here. However, forcing a " + "constant time step size can still be achived with `{}`.", + getDataContext(), viewKeyStruct::timeFrequencyString(), + EventBase::viewKeyStruct::forceDtString() ), + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( m_cycleFrequency != 1 && + target->getTimesteppingBehavior() == ExecutableGroup::TimesteppingBehavior::DeterminesTimeStepSize, + GEOS_FMT( "`{}`: This event targets an object that automatically selects the time " + "step size. Therefore, `{}` cannot be used here. However, forcing a " + "constant time step size can still be achived with `{}`.", + getDataContext(), viewKeyStruct::cycleFrequencyString(), + EventBase::viewKeyStruct::forceDtString() ), + InputError, getDataContext() ); } REGISTER_CATALOG_ENTRY( EventBase, PeriodicEvent, string const &, Group * const ) diff --git a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp index 325be2e2fe7..9d3c28c0855 100644 --- a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp @@ -126,18 +126,18 @@ void AquiferBoundaryCondition::postInputInitialization() else { FunctionManager const & functionManager = FunctionManager::getInstance(); - GEOS_THROW_IF( !functionManager.hasGroup( m_pressureInfluenceFunctionName ), - getCatalogName() << " " << getDataContext() << - ": the pressure influence table " << m_pressureInfluenceFunctionName << " could not be found", - InputError ); + GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_pressureInfluenceFunctionName ), + getCatalogName() << " " << getDataContext() << + ": the pressure influence table " << m_pressureInfluenceFunctionName << " could not be found", + InputError, getDataContext() ); TableFunction const & pressureInfluenceFunction = functionManager.getGroup< TableFunction >( m_pressureInfluenceFunctionName ); - GEOS_THROW_IF( pressureInfluenceFunction.getInterpolationMethod() != TableFunction::InterpolationType::Linear, - getCatalogName() << " " << getDataContext() << - ": The interpolation method for the pressure influence function table " << - pressureInfluenceFunction.getDataContext() << - " should be TableFunction::InterpolationType::Linear", - InputError ); + GEOS_THROW_CTX_IF( pressureInfluenceFunction.getInterpolationMethod() != TableFunction::InterpolationType::Linear, + getCatalogName() << " " << getDataContext() << + ": The interpolation method for the pressure influence function table " << + pressureInfluenceFunction.getDataContext() << + " should be TableFunction::InterpolationType::Linear", + InputError, getDataContext() ); } computeTimeConstant(); diff --git a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp index 296dd53bb67..520c9848a18 100644 --- a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp +++ b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp @@ -93,50 +93,50 @@ EquilibriumInitialCondition::EquilibriumInitialCondition( string const & name, G void EquilibriumInitialCondition::postInputInitialization() { - GEOS_THROW_IF( ( m_temperatureVsElevationTableName.empty() != m_componentFractionVsElevationTableNames.empty() ), - getCatalogName() << " " << getDataContext() << ": both " << - viewKeyStruct::componentFractionVsElevationTableNamesString() << " and " << - viewKeyStruct::temperatureVsElevationTableNameString() << " must be provided for a multiphase simulation", - InputError ); + GEOS_THROW_CTX_IF( ( m_temperatureVsElevationTableName.empty() != m_componentFractionVsElevationTableNames.empty() ), + getCatalogName() << " " << getDataContext() << ": both " << + viewKeyStruct::componentFractionVsElevationTableNamesString() << " and " << + viewKeyStruct::temperatureVsElevationTableNameString() << " must be provided for a multiphase simulation", + InputError, getDataContext() ); FunctionManager const & functionManager = FunctionManager::getInstance(); if( !m_componentFractionVsElevationTableNames.empty() ) { - GEOS_THROW_IF( m_componentFractionVsElevationTableNames.size() <= 1, - getCatalogName() << " " << getDataContext() << - ": at least two component names must be specified in " << viewKeyStruct::componentNamesString(), - InputError ); - GEOS_THROW_IF( m_componentFractionVsElevationTableNames.size() != m_componentNames.size(), - getCatalogName() << " " << getDataContext() << ": mismatch between the size of " << - viewKeyStruct::componentNamesString() << - " and " << viewKeyStruct::componentFractionVsElevationTableNamesString(), - InputError ); - GEOS_THROW_IF( m_componentNames.size() >= 2 && m_initPhaseName.empty(), - getCatalogName() << " " << getDataContext() << ": for now, the keyword: " << - viewKeyStruct::initPhaseNameString() << " must be filled for a multiphase simulation", - InputError ); + GEOS_THROW_CTX_IF( m_componentFractionVsElevationTableNames.size() <= 1, + getCatalogName() << " " << getDataContext() << + ": at least two component names must be specified in " << viewKeyStruct::componentNamesString(), + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( m_componentFractionVsElevationTableNames.size() != m_componentNames.size(), + getCatalogName() << " " << getDataContext() << ": mismatch between the size of " << + viewKeyStruct::componentNamesString() << + " and " << viewKeyStruct::componentFractionVsElevationTableNamesString(), + InputError, getDataContext() ); + GEOS_THROW_CTX_IF( m_componentNames.size() >= 2 && m_initPhaseName.empty(), + getCatalogName() << " " << getDataContext() << ": for now, the keyword: " << + viewKeyStruct::initPhaseNameString() << " must be filled for a multiphase simulation", + InputError, getDataContext() ); array1d< localIndex > tableSizes( m_componentNames.size() ); for( size_t ic = 0; ic < m_componentNames.size(); ++ic ) { - GEOS_THROW_IF( m_componentFractionVsElevationTableNames[ic].empty(), - getCatalogName() << " " << getDataContext() << - ": the component fraction vs elevation table name is missing for component " << ic, - InputError ); + GEOS_THROW_CTX_IF( m_componentFractionVsElevationTableNames[ic].empty(), + getCatalogName() << " " << getDataContext() << + ": the component fraction vs elevation table name is missing for component " << ic, + InputError, getDataContext() ); - GEOS_THROW_IF( !m_componentFractionVsElevationTableNames[ic].empty() && - !functionManager.hasGroup( m_componentFractionVsElevationTableNames[ic] ), - getCatalogName() << " " << getDataContext() << ": the component fraction vs elevation table " << - m_componentFractionVsElevationTableNames[ic] << " could not be found" << " for component " << ic, - InputError ); + GEOS_THROW_CTX_IF( !m_componentFractionVsElevationTableNames[ic].empty() && + !functionManager.hasGroup( m_componentFractionVsElevationTableNames[ic] ), + getCatalogName() << " " << getDataContext() << ": the component fraction vs elevation table " << + m_componentFractionVsElevationTableNames[ic] << " could not be found" << " for component " << ic, + InputError, getDataContext() ); TableFunction const & compFracTable = functionManager.getGroup< TableFunction >( m_componentFractionVsElevationTableNames[ic] ); - GEOS_THROW_IF( compFracTable.getInterpolationMethod() != TableFunction::InterpolationType::Linear, - getCatalogName() << " " << getDataContext() << - ": the interpolation method for the component fraction vs elevation table " << - compFracTable.getName() << " should be TableFunction::InterpolationType::Linear", - InputError ); + GEOS_THROW_CTX_IF( compFracTable.getInterpolationMethod() != TableFunction::InterpolationType::Linear, + getCatalogName() << " " << getDataContext() << + ": the interpolation method for the component fraction vs elevation table " << + compFracTable.getName() << " should be TableFunction::InterpolationType::Linear", + InputError, getDataContext() ); } } @@ -144,17 +144,17 @@ void EquilibriumInitialCondition::postInputInitialization() if( !m_temperatureVsElevationTableName.empty() ) { - GEOS_THROW_IF( !functionManager.hasGroup( m_temperatureVsElevationTableName ), - getCatalogName() << " " << getDataContext() << ": the temperature vs elevation table " << - m_temperatureVsElevationTableName << " could not be found", - InputError ); + GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_temperatureVsElevationTableName ), + getCatalogName() << " " << getDataContext() << ": the temperature vs elevation table " << + m_temperatureVsElevationTableName << " could not be found", + InputError, getDataContext() ); TableFunction const & tempTable = functionManager.getGroup< TableFunction >( m_temperatureVsElevationTableName ); - GEOS_THROW_IF( tempTable.getInterpolationMethod() != TableFunction::InterpolationType::Linear, - getCatalogName() << " " << getDataContext() << - ": The interpolation method for the temperature vs elevation table " << tempTable.getName() << - " should be TableFunction::InterpolationType::Linear", - InputError ); + GEOS_THROW_CTX_IF( tempTable.getInterpolationMethod() != TableFunction::InterpolationType::Linear, + getCatalogName() << " " << getDataContext() << + ": The interpolation method for the temperature vs elevation table " << tempTable.getName() << + " should be TableFunction::InterpolationType::Linear", + InputError, getDataContext() ); } } @@ -171,19 +171,19 @@ void EquilibriumInitialCondition::initializePreSubGroups() { TableFunction const & compFracTable = functionManager.getGroup< TableFunction >( m_componentFractionVsElevationTableNames[ic] ); arrayView1d< real64 const > compFracValues = compFracTable.getValues(); - GEOS_THROW_IF( compFracValues.size() <= 1, - getCatalogName() << " " << getDataContext() << - ": the component fraction vs elevation table " << compFracTable.getName() << - " must contain at least two values", - InputError ); + GEOS_THROW_CTX_IF( compFracValues.size() <= 1, + getCatalogName() << " " << getDataContext() << + ": the component fraction vs elevation table " << compFracTable.getName() << + " must contain at least two values", + InputError, getDataContext() ); tableSizes[ic] = compFracValues.size(); if( ic >= 1 ) { - GEOS_THROW_IF( tableSizes[ic] != tableSizes[ic-1], - getCatalogName() << " " << getDataContext() << - ": all the component fraction vs elevation tables must contain the same number of values", - InputError ); + GEOS_THROW_CTX_IF( tableSizes[ic] != tableSizes[ic-1], + getCatalogName() << " " << getDataContext() << + ": all the component fraction vs elevation tables must contain the same number of values", + InputError, getDataContext() ); } } @@ -202,18 +202,18 @@ void EquilibriumInitialCondition::initializePreSubGroups() if( ic >= 1 ) { - GEOS_THROW_IF( !isZero( elevation[ic][i] - elevation[ic-1][i] ), - getCatalogName() << " " << getDataContext() << - ": the elevation values must be the same in all the component vs elevation tables", - InputError ); + GEOS_THROW_CTX_IF( !isZero( elevation[ic][i] - elevation[ic-1][i] ), + getCatalogName() << " " << getDataContext() << + ": the elevation values must be the same in all the component vs elevation tables", + InputError, getDataContext() ); } if( ic == m_componentNames.size() - 1 ) { - GEOS_THROW_IF( !isZero( sumCompFrac[i] - 1 ), - getCatalogName() << " " << getDataContext() << - ": at a given elevation, the component fraction sum must be equal to one", - InputError ); + GEOS_THROW_CTX_IF( !isZero( sumCompFrac[i] - 1 ), + getCatalogName() << " " << getDataContext() << + ": at a given elevation, the component fraction sum must be equal to one", + InputError, getDataContext() ); } } } diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp b/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp index c1f7213f4a7..3c95a795307 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp @@ -110,6 +110,10 @@ void FieldSpecificationBase::setMeshObjectPath( Group const & meshBodies ) } catch( std::exception const & e ) { + errorLogger.currentErrorMsg() + .addToMsg( getWrapperDataContext( viewKeyStruct::objectPathString() ).toString() + + " is a wrong objectPath: " + m_objectPath + "\n" ) + .addContextInfo( getWrapperDataContext( viewKeyStruct::objectPathString() ).getContextInfo() ); throw InputError( e, getWrapperDataContext( viewKeyStruct::objectPathString() ).toString() + " is a wrong objectPath: " + m_objectPath + "\n" ); } diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp index cdce71bc664..cc870380a07 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp @@ -622,8 +622,12 @@ void FieldSpecificationBase::applyFieldValueKernel( ArrayView< T, N, USD > const } catch( std::exception const & e ) { - throw InputError( e, GEOS_FMT( "Error while reading {}:\n", - getWrapperDataContext( viewKeyStruct::functionNameString() ) ) ); + string const errorMsg = GEOS_FMT( "Error while reading {}:\n", + getWrapperDataContext( viewKeyStruct::functionNameString() ) ); + errorLogger.currentErrorMsg() + .addToMsg( errorMsg ) + .addContextInfo( getWrapperDataContext( viewKeyStruct::functionNameString() ).getContextInfo() ); + throw InputError( e, errorMsg ); } }(); diff --git a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp index c2d7317cec0..a0aadb4d7d9 100644 --- a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp +++ b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp @@ -78,18 +78,18 @@ PerfectlyMatchedLayer::PerfectlyMatchedLayer( string const & name, Group * const void PerfectlyMatchedLayer::postInputInitialization() { - GEOS_THROW_IF( (m_xMax[0]1), - getCatalogName() << " " << getDataContext() << " " - << viewKeyStruct::reflectivityString() - << " must satisfy 0 < reflectivity <= 1", - InputError ); + GEOS_THROW_CTX_IF( (m_xMax[0]1), + getCatalogName() << " " << getDataContext() << " " + << viewKeyStruct::reflectivityString() + << " must satisfy 0 < reflectivity <= 1", + InputError, getDataContext() ); GEOS_LOG_RANK_0_IF( (m_xMin[0]( getDirection() ) < 1e-20, - getDataContext() << ": " << viewKeyStruct::directionString() << " is required for " << - viewKeyStruct::tractionTypeString() << " = " << TractionType::vector << - ", but appears to be unspecified" ); + GEOS_ERROR_CTX_IF( LvArray::tensorOps::l2Norm< 3 >( getDirection() ) < 1e-20, + getDataContext() << ": " << viewKeyStruct::directionString() << " is required for " << + viewKeyStruct::tractionTypeString() << " = " << TractionType::vector << + ", but appears to be unspecified", + getDataContext() ); } else { @@ -97,9 +98,10 @@ void TractionBoundaryCondition::postInputInitialization() viewKeyStruct::tractionTypeString() << " != " << TractionType::stress << ", so value of " << viewKeyStruct::inputStressString() << " is unused." ); - GEOS_ERROR_IF( !inputStressRead && m_tractionType == TractionType::stress, - getDataContext() << ": " << viewKeyStruct::tractionTypeString() << " = " << TractionType::stress << - ", but " << viewKeyStruct::inputStressString() << " is not specified." ); + GEOS_ERROR_CTX_IF( !inputStressRead && m_tractionType == TractionType::stress, + getDataContext() << ": " << viewKeyStruct::tractionTypeString() << " = " << TractionType::stress << + ", but " << viewKeyStruct::inputStressString() << " is not specified.", + getDataContext() ); // localIndex const numStressFunctionsNames = m_stressFunctionNames.size(); diff --git a/src/coreComponents/fileIO/Outputs/SiloOutput.cpp b/src/coreComponents/fileIO/Outputs/SiloOutput.cpp index 2aad8229279..aacafa37e24 100644 --- a/src/coreComponents/fileIO/Outputs/SiloOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/SiloOutput.cpp @@ -105,11 +105,11 @@ void SiloOutput::postInputInitialization() string const fieldNamesString = viewKeysStruct::fieldNames; string const onlyPlotSpecifiedFieldNamesString = viewKeysStruct::onlyPlotSpecifiedFieldNames; - GEOS_THROW_IF( ( m_onlyPlotSpecifiedFieldNames != 0 ) && m_fieldNames.empty(), - GEOS_FMT( "{} `{}`: the flag `{}` is different from zero, but `{}` is empty, which is inconsistent", - catalogName(), getDataContext(), - onlyPlotSpecifiedFieldNamesString, fieldNamesString ), - InputError ); + GEOS_THROW_CTX_IF( ( m_onlyPlotSpecifiedFieldNames != 0 ) && m_fieldNames.empty(), + GEOS_FMT( "{} `{}`: the flag `{}` is different from zero, but `{}` is empty, which is inconsistent", + catalogName(), getDataContext(), + onlyPlotSpecifiedFieldNamesString, fieldNamesString ), + InputError, getDataContext() ); GEOS_LOG_RANK_0_IF( !m_fieldNames.empty() && ( m_onlyPlotSpecifiedFieldNames != 0 ), GEOS_FMT( diff --git a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp index d6f1c267f5a..5c44cafd6a2 100644 --- a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp @@ -158,8 +158,12 @@ void TimeHistoryOutput::initializePostInitialConditionsPostSubGroups() } catch( std::exception const & e ) { - throw InputError( e, GEOS_FMT( "Error while reading {}:\n", - getWrapperDataContext( viewKeys::timeHistoryOutputTargetString() ) ) ); + string const errorMsg = GEOS_FMT( "Error while reading {}:\n", + getWrapperDataContext( viewKeys::timeHistoryOutputTargetString() ) ); + errorLogger.currentErrorMsg() + .addToMsg( errorMsg ) + .addContextInfo( getWrapperDataContext( viewKeys::timeHistoryOutputTargetString() ).getContextInfo() ); + throw InputError( e, errorMsg ); } } } diff --git a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp index 4a58402ddf6..02dcd6c6d97 100644 --- a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp @@ -133,11 +133,11 @@ void VTKOutput::postInputInitialization() string const fieldNamesString = viewKeysStruct::fieldNames; string const onlyPlotSpecifiedFieldNamesString = viewKeysStruct::onlyPlotSpecifiedFieldNames; - GEOS_THROW_IF( ( m_onlyPlotSpecifiedFieldNames != 0 ) && m_fieldNames.empty(), - GEOS_FMT( "{} `{}`: the flag `{}` is different from zero, but `{}` is empty, which is inconsistent", - catalogName(), getDataContext(), - onlyPlotSpecifiedFieldNamesString, fieldNamesString ), - InputError ); + GEOS_THROW_CTX_IF( ( m_onlyPlotSpecifiedFieldNames != 0 ) && m_fieldNames.empty(), + GEOS_FMT( "{} `{}`: the flag `{}` is different from zero, but `{}` is empty, which is inconsistent", + catalogName(), getDataContext(), + onlyPlotSpecifiedFieldNamesString, fieldNamesString ), + InputError, getDataContext() ); GEOS_LOG_RANK_0_IF( !m_fieldNames.empty() && ( m_onlyPlotSpecifiedFieldNames != 0 ), GEOS_FMT( @@ -151,8 +151,10 @@ void VTKOutput::postInputInitialization() catalogName(), getDataContext(), std::to_string( m_fieldNames.size() ), fieldNamesString, m_plotLevel ) ); - GEOS_ERROR_IF( m_writeFaceElementsAs3D, GEOS_FMT( "{} `{}`: 3D vtk plot of faceElements is not yet supported.", - catalogName(), getDataContext() ) ); + GEOS_ERROR_CTX_IF( m_writeFaceElementsAs3D, + GEOS_FMT( "{} `{}`: 3D vtk plot of faceElements is not yet supported.", + catalogName(), getDataContext() ), + getDataContext() ); } diff --git a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp index 450f491635b..32959db87c7 100644 --- a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp +++ b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp @@ -200,6 +200,9 @@ dataRepository::Group const * HistoryCollectionBase::getTargetObject( DomainPart } catch( std::exception const & e ) { + errorLogger.currentErrorMsg() + .addToMsg( getDataContext().toString() + " has a wrong objectPath: " + objectPath + "\n" ) + .addContextInfo( getDataContext().getContextInfo() ); throw InputError( e, getDataContext().toString() + " has a wrong objectPath: " + objectPath + "\n" ); } } diff --git a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp index 1ac6fc21e81..17e73c2161b 100644 --- a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp +++ b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp @@ -153,6 +153,10 @@ void PackCollection::updateSetsIndices( DomainPartition const & domain ) } catch( std::exception const & e ) { + errorLogger.currentErrorMsg() + .addToMsg( getWrapperDataContext( viewKeysStruct::fieldNameString() ).toString() + + ": Target not found !\n" ) + .addContextInfo( getWrapperDataContext( viewKeysStruct::fieldNameString() ).getContextInfo() ); throw InputError( e, getWrapperDataContext( viewKeysStruct::fieldNameString() ).toString() + ": Target not found !\n" ); } diff --git a/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp b/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp index e809e456021..8bc025bcfb4 100644 --- a/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp +++ b/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp @@ -62,8 +62,9 @@ FiniteElementDiscretization::~FiniteElementDiscretization() void FiniteElementDiscretization::postInputInitialization() { - GEOS_ERROR_IF( m_useVem < 0 || m_useVem > 1, - getDataContext() << ": The flag useVirtualElements can be either 0 or 1" ); + GEOS_ERROR_CTX_IF( m_useVem < 0 || m_useVem > 1, + getDataContext() << ": The flag useVirtualElements can be either 0 or 1", + getDataContext() ); } std::unique_ptr< FiniteElementBase > @@ -200,9 +201,10 @@ FiniteElementDiscretization::factory( ElementType const parentElementShape ) con { #if !defined( GEOS_USE_HIP ) case ElementType::Hexahedron: - GEOS_ERROR_IF( m_formulation != Formulation::SEM, - getDataContext() << ": Element type Hexahedron with order 2 available" << - " only when using the Spectral Element Method" ); + GEOS_ERROR_CTX_IF( m_formulation != Formulation::SEM, + getDataContext() << ": Element type Hexahedron with order 2 available" << + " only when using the Spectral Element Method", + getDataContext() ); return std::make_unique< Q2_Hexahedron_Lagrange_GaussLobatto >(); #else GEOS_ERROR( "Cannot compile this with HIP active." ); @@ -222,9 +224,10 @@ FiniteElementDiscretization::factory( ElementType const parentElementShape ) con { #if !defined( GEOS_USE_HIP ) case ElementType::Hexahedron: - GEOS_ERROR_IF( m_formulation != Formulation::SEM, - getDataContext() << ": Element type Hexahedron with order 3 available" << - " only when using the Spectral Element Method" ); + GEOS_ERROR_CTX_IF( m_formulation != Formulation::SEM, + getDataContext() << ": Element type Hexahedron with order 3 available" << + " only when using the Spectral Element Method", + getDataContext() ); return std::make_unique< Q3_Hexahedron_Lagrange_GaussLobatto >(); #else GEOS_ERROR( "Cannot compile this with HIP active." ); @@ -244,9 +247,10 @@ FiniteElementDiscretization::factory( ElementType const parentElementShape ) con { #if !defined( GEOS_USE_HIP ) case ElementType::Hexahedron: - GEOS_ERROR_IF( m_formulation != Formulation::SEM, - getDataContext() << ": Element type Hexahedron with order 4 available only" << - " when using the Spectral Element Method" ); + GEOS_ERROR_CTX_IF( m_formulation != Formulation::SEM, + getDataContext() << ": Element type Hexahedron with order 4 available only" << + " when using the Spectral Element Method", + getDataContext() ); return std::make_unique< Q4_Hexahedron_Lagrange_GaussLobatto >(); #else GEOS_ERROR( "Cannot compile this with HIP active." ); @@ -266,9 +270,10 @@ FiniteElementDiscretization::factory( ElementType const parentElementShape ) con { #if !defined( GEOS_USE_HIP ) case ElementType::Hexahedron: - GEOS_ERROR_IF( m_formulation != Formulation::SEM, - getDataContext() << ": Element type Hexahedron with order 5 available only" << - " when using the Spectral Element Method" ); + GEOS_ERROR_CTX_IF( m_formulation != Formulation::SEM, + getDataContext() << ": Element type Hexahedron with order 5 available only" << + " when using the Spectral Element Method", + getDataContext() ); return std::make_unique< Q5_Hexahedron_Lagrange_GaussLobatto >(); #else GEOS_ERROR( "Cannot compile this with HIP active." ); diff --git a/src/coreComponents/functions/MultivariableTableFunction.cpp b/src/coreComponents/functions/MultivariableTableFunction.cpp index 4f8db1244bb..cfc271b23df 100644 --- a/src/coreComponents/functions/MultivariableTableFunction.cpp +++ b/src/coreComponents/functions/MultivariableTableFunction.cpp @@ -35,7 +35,8 @@ MultivariableTableFunction::MultivariableTableFunction( const string & name, void MultivariableTableFunction::initializeFunctionFromFile( string const & filename ) { std::ifstream file( filename.c_str() ); - GEOS_THROW_IF( !file, catalogName() << " " << getDataContext() << ": could not read input file " << filename, InputError ); + GEOS_THROW_CTX_IF( !file, catalogName() << " " << getDataContext() << ": could not read input file " << filename, + InputError, getDataContext() ); integer numDims, numOps; globalIndex numPointsTotal = 1; @@ -67,12 +68,15 @@ void MultivariableTableFunction::initializeFunctionFromFile( string const & file for( integer i = 0; i < numDims; i++ ) { file >> axisPoints[i]; - GEOS_THROW_IF( !file, catalogName() << " " << getDataContext() << ": can`t read the number of points for axis " + std::to_string( i ), InputError ); + GEOS_THROW_CTX_IF( !file, catalogName() << " " << getDataContext() << ": can`t read the number of points for axis " + std::to_string( i ), + InputError, getDataContext() ); GEOS_THROW_IF_LE_MSG( axisPoints[i], 1, catalogName() << " " << getDataContext() << ": minimum 2 discretization point per axis are expected", InputError ); file >> axisMinimums[i]; - GEOS_THROW_IF( !file, catalogName() << " " << getDataContext() << ": can`t read minimum value for axis " + std::to_string( i ), InputError ); + GEOS_THROW_CTX_IF( !file, catalogName() << " " << getDataContext() << ": can`t read minimum value for axis " + std::to_string( i ), + InputError, getDataContext() ); file >> axisMaximums[i]; - GEOS_THROW_IF( !file, catalogName() << " " << getDataContext() << ": can`t read maximum value for axis " + std::to_string( i ), InputError ); + GEOS_THROW_CTX_IF( !file, catalogName() << " " << getDataContext() << ": can`t read maximum value for axis " + std::to_string( i ), + InputError, getDataContext() ); GEOS_THROW_IF_LT_MSG( axisMaximums[i], axisMinimums[i], catalogName() << " " << getDataContext() << ": maximum axis value is expected to be larger than minimum", InputError ); numPointsTotal *= axisPoints[i]; @@ -95,13 +99,15 @@ void MultivariableTableFunction::initializeFunctionFromFile( string const & file for( auto j = 0; j < numOps; j++ ) { file >> m_pointData[i * numOps + j]; - GEOS_THROW_IF( !file, catalogName() << " " << getDataContext() << ": table file is shorter than expected", InputError ); + GEOS_THROW_CTX_IF( !file, catalogName() << " " << getDataContext() << ": table file is shorter than expected", + InputError, getDataContext() ); } } real64 value; file >> value; - GEOS_THROW_IF( file, catalogName() << " " << getDataContext() << ": table file is longer than expected", InputError ); + GEOS_THROW_CTX_IF( file, catalogName() << " " << getDataContext() << ": table file is longer than expected", + InputError, getDataContext() ); file.close(); diff --git a/src/coreComponents/functions/TableFunction.cpp b/src/coreComponents/functions/TableFunction.cpp index 2e6de49c5e8..3a921722215 100644 --- a/src/coreComponents/functions/TableFunction.cpp +++ b/src/coreComponents/functions/TableFunction.cpp @@ -100,10 +100,10 @@ void TableFunction::setTableCoordinates( array1d< real64_array > const & coordin { for( localIndex j = 1; j < coordinates[i].size(); ++j ) { - GEOS_THROW_IF( coordinates[i][j] - coordinates[i][j-1] <= 0, - GEOS_FMT( "{} {}: coordinates must be strictly increasing, but axis {} is not", - catalogName(), getDataContext(), i ), - InputError ); + GEOS_THROW_CTX_IF( coordinates[i][j] - coordinates[i][j-1] <= 0, + GEOS_FMT( "{} {}: coordinates must be strictly increasing, but axis {} is not", + catalogName(), getDataContext(), i ), + InputError, getDataContext() ); } m_coordinates.appendArray( coordinates[i].begin(), coordinates[i].end() ); } @@ -162,10 +162,10 @@ void TableFunction::reInitializeFunction() increment *= m_coordinates.sizeOfArray( ii ); for( localIndex j = 1; j < m_coordinates[ii].size(); ++j ) { - GEOS_THROW_IF( m_coordinates[ii][j] - m_coordinates[ii][j-1] <= 0, - GEOS_FMT( "{} {}: coordinates must be strictly increasing, but axis {} is not", - catalogName(), getDataContext(), ii ), - InputError ); + GEOS_THROW_CTX_IF( m_coordinates[ii][j] - m_coordinates[ii][j-1] <= 0, + GEOS_FMT( "{} {}: coordinates must be strictly increasing, but axis {} is not", + catalogName(), getDataContext(), ii ), + InputError, getDataContext() ); } } if( m_coordinates.size() > 0 && !m_values.empty() ) // coordinates and values have been set @@ -185,8 +185,7 @@ void TableFunction::checkCoord( real64 const coord, localIndex const dim ) const GEOS_THROW_CTX_IF( dim >= m_coordinates.size() || dim < 0, GEOS_FMT( "{}: The {} dimension ( no. {} ) doesn't exist in the table.", getDataContext(), units::getDescription( getDimUnit( dim ) ), dim ), - SimulationError, - getDataContext() ); + SimulationError, getDataContext() ); real64 const lowerBound = m_coordinates[dim][0]; real64 const upperBound = m_coordinates[dim][m_coordinates.sizeOfArray( dim ) - 1]; GEOS_THROW_CTX_IF( coord > upperBound || coord < lowerBound, @@ -195,8 +194,7 @@ void TableFunction::checkCoord( real64 const coord, localIndex const dim ) const units::formatValue( coord, getDimUnit( dim ) ), units::formatValue( lowerBound, getDimUnit( dim ) ), units::formatValue( upperBound, getDimUnit( dim ) ) ), - SimulationError, - getDataContext() ); + SimulationError, getDataContext() ); } TableFunction::KernelWrapper TableFunction::createKernelWrapper() const diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index 196aee4304a..098598b5e44 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -478,6 +478,7 @@ void ProblemManager::parseInputFile() } catch( std::exception const & e ) { + errorLogger.write( errorLogger.currentErrorMsg() ); throw e; } } @@ -564,8 +565,10 @@ void ProblemManager::parseXMLDocumentImpl( xmlWrapper::xmlDocument & xmlDocument } catch( InputError const & e ) { - throw InputError( e, GEOS_FMT( "Error while parsing region {} ({}):\n", - regionName, regionNodePos.toString() ) ); + string const errorMsg = GEOS_FMT( "Error while parsing region {} ({}):\n", + regionName, regionNodePos.toString() ); + errorLogger.currentErrorMsg().addToMsg( errorMsg ); + throw InputError( e, errorMsg ); } } }; diff --git a/src/coreComponents/mesh/CellElementRegion.cpp b/src/coreComponents/mesh/CellElementRegion.cpp index 4207cdefdca..c94e4fa757d 100644 --- a/src/coreComponents/mesh/CellElementRegion.cpp +++ b/src/coreComponents/mesh/CellElementRegion.cpp @@ -55,18 +55,18 @@ CellElementRegion::~CellElementRegion() void CellElementRegion::generateMesh( Group const & cellBlocks ) { - GEOS_THROW_IF( m_cellBlockNames.empty(), - GEOS_FMT( "{}: No cellBlock selected in this region.", - getDataContext() ), - InputError ); + GEOS_THROW_CTX_IF( m_cellBlockNames.empty(), + GEOS_FMT( "{}: No cellBlock selected in this region.", + getDataContext() ), + InputError, getDataContext() ); Group & subRegions = this->getGroup( viewKeyStruct::elementSubRegions() ); for( string const & cbName : m_cellBlockNames ) { CellBlockABC const * cellBlock = cellBlocks.getGroupPointer< CellBlockABC >( cbName ); - GEOS_THROW_IF( cellBlock == nullptr, - GEOS_FMT( "{}: No cellBlock named '{}' found.\nAvailable cellBlock list: {{ {} }}\nNo CellElementRegionSelector has been used to verify the cellBlock selection.", - getDataContext(), cbName, stringutilities::join( m_cellBlockNames, ", " ) ), - InputError ); + GEOS_THROW_CTX_IF( cellBlock == nullptr, + GEOS_FMT( "{}: No cellBlock named '{}' found.\nAvailable cellBlock list: {{ {} }}\nNo CellElementRegionSelector has been used to verify the cellBlock selection.", + getDataContext(), cbName, stringutilities::join( m_cellBlockNames, ", " ) ), + InputError, getDataContext() ); // subRegion name must be the same as the cell-block (so we can match them and reference them in errors). CellElementSubRegion & subRegion = subRegions.registerGroup< CellElementSubRegion >( cbName ); diff --git a/src/coreComponents/mesh/CellElementRegionSelector.cpp b/src/coreComponents/mesh/CellElementRegionSelector.cpp index f6106a88a2e..423a6f1cc63 100644 --- a/src/coreComponents/mesh/CellElementRegionSelector.cpp +++ b/src/coreComponents/mesh/CellElementRegionSelector.cpp @@ -62,16 +62,16 @@ CellElementRegionSelector::getMatchingCellblocks( CellElementRegion const & regi } } - GEOS_THROW_IF( !matching, - GEOS_FMT( "{}: No cellBlock name is satisfying the qualifier '{}'.\n" - "Available cellBlock list: {{ {} }}\nAvailable region attribute list: {{ {} }}", - region.getWrapperDataContext( ViewKeys::sourceCellBlockNamesString() ), - matchPattern, - stringutilities::joinLambda( m_regionAttributesOwners, ", ", - []( auto pair ) { return pair->first; } ), - stringutilities::joinLambda( m_cellBlocksOwners, ", ", - []( auto pair ) { return pair->first; } ) ), - InputError ); + GEOS_THROW_CTX_IF( !matching, + GEOS_FMT( "{}: No cellBlock name is satisfying the qualifier '{}'.\n" + "Available cellBlock list: {{ {} }}\nAvailable region attribute list: {{ {} }}", + region.getWrapperDataContext( ViewKeys::sourceCellBlockNamesString() ), + matchPattern, + stringutilities::joinLambda( m_regionAttributesOwners, ", ", + []( auto pair ) { return pair->first; } ), + stringutilities::joinLambda( m_cellBlocksOwners, ", ", + []( auto pair ) { return pair->first; } ) ), + InputError, region.getWrapperDataContext( ViewKeys::sourceCellBlockNamesString() ) ); return matchedCellBlocks; } @@ -82,13 +82,13 @@ CellElementRegionSelector::verifyRequestedCellBlocks( CellElementRegion const & for( string const & requestedCellBlockName : cellBlockNames ) { // if cell block does not exist in the mesh - GEOS_THROW_IF( m_cellBlocksOwners.count( requestedCellBlockName ) == 0, - GEOS_FMT( "{}: No cellBlock named '{}'.\nAvailable cellBlock list: {{ {} }}", - region.getWrapperDataContext( ViewKeys::sourceCellBlockNamesString() ), - requestedCellBlockName, - stringutilities::joinLambda( m_cellBlocksOwners, ", ", - []( auto pair ) { return pair->first; } ) ), - InputError ); + GEOS_THROW_CTX_IF( m_cellBlocksOwners.count( requestedCellBlockName ) == 0, + GEOS_FMT( "{}: No cellBlock named '{}'.\nAvailable cellBlock list: {{ {} }}", + region.getWrapperDataContext( ViewKeys::sourceCellBlockNamesString() ), + requestedCellBlockName, + stringutilities::joinLambda( m_cellBlocksOwners, ", ", + []( auto pair ) { return pair->first; } ) ), + InputError, region.getWrapperDataContext( ViewKeys::sourceCellBlockNamesString() ) ); } } diff --git a/src/coreComponents/mesh/ElementRegionManager.cpp b/src/coreComponents/mesh/ElementRegionManager.cpp index 2652103216e..d8d75b76b17 100644 --- a/src/coreComponents/mesh/ElementRegionManager.cpp +++ b/src/coreComponents/mesh/ElementRegionManager.cpp @@ -82,8 +82,9 @@ auto const & getUserAvailableKeys() Group * ElementRegionManager::createChild( string const & childKey, string const & childName ) { GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); - GEOS_ERROR_IF( getUserAvailableKeys().count( childKey ) == 0, - CatalogInterface::unknownTypeError( childKey, getDataContext(), getUserAvailableKeys() ) ); + GEOS_ERROR_CTX_IF( getUserAvailableKeys().count( childKey ) == 0, + CatalogInterface::unknownTypeError( childKey, getDataContext(), getUserAvailableKeys() ), + getDataContext() ); Group & elementRegions = this->getGroup( ElementRegionManager::groupKeyStruct::elementRegionsGroup() ); return &elementRegions.registerGroup( childName, CatalogInterface::factory( childKey, getDataContext(), @@ -218,9 +219,10 @@ void ElementRegionManager::generateWells( CellBlockManagerABC const & cellBlockM globalIndex const numWellElemsGlobal = MpiWrapper::sum( subRegion.size() ); - GEOS_ERROR_IF( numWellElemsGlobal != lineBlock.numElements(), - "Invalid partitioning in well " << lineBlock.getDataContext() << - ", subregion " << subRegion.getDataContext() ); + GEOS_ERROR_CTX_IF( numWellElemsGlobal != lineBlock.numElements(), + "Invalid partitioning in well " << lineBlock.getDataContext() << + ", subregion " << subRegion.getDataContext(), + getDataContext() ); } ); @@ -653,7 +655,7 @@ ElementRegionManager::unpackFaceElementToFace( buffer_unit_type const * & buffer string subRegionName; unpackedSize += bufferOps::Unpack( buffer, subRegionName ); GEOS_ERROR_IF( subRegionName != subRegion.getName(), - "Unpacked subregion name (" << subRegionName << ") does not equal object name (" << subRegion.getName() << ")" ); + "Unpacked subregion name (" << subRegionName << ") does not equal object name (" << subRegion.getName() << ")" ); localIndex_array & elemList = packList[kReg][kSubReg]; unpackedSize += subRegion.unpackToFaceRelation( buffer, elemList, false, overwriteMap ); @@ -779,12 +781,14 @@ ElementRegionManager::getCellBlockToSubRegionMap( CellBlockManagerABC const & ce { GEOS_UNUSED_VAR( region ); // unused if geos_error_if is nulld localIndex const blockIndex = cellBlocks.getIndex( subRegion.getName() ); - GEOS_ERROR_IF( blockIndex == Group::subGroupMap::KeyIndex::invalid_index, - GEOS_FMT( "{}, subregion {}: Cell block not found at index {}.", - region.getDataContext().toString(), subRegion.getName(), blockIndex ) ); - GEOS_ERROR_IF( blockMap( blockIndex, 1 ) != -1, - GEOS_FMT( "{}, subregion {}: Cell block at index {} is mapped to more than one subregion.", - region.getDataContext().toString(), subRegion.getName(), blockIndex ) ); + GEOS_ERROR_CTX_IF( blockIndex == Group::subGroupMap::KeyIndex::invalid_index, + GEOS_FMT( "{}, subregion {}: Cell block not found at index {}.", + region.getDataContext().toString(), subRegion.getName(), blockIndex ), + region.getDataContext() ); + GEOS_ERROR_CTX_IF( blockMap( blockIndex, 1 ) != -1, + GEOS_FMT( "{}, subregion {}: Cell block at index {} is mapped to more than one subregion.", + region.getDataContext().toString(), subRegion.getName(), blockIndex ), + region.getDataContext() ); blockMap( blockIndex, 0 ) = er; blockMap( blockIndex, 1 ) = esr; diff --git a/src/coreComponents/mesh/ElementRegionManager.hpp b/src/coreComponents/mesh/ElementRegionManager.hpp index 0b5b8633029..2aec9197413 100644 --- a/src/coreComponents/mesh/ElementRegionManager.hpp +++ b/src/coreComponents/mesh/ElementRegionManager.hpp @@ -1486,10 +1486,11 @@ ElementRegionManager::constructMaterialViewAccessor( string const & viewName, } else { - GEOS_ERROR_IF( !allowMissingViews, - subRegion.getDataContext() << - ": Material " << constitutiveRelation.getDataContext() << - " does not contain " << viewName ); + GEOS_ERROR_CTX_IF( !allowMissingViews, + subRegion.getDataContext() << + ": Material " << constitutiveRelation.getDataContext() << + " does not contain " << viewName, + subRegion.getDataContext() ); } } ); } @@ -1536,8 +1537,9 @@ ElementRegionManager::constructMaterialViewAccessor( string const & viewName, } else { - GEOS_ERROR_IF( !allowMissingViews, region.getDataContext() << ": Material " << materialName - << " does not contain " << viewName ); + GEOS_ERROR_CTX_IF( !allowMissingViews, region.getDataContext() << ": Material " << materialName + << " does not contain " << viewName, + subRegion.getDataContext() ); } } ); } diff --git a/src/coreComponents/mesh/FaceManager.cpp b/src/coreComponents/mesh/FaceManager.cpp index 044cd1beb47..d75e67c613c 100644 --- a/src/coreComponents/mesh/FaceManager.cpp +++ b/src/coreComponents/mesh/FaceManager.cpp @@ -298,6 +298,9 @@ void FaceManager::sortAllFaceNodes( NodeManager const & nodeManager, sortFaceNodes( X, elemCenter[er][esr][ei], facesToNodes[faceIndex] ); } catch( std::runtime_error const & e ) { + errorLogger.currentErrorMsg() + .addToMsg( getDataContext().toString() + ": " + e.what() ) + .addContextInfo( getDataContext().getContextInfo() ); throw std::runtime_error( getDataContext().toString() + ": " + e.what() ); } } ); diff --git a/src/coreComponents/mesh/MeshObjectPath.cpp b/src/coreComponents/mesh/MeshObjectPath.cpp index 31481e53b72..8fc952fab46 100644 --- a/src/coreComponents/mesh/MeshObjectPath.cpp +++ b/src/coreComponents/mesh/MeshObjectPath.cpp @@ -211,9 +211,9 @@ void processTokenRecursive( dataRepository::Group const & parentGroup, namesInRepository.emplace_back( group.getName() ); } ); - GEOS_THROW_IF( namesInRepository.empty(), - GEOS_FMT( "{0} has no children.", parentGroup.getDataContext().toString()), - InputError ); + GEOS_THROW_CTX_IF( namesInRepository.empty(), + GEOS_FMT( "{0} has no children.", parentGroup.getDataContext().toString()), + InputError, parentGroup.getDataContext() ); for( string const & inputEntry : stringutilities::tokenize( pathToken, " " ) ) { @@ -232,13 +232,13 @@ void processTokenRecursive( dataRepository::Group const & parentGroup, } } - GEOS_THROW_IF( !foundMatch, - GEOS_FMT( "{0} has no child named {1}.\n" - "{0} has the following children: {{ {2} }}", - parentGroup.getDataContext().toString(), - inputEntry, - stringutilities::join( namesInRepository, ", " ) ), - InputError ); + GEOS_THROW_CTX_IF( !foundMatch, + GEOS_FMT( "{0} has no child named {1}.\n" + "{0} has the following children: {{ {2} }}", + parentGroup.getDataContext().toString(), + inputEntry, + stringutilities::join( namesInRepository, ", " ) ), + InputError, parentGroup.getDataContext() ); } } diff --git a/src/coreComponents/mesh/Perforation.cpp b/src/coreComponents/mesh/Perforation.cpp index 77c5ea57a81..80e3fb03a6e 100644 --- a/src/coreComponents/mesh/Perforation.cpp +++ b/src/coreComponents/mesh/Perforation.cpp @@ -56,9 +56,10 @@ Perforation::Perforation( string const & name, Group * const parent ) void Perforation::postInputInitialization() { - GEOS_ERROR_IF( m_distanceFromHead <= 0, - getWrapperDataContext( viewKeyStruct::distanceFromHeadString() ) << - ": distance from well head to perforation cannot be negative." ); + GEOS_ERROR_CTX_IF( m_distanceFromHead <= 0, + getWrapperDataContext( viewKeyStruct::distanceFromHeadString() ) << + ": distance from well head to perforation cannot be negative.", + getWrapperDataContext( viewKeyStruct::distanceFromHeadString() ) ); } diff --git a/src/coreComponents/mesh/SurfaceElementRegion.hpp b/src/coreComponents/mesh/SurfaceElementRegion.hpp index f15de2d63f6..d768c6e80e0 100644 --- a/src/coreComponents/mesh/SurfaceElementRegion.hpp +++ b/src/coreComponents/mesh/SurfaceElementRegion.hpp @@ -201,9 +201,10 @@ class SurfaceElementRegion : public ElementRegionBase { subRegionNames.push_back( sr.getName() ); } ); - GEOS_ERROR_IF( subRegionNames.size() != 1, - "Surface region \"" << getDataContext() << - "\" should have one unique sub region (" << subRegionNames.size() << " found)." ); + GEOS_ERROR_CTX_IF( subRegionNames.size() != 1, + "Surface region \"" << getDataContext() << + "\" should have one unique sub region (" << subRegionNames.size() << " found).", + getDataContext() ); return subRegionNames.front(); } diff --git a/src/coreComponents/mesh/WellElementSubRegion.cpp b/src/coreComponents/mesh/WellElementSubRegion.cpp index 7a8611ed94b..052bba78ccb 100644 --- a/src/coreComponents/mesh/WellElementSubRegion.cpp +++ b/src/coreComponents/mesh/WellElementSubRegion.cpp @@ -425,9 +425,9 @@ void WellElementSubRegion::generate( MeshLevel & mesh, // this is enforced in the LineBlockABC that currently merges two perforations // if they belong to the same well element. This is a temporary solution. // TODO: split the well elements that contain multiple perforations, so that no element is shared - GEOS_THROW_IF( sharedElems.size() > 0, - "Well " << lineBlock.getDataContext() << " contains shared well elements", - InputError ); + GEOS_THROW_CTX_IF( sharedElems.size() > 0, + "Well " << lineBlock.getDataContext() << " contains shared well elements", + InputError, lineBlock.getDataContext() ); // In Steps 1 and 2 we determine the local objects on this rank (elems and nodes) // Once this is done, in Steps 3, 4, and 5, we update the nodeManager and wellElementSubRegion (size, maps) @@ -576,12 +576,12 @@ void WellElementSubRegion::checkPartitioningValidity( LineBlockABC const & lineB globalIndex const numBranches = prevElemIdsGlobal[iwelemGlobal].size(); globalIndex const prevGlobal = prevElemIdsGlobal[iwelemGlobal][numBranches-1]; - GEOS_THROW_IF( prevGlobal <= iwelemGlobal || prevGlobal < 0, - "The structure of well " << lineBlock.getDataContext() << " is invalid. " << - " The main reason for this error is that there may be no perforation" << - " in the bottom well element of the well, which is required to have" << - " a well-posed problem.", - InputError ); + GEOS_THROW_CTX_IF( prevGlobal <= iwelemGlobal || prevGlobal < 0, + "The structure of well " << lineBlock.getDataContext() << " is invalid. " << + " The main reason for this error is that there may be no perforation" << + " in the bottom well element of the well, which is required to have" << + " a well-posed problem.", + InputError, lineBlock.getDataContext() ); if( elemStatusGlobal[prevGlobal] == WellElemStatus::LOCAL ) { diff --git a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp index 910e9b38087..61ee3712d72 100644 --- a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp @@ -79,10 +79,10 @@ void ExternalMeshGeneratorBase::postInputInitialization() std::set< string > const tmp{ v.begin(), v.end() }; bool const hasDuplicates = tmp.size() != LvArray::integerConversion< std::size_t >( v.size() ); - GEOS_THROW_IF( hasDuplicates, - getWrapperDataContext( key ) << ": '" << stringutilities::join( v, ", " ) << - "' already present in list of fields to import.", - InputError ); + GEOS_THROW_CTX_IF( hasDuplicates, + getWrapperDataContext( key ) << ": '" << stringutilities::join( v, ", " ) << + "' already present in list of fields to import.", + InputError, getWrapperDataContext( key ) ); }; checkDuplicates( m_volumicFieldsInGEOS, viewKeyStruct::volumicFieldsInGEOSString() ); checkDuplicates( m_surfacicFieldsInGEOS, viewKeyStruct::surfacicFieldsInGEOSString() ); diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp index e151c0edbfd..cefd664009f 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp @@ -182,6 +182,10 @@ void InternalMeshGenerator::postInputInitialization() } catch( InputError const & e ) { WrapperBase const & wrapper = getWrapperBase( viewKeyStruct::elementTypesString() ); + errorLogger.currentErrorMsg() + .addToMsg( "InternalMesh " + wrapper.getDataContext().toString() + + ", element index = " + std::to_string( i ) + ": " ) + .addContextInfo( wrapper.getDataContext().getContextInfo() ); throw InputError( e, "InternalMesh " + wrapper.getDataContext().toString() + ", element index = " + std::to_string( i ) + ": " ); } diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp index cc977d5f9d9..6c29620d346 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp @@ -346,11 +346,14 @@ class InternalMeshGenerator : public MeshGeneratorBase // Verify that the bias is non-zero and applied to more than one block: if( ( !isZero( m_nElemBias[i][block] ) ) && (m_nElems[i][block]>1)) { - GEOS_ERROR_IF( fabs( m_nElemBias[i][block] ) >= 1, - getWrapperDataContext( i == 0 ? viewKeyStruct::xBiasString() : - i == 1 ? viewKeyStruct::yBiasString() : - viewKeyStruct::zBiasString() ) << - ", block index = " << block << " : Mesh bias must between -1 and 1!" ); + GEOS_ERROR_CTX_IF( fabs( m_nElemBias[i][block] ) >= 1, + getWrapperDataContext( i == 0 ? viewKeyStruct::xBiasString() : + i == 1 ? viewKeyStruct::yBiasString() : + viewKeyStruct::zBiasString() ) << + ", block index = " << block << " : Mesh bias must between -1 and 1!", + getWrapperDataContext( i == 0 ? viewKeyStruct::xBiasString() : + i == 1 ? viewKeyStruct::yBiasString() : + viewKeyStruct::zBiasString() ) ); real64 len = max - min; real64 xmean = len / m_nElems[i][block]; diff --git a/src/coreComponents/mesh/generators/InternalWellGenerator.cpp b/src/coreComponents/mesh/generators/InternalWellGenerator.cpp index 88a36aebeff..25384552ceb 100644 --- a/src/coreComponents/mesh/generators/InternalWellGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalWellGenerator.cpp @@ -40,20 +40,20 @@ InternalWellGenerator::InternalWellGenerator( string const & name, Group * const void InternalWellGenerator::postInputInitialization() { - GEOS_THROW_IF( m_polyNodeCoords.size( 1 ) != m_nDims, - "InternalWell " << getWrapperDataContext( viewKeyStruct::polylineNodeCoordsString() ) << - ": Invalid number of physical coordinates.", - InputError ); + GEOS_THROW_CTX_IF( m_polyNodeCoords.size( 1 ) != m_nDims, + "InternalWell " << getWrapperDataContext( viewKeyStruct::polylineNodeCoordsString() ) << + ": Invalid number of physical coordinates.", + InputError, getWrapperDataContext( viewKeyStruct::polylineNodeCoordsString() ) ); - GEOS_THROW_IF( m_segmentToPolyNodeMap.size( 1 ) != 2, - "InternalWell " << getWrapperDataContext( viewKeyStruct::polylineSegmentConnString() ) << - ": Invalid size.", - InputError ); + GEOS_THROW_CTX_IF( m_segmentToPolyNodeMap.size( 1 ) != 2, + "InternalWell " << getWrapperDataContext( viewKeyStruct::polylineSegmentConnString() ) << + ": Invalid size.", + InputError, getWrapperDataContext( viewKeyStruct::polylineSegmentConnString() ) ); - GEOS_THROW_IF( m_polyNodeCoords.size( 0 )-1 != m_segmentToPolyNodeMap.size( 0 ), - "Incompatible sizes of " << getWrapperDataContext( viewKeyStruct::polylineNodeCoordsString() ) << - " and " << getWrapperDataContext( viewKeyStruct::polylineSegmentConnString() ), - InputError ); + GEOS_THROW_CTX_IF( m_polyNodeCoords.size( 0 )-1 != m_segmentToPolyNodeMap.size( 0 ), + "Incompatible sizes of " << getWrapperDataContext( viewKeyStruct::polylineNodeCoordsString() ) << + " and " << getWrapperDataContext( viewKeyStruct::polylineSegmentConnString() ), + InputError, getWrapperDataContext( viewKeyStruct::polylineSegmentConnString() ) ); // TODO: add more checks here // TODO: check that the connectivity of the well is valid diff --git a/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp b/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp index 008ff4f91f3..d7e07faa902 100644 --- a/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp @@ -115,20 +115,23 @@ InternalWellboreGenerator::InternalWellboreGenerator( string const & name, void InternalWellboreGenerator::postInputInitialization() { - GEOS_ERROR_IF( m_nElems[1].size() > 1, - getWrapperDataContext( viewKeyStruct::yElemsString() ) << - ": Only one block in the theta direction is currently supported. " ); + GEOS_ERROR_CTX_IF( m_nElems[1].size() > 1, + getWrapperDataContext( viewKeyStruct::yElemsString() ) << + ": Only one block in the theta direction is currently supported. ", + getWrapperDataContext( viewKeyStruct::yElemsString() ) ); - GEOS_ERROR_IF( m_nElems[2].size() > 1, - getWrapperDataContext( viewKeyStruct::yElemsString() ) << - ": Only one block in the z direction is currently supported. " ); + GEOS_ERROR_CTX_IF( m_nElems[2].size() > 1, + getWrapperDataContext( viewKeyStruct::yElemsString() ) << + ": Only one block in the z direction is currently supported. ", + getWrapperDataContext( viewKeyStruct::yElemsString() ) ); - GEOS_ERROR_IF( m_trajectory.size( 0 ) != 2 || m_trajectory.size( 1 ) != 3, - getWrapperDataContext( viewKeyStruct::trajectoryString() ) << - ": Input for trajectory should be specified in the form of " - "{ { xbottom, ybottom, zbottom }, { xtop, ytop, ztop } }." ); + GEOS_ERROR_CTX_IF( m_trajectory.size( 0 ) != 2 || m_trajectory.size( 1 ) != 3, + getWrapperDataContext( viewKeyStruct::trajectoryString() ) << + ": Input for trajectory should be specified in the form of " + "{ { xbottom, ybottom, zbottom }, { xtop, ytop, ztop } }.", + getWrapperDataContext( viewKeyStruct::trajectoryString() ) ); // Project trajectory to bottom and top of the wellbore real64 trajectoryVector[3] = {0}; diff --git a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp index 42b8f0ba26d..10c3fb00a67 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp @@ -96,10 +96,11 @@ void VTKMeshGenerator::postInputInitialization() { ExternalMeshGeneratorBase::postInputInitialization(); - GEOS_ERROR_IF( !this->m_filePath.empty() && !m_dataSourceName.empty(), - getDataContext() << ": Access to the mesh via file or data source are mutually exclusive. " - "You can't set " << viewKeyStruct::dataSourceString() << " or " << viewKeyStruct::meshPathString() << " and " << - ExternalMeshGeneratorBase::viewKeyStruct::filePathString() ); + GEOS_ERROR_CTX_IF( !this->m_filePath.empty() && !m_dataSourceName.empty(), + getDataContext() << ": Access to the mesh via file or data source are mutually exclusive. " + "You can't set " << viewKeyStruct::dataSourceString() << " or " << viewKeyStruct::meshPathString() << " and " << + ExternalMeshGeneratorBase::viewKeyStruct::filePathString(), + getDataContext() ); if( !m_dataSourceName.empty()) { @@ -107,9 +108,9 @@ void VTKMeshGenerator::postInputInitialization() m_dataSource = externalDataManager.getGroupPointer< VTKHierarchicalDataSource >( m_dataSourceName ); - GEOS_THROW_IF( m_dataSource == nullptr, - getDataContext() << ": VTK Data Object Source not found: " << m_dataSourceName, - InputError ); + GEOS_THROW_CTX_IF( m_dataSource == nullptr, + getDataContext() << ": VTK Data Object Source not found: " << m_dataSourceName, + InputError, getDataContext() ); m_dataSource->open(); } diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp index a2569c4006c..e03c091fb49 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp @@ -80,8 +80,9 @@ Group * WellGeneratorBase::createChild( string const & childKey, string const & { GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); const auto childTypes = { viewKeyStruct::perforationString() }; - GEOS_ERROR_IF( childKey != viewKeyStruct::perforationString(), - CatalogInterface::unknownTypeError( childKey, getDataContext(), childTypes ) ); + GEOS_ERROR_CTX_IF( childKey != viewKeyStruct::perforationString(), + CatalogInterface::unknownTypeError( childKey, getDataContext(), childTypes ), + getDataContext() ); ++m_numPerforations; m_perforationList.emplace_back( childName ); diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp b/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp index c8ff70834c9..f20cf692f36 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp @@ -79,9 +79,10 @@ void Box::postInputInitialization() m_strikeAngle += 90; // Counterclockwise from x-axis if( std::fabs( m_strikeAngle ) > 1e-20 ) { - GEOS_ERROR_IF( (m_max[0]-m_min[0]) < (m_max[1]-m_min[1]), - getDataContext() << ": When a strike angle is specified, the box is supposed to" << - " represent a plane normal to the y direction. This box seems to be too thick." ); + GEOS_ERROR_CTX_IF( (m_max[0]-m_min[0]) < (m_max[1]-m_min[1]), + getDataContext() << ": When a strike angle is specified, the box is supposed to" << + " represent a plane normal to the y direction. This box seems to be too thick.", + getDataContext() ); m_cosStrike = std::cos( m_strikeAngle / 180 *M_PI ); m_sinStrike = std::sin( m_strikeAngle / 180 *M_PI ); diff --git a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp index d69092b79cc..3e6ef49ec1c 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp @@ -50,12 +50,14 @@ ThickPlane::~ThickPlane() void ThickPlane::postInputInitialization() { m_thickness *= 0.5; // actually store the half-thickness - GEOS_ERROR_IF( m_thickness <= 0, - getDataContext() << ": The plane appears to have zero or negative thickness" ); + GEOS_ERROR_CTX_IF( m_thickness <= 0, + getDataContext() << ": The plane appears to have zero or negative thickness", + getDataContext() ); LvArray::tensorOps::normalize< 3 >( m_normal ); - GEOS_ERROR_IF( std::fabs( LvArray::tensorOps::l2Norm< 3 >( m_normal ) - 1.0 ) > 1e-15, - getDataContext() << ": Could not properly normalize input normal." ); + GEOS_ERROR_CTX_IF( std::fabs( LvArray::tensorOps::l2Norm< 3 >( m_normal ) - 1.0 ) > 1e-15, + getDataContext() << ": Could not properly normalize input normal.", + getDataContext() ); } diff --git a/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp b/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp index c67eed1c217..1cb79a4c5e3 100644 --- a/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp +++ b/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp @@ -86,11 +86,11 @@ class FieldStatisticsBase : public TaskBase Group & physicsSolverManager = problemManager.getGroup( "Solvers" ); m_solver = physicsSolverManager.getGroupPointer< SOLVER >( m_solverName ); - GEOS_THROW_IF( m_solver == nullptr, - GEOS_FMT( "{}: Could not find solver '{}' of type {}", - getDataContext(), - m_solverName, LvArray::system::demangleType< SOLVER >() ), - InputError ); + GEOS_THROW_CTX_IF( m_solver == nullptr, + GEOS_FMT( "{}: Could not find solver '{}' of type {}", + getDataContext(), + m_solverName, LvArray::system::demangleType< SOLVER >() ), + InputError, getDataContext() ); // create dir for output if( m_writeCSV > 0 ) diff --git a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp index f5a17593011..274ecced6d2 100644 --- a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp @@ -226,24 +226,30 @@ void LinearSolverParametersInput::postInputInitialization() static const std::set< integer > binaryOptions = { 0, 1 }; - GEOS_ERROR_IF( binaryOptions.count( m_parameters.stopIfError ) == 0, - getWrapperDataContext( viewKeyStruct::stopIfErrorString() ) << - ": option can be either 0 (false) or 1 (true)" ); - GEOS_ERROR_IF( binaryOptions.count( m_parameters.direct.checkResidual ) == 0, - getWrapperDataContext( viewKeyStruct::directCheckResidualString() ) << - ": option can be either 0 (false) or 1 (true)" ); - GEOS_ERROR_IF( binaryOptions.count( m_parameters.direct.equilibrate ) == 0, - getWrapperDataContext( viewKeyStruct::directEquilString() ) << - ": option can be either 0 (false) or 1 (true)" ); - GEOS_ERROR_IF( binaryOptions.count( m_parameters.direct.replaceTinyPivot ) == 0, - getWrapperDataContext( viewKeyStruct::directReplTinyPivotString() ) << - ": option can be either 0 (false) or 1 (true)" ); - GEOS_ERROR_IF( binaryOptions.count( m_parameters.direct.iterativeRefine ) == 0, - getWrapperDataContext( viewKeyStruct::directIterRefString() ) << - ": option can be either 0 (false) or 1 (true)" ); - GEOS_ERROR_IF( binaryOptions.count( m_parameters.direct.parallel ) == 0, - getWrapperDataContext( viewKeyStruct::directParallelString() ) << - ": option can be either 0 (false) or 1 (true)" ); + GEOS_ERROR_CTX_IF( binaryOptions.count( m_parameters.stopIfError ) == 0, + getWrapperDataContext( viewKeyStruct::stopIfErrorString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::stopIfErrorString() ) ); + GEOS_ERROR_CTX_IF( binaryOptions.count( m_parameters.direct.checkResidual ) == 0, + getWrapperDataContext( viewKeyStruct::directCheckResidualString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::directCheckResidualString() ) ); + GEOS_ERROR_CTX_IF( binaryOptions.count( m_parameters.direct.equilibrate ) == 0, + getWrapperDataContext( viewKeyStruct::directEquilString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::directEquilString() ) ); + GEOS_ERROR_CTX_IF( binaryOptions.count( m_parameters.direct.replaceTinyPivot ) == 0, + getWrapperDataContext( viewKeyStruct::directReplTinyPivotString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::directReplTinyPivotString() ) ); + GEOS_ERROR_CTX_IF( binaryOptions.count( m_parameters.direct.iterativeRefine ) == 0, + getWrapperDataContext( viewKeyStruct::directIterRefString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::directIterRefString() ) ); + GEOS_ERROR_CTX_IF( binaryOptions.count( m_parameters.direct.parallel ) == 0, + getWrapperDataContext( viewKeyStruct::directParallelString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::directParallelString() ) ); GEOS_ERROR_IF_LT_MSG( m_parameters.krylov.maxIterations, 0, getWrapperDataContext( viewKeyStruct::krylovMaxIterString() ) << diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp b/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp index 7382416688b..6b29ebc702e 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp @@ -130,9 +130,10 @@ void PhysicsSolverBase::generateMeshTargetsFromTargetRegions( Group const & mesh if( targetTokens.size()==1 ) // no MeshBody or MeshLevel specified { - GEOS_ERROR_IF( meshBodies.numSubGroups() != 1, - getDataContext() << ": No MeshBody information is specified in" << - " PhysicsSolverBase::meshTargets, but there are multiple MeshBody objects" ); + GEOS_ERROR_CTX_IF( meshBodies.numSubGroups() != 1, + getDataContext() << ": No MeshBody information is specified in" << + " PhysicsSolverBase::meshTargets, but there are multiple MeshBody objects", + getDataContext() ); MeshBody const & meshBody = meshBodies.getGroup< MeshBody >( 0 ); string const meshBodyName = meshBody.getName(); @@ -145,9 +146,10 @@ void PhysicsSolverBase::generateMeshTargetsFromTargetRegions( Group const & mesh else if( targetTokens.size()==2 ) { string const meshBodyName = targetTokens[0]; - GEOS_ERROR_IF( !meshBodies.hasGroup( meshBodyName ), - getWrapperDataContext( viewKeyStruct::targetRegionsString() ) << ": MeshBody (" << - meshBodyName << ") is specified in targetRegions, but does not exist." ); + GEOS_ERROR_CTX_IF( !meshBodies.hasGroup( meshBodyName ), + getWrapperDataContext( viewKeyStruct::targetRegionsString() ) << ": MeshBody (" << + meshBodyName << ") is specified in targetRegions, but does not exist.", + getWrapperDataContext( viewKeyStruct::targetRegionsString() ) ); string const meshLevelName = m_discretizationName; @@ -203,9 +205,10 @@ PhysicsSolverBase::CatalogInterface::CatalogType & PhysicsSolverBase::getCatalog localIndex PhysicsSolverBase::targetRegionIndex( string const & regionName ) const { auto const pos = std::find( m_targetRegionNames.begin(), m_targetRegionNames.end(), regionName ); - GEOS_ERROR_IF( pos == m_targetRegionNames.end(), - GEOS_FMT( "{}: Region {} is not a target of the solver.", - getDataContext(), regionName ) ); + GEOS_ERROR_CTX_IF( pos == m_targetRegionNames.end(), + GEOS_FMT( "{}: Region {} is not a target of the solver.", + getDataContext(), regionName ), + getDataContext() ); return std::distance( m_targetRegionNames.begin(), pos ); } @@ -323,8 +326,10 @@ bool PhysicsSolverBase::execute( real64 const time_n, } } - GEOS_ERROR_IF( dtRemaining > 0.0, getDataContext() << ": Maximum allowed number of sub-steps" - " reached. Consider increasing maxSubSteps." ); + GEOS_ERROR_CTX_IF( dtRemaining > 0.0, + getDataContext() << ": Maximum allowed number of sub-steps" + " reached. Consider increasing maxSubSteps.", + getDataContext() ); // Decide what to do with the next Dt for the event running the solver. m_nextDt = setNextDt( time_n + dt, nextDt, domain ); @@ -1329,11 +1334,15 @@ void PhysicsSolverBase::solveLinearSystem( DofManager const & dofManager, if( params.stopIfError ) { - GEOS_ERROR_IF( m_linearSolverResult.breakdown(), getDataContext() << ": Linear solution breakdown -> simulation STOP" ); + GEOS_ERROR_CTX_IF( m_linearSolverResult.breakdown(), + getDataContext() << ": Linear solution breakdown -> simulation STOP", + getDataContext() ); } else { - GEOS_WARNING_IF( !m_linearSolverResult.success(), getDataContext() << ": Linear solution failed" ); + GEOS_WARNING_CTX_IF( !m_linearSolverResult.success(), + getDataContext() << ": Linear solution failed", + getDataContext() ); } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 067fcab7a2c..81cdf74712a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -374,10 +374,10 @@ void CompositionalMultiphaseBase::registerDataOnMesh( Group & meshBodies ) string & capPresName = subRegion.getReference< string >( viewKeyStruct::capPressureNamesString() ); capPresName = getConstitutiveName< CapillaryPressureBase >( subRegion ); - GEOS_THROW_IF( capPresName.empty(), - GEOS_FMT( "{}: Capillary pressure model not found on subregion {}", - getDataContext(), subRegion.getDataContext() ), - InputError ); + GEOS_THROW_CTX_IF( capPresName.empty(), + GEOS_FMT( "{}: Capillary pressure model not found on subregion {}", + getDataContext(), subRegion.getDataContext() ), + InputError, getDataContext(), subRegion.getDataContext() ); } if( m_hasDiffusion ) @@ -497,10 +497,10 @@ void CompositionalMultiphaseBase::setConstitutiveNames( ElementSubRegionBase & s { string & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); fluidName = getConstitutiveName< MultiFluidBase >( subRegion ); - GEOS_THROW_IF( fluidName.empty(), - GEOS_FMT( "{}: multiphase fluid model not found on subregion {}", - getDataContext(), subRegion.getDataContext() ), - InputError ); + GEOS_THROW_CTX_IF( fluidName.empty(), + GEOS_FMT( "{}: multiphase fluid model not found on subregion {}", + getDataContext(), subRegion.getDataContext() ), + InputError, getDataContext(), subRegion.getDataContext() ); string & relPermName = subRegion.registerWrapper< string >( viewKeyStruct::relPermNamesString() ). setPlotLevel( PlotLevel::NOPLOT ). @@ -511,10 +511,10 @@ void CompositionalMultiphaseBase::setConstitutiveNames( ElementSubRegionBase & s relPermName = getConstitutiveName< RelativePermeabilityBase >( subRegion ); - GEOS_THROW_IF( relPermName.empty(), - GEOS_FMT( "{}: Relative permeability model not found on subregion {}", - getDataContext(), subRegion.getDataContext() ), - InputError ); + GEOS_THROW_CTX_IF( relPermName.empty(), + GEOS_FMT( "{}: Relative permeability model not found on subregion {}", + getDataContext(), subRegion.getDataContext() ), + InputError, getDataContext(), subRegion.getDataContext() ); if( m_isThermal ) { @@ -526,10 +526,10 @@ void CompositionalMultiphaseBase::setConstitutiveNames( ElementSubRegionBase & s reference(); thermalConductivityName = getConstitutiveName< MultiPhaseThermalConductivityBase >( subRegion ); - GEOS_THROW_IF( thermalConductivityName.empty(), - GEOS_FMT( "{}: Thermal conductivity model not found on subregion {}", - getDataContext(), subRegion.getDataContext() ), - InputError ); + GEOS_THROW_CTX_IF( thermalConductivityName.empty(), + GEOS_FMT( "{}: Thermal conductivity model not found on subregion {}", + getDataContext(), subRegion.getDataContext() ), + InputError, getDataContext(), subRegion.getDataContext() ); } } @@ -659,14 +659,14 @@ void CompositionalMultiphaseBase::validateConstitutiveModels( DomainPartition co compareMulticomponentModels( fluid, referenceFluid ); bool const isFluidModelThermal = fluid.isThermal(); - GEOS_THROW_IF( m_isThermal && !isFluidModelThermal, - GEOS_FMT( "CompositionalMultiphaseBase {}: the thermal option is enabled in the solver, but the fluid model {} is incompatible with the thermal option", - getDataContext(), fluid.getDataContext() ), - InputError ); - GEOS_THROW_IF( !m_isThermal && isFluidModelThermal, - GEOS_FMT( "CompositionalMultiphaseBase {}: the thermal option is enabled in fluid model {}, but the solver options are incompatible with the thermal option", - getDataContext(), fluid.getDataContext() ), - InputError ); + GEOS_THROW_CTX_IF( m_isThermal && !isFluidModelThermal, + GEOS_FMT( "CompositionalMultiphaseBase {}: the thermal option is enabled in the solver, but the fluid model {} is incompatible with the thermal option", + getDataContext(), fluid.getDataContext() ), + InputError, getDataContext(), fluid.getDataContext() ); + GEOS_THROW_CTX_IF( !m_isThermal && isFluidModelThermal, + GEOS_FMT( "CompositionalMultiphaseBase {}: the thermal option is enabled in fluid model {}, but the solver options are incompatible with the thermal option", + getDataContext(), fluid.getDataContext() ), + InputError, getDataContext(), fluid.getDataContext() ); string const & relpermName = subRegion.getReference< string >( viewKeyStruct::relPermNamesString() ); RelativePermeabilityBase const & relPerm = getConstitutiveModel< RelativePermeabilityBase >( subRegion, relpermName ); @@ -1123,15 +1123,15 @@ void CompositionalMultiphaseBase::computeHydrostaticEquilibrium( DomainPartition equilCounter++; // check that the gravity vector is aligned with the z-axis - GEOS_THROW_IF( !isZero( gravVector[0] ) || !isZero( gravVector[1] ), - getCatalogName() << " " << getDataContext() << - ": the gravity vector specified in this simulation (" << gravVector[0] << " " << gravVector[1] << " " << gravVector[2] << - ") is not aligned with the z-axis. \n" - "This is incompatible with the " << bc.getCatalogName() << " " << bc.getDataContext() << - "used in this simulation. To proceed, you can either: \n" << - " - Use a gravityVector aligned with the z-axis, such as (0.0,0.0,-9.81)\n" << - " - Remove the hydrostatic equilibrium initial condition from the XML file", - InputError ); + GEOS_THROW_CTX_IF( !isZero( gravVector[0] ) || !isZero( gravVector[1] ), + getCatalogName() << " " << getDataContext() << + ": the gravity vector specified in this simulation (" << gravVector[0] << " " << gravVector[1] << " " << gravVector[2] << + ") is not aligned with the z-axis. \n" + "This is incompatible with the " << bc.getCatalogName() << " " << bc.getDataContext() << + "used in this simulation. To proceed, you can either: \n" << + " - Use a gravityVector aligned with the z-axis, such as (0.0,0.0,-9.81)\n" << + " - Remove the hydrostatic equilibrium initial condition from the XML file", + InputError, getDataContext(), bc.getDataContext() ); } ); @@ -1231,25 +1231,25 @@ void CompositionalMultiphaseBase::computeHydrostaticEquilibrium( DomainPartition MultiFluidBase & fluid = getConstitutiveModel< MultiFluidBase >( subRegion, fluidName ); string_array const & componentNames = fs.getComponentNames(); - GEOS_THROW_IF( fluid.componentNames().size() != componentNames.size(), - "Mismatch in number of components between constitutive model " - << fluid.getDataContext() << " and the Equilibrium initial condition " << fs.getDataContext(), - InputError ); + GEOS_THROW_CTX_IF( fluid.componentNames().size() != componentNames.size(), + "Mismatch in number of components between constitutive model " + << fluid.getDataContext() << " and the Equilibrium initial condition " << fs.getDataContext(), + InputError, fluid.getDataContext(), fs.getDataContext() ); for( integer ic = 0; ic < fluid.numFluidComponents(); ++ic ) { - GEOS_THROW_IF( fluid.componentNames()[ic] != componentNames[ic], - "Mismatch in component names between constitutive model " - << fluid.getDataContext() << " and the Equilibrium initial condition " << fs.getDataContext(), - InputError ); + GEOS_THROW_CTX_IF( fluid.componentNames()[ic] != componentNames[ic], + "Mismatch in component names between constitutive model " + << fluid.getDataContext() << " and the Equilibrium initial condition " << fs.getDataContext(), + InputError, fluid.getDataContext(), fs.getDataContext() ); } // Note: for now, we assume that the reservoir is in a single-phase state at initialization string_array const & phaseNames = fluid.phaseNames(); auto const itPhaseNames = std::find( std::begin( phaseNames ), std::end( phaseNames ), initPhaseName ); - GEOS_THROW_IF( itPhaseNames == std::end( phaseNames ), - getCatalogName() << " " << getDataContext() << ": phase name " << - initPhaseName << " not found in the phases of " << fluid.getDataContext(), - InputError ); + GEOS_THROW_CTX_IF( itPhaseNames == std::end( phaseNames ), + getCatalogName() << " " << getDataContext() << ": phase name " << + initPhaseName << " not found in the phases of " << fluid.getDataContext(), + InputError, getDataContext(), fluid.getDataContext() ); integer const ipInit = std::distance( std::begin( phaseNames ), itPhaseNames ); // Step 3.4: compute the hydrostatic pressure values @@ -1280,12 +1280,12 @@ void CompositionalMultiphaseBase::computeHydrostaticEquilibrium( DomainPartition elevationValues.toNestedView(), pressureValues.toView() ); - GEOS_THROW_IF( returnValue == isothermalCompositionalMultiphaseBaseKernels::HydrostaticPressureKernel::ReturnType::FAILED_TO_CONVERGE, - getCatalogName() << " " << getDataContext() << - ": hydrostatic pressure initialization failed to converge in region " << region.getName() << "! \n" << - "Try to loosen the equilibration tolerance, or increase the number of equilibration iterations. \n" << - "If nothing works, something may be wrong in the fluid model, see ", - std::runtime_error ); + GEOS_THROW_CTX_IF( returnValue == isothermalCompositionalMultiphaseBaseKernels::HydrostaticPressureKernel::ReturnType::FAILED_TO_CONVERGE, + getCatalogName() << " " << getDataContext() << + ": hydrostatic pressure initialization failed to converge in region " << region.getName() << "! \n" << + "Try to loosen the equilibration tolerance, or increase the number of equilibration iterations. \n" << + "If nothing works, something may be wrong in the fluid model, see ", + std::runtime_error, getDataContext() ); GEOS_LOG_RANK_0_IF( returnValue == isothermalCompositionalMultiphaseBaseKernels::HydrostaticPressureKernel::ReturnType::DETECTED_MULTIPHASE_FLOW, getCatalogName() << " " << getDataContext() << @@ -1343,9 +1343,10 @@ void CompositionalMultiphaseBase::computeHydrostaticEquilibrium( DomainPartition } } ); - GEOS_ERROR_IF( minPressure.get() < 0.0, - GEOS_FMT( "{}: A negative pressure of {} Pa was found during hydrostatic initialization in region/subRegion {}/{}", - getDataContext(), minPressure.get(), region.getName(), subRegion.getName() ) ); + GEOS_ERROR_CTX_IF( minPressure.get() < 0.0, + GEOS_FMT( "{}: A negative pressure of {} Pa was found during hydrostatic initialization in region/subRegion {}/{}", + getDataContext(), minPressure.get(), region.getName(), subRegion.getName() ), + getDataContext() ); } ); } ); } @@ -1912,7 +1913,9 @@ void CompositionalMultiphaseBase::applyDirichletBC( real64 const time_n, if( m_nonlinearSolverParameters.m_numNewtonIterations == 0 ) { bool const bcConsistent = validateDirichletBC( domain, time_n + dt ); - GEOS_ERROR_IF( !bcConsistent, GEOS_FMT( "CompositionalMultiphaseBase {}: inconsistent boundary conditions", getDataContext() ) ); + GEOS_ERROR_CTX_IF( !bcConsistent, + GEOS_FMT( "CompositionalMultiphaseBase {}: inconsistent boundary conditions", getDataContext() ), + getDataContext() ); } FieldSpecificationManager & fsManager = FieldSpecificationManager::getInstance(); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index b5387d3e040..455fe7111e9 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -211,8 +211,8 @@ void CompositionalMultiphaseFVM::initializePreSubGroups() FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); FluxApproximationBase const & fluxApprox = fvManager.getFluxApproximation( m_discretizationName ); GEOS_ERROR_IF( fluxApprox.upwindingParams().upwindingScheme == UpwindingScheme::HU2PH && m_numPhases != 2, - GEOS_FMT( "{}: upwinding scheme {} only supports 2-phase flow", - getName(), EnumStrings< UpwindingScheme >::toString( UpwindingScheme::HU2PH ))); + GEOS_FMT( "{}: upwinding scheme {} only supports 2-phase flow", + getName(), EnumStrings< UpwindingScheme >::toString( UpwindingScheme::HU2PH ))); } void CompositionalMultiphaseFVM::setupDofs( DomainPartition const & domain, @@ -1264,7 +1264,9 @@ void CompositionalMultiphaseFVM::applyFaceDirichletBC( real64 const time_n, if( m_nonlinearSolverParameters.m_numNewtonIterations == 0 ) { bool const bcConsistent = validateFaceDirichletBC( domain, time_n + dt ); - GEOS_ERROR_IF( !bcConsistent, GEOS_FMT( "{}: inconsistent boundary conditions", getDataContext() ) ); + GEOS_ERROR_CTX_IF( !bcConsistent, + GEOS_FMT( "{}: inconsistent boundary conditions", getDataContext() ), + getDataContext() ); } using namespace isothermalCompositionalMultiphaseFVMKernels; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp index 477215a14a7..3fc718b1e17 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp @@ -89,15 +89,15 @@ void CompositionalMultiphaseHybridFVM::initializePreSubGroups() NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager(); FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); - GEOS_THROW_IF( !fvManager.hasGroup< HybridMimeticDiscretization >( m_discretizationName ), - getCatalogName() << " " << getDataContext() << - ": the HybridMimeticDiscretization must be selected with CompositionalMultiphaseHybridFVM", - InputError ); - - GEOS_THROW_IF( m_hasCapPressure, - getCatalogName() << " " << getDataContext() << - ": capillary pressure is not yet supported by CompositionalMultiphaseHybridFVM", - InputError ); + GEOS_THROW_CTX_IF( !fvManager.hasGroup< HybridMimeticDiscretization >( m_discretizationName ), + getCatalogName() << " " << getDataContext() << + ": the HybridMimeticDiscretization must be selected with CompositionalMultiphaseHybridFVM", + InputError, getDataContext() ); + + GEOS_THROW_CTX_IF( m_hasCapPressure, + getCatalogName() << " " << getDataContext() << + ": capillary pressure is not yet supported by CompositionalMultiphaseHybridFVM", + InputError, getDataContext() ); } void CompositionalMultiphaseHybridFVM::initializePostInitialConditionsPreSubGroups() @@ -147,10 +147,10 @@ void CompositionalMultiphaseHybridFVM::initializePostInitialConditionsPreSubGrou minVal.min( transMultiplier[iface] ); } ); - GEOS_THROW_IF( minVal.get() <= 0.0, - getCatalogName() << " " << getDataContext() << - ": the transmissibility multipliers used in SinglePhaseHybridFVM must strictly larger than 0.0", - std::runtime_error ); + GEOS_THROW_CTX_IF( minVal.get() <= 0.0, + getCatalogName() << " " << getDataContext() << + ": the transmissibility multipliers used in SinglePhaseHybridFVM must strictly larger than 0.0", + std::runtime_error, getDataContext() ); FieldSpecificationManager & fsManager = FieldSpecificationManager::getInstance(); fsManager.forSubGroups< AquiferBoundaryCondition >( [&] ( AquiferBoundaryCondition const & bc ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index c8b825d8ef6..57d9b2d5cc4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -323,8 +323,10 @@ void FlowSolverBase::setConstitutiveNamesCallSuper( ElementSubRegionBase & subRe string & solidName = subRegion.getReference< string >( viewKeyStruct::solidNamesString() ); solidName = getConstitutiveName< CoupledSolidBase >( subRegion ); - GEOS_ERROR_IF( solidName.empty(), GEOS_FMT( "{}: Solid model not found on subregion {}", - getDataContext(), subRegion.getName() ) ); + GEOS_ERROR_CTX_IF( solidName.empty(), + GEOS_FMT( "{}: Solid model not found on subregion {}", + getDataContext(), subRegion.getName() ), + getDataContext() ); subRegion.registerWrapper< string >( viewKeyStruct::permeabilityNamesString() ). setPlotLevel( PlotLevel::NOPLOT ). @@ -333,8 +335,10 @@ void FlowSolverBase::setConstitutiveNamesCallSuper( ElementSubRegionBase & subRe string & permName = subRegion.getReference< string >( viewKeyStruct::permeabilityNamesString() ); permName = getConstitutiveName< PermeabilityBase >( subRegion ); - GEOS_ERROR_IF( permName.empty(), GEOS_FMT( "{}: Permeability model not found on subregion {}", - getDataContext(), subRegion.getName() ) ); + GEOS_ERROR_CTX_IF( permName.empty(), + GEOS_FMT( "{}: Permeability model not found on subregion {}", + getDataContext(), subRegion.getName() ), + getDataContext() ); if( m_isThermal ) { @@ -346,10 +350,10 @@ void FlowSolverBase::setConstitutiveNamesCallSuper( ElementSubRegionBase & subRe reference(); solidInternalEnergyName = getConstitutiveName< SolidInternalEnergy >( subRegion ); - GEOS_THROW_IF( solidInternalEnergyName.empty(), - GEOS_FMT( "{}: Solid internal energy model not found on subregion {}", - getDataContext(), subRegion.getName() ), - InputError ); + GEOS_THROW_CTX_IF( solidInternalEnergyName.empty(), + GEOS_FMT( "{}: Solid internal energy model not found on subregion {}", + getDataContext(), subRegion.getName() ), + InputError, getDataContext() ); } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp index 987c8a6878e..36a58cbbb7f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp @@ -1086,7 +1086,9 @@ void ReactiveCompositionalMultiphaseOBL::applyDirichletBC( real64 const time, if( m_nonlinearSolverParameters.m_numNewtonIterations == 0 ) { bool const bcConsistent = validateDirichletBC( domain, time + dt ); - GEOS_ERROR_IF( !bcConsistent, GEOS_FMT( "CompositionalMultiphaseBase {}: inconsistent boundary conditions", getDataContext() ) ); + GEOS_ERROR_CTX_IF( !bcConsistent, + GEOS_FMT( "CompositionalMultiphaseBase {}: inconsistent boundary conditions", getDataContext() ), + getDataContext() ); } FieldSpecificationManager & fsManager = FieldSpecificationManager::getInstance(); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 6a17a1ef7d4..061699f71c6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -140,8 +140,10 @@ void SinglePhaseBase::setConstitutiveNames( ElementSubRegionBase & subRegion ) c { string & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); fluidName = getConstitutiveName< SingleFluidBase >( subRegion ); - GEOS_ERROR_IF( fluidName.empty(), GEOS_FMT( "{}: Fluid model not found on subregion {}", - getDataContext(), subRegion.getName() ) ); + GEOS_ERROR_CTX_IF( fluidName.empty(), + GEOS_FMT( "{}: Fluid model not found on subregion {}", + getDataContext(), subRegion.getName() ), + getDataContext() ); if( m_isThermal ) { @@ -153,10 +155,10 @@ void SinglePhaseBase::setConstitutiveNames( ElementSubRegionBase & subRegion ) c reference(); thermalConductivityName = getConstitutiveName< SinglePhaseThermalConductivityBase >( subRegion ); - GEOS_THROW_IF( thermalConductivityName.empty(), - GEOS_FMT( "{}: Thermal conductivity model not found on subregion {}", - getDataContext(), subRegion.getName() ), - InputError ); + GEOS_THROW_CTX_IF( thermalConductivityName.empty(), + GEOS_FMT( "{}: Thermal conductivity model not found on subregion {}", + getDataContext(), subRegion.getName() ), + InputError, getDataContext() ); } } @@ -185,24 +187,24 @@ void SinglePhaseBase::validateConstitutiveModels( DomainPartition & domain ) con { string & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); fluidName = getConstitutiveName< SingleFluidBase >( subRegion ); - GEOS_THROW_IF( fluidName.empty(), - GEOS_FMT( "SingleFluidBase {}: Fluid model not found on subregion {}", - getDataContext(), subRegion.getName() ), - InputError ); + GEOS_THROW_CTX_IF( fluidName.empty(), + GEOS_FMT( "SingleFluidBase {}: Fluid model not found on subregion {}", + getDataContext(), subRegion.getName() ), + InputError, getDataContext() ); SingleFluidBase const & fluid = getConstitutiveModel< SingleFluidBase >( subRegion, fluidName ); constitutiveUpdatePassThru( fluid, [&] ( auto & castedFluid ) { string const fluidModelName = castedFluid.getCatalogName(); - GEOS_THROW_IF( m_isThermal && (fluidModelName != "ThermalCompressibleSinglePhaseFluid"), - GEOS_FMT( "SingleFluidBase {}: the thermal option is enabled in the solver, but the fluid model {} is not for thermal fluid", - getDataContext(), fluid.getDataContext() ), - InputError ); - GEOS_THROW_IF( !m_isThermal && (fluidModelName == "ThermalCompressibleSinglePhaseFluid"), - GEOS_FMT( "SingleFluidBase {}: the fluid model is for thermal fluid {}, but the solver option is incompatible with the fluid model", - getDataContext(), fluid.getDataContext() ), - InputError ); + GEOS_THROW_CTX_IF( m_isThermal && (fluidModelName != "ThermalCompressibleSinglePhaseFluid"), + GEOS_FMT( "SingleFluidBase {}: the thermal option is enabled in the solver, but the fluid model {} is not for thermal fluid", + getDataContext(), fluid.getDataContext() ), + InputError, getDataContext(), fluid.getDataContext() ); + GEOS_THROW_CTX_IF( !m_isThermal && (fluidModelName == "ThermalCompressibleSinglePhaseFluid"), + GEOS_FMT( "SingleFluidBase {}: the fluid model is for thermal fluid {}, but the solver option is incompatible with the fluid model", + getDataContext(), fluid.getDataContext() ), + InputError, getDataContext(), fluid.getDataContext() ); } ); } ); } ); @@ -457,15 +459,15 @@ void SinglePhaseBase::computeHydrostaticEquilibrium( DomainPartition & domain ) equilCounter++; // check that the gravity vector is aligned with the z-axis - GEOS_THROW_IF( !isZero( gravVector[0] ) || !isZero( gravVector[1] ), - getCatalogName() << " " << getDataContext() << - ": the gravity vector specified in this simulation (" << gravVector[0] << " " << gravVector[1] << " " << gravVector[2] << - ") is not aligned with the z-axis. \n" - "This is incompatible with the " << bc.getCatalogName() << " " << bc.getDataContext() << - "used in this simulation. To proceed, you can either: \n" << - " - Use a gravityVector aligned with the z-axis, such as (0.0,0.0,-9.81)\n" << - " - Remove the hydrostatic equilibrium initial condition from the XML file", - InputError ); + GEOS_THROW_CTX_IF( !isZero( gravVector[0] ) || !isZero( gravVector[1] ), + getCatalogName() << " " << getDataContext() << + ": the gravity vector specified in this simulation (" << gravVector[0] << " " << gravVector[1] << " " << gravVector[2] << + ") is not aligned with the z-axis. \n" + "This is incompatible with the " << bc.getCatalogName() << " " << bc.getDataContext() << + "used in this simulation. To proceed, you can either: \n" << + " - Use a gravityVector aligned with the z-axis, such as (0.0,0.0,-9.81)\n" << + " - Remove the hydrostatic equilibrium initial condition from the XML file", + InputError, getDataContext(), bc.getDataContext() ); } ); if( equilCounter == 0 ) @@ -576,10 +578,10 @@ void SinglePhaseBase::computeHydrostaticEquilibrium( DomainPartition & domain ) elevationValues.toNestedView(), pressureValues.toView() ); - GEOS_THROW_IF( !equilHasConverged, - getCatalogName() << " " << getDataContext() << - ": hydrostatic pressure initialization failed to converge in region " << region.getName() << "!", - std::runtime_error ); + GEOS_THROW_CTX_IF( !equilHasConverged, + getCatalogName() << " " << getDataContext() << + ": hydrostatic pressure initialization failed to converge in region " << region.getName() << "!", + std::runtime_error, getDataContext() ); } ); // Step 3.4: create hydrostatic pressure table diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index bcd96846d69..1b77bed184b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -99,19 +99,19 @@ void SinglePhaseHybridFVM::initializePreSubGroups() { SinglePhaseBase::initializePreSubGroups(); - GEOS_THROW_IF( m_isThermal, - GEOS_FMT( "{} {}: The thermal option is not supported by SinglePhaseHybridFVM", - getCatalogName(), getDataContext().toString() ), - InputError ); + GEOS_THROW_CTX_IF( m_isThermal, + GEOS_FMT( "{} {}: The thermal option is not supported by SinglePhaseHybridFVM", + getCatalogName(), getDataContext().toString() ), + InputError, getDataContext() ); DomainPartition & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" ); NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager(); FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); - GEOS_THROW_IF( !fvManager.hasGroup< HybridMimeticDiscretization >( m_discretizationName ), - getCatalogName() << " " << getDataContext() << - ": the HybridMimeticDiscretization must be selected with SinglePhaseHybridFVM", - InputError ); + GEOS_THROW_CTX_IF( !fvManager.hasGroup< HybridMimeticDiscretization >( m_discretizationName ), + getCatalogName() << " " << getDataContext() << + ": the HybridMimeticDiscretization must be selected with SinglePhaseHybridFVM", + InputError, getDataContext() ); } void SinglePhaseHybridFVM::initializePostInitialConditionsPreSubGroups() diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp index 8225e49f838..9dfe037bbc1 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp @@ -68,8 +68,10 @@ void SinglePhaseProppantBase::setConstitutiveNames( ElementSubRegionBase & subRe { string & fluidMaterialName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); fluidMaterialName = PhysicsSolverBase::getConstitutiveName< SlurryFluidBase >( subRegion ); - GEOS_ERROR_IF( fluidMaterialName.empty(), GEOS_FMT( "{}: Fluid model not found on subregion {}", - getDataContext(), subRegion.getName() ) ); + GEOS_ERROR_CTX_IF( fluidMaterialName.empty(), + GEOS_FMT( "{}: Fluid model not found on subregion {}", + getDataContext(), subRegion.getName() ), + getDataContext() ); } void SinglePhaseProppantBase::validateConstitutiveModels( DomainPartition & domain ) const @@ -84,10 +86,10 @@ void SinglePhaseProppantBase::validateConstitutiveModels( DomainPartition & doma { string & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); fluidName = getConstitutiveName< SlurryFluidBase >( subRegion ); - GEOS_THROW_IF( fluidName.empty(), - GEOS_FMT( "{}: Fluid model not found on subregion {}", - getDataContext(), subRegion.getName() ), - InputError ); + GEOS_THROW_CTX_IF( fluidName.empty(), + GEOS_FMT( "{}: Fluid model not found on subregion {}", + getDataContext(), subRegion.getName() ), + InputError, getDataContext() ); } ); } ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp index 39812481e12..665f277367a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp @@ -58,19 +58,21 @@ void SourceFluxStatsAggregator::postInputInitialization() { m_fluxNames.emplace_back( string( sourceFlux.getName() ) ); } ); - GEOS_WARNING_IF( m_fluxNames.empty(), - GEOS_FMT( "{}: No {} was found in {}.", - getDataContext(), SourceFluxBoundaryCondition::catalogName(), - fsManager.getDataContext() ) ); + GEOS_WARNING_CTX_IF( m_fluxNames.empty(), + GEOS_FMT( "{}: No {} was found in {}.", + getDataContext(), SourceFluxBoundaryCondition::catalogName(), + fsManager.getDataContext() ), + getDataContext() ); } else { for( string const & fluxName : m_fluxNames ) { - GEOS_ERROR_IF( !fsManager.hasGroup< SourceFluxBoundaryCondition >( fluxName ), - GEOS_FMT( "{}: No {} named {} was found in {}.", - getDataContext(), SourceFluxBoundaryCondition::catalogName(), - fluxName, fsManager.getDataContext() ) ); + GEOS_ERROR_CTX_IF( !fsManager.hasGroup< SourceFluxBoundaryCondition >( fluxName ), + GEOS_FMT( "{}: No {} named {} was found in {}.", + getDataContext(), SourceFluxBoundaryCondition::catalogName(), + fluxName, fsManager.getDataContext() ), + getDataContext() ); } } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp b/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp index 869c531897a..ef000b0df31 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp @@ -67,11 +67,11 @@ void StencilDataCollection::postInputInitialization() Group & physicsSolverManager = problemManager.getGroup( "Solvers" ); m_solver = physicsSolverManager.getGroupPointer< FlowSolverBase >( m_solverName ); - GEOS_THROW_IF( m_solver == nullptr, - GEOS_FMT( "{}: Could not find flow solver named '{}'.", - getDataContext(), - m_solverName ), - InputError ); + GEOS_THROW_CTX_IF( m_solver == nullptr, + GEOS_FMT( "{}: Could not find flow solver named '{}'.", + getDataContext(), + m_solverName ), + InputError, getDataContext() ); } { // find mesh & discretization @@ -112,10 +112,12 @@ void StencilDataCollection::initializePostInitialConditionsPostSubGroups() getName(), connCount, m_discretization->getName() ) ); ++supportedStencilCount; } ); - GEOS_ERROR_IF( supportedStencilCount == 0, - GEOS_FMT( "{}: No compatible discretization was found.", getDataContext() ) ); - GEOS_ERROR_IF( supportedStencilCount > 1, - GEOS_FMT( "{}: Multiple discretization was found.", getDataContext() ) ); + GEOS_ERROR_CTX_IF( supportedStencilCount == 0, + GEOS_FMT( "{}: No compatible discretization was found.", getDataContext() ), + getDataContext() ); + GEOS_ERROR_CTX_IF( supportedStencilCount > 1, + GEOS_FMT( "{}: Multiple discretization was found.", getDataContext() ), + getDataContext() ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp index 7cbe5983abc..8b960be3ee2 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp @@ -146,18 +146,18 @@ void ProppantTransport::setConstitutiveNames( ElementSubRegionBase & subRegion ) { string & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); fluidName = getConstitutiveName< SlurryFluidBase >( subRegion ); - GEOS_THROW_IF( fluidName.empty(), + GEOS_THROW_CTX_IF( fluidName.empty(), GEOS_FMT( "{}: Fluid model not found on subregion {}", getDataContext(), subRegion.getName() ), - InputError ); + InputError, getDataContext() ); subRegion.registerWrapper< string >( viewKeyStruct::proppantNamesString() ); string & proppantName = subRegion.getReference< string >( viewKeyStruct::proppantNamesString() ); proppantName = getConstitutiveName< ParticleFluidBase >( subRegion ); - GEOS_THROW_IF( proppantName.empty(), + GEOS_THROW_CTX_IF( proppantName.empty(), GEOS_FMT( "{}: Proppant model not found on subregion {}", getDataContext(), subRegion.getName() ), - InputError ); + InputError, getDataContext() ); } @@ -730,8 +730,9 @@ void ProppantTransport::applyBoundaryConditions( real64 const time_n, { string const & subRegionName = subRegion.getName(); - GEOS_ERROR_IF( bcStatusMap[subRegionName].count( setName ) > 0, - getDataContext() << ": Conflicting proppant boundary conditions on set " << setName ); + GEOS_ERROR_CTX_IF( bcStatusMap[subRegionName].count( setName ) > 0, + getDataContext() << ": Conflicting proppant boundary conditions on set " << setName, + getDataContext() ); bcStatusMap[subRegionName][setName].resize( m_numComponents ); bcStatusMap[subRegionName][setName].setValues< serialPolicy >( false ); @@ -750,10 +751,12 @@ void ProppantTransport::applyBoundaryConditions( real64 const time_n, string const & subRegionName = subRegion.getName(); localIndex const comp = fs.getComponent(); - GEOS_ERROR_IF( bcStatusMap[subRegionName].count( setName ) == 0, - getDataContext() << ": Proppant boundary condition not prescribed on set '" << setName << "'" ); - GEOS_ERROR_IF( bcStatusMap[subRegionName][setName][comp], - getDataContext() << ": Conflicting composition[" << comp << "] boundary conditions on set '" << setName << "'" ); + GEOS_ERROR_CTX_IF( bcStatusMap[subRegionName].count( setName ) == 0, + getDataContext() << ": Proppant boundary condition not prescribed on set '" << setName << "'", + getDataContext() ); + GEOS_ERROR_CTX_IF( bcStatusMap[subRegionName][setName][comp], + getDataContext() << ": Conflicting composition[" << comp << "] boundary conditions on set '" << setName << "'", + getDataContext() ); bcStatusMap[subRegionName][setName][comp] = true; fs.applyFieldValue< FieldSpecificationEqual >( targetSet, @@ -771,10 +774,11 @@ void ProppantTransport::applyBoundaryConditions( real64 const time_n, for( localIndex ic = 0; ic < m_numComponents; ++ic ) { bcConsistent &= bcStatusEntryInner.second[ic]; - GEOS_WARNING_IF( !bcConsistent, - getDataContext() << ": Composition boundary condition not applied to component " << - ic << " on region '" << bcStatusEntryOuter.first << "'," << - " set '" << bcStatusEntryInner.first << "'" ); + GEOS_WARNING_CTX_IF( !bcConsistent, + getDataContext() << ": Composition boundary condition not applied to component " << + ic << " on region '" << bcStatusEntryOuter.first << "'," << + " set '" << bcStatusEntryInner.first << "'", + getDataContext() ); } } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 362d5292e50..1750789ee58 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -191,8 +191,10 @@ void CompositionalMultiphaseWell::registerDataOnMesh( Group & meshBodies ) WellElementSubRegion & subRegion ) { string const & fluidName = getConstitutiveName< MultiFluidBase >( subRegion ); - GEOS_ERROR_IF( fluidName.empty(), GEOS_FMT( "{}: Fluid model not found on subregion {}", - getDataContext(), subRegion.getName() ) ); + GEOS_ERROR_CTX_IF( fluidName.empty(), + GEOS_FMT( "{}: Fluid model not found on subregion {}", + getDataContext(), subRegion.getName() ), + getDataContext() ); MultiFluidBase const & fluid = subRegion.getConstitutiveModel< MultiFluidBase >( fluidName ); @@ -299,10 +301,10 @@ void CompositionalMultiphaseWell::setConstitutiveNames( ElementSubRegionBase & s string & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); fluidName = getConstitutiveName< MultiFluidBase >( subRegion ); - GEOS_THROW_IF( fluidName.empty(), - GEOS_FMT( "{}: Fluid model not found on subregion {}", - getDataContext(), subRegion.getName() ), - InputError ); + GEOS_THROW_CTX_IF( fluidName.empty(), + GEOS_FMT( "{}: Fluid model not found on subregion {}", + getDataContext(), subRegion.getName() ), + InputError, getDataContext() ); } namespace @@ -422,17 +424,17 @@ void CompositionalMultiphaseWell::validateInjectionStreams( WellElementSubRegion for( integer ic = 0; ic < m_numComponents; ++ic ) { real64 const compFrac = injectionStream[ic]; - GEOS_THROW_IF( ( compFrac < 0.0 ) || ( compFrac > 1.0 ), - "WellControls " << wellControls.getDataContext() << - ": Invalid injection stream for well " << subRegion.getName(), - InputError ); + GEOS_THROW_CTX_IF( ( compFrac < 0.0 ) || ( compFrac > 1.0 ), + "WellControls " << wellControls.getDataContext() << + ": Invalid injection stream for well " << subRegion.getName(), + InputError, wellControls.getDataContext() ); compFracSum += compFrac; } - GEOS_THROW_IF( ( compFracSum < 1.0 - std::numeric_limits< real64 >::epsilon() ) || - ( compFracSum > 1.0 + std::numeric_limits< real64 >::epsilon() ), - "WellControls " << wellControls.getDataContext() << - ": Invalid injection stream for well " << subRegion.getName(), - InputError ); + GEOS_THROW_CTX_IF( ( compFracSum < 1.0 - std::numeric_limits< real64 >::epsilon() ) || + ( compFracSum > 1.0 + std::numeric_limits< real64 >::epsilon() ), + "WellControls " << wellControls.getDataContext() << + ": Invalid injection stream for well " << subRegion.getName(), + InputError, wellControls.getDataContext() ); } } @@ -450,45 +452,45 @@ void CompositionalMultiphaseWell::validateWellConstraints( real64 const & time_n real64 const & targetPhaseRate = wellControls.getTargetPhaseRate( time_n ); real64 const & targetMassRate = wellControls.getTargetMassRate( time_n ); - GEOS_THROW_IF( wellControls.isInjector() && currentControl == WellControls::Control::PHASEVOLRATE, - "WellControls " << wellControls.getDataContext() << - ": Phase rate control is not available for injectors", - InputError ); - GEOS_THROW_IF( wellControls.isProducer() && currentControl == WellControls::Control::TOTALVOLRATE, - "WellControls " << wellControls.getDataContext() << - ": Total rate control is not available for producers", - InputError ); - - GEOS_THROW_IF( wellControls.isInjector() && targetTotalRate < 0.0, - "WellControls " << wellControls.getDataContext() << - ": Target total rate cannot be negative for injectors", - InputError ); - GEOS_THROW_IF( wellControls.isInjector() && !isZero( targetPhaseRate ), - "WellControls " << wellControls.getDataContext() << - ": Target phase rate cannot be used for injectors", - InputError ); - GEOS_THROW_IF( wellControls.isProducer() && !isZero( targetTotalRate ), - "WellControls " << wellControls.getDataContext() << - ": Target total rate cannot be used for producers", - InputError ); - GEOS_THROW_IF( wellControls.isProducer() && !isZero( targetMassRate ), - "WellControls " << wellControls.getDataContext() << - ": Target mass rate cannot be used for producers", - InputError ); - GEOS_THROW_IF( !m_useMass && !isZero( targetMassRate ), - "WellControls " << wellControls.getDataContext() << - ": Target mass rate cannot with useMass=0", - InputError ); + GEOS_THROW_CTX_IF( wellControls.isInjector() && currentControl == WellControls::Control::PHASEVOLRATE, + "WellControls " << wellControls.getDataContext() << + ": Phase rate control is not available for injectors", + InputError, wellControls.getDataContext() ); + GEOS_THROW_CTX_IF( wellControls.isProducer() && currentControl == WellControls::Control::TOTALVOLRATE, + "WellControls " << wellControls.getDataContext() << + ": Total rate control is not available for producers", + InputError, wellControls.getDataContext() ); + + GEOS_THROW_CTX_IF( wellControls.isInjector() && targetTotalRate < 0.0, + "WellControls " << wellControls.getDataContext() << + ": Target total rate cannot be negative for injectors", + InputError, wellControls.getDataContext() ); + GEOS_THROW_CTX_IF( wellControls.isInjector() && !isZero( targetPhaseRate ), + "WellControls " << wellControls.getDataContext() << + ": Target phase rate cannot be used for injectors", + InputError, wellControls.getDataContext() ); + GEOS_THROW_CTX_IF( wellControls.isProducer() && !isZero( targetTotalRate ), + "WellControls " << wellControls.getDataContext() << + ": Target total rate cannot be used for producers", + InputError, wellControls.getDataContext() ); + GEOS_THROW_CTX_IF( wellControls.isProducer() && !isZero( targetMassRate ), + "WellControls " << wellControls.getDataContext() << + ": Target mass rate cannot be used for producers", + InputError, wellControls.getDataContext() ); + GEOS_THROW_CTX_IF( !m_useMass && !isZero( targetMassRate ), + "WellControls " << wellControls.getDataContext() << + ": Target mass rate cannot with useMass=0", + InputError, wellControls.getDataContext() ); // The user always provides positive rates, but these rates are later multiplied by -1 internally for producers - GEOS_THROW_IF( wellControls.isProducer() && targetPhaseRate > 0.0, - "WellControls " << wellControls.getDataContext() << - ": Target phase rate cannot be negative for producers", - InputError ); - GEOS_THROW_IF( wellControls.isProducer() && !isZero( targetTotalRate ), - "WellControls " << wellControls.getDataContext() << - ": Target total rate cannot be used for producers", - InputError ); + GEOS_THROW_CTX_IF( wellControls.isProducer() && targetPhaseRate > 0.0, + "WellControls " << wellControls.getDataContext() << + ": Target phase rate cannot be negative for producers", + InputError, wellControls.getDataContext() ); + GEOS_THROW_CTX_IF( wellControls.isProducer() && !isZero( targetTotalRate ), + "WellControls " << wellControls.getDataContext() << + ": Target total rate cannot be used for producers", + InputError, wellControls.getDataContext() ); // Find target phase index for phase rate constraint for( integer ip = 0; ip < fluid.numFluidPhases(); ++ip ) @@ -498,10 +500,10 @@ void CompositionalMultiphaseWell::validateWellConstraints( real64 const & time_n m_targetPhaseIndex = ip; } } - GEOS_THROW_IF( wellControls.isProducer() && m_targetPhaseIndex == -1, - "WellControls " << wellControls.getDataContext() << - ": Phase " << wellControls.getTargetPhaseName() << " not found for well control " << wellControls.getName(), - InputError ); + GEOS_THROW_CTX_IF( wellControls.isProducer() && m_targetPhaseIndex == -1, + "WellControls " << wellControls.getDataContext() << + ": Phase " << wellControls.getTargetPhaseName() << " not found for well control " << wellControls.getName(), + InputError, wellControls.getDataContext() ); } void CompositionalMultiphaseWell::initializePostSubGroups() diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp index b2255836bcc..d29caf675d7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp @@ -86,8 +86,10 @@ void SinglePhaseWell::registerDataOnMesh( Group & meshBodies ) { string & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); fluidName = getConstitutiveName< SingleFluidBase >( subRegion ); - GEOS_ERROR_IF( fluidName.empty(), GEOS_FMT( "{}: Fluid model not found on subregion {}", - getDataContext(), subRegion.getName() ) ); + GEOS_ERROR_CTX_IF( fluidName.empty(), + GEOS_FMT( "{}: Fluid model not found on subregion {}", + getDataContext(), subRegion.getName() ), + getDataContext() ); subRegion.registerField< fields::well::connectionRate_n >( getName() ); subRegion.registerField< fields::well::connectionRate >( getName() ); @@ -136,20 +138,20 @@ void SinglePhaseWell::validateWellConstraints( real64 const & time_n, WellControls::Control const currentControl = wellControls.getControl(); real64 const targetTotalRate = wellControls.getTargetTotalRate( time_n ); real64 const targetPhaseRate = wellControls.getTargetPhaseRate( time_n ); - GEOS_THROW_IF( currentControl == WellControls::Control::PHASEVOLRATE, + GEOS_THROW_CTX_IF( currentControl == WellControls::Control::PHASEVOLRATE, "WellControls " << wellControls.getDataContext() << ": Phase rate control is not available for SinglePhaseWell", - InputError ); + InputError, wellControls.getDataContext() ); // The user always provides positive rates, but these rates are later multiplied by -1 internally for producers - GEOS_THROW_IF( ( ( wellControls.isInjector() && targetTotalRate < 0.0 ) || + GEOS_THROW_CTX_IF( ( ( wellControls.isInjector() && targetTotalRate < 0.0 ) || ( wellControls.isProducer() && targetTotalRate > 0.0) ), "WellControls " << wellControls.getDataContext() << ": Target total rate cannot be negative", - InputError ); - GEOS_THROW_IF( !isZero( targetPhaseRate ), + InputError, wellControls.getDataContext() ); + GEOS_THROW_CTX_IF( !isZero( targetPhaseRate ), "WellControls " << wellControls.getDataContext() << ": Target phase rate cannot be used for SinglePhaseWell", - InputError ); + InputError, wellControls.getDataContext() ); } void SinglePhaseWell::updateBHPForConstraint( WellElementSubRegion & subRegion ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp index 1ebb9b36c74..9c813814d78 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp @@ -228,10 +228,10 @@ void WellControls::postInputInitialization() // 0) Assign the value of the current well control // When the simulation starts from a restart file, we don't want to use the inputControl, // because the control may have switched in the simulation that generated the restart - GEOS_THROW_IF( m_inputControl == Control::UNINITIALIZED, - getWrapperDataContext( viewKeyStruct::inputControlString() ) << - ": Input well control cannot be uninitialized", - InputError ); + GEOS_THROW_CTX_IF( m_inputControl == Control::UNINITIALIZED, + getWrapperDataContext( viewKeyStruct::inputControlString() ) << + ": Input well control cannot be uninitialized", + InputError, getWrapperDataContext( viewKeyStruct::inputControlString() ) ); if( m_currentControl == Control::UNINITIALIZED ) { @@ -239,30 +239,30 @@ void WellControls::postInputInitialization() } // 1.a) check target BHP - GEOS_THROW_IF( m_targetBHP < 0, - getWrapperDataContext( viewKeyStruct::targetBHPString() ) << - ": Target bottom-hole pressure is negative", - InputError ); + GEOS_THROW_CTX_IF( m_targetBHP < 0, + getWrapperDataContext( viewKeyStruct::targetBHPString() ) << + ": Target bottom-hole pressure is negative", + InputError, getWrapperDataContext( viewKeyStruct::targetBHPString() ) ); // 1.b) check target rates - GEOS_THROW_IF( m_targetTotalRate < 0, - getWrapperDataContext( viewKeyStruct::targetTotalRateString() ) << ": Target rate is negative", - InputError ); + GEOS_THROW_CTX_IF( m_targetTotalRate < 0, + getWrapperDataContext( viewKeyStruct::targetTotalRateString() ) << ": Target rate is negative", + InputError, getWrapperDataContext( viewKeyStruct::targetTotalRateString() ) ); - GEOS_THROW_IF( m_targetPhaseRate < 0, - getWrapperDataContext( viewKeyStruct::targetPhaseRateString() ) << ": Target oil rate is negative", - InputError ); + GEOS_THROW_CTX_IF( m_targetPhaseRate < 0, + getWrapperDataContext( viewKeyStruct::targetPhaseRateString() ) << ": Target oil rate is negative", + InputError, getWrapperDataContext( viewKeyStruct::targetPhaseRateString() ) ); - GEOS_THROW_IF( m_targetMassRate < 0, - getWrapperDataContext( viewKeyStruct::targetMassRateString() ) << ": Target mass rate is negative", - InputError ); + GEOS_THROW_CTX_IF( m_targetMassRate < 0, + getWrapperDataContext( viewKeyStruct::targetMassRateString() ) << ": Target mass rate is negative", + InputError, getWrapperDataContext( viewKeyStruct::targetMassRateString() ) ); - GEOS_THROW_IF( (m_injectionStream.empty() && m_injectionTemperature >= 0) || - (!m_injectionStream.empty() && m_injectionTemperature < 0), - "WellControls " << getDataContext() << ": Both " - << viewKeyStruct::injectionStreamString() << " and " << viewKeyStruct::injectionTemperatureString() - << " must be specified for multiphase simulations", - InputError ); + GEOS_THROW_CTX_IF( (m_injectionStream.empty() && m_injectionTemperature >= 0) || + (!m_injectionStream.empty() && m_injectionTemperature < 0), + "WellControls " << getDataContext() << ": Both " + << viewKeyStruct::injectionStreamString() << " and " << viewKeyStruct::injectionTemperatureString() + << " must be specified for multiphase simulations", + InputError, getDataContext() ); // 1.c) Set the multiplier for the rates if( isProducer() ) @@ -280,69 +280,70 @@ void WellControls::postInputInitialization() real64 sum = 0.0; for( localIndex ic = 0; ic < m_injectionStream.size(); ++ic ) { - GEOS_ERROR_IF( m_injectionStream[ic] < 0.0 || m_injectionStream[ic] > 1.0, - getWrapperDataContext( viewKeyStruct::injectionStreamString() ) << ": Invalid injection stream" ); + GEOS_ERROR_CTX_IF( m_injectionStream[ic] < 0.0 || m_injectionStream[ic] > 1.0, + getWrapperDataContext( viewKeyStruct::injectionStreamString() ) << ": Invalid injection stream", + getWrapperDataContext( viewKeyStruct::injectionStreamString() ) ); sum += m_injectionStream[ic]; } - GEOS_THROW_IF( LvArray::math::abs( 1.0 - sum ) > std::numeric_limits< real64 >::epsilon(), - getWrapperDataContext( viewKeyStruct::injectionStreamString() ) << ": Invalid injection stream", - InputError ); + GEOS_THROW_CTX_IF( LvArray::math::abs( 1.0 - sum ) > std::numeric_limits< real64 >::epsilon(), + getWrapperDataContext( viewKeyStruct::injectionStreamString() ) << ": Invalid injection stream", + InputError, getWrapperDataContext( viewKeyStruct::injectionStreamString() ) ); } // 3) check the flag for surface / reservoir conditions - GEOS_THROW_IF( m_useSurfaceConditions != 0 && m_useSurfaceConditions != 1, - getWrapperDataContext( viewKeyStruct::useSurfaceConditionsString() ) << ": The flag to select surface/reservoir conditions must be equal to 0 or 1", - InputError ); + GEOS_THROW_CTX_IF( m_useSurfaceConditions != 0 && m_useSurfaceConditions != 1, + getWrapperDataContext( viewKeyStruct::useSurfaceConditionsString() ) << ": The flag to select surface/reservoir conditions must be equal to 0 or 1", + InputError, getWrapperDataContext( viewKeyStruct::useSurfaceConditionsString() ) ); // 4) check that at least one rate constraint has been defined - GEOS_THROW_IF( ((m_targetPhaseRate <= 0.0 && m_targetPhaseRateTableName.empty()) && - (m_targetMassRate <= 0.0 && m_targetMassRateTableName.empty()) && - (m_targetTotalRate <= 0.0 && m_targetTotalRateTableName.empty())), - "WellControls " << getDataContext() << ": You need to specify a phase, mass, or total rate constraint. \n" << - "The phase rate constraint can be specified using " << - "either " << viewKeyStruct::targetPhaseRateString() << - " or " << viewKeyStruct::targetPhaseRateTableNameString() << ".\n" << - "The total rate constraint can be specified using " << - "either " << viewKeyStruct::targetTotalRateString() << - " or " << viewKeyStruct::targetTotalRateTableNameString()<< - "The mass rate constraint can be specified using " << - "either " << viewKeyStruct::targetMassRateString() << - " or " << viewKeyStruct::targetMassRateTableNameString(), - InputError ); + GEOS_THROW_CTX_IF( ((m_targetPhaseRate <= 0.0 && m_targetPhaseRateTableName.empty()) && + (m_targetMassRate <= 0.0 && m_targetMassRateTableName.empty()) && + (m_targetTotalRate <= 0.0 && m_targetTotalRateTableName.empty())), + "WellControls " << getDataContext() << ": You need to specify a phase, mass, or total rate constraint. \n" << + "The phase rate constraint can be specified using " << + "either " << viewKeyStruct::targetPhaseRateString() << + " or " << viewKeyStruct::targetPhaseRateTableNameString() << ".\n" << + "The total rate constraint can be specified using " << + "either " << viewKeyStruct::targetTotalRateString() << + " or " << viewKeyStruct::targetTotalRateTableNameString()<< + "The mass rate constraint can be specified using " << + "either " << viewKeyStruct::targetMassRateString() << + " or " << viewKeyStruct::targetMassRateTableNameString(), + InputError, getDataContext() ); // 5) check whether redundant information has been provided - GEOS_THROW_IF( ((m_targetPhaseRate > 0.0 && !m_targetPhaseRateTableName.empty())), - "WellControls " << getDataContext() << ": You have provided redundant information for well phase rate." << - " The keywords " << viewKeyStruct::targetPhaseRateString() << " and " << viewKeyStruct::targetPhaseRateTableNameString() << " cannot be specified together", - InputError ); - - GEOS_THROW_IF( ((m_targetTotalRate > 0.0 && !m_targetTotalRateTableName.empty())), - "WellControls " << getDataContext() << ": You have provided redundant information for well total rate." << - " The keywords " << viewKeyStruct::targetTotalRateString() << " and " << viewKeyStruct::targetTotalRateTableNameString() << " cannot be specified together", - InputError ); - - GEOS_THROW_IF( ((m_targetBHP > 0.0 && !m_targetBHPTableName.empty())), - "WellControls " << getDataContext() << ": You have provided redundant information for well BHP." << - " The keywords " << viewKeyStruct::targetBHPString() << " and " << viewKeyStruct::targetBHPTableNameString() << " cannot be specified together", - InputError ); - - GEOS_THROW_IF( ((m_targetMassRate > 0.0 && !m_targetMassRateTableName.empty())), - "WellControls " << getDataContext() << ": You have provided redundant information for well mass rate." << - " The keywords " << viewKeyStruct::targetMassRateString() << " and " << viewKeyStruct::targetMassRateTableNameString() << " cannot be specified together", - InputError ); - - GEOS_THROW_IF( ((m_targetMassRate > 0.0 && m_useSurfaceConditions==0)), - "WellControls " << getDataContext() << ": Option only valid if useSurfaceConditions set to 1", - InputError ); + GEOS_THROW_CTX_IF( ((m_targetPhaseRate > 0.0 && !m_targetPhaseRateTableName.empty())), + "WellControls " << getDataContext() << ": You have provided redundant information for well phase rate." << + " The keywords " << viewKeyStruct::targetPhaseRateString() << " and " << viewKeyStruct::targetPhaseRateTableNameString() << " cannot be specified together", + InputError, getDataContext() ); + + GEOS_THROW_CTX_IF( ((m_targetTotalRate > 0.0 && !m_targetTotalRateTableName.empty())), + "WellControls " << getDataContext() << ": You have provided redundant information for well total rate." << + " The keywords " << viewKeyStruct::targetTotalRateString() << " and " << viewKeyStruct::targetTotalRateTableNameString() << " cannot be specified together", + InputError, getDataContext() ); + + GEOS_THROW_CTX_IF( ((m_targetBHP > 0.0 && !m_targetBHPTableName.empty())), + "WellControls " << getDataContext() << ": You have provided redundant information for well BHP." << + " The keywords " << viewKeyStruct::targetBHPString() << " and " << viewKeyStruct::targetBHPTableNameString() << " cannot be specified together", + InputError, getDataContext() ); + + GEOS_THROW_CTX_IF( ((m_targetMassRate > 0.0 && !m_targetMassRateTableName.empty())), + "WellControls " << getDataContext() << ": You have provided redundant information for well mass rate." << + " The keywords " << viewKeyStruct::targetMassRateString() << " and " << viewKeyStruct::targetMassRateTableNameString() << " cannot be specified together", + InputError, getDataContext() ); + + GEOS_THROW_CTX_IF( ((m_targetMassRate > 0.0 && m_useSurfaceConditions==0)), + "WellControls " << getDataContext() << ": Option only valid if useSurfaceConditions set to 1", + InputError, getDataContext() ); // 6.1) If the well is under BHP control then the BHP must be specified. // Otherwise the BHP will be set to a default value. if( m_currentControl == Control::BHP ) { - GEOS_THROW_IF( ((m_targetBHP <= 0.0 && m_targetBHPTableName.empty())), - "WellControls " << getDataContext() << ": You have to provide well BHP by specifying either " - << viewKeyStruct::targetBHPString() << " or " << viewKeyStruct::targetBHPTableNameString(), - InputError ); + GEOS_THROW_CTX_IF( ((m_targetBHP <= 0.0 && m_targetBHPTableName.empty())), + "WellControls " << getDataContext() << ": You have to provide well BHP by specifying either " + << viewKeyStruct::targetBHPString() << " or " << viewKeyStruct::targetBHPTableNameString(), + InputError, getDataContext() ); } else if( m_targetBHP <= 0.0 && m_targetBHPTableName.empty() ) { @@ -354,28 +355,28 @@ void WellControls::postInputInitialization() // 6.2) Check incoherent information // An injector must be controlled by TotalVolRate - GEOS_THROW_IF( (isInjector() && (m_inputControl == Control::PHASEVOLRATE)), - "WellControls " << getDataContext() << ": You have to control an injector with " - << EnumStrings< Control >::toString( Control::TOTALVOLRATE ), - InputError ); + GEOS_THROW_CTX_IF( (isInjector() && (m_inputControl == Control::PHASEVOLRATE)), + "WellControls " << getDataContext() << ": You have to control an injector with " + << EnumStrings< Control >::toString( Control::TOTALVOLRATE ), + InputError, getDataContext() ); // An injector must be controlled by TotalVolRate - GEOS_THROW_IF( (isProducer() && (m_inputControl == Control::MASSRATE)), - "WellControls " << getDataContext() << ": You have to control an injector with " - << EnumStrings< Control >::toString( Control::MASSRATE ), - InputError ); + GEOS_THROW_CTX_IF( (isProducer() && (m_inputControl == Control::MASSRATE)), + "WellControls " << getDataContext() << ": You have to control an injector with " + << EnumStrings< Control >::toString( Control::MASSRATE ), + InputError, getDataContext() ); // 7) Make sure that the flag disabling crossflow is not used for producers - GEOS_THROW_IF( isProducer() && m_isCrossflowEnabled == 0, - getWrapperDataContext( viewKeyStruct::enableCrossflowString() ) << - ": This option cannot be set to '0' for producers", - InputError ); + GEOS_THROW_CTX_IF( isProducer() && m_isCrossflowEnabled == 0, + getWrapperDataContext( viewKeyStruct::enableCrossflowString() ) << + ": This option cannot be set to '0' for producers", + InputError, getWrapperDataContext( viewKeyStruct::enableCrossflowString() ) ); // 8) Make sure that the initial pressure coefficient is positive - GEOS_THROW_IF( m_initialPressureCoefficient < 0, - getWrapperDataContext( viewKeyStruct::initialPressureCoefficientString() ) << - ": This tuning coefficient is negative", - InputError ); + GEOS_THROW_CTX_IF( m_initialPressureCoefficient < 0, + getWrapperDataContext( viewKeyStruct::initialPressureCoefficientString() ) << + ": This tuning coefficient is negative", + InputError, getWrapperDataContext( viewKeyStruct::initialPressureCoefficientString() ) ); // 9) Create time-dependent BHP table @@ -389,10 +390,10 @@ void WellControls::postInputInitialization() FunctionManager & functionManager = FunctionManager::getInstance(); m_targetBHPTable = &(functionManager.getGroup< TableFunction const >( m_targetBHPTableName )); - GEOS_THROW_IF( m_targetBHPTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, - "WellControls " << getDataContext() << ": The interpolation method for the time-dependent BHP table " - << m_targetBHPTable->getName() << " should be TableFunction::InterpolationType::Lower", - InputError ); + GEOS_THROW_CTX_IF( m_targetBHPTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, + "WellControls " << getDataContext() << ": The interpolation method for the time-dependent BHP table " + << m_targetBHPTable->getName() << " should be TableFunction::InterpolationType::Lower", + InputError, getDataContext() ); } // 10) Create time-dependent total rate table @@ -406,10 +407,10 @@ void WellControls::postInputInitialization() FunctionManager & functionManager = FunctionManager::getInstance(); m_targetTotalRateTable = &(functionManager.getGroup< TableFunction const >( m_targetTotalRateTableName )); - GEOS_THROW_IF( m_targetTotalRateTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, - "WellControls " << getDataContext() << ": The interpolation method for the time-dependent total rate table " - << m_targetTotalRateTable->getName() << " should be TableFunction::InterpolationType::Lower", - InputError ); + GEOS_THROW_CTX_IF( m_targetTotalRateTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, + "WellControls " << getDataContext() << ": The interpolation method for the time-dependent total rate table " + << m_targetTotalRateTable->getName() << " should be TableFunction::InterpolationType::Lower", + InputError, getDataContext() ); } // 11) Create time-dependent phase rate table @@ -423,10 +424,10 @@ void WellControls::postInputInitialization() FunctionManager & functionManager = FunctionManager::getInstance(); m_targetPhaseRateTable = &(functionManager.getGroup< TableFunction const >( m_targetPhaseRateTableName )); - GEOS_THROW_IF( m_targetPhaseRateTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, - "WellControls " << getDataContext() << ": The interpolation method for the time-dependent phase rate table " - << m_targetPhaseRateTable->getName() << " should be TableFunction::InterpolationType::Lower", - InputError ); + GEOS_THROW_CTX_IF( m_targetPhaseRateTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, + "WellControls " << getDataContext() << ": The interpolation method for the time-dependent phase rate table " + << m_targetPhaseRateTable->getName() << " should be TableFunction::InterpolationType::Lower", + InputError, getDataContext() ); } // Create time-dependent mass rate table if( m_targetMassRateTableName.empty() ) @@ -439,10 +440,10 @@ void WellControls::postInputInitialization() FunctionManager & functionManager = FunctionManager::getInstance(); m_targetMassRateTable = &(functionManager.getGroup< TableFunction const >( m_targetMassRateTableName )); - GEOS_THROW_IF( m_targetMassRateTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, - "WellControls " << getDataContext() << ": The interpolation method for the time-dependent mass rate table " - << m_targetMassRateTable->getName() << " should be TableFunction::InterpolationType::Lower", - InputError ); + GEOS_THROW_CTX_IF( m_targetMassRateTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, + "WellControls " << getDataContext() << ": The interpolation method for the time-dependent mass rate table " + << m_targetMassRateTable->getName() << " should be TableFunction::InterpolationType::Lower", + InputError, getDataContext() ); } // 12) Create the time-dependent well status table if( m_statusTableName.empty()) @@ -461,10 +462,10 @@ void WellControls::postInputInitialization() FunctionManager & functionManager = FunctionManager::getInstance(); m_statusTable = &(functionManager.getGroup< TableFunction const >( m_statusTableName )); - GEOS_THROW_IF( m_statusTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, - "WellControls " << getDataContext() << ": The interpolation method for the time-dependent status table " - << m_statusTable->getName() << " should be TableFunction::InterpolationType::Lower", - InputError ); + GEOS_THROW_CTX_IF( m_statusTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, + "WellControls " << getDataContext() << ": The interpolation method for the time-dependent status table " + << m_statusTable->getName() << " should be TableFunction::InterpolationType::Lower", + InputError, getDataContext() ); } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp index 076fa178a29..419cf1f2c43 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp @@ -71,8 +71,9 @@ WellSolverBase::WellSolverBase( string const & name, Group *WellSolverBase::createChild( string const & childKey, string const & childName ) { const auto childTypes = { keys::wellControls }; - GEOS_ERROR_IF( childKey != keys::wellControls, - PhysicsSolverBase::CatalogInterface::unknownTypeError( childKey, getDataContext(), childTypes ) ); + GEOS_ERROR_CTX_IF( childKey != keys::wellControls, + PhysicsSolverBase::CatalogInterface::unknownTypeError( childKey, getDataContext(), childTypes ), + getDataContext() ); return ®isterGroup< WellControls >( childName ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp index f362c2b9959..cddc8f1507c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp @@ -661,15 +661,15 @@ PresTempCompFracInitializationKernel:: } ); - GEOS_THROW_IF( foundNegativePres.get() == 1, + GEOS_THROW_CTX_IF( foundNegativePres.get() == 1, wellControls.getDataContext() << "Invalid well initialization, negative pressure was found.", - InputError ); - GEOS_THROW_IF( foundNegativeTemp.get() == 1, + InputError, wellControls.getDataContext() ); + GEOS_THROW_CTX_IF( foundNegativeTemp.get() == 1, wellControls.getDataContext() << "Invalid well initialization, negative temperature was found.", - InputError ); - GEOS_THROW_IF( foundInconsistentCompFrac.get() == 1, + InputError, wellControls.getDataContext() ); + GEOS_THROW_CTX_IF( foundInconsistentCompFrac.get() == 1, wellControls.getDataContext() << "Invalid well initialization, inconsistent component fractions were found.", - InputError ); + InputError, wellControls.getDataContext() ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp index 674c3868ef0..9b84735bf8b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp @@ -660,9 +660,9 @@ PresInitializationKernel:: } ); - GEOS_THROW_IF( foundNegativePressure.get() == 1, + GEOS_THROW_CTX_IF( foundNegativePressure.get() == 1, wellControls.getDataContext() << ": Invalid well initialization, negative pressure was found.", - InputError ); + InputError, wellControls.getDataContext() ); } /******************************** RateInitializationKernel ********************************/ diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SpringSlider.cpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SpringSlider.cpp index 858344be7df..d02044ab00f 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SpringSlider.cpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SpringSlider.cpp @@ -90,8 +90,10 @@ void SpringSlider< RSSOLVER_TYPE >::registerDataOnMesh( Group & meshBodies ) string & frictionLawName = subRegion.getReference< string >( viewKeyStruct::frictionLawNameString() ); frictionLawName = PhysicsSolverBase::getConstitutiveName< FrictionBase >( subRegion ); - GEOS_ERROR_IF( frictionLawName.empty(), GEOS_FMT( "{}: FrictionBase model not found on subregion {}", - this->getDataContext(), subRegion.getDataContext() ) ); + GEOS_ERROR_CTX_IF( frictionLawName.empty(), + GEOS_FMT( "{}: FrictionBase model not found on subregion {}", + this->getDataContext(), subRegion.getDataContext() ), + this->getDataContext() ); } ); } ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp index 118902e1fc2..8035864e018 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp @@ -153,11 +153,11 @@ initializePreSubGroups() bool const useMassFlow = flowSolver->getReference< integer >( CompositionalMultiphaseBase::viewKeyStruct::useMassFlagString() );; bool const useMassWell = Base::wellSolver()->template getReference< integer >( CompositionalMultiphaseWell::viewKeyStruct::useMassFlagString() ); - GEOS_THROW_IF( useMassFlow != useMassWell, - GEOS_FMT( "{}: the input flag {} must be the same in the flow and well solvers, respectively '{}' and '{}'", - this->getDataContext(), CompositionalMultiphaseBase::viewKeyStruct::useMassFlagString(), - Base::reservoirSolver()->getDataContext(), Base::wellSolver()->getDataContext() ), - InputError ); + GEOS_THROW_CTX_IF( useMassFlow != useMassWell, + GEOS_FMT( "{}: the input flag {} must be the same in the flow and well solvers, respectively '{}' and '{}'", + this->getDataContext(), CompositionalMultiphaseBase::viewKeyStruct::useMassFlagString(), + Base::reservoirSolver()->getDataContext(), Base::wellSolver()->getDataContext() ), + InputError, this->getDataContext(), Base::reservoirSolver()->getDataContext(), Base::wellSolver()->getDataContext() ); } template< typename RESERVOIR_SOLVER > diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp index 7a11c0f0b1d..d3dff318feb 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp @@ -150,10 +150,10 @@ bool validateWellPerforations( PhysicsSolverBase const * const reservoirSolver, localIndex const hasBadPerforations = MpiWrapper::max( badPerforation.first.empty() ? 0 : 1 ); - GEOS_THROW_IF( !badPerforation.first.empty(), + GEOS_THROW_CTX_IF( !badPerforation.first.empty(), GEOS_FMT( "{}: The well {} has a connection to the region {} which is not targeted by the solver", wellSolver->getDataContext(), badPerforation.first, badPerforation.second ), - std::runtime_error ); + std::runtime_error, wellSolver->getDataContext() ); return hasBadPerforations == 0; } diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp index 8c7043e66af..a90a7a301c1 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp @@ -88,11 +88,11 @@ class CoupledSolver : public PhysicsSolverBase auto const & solverName = m_names[idx()]; auto const & solverType = LvArray::system::demangleType< SolverType >(); solver = this->getParent().template getGroupPointer< SolverType >( solverName ); - GEOS_THROW_IF( solver == nullptr, + GEOS_THROW_CTX_IF( solver == nullptr, GEOS_FMT( "{}: Could not find solver '{}' of type {}", getDataContext(), solverName, solverType ), - InputError ); + InputError, getDataContext() ); GEOS_LOG_LEVEL_RANK_0( logInfo::Coupling, GEOS_FMT( "{}: found {} solver named {}", getName(), solver->getCatalogName(), solverName ) ); @@ -675,14 +675,14 @@ class CoupledSolver : public PhysicsSolverBase bool const isSequential = getNonlinearSolverParameters().couplingType() == NonlinearSolverParameters::CouplingType::Sequential; bool const usesLineSearch = getNonlinearSolverParameters().m_lineSearchAction != NonlinearSolverParameters::LineSearchAction::None; - GEOS_THROW_IF( isSequential && usesLineSearch, + GEOS_THROW_CTX_IF( isSequential && usesLineSearch, GEOS_FMT( "{}: line search is not supported by the coupled solver when {} is set to `{}`. Please set {} to `{}` to remove this error", getNonlinearSolverParameters().getWrapperDataContext( NonlinearSolverParameters::viewKeysStruct::couplingTypeString() ), NonlinearSolverParameters::viewKeysStruct::couplingTypeString(), EnumStrings< NonlinearSolverParameters::CouplingType >::toString( NonlinearSolverParameters::CouplingType::Sequential ), NonlinearSolverParameters::viewKeysStruct::lineSearchActionString(), EnumStrings< NonlinearSolverParameters::LineSearchAction >::toString( NonlinearSolverParameters::LineSearchAction::None ) ), - InputError ); + InputError, getNonlinearSolverParameters().getWrapperDataContext( NonlinearSolverParameters::viewKeysStruct::couplingTypeString() ) ); if( !isSequential ) { diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index 8fd158517c5..59778cb1255 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -270,18 +270,18 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::initializePostIni this->flowSolver()->template getReference< string_array >( PhysicsSolverBase::viewKeyStruct::targetRegionsString() ); for( size_t i = 0; i < poromechanicsTargetRegionNames.size(); ++i ) { - GEOS_THROW_IF( std::find( solidMechanicsTargetRegionNames.begin(), solidMechanicsTargetRegionNames.end(), - poromechanicsTargetRegionNames[i] ) - == solidMechanicsTargetRegionNames.end(), - GEOS_FMT( "{} {}: region {} must be a target region of {}", - getCatalogName(), this->getDataContext(), poromechanicsTargetRegionNames[i], - this->solidMechanicsSolver()->getDataContext() ), - InputError ); - GEOS_THROW_IF( std::find( flowTargetRegionNames.begin(), flowTargetRegionNames.end(), poromechanicsTargetRegionNames[i] ) - == flowTargetRegionNames.end(), - GEOS_FMT( "{} {}: region `{}` must be a target region of `{}`", - getCatalogName(), this->getDataContext(), poromechanicsTargetRegionNames[i], this->flowSolver()->getDataContext() ), - InputError ); + GEOS_THROW_CTX_IF( std::find( solidMechanicsTargetRegionNames.begin(), solidMechanicsTargetRegionNames.end(), + poromechanicsTargetRegionNames[i] ) + == solidMechanicsTargetRegionNames.end(), + GEOS_FMT( "{} {}: region {} must be a target region of {}", + getCatalogName(), this->getDataContext(), poromechanicsTargetRegionNames[i], + this->solidMechanicsSolver()->getDataContext() ), + InputError, this->getDataContext(), this->solidMechanicsSolver()->getDataContext() ); + GEOS_THROW_CTX_IF( std::find( flowTargetRegionNames.begin(), flowTargetRegionNames.end(), poromechanicsTargetRegionNames[i] ) + == flowTargetRegionNames.end(), + GEOS_FMT( "{} {}: region `{}` must be a target region of `{}`", + getCatalogName(), this->getDataContext(), poromechanicsTargetRegionNames[i], this->flowSolver()->getDataContext() ), + InputError, this->getDataContext(), this->flowSolver()->getDataContext() ); } } diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanicsConformingFractures.cpp index 858888567f3..c9f92c9c1fd 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanicsConformingFractures.cpp @@ -390,8 +390,9 @@ addTransmissibilityCouplingPattern( DomainPartition const & domain, FaceElementSubRegion const & fractureSubRegion = fractureRegion.getUniqueSubRegion< FaceElementSubRegion >(); - GEOS_ERROR_IF( !fractureSubRegion.hasWrapper( flow::pressure::key() ), - this->getDataContext() << ": The fracture subregion must contain pressure field." ); + GEOS_ERROR_CTX_IF( !fractureSubRegion.hasWrapper( flow::pressure::key() ), + this->getDataContext() << ": The fracture subregion must contain pressure field.", + this->getDataContext() ); arrayView2d< localIndex const > const elem2dToFaces = fractureSubRegion.faceList().toViewConst(); diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp index 6791bee3f49..914b07d5938 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp @@ -72,12 +72,12 @@ postInputInitialization() Group & problemManager = this->getGroupByPath( "/Problem" ); Group & physicsSolverManager = problemManager.getGroup( "Solvers" ); - GEOS_THROW_IF( !physicsSolverManager.hasGroup( m_poromechanicsSolverName ), + GEOS_THROW_CTX_IF( !physicsSolverManager.hasGroup( m_poromechanicsSolverName ), GEOS_FMT( "{}: {} solver named {} not found", getWrapperDataContext( viewKeyStruct::poromechanicsSolverNameString() ), POROMECHANICS_SOLVER::catalogName(), m_poromechanicsSolverName ), - InputError ); + InputError, getWrapperDataContext( viewKeyStruct::poromechanicsSolverNameString() ) ); m_poromechanicsSolver = &physicsSolverManager.getGroup< POROMECHANICS_SOLVER >( m_poromechanicsSolverName ); @@ -85,12 +85,12 @@ postInputInitialization() { TasksManager & tasksManager = problemManager.getGroup< TasksManager >( "Tasks" ); - GEOS_THROW_IF( !tasksManager.hasGroup( m_solidMechanicsStatisticsName ), + GEOS_THROW_CTX_IF( !tasksManager.hasGroup( m_solidMechanicsStatisticsName ), GEOS_FMT( "{}: {} task named {} not found", getWrapperDataContext( viewKeyStruct::solidMechanicsStatisticsNameString() ), SolidMechanicsStatistics::catalogName(), m_solidMechanicsStatisticsName ), - InputError ); + InputError, getWrapperDataContext( viewKeyStruct::solidMechanicsStatisticsNameString() ) ); m_solidMechanicsStatistics = &tasksManager.getGroup< SolidMechanicsStatistics >( m_solidMechanicsStatisticsName ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index c3425fa2d3a..18e30c520ae 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -128,8 +128,10 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER string & hydraulicApertureModelName = subRegion.getReference< string >( viewKeyStruct::hydraulicApertureRelationNameString() ); hydraulicApertureModelName = PhysicsSolverBase::getConstitutiveName< constitutive::HydraulicApertureBase >( subRegion ); - GEOS_ERROR_IF( hydraulicApertureModelName.empty(), GEOS_FMT( "{}: HydraulicApertureBase model not found on subregion {}", - this->getDataContext(), subRegion.getDataContext() ) ); + GEOS_ERROR_CTX_IF( hydraulicApertureModelName.empty(), + GEOS_FMT( "{}: HydraulicApertureBase model not found on subregion {}", + this->getDataContext(), subRegion.getDataContext() ), + this->getDataContext() ); } } @@ -138,10 +140,10 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER { Base::initializePreSubGroups(); - GEOS_THROW_IF( m_stabilizationType == stabilization::StabilizationType::Local, - this->getWrapperDataContext( viewKeyStruct::stabilizationTypeString() ) << - ": Local stabilization has been temporarily disabled", - InputError ); + GEOS_THROW_CTX_IF( m_stabilizationType == stabilization::StabilizationType::Local, + this->getWrapperDataContext( viewKeyStruct::stabilizationTypeString() ) << + ": Local stabilization has been temporarily disabled", + InputError, this->getWrapperDataContext( viewKeyStruct::stabilizationTypeString() ) ); DomainPartition & domain = this->template getGroupByPath< DomainPartition >( "/Problem/domain" ); @@ -156,17 +158,17 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER { string & porousName = subRegion.getReference< string >( viewKeyStruct::porousMaterialNamesString() ); porousName = this->template getConstitutiveName< constitutive::CoupledSolidBase >( subRegion ); - GEOS_THROW_IF( porousName.empty(), - GEOS_FMT( "{} {} : Solid model not found on subregion {}", - this->getCatalogName(), this->getDataContext().toString(), subRegion.getName() ), - InputError ); + GEOS_THROW_CTX_IF( porousName.empty(), + GEOS_FMT( "{} {} : Solid model not found on subregion {}", + this->getCatalogName(), this->getDataContext().toString(), subRegion.getName() ), + InputError, this->getDataContext() ); string & porosityModelName = subRegion.getReference< string >( constitutive::CoupledSolidBase::viewKeyStruct::porosityModelNameString() ); porosityModelName = this->template getConstitutiveName< constitutive::PorosityBase >( subRegion ); - GEOS_THROW_IF( porosityModelName.empty(), - GEOS_FMT( "{} {} : Porosity model not found on subregion {}", - this->getCatalogName(), this->getDataContext().toString(), subRegion.getName() ), - InputError ); + GEOS_THROW_CTX_IF( porosityModelName.empty(), + GEOS_FMT( "{} {} : Porosity model not found on subregion {}", + this->getCatalogName(), this->getDataContext().toString(), subRegion.getName() ), + InputError, this->getDataContext() ); if( subRegion.hasField< fields::poromechanics::bulkDensity >() ) { diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index cf65783b783..3f577024ca7 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -110,11 +110,11 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::initializePostIn this->flowSolver()->template getReference< string_array >( PhysicsSolverBase::viewKeyStruct::targetRegionsString() ); for( size_t i = 0; i < poromechanicsTargetRegionNames.size(); ++i ) { - GEOS_THROW_IF( std::find( flowTargetRegionNames.begin(), flowTargetRegionNames.end(), poromechanicsTargetRegionNames[i] ) + GEOS_THROW_CTX_IF( std::find( flowTargetRegionNames.begin(), flowTargetRegionNames.end(), poromechanicsTargetRegionNames[i] ) == flowTargetRegionNames.end(), GEOS_FMT( "{} {}: region `{}` must be a target region of `{}`", getCatalogName(), this->getDataContext(), poromechanicsTargetRegionNames[i], this->flowSolver()->getDataContext() ), - InputError ); + InputError, this->getDataContext(), this->flowSolver()->getDataContext() ); } } diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index d29de6ab0bd..7732adfebb4 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -389,8 +389,9 @@ addTransmissibilityCouplingPattern( DomainPartition const & domain, FaceElementSubRegion const & fractureSubRegion = fractureRegion.getUniqueSubRegion< FaceElementSubRegion >(); - GEOS_ERROR_IF( !fractureSubRegion.hasWrapper( flow::pressure::key() ), - this->getDataContext() << ": The fracture subregion must contain pressure field." ); + GEOS_ERROR_CTX_IF( !fractureSubRegion.hasWrapper( flow::pressure::key() ), + this->getDataContext() << ": The fracture subregion must contain pressure field.", + this->getDataContext() ); arrayView2d< localIndex const > const elem2dToFaces = fractureSubRegion.faceList().toViewConst(); diff --git a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp index b51a65a0ad0..2e84ad8a584 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp @@ -125,8 +125,10 @@ void PhaseFieldDamageFEM::registerDataOnMesh( Group & meshBodies ) string & solidMaterialName = subRegion.getReference< string >( viewKeyStruct::solidModelNamesString() ); solidMaterialName = PhysicsSolverBase::getConstitutiveName< SolidBase >( subRegion ); - GEOS_ERROR_IF( solidMaterialName.empty(), GEOS_FMT( "{}: SolidBase model not found on subregion {}", - getDataContext(), subRegion.getName() ) ); + GEOS_ERROR_CTX_IF( solidMaterialName.empty(), + GEOS_FMT( "{}: SolidBase model not found on subregion {}", + getDataContext(), subRegion.getName() ), + getDataContext() ); } ); } ); diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index ec4b674853b..f33f03c0b46 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -243,8 +243,10 @@ void SolidMechanicsLagrangianFEM::setConstitutiveNamesCallSuper( ElementSubRegio string & solidMaterialName = subRegion.getReference< string >( viewKeyStruct::solidMaterialNamesString() ); solidMaterialName = PhysicsSolverBase::getConstitutiveName< SolidBase >( subRegion ); - GEOS_ERROR_IF( solidMaterialName.empty(), GEOS_FMT( "{}: SolidBase model not found on subregion {}", - getDataContext(), subRegion.getDataContext() ) ); + GEOS_ERROR_CTX_IF( solidMaterialName.empty(), + GEOS_FMT( "{}: SolidBase model not found on subregion {}", + getDataContext(), subRegion.getDataContext() ), + getDataContext() ); } @@ -737,15 +739,18 @@ void SolidMechanicsLagrangianFEM::applyDisplacementBCImplicit( real64 const time "\nWarning!" "\n{} {}: There is no displacement boundary condition applied to this problem in the {} direction. \n" "The problem may be ill-posed.\n"; - GEOS_WARNING_IF( isDisplacementBCAppliedGlobal[0] == 0, // target set is empty - GEOS_FMT( bcLogMessage, - getCatalogName(), getDataContext(), 'x' ) ); - GEOS_WARNING_IF( isDisplacementBCAppliedGlobal[1] == 0, // target set is empty - GEOS_FMT( bcLogMessage, - getCatalogName(), getDataContext(), 'y' ) ); - GEOS_WARNING_IF( isDisplacementBCAppliedGlobal[2] == 0, // target set is empty - GEOS_FMT( bcLogMessage, - getCatalogName(), getDataContext(), 'z' ) ); + GEOS_WARNING_CTX_IF( isDisplacementBCAppliedGlobal[0] == 0, // target set is empty + GEOS_FMT( bcLogMessage, + getCatalogName(), getDataContext(), 'x' ), + getDataContext() ); + GEOS_WARNING_CTX_IF( isDisplacementBCAppliedGlobal[1] == 0, // target set is empty + GEOS_FMT( bcLogMessage, + getCatalogName(), getDataContext(), 'y' ), + getDataContext() ); + GEOS_WARNING_CTX_IF( isDisplacementBCAppliedGlobal[2] == 0, // target set is empty + GEOS_FMT( bcLogMessage, + getCatalogName(), getDataContext(), 'z' ), + getDataContext() ); } } diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp index 483a1bdaa7a..3bb0d30e58e 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp @@ -306,8 +306,8 @@ void SolidMechanicsMPM::postInputInitialization() // Throw error if boundary conditions are incorrectly specified GEOS_ERROR_IF( m_boundaryConditionTypes.size() != 6 && m_boundaryConditionTypes.size() > 0, - "boundaryConditionTypes must be of length 6. " - "The 6 entries correspond to BCs on the x-, x+, y-, y+, z- and z+ faces." ); + "boundaryConditionTypes must be of length 6. " + "The 6 entries correspond to BCs on the x-, x+, y-, y+, z- and z+ faces." ); // Initialize boundary condition types if they're not specified by the user if( m_boundaryConditionTypes.size() == 0 ) @@ -1980,7 +1980,8 @@ void SolidMechanicsMPM::setParticlesConstitutiveNames( ParticleSubRegionBase & s string & solidMaterialName = subRegion.getReference< string >( viewKeyStruct::solidMaterialNamesString() ); solidMaterialName = PhysicsSolverBase::getConstitutiveName< SolidBase >( subRegion ); - GEOS_ERROR_IF( solidMaterialName.empty(), GEOS_FMT( "SolidBase model not found on subregion {}", subRegion.getName() ) ); + GEOS_ERROR_IF( solidMaterialName.empty(), + GEOS_FMT( "SolidBase model not found on subregion {}", subRegion.getName() ) ); } real64 SolidMechanicsMPM::computeNeighborList( ParticleManager & particleManager ) diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp index 2c8edbb2762..13bcc92aaf0 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp @@ -64,10 +64,10 @@ void SolidMechanicsStateReset::postInputInitialization() Group & problemManager = this->getGroupByPath( "/Problem" ); Group & physicsSolverManager = problemManager.getGroup( "Solvers" ); - GEOS_THROW_IF( !physicsSolverManager.hasGroup( m_solidSolverName ), + GEOS_THROW_CTX_IF( !physicsSolverManager.hasGroup( m_solidSolverName ), GEOS_FMT( "Task {}: physics solver named {} not found", getDataContext(), m_solidSolverName ), - InputError ); + InputError, getDataContext() ); m_solidSolver = &physicsSolverManager.getGroup< SolidMechanicsLagrangianFEM >( m_solidSolverName ); } diff --git a/src/coreComponents/physicsSolvers/solidMechanics/contact/ContactSolverBase.cpp b/src/coreComponents/physicsSolvers/solidMechanics/contact/ContactSolverBase.cpp index b2766f5526b..93dff9987b8 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/contact/ContactSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/contact/ContactSolverBase.cpp @@ -261,8 +261,10 @@ void ContactSolverBase::setConstitutiveNamesCallSuper( ElementSubRegionBase & su string & frictionLawName = subRegion.getReference< string >( viewKeyStruct::frictionLawNameString() ); frictionLawName = PhysicsSolverBase::getConstitutiveName< FrictionBase >( subRegion ); - GEOS_ERROR_IF( frictionLawName.empty(), GEOS_FMT( "{}: FrictionBase model not found on subregion {}", - getDataContext(), subRegion.getDataContext() ) ); + GEOS_ERROR_CTX_IF( frictionLawName.empty(), + GEOS_FMT( "{}: FrictionBase model not found on subregion {}", + getDataContext(), subRegion.getDataContext() ), + getDataContext() ); } } diff --git a/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp index aac23546d9c..a4c0ef7bce5 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp @@ -1732,7 +1732,8 @@ void SolidMechanicsLagrangeContact::assembleStabilization( MeshLevel const & mes SurfaceElementRegion const & fractureRegion = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); FaceElementSubRegion const & fractureSubRegion = fractureRegion.getUniqueSubRegion< FaceElementSubRegion >(); - GEOS_ERROR_IF( !fractureSubRegion.hasField< contact::traction >(), "The fracture subregion must contain traction field." ); + GEOS_ERROR_IF( !fractureSubRegion.hasField< contact::traction >(), + "The fracture subregion must contain traction field." ); arrayView2d< localIndex const > const elem2dToFaces = fractureSubRegion.faceList().toViewConst(); // Get the state of fracture elements @@ -1825,8 +1826,9 @@ void SolidMechanicsLagrangeContact::assembleStabilization( MeshLevel const & mes realNodes++; } } - GEOS_ERROR_IF( realNodes != 2, - getDataContext() << ": An edge shared by two fracture elements must have 2 nodes." ); + GEOS_ERROR_CTX_IF( realNodes != 2, + getDataContext() << ": An edge shared by two fracture elements must have 2 nodes.", + getDataContext() ); edge.resize( realNodes ); // Compute nodal area factor diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp index d86483c75bc..ba83026ff67 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp @@ -244,17 +244,20 @@ void SurfaceGenerator::postInputInitialization() { static const std::set< integer > binaryOptions = { 0, 1 }; - GEOS_ERROR_IF( binaryOptions.count( m_isPoroelastic ) == 0, - getWrapperDataContext( viewKeyStruct::isPoroelasticString() ) << - ": option can be either 0 (false) or 1 (true)" ); - - GEOS_ERROR_IF( binaryOptions.count( m_nodeBasedSIF ) == 0, - getWrapperDataContext( viewKeyStruct::nodeBasedSIFString() ) << - ": option can be either 0 (false) or 1 (true)" ); - - GEOS_ERROR_IF( binaryOptions.count( m_mpiCommOrder ) == 0, - getWrapperDataContext( viewKeyStruct::mpiCommOrderString() ) << - ": option can be either 0 (false) or 1 (true)" ); + GEOS_ERROR_CTX_IF( binaryOptions.count( m_isPoroelastic ) == 0, + getWrapperDataContext( viewKeyStruct::isPoroelasticString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::isPoroelasticString() ) ); + + GEOS_ERROR_CTX_IF( binaryOptions.count( m_nodeBasedSIF ) == 0, + getWrapperDataContext( viewKeyStruct::nodeBasedSIFString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::nodeBasedSIFString() ) ); + + GEOS_ERROR_CTX_IF( binaryOptions.count( m_mpiCommOrder ) == 0, + getWrapperDataContext( viewKeyStruct::mpiCommOrderString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::mpiCommOrderString() ) ); } SurfaceGenerator::~SurfaceGenerator() @@ -824,7 +827,9 @@ void SurfaceGenerator::synchronizeTipSets ( FaceManager & faceManager, { localIndex const parentNodeIndex = parentNodeIndices[nodeIndex]; - GEOS_ERROR_IF( parentNodeIndex == -1, getDataContext() << ": parentNodeIndex should not be -1" ); + GEOS_ERROR_CTX_IF( parentNodeIndex == -1, + getDataContext() << ": parentNodeIndex should not be -1", + getDataContext() ); m_tipNodes.remove( parentNodeIndex ); } @@ -849,7 +854,9 @@ void SurfaceGenerator::synchronizeTipSets ( FaceManager & faceManager, { localIndex const parentEdgeIndex = parentEdgeIndices[edgeIndex]; - GEOS_ERROR_IF( parentEdgeIndex == -1, getDataContext() << ": parentEdgeIndex should not be -1" ); + GEOS_ERROR_CTX_IF( parentEdgeIndex == -1, + getDataContext() << ": parentEdgeIndex should not be -1", + getDataContext() ); m_tipEdges.remove( parentEdgeIndex ); for( localIndex const faceIndex : edgeToFaceMap[ parentEdgeIndex ] ) @@ -882,7 +889,9 @@ void SurfaceGenerator::synchronizeTipSets ( FaceManager & faceManager, for( localIndex const faceIndex : receivedObjects.newFaces ) { localIndex const parentFaceIndex = parentFaceIndices[faceIndex]; - GEOS_ERROR_IF( parentFaceIndex == -1, getDataContext() << ": parentFaceIndex should not be -1" ); + GEOS_ERROR_CTX_IF( parentFaceIndex == -1, + getDataContext() << ": parentFaceIndex should not be -1", + getDataContext() ); m_trailingFaces.insert( parentFaceIndex ); m_tipFaces.remove( parentFaceIndex ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp index a5304f34aae..44edb2084d6 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp @@ -189,9 +189,10 @@ void AcousticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLev ElementRegionBase &, CellElementSubRegion & elementSubRegion ) { - GEOS_THROW_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, - getDataContext() << ": Invalid type of element, the acoustic solver is designed for hexahedral meshes only (C3D8) ", - InputError ); + GEOS_THROW_CTX_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, + getDataContext() << ": Invalid type of element, the acoustic solver is designed for hexahedral meshes only (C3D8) ", + InputError, + getDataContext() ); arrayView2d< localIndex const > const elemsToFaces = elementSubRegion.faceList(); arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes = elementSubRegion.nodeList(); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index 0fc1b67c21b..408e2d6d7cd 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -183,9 +183,9 @@ void AcousticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseM ElementRegionBase &, CellElementSubRegion & elementSubRegion ) { - GEOS_THROW_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, - getDataContext() << ": Invalid type of element, the acoustic solver is designed for hexahedral meshes only (C3D8), using the SEM formulation", - InputError ); + GEOS_THROW_CTX_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, + getDataContext() << ": Invalid type of element, the acoustic solver is designed for hexahedral meshes only (C3D8), using the SEM formulation", + InputError, getDataContext() ); arrayView2d< localIndex const > const elemsToFaces = elementSubRegion.faceList(); arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes = elementSubRegion.nodeList(); @@ -254,9 +254,9 @@ void AcousticWaveEquationSEM::addSourceToRightHandSide( integer const & cycleNum arrayView1d< localIndex const > const sourceIsAccessible = m_sourceIsAccessible.toViewConst(); arrayView2d< real32 const > const sourceValue = m_sourceValue.toViewConst(); - GEOS_THROW_IF( cycleNumber > sourceValue.size( 0 ), - getDataContext() << ": Too many steps compared to array size", - std::runtime_error ); + GEOS_THROW_CTX_IF( cycleNumber > sourceValue.size( 0 ), + getDataContext() << ": Too many steps compared to array size", + std::runtime_error, getDataContext() ); forAll< EXEC_POLICY >( sourceConstants.size( 0 ), [=] GEOS_HOST_DEVICE ( localIndex const isrc ) { if( sourceIsAccessible[isrc] == 1 ) @@ -966,14 +966,14 @@ real64 AcousticWaveEquationSEM::explicitStepForward( real64 const & time_n, } std::ofstream wf( fileName, std::ios::out | std::ios::binary ); - GEOS_THROW_IF( !wf, - getDataContext() << ": Could not open file "<< fileName << " for writing", - InputError ); + GEOS_THROW_CTX_IF( !wf, + getDataContext() << ": Could not open file "<< fileName << " for writing", + InputError, getDataContext() ); wf.write( (char *)&p_n[0], p_n.size()*sizeof( real32 ) ); wf.close( ); - GEOS_THROW_IF( !wf.good(), - getDataContext() << ": An error occured while writing "<< fileName, - InputError ); + GEOS_THROW_CTX_IF( !wf.good(), + getDataContext() << ": An error occured while writing "<< fileName, + InputError, getDataContext() ); } } @@ -1034,9 +1034,9 @@ real64 AcousticWaveEquationSEM::explicitStepBackward( real64 const & time_n, int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); std::string fileName = GEOS_FMT( "lifo/rank_{:05}/pressure_forward_{:06}_{:08}.dat", rank, m_shotIndex, cycleNumber ); std::ifstream wf( fileName, std::ios::in | std::ios::binary ); - GEOS_THROW_IF( !wf, - getDataContext() << ": Could not open file "<< fileName << " for reading", - InputError ); + GEOS_THROW_CTX_IF( !wf, + getDataContext() << ": Could not open file "<< fileName << " for reading", + InputError, getDataContext() ); p_forward.move( LvArray::MemorySpace::host, true ); wf.read( (char *)&p_forward[0], p_forward.size()*sizeof( real32 ) ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp index 1ec050456db..c5bc38046eb 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp @@ -240,9 +240,9 @@ void ElasticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLeve CellElementSubRegion & elementSubRegion ) { - GEOS_THROW_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, + GEOS_THROW_CTX_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, getDataContext() << ": Invalid type of element, the elastic solver is designed for hexahedral meshes only (C3D8) ", - InputError ); + InputError, getDataContext() ); arrayView2d< localIndex const > const elemsToFaces = elementSubRegion.faceList(); arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes = elementSubRegion.nodeList(); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index 43291bee75e..f0d95aba768 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -261,9 +261,9 @@ void ElasticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseMe CellElementSubRegion & elementSubRegion ) { - GEOS_THROW_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, + GEOS_THROW_CTX_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, getDataContext() << ": Invalid type of element, the elastic solver is designed for hexahedral meshes only (C3D8) ", - InputError ); + InputError, getDataContext() ); arrayView2d< localIndex const > const elemsToFaces = elementSubRegion.faceList(); arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes = elementSubRegion.nodeList(); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp index 353bf20bbe4..17676ec22fa 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp @@ -318,9 +318,9 @@ void WaveSolverBase::postInputInitialization() { counter++; } ); - GEOS_THROW_IF( counter > 1, + GEOS_THROW_CTX_IF( counter > 1, getDataContext() << ": One single PML field specification is allowed", - InputError ); + InputError, getDataContext() ); m_usePML = counter; @@ -342,10 +342,10 @@ void WaveSolverBase::postInputInitialization() m_useDAS == WaveSolverUtils::DASType::strainIntegration ? "strain integration" : "displacement difference" ) ); GEOS_ERROR_IF( m_linearDASGeometry.size( 1 ) != 3, - "Invalid number of geometry parameters for the linear DAS fiber. Three parameters are required: dip, azimuth, gauge length" ); + "Invalid number of geometry parameters for the linear DAS fiber. Three parameters are required: dip, azimuth, gauge length" ); GEOS_ERROR_IF( m_linearDASGeometry.size( 0 ) != m_receiverCoordinates.size( 0 ), - "Invalid number of geometry parameters instances for the linear DAS fiber. It should match the number of receivers." ); + "Invalid number of geometry parameters instances for the linear DAS fiber. It should match the number of receivers." ); m_linearDASVectorX.resize( m_linearDASGeometry.size( 0 ) ); m_linearDASVectorY.resize( m_linearDASGeometry.size( 0 ) ); @@ -442,9 +442,9 @@ localIndex WaveSolverBase::getNumNodesPerElem() FiniteElementDiscretization const * const feDiscretization = feDiscretizationManager.getGroupPointer< FiniteElementDiscretization >( m_discretizationName ); - GEOS_THROW_IF( feDiscretization == nullptr, + GEOS_THROW_CTX_IF( feDiscretization == nullptr, getDataContext() << ": FE discretization not found: " << m_discretizationName, - InputError ); + InputError, getDataContext() ); localIndex numNodesPerElem = 0; forDiscretizationOnMeshTargets( domain.getMeshBodies(), diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp index 530f7e3b8e0..e2f32a87ed9 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp @@ -113,7 +113,8 @@ struct WaveSolverUtils } ); localIndex const total = MpiWrapper::sum( count.get() ); - GEOS_ERROR_IF( nReceivers != total, GEOS_FMT( ": Invalid distribution of receivers: nReceivers={} != MPI::sum={}.", nReceivers, total ) ); + GEOS_ERROR_IF( nReceivers != total, + GEOS_FMT( ": Invalid distribution of receivers: nReceivers={} != MPI::sum={}.", nReceivers, total ) ); } /** From 6de2c6abc5cc84dc440e96561f658a8130749bed Mon Sep 17 00:00:00 2001 From: amandinehry Date: Tue, 27 May 2025 09:21:15 +0200 Subject: [PATCH 019/173] Latest update for exception handling (try/catch in main) --- src/main/main.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/main.cpp b/src/main/main.cpp index 4673f2e228a..7d48e379d6a 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -71,12 +71,14 @@ int main( int argc, char *argv[] ) // A NotAnError is thrown if "-h" or "--help" option is used. catch( NotAnError const & ) { + errorLogger.write( errorLogger.currentErrorMsg() ); basicCleanup(); return 0; } catch( std::exception const & e ) { GEOS_LOG( e.what() ); + errorLogger.write( errorLogger.currentErrorMsg() ); LvArray::system::callErrorHandler(); basicCleanup(); std::abort(); From 5830aeea9287ddc527b2e4e9f7f7255953e32796 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Tue, 27 May 2025 09:27:23 +0200 Subject: [PATCH 020/173] Add priority to the error message into the yaml file --- .../common/logger/ErrorHandling.cpp | 24 +++++++---- .../common/logger/ErrorHandling.hpp | 40 ++++++++++++++----- .../dataRepository/DataContext.cpp | 5 ++- .../dataRepository/DataContext.hpp | 19 +++++++-- .../dataRepository/GroupContext.cpp | 5 ++- .../dataRepository/GroupContext.hpp | 2 +- .../dataRepository/WrapperContext.cpp | 5 ++- .../dataRepository/WrapperContext.hpp | 2 +- 8 files changed, 73 insertions(+), 29 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 23e4a190183..1e9f038b22d 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -56,9 +56,9 @@ ErrorLogger::ErrorLogger() } } -void ErrorLogger::ErrorMsg::addContextInfo( std::map< std::string, std::string > && info ) +void ErrorLogger::ErrorMsg::addContextInfoImpl( ErrorLogger::ContextInfo && ctxInfo ) { - m_contextsInfo.emplace_back( std::move( info ) ); + m_contextsInfo.emplace_back( std::move( ctxInfo ) ); } void ErrorLogger::ErrorMsg::addRankInfo( int rank ) @@ -133,7 +133,7 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) //const std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); if( yamlFile.is_open() ) { - yamlFile << g_level1Start << "type: " << errorLogger.toString( errorMsg.m_type ) << "\n"; + yamlFile << "\n" << g_level1Start << "type: " << errorLogger.toString( errorMsg.m_type ) << "\n"; yamlFile << g_level1Next << "rank: "; for( size_t i = 0; i < errorMsg.m_ranksInfo.size(); i++ ) { @@ -148,18 +148,26 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) //const for( size_t i = 0; i < errorMsg.m_contextsInfo.size(); i++ ) { bool isFirst = true; - for( auto const & [key, value] : errorMsg.m_contextsInfo[i] ) + for( auto const & [key, value] : errorMsg.m_contextsInfo[i].m_ctxInfo ) { if( isFirst ) { - yamlFile << g_level3Start << key << ": " << value << "\n"; - isFirst = false; + yamlFile << g_level3Start << key << ": " << value << "\n"; + isFirst = false; } else { - yamlFile << g_level3Next << key << ": " << value << "\n"; + yamlFile << g_level3Next << key << ": " << value << "\n"; } } + if( isFirst ) + { + yamlFile << g_level3Start << "priority: " << errorMsg.m_contextsInfo[i].m_priority << "\n"; + } + else + { + yamlFile << g_level3Next << "priority: " << errorMsg.m_contextsInfo[i].m_priority << "\n"; + } } } @@ -177,7 +185,7 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) //const } yamlFile.flush(); - GEOS_LOG( GEOS_FMT( "The error file {} was created successfully.", m_filename ) ); + GEOS_LOG( GEOS_FMT( "The error file {} was appended.", m_filename ) ); } else { diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index a153512969e..87fba3ecc76 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -54,6 +54,21 @@ class ErrorLogger Warning }; + // TODO: changer le nom + // Solution possible: + // - Ne plus communiquer des contexts info avec des maps mais avec la struct ContextInfo + // - Ajouter une méthode avec le design pattern builder qui reglerait la priorité + // Il faudrait un couple de méthodes addContextInfo(): + // un qui prendrait DataCOntext et l'autre ContextInfo prélablement buildé + struct ContextInfo + { + std::map< std::string, std::string > m_ctxInfo; + integer m_priority = 0; + + ContextInfo & setPriority( integer priority ) + { m_priority = priority; return *this; } + }; + /** * @brief Struct to define the error/warning message * @@ -65,9 +80,11 @@ class ErrorLogger std::string m_file; integer m_line; std::vector< int > m_ranksInfo; - std::vector< std::map< std::string, std::string > > m_contextsInfo; + std::vector< ContextInfo > m_contextsInfo; std::vector< std::string > m_sourceCallStack; + int n = 0; + /** * @brief Construct a new Error Msg object * @@ -79,7 +96,7 @@ class ErrorLogger * * @param msgType The type of the message (error or warning) * @param msgContent The error/warning message content - * @param msgFile The file name where the error occured + * @param msgFile The file name where the error occcured * @param msgLine The line where the error occured */ ErrorMsg( MsgType msgType, std::string msgContent, std::string msgFile, integer msgLine ) @@ -118,12 +135,7 @@ class ErrorLogger */ ErrorMsg & setType( MsgType msgType ); - /** - * @brief Add contextual information about the error/warning message to the ErrorMsg structure - * - * @param info DataContext information stored into a map - */ - void addContextInfo( std::map< std::string, std::string > && info ); + // void addContextInfo( std::map< std::string, std::string > && info ); template< typename ... Args > void addContextInfo( Args && ... args ); @@ -136,6 +148,14 @@ class ErrorLogger * @param ossStackTrace stack trace information */ void addCallStackInfo( std::string const & ossStackTrace ); + +private: + /** + * @brief Add contextual information about the error/warning message to the ErrorMsg structure + * + * @param info DataContext information stored into a map + */ + void addContextInfoImpl( ContextInfo && ctxInfo ); }; /** @@ -174,10 +194,12 @@ class ErrorLogger extern ErrorLogger errorLogger; +// >TODO : Priorité normale 0 puis décroître mais possibilité d'aller à 1, 2, ... +// exemple getGroup() à 0 et tout ce qui throw à cause de getGroup() > 0 template< typename ... Args > void ErrorLogger::ErrorMsg::addContextInfo( Args && ... args ) { - ( addContextInfo( args.getContextInfo() ), ... ); + ( this->addContextInfoImpl( ContextInfo( args ) ), ... ); } } /* namespace geos */ diff --git a/src/coreComponents/dataRepository/DataContext.cpp b/src/coreComponents/dataRepository/DataContext.cpp index 4b92e88803e..4bfe15c2ff0 100644 --- a/src/coreComponents/dataRepository/DataContext.cpp +++ b/src/coreComponents/dataRepository/DataContext.cpp @@ -108,13 +108,14 @@ string DataFileContext::toString() const } } -std::map< std::string, std::string > DataFileContext::getContextInfo() const +ErrorLogger::ContextInfo DataFileContext::getContextInfo() const { std::map contextInfo; contextInfo["inputFile"] = m_filePath; contextInfo["inputFileLine"] = to_string( m_line ); + ErrorLogger::ContextInfo ctxInfo{ contextInfo }; - return contextInfo; + return ctxInfo; } DataContext::ToStringInfo DataFileContext::getToStringInfo() const diff --git a/src/coreComponents/dataRepository/DataContext.hpp b/src/coreComponents/dataRepository/DataContext.hpp index dc1bb5a5b72..540c0ddafbb 100644 --- a/src/coreComponents/dataRepository/DataContext.hpp +++ b/src/coreComponents/dataRepository/DataContext.hpp @@ -65,7 +65,18 @@ class DataContext * * @return std::map< std::string, std::string > */ - virtual std::map< std::string, std::string > getContextInfo() const = 0; + // virtual std::map< std::string, std::string > getContextInfo() const = 0; + + virtual ErrorLogger::ContextInfo getContextInfo() const = 0; + + /** + * @brief Conversion operator to ErrorLogger::ContextInfo + * + * @return ErrorLogger::ContextInfo + */ + explicit operator ErrorLogger::ContextInfo() const { + return getContextInfo(); + } /** * @return Get the target object name @@ -165,7 +176,7 @@ class DataFileContext final : public DataContext /** * @return a map containing contextual information, including the file name and the line number */ - std::map< std::string, std::string > getContextInfo() const override; + ErrorLogger::ContextInfo getContextInfo() const override; /** * @return the type name in the source file (XML node tag name / attribute name). @@ -261,7 +272,7 @@ class DataFileContext final : public DataContext __msgoss.str(), \ __FILE__, \ __LINE__ ); \ - msgStruct.addContextInfo( dataContext.getContextInfo() ); \ + msgStruct.addContextInfo( dataContext ); \ msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ errorLogger.write( msgStruct ); \ LvArray::system::callErrorHandler(); \ @@ -285,7 +296,7 @@ class DataFileContext final : public DataContext __msgoss.str(), \ __FILE__, \ __LINE__ ); \ - msgStruct.addContextInfo( dataContext.getContextInfo() ); \ + msgStruct.addContextInfo( dataContext ); \ msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ errorLogger.write( msgStruct ); \ } \ diff --git a/src/coreComponents/dataRepository/GroupContext.cpp b/src/coreComponents/dataRepository/GroupContext.cpp index 4b693d41e3c..2a3d2237f7a 100644 --- a/src/coreComponents/dataRepository/GroupContext.cpp +++ b/src/coreComponents/dataRepository/GroupContext.cpp @@ -54,12 +54,13 @@ string GroupContext::toString() const return path.str(); } -std::map< std::string, std::string > GroupContext::getContextInfo() const +ErrorLogger::ContextInfo GroupContext::getContextInfo() const { std::map contextInfo; contextInfo["dataPath"] = toString(); + ErrorLogger::ContextInfo ctxInfo{ contextInfo }; - return contextInfo; + return ctxInfo; } DataContext::ToStringInfo GroupContext::getToStringInfo() const diff --git a/src/coreComponents/dataRepository/GroupContext.hpp b/src/coreComponents/dataRepository/GroupContext.hpp index 98259193a92..21d15e4613b 100644 --- a/src/coreComponents/dataRepository/GroupContext.hpp +++ b/src/coreComponents/dataRepository/GroupContext.hpp @@ -72,7 +72,7 @@ class GroupContext : public DataContext /** * @return a map containing contextual information, including the targetName of the DataContext */ - std::map< std::string, std::string > getContextInfo() const override; + ErrorLogger::ContextInfo getContextInfo() const override; /** * @copydoc DataContext::getToStringInfo() diff --git a/src/coreComponents/dataRepository/WrapperContext.cpp b/src/coreComponents/dataRepository/WrapperContext.cpp index 0cfdfae290e..ec4fae1fdb0 100644 --- a/src/coreComponents/dataRepository/WrapperContext.cpp +++ b/src/coreComponents/dataRepository/WrapperContext.cpp @@ -38,12 +38,13 @@ string WrapperContext::toString() const GEOS_FMT( "{}/{}", m_group.getDataContext().toString(), m_typeName ); } -std::map< std::string, std::string > WrapperContext::getContextInfo() const +ErrorLogger::ContextInfo WrapperContext::getContextInfo() const { std::map contextInfo; contextInfo["dataPath"] = toString(); + ErrorLogger::ContextInfo ctxInfo{ contextInfo }; - return contextInfo; + return ctxInfo; } } /* namespace dataRepository */ diff --git a/src/coreComponents/dataRepository/WrapperContext.hpp b/src/coreComponents/dataRepository/WrapperContext.hpp index 855cf24f1cd..7e5208c7687 100644 --- a/src/coreComponents/dataRepository/WrapperContext.hpp +++ b/src/coreComponents/dataRepository/WrapperContext.hpp @@ -57,7 +57,7 @@ class WrapperContext final : public GroupContext /** * @return a map containing contextual information, including the targetName of the DataContext */ - std::map< std::string, std::string > getContextInfo() const override; + ErrorLogger::ContextInfo getContextInfo() const override; }; From 2b27c41e429fce4f182e52fafe0200ab9940b02f Mon Sep 17 00:00:00 2001 From: amandinehry Date: Tue, 27 May 2025 09:30:07 +0200 Subject: [PATCH 021/173] Update of the commit named "latest update for exception handling (try/catch in main)": remove useless try/catch --- .../dataRepository/GeosxState.cpp | 232 ---- src/coreComponents/dataRepository/Logger.hpp | 625 --------- .../mainInterface/ProblemManager.cpp | 1119 +++++++---------- 3 files changed, 481 insertions(+), 1495 deletions(-) delete mode 100644 src/coreComponents/dataRepository/GeosxState.cpp delete mode 100644 src/coreComponents/dataRepository/Logger.hpp diff --git a/src/coreComponents/dataRepository/GeosxState.cpp b/src/coreComponents/dataRepository/GeosxState.cpp deleted file mode 100644 index cd2495cd4d6..00000000000 --- a/src/coreComponents/dataRepository/GeosxState.cpp +++ /dev/null @@ -1,232 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 TotalEnergies - * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2023-2024 Chevron - * Copyright (c) 2019- GEOS/GEOSX Contributors - * All rights reserved - * - * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. - * ------------------------------------------------------------------------------------------------------------ - */ - -// Source includes -#include "GeosxState.hpp" -#include "dataRepository/Utilities.hpp" -#include "mainInterface/ProblemManager.hpp" -#include "mainInterface/initialization.hpp" -#include "mesh/mpiCommunications/CommunicationTools.hpp" -#include "common/Timer.hpp" - -// TPL includes -#include - -#if defined( GEOS_USE_CALIPER ) - #include -#endif - -// System includes -#include - -namespace geos -{ - -GeosxState * currentGlobalState = nullptr; - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -GeosxState & getGlobalState() -{ - GEOS_ERROR_IF( currentGlobalState == nullptr, - "The state has not been created." ); - - return *currentGlobalState; -} - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -string durationToString( std::chrono::system_clock::duration const duration ) -{ - // If we want to print HH::MM::SS (maybe in addition to seconds-only): - // return GEOS_FMT( "{:%T}", duration ); - double const seconds = std::chrono::duration_cast< std::chrono::milliseconds >( duration ).count() / 1000.0; - return GEOS_FMT( "{:>20.3f}s", seconds ); -} - -std::ostream & operator<<( std::ostream & os, State const state ) -{ - if( state == State::UNINITIALIZED ) - { - return os << "State::UNINITIALIZED"; - } - if( state == State::INITIALIZED ) - { - return os << "State::INITIALIZED"; - } - if( state == State::READY_TO_RUN ) - { - return os << "State::READY_TO_RUN"; - } - if( state == State::COMPLETED ) - { - return os << "State::COMPLETED"; - } - - GEOS_ERROR( "Unrecognized state. The integral value is: " << static_cast< int >( state ) ); - return os; -} - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -GeosxState::GeosxState( std::unique_ptr< CommandLineOptions > && commandLineOptions ): - m_state( State::UNINITIALIZED ), - m_commandLineOptions( std::move( commandLineOptions ) ), - m_rootNode( std::make_unique< conduit::Node >() ), - m_problemManager( nullptr ), - m_commTools( std::make_unique< CommunicationTools >() ), -#if defined( GEOS_USE_CALIPER ) - m_caliperManager( std::make_unique< cali::ConfigManager >() ), -#endif - m_initTime(), - m_runTime() -{ - Timer timer( m_initTime ); - -#if defined( GEOS_USE_CALIPER ) - setupCaliper( *m_caliperManager, getCommandLineOptions() ); -#endif - - try - { - string restartFileName; - if( ProblemManager::parseRestart( restartFileName, getCommandLineOptions() ) ) - { - GEOS_LOG_RANK_0( "Loading restart file " << restartFileName ); - dataRepository::loadTree( restartFileName, getRootConduitNode() ); - } - - m_problemManager = std::make_unique< ProblemManager >( getRootConduitNode() ); - - GEOS_ERROR_IF( currentGlobalState != nullptr, "Only one state can exist at a time." ); - currentGlobalState = this; - } - catch(std::exception const & e) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw; - } -} - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -GeosxState::~GeosxState() -{ -#if defined( GEOS_USE_CALIPER ) - m_caliperManager->flush(); -#endif - - GEOS_ERROR_IF( currentGlobalState != this, "This shouldn't be possible." ); - currentGlobalState = nullptr; -} - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool GeosxState::initializeDataRepository() -{ - try - { - GEOS_MARK_FUNCTION; - Timer timer( m_initTime ); - - GEOS_THROW_IF_NE( m_state, State::UNINITIALIZED, std::logic_error ); - - - getProblemManager().parseCommandLineInput(); - - if( !getProblemManager().getSchemaFileName().empty() ) - { - getProblemManager().generateDocumentation(); - m_state = State::INITIALIZED; - return false; - } - - getProblemManager().parseInputFile(); - getProblemManager().problemSetup(); - - m_state = State::INITIALIZED; - - if( m_commandLineOptions->printMemoryUsage >= 0.0 ) - { - dataRepository::printMemoryAllocation( getProblemManager(), 0, m_commandLineOptions->printMemoryUsage ); - } - - return true; - } - catch(std::exception const & e) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw; - } -} - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void GeosxState::applyInitialConditions() -{ - try - { - GEOS_MARK_FUNCTION; - Timer timer( m_initTime ); - - GEOS_THROW_IF_NE( m_state, State::INITIALIZED, std::logic_error ); - - getProblemManager().applyInitialConditions(); - - if( getCommandLineOptions().beginFromRestart ) - { - getProblemManager().readRestartOverwrite(); - } - - m_state = State::READY_TO_RUN; - MpiWrapper::barrier( MPI_COMM_GEOS ); - } - catch(std::exception const & e) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw; - } -} - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void GeosxState::run() -{ - try - { - GEOS_MARK_FUNCTION; - Timer timer( m_runTime ); - - GEOS_THROW_IF_NE( m_state, State::READY_TO_RUN, std::logic_error ); - - if( !getProblemManager().runSimulation() ) - { - m_state = State::COMPLETED; - } - } - catch(std::exception const & e) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw; - } -} - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -dataRepository::Group & GeosxState::getProblemManagerAsGroup() -{ return getProblemManager(); } - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -FieldSpecificationManager & GeosxState::getFieldSpecificationManager() -{ return getProblemManager().getFieldSpecificationManager(); } - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -FunctionManager & GeosxState::getFunctionManager() -{ return getProblemManager().getFunctionManager(); } - -} // namespace geos diff --git a/src/coreComponents/dataRepository/Logger.hpp b/src/coreComponents/dataRepository/Logger.hpp deleted file mode 100644 index 901dc65eab7..00000000000 --- a/src/coreComponents/dataRepository/Logger.hpp +++ /dev/null @@ -1,625 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 TotalEnergies - * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2023-2024 Chevron - * Copyright (c) 2019- GEOS/GEOSX Contributors - * All rights reserved - * - * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. - * ------------------------------------------------------------------------------------------------------------ - */ - -/** - * @file Logger.hpp - */ - -#ifndef GEOS_COMMON_LOGGER_HPP -#define GEOS_COMMON_LOGGER_HPP - -// Source incldes -#include "common/GeosxConfig.hpp" -#include "common/GeosxMacros.hpp" -#include "common/format/Format.hpp" -#include "LvArray/src/Macros.hpp" -#include "common/logger/ErrorHandling.hpp" - -// System includes -#include -#include -#include - -#if defined(GEOS_USE_MPI) - #include -#endif - -/** - * @brief Log a message on screen. - * @details The expression to log must evaluate something that can be stream inserted. - */ -#define GEOS_LOG( ... ) LVARRAY_LOG( __VA_ARGS__ ) - -/** - * @brief Log an expression and its value on screen. - * @details The expression to log must evaluate something that can be stream inserted. - */ -#define GEOS_LOG_VAR( ... ) LVARRAY_LOG_VAR( __VA_ARGS__ ) - - -/** - * @brief Conditionally log a message. - * @param EXP an expression that will be evaluated as a predicate - * @param msg a message to log (any expression that can be stream inserted) - */ -#if defined(GEOS_DEVICE_COMPILE) -#define GEOS_LOG_IF( EXP, msg ) -#else -#define GEOS_LOG_IF( EXP, msg ) \ - do { \ - if( EXP ) \ - { \ - std::cout<< msg << std::endl; \ - } \ - } while( false ) -#endif - - -/** - * @brief Conditionally log a message on screen on rank 0. - * @param EXP an expression that will be evaluated as a predicate - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_LOG_RANK_0_IF( EXP, msg ) \ - do { \ - if( ::geos::logger::internal::rank == 0 && EXP ) \ - { \ - std::ostringstream oss; \ - oss << msg; \ - std::cout << oss.str() << std::endl; \ - } \ - } while( false ) - -/** - * @brief Conditionally log a message on screen on rank 0 without line breaking. - * @param EXP an expression that will be evaluated as a predicate - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_LOG_RANK_0_IF_NLR( EXP, msg ) \ - do { \ - if( ::geos::logger::internal::rank == 0 && EXP ) \ - { \ - std::ostringstream oss; \ - oss << msg; \ - std::cout << oss.str(); \ - } \ - } while( false ) - -/** - * @brief Log a message on screen on rank 0. - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_LOG_RANK_0( msg ) GEOS_LOG_RANK_0_IF( true, msg ) - -/** - * @brief Conditionally log a message to the rank output stream. - * @param EXP an expression that will be evaluated as a predicate - * @param msg a message to log (any expression that can be stream inserted) - */ -#if defined(GEOS_DEVICE_COMPILE) -#define GEOS_LOG_RANK_IF( EXP, msg ) -#else -#define GEOS_LOG_RANK_IF( EXP, msg ) \ - do { \ - if( EXP ) \ - { \ - std::ostringstream oss; \ - oss << "Rank " << ::geos::logger::internal::rankString << ": " << msg; \ - *logger::internal::rankStream << oss.str() << std::endl; \ - } \ - } while( false ) -#endif - -/** - * @brief Log a message to the rank output stream. - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_LOG_RANK( msg ) GEOS_LOG_RANK_IF( true, msg ) - -/** - * @brief Log a variable/expression name and value on screen to the rank output stream. - * @param var a variable or expression accessible from current scope that can be stream inserted - */ -#define GEOS_LOG_RANK_VAR( var ) GEOS_LOG_RANK( #var " = " << var ) - -/** - * @brief Conditionally raise a hard error and terminate the program. - * @param EXP an expression that will be evaluated as a predicate - * @param msg a message to log (any expression that can be stream inserted) - */ -#if defined(GEOS_DEVICE_COMPILE) -#define GEOS_ERROR_IF( EXP, msg ) LVARRAY_ERROR_IF( EXP, msg ) -#else -#define GEOS_ERROR_IF( EXP, msg ) LVARRAY_ERROR_IF( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) -#endif - -/** - * @brief Conditionally throw an exception. - * @param EXP an expression that will be evaluated as a predicate - * @param MSG a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define LVARRAY_THROW_IF_TEST( EXP, MSG, TYPE, ... ) \ - do \ - { \ - if( EXP ) \ - { \ - ErrorLogger logger; \ - std::ostringstream __oss; \ - __oss << "\n"; \ - __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << MSG << "\n"; \ - __oss << LvArray::system::stackTrace( true ); \ - std::ostringstream __oss2, __oss3; \ - __oss2 << MSG; \ - __oss3 << __FILE__; \ - integer line = __LINE__; \ - ErrorLogger::ErrorMsg structMsg = logger.errorMsgformatter( ErrorLogger::TypeMsg::ERROR, __oss2.str(), \ - __oss3.str(), line ); \ - logger.errorMsgWritter( structMsg ); \ - throw TYPE( __oss.str() ); \ - } \ - } while( false ) - -/** - * @brief Conditionally throw an exception. - * @param EXP an expression that will be evaluated as a predicate - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define GEOS_THROW_IF( EXP, msg, TYPE ) LVARRAY_THROW_IF( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) - -/** - * @brief Conditionally throw an exception. - * @param EXP an expression that will be evaluated as a predicate - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define GEOS_THROW_IF_TEST( EXP, msg, TYPE, ... ) LVARRAY_THROW_IF_TEST( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE, __VA_ARGS__ ) - -/** - * @brief Raise a hard error and terminate the program. - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ERROR( msg ) GEOS_ERROR_IF( true, msg ) - -/** - * @brief Throw an exception. - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define GEOS_THROW( msg, TYPE ) GEOS_THROW_IF( true, msg, TYPE ) - -/** - * @brief Assert a condition in debug builds. - * @param EXP an expression that will be evaluated as a predicate - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ASSERT_MSG( EXP, msg ) LVARRAY_ASSERT_MSG( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) - -/** - * @brief Assert a condition in debug builds. - * @param EXP an expression that will be evaluated as a predicate - */ -#define GEOS_ASSERT( EXP ) GEOS_ASSERT_MSG( EXP, "" ) - -/** - * @brief Conditionally report a warning. - * @param EXP an expression that will be evaluated as a predicate - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_WARNING_IF( EXP, msg ) LVARRAY_WARNING_IF( EXP, msg ) - -/** - * @brief Report a warning. - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_WARNING( msg ) LVARRAY_WARNING( msg ) - -/** - * @brief Conditionally log an info message. - * @param EXP an expression that will be evaluated as a predicate - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_INFO_IF( EXP, msg ) LVARRAY_INFO_IF( EXP, msg ) - -/** - * @brief Log an info message. - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_INFO( msg ) LVARRAY_INFO( msg ) - -/** - * @brief Raise a hard error if two values are equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ERROR_IF_EQ_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_EQ_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) - -/** - * @brief Raise a hard error if two values are equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define GEOS_THROW_IF_EQ_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_EQ_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) - -/** - * @brief Raise a hard error if two values are equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define GEOS_ERROR_IF_EQ( lhs, rhs ) GEOS_ERROR_IF_EQ_MSG( lhs, rhs, "" ) - -/** - * @brief Raise a hard error if two values are equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw - */ -#define GEOS_THROW_IF_EQ( lhs, rhs, TYPE ) GEOS_THROW_IF_EQ_MSG( lhs, rhs, "", TYPE ) - -/** - * @brief Raise a hard error if two values are not equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ERROR_IF_NE_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_NE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) - -/** - * @brief Throw an exception if two values are not equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define GEOS_THROW_IF_NE_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_NE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) - -/** - * @brief Raise a hard error if two values are not equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define GEOS_ERROR_IF_NE( lhs, rhs ) GEOS_ERROR_IF_NE_MSG( lhs, rhs, "" ) - -/** - * @brief Throw an exception if two values are not equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw - */ -#define GEOS_THROW_IF_NE( lhs, rhs, TYPE ) GEOS_THROW_IF_NE_MSG( lhs, rhs, "", TYPE ) - -/** - * @brief Raise a hard error if one value compares greater than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ERROR_IF_GT_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_GT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) - -/** - * @brief Throw an exception if one value compares greater than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define GEOS_THROW_IF_GT_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_GT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) - -/** - * @brief Raise a hard error if one value compares greater than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define GEOS_ERROR_IF_GT( lhs, rhs ) GEOS_ERROR_IF_GT_MSG( lhs, rhs, "" ) - -/** - * @brief Throw an exception if one value compares greater than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw - */ -#define GEOS_THROW_IF_GT( lhs, rhs, TYPE ) GEOS_ERROR_IF_GT_MSG( lhs, rhs, "", TYPE ) - -/** - * @brief Raise a hard error if one value compares greater than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ERROR_IF_GE_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_GE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) - -/** - * @brief Throw an exception if one value compares greater than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define GEOS_THROW_IF_GE_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_GE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) - -/** - * @brief Raise a hard error if one value compares greater than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define GEOS_ERROR_IF_GE( lhs, rhs ) GEOS_ERROR_IF_GE_MSG( lhs, rhs, "" ) - -/** - * @brief Throw an exception if one value compares greater than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw - */ -#define GEOS_THROW_IF_GE( lhs, rhs, TYPE ) GEOS_ERROR_IF_GE_MSG( lhs, rhs, "", TYPE ) - -/** - * @brief Raise a hard error if one value compares less than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ERROR_IF_LT_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_LT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) - -/** - * @brief Throw an exception if one value compares less than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define GEOS_THROW_IF_LT_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_LT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) - -/** - * @brief Raise a hard error if one value compares less than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define GEOS_ERROR_IF_LT( lhs, rhs ) GEOS_ERROR_IF_LT_MSG( lhs, rhs, "" ) - -/** - * @brief Throw an exception if one value compares less than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw - */ -#define GEOS_THROW_IF_LT( lhs, rhs, TYPE ) GEOS_ERROR_IF_LT_MSG( lhs, rhs, "", TYPE ) - -/** - * @brief Raise a hard error if one value compares less than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ERROR_IF_LE_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_LE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) - -/** - * @brief Throw an exception if one value compares less than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define GEOS_THROW_IF_LE_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_LE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) - -/** - * @brief Raise a hard error if one value compares less than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define GEOS_ERROR_IF_LE( lhs, rhs ) GEOS_ERROR_IF_LE_MSG( lhs, rhs, "" ) - -/** - * @brief Throw an exception if one value compares less than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw - */ -#define GEOS_THROW_IF_LE( lhs, rhs, TYPE ) GEOS_ERROR_IF_LE_MSG( lhs, rhs, "", TYPE ) - -/** - * @brief Assert that two values compare equal in debug builds. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ASSERT_EQ_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_EQ_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) - -/** - * @brief Assert that two values compare equal in debug builds. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define GEOS_ASSERT_EQ( lhs, rhs ) GEOS_ASSERT_EQ_MSG( lhs, rhs, "" ) - -/** - * @brief Assert that two values compare not equal in debug builds. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ASSERT_NE_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_NE_MSG( lhs, rhs, msg ) - -/** - * @brief Assert that two values compare not equal in debug builds. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define GEOS_ASSERT_NE( lhs, rhs ) LVARRAY_ASSERT_NE( lhs, rhs ) - -/** - * @brief Assert that one value compares greater than the other in debug builds. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ASSERT_GT_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_GT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) - -/** - * @brief Assert that one value compares greater than the other in debug builds. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define GEOS_ASSERT_GT( lhs, rhs ) GEOS_ASSERT_GT_MSG( lhs, rhs, "" ) - -/** - * @brief Assert that one value compares greater than or equal to the other in debug builds. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ASSERT_GE_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_GE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) - -/** - * @brief Assert that one value compares greater than or equal to the other in debug builds. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define GEOS_ASSERT_GE( lhs, rhs ) GEOS_ASSERT_GE_MSG( lhs, rhs, "" ) - -namespace geos -{ - -/** - * @brief Exception class used to report errors in user input. - */ -struct InputError : public std::runtime_error -{ - /** - * @brief Constructor - * @param what the error message - */ - InputError( std::string const & what ): - std::runtime_error( what ) - {} - - /** - * @brief Constructor - * @param what the error message - */ - InputError( char const * const what ): - std::runtime_error( what ) - {} - - /** - * @brief Constructs an InputError from an underlying exception. - * @param subException The exception on which the created one is based. - * @param msgToInsert The error message that will be inserted in the subException error message. - */ - InputError( std::exception const & subException, std::string const & msgToInsert ); -}; - -/** - * @brief Exception class used to report errors in user input. - */ -struct SimulationError : public std::runtime_error -{ - /** - * @brief Constructor - * @param what the error message - */ - SimulationError( std::string const & what ): - std::runtime_error( what ) - {} - - /** - * @brief Constructor - * @param what the error message - */ - SimulationError( char const * const what ): - std::runtime_error( what ) - {} - - /** - * @brief Construct a SimulationError from an underlying exception. - * @param subException An exception to base this new one on. - * @param msgToInsert The error message. - * It will be inserted before the error message inside of subException. - */ - SimulationError( std::exception const & subException, std::string const & msgToInsert ); -}; - -/** - * @brief Exception class used to report errors from type conversion - * @todo (ErrorManager EPIC #2940) Consider adding a way to precise custom exception parameters, to add - * expected & encountered typeid for this one (in order to manage the exception output more precisely). - * We could also manage this by having: BadTypeErrorABC <|--- BadTypeError< T > /!\ compilation time - */ -struct BadTypeError : public std::runtime_error -{ - /** - * @brief Constructor - * @param what the error message - */ - BadTypeError( std::string const & what ): - std::runtime_error( what ) - {} -}; - -/** - * @brief Exception class used for special control flow. - */ -class NotAnError : public std::exception -{}; - -namespace logger -{ - -namespace internal -{ - -extern int rank; - -extern std::string rankString; - -extern int n_ranks; - -extern std::ostream * rankStream; - -#if defined(GEOS_USE_MPI) -extern MPI_Comm comm; -#endif -} // namespace internal - -#if defined(GEOS_USE_MPI) -/** - * @brief Initialize the logger in a parallel build. - * @param comm global MPI communicator - * @param rank_output_dir output directory for rank log files - */ -void InitializeLogger( MPI_Comm comm, const std::string & rank_output_dir="" ); -#endif - -/** - * @brief Initialize the logger in a serial build. - * @param rank_output_dir output directory for rank log files - */ -void InitializeLogger( const std::string & rank_output_dir="" ); - -/** - * @brief Finalize the logger and close the rank streams. - */ -void FinalizeLogger(); - -} // namespace logger - -} // namespace geos - -#endif /* GEOS_COMMON_LOGGER_HPP */ diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index 098598b5e44..c990e75b11f 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -67,88 +67,80 @@ ProblemManager::ProblemManager( conduit::Node & root ): m_functionManager( nullptr ), m_fieldSpecificationManager( nullptr ) { - try - { - // Groups that do not read from the xml - registerGroup< DomainPartition >( groupKeys.domain ); - Group & commandLine = registerGroup< Group >( groupKeys.commandLine ); - commandLine.setRestartFlags( RestartFlags::WRITE ); - - setInputFlags( InputFlags::PROBLEM_ROOT ); - - registerGroup< ExternalDataSourceManager >( groupKeys.externalDataSourceManager ); - - m_fieldSpecificationManager = ®isterGroup< FieldSpecificationManager >( groupKeys.fieldSpecificationManager ); - - m_eventManager = ®isterGroup< EventManager >( groupKeys.eventManager ); - registerGroup< NumericalMethodsManager >( groupKeys.numericalMethodsManager ); - registerGroup< GeometricObjectManager >( groupKeys.geometricObjectManager ); - registerGroup< MeshManager >( groupKeys.meshManager ); - registerGroup< OutputManager >( groupKeys.outputManager ); - m_physicsSolverManager = ®isterGroup< PhysicsSolverManager >( groupKeys.physicsSolverManager ); - m_tasksManager = ®isterGroup< TasksManager >( groupKeys.tasksManager ); - m_functionManager = ®isterGroup< FunctionManager >( groupKeys.functionManager ); - - // Command line entries - commandLine.registerWrapper< string >( viewKeys.inputFileName.key() ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Name of the input xml file." ); - - commandLine.registerWrapper< string >( viewKeys.restartFileName.key() ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Name of the restart file." ); - - commandLine.registerWrapper< integer >( viewKeys.beginFromRestart.key() ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Flag to indicate restart run." ); - - commandLine.registerWrapper< string >( viewKeys.problemName.key() ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Used in writing the output files, if not specified defaults to the name of the input file." ); - - commandLine.registerWrapper< string >( viewKeys.outputDirectory.key() ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Directory in which to put the output files, if not specified defaults to the current directory." ); - - commandLine.registerWrapper< integer >( viewKeys.xPartitionsOverride.key() ). - setApplyDefaultValue( 1 ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Number of partitions in the x-direction" ); - - commandLine.registerWrapper< integer >( viewKeys.yPartitionsOverride.key() ). - setApplyDefaultValue( 1 ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Number of partitions in the y-direction" ); - - commandLine.registerWrapper< integer >( viewKeys.zPartitionsOverride.key() ). - setApplyDefaultValue( 1 ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Number of partitions in the z-direction" ); - - commandLine.registerWrapper< integer >( viewKeys.overridePartitionNumbers.key() ). - setApplyDefaultValue( 0 ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Flag to indicate partition number override" ); - - commandLine.registerWrapper< string >( viewKeys.schemaFileName.key() ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Name of the output schema" ); - - commandLine.registerWrapper< integer >( viewKeys.useNonblockingMPI.key() ). - setApplyDefaultValue( 0 ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Whether to prefer using non-blocking MPI communication where implemented (results in non-deterministic DOF numbering)." ); - - commandLine.registerWrapper< integer >( viewKeys.suppressPinned.key( ) ). - setApplyDefaultValue( 0 ). - setRestartFlags( RestartFlags::WRITE ). - setDescription( "Whether to disallow using pinned memory allocations for MPI communication buffers." ); - } - catch( std::exception const & e ) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw e; - } + // Groups that do not read from the xml + registerGroup< DomainPartition >( groupKeys.domain ); + Group & commandLine = registerGroup< Group >( groupKeys.commandLine ); + commandLine.setRestartFlags( RestartFlags::WRITE ); + + setInputFlags( InputFlags::PROBLEM_ROOT ); + + registerGroup< ExternalDataSourceManager >( groupKeys.externalDataSourceManager ); + + m_fieldSpecificationManager = ®isterGroup< FieldSpecificationManager >( groupKeys.fieldSpecificationManager ); + + m_eventManager = ®isterGroup< EventManager >( groupKeys.eventManager ); + registerGroup< NumericalMethodsManager >( groupKeys.numericalMethodsManager ); + registerGroup< GeometricObjectManager >( groupKeys.geometricObjectManager ); + registerGroup< MeshManager >( groupKeys.meshManager ); + registerGroup< OutputManager >( groupKeys.outputManager ); + m_physicsSolverManager = ®isterGroup< PhysicsSolverManager >( groupKeys.physicsSolverManager ); + m_tasksManager = ®isterGroup< TasksManager >( groupKeys.tasksManager ); + m_functionManager = ®isterGroup< FunctionManager >( groupKeys.functionManager ); + + // Command line entries + commandLine.registerWrapper< string >( viewKeys.inputFileName.key() ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Name of the input xml file." ); + + commandLine.registerWrapper< string >( viewKeys.restartFileName.key() ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Name of the restart file." ); + + commandLine.registerWrapper< integer >( viewKeys.beginFromRestart.key() ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Flag to indicate restart run." ); + + commandLine.registerWrapper< string >( viewKeys.problemName.key() ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Used in writing the output files, if not specified defaults to the name of the input file." ); + + commandLine.registerWrapper< string >( viewKeys.outputDirectory.key() ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Directory in which to put the output files, if not specified defaults to the current directory." ); + + commandLine.registerWrapper< integer >( viewKeys.xPartitionsOverride.key() ). + setApplyDefaultValue( 1 ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Number of partitions in the x-direction" ); + + commandLine.registerWrapper< integer >( viewKeys.yPartitionsOverride.key() ). + setApplyDefaultValue( 1 ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Number of partitions in the y-direction" ); + + commandLine.registerWrapper< integer >( viewKeys.zPartitionsOverride.key() ). + setApplyDefaultValue( 1 ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Number of partitions in the z-direction" ); + + commandLine.registerWrapper< integer >( viewKeys.overridePartitionNumbers.key() ). + setApplyDefaultValue( 0 ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Flag to indicate partition number override" ); + + commandLine.registerWrapper< string >( viewKeys.schemaFileName.key() ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Name of the output schema" ); + + commandLine.registerWrapper< integer >( viewKeys.useNonblockingMPI.key() ). + setApplyDefaultValue( 0 ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Whether to prefer using non-blocking MPI communication where implemented (results in non-deterministic DOF numbering)." ); + + commandLine.registerWrapper< integer >( viewKeys.suppressPinned.key( ) ). + setApplyDefaultValue( 0 ). + setRestartFlags( RestartFlags::WRITE ). + setDescription( "Whether to disallow using pinned memory allocations for MPI communication buffers." ); } ProblemManager::~ProblemManager() @@ -175,173 +167,141 @@ Group * ProblemManager::createChild( string const & GEOS_UNUSED_PARAM( childKey void ProblemManager::problemSetup() { - try - { - GEOS_MARK_FUNCTION; + GEOS_MARK_FUNCTION; - postInputInitializationRecursive(); + postInputInitializationRecursive(); - generateMesh(); + generateMesh(); - // initialize_postMeshGeneration(); + // initialize_postMeshGeneration(); - applyNumericalMethods(); + applyNumericalMethods(); - registerDataOnMeshRecursive( getDomainPartition().getMeshBodies() ); + registerDataOnMeshRecursive( getDomainPartition().getMeshBodies() ); - initialize(); + initialize(); - importFields(); - } - catch( std::exception const & e ) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw e; - } + importFields(); } void ProblemManager::parseCommandLineInput() { - try - { - Group & commandLine = getGroup< Group >( groupKeys.commandLine ); + Group & commandLine = getGroup< Group >( groupKeys.commandLine ); - CommandLineOptions const & opts = getGlobalState().getCommandLineOptions(); + CommandLineOptions const & opts = getGlobalState().getCommandLineOptions(); - commandLine.getReference< string >( viewKeys.restartFileName ) = opts.restartFileName; - commandLine.getReference< integer >( viewKeys.beginFromRestart ) = opts.beginFromRestart; - commandLine.getReference< integer >( viewKeys.xPartitionsOverride ) = opts.xPartitionsOverride; - commandLine.getReference< integer >( viewKeys.yPartitionsOverride ) = opts.yPartitionsOverride; - commandLine.getReference< integer >( viewKeys.zPartitionsOverride ) = opts.zPartitionsOverride; - commandLine.getReference< integer >( viewKeys.overridePartitionNumbers ) = opts.overridePartitionNumbers; - commandLine.getReference< integer >( viewKeys.useNonblockingMPI ) = opts.useNonblockingMPI; - commandLine.getReference< integer >( viewKeys.suppressPinned ) = opts.suppressPinned; + commandLine.getReference< string >( viewKeys.restartFileName ) = opts.restartFileName; + commandLine.getReference< integer >( viewKeys.beginFromRestart ) = opts.beginFromRestart; + commandLine.getReference< integer >( viewKeys.xPartitionsOverride ) = opts.xPartitionsOverride; + commandLine.getReference< integer >( viewKeys.yPartitionsOverride ) = opts.yPartitionsOverride; + commandLine.getReference< integer >( viewKeys.zPartitionsOverride ) = opts.zPartitionsOverride; + commandLine.getReference< integer >( viewKeys.overridePartitionNumbers ) = opts.overridePartitionNumbers; + commandLine.getReference< integer >( viewKeys.useNonblockingMPI ) = opts.useNonblockingMPI; + commandLine.getReference< integer >( viewKeys.suppressPinned ) = opts.suppressPinned; - string & outputDirectory = commandLine.getReference< string >( viewKeys.outputDirectory ); - outputDirectory = opts.outputDirectory; - OutputBase::setOutputDirectory( outputDirectory ); + string & outputDirectory = commandLine.getReference< string >( viewKeys.outputDirectory ); + outputDirectory = opts.outputDirectory; + OutputBase::setOutputDirectory( outputDirectory ); - string & inputFileName = commandLine.getReference< string >( viewKeys.inputFileName ); + string & inputFileName = commandLine.getReference< string >( viewKeys.inputFileName ); - for( string const & xmlFile : opts.inputFileNames ) - { - string const absPath = getAbsolutePath( xmlFile ); - GEOS_LOG_RANK_0( "Opened XML file: " << absPath ); - } + for( string const & xmlFile : opts.inputFileNames ) + { + string const absPath = getAbsolutePath( xmlFile ); + GEOS_LOG_RANK_0( "Opened XML file: " << absPath ); + } - inputFileName = xmlWrapper::buildMultipleInputXML( opts.inputFileNames, outputDirectory ); + inputFileName = xmlWrapper::buildMultipleInputXML( opts.inputFileNames, outputDirectory ); - string & schemaName = commandLine.getReference< string >( viewKeys.schemaFileName ); - schemaName = opts.schemaName; + string & schemaName = commandLine.getReference< string >( viewKeys.schemaFileName ); + schemaName = opts.schemaName; - string & problemName = commandLine.getReference< string >( viewKeys.problemName ); - problemName = opts.problemName; - OutputBase::setFileNameRoot( problemName ); + string & problemName = commandLine.getReference< string >( viewKeys.problemName ); + problemName = opts.problemName; + OutputBase::setFileNameRoot( problemName ); - if( schemaName.empty()) - { - inputFileName = getAbsolutePath( inputFileName ); - Path::setPathPrefix( splitPath( inputFileName ).first ); - } + if( schemaName.empty()) + { + inputFileName = getAbsolutePath( inputFileName ); + Path::setPathPrefix( splitPath( inputFileName ).first ); + } - if( opts.traceDataMigration ) - { - chai::ArrayManager::getInstance()->enableCallbacks(); - } - else - { - chai::ArrayManager::getInstance()->disableCallbacks(); - } + if( opts.traceDataMigration ) + { + chai::ArrayManager::getInstance()->enableCallbacks(); } - catch( std::exception const & e ) + else { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw e; + chai::ArrayManager::getInstance()->disableCallbacks(); } } bool ProblemManager::parseRestart( string & restartFileName, CommandLineOptions const & options ) { - try - { - bool const beginFromRestart = options.beginFromRestart; - restartFileName = options.restartFileName; + bool const beginFromRestart = options.beginFromRestart; + restartFileName = options.restartFileName; - if( beginFromRestart == 1 ) - { - string dirname, basename; - std::tie( dirname, basename ) = splitPath( restartFileName ); + if( beginFromRestart == 1 ) + { + string dirname, basename; + std::tie( dirname, basename ) = splitPath( restartFileName ); - std::vector< string > dir_contents = readDirectory( dirname ); + std::vector< string > dir_contents = readDirectory( dirname ); - GEOS_THROW_IF( dir_contents.empty(), - "Directory gotten from " << restartFileName << " " << dirname << " is empty.", - InputError ); + GEOS_THROW_IF( dir_contents.empty(), + "Directory gotten from " << restartFileName << " " << dirname << " is empty.", + InputError ); - std::regex basename_regex( basename ); + std::regex basename_regex( basename ); - string min_str; - string & max_match = min_str; - bool match_found = false; - for( string & s : dir_contents ) + string min_str; + string & max_match = min_str; + bool match_found = false; + for( string & s : dir_contents ) + { + if( std::regex_match( s, basename_regex )) { - if( std::regex_match( s, basename_regex )) - { - match_found = true; - max_match = (s > max_match)? s : max_match; - } + match_found = true; + max_match = (s > max_match)? s : max_match; } - - GEOS_THROW_IF( !match_found, - "No matches found for pattern " << basename << " in directory " << dirname << ".", - InputError ); - - restartFileName = getAbsolutePath( dirname + "/" + max_match ); } - return beginFromRestart; - } - catch( std::exception const & e ) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw e; + GEOS_THROW_IF( !match_found, + "No matches found for pattern " << basename << " in directory " << dirname << ".", + InputError ); + + restartFileName = getAbsolutePath( dirname + "/" + max_match ); } + + return beginFromRestart; } void ProblemManager::generateDocumentation() { // Documentation output - try - { - GEOS_LOG_RANK_0( "Trying to generate schema..." ); - Group & commandLine = getGroup< Group >( groupKeys.commandLine ); - string const & schemaName = commandLine.getReference< string >( viewKeys.schemaFileName ); + GEOS_LOG_RANK_0( "Trying to generate schema..." ); + Group & commandLine = getGroup< Group >( groupKeys.commandLine ); + string const & schemaName = commandLine.getReference< string >( viewKeys.schemaFileName ); - if( !schemaName.empty() ) - { - // Generate an extensive data structure - generateDataStructureSkeleton( 0 ); + if( !schemaName.empty() ) + { + // Generate an extensive data structure + generateDataStructureSkeleton( 0 ); - MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); - DomainPartition & domain = getDomainPartition(); - meshManager.generateMeshLevels( domain ); + MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); + DomainPartition & domain = getDomainPartition(); + meshManager.generateMeshLevels( domain ); - registerDataOnMeshRecursive( domain.getMeshBodies() ); + registerDataOnMeshRecursive( domain.getMeshBodies() ); - // Generate schema - schemaUtilities::ConvertDocumentationToSchema( schemaName.c_str(), this, 0 ); + // Generate schema + schemaUtilities::ConvertDocumentationToSchema( schemaName.c_str(), this, 0 ); - // Generate non-schema documentation - schemaUtilities::ConvertDocumentationToSchema((schemaName + ".other").c_str(), this, 1 ); - } - } - catch( std::exception const & e ) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw e; + // Generate non-schema documentation + schemaUtilities::ConvertDocumentationToSchema((schemaName + ".other").c_str(), this, 1 ); } } @@ -350,174 +310,137 @@ void ProblemManager::setSchemaDeviations( xmlWrapper::xmlNode schemaRoot, xmlWrapper::xmlNode schemaParent, integer documentationType ) { - try + xmlWrapper::xmlNode targetChoiceNode = schemaParent.child( "xsd:choice" ); + if( targetChoiceNode.empty() ) { - xmlWrapper::xmlNode targetChoiceNode = schemaParent.child( "xsd:choice" ); - if( targetChoiceNode.empty() ) - { - targetChoiceNode = schemaParent.prepend_child( "xsd:choice" ); - targetChoiceNode.append_attribute( "minOccurs" ) = "0"; - targetChoiceNode.append_attribute( "maxOccurs" ) = "unbounded"; - } + targetChoiceNode = schemaParent.prepend_child( "xsd:choice" ); + targetChoiceNode.append_attribute( "minOccurs" ) = "0"; + targetChoiceNode.append_attribute( "maxOccurs" ) = "unbounded"; + } - // These objects are handled differently during the xml read step, - // so we need to explicitly add them into the schema structure - DomainPartition & domain = getDomainPartition(); + // These objects are handled differently during the xml read step, + // so we need to explicitly add them into the schema structure + DomainPartition & domain = getDomainPartition(); - m_functionManager->generateDataStructureSkeleton( 0 ); - schemaUtilities::SchemaConstruction( *m_functionManager, schemaRoot, targetChoiceNode, documentationType ); + m_functionManager->generateDataStructureSkeleton( 0 ); + schemaUtilities::SchemaConstruction( *m_functionManager, schemaRoot, targetChoiceNode, documentationType ); - m_fieldSpecificationManager->generateDataStructureSkeleton( 0 ); - schemaUtilities::SchemaConstruction( *m_fieldSpecificationManager, schemaRoot, targetChoiceNode, documentationType ); + m_fieldSpecificationManager->generateDataStructureSkeleton( 0 ); + schemaUtilities::SchemaConstruction( *m_fieldSpecificationManager, schemaRoot, targetChoiceNode, documentationType ); - ConstitutiveManager & constitutiveManager = domain.getGroup< ConstitutiveManager >( groupKeys.constitutiveManager ); - schemaUtilities::SchemaConstruction( constitutiveManager, schemaRoot, targetChoiceNode, documentationType ); + ConstitutiveManager & constitutiveManager = domain.getGroup< ConstitutiveManager >( groupKeys.constitutiveManager ); + schemaUtilities::SchemaConstruction( constitutiveManager, schemaRoot, targetChoiceNode, documentationType ); - MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); - meshManager.generateMeshLevels( domain ); - ElementRegionManager & elementManager = domain.getMeshBody( 0 ).getBaseDiscretization().getElemManager(); - elementManager.generateDataStructureSkeleton( 0 ); - schemaUtilities::SchemaConstruction( elementManager, schemaRoot, targetChoiceNode, documentationType ); - ParticleManager & particleManager = domain.getMeshBody( 0 ).getBaseDiscretization().getParticleManager(); // TODO is this necessary? SJP - particleManager.generateDataStructureSkeleton( 0 ); - schemaUtilities::SchemaConstruction( particleManager, schemaRoot, targetChoiceNode, documentationType ); + MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); + meshManager.generateMeshLevels( domain ); + ElementRegionManager & elementManager = domain.getMeshBody( 0 ).getBaseDiscretization().getElemManager(); + elementManager.generateDataStructureSkeleton( 0 ); + schemaUtilities::SchemaConstruction( elementManager, schemaRoot, targetChoiceNode, documentationType ); + ParticleManager & particleManager = domain.getMeshBody( 0 ).getBaseDiscretization().getParticleManager(); // TODO is this necessary? SJP + particleManager.generateDataStructureSkeleton( 0 ); + schemaUtilities::SchemaConstruction( particleManager, schemaRoot, targetChoiceNode, documentationType ); - // Add entries that are only used in the pre-processor - Group & IncludedList = this->registerGroup< Group >( xmlWrapper::includedListTag ); - IncludedList.setInputFlags( InputFlags::OPTIONAL ); + // Add entries that are only used in the pre-processor + Group & IncludedList = this->registerGroup< Group >( xmlWrapper::includedListTag ); + IncludedList.setInputFlags( InputFlags::OPTIONAL ); - Group & includedFile = IncludedList.registerGroup< Group >( xmlWrapper::includedFileTag ); - includedFile.setInputFlags( InputFlags::OPTIONAL_NONUNIQUE ); - // the name of includedFile is actually a Path. - includedFile.registerWrapper< string >( "name" ). - setInputFlag( InputFlags::REQUIRED ). - setRTTypeName( rtTypes::getTypeName( typeid( Path ) ) ). - setDescription( "The relative file path." ); + Group & includedFile = IncludedList.registerGroup< Group >( xmlWrapper::includedFileTag ); + includedFile.setInputFlags( InputFlags::OPTIONAL_NONUNIQUE ); + // the name of includedFile is actually a Path. + includedFile.registerWrapper< string >( "name" ). + setInputFlag( InputFlags::REQUIRED ). + setRTTypeName( rtTypes::getTypeName( typeid( Path ) ) ). + setDescription( "The relative file path." ); - schemaUtilities::SchemaConstruction( IncludedList, schemaRoot, targetChoiceNode, documentationType ); + schemaUtilities::SchemaConstruction( IncludedList, schemaRoot, targetChoiceNode, documentationType ); - Group & parameterList = this->registerGroup< Group >( "Parameters" ); - parameterList.setInputFlags( InputFlags::OPTIONAL ); + Group & parameterList = this->registerGroup< Group >( "Parameters" ); + parameterList.setInputFlags( InputFlags::OPTIONAL ); - Group & parameter = parameterList.registerGroup< Group >( "Parameter" ); - parameter.setInputFlags( InputFlags::OPTIONAL_NONUNIQUE ); - parameter.registerWrapper< string >( "value" ). - setInputFlag( InputFlags::REQUIRED ). - setDescription( "Input parameter definition for the preprocessor" ); + Group & parameter = parameterList.registerGroup< Group >( "Parameter" ); + parameter.setInputFlags( InputFlags::OPTIONAL_NONUNIQUE ); + parameter.registerWrapper< string >( "value" ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Input parameter definition for the preprocessor" ); - schemaUtilities::SchemaConstruction( parameterList, schemaRoot, targetChoiceNode, documentationType ); + schemaUtilities::SchemaConstruction( parameterList, schemaRoot, targetChoiceNode, documentationType ); - Group & benchmarks = this->registerGroup< Group >( "Benchmarks" ); - benchmarks.setInputFlags( InputFlags::OPTIONAL ); + Group & benchmarks = this->registerGroup< Group >( "Benchmarks" ); + benchmarks.setInputFlags( InputFlags::OPTIONAL ); - for( string const machineName : {"quartz", "lassen", "crusher" } ) - { - Group & machine = benchmarks.registerGroup< Group >( machineName ); - machine.setInputFlags( InputFlags::OPTIONAL ); - - Group & run = machine.registerGroup< Group >( "Run" ); - run.setInputFlags( InputFlags::OPTIONAL ); + for( string const machineName : {"quartz", "lassen", "crusher" } ) + { + Group & machine = benchmarks.registerGroup< Group >( machineName ); + machine.setInputFlags( InputFlags::OPTIONAL ); - run.registerWrapper< string >( "name" ).setInputFlag( InputFlags::REQUIRED ). - setDescription( "The name of this benchmark." ); + Group & run = machine.registerGroup< Group >( "Run" ); + run.setInputFlags( InputFlags::OPTIONAL ); - run.registerWrapper< int >( "timeLimit" ).setInputFlag( InputFlags::OPTIONAL ). - setDescription( "The time limit of the benchmark." ); + run.registerWrapper< string >( "name" ).setInputFlag( InputFlags::REQUIRED ). + setDescription( "The name of this benchmark." ); - run.registerWrapper< string >( "args" ).setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Any extra command line arguments to pass to GEOSX." ); + run.registerWrapper< int >( "timeLimit" ).setInputFlag( InputFlags::OPTIONAL ). + setDescription( "The time limit of the benchmark." ); - run.registerWrapper< string >( "autoPartition" ).setInputFlag( InputFlags::OPTIONAL ). - setDescription( "May be 'Off' or 'On', if 'On' partitioning arguments are created automatically. Default is Off." ); + run.registerWrapper< string >( "args" ).setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Any extra command line arguments to pass to GEOSX." ); - run.registerWrapper< string >( "scaling" ).setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Whether to run a scaling, and which type of scaling to run." ); + run.registerWrapper< string >( "autoPartition" ).setInputFlag( InputFlags::OPTIONAL ). + setDescription( "May be 'Off' or 'On', if 'On' partitioning arguments are created automatically. Default is Off." ); - run.registerWrapper< int >( "nodes" ).setInputFlag( InputFlags::OPTIONAL ). - setDescription( "The number of nodes needed to run the base benchmark, default is 1." ); + run.registerWrapper< string >( "scaling" ).setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Whether to run a scaling, and which type of scaling to run." ); - run.registerWrapper< int >( "tasksPerNode" ).setInputFlag( InputFlags::REQUIRED ). - setDescription( "The number of tasks per node to run the benchmark with." ); + run.registerWrapper< int >( "nodes" ).setInputFlag( InputFlags::OPTIONAL ). + setDescription( "The number of nodes needed to run the base benchmark, default is 1." ); - run.registerWrapper< int >( "threadsPerTask" ).setInputFlag( InputFlags::OPTIONAL ). - setDescription( "The number of threads per task to run the benchmark with." ); + run.registerWrapper< int >( "tasksPerNode" ).setInputFlag( InputFlags::REQUIRED ). + setDescription( "The number of tasks per node to run the benchmark with." ); - run.registerWrapper< array1d< int > >( "meshSizes" ).setInputFlag( InputFlags::OPTIONAL ). - setDescription( "The target number of elements in the internal mesh (per-process for weak scaling, globally for strong scaling) default doesn't modify the internalMesh." ); + run.registerWrapper< int >( "threadsPerTask" ).setInputFlag( InputFlags::OPTIONAL ). + setDescription( "The number of threads per task to run the benchmark with." ); - run.registerWrapper< array1d< int > >( "scaleList" ).setInputFlag( InputFlags::OPTIONAL ). - setDescription( "The scales at which to run the problem ( scale * nodes * tasksPerNode )." ); - } + run.registerWrapper< array1d< int > >( "meshSizes" ).setInputFlag( InputFlags::OPTIONAL ). + setDescription( "The target number of elements in the internal mesh (per-process for weak scaling, globally for strong scaling) default doesn't modify the internalMesh." ); - schemaUtilities::SchemaConstruction( benchmarks, schemaRoot, targetChoiceNode, documentationType ); - } - catch( std::exception const & e ) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw e; + run.registerWrapper< array1d< int > >( "scaleList" ).setInputFlag( InputFlags::OPTIONAL ). + setDescription( "The scales at which to run the problem ( scale * nodes * tasksPerNode )." ); } + + schemaUtilities::SchemaConstruction( benchmarks, schemaRoot, targetChoiceNode, documentationType ); } void ProblemManager::parseInputFile() { - try - { - Group & commandLine = getGroup( groupKeys.commandLine ); - string const & inputFileName = commandLine.getReference< string >( viewKeys.inputFileName ); + Group & commandLine = getGroup( groupKeys.commandLine ); + string const & inputFileName = commandLine.getReference< string >( viewKeys.inputFileName ); - // Load preprocessed xml file - xmlWrapper::xmlDocument xmlDocument; - xmlWrapper::xmlResult const xmlResult = xmlDocument.loadFile( inputFileName, true ); - GEOS_THROW_IF( !xmlResult, GEOS_FMT( "Errors found while parsing XML file {}\nDescription: {}\nOffset: {}", - inputFileName, xmlResult.description(), xmlResult.offset ), InputError ); + // Load preprocessed xml file + xmlWrapper::xmlDocument xmlDocument; + xmlWrapper::xmlResult const xmlResult = xmlDocument.loadFile( inputFileName, true ); + GEOS_THROW_IF( !xmlResult, GEOS_FMT( "Errors found while parsing XML file {}\nDescription: {}\nOffset: {}", + inputFileName, xmlResult.description(), xmlResult.offset ), InputError ); - // Parse the results - parseXMLDocument( xmlDocument ); - } - catch( std::exception const & e ) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw e; - } + // Parse the results + parseXMLDocument( xmlDocument ); } void ProblemManager::parseInputString( string const & xmlString ) { - try - { - // Load preprocessed xml file - xmlWrapper::xmlDocument xmlDocument; - xmlWrapper::xmlResult xmlResult = xmlDocument.loadString( xmlString, true ); - GEOS_THROW_IF( !xmlResult, GEOS_FMT( "Errors found while parsing XML string\nDescription: {}\nOffset: {}", - xmlResult.description(), xmlResult.offset ), InputError ); - - // Parse the results - parseXMLDocument( xmlDocument ); - } - catch( std::exception const & e ) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw e; - } + // Load preprocessed xml file + xmlWrapper::xmlDocument xmlDocument; + xmlWrapper::xmlResult xmlResult = xmlDocument.loadString( xmlString, true ); + GEOS_THROW_IF( !xmlResult, GEOS_FMT( "Errors found while parsing XML string\nDescription: {}\nOffset: {}", + xmlResult.description(), xmlResult.offset ), InputError ); + + // Parse the results + parseXMLDocument( xmlDocument ); } void ProblemManager::parseXMLDocument( xmlWrapper::xmlDocument & xmlDocument ) -{ - try - { - parseXMLDocumentImpl( xmlDocument ); - } - catch( std::exception const & e ) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw e; - } -} - -void ProblemManager::parseXMLDocumentImpl( xmlWrapper::xmlDocument & xmlDocument ) { // Extract the problem node and begin processing the user inputs xmlWrapper::xmlNode xmlProblemNode = xmlDocument.getChild( this->getName().c_str() ); @@ -566,8 +489,9 @@ void ProblemManager::parseXMLDocumentImpl( xmlWrapper::xmlDocument & xmlDocument catch( InputError const & e ) { string const errorMsg = GEOS_FMT( "Error while parsing region {} ({}):\n", - regionName, regionNodePos.toString() ); - errorLogger.currentErrorMsg().addToMsg( errorMsg ); + regionName, regionNodePos.toString() ); + errorLogger.currentErrorMsg().addToMsg( errorMsg ) + .addContextInfo( getDataContext().getContextInfo().setPriority( 1 ) ); throw InputError( e, errorMsg ); } } @@ -659,189 +583,165 @@ void ProblemManager::initializationOrder( string_array & order ) void ProblemManager::generateMesh() { - try - { - GEOS_MARK_FUNCTION; - DomainPartition & domain = getDomainPartition(); + GEOS_MARK_FUNCTION; + DomainPartition & domain = getDomainPartition(); - MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); + MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); - meshManager.generateMeshes( domain ); + meshManager.generateMeshes( domain ); - // get all the discretizations from the numerical methods. - // map< pair< mesh body name, pointer to discretization>, array of region names > - map< std::pair< string, Group const * const >, string_array const & > - discretizations = getDiscretizations(); + // get all the discretizations from the numerical methods. + // map< pair< mesh body name, pointer to discretization>, array of region names > + map< std::pair< string, Group const * const >, string_array const & > + discretizations = getDiscretizations(); - // setup the base discretizations (hard code this for now) - domain.forMeshBodies( [&]( MeshBody & meshBody ) + // setup the base discretizations (hard code this for now) + domain.forMeshBodies( [&]( MeshBody & meshBody ) + { + MeshLevel & baseMesh = meshBody.getBaseDiscretization(); + string_array junk; + + if( meshBody.hasParticles() ) // mesh bodies with particles load their data into particle blocks, not cell blocks { - MeshLevel & baseMesh = meshBody.getBaseDiscretization(); - string_array junk; + ParticleBlockManagerABC & particleBlockManager = meshBody.getGroup< ParticleBlockManagerABC >( keys::particleManager ); - if( meshBody.hasParticles() ) // mesh bodies with particles load their data into particle blocks, not cell blocks - { - ParticleBlockManagerABC & particleBlockManager = meshBody.getGroup< ParticleBlockManagerABC >( keys::particleManager ); + this->generateMeshLevel( baseMesh, + particleBlockManager, + junk ); + } + else + { + CellBlockManagerABC & cellBlockManager = meshBody.getGroup< CellBlockManagerABC >( keys::cellManager ); - this->generateMeshLevel( baseMesh, - particleBlockManager, - junk ); - } - else - { - CellBlockManagerABC & cellBlockManager = meshBody.getGroup< CellBlockManagerABC >( keys::cellManager ); + this->generateMeshLevel( baseMesh, + cellBlockManager, + nullptr, + junk ); - this->generateMeshLevel( baseMesh, - cellBlockManager, - nullptr, - junk ); + ElementRegionManager & elemManager = baseMesh.getElemManager(); + elemManager.generateWells( cellBlockManager, baseMesh ); + } + } ); - ElementRegionManager & elemManager = baseMesh.getElemManager(); - elemManager.generateWells( cellBlockManager, baseMesh ); - } - } ); + Group const & commandLine = this->getGroup< Group >( groupKeys.commandLine ); + integer const useNonblockingMPI = commandLine.getReference< integer >( viewKeys.useNonblockingMPI ); + domain.setupBaseLevelMeshGlobalInfo(); - Group const & commandLine = this->getGroup< Group >( groupKeys.commandLine ); - integer const useNonblockingMPI = commandLine.getReference< integer >( viewKeys.useNonblockingMPI ); - domain.setupBaseLevelMeshGlobalInfo(); + // setup the MeshLevel associated with the discretizations + for( auto const & discretizationPair: discretizations ) + { + string const & meshBodyName = discretizationPair.first.first; + MeshBody & meshBody = domain.getMeshBody( meshBodyName ); - // setup the MeshLevel associated with the discretizations - for( auto const & discretizationPair: discretizations ) - { - string const & meshBodyName = discretizationPair.first.first; - MeshBody & meshBody = domain.getMeshBody( meshBodyName ); + if( discretizationPair.first.second!=nullptr && !meshBody.hasParticles() ) // this check shouldn't be required + { // particle mesh bodies don't have a finite element + // discretization + FiniteElementDiscretization const * const + feDiscretization = dynamic_cast< FiniteElementDiscretization const * >( discretizationPair.first.second ); - if( discretizationPair.first.second!=nullptr && !meshBody.hasParticles() ) // this check shouldn't be required - { // particle mesh bodies don't have a finite element - // discretization - FiniteElementDiscretization const * const - feDiscretization = dynamic_cast< FiniteElementDiscretization const * >( discretizationPair.first.second ); + // if the discretization is a finite element discretization + if( feDiscretization != nullptr ) + { + int const order = feDiscretization->getOrder(); + string const & discretizationName = feDiscretization->getName(); + string_array const & regionNames = discretizationPair.second; + CellBlockManagerABC const & cellBlockManager = meshBody.getCellBlockManager(); - // if the discretization is a finite element discretization - if( feDiscretization != nullptr ) + // create a high order MeshLevel + if( order > 1 ) { - int const order = feDiscretization->getOrder(); - string const & discretizationName = feDiscretization->getName(); - string_array const & regionNames = discretizationPair.second; - CellBlockManagerABC const & cellBlockManager = meshBody.getCellBlockManager(); - - // create a high order MeshLevel - if( order > 1 ) - { - MeshLevel & mesh = meshBody.createMeshLevel( MeshBody::groupStructKeys::baseDiscretizationString(), - discretizationName, order ); + MeshLevel & mesh = meshBody.createMeshLevel( MeshBody::groupStructKeys::baseDiscretizationString(), + discretizationName, order ); - this->generateMeshLevel( mesh, - cellBlockManager, - feDiscretization, - regionNames ); - } - // Just create a shallow copy of the base discretization. - else if( order==1 ) - { - meshBody.createShallowMeshLevel( MeshBody::groupStructKeys::baseDiscretizationString(), - discretizationName ); - } + this->generateMeshLevel( mesh, + cellBlockManager, + feDiscretization, + regionNames ); } - else // this is a finite volume discretization...i hope + // Just create a shallow copy of the base discretization. + else if( order==1 ) { - Group const * const discretization = discretizationPair.first.second; + meshBody.createShallowMeshLevel( MeshBody::groupStructKeys::baseDiscretizationString(), + discretizationName ); + } + } + else // this is a finite volume discretization...i hope + { + Group const * const discretization = discretizationPair.first.second; - if( discretization != nullptr ) // ...it is FV if it isn't nullptr - { - string const & discretizationName = discretization->getName(); - meshBody.createShallowMeshLevel( MeshBody::groupStructKeys::baseDiscretizationString(), - discretizationName ); - } + if( discretization != nullptr ) // ...it is FV if it isn't nullptr + { + string const & discretizationName = discretization->getName(); + meshBody.createShallowMeshLevel( MeshBody::groupStructKeys::baseDiscretizationString(), + discretizationName ); } } } + } - domain.setupCommunications( useNonblockingMPI ); - domain.outputPartitionInformation(); + domain.setupCommunications( useNonblockingMPI ); + domain.outputPartitionInformation(); - domain.forMeshBodies( [&]( MeshBody & meshBody ) + domain.forMeshBodies( [&]( MeshBody & meshBody ) + { + if( meshBody.hasGroup( keys::particleManager ) ) { - if( meshBody.hasGroup( keys::particleManager ) ) - { - meshBody.deregisterGroup( keys::particleManager ); - } - else if( meshBody.hasGroup( keys::cellManager ) ) - { - // meshBody.deregisterGroup( keys::cellManager ); - meshBody.deregisterCellBlockManager(); - } - - meshBody.forMeshLevels( [&]( MeshLevel & meshLevel ) - { - FaceManager & faceManager = meshLevel.getFaceManager(); - EdgeManager & edgeManager = meshLevel.getEdgeManager(); - NodeManager const & nodeManager = meshLevel.getNodeManager(); - ElementRegionManager & elementManager = meshLevel.getElemManager(); + meshBody.deregisterGroup( keys::particleManager ); + } + else if( meshBody.hasGroup( keys::cellManager ) ) + { + // meshBody.deregisterGroup( keys::cellManager ); + meshBody.deregisterCellBlockManager(); + } - elementManager.forElementSubRegions< FaceElementSubRegion >( [&]( FaceElementSubRegion & subRegion ) - { - /// 1. The computation of geometric quantities which is now possible for `FaceElementSubRegion`, - // because the ghosting ensures that the neighbor cells of the fracture elements are available. - // These neighbor cells are providing the node information to the fracture elements. - subRegion.calculateElementGeometricQuantities( nodeManager, faceManager ); + meshBody.forMeshLevels( [&]( MeshLevel & meshLevel ) + { + FaceManager & faceManager = meshLevel.getFaceManager(); + EdgeManager & edgeManager = meshLevel.getEdgeManager(); + NodeManager const & nodeManager = meshLevel.getNodeManager(); + ElementRegionManager & elementManager = meshLevel.getElemManager(); - // 2. Reorder the face map based on global numbering of neighboring cells - subRegion.flipFaceMap( faceManager, elementManager ); + elementManager.forElementSubRegions< FaceElementSubRegion >( [&]( FaceElementSubRegion & subRegion ) + { + /// 1. The computation of geometric quantities which is now possible for `FaceElementSubRegion`, + // because the ghosting ensures that the neighbor cells of the fracture elements are available. + // These neighbor cells are providing the node information to the fracture elements. + subRegion.calculateElementGeometricQuantities( nodeManager, faceManager ); - // 3. We flip the face normals of faces adjacent to the faceElements if they are not pointing in the - // direction of the fracture. - subRegion.fixNeighboringFacesNormals( faceManager, elementManager ); - } ); + // 2. Reorder the face map based on global numbering of neighboring cells + subRegion.flipFaceMap( faceManager, elementManager ); - faceManager.setIsExternal(); - edgeManager.setIsExternal( faceManager ); + // 3. We flip the face normals of faces adjacent to the faceElements if they are not pointing in the + // direction of the fracture. + subRegion.fixNeighboringFacesNormals( faceManager, elementManager ); } ); + + faceManager.setIsExternal(); + edgeManager.setIsExternal( faceManager ); } ); - } - catch( std::exception const & e ) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw e; - } + } ); } void ProblemManager::importFields() { - try - { - GEOS_MARK_FUNCTION; - DomainPartition & domain = getDomainPartition(); - MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); - meshManager.importFields( domain ); - } - catch( std::exception const & e ) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw e; - } + GEOS_MARK_FUNCTION; + DomainPartition & domain = getDomainPartition(); + MeshManager & meshManager = this->getGroup< MeshManager >( groupKeys.meshManager ); + meshManager.importFields( domain ); } void ProblemManager::applyNumericalMethods() { - try - { - DomainPartition & domain = getDomainPartition(); - ConstitutiveManager & constitutiveManager = domain.getGroup< ConstitutiveManager >( groupKeys.constitutiveManager ); - Group & meshBodies = domain.getMeshBodies(); + DomainPartition & domain = getDomainPartition(); + ConstitutiveManager & constitutiveManager = domain.getGroup< ConstitutiveManager >( groupKeys.constitutiveManager ); + Group & meshBodies = domain.getMeshBodies(); - // this contains a key tuple< mesh body name, mesh level name, region name, subregion name> with a value of the number of quadrature - // points. - map< std::tuple< string, string, string, string >, localIndex > const regionQuadrature = calculateRegionQuadrature( meshBodies ); + // this contains a key tuple< mesh body name, mesh level name, region name, subregion name> with a value of the number of quadrature + // points. + map< std::tuple< string, string, string, string >, localIndex > const regionQuadrature = calculateRegionQuadrature( meshBodies ); - setRegionQuadrature( meshBodies, constitutiveManager, regionQuadrature ); - } - catch( std::exception const & e ) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw e; - } + setRegionQuadrature( meshBodies, constitutiveManager, regionQuadrature ); } @@ -849,58 +749,50 @@ void ProblemManager::applyNumericalMethods() map< std::pair< string, Group const * const >, string_array const & > ProblemManager::getDiscretizations() const { - try - { - map< std::pair< string, Group const * const >, string_array const & > meshDiscretizations; + map< std::pair< string, Group const * const >, string_array const & > meshDiscretizations; - NumericalMethodsManager const & - numericalMethodManager = getGroup< NumericalMethodsManager >( groupKeys.numericalMethodsManager.key() ); + NumericalMethodsManager const & + numericalMethodManager = getGroup< NumericalMethodsManager >( groupKeys.numericalMethodsManager.key() ); - FiniteElementDiscretizationManager const & - feDiscretizationManager = numericalMethodManager.getFiniteElementDiscretizationManager(); + FiniteElementDiscretizationManager const & + feDiscretizationManager = numericalMethodManager.getFiniteElementDiscretizationManager(); - FiniteVolumeManager const & - fvDiscretizationManager = numericalMethodManager.getFiniteVolumeManager(); + FiniteVolumeManager const & + fvDiscretizationManager = numericalMethodManager.getFiniteVolumeManager(); - DomainPartition const & domain = getDomainPartition(); - Group const & meshBodies = domain.getMeshBodies(); + DomainPartition const & domain = getDomainPartition(); + Group const & meshBodies = domain.getMeshBodies(); - m_physicsSolverManager->forSubGroups< PhysicsSolverBase >( [&]( PhysicsSolverBase & solver ) - { + m_physicsSolverManager->forSubGroups< PhysicsSolverBase >( [&]( PhysicsSolverBase & solver ) + { - solver.generateMeshTargetsFromTargetRegions( meshBodies ); + solver.generateMeshTargetsFromTargetRegions( meshBodies ); - string const discretizationName = solver.getDiscretizationName(); + string const discretizationName = solver.getDiscretizationName(); - Group const * - discretization = feDiscretizationManager.getGroupPointer( discretizationName ); + Group const * + discretization = feDiscretizationManager.getGroupPointer( discretizationName ); - if( discretization==nullptr ) - { - discretization = fvDiscretizationManager.getGroupPointer( discretizationName ); - } + if( discretization==nullptr ) + { + discretization = fvDiscretizationManager.getGroupPointer( discretizationName ); + } - if( discretization!=nullptr ) + if( discretization!=nullptr ) + { + solver.forDiscretizationOnMeshTargets( meshBodies, + [&]( string const & meshBodyName, + MeshLevel const &, + auto const & regionNames ) { - solver.forDiscretizationOnMeshTargets( meshBodies, - [&]( string const & meshBodyName, - MeshLevel const &, - auto const & regionNames ) - { - std::pair< string, Group const * const > key = std::make_pair( meshBodyName, discretization ); - meshDiscretizations.insert( { key, regionNames } ); - } ); - } - } ); + std::pair< string, Group const * const > key = std::make_pair( meshBodyName, discretization ); + meshDiscretizations.insert( { key, regionNames } ); + } ); + } + } ); - return meshDiscretizations; - } - catch( std::exception const & e ) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw e; - } + return meshDiscretizations; } void ProblemManager::generateMeshLevel( MeshLevel & meshLevel, @@ -908,107 +800,91 @@ void ProblemManager::generateMeshLevel( MeshLevel & meshLevel, Group const * const discretization, string_array const & ) { - try + if( discretization != nullptr ) { - if( discretization != nullptr ) - { - auto const * const - feDisc = dynamic_cast< FiniteElementDiscretization const * >(discretization); + auto const * const + feDisc = dynamic_cast< FiniteElementDiscretization const * >(discretization); - auto const * const - fvsDisc = dynamic_cast< FluxApproximationBase const * >(discretization); + auto const * const + fvsDisc = dynamic_cast< FluxApproximationBase const * >(discretization); - auto const * const - fvhDisc = dynamic_cast< HybridMimeticDiscretization const * >(discretization); + auto const * const + fvhDisc = dynamic_cast< HybridMimeticDiscretization const * >(discretization); - if( feDisc==nullptr && fvsDisc==nullptr && fvhDisc==nullptr ) - { - GEOS_ERROR( "Group expected to cast to a discretization object." ); - } - } - - NodeManager & nodeManager = meshLevel.getNodeManager(); - EdgeManager & edgeManager = meshLevel.getEdgeManager(); - FaceManager & faceManager = meshLevel.getFaceManager(); - ElementRegionManager & elemRegionManager = meshLevel.getElemManager(); - - bool const isBaseMeshLevel = meshLevel.getName() == MeshBody::groupStructKeys::baseDiscretizationString(); - - elemRegionManager.generateMesh( cellBlockManager ); - nodeManager.setGeometricalRelations( cellBlockManager, elemRegionManager, isBaseMeshLevel ); - edgeManager.setGeometricalRelations( cellBlockManager, isBaseMeshLevel ); - faceManager.setGeometricalRelations( cellBlockManager, elemRegionManager, nodeManager, isBaseMeshLevel ); - nodeManager.constructGlobalToLocalMap( cellBlockManager ); - // Edge, face and element region managers rely on the sets provided by the node manager. - // This is why `nodeManager.buildSets` is called first. - nodeManager.buildSets( cellBlockManager, this->getGroup< GeometricObjectManager >( groupKeys.geometricObjectManager ) ); - edgeManager.buildSets( nodeManager ); - faceManager.buildSets( nodeManager ); - elemRegionManager.buildSets( nodeManager ); - // The edge manager do not hold any information related to the regions nor the elements. - // This is why the element region manager is not provided. - nodeManager.setupRelatedObjectsInRelations( edgeManager, faceManager, elemRegionManager ); - edgeManager.setupRelatedObjectsInRelations( nodeManager, faceManager ); - faceManager.setupRelatedObjectsInRelations( nodeManager, edgeManager, elemRegionManager ); - // Node and edge managers rely on the boundary information provided by the face manager. - // This is why `faceManager.setDomainBoundaryObjects` is called first. - faceManager.setDomainBoundaryObjects( elemRegionManager ); - edgeManager.setDomainBoundaryObjects( faceManager ); - nodeManager.setDomainBoundaryObjects( faceManager, edgeManager ); - - meshLevel.generateSets(); - - elemRegionManager.forElementSubRegions< ElementSubRegionBase >( [&]( ElementSubRegionBase & subRegion ) + if( feDisc==nullptr && fvsDisc==nullptr && fvhDisc==nullptr ) { - subRegion.setupRelatedObjectsInRelations( meshLevel ); - // `FaceElementSubRegion` has no node and therefore needs the nodes positions from the neighbor elements - // in order to compute the geometric quantities. - // And this point of the process, the ghosting has not been done and some elements of the `FaceElementSubRegion` - // can have no neighbor. Making impossible the computation, which is therfore postponed to after the ghosting. - if( isBaseMeshLevel && !dynamicCast< FaceElementSubRegion * >( &subRegion ) ) - { - subRegion.calculateElementGeometricQuantities( nodeManager, faceManager ); - } - subRegion.setMaxGlobalIndex(); - } ); - elemRegionManager.setMaxGlobalIndex(); + GEOS_ERROR( "Group expected to cast to a discretization object." ); + } } - catch( std::exception const & e ) + + NodeManager & nodeManager = meshLevel.getNodeManager(); + EdgeManager & edgeManager = meshLevel.getEdgeManager(); + FaceManager & faceManager = meshLevel.getFaceManager(); + ElementRegionManager & elemRegionManager = meshLevel.getElemManager(); + + bool const isBaseMeshLevel = meshLevel.getName() == MeshBody::groupStructKeys::baseDiscretizationString(); + + elemRegionManager.generateMesh( cellBlockManager ); + nodeManager.setGeometricalRelations( cellBlockManager, elemRegionManager, isBaseMeshLevel ); + edgeManager.setGeometricalRelations( cellBlockManager, isBaseMeshLevel ); + faceManager.setGeometricalRelations( cellBlockManager, elemRegionManager, nodeManager, isBaseMeshLevel ); + nodeManager.constructGlobalToLocalMap( cellBlockManager ); + // Edge, face and element region managers rely on the sets provided by the node manager. + // This is why `nodeManager.buildSets` is called first. + nodeManager.buildSets( cellBlockManager, this->getGroup< GeometricObjectManager >( groupKeys.geometricObjectManager ) ); + edgeManager.buildSets( nodeManager ); + faceManager.buildSets( nodeManager ); + elemRegionManager.buildSets( nodeManager ); + // The edge manager do not hold any information related to the regions nor the elements. + // This is why the element region manager is not provided. + nodeManager.setupRelatedObjectsInRelations( edgeManager, faceManager, elemRegionManager ); + edgeManager.setupRelatedObjectsInRelations( nodeManager, faceManager ); + faceManager.setupRelatedObjectsInRelations( nodeManager, edgeManager, elemRegionManager ); + // Node and edge managers rely on the boundary information provided by the face manager. + // This is why `faceManager.setDomainBoundaryObjects` is called first. + faceManager.setDomainBoundaryObjects( elemRegionManager ); + edgeManager.setDomainBoundaryObjects( faceManager ); + nodeManager.setDomainBoundaryObjects( faceManager, edgeManager ); + + meshLevel.generateSets(); + + elemRegionManager.forElementSubRegions< ElementSubRegionBase >( [&]( ElementSubRegionBase & subRegion ) { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw e; - } + subRegion.setupRelatedObjectsInRelations( meshLevel ); + // `FaceElementSubRegion` has no node and therefore needs the nodes positions from the neighbor elements + // in order to compute the geometric quantities. + // And this point of the process, the ghosting has not been done and some elements of the `FaceElementSubRegion` + // can have no neighbor. Making impossible the computation, which is therfore postponed to after the ghosting. + if( isBaseMeshLevel && !dynamicCast< FaceElementSubRegion * >( &subRegion ) ) + { + subRegion.calculateElementGeometricQuantities( nodeManager, faceManager ); + } + subRegion.setMaxGlobalIndex(); + } ); + elemRegionManager.setMaxGlobalIndex(); } void ProblemManager::generateMeshLevel( MeshLevel & meshLevel, ParticleBlockManagerABC & particleBlockManager, string_array const & ) { - try - { - ParticleManager & particleManager = meshLevel.getParticleManager(); + ParticleManager & particleManager = meshLevel.getParticleManager(); - if( meshLevel.getName() == MeshBody::groupStructKeys::baseDiscretizationString() ) - { - particleManager.generateMesh( particleBlockManager ); - } + if( meshLevel.getName() == MeshBody::groupStructKeys::baseDiscretizationString() ) + { + particleManager.generateMesh( particleBlockManager ); + } - meshLevel.generateSets(); + meshLevel.generateSets(); - if( meshLevel.getName() == MeshBody::groupStructKeys::baseDiscretizationString() ) + if( meshLevel.getName() == MeshBody::groupStructKeys::baseDiscretizationString() ) + { + particleManager.forParticleSubRegions< ParticleSubRegionBase >( [&]( ParticleSubRegionBase & subRegion ) { - particleManager.forParticleSubRegions< ParticleSubRegionBase >( [&]( ParticleSubRegionBase & subRegion ) - { - subRegion.setMaxGlobalIndex(); - } ); + subRegion.setMaxGlobalIndex(); + } ); - particleManager.setMaxGlobalIndex(); - } - } - catch( std::exception const & e ) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw e; + particleManager.setMaxGlobalIndex(); } } @@ -1249,71 +1125,38 @@ void ProblemManager::setRegionQuadrature( Group & meshBodies, bool ProblemManager::runSimulation() { - try - { - return m_eventManager->run( getDomainPartition() ); - } - catch( std::exception const & e ) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw e; - } + return m_eventManager->run( getDomainPartition() ); } DomainPartition & ProblemManager::getDomainPartition() { - try - { - return getGroup< DomainPartition >( groupKeys.domain ); - } - catch( std::exception const & e ) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw e; - } + return getGroup< DomainPartition >( groupKeys.domain ); } DomainPartition const & ProblemManager::getDomainPartition() const { - try - { - return getGroup< DomainPartition >( groupKeys.domain ); - } - catch( std::exception const & e ) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw e; - } + return getGroup< DomainPartition >( groupKeys.domain ); } void ProblemManager::applyInitialConditions() { - try + m_fieldSpecificationManager->forSubGroups< FieldSpecificationBase >( [&]( FieldSpecificationBase & fs ) { + fs.setMeshObjectPath( getDomainPartition().getMeshBodies() ); + } ); - m_fieldSpecificationManager->forSubGroups< FieldSpecificationBase >( [&]( FieldSpecificationBase & fs ) - { - fs.setMeshObjectPath( getDomainPartition().getMeshBodies() ); - } ); - - getDomainPartition().forMeshBodies( [&] ( MeshBody & meshBody ) + getDomainPartition().forMeshBodies( [&] ( MeshBody & meshBody ) + { + meshBody.forMeshLevels( [&] ( MeshLevel & meshLevel ) { - meshBody.forMeshLevels( [&] ( MeshLevel & meshLevel ) + if( !meshLevel.isShallowCopy() ) // to avoid messages printed three times { - if( !meshLevel.isShallowCopy() ) // to avoid messages printed three times - { - m_fieldSpecificationManager->validateBoundaryConditions( meshLevel ); - } - m_fieldSpecificationManager->applyInitialConditions( meshLevel ); - } ); + m_fieldSpecificationManager->validateBoundaryConditions( meshLevel ); + } + m_fieldSpecificationManager->applyInitialConditions( meshLevel ); } ); - initializePostInitialConditions(); - } - catch( std::exception const & e ) - { - errorLogger.write( errorLogger.currentErrorMsg() ); - throw e; - } + } ); + initializePostInitialConditions(); } void ProblemManager::readRestartOverwrite() From 86f793ed53c5d705031aff49385463c5314c90b8 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Tue, 27 May 2025 09:47:09 +0200 Subject: [PATCH 022/173] set priority --- .../common/unitTests/testErrorHandling.cpp | 36 +++++++++---------- .../multifluid/CO2Brine/CO2BrineFluid.cpp | 9 +++-- .../multifluid/blackOil/BlackOilFluidBase.cpp | 8 ++--- .../reactive/ReactiveBrineFluid.cpp | 3 +- src/coreComponents/events/EventBase.cpp | 2 +- .../FieldSpecificationBase.cpp | 2 +- .../FieldSpecificationBase.hpp | 2 +- .../fileIO/Outputs/TimeHistoryOutput.cpp | 2 +- .../timeHistory/HistoryCollectionBase.cpp | 2 +- .../fileIO/timeHistory/PackCollection.cpp | 2 +- src/coreComponents/mesh/FaceManager.cpp | 2 +- .../mesh/generators/InternalMeshGenerator.cpp | 2 +- .../wells/CompositionalMultiphaseWell.cpp | 4 +-- 13 files changed, 40 insertions(+), 36 deletions(-) diff --git a/src/coreComponents/common/unitTests/testErrorHandling.cpp b/src/coreComponents/common/unitTests/testErrorHandling.cpp index c4c77e9405e..0e571b386ff 100644 --- a/src/coreComponents/common/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/common/unitTests/testErrorHandling.cpp @@ -20,23 +20,23 @@ using namespace geos; -TEST( ErrorHandling, testYaml ) -{ - std::map map; - map["inputFile"] = "./simpleCo2Inj.xml"; - map["inputLineLine"] = "42"; +// TEST( ErrorHandling, testYaml ) +// { +// std::map map; +// map["inputFile"] = "./simpleCo2Inj.xml"; +// map["inputLineLine"] = "42"; - geos::ErrorLogger::ErrorMsg msgStruct( geos::ErrorLogger::MsgType::Error, - "msg content", - "dev file name", - 24 ); - msgStruct.addContextInfo( std::move( map ) ); - errorLogger.write( msgStruct ); -} +// geos::ErrorLogger::ErrorMsg msgStruct( geos::ErrorLogger::MsgType::Error, +// "msg content", +// "dev file name", +// 24 ); +// msgStruct.addContextInfo( std::move( map ) ); +// errorLogger.write( msgStruct ); +// } -int main( int ac, char * av[] ) -{ - ::testing::InitGoogleTest( &ac, av ); - int const result = RUN_ALL_TESTS(); - return result; -} +// int main( int ac, char * av[] ) +// { +// ::testing::InitGoogleTest( &ac, av ); +// int const result = RUN_ALL_TESTS(); +// return result; +// } diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp index 022bdbc3208..3961c94eb22 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp @@ -170,7 +170,8 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const { string const errorMsg = GEOS_FMT( "Table input error for {} phase (in table from \"{}\").\n", m_phaseNames[m_p1Index], m_phasePVTParaFiles[m_p1Index] ); - errorLogger.currentErrorMsg().addToMsg( errorMsg ); + errorLogger.currentErrorMsg().addToMsg( errorMsg ) + .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); throw SimulationError( ex, errorMsg ); } @@ -183,7 +184,8 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const { string const errorMsg = GEOS_FMT( "Table input error for {} phase (in table from \"{}\").\n", m_phaseNames[m_p2Index], m_phasePVTParaFiles[m_p2Index] ); - errorLogger.currentErrorMsg().addToMsg( errorMsg ); + errorLogger.currentErrorMsg().addToMsg( errorMsg ) + .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); throw SimulationError( ex, errorMsg ); } @@ -194,7 +196,8 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const { string const errorMsg = GEOS_FMT( "Table input error for flash phase (in table from \"{}\").\n", m_flashModelParaFile ); - errorLogger.currentErrorMsg().addToMsg( errorMsg ); + errorLogger.currentErrorMsg().addToMsg( errorMsg ) + .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); throw SimulationError( ex, errorMsg ); } } diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp index 71bc09bbcd2..c651db73bb1 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp @@ -256,10 +256,10 @@ void BlackOilFluidBase::checkTablesParameters( real64 const pressure, } catch( SimulationError const & ex ) { string const msg = GEOS_FMT( errorMsg, getCatalogName(), getDataContext(), - "formation volume factor", iph ); + "formation volume factor", iph ); errorLogger.currentErrorMsg() .addToMsg( msg ) - .addContextInfo( getDataContext().getContextInfo() ); + .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); throw SimulationError( ex, msg ); } @@ -269,10 +269,10 @@ void BlackOilFluidBase::checkTablesParameters( real64 const pressure, } catch( SimulationError const & ex ) { string const msg = GEOS_FMT( errorMsg, getCatalogName(), getDataContext(), - "viscosity", iph ); + "viscosity", iph ); errorLogger.currentErrorMsg() .addToMsg( msg ) - .addContextInfo( getDataContext().getContextInfo() ); + .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); throw SimulationError( ex, msg ); } } diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp index d13b27bfcd9..8cc433aae5f 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp @@ -233,7 +233,8 @@ void ReactiveBrineFluid< PHASE >::checkTablesParameters( real64 const pressure, { string const errorMsg = GEOS_FMT( "Table input error (in table from {}).\n", stringutilities::join( m_phasePVTParaFiles ) ); - errorLogger.currentErrorMsg().addToMsg( errorMsg ); + errorLogger.currentErrorMsg().addToMsg( errorMsg ) + .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); throw SimulationError( ex, errorMsg ); } } diff --git a/src/coreComponents/events/EventBase.cpp b/src/coreComponents/events/EventBase.cpp index 7a14d8e7203..9c5ad73af7f 100644 --- a/src/coreComponents/events/EventBase.cpp +++ b/src/coreComponents/events/EventBase.cpp @@ -157,7 +157,7 @@ void EventBase::getTargetReferences() getWrapperDataContext( viewKeyStruct::eventTargetString() ) ); errorLogger.currentErrorMsg() .addToMsg( errorMsg ) - .addContextInfo( getWrapperDataContext( viewKeyStruct::eventTargetString() ).getContextInfo() ); + .addContextInfo( getWrapperDataContext( viewKeyStruct::eventTargetString() ).getContextInfo().setPriority( 1 ) ); throw InputError( e, errorMsg ); } } diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp b/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp index 3c95a795307..acc92969ef9 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp @@ -113,7 +113,7 @@ void FieldSpecificationBase::setMeshObjectPath( Group const & meshBodies ) errorLogger.currentErrorMsg() .addToMsg( getWrapperDataContext( viewKeyStruct::objectPathString() ).toString() + " is a wrong objectPath: " + m_objectPath + "\n" ) - .addContextInfo( getWrapperDataContext( viewKeyStruct::objectPathString() ).getContextInfo() ); + .addContextInfo( getWrapperDataContext( viewKeyStruct::objectPathString() ).getContextInfo().setPriority( 2 ) ); throw InputError( e, getWrapperDataContext( viewKeyStruct::objectPathString() ).toString() + " is a wrong objectPath: " + m_objectPath + "\n" ); } diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp index cc870380a07..b6e7f16094c 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp @@ -626,7 +626,7 @@ void FieldSpecificationBase::applyFieldValueKernel( ArrayView< T, N, USD > const getWrapperDataContext( viewKeyStruct::functionNameString() ) ); errorLogger.currentErrorMsg() .addToMsg( errorMsg ) - .addContextInfo( getWrapperDataContext( viewKeyStruct::functionNameString() ).getContextInfo() ); + .addContextInfo( getWrapperDataContext( viewKeyStruct::functionNameString() ).getContextInfo().setPriority( 1 ) ); throw InputError( e, errorMsg ); } }(); diff --git a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp index 5c44cafd6a2..2c3a88213c5 100644 --- a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp @@ -162,7 +162,7 @@ void TimeHistoryOutput::initializePostInitialConditionsPostSubGroups() getWrapperDataContext( viewKeys::timeHistoryOutputTargetString() ) ); errorLogger.currentErrorMsg() .addToMsg( errorMsg ) - .addContextInfo( getWrapperDataContext( viewKeys::timeHistoryOutputTargetString() ).getContextInfo() ); + .addContextInfo( getWrapperDataContext( viewKeys::timeHistoryOutputTargetString() ).getContextInfo().setPriority( 1 ) ); throw InputError( e, errorMsg ); } } diff --git a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp index 32959db87c7..d7d88b76d5b 100644 --- a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp +++ b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp @@ -202,7 +202,7 @@ dataRepository::Group const * HistoryCollectionBase::getTargetObject( DomainPart { errorLogger.currentErrorMsg() .addToMsg( getDataContext().toString() + " has a wrong objectPath: " + objectPath + "\n" ) - .addContextInfo( getDataContext().getContextInfo() ); + .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); throw InputError( e, getDataContext().toString() + " has a wrong objectPath: " + objectPath + "\n" ); } } diff --git a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp index 17e73c2161b..442a39b4817 100644 --- a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp +++ b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp @@ -156,7 +156,7 @@ void PackCollection::updateSetsIndices( DomainPartition const & domain ) errorLogger.currentErrorMsg() .addToMsg( getWrapperDataContext( viewKeysStruct::fieldNameString() ).toString() + ": Target not found !\n" ) - .addContextInfo( getWrapperDataContext( viewKeysStruct::fieldNameString() ).getContextInfo() ); + .addContextInfo( getWrapperDataContext( viewKeysStruct::fieldNameString() ).getContextInfo().setPriority( 1 ) ); throw InputError( e, getWrapperDataContext( viewKeysStruct::fieldNameString() ).toString() + ": Target not found !\n" ); } diff --git a/src/coreComponents/mesh/FaceManager.cpp b/src/coreComponents/mesh/FaceManager.cpp index d75e67c613c..e997f9bc28d 100644 --- a/src/coreComponents/mesh/FaceManager.cpp +++ b/src/coreComponents/mesh/FaceManager.cpp @@ -300,7 +300,7 @@ void FaceManager::sortAllFaceNodes( NodeManager const & nodeManager, { errorLogger.currentErrorMsg() .addToMsg( getDataContext().toString() + ": " + e.what() ) - .addContextInfo( getDataContext().getContextInfo() ); + .addContextInfo( getDataContext().getContextInfo().setPriority( 1 ) ); throw std::runtime_error( getDataContext().toString() + ": " + e.what() ); } } ); diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp index cefd664009f..fc4d2076830 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp @@ -185,7 +185,7 @@ void InternalMeshGenerator::postInputInitialization() errorLogger.currentErrorMsg() .addToMsg( "InternalMesh " + wrapper.getDataContext().toString() + ", element index = " + std::to_string( i ) + ": " ) - .addContextInfo( wrapper.getDataContext().getContextInfo() ); + .addContextInfo( wrapper.getDataContext().getContextInfo().setPriority( 2 ) ); throw InputError( e, "InternalMesh " + wrapper.getDataContext().toString() + ", element index = " + std::to_string( i ) + ": " ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 1750789ee58..9f731095ce0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -339,7 +339,7 @@ void compareMulticomponentModels( MODEL1_TYPE const & lhs, MODEL2_TYPE const & r { GEOS_THROW_IF_NE_MSG( lhs.componentNames()[ic], rhs.componentNames()[ic], GEOS_FMT( "Mismatch in component names between constitutive models {} and {}", - lhs.getDataContext(), rhs.getDataContext() ), + lhs.getDataContext (), rhs.getDataContext() ), InputError ); } } @@ -365,7 +365,7 @@ void CompositionalMultiphaseWell::validateWellControlsForFluid( WellControls con string const errorMsg = GEOS_FMT( "{}: wrong surface pressure / temperature.\n", getDataContext() ); errorLogger.currentErrorMsg() .addToMsg( errorMsg ) - .addContextInfo( getDataContext().getContextInfo() ); + .addContextInfo( getDataContext().getContextInfo().setPriority( 1 ) ); throw SimulationError( ex, errorMsg ); } } From 8a8117efeb60fb0a1e5161f3c58bd17b7354d5ef Mon Sep 17 00:00:00 2001 From: amandinehry Date: Tue, 27 May 2025 14:20:51 +0200 Subject: [PATCH 023/173] errors cli modification: add --errors-output --- src/coreComponents/mainInterface/initialization.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/coreComponents/mainInterface/initialization.cpp b/src/coreComponents/mainInterface/initialization.cpp index c33da0c59a7..50142f0f806 100644 --- a/src/coreComponents/mainInterface/initialization.cpp +++ b/src/coreComponents/mainInterface/initialization.cpp @@ -124,6 +124,7 @@ std::unique_ptr< CommandLineOptions > parseCommandLineOptions( int argc, char * { TRACE_DATA_MIGRATION, 0, "", "trace-data-migration", Arg::None, "\t--trace-data-migration, \t Trace host-device data migration" }, { MEMORY_USAGE, 0, "m", "memory-usage", Arg::nonEmpty, "\t-m, --memory-usage, \t Minimum threshold for printing out memory allocations in a member of the data repository." }, { PAUSE_FOR, 0, "", "pause-for", Arg::numeric, "\t--pause-for, \t Pause geosx for a given number of seconds before starting execution" }, + { ERRORS, 0, "e", "errorsOutput", Arg::nonEmpty, "\t-e, \t Output path for the errors file" }, { 0, 0, nullptr, nullptr, nullptr, nullptr } }; From 2c0f5aafcfd3b40adf011fdd0b100680852fcd8a Mon Sep 17 00:00:00 2001 From: amandinehry Date: Tue, 27 May 2025 14:20:51 +0200 Subject: [PATCH 024/173] errors cli modification: add --errors-output --- src/coreComponents/mainInterface/initialization.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/mainInterface/initialization.cpp b/src/coreComponents/mainInterface/initialization.cpp index 50142f0f806..f94d991549e 100644 --- a/src/coreComponents/mainInterface/initialization.cpp +++ b/src/coreComponents/mainInterface/initialization.cpp @@ -124,7 +124,7 @@ std::unique_ptr< CommandLineOptions > parseCommandLineOptions( int argc, char * { TRACE_DATA_MIGRATION, 0, "", "trace-data-migration", Arg::None, "\t--trace-data-migration, \t Trace host-device data migration" }, { MEMORY_USAGE, 0, "m", "memory-usage", Arg::nonEmpty, "\t-m, --memory-usage, \t Minimum threshold for printing out memory allocations in a member of the data repository." }, { PAUSE_FOR, 0, "", "pause-for", Arg::numeric, "\t--pause-for, \t Pause geosx for a given number of seconds before starting execution" }, - { ERRORS, 0, "e", "errorsOutput", Arg::nonEmpty, "\t-e, \t Output path for the errors file" }, + { ERRORS, 0, "e", "errorsOutput", Arg::nonEmpty, "\t-e, --errors-output, \t Output path for the errors file" }, { 0, 0, nullptr, nullptr, nullptr, nullptr } }; From eb2f691863c992eb3325f7c87c3ec2be1bfa60e2 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Tue, 27 May 2025 17:09:02 +0200 Subject: [PATCH 025/173] Replace original macros --- src/coreComponents/common/logger/Logger.hpp | 87 ++++++++++++++++++- .../dataRepository/DataContext.hpp | 72 --------------- 2 files changed, 83 insertions(+), 76 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 4ae21ba3e74..cd4a2cd9f06 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -144,7 +144,8 @@ __oss << "***** LOCATION: " LOCATION "\n"; \ __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ __oss << MSG << "\n"; \ - __oss << LvArray::system::stackTrace( true ); \ + std::string stackHistory = LvArray::system::stackTrace( true ); \ + __oss << stackHistory; \ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ @@ -152,7 +153,35 @@ __msgoss.str(), \ __FILE__, \ __LINE__ ); \ - msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ + msgStruct.addCallStackInfo( stackHistory ); \ + errorLogger.write( msgStruct ); \ + LvArray::system::callErrorHandler(); \ + } \ + } while( false ) + +// - utiliser le builder d'ErrorMsg +#define GEOS_ERROR_CTX_IF( EXP, MSG, ... ) \ + do \ + { \ + if( EXP ) \ + { \ + std::ostringstream __oss; \ + __oss << "***** ERROR\n"; \ + __oss << "***** LOCATION: " LOCATION "\n"; \ + __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ + __oss << MSG << "\n"; \ + std::string stackHistory = LvArray::system::stackTrace( true ); \ + __oss << stackHistory; \ + std::cout << __oss.str() << std::endl; \ + std::ostringstream __msgoss; \ + __msgoss << MSG; \ + ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ + __msgoss.str(), \ + __FILE__, \ + __LINE__ ); \ + msgStruct.addRankInfo( ::geos::logger::internal::rank ); \ + msgStruct.addContextInfo( __VA_ARGS__ ); \ + msgStruct.addCallStackInfo( stackHistory ); \ errorLogger.write( msgStruct ); \ LvArray::system::callErrorHandler(); \ } \ @@ -191,7 +220,8 @@ __oss << "***** LOCATION: " LOCATION "\n"; \ __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ __oss << MSG << "\n"; \ - __oss << LvArray::system::stackTrace( true ); \ + std::string stackHistory = LvArray::system::stackTrace( true ); \ + __oss << stackHistory; \ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ @@ -199,7 +229,32 @@ errorLogger.currentErrorMsg().setCodeLocation( __FILE__, __LINE__ ); \ errorLogger.currentErrorMsg().addToMsg( __msgoss.str() ); \ errorLogger.currentErrorMsg().addRankInfo( ::geos::logger::internal::rank ); \ - errorLogger.currentErrorMsg().addCallStackInfo( LvArray::system::stackTrace( true ) ); \ + errorLogger.currentErrorMsg().addCallStackInfo( stackHistory ); \ + throw EXCEPTIONTYPE( __oss.str() ); \ + } \ + } while( false ) + +#define GEOS_THROW_CTX_IF( EXP, MSG, EXCEPTIONTYPE, ... ) \ + do \ + { \ + if( EXP ) \ + { \ + std::ostringstream __oss; \ + __oss << "\n"; \ + __oss << "***** LOCATION: " LOCATION "\n"; \ + __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ + __oss << MSG << "\n"; \ + std::string stackHistory = LvArray::system::stackTrace( true ); \ + __oss << stackHistory; \ + std::cout << __oss.str() << std::endl; \ + std::ostringstream __msgoss; \ + __msgoss << MSG; \ + errorLogger.currentErrorMsg().setType( ErrorLogger::MsgType::Error ); \ + errorLogger.currentErrorMsg().setCodeLocation( __FILE__, __LINE__ ); \ + errorLogger.currentErrorMsg().addToMsg( __msgoss.str() ); \ + errorLogger.currentErrorMsg().addRankInfo( ::geos::logger::internal::rank ); \ + errorLogger.currentErrorMsg().addContextInfo( __VA_ARGS__ ); \ + errorLogger.currentErrorMsg().addCallStackInfo( stackHistory ); \ throw EXCEPTIONTYPE( __oss.str() ); \ } \ } while( false ) @@ -254,6 +309,30 @@ } \ } while( false ) +#define GEOS_WARNING_CTX_IF( EXP, MSG, ... ) \ + do \ + { \ + if( EXP ) \ + { \ + std::ostringstream __oss; \ + __oss << "***** WARNING\n"; \ + __oss << "***** LOCATION: " LOCATION "\n"; \ + __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ + __oss << MSG; \ + std::cout << __oss.str() << std::endl; \ + std::ostringstream __msgoss; \ + __msgoss << MSG; \ + ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ + __msgoss.str(), \ + __FILE__, \ + __LINE__ ); \ + msgStruct.addRankInfo( ::geos::logger::internal::rank ); \ + msgStruct.addContextInfo( __VA_ARGS__ ); \ + msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ + errorLogger.write( msgStruct ); \ + } \ + } while( false ) + /** * @brief Conditionally report a warning. * @param EXP an expression that will be evaluated as a predicate diff --git a/src/coreComponents/dataRepository/DataContext.hpp b/src/coreComponents/dataRepository/DataContext.hpp index 540c0ddafbb..840c7686b49 100644 --- a/src/coreComponents/dataRepository/DataContext.hpp +++ b/src/coreComponents/dataRepository/DataContext.hpp @@ -230,78 +230,6 @@ class DataFileContext final : public DataContext }; -#define GEOS_THROW_CTX_IF( EXP, MSG, EXCEPTIONTYPE, ... ) \ - do \ - { \ - if( EXP ) \ - { \ - std::ostringstream __oss; \ - __oss << "\n"; \ - __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << MSG << "\n"; \ - __oss << LvArray::system::stackTrace( true ); \ - std::cout << __oss.str() << std::endl; \ - std::ostringstream __msgoss; \ - __msgoss << MSG; \ - errorLogger.currentErrorMsg().setType( ErrorLogger::MsgType::Error ); \ - errorLogger.currentErrorMsg().setCodeLocation( __FILE__, __LINE__ ); \ - errorLogger.currentErrorMsg().addToMsg( __msgoss.str() ); \ - errorLogger.currentErrorMsg().addRankInfo( ::geos::logger::internal::rank ); \ - errorLogger.currentErrorMsg().addContextInfo( __VA_ARGS__ ); \ - errorLogger.currentErrorMsg().addCallStackInfo( LvArray::system::stackTrace( true ) ); \ - throw EXCEPTIONTYPE( __oss.str() ); \ - } \ - } while( false ) - -#define GEOS_ERROR_CTX_IF( EXP, MSG, dataContext ) \ - do \ - { \ - if( EXP ) \ - { \ - std::ostringstream __oss; \ - __oss << "***** ERROR\n"; \ - __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << MSG << "\n"; \ - __oss << LvArray::system::stackTrace( true ); \ - std::cout << __oss.str() << std::endl; \ - std::ostringstream __msgoss; \ - __msgoss << MSG; \ - ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ - __msgoss.str(), \ - __FILE__, \ - __LINE__ ); \ - msgStruct.addContextInfo( dataContext ); \ - msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ - errorLogger.write( msgStruct ); \ - LvArray::system::callErrorHandler(); \ - } \ - } while( false ) - -#define GEOS_WARNING_CTX_IF( EXP, MSG, dataContext ) \ - do \ - { \ - if( EXP ) \ - { \ - std::ostringstream __oss; \ - __oss << "***** WARNING\n"; \ - __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << MSG; \ - std::cout << __oss.str() << std::endl; \ - std::ostringstream __msgoss; \ - __msgoss << MSG; \ - ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ - __msgoss.str(), \ - __FILE__, \ - __LINE__ ); \ - msgStruct.addContextInfo( dataContext ); \ - msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ - errorLogger.write( msgStruct ); \ - } \ - } while( false ) - } /* namespace dataRepository */ } /* namespace geos */ From 7b5f293f0c9aefa505032ab7e57e38dba0699f3f Mon Sep 17 00:00:00 2001 From: amandinehry Date: Tue, 27 May 2025 17:58:27 +0200 Subject: [PATCH 026/173] Correction: replace original macros --- .../common/logger/ErrorHandling.cpp | 7 +++-- .../common/logger/ErrorHandling.hpp | 13 ++------- src/coreComponents/common/logger/Logger.hpp | 29 ++++++++++--------- 3 files changed, 22 insertions(+), 27 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 1e9f038b22d..b5a7c95a02a 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -61,12 +61,13 @@ void ErrorLogger::ErrorMsg::addContextInfoImpl( ErrorLogger::ContextInfo && ctxI m_contextsInfo.emplace_back( std::move( ctxInfo ) ); } -void ErrorLogger::ErrorMsg::addRankInfo( int rank ) +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setRank( int rank ) { m_ranksInfo.push_back( rank ); + return *this; } -void ErrorLogger::ErrorMsg::addCallStackInfo( std::string const & ossStackTrace ) +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addCallStackInfo( std::string const & ossStackTrace ) { std::istringstream iss( ossStackTrace ); std::string stackLine; @@ -77,6 +78,8 @@ void ErrorLogger::ErrorMsg::addCallStackInfo( std::string const & ossStackTrace index = stackLine.find( ':' ); m_sourceCallStack.push_back( stackLine.substr( index + 1 ) ); } + + return *this; } std::string ErrorLogger::toString( ErrorLogger::MsgType type ) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 87fba3ecc76..c360e2f416f 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -53,13 +53,6 @@ class ErrorLogger Error, Warning }; - - // TODO: changer le nom - // Solution possible: - // - Ne plus communiquer des contexts info avec des maps mais avec la struct ContextInfo - // - Ajouter une méthode avec le design pattern builder qui reglerait la priorité - // Il faudrait un couple de méthodes addContextInfo(): - // un qui prendrait DataCOntext et l'autre ContextInfo prélablement buildé struct ContextInfo { std::map< std::string, std::string > m_ctxInfo; @@ -140,14 +133,14 @@ class ErrorLogger template< typename ... Args > void addContextInfo( Args && ... args ); - void addRankInfo( int rank ); + ErrorMsg & setRank( int rank ); /** * @brief Add stack trace information about the error/warning message to the ErrorMsg structure * * @param ossStackTrace stack trace information */ - void addCallStackInfo( std::string const & ossStackTrace ); + ErrorLogger::ErrorMsg & addCallStackInfo( std::string const & ossStackTrace ); private: /** @@ -194,8 +187,6 @@ class ErrorLogger extern ErrorLogger errorLogger; -// >TODO : Priorité normale 0 puis décroître mais possibilité d'aller à 1, 2, ... -// exemple getGroup() à 0 et tout ce qui throw à cause de getGroup() > 0 template< typename ... Args > void ErrorLogger::ErrorMsg::addContextInfo( Args && ... args ) { diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index cd4a2cd9f06..2e2ba8f5a68 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -159,7 +159,6 @@ } \ } while( false ) -// - utiliser le builder d'ErrorMsg #define GEOS_ERROR_CTX_IF( EXP, MSG, ... ) \ do \ { \ @@ -179,7 +178,7 @@ __msgoss.str(), \ __FILE__, \ __LINE__ ); \ - msgStruct.addRankInfo( ::geos::logger::internal::rank ); \ + msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addContextInfo( __VA_ARGS__ ); \ msgStruct.addCallStackInfo( stackHistory ); \ errorLogger.write( msgStruct ); \ @@ -225,11 +224,12 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - errorLogger.currentErrorMsg().setType( ErrorLogger::MsgType::Error ); \ - errorLogger.currentErrorMsg().setCodeLocation( __FILE__, __LINE__ ); \ - errorLogger.currentErrorMsg().addToMsg( __msgoss.str() ); \ - errorLogger.currentErrorMsg().addRankInfo( ::geos::logger::internal::rank ); \ - errorLogger.currentErrorMsg().addCallStackInfo( stackHistory ); \ + errorLogger.currentErrorMsg() \ + .setType( ErrorLogger::MsgType::Error ) \ + .setCodeLocation( __FILE__, __LINE__ ) \ + .addToMsg( __msgoss.str() ) \ + .setRank( ::geos::logger::internal::rank ) \ + .addCallStackInfo( stackHistory ); \ throw EXCEPTIONTYPE( __oss.str() ); \ } \ } while( false ) @@ -249,12 +249,13 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - errorLogger.currentErrorMsg().setType( ErrorLogger::MsgType::Error ); \ - errorLogger.currentErrorMsg().setCodeLocation( __FILE__, __LINE__ ); \ - errorLogger.currentErrorMsg().addToMsg( __msgoss.str() ); \ - errorLogger.currentErrorMsg().addRankInfo( ::geos::logger::internal::rank ); \ - errorLogger.currentErrorMsg().addContextInfo( __VA_ARGS__ ); \ - errorLogger.currentErrorMsg().addCallStackInfo( stackHistory ); \ + errorLogger.currentErrorMsg() \ + .setType( ErrorLogger::MsgType::Error ) \ + .setCodeLocation( __FILE__, __LINE__ ) \ + .addToMsg( __msgoss.str() ) \ + .setRank( ::geos::logger::internal::rank ) \ + .addCallStackInfo( stackHistory ) \ + .addContextInfo( __VA_ARGS__ ); \ throw EXCEPTIONTYPE( __oss.str() ); \ } \ } while( false ) @@ -326,7 +327,7 @@ __msgoss.str(), \ __FILE__, \ __LINE__ ); \ - msgStruct.addRankInfo( ::geos::logger::internal::rank ); \ + msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addContextInfo( __VA_ARGS__ ); \ msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ errorLogger.write( msgStruct ); \ From c07b5024b0f98726ca7f74b9ad0e10490adc7376 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Mon, 2 Jun 2025 11:41:52 +0200 Subject: [PATCH 027/173] Modification of the Optional function to accept arguments separated by spaces. The previous condition checked whether an argument was present and whether the option was immediately followed by a value like -test"value", which excluded valid cases like -test "value" et -test "value". --- src/thirdparty/optionparser/src/optionparser.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/thirdparty/optionparser/src/optionparser.h b/src/thirdparty/optionparser/src/optionparser.h index ff46eab17a1..97da4907fde 100644 --- a/src/thirdparty/optionparser/src/optionparser.h +++ b/src/thirdparty/optionparser/src/optionparser.h @@ -904,9 +904,20 @@ struct Arg } //! @brief Returns ARG_OK if the argument is attached and ARG_IGNORE otherwise. + // static ArgStatus Optional(const Option& option, bool) + // { + // std::cout << "Name: " << option.name < Date: Mon, 2 Jun 2025 13:21:59 +0200 Subject: [PATCH 028/173] Reacting with the command line option -e / --errors-output --- .../common/logger/ErrorHandling.cpp | 6 +- .../common/logger/ErrorHandling.hpp | 77 ++++++++++++-- src/coreComponents/common/logger/Logger.hpp | 100 +++++++++++------- .../dataRepository/unitTests/CMakeLists.txt | 3 +- .../unitTests/testDataContext.cpp | 38 ------- .../mainInterface/initialization.cpp | 14 ++- src/main/main.cpp | 10 +- 7 files changed, 153 insertions(+), 95 deletions(-) delete mode 100644 src/coreComponents/dataRepository/unitTests/testDataContext.cpp diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index b5a7c95a02a..d073da5756b 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -30,7 +30,6 @@ namespace geos { -static constexpr std::string_view m_filename = "errors.yaml"; static constexpr std::string_view g_level1Start = " - "; static constexpr std::string_view g_level1Next = " "; static constexpr std::string_view g_level2Start = " - "; @@ -38,12 +37,15 @@ static constexpr std::string_view g_level2Next = " "; static constexpr std::string_view g_level3Start = " - "; static constexpr std::string_view g_level3Next = " "; - ErrorLogger errorLogger{}; ErrorLogger::ErrorLogger() { m_currentErrorMsg.parent = this; +} + +void ErrorLogger::createFile() +{ std::ofstream yamlFile( std::string( m_filename ), std::ios::out ); if( yamlFile.is_open() ) { diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index c360e2f416f..dd527957ecb 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -44,6 +44,12 @@ class ErrorLogger */ ErrorLogger(); + /** + * @brief Create the yaml file if the option is specified in the command line options + * + */ + void createFile(); + /** * @enum MsgType * Enum listing the different types of possible errors @@ -53,11 +59,22 @@ class ErrorLogger Error, Warning }; + + /** + * @brief Stores contextual information about the error that occurred and assigns it a priority (default is 0) + * + */ struct ContextInfo { std::map< std::string, std::string > m_ctxInfo; integer m_priority = 0; + /** + * @brief Set the priority of the current error context information + * + * @param priority + * @return ContextInfo& + */ ContextInfo & setPriority( integer priority ) { m_priority = priority; return *this; } }; @@ -105,6 +122,7 @@ class ErrorLogger * @return ErrorMsg& */ ErrorMsg & addToMsg( std::exception const & e ); + /** * @brief * @@ -112,6 +130,7 @@ class ErrorLogger * @return ErrorMsg& */ ErrorMsg & addToMsg( std::string const & msg ); + /** * @brief Set the Code Location object * @@ -120,6 +139,7 @@ class ErrorLogger * @return ErrorMsg& */ ErrorMsg & setCodeLocation( string msgFile, integer msgLine ); + /** * @brief Set the Type object * @@ -128,11 +148,21 @@ class ErrorLogger */ ErrorMsg & setType( MsgType msgType ); - // void addContextInfo( std::map< std::string, std::string > && info ); - + /** + * @brief Adds one or more context elements to the error + * + * @tparam Args + * @param args + */ template< typename ... Args > void addContextInfo( Args && ... args ); + /** + * @brief Set the rank on which the error is raised + * + * @param rank + * @return ErrorMsg& + */ ErrorMsg & setRank( int rank ); /** @@ -142,13 +172,13 @@ class ErrorLogger */ ErrorLogger::ErrorMsg & addCallStackInfo( std::string const & ossStackTrace ); -private: - /** - * @brief Add contextual information about the error/warning message to the ErrorMsg structure - * - * @param info DataContext information stored into a map - */ - void addContextInfoImpl( ContextInfo && ctxInfo ); + private: + /** + * @brief Add contextual information about the error/warning message to the ErrorMsg structure + * + * @param info DataContext information stored into a map + */ + void addContextInfoImpl( ContextInfo && ctxInfo ); }; /** @@ -180,9 +210,38 @@ class ErrorLogger */ void write( ErrorMsg const & errorMsg ); + /** + * @brief Returns true whether the yaml file writing option is enabled by the user otherwise false + * + * @return true + * @return false + */ + bool writeFile() const + { return m_writeYaml; } + + /** + * @brief Set the Write Value object + * True whether the yaml file writing option is enabled by the user otherwise false + * @param value + */ + void setWriteValue( bool value ) + { m_writeYaml = value; } + + /** + * @brief Set the name of the yaml file if specified by user (default is "errors.yaml") + * + * @param filename + */ + void setFilename( std::string filename ) + { m_filename = filename; } + private: // The error constructed via exceptions ErrorMsg m_currentErrorMsg; + // Write in the yaml file + bool m_writeYaml = false; + // Yaml file name + std::string m_filename = "errors.yaml"; }; extern ErrorLogger errorLogger; diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 2e2ba8f5a68..4ae82811ea7 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -149,12 +149,15 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ - __msgoss.str(), \ - __FILE__, \ - __LINE__ ); \ - msgStruct.addCallStackInfo( stackHistory ); \ - errorLogger.write( msgStruct ); \ + if( errorLogger.writeFile() ) \ + { \ + ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ + __msgoss.str(), \ + __FILE__, \ + __LINE__ ); \ + msgStruct.addCallStackInfo( stackHistory ); \ + errorLogger.write( msgStruct ); \ + } \ LvArray::system::callErrorHandler(); \ } \ } while( false ) @@ -174,14 +177,17 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ - __msgoss.str(), \ - __FILE__, \ - __LINE__ ); \ - msgStruct.setRank( ::geos::logger::internal::rank ); \ - msgStruct.addContextInfo( __VA_ARGS__ ); \ - msgStruct.addCallStackInfo( stackHistory ); \ - errorLogger.write( msgStruct ); \ + if( errorLogger.writeFile() ) \ + { \ + ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ + __msgoss.str(), \ + __FILE__, \ + __LINE__ ); \ + msgStruct.setRank( ::geos::logger::internal::rank ); \ + msgStruct.addContextInfo( __VA_ARGS__ ); \ + msgStruct.addCallStackInfo( stackHistory ); \ + errorLogger.write( msgStruct ); \ + } \ LvArray::system::callErrorHandler(); \ } \ } while( false ) @@ -224,12 +230,15 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - errorLogger.currentErrorMsg() \ - .setType( ErrorLogger::MsgType::Error ) \ - .setCodeLocation( __FILE__, __LINE__ ) \ - .addToMsg( __msgoss.str() ) \ - .setRank( ::geos::logger::internal::rank ) \ - .addCallStackInfo( stackHistory ); \ + if( errorLogger.writeFile() ) \ + { \ + errorLogger.currentErrorMsg() \ + .setType( ErrorLogger::MsgType::Error ) \ + .setCodeLocation( __FILE__, __LINE__ ) \ + .addToMsg( __msgoss.str() ) \ + .setRank( ::geos::logger::internal::rank ) \ + .addCallStackInfo( stackHistory ); \ + } \ throw EXCEPTIONTYPE( __oss.str() ); \ } \ } while( false ) @@ -249,13 +258,16 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - errorLogger.currentErrorMsg() \ - .setType( ErrorLogger::MsgType::Error ) \ - .setCodeLocation( __FILE__, __LINE__ ) \ - .addToMsg( __msgoss.str() ) \ - .setRank( ::geos::logger::internal::rank ) \ - .addCallStackInfo( stackHistory ) \ - .addContextInfo( __VA_ARGS__ ); \ + if( errorLogger.writeFile() ) \ + { \ + errorLogger.currentErrorMsg() \ + .setType( ErrorLogger::MsgType::Error ) \ + .setCodeLocation( __FILE__, __LINE__ ) \ + .addToMsg( __msgoss.str() ) \ + .setRank( ::geos::logger::internal::rank ) \ + .addCallStackInfo( stackHistory ) \ + .addContextInfo( __VA_ARGS__ ); \ + } \ throw EXCEPTIONTYPE( __oss.str() ); \ } \ } while( false ) @@ -301,12 +313,15 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ - __msgoss.str(), \ - __FILE__, \ - __LINE__ ); \ - msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ - errorLogger.write( msgStruct ); \ + if( errorLogger.writeFile() ) \ + { \ + ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ + __msgoss.str(), \ + __FILE__, \ + __LINE__ ); \ + msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ + errorLogger.write( msgStruct ); \ + } \ } \ } while( false ) @@ -323,14 +338,17 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ - __msgoss.str(), \ - __FILE__, \ - __LINE__ ); \ - msgStruct.setRank( ::geos::logger::internal::rank ); \ - msgStruct.addContextInfo( __VA_ARGS__ ); \ - msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ - errorLogger.write( msgStruct ); \ + if( errorLogger.writeFile() ) \ + { \ + ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ + __msgoss.str(), \ + __FILE__, \ + __LINE__ ); \ + msgStruct.setRank( ::geos::logger::internal::rank ); \ + msgStruct.addContextInfo( __VA_ARGS__ ); \ + msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ + errorLogger.write( msgStruct ); \ + } \ } \ } while( false ) diff --git a/src/coreComponents/dataRepository/unitTests/CMakeLists.txt b/src/coreComponents/dataRepository/unitTests/CMakeLists.txt index b38c723ed4f..eb42386660e 100644 --- a/src/coreComponents/dataRepository/unitTests/CMakeLists.txt +++ b/src/coreComponents/dataRepository/unitTests/CMakeLists.txt @@ -5,8 +5,7 @@ set( dataRepository_tests testPacking.cpp testWrapper.cpp testXmlWrapper.cpp - testBufferOps.cpp - testDataContext.cpp ) + testBufferOps.cpp ) set( dependencyList ${parallelDeps} gtest dataRepository ) diff --git a/src/coreComponents/dataRepository/unitTests/testDataContext.cpp b/src/coreComponents/dataRepository/unitTests/testDataContext.cpp deleted file mode 100644 index 3ca061ad198..00000000000 --- a/src/coreComponents/dataRepository/unitTests/testDataContext.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 TotalEnergies - * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2023-2024 Chevron - * Copyright (c) 2019- GEOS/GEOSX Contributors - * All rights reserved - * - * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. - * ------------------------------------------------------------------------------------------------------------ - */ - -// #include "common/logger/ErrorHandling.hpp" -// #include "dataRepository/DataContext.hpp" - -// #include - -// using namespace geos; - -// TEST( DataContext, testCompleteYaml ) -// { -// geos::ErrorLogger errorLogger; -// int x = 5; -// geos::dataRepository::DataFileContext dataContext( "targetName", -// "test1_file.xml", -// 42 ); -// GEOS_THROW_CTX_IF( dataContext, x==5, "Here is the error message", std::runtime_error ); -// } - -// int main( int ac, char * av[] ) -// { -// ::testing::InitGoogleTest( &ac, av ); -// int const result = RUN_ALL_TESTS(); -// return result; -// } diff --git a/src/coreComponents/mainInterface/initialization.cpp b/src/coreComponents/mainInterface/initialization.cpp index f94d991549e..8144fa461f4 100644 --- a/src/coreComponents/mainInterface/initialization.cpp +++ b/src/coreComponents/mainInterface/initialization.cpp @@ -104,6 +104,7 @@ std::unique_ptr< CommandLineOptions > parseCommandLineOptions( int argc, char * TRACE_DATA_MIGRATION, MEMORY_USAGE, PAUSE_FOR, + ERRORSOUTPUT, }; const option::Descriptor usage[] = @@ -124,7 +125,7 @@ std::unique_ptr< CommandLineOptions > parseCommandLineOptions( int argc, char * { TRACE_DATA_MIGRATION, 0, "", "trace-data-migration", Arg::None, "\t--trace-data-migration, \t Trace host-device data migration" }, { MEMORY_USAGE, 0, "m", "memory-usage", Arg::nonEmpty, "\t-m, --memory-usage, \t Minimum threshold for printing out memory allocations in a member of the data repository." }, { PAUSE_FOR, 0, "", "pause-for", Arg::numeric, "\t--pause-for, \t Pause geosx for a given number of seconds before starting execution" }, - { ERRORS, 0, "e", "errorsOutput", Arg::nonEmpty, "\t-e, --errors-output, \t Output path for the errors file" }, + { ERRORSOUTPUT, 0, "e", "errorsOutput", Arg::Optional, "\t-e, --errors-output, \t Output path for the errors file" }, { 0, 0, nullptr, nullptr, nullptr, nullptr } }; @@ -239,6 +240,17 @@ std::unique_ptr< CommandLineOptions > parseCommandLineOptions( int argc, char * std::this_thread::sleep_for( std::chrono::seconds( duration ) ); } break; + case ERRORSOUTPUT: + { + errorLogger.setWriteValue( true ); + if( options[ERRORSOUTPUT].arg != nullptr ) + { + std::string filename = options[ERRORSOUTPUT].arg; + errorLogger.setFilename( filename ); + } + errorLogger.createFile(); + } + break; } } diff --git a/src/main/main.cpp b/src/main/main.cpp index 7d48e379d6a..2ba75480cb4 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -71,14 +71,20 @@ int main( int argc, char *argv[] ) // A NotAnError is thrown if "-h" or "--help" option is used. catch( NotAnError const & ) { - errorLogger.write( errorLogger.currentErrorMsg() ); + if( errorLogger.writeFile() ) + { + errorLogger.write( errorLogger.currentErrorMsg() ); + } basicCleanup(); return 0; } catch( std::exception const & e ) { GEOS_LOG( e.what() ); - errorLogger.write( errorLogger.currentErrorMsg() ); + if( errorLogger.writeFile() ) + { + errorLogger.write( errorLogger.currentErrorMsg() ); + } LvArray::system::callErrorHandler(); basicCleanup(); std::abort(); From d08a30f7c08747ec8482b6258e940d997a61361c Mon Sep 17 00:00:00 2001 From: amandinehry Date: Tue, 3 Jun 2025 11:34:28 +0200 Subject: [PATCH 029/173] Add the rank on which the error is catch for error and warning outputs --- src/coreComponents/common/logger/Logger.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 4ae82811ea7..f1d51e7b1cd 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -155,6 +155,7 @@ __msgoss.str(), \ __FILE__, \ __LINE__ ); \ + msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addCallStackInfo( stackHistory ); \ errorLogger.write( msgStruct ); \ } \ @@ -319,6 +320,7 @@ __msgoss.str(), \ __FILE__, \ __LINE__ ); \ + msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ errorLogger.write( msgStruct ); \ } \ From 5a6c1a0c06c43d8a25791bf50bad6b32627d1071 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Tue, 3 Jun 2025 11:36:56 +0200 Subject: [PATCH 030/173] Unit test to check if the contents of the yaml file match exactly what is expected. --- .../common/unitTests/CMakeLists.txt | 3 +- .../common/unitTests/testErrorHandling.cpp | 42 ----------- .../dataRepository/testErrorHandling.cpp | 34 --------- .../dataRepository/unitTests/CMakeLists.txt | 3 +- .../unitTests/testErrorHandling.cpp | 71 +++++++++++++++++++ 5 files changed, 74 insertions(+), 79 deletions(-) delete mode 100644 src/coreComponents/common/unitTests/testErrorHandling.cpp delete mode 100644 src/coreComponents/dataRepository/testErrorHandling.cpp create mode 100644 src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp diff --git a/src/coreComponents/common/unitTests/CMakeLists.txt b/src/coreComponents/common/unitTests/CMakeLists.txt index 9a866ae307d..a778823f1ac 100644 --- a/src/coreComponents/common/unitTests/CMakeLists.txt +++ b/src/coreComponents/common/unitTests/CMakeLists.txt @@ -5,8 +5,7 @@ set( gtest_geosx_tests testMpiWrapper.cpp testTypeDispatch.cpp testLifoStorage.cpp - testUnits.cpp - testErrorHandling.cpp ) + testUnits.cpp ) set( gtest_geosx_mpi_tests testMpiWrapper.cpp ) diff --git a/src/coreComponents/common/unitTests/testErrorHandling.cpp b/src/coreComponents/common/unitTests/testErrorHandling.cpp deleted file mode 100644 index 0e571b386ff..00000000000 --- a/src/coreComponents/common/unitTests/testErrorHandling.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 TotalEnergies - * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2023-2024 Chevron - * Copyright (c) 2019- GEOS/GEOSX Contributors - * All rights reserved - * - * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. - * ------------------------------------------------------------------------------------------------------------ - */ - -#include "common/logger/ErrorHandling.hpp" -#include "dataRepository/DataContext.hpp" - -#include - -using namespace geos; - -// TEST( ErrorHandling, testYaml ) -// { -// std::map map; -// map["inputFile"] = "./simpleCo2Inj.xml"; -// map["inputLineLine"] = "42"; - -// geos::ErrorLogger::ErrorMsg msgStruct( geos::ErrorLogger::MsgType::Error, -// "msg content", -// "dev file name", -// 24 ); -// msgStruct.addContextInfo( std::move( map ) ); -// errorLogger.write( msgStruct ); -// } - -// int main( int ac, char * av[] ) -// { -// ::testing::InitGoogleTest( &ac, av ); -// int const result = RUN_ALL_TESTS(); -// return result; -// } diff --git a/src/coreComponents/dataRepository/testErrorHandling.cpp b/src/coreComponents/dataRepository/testErrorHandling.cpp deleted file mode 100644 index a33f6cfde7d..00000000000 --- a/src/coreComponents/dataRepository/testErrorHandling.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 TotalEnergies - * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2023-2024 Chevron - * Copyright (c) 2019- GEOS/GEOSX Contributors - * All rights reserved - * - * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. - * ------------------------------------------------------------------------------------------------------------ - */ - -#include "common/logger/ErrorHandling.hpp" - -#include - -using namespace geos; - -TEST( ErrorHandling, testYaml ) -{ - ErrorLogger logger; - ErrorLogger::ErrorMsg structMsg = logger.errorMsgformatter( ErrorLogger::TypeMsg::ERROR, "contenu du message", "nom du fichier dev", 24 ); - logger.errorMsgWritter( structMsg ); -} - -int main( int ac, char * av[] ) -{ - ::testing::InitGoogleTest( &ac, av ); - int const result = RUN_ALL_TESTS(); - return result; -} \ No newline at end of file diff --git a/src/coreComponents/dataRepository/unitTests/CMakeLists.txt b/src/coreComponents/dataRepository/unitTests/CMakeLists.txt index eb42386660e..16ae05ec249 100644 --- a/src/coreComponents/dataRepository/unitTests/CMakeLists.txt +++ b/src/coreComponents/dataRepository/unitTests/CMakeLists.txt @@ -5,7 +5,8 @@ set( dataRepository_tests testPacking.cpp testWrapper.cpp testXmlWrapper.cpp - testBufferOps.cpp ) + testBufferOps.cpp + testErrorHandling.cpp ) set( dependencyList ${parallelDeps} gtest dataRepository ) diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp new file mode 100644 index 00000000000..92ba5213ac6 --- /dev/null +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -0,0 +1,71 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 TotalEnergies + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2023-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ +#include "common/logger/ErrorHandling.hpp" +#include "common/logger/Logger.hpp" +#include "dataRepository/DataContext.hpp" + +#include + +using namespace geos; +using namespace dataRepository; + +TEST( ErrorHandling, testYaml ) +{ + errorLogger.setFilename( "errorsOutput.yaml" ); + errorLogger.setWriteValue( true ); + double minPrecision = 1e-6; + double maxPrecision = 1e-3; + int x = 5; + + DataFileContext const context = DataFileContext( "Base Test Class", __FILE__, __LINE__ ); + + if( errorLogger.writeFile() ) + { + errorLogger.createFile(); + } + + GEOS_WARNING( "Conflicting pressure boundary conditions" ); + GEOS_WARNING_IF( x == 5, "Pressure value is too small." ); + GEOS_WARNING_CTX_IF( x == 5, + GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", + context.toString(), minPrecision, maxPrecision, minPrecision ), + context ); + try + { + GEOS_THROW_CTX_IF( x == 5, + "Group " << context.toString() << " has no wrapper named" << std::endl, + std::domain_error, + context ); + } + catch( std::domain_error const & ex ) + { + string const errorMsg = "Table input error.\n"; + errorLogger.currentErrorMsg().addToMsg( errorMsg ) + .addContextInfo( context.getContextInfo().setPriority( 2 ) ); + } + + if( errorLogger.writeFile() ) + { + errorLogger.write( errorLogger.currentErrorMsg() ); + } +} + +int main( int ac, char * av[] ) +{ + ::testing::InitGoogleTest( &ac, av ); + int const result = RUN_ALL_TESTS(); + + return result; +} From 4928dcd8dafd57244553ff4217f186c9425d7ab3 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 4 Jun 2025 09:26:14 +0200 Subject: [PATCH 031/173] Add the "Exception" field into the message type enumeration --- src/coreComponents/common/logger/ErrorHandling.cpp | 1 + src/coreComponents/common/logger/ErrorHandling.hpp | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index d073da5756b..9334b2b3508 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -90,6 +90,7 @@ std::string ErrorLogger::toString( ErrorLogger::MsgType type ) { case ErrorLogger::MsgType::Error: return "Error"; case ErrorLogger::MsgType::Warning: return "Warning"; + case ErrorLogger::MsgType::Exception: return "Exception"; default: return "Unknown"; } } diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index dd527957ecb..3ba348142cf 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -57,7 +57,8 @@ class ErrorLogger enum class MsgType { Error, - Warning + Warning, + Exception }; /** From 02dcf503c61546c1b1d9192e3029f02c7900dd5d Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 4 Jun 2025 09:29:15 +0200 Subject: [PATCH 032/173] Modify the macros corresponding to throw to allow the exception to be an exception and not an error --- src/coreComponents/common/logger/Logger.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index f1d51e7b1cd..2c1bff880fe 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -234,7 +234,7 @@ if( errorLogger.writeFile() ) \ { \ errorLogger.currentErrorMsg() \ - .setType( ErrorLogger::MsgType::Error ) \ + .setType( ErrorLogger::MsgType::Exception ) \ .setCodeLocation( __FILE__, __LINE__ ) \ .addToMsg( __msgoss.str() ) \ .setRank( ::geos::logger::internal::rank ) \ @@ -262,7 +262,7 @@ if( errorLogger.writeFile() ) \ { \ errorLogger.currentErrorMsg() \ - .setType( ErrorLogger::MsgType::Error ) \ + .setType( ErrorLogger::MsgType::Exception ) \ .setCodeLocation( __FILE__, __LINE__ ) \ .addToMsg( __msgoss.str() ) \ .setRank( ::geos::logger::internal::rank ) \ From 59ac94dc1e328684f815f3aabbfe43c0ba67b0de Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 4 Jun 2025 09:30:46 +0200 Subject: [PATCH 033/173] Remove ASSERT dependency on LvArray --- src/coreComponents/common/logger/Logger.hpp | 129 +++++++++++++++----- 1 file changed, 99 insertions(+), 30 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 2c1bff880fe..ebf50126564 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -152,9 +152,9 @@ if( errorLogger.writeFile() ) \ { \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ - __msgoss.str(), \ - __FILE__, \ - __LINE__ ); \ + __msgoss.str(), \ + __FILE__, \ + __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addCallStackInfo( stackHistory ); \ errorLogger.write( msgStruct ); \ @@ -181,9 +181,9 @@ if( errorLogger.writeFile() ) \ { \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ - __msgoss.str(), \ - __FILE__, \ - __LINE__ ); \ + __msgoss.str(), \ + __FILE__, \ + __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addContextInfo( __VA_ARGS__ ); \ msgStruct.addCallStackInfo( stackHistory ); \ @@ -288,19 +288,6 @@ */ #define GEOS_THROW( msg, TYPE ) GEOS_THROW_IF( true, msg, TYPE ) -/** - * @brief Assert a condition in debug builds. - * @param EXP an expression that will be evaluated as a predicate - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ASSERT_MSG( EXP, msg ) LVARRAY_ASSERT_MSG( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) - -/** - * @brief Assert a condition in debug builds. - * @param EXP an expression that will be evaluated as a predicate - */ -#define GEOS_ASSERT( EXP ) GEOS_ASSERT_MSG( EXP, "" ) - #define GEOS_WARNING_OUTPUT_IF( EXP, MSG ) \ do \ { \ @@ -317,9 +304,9 @@ if( errorLogger.writeFile() ) \ { \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ - __msgoss.str(), \ - __FILE__, \ - __LINE__ ); \ + __msgoss.str(), \ + __FILE__, \ + __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ errorLogger.write( msgStruct ); \ @@ -343,9 +330,9 @@ if( errorLogger.writeFile() ) \ { \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ - __msgoss.str(), \ - __FILE__, \ - __LINE__ ); \ + __msgoss.str(), \ + __FILE__, \ + __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addContextInfo( __VA_ARGS__ ); \ msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ @@ -572,13 +559,64 @@ */ #define GEOS_THROW_IF_LE( lhs, rhs, TYPE ) GEOS_ERROR_IF_LE_MSG( lhs, rhs, "", TYPE ) +/** + * @brief Abort execution if @p EXP is false but only when + * NDEBUG is not defined.. + * @param EXP The expression to check. + * @param MSG The message to associate with the error, can be anything streamable to a std::ostream. + * @note This macro can be used in both host and device code. + * @note Tries to provide as much information about the location of the error + * as possible. On host this should result in the file and line of the error + * and a stack trace along with the provided message. On device none of this is + * guaranteed. In fact it is only guaranteed to abort the current kernel. + */ +#if !defined(NDEBUG) +#define GEOS_ASSERT_MSG_IF( EXP, MSG ) GEOS_ERROR_OUTPUT_IF( !(EXP), MSG ) +#else +#define GEOS_ASSERT_MSG_IF( EXP, MSG ) ((void) 0) +#endif + +/** + * @brief Assert a condition in debug builds. + * @param EXP an expression that will be evaluated as a predicate + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ASSERT_MSG( EXP, msg ) GEOS_ASSERT_MSG_IF( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) + +/** + * @brief Assert a condition in debug builds. + * @param EXP an expression that will be evaluated as a predicate + */ +#define GEOS_ASSERT( EXP ) GEOS_ASSERT_MSG( EXP, "" ) + +/** + * @brief Abort execution if @p lhs @p OP @p rhs is false. + * @param lhs The left side of the operation. + * @param OP The operation to apply. + * @param rhs The right side of the operation. + * @param msg The message to diplay. + */ +#define GEOS_ASSERT_OP_MSG( lhs, OP, rhs, msg ) \ + GEOS_ASSERT_MSG_IF( lhs OP rhs, \ + msg << "\n" << \ + " " << #lhs << " = " << lhs << "\n" << \ + " " << #rhs << " = " << rhs << "\n" ) + +/** + * @brief Assert that two values compare equal in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ASSERT_EQ_MSG_IF( lhs, rhs, msg ) GEOS_ASSERT_OP_MSG( lhs, ==, rhs, msg ) + /** * @brief Assert that two values compare equal in debug builds. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ASSERT_EQ_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_EQ_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define GEOS_ASSERT_EQ_MSG( lhs, rhs, msg ) GEOS_ASSERT_EQ_MSG_IF( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) /** * @brief Assert that two values compare equal in debug builds. @@ -593,14 +631,37 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ASSERT_NE_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_NE_MSG( lhs, rhs, msg ) +#define GEOS_ASSERT_NE_MSG_IF( lhs, rhs, msg ) GEOS_ASSERT_OP_MSG( lhs, !=, rhs, msg ) /** * @brief Assert that two values compare not equal in debug builds. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ASSERT_NE( lhs, rhs ) LVARRAY_ASSERT_NE( lhs, rhs ) +#define GEOS_ASSERT_NE_MSG( lhs, rhs, msg ) GEOS_ASSERT_NE_MSG_IF( lhs, rhs, msg ) + +/** + * @brief Assert that two values compare not equal in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define GEOS_ASSERT_NE_IF( lhs, rhs ) GEOS_ASSERT_NE_MSG( lhs, rhs, "" ) + +/** + * @brief Assert that two values compare not equal in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define GEOS_ASSERT_NE( lhs, rhs ) GEOS_ASSERT_NE_IF( lhs, rhs ) + +/** + * @brief Assert that one value compares greater than the other in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ASSERT_GT_MSG_IF( lhs, rhs, msg ) GEOS_ASSERT_OP_MSG( lhs, >, rhs, msg ) /** * @brief Assert that one value compares greater than the other in debug builds. @@ -608,7 +669,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ASSERT_GT_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_GT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define GEOS_ASSERT_GT_MSG( lhs, rhs, msg ) GEOS_ASSERT_GT_MSG_IF( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) /** * @brief Assert that one value compares greater than the other in debug builds. @@ -623,7 +684,15 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ASSERT_GE_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_GE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define GEOS_ASSERT_GE_MSG_IF( lhs, rhs, msg ) GEOS_ASSERT_OP_MSG( lhs, >=, rhs, msg ) + +/** + * @brief Assert that one value compares greater than or equal to the other in debug builds. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ASSERT_GE_MSG( lhs, rhs, msg ) GEOS_ASSERT_GE_MSG_IF( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) /** * @brief Assert that one value compares greater than or equal to the other in debug builds. From 835e444f1c39d01d07a9e8d1f2dae6162cc87e97 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 4 Jun 2025 10:55:14 +0200 Subject: [PATCH 034/173] Remove GEOS_THROW_(...) and GEOS_ERROR_(...) dependency on LvArray --- src/coreComponents/common/logger/Logger.hpp | 158 ++++++++++++++++++-- 1 file changed, 146 insertions(+), 12 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index ebf50126564..3f3d6e8d605 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -367,13 +367,61 @@ */ #define GEOS_INFO( msg ) LVARRAY_INFO( msg ) +/** + * @brief Abort execution if @p lhs @p OP @p rhs. + * @param lhs The left side of the operation. + * @param OP The operation to apply. + * @param NOP The opposite of @p OP, used in the message. + * @param rhs The right side of the operation. + * @param msg The message to diplay. + */ +#define GEOS_ERROR_IF_OP_MSG( lhs, OP, NOP, rhs, msg ) \ + GEOS_ERROR_OUTPUT_IF( lhs OP rhs, \ + msg << "\n" << \ + "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ + " " << #lhs << " = " << lhs << "\n" << \ + " " << #rhs << " = " << rhs << "\n" ) + +/** + * @brief Raise a hard error if two values are equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define LOG_GEOS_ERROR_IF_EQ_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, ==, !=, rhs, msg ) + /** * @brief Raise a hard error if two values are equal. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ERROR_IF_EQ_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_EQ_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define GEOS_ERROR_IF_EQ_MSG( lhs, rhs, msg ) LOG_GEOS_ERROR_IF_EQ_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) + +/** + * @brief Throw an exception if @p lhs @p OP @p rhs. + * @param lhs The left side of the operation. + * @param OP The operation to apply. + * @param NOP The opposite of @p OP, used in the message. + * @param rhs The right side of the operation. + * @param msg The message to diplay. + * @param TYPE the type of exception to throw. + */ +#define GEOS_THROW_IF_OP_MSG( lhs, OP, NOP, rhs, msg, TYPE ) \ + GEOS_THROW_OUTPUT_IF( lhs OP rhs, \ + msg << "\n" << \ + "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ + " " << #lhs << " = " << lhs << "\n" << \ + " " << #rhs << " = " << rhs << "\n", TYPE ) + +/** + * @brief Throw an exception if two values are equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define LOG_GEOS_THROW_IF_EQ_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, ==, !=, rhs, msg, TYPE ) /** * @brief Raise a hard error if two values are equal. @@ -382,7 +430,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_EQ_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_EQ_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +#define GEOS_THROW_IF_EQ_MSG( lhs, rhs, msg, TYPE ) LOG_GEOS_THROW_IF_EQ_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) /** * @brief Raise a hard error if two values are equal. @@ -405,7 +453,24 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ERROR_IF_NE_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_NE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define LOG_GEOS_ERROR_IF_NE_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, !=, ==, rhs, msg ) + +/** + * @brief Raise a hard error if two values are not equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ERROR_IF_NE_MSG( lhs, rhs, msg ) LOG_GEOS_ERROR_IF_NE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) + +/** + * @brief Throw an exception if two values are not equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define LOG_GEOS_THROW_IF_NE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, !=, ==, rhs, msg, TYPE ) /** * @brief Throw an exception if two values are not equal. @@ -414,7 +479,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_NE_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_NE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +#define GEOS_THROW_IF_NE_MSG( lhs, rhs, msg, TYPE ) LOG_GEOS_THROW_IF_NE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) /** * @brief Raise a hard error if two values are not equal. @@ -437,7 +502,24 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ERROR_IF_GT_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_GT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define LOG_GEOS_ERROR_IF_GT_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, >, <=, rhs, msg ) + +/** + * @brief Raise a hard error if one value compares greater than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ERROR_IF_GT_MSG( lhs, rhs, msg ) LOG_GEOS_ERROR_IF_GT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) + +/** + * @brief Throw an exception if one value compares greater than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define LOG_GEOS_THROW_IF_GT_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, >, <=, rhs, msg, TYPE ) /** * @brief Throw an exception if one value compares greater than the other. @@ -446,7 +528,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_GT_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_GT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +#define GEOS_THROW_IF_GT_MSG( lhs, rhs, msg, TYPE ) LOG_GEOS_THROW_IF_GT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) /** * @brief Raise a hard error if one value compares greater than the other. @@ -469,7 +551,16 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ERROR_IF_GE_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_GE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define LOG_GEOS_ERROR_IF_GE_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, >=, <, rhs, msg ) + + +/** + * @brief Raise a hard error if one value compares greater than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ERROR_IF_GE_MSG( lhs, rhs, msg ) LOG_GEOS_ERROR_IF_GE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) /** * @brief Throw an exception if one value compares greater than or equal to the other. @@ -478,7 +569,16 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_GE_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_GE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +#define LOG_GEOS_THROW_IF_GE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, >=, <, rhs, msg, TYPE ) + +/** + * @brief Throw an exception if one value compares greater than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define GEOS_THROW_IF_GE_MSG( lhs, rhs, msg, TYPE ) LOG_GEOS_THROW_IF_GE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) /** * @brief Raise a hard error if one value compares greater than or equal to the other. @@ -501,7 +601,15 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ERROR_IF_LT_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_LT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define LOG_GEOS_ERROR_IF_LT_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, <, >=, rhs, msg ) + +/** + * @brief Raise a hard error if one value compares less than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ERROR_IF_LT_MSG( lhs, rhs, msg ) LOG_GEOS_ERROR_IF_LT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) /** * @brief Throw an exception if one value compares less than the other. @@ -510,7 +618,16 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_LT_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_LT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +#define LOG_GEOS_THROW_IF_LT_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, <, >=, rhs, msg, TYPE ) + +/** + * @brief Throw an exception if one value compares less than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define GEOS_THROW_IF_LT_MSG( lhs, rhs, msg, TYPE ) LOG_GEOS_THROW_IF_LT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) /** * @brief Raise a hard error if one value compares less than the other. @@ -533,7 +650,24 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ERROR_IF_LE_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_LE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define LOG_GEOS_ERROR_IF_LE_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, <=, >, rhs, msg ) + +/** + * @brief Raise a hard error if one value compares less than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_ERROR_IF_LE_MSG( lhs, rhs, msg ) LOG_GEOS_ERROR_IF_LE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) + +/** + * @brief Throw an exception if one value compares less than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + */ +#define LOG_GEOS_THROW_IF_LE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, <=, >, rhs, msg, TYPE ) /** * @brief Throw an exception if one value compares less than or equal to the other. @@ -542,7 +676,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_LE_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_LE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +#define GEOS_THROW_IF_LE_MSG( lhs, rhs, msg, TYPE ) LOG_GEOS_THROW_IF_LE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) /** * @brief Raise a hard error if one value compares less than or equal to the other. From 10a26277e8e83e9c18552c8abb20be23279ad3f1 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 4 Jun 2025 11:23:17 +0200 Subject: [PATCH 035/173] Restore to its original state an input file that I used for my tests --- .../staircase_co2_wells_3d.xml | 4 +- .../dataRepository/staircase_co2_wells_3d.xml | 261 ------------------ 2 files changed, 2 insertions(+), 263 deletions(-) delete mode 100644 src/coreComponents/dataRepository/staircase_co2_wells_3d.xml diff --git a/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_3d.xml b/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_3d.xml index 8d6fffbdc46..388b15ca605 100644 --- a/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_3d.xml +++ b/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_3d.xml @@ -243,14 +243,14 @@ values="{1e-7, 2e-7, 2e-7}" interpolation="lower"/> - + diff --git a/src/coreComponents/dataRepository/staircase_co2_wells_3d.xml b/src/coreComponents/dataRepository/staircase_co2_wells_3d.xml deleted file mode 100644 index 8d6fffbdc46..00000000000 --- a/src/coreComponents/dataRepository/staircase_co2_wells_3d.xml +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 9bd9f3015afcb06d7c7212862bb1b6f24ae7e0a6 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 4 Jun 2025 11:23:43 +0200 Subject: [PATCH 036/173] Delete additionnal spaces --- src/coreComponents/dataRepository/DataContext.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/coreComponents/dataRepository/DataContext.hpp b/src/coreComponents/dataRepository/DataContext.hpp index 840c7686b49..fdaf72c508a 100644 --- a/src/coreComponents/dataRepository/DataContext.hpp +++ b/src/coreComponents/dataRepository/DataContext.hpp @@ -31,6 +31,7 @@ namespace geos namespace dataRepository { + /** * @class DataContext * @@ -230,9 +231,12 @@ class DataFileContext final : public DataContext }; + } /* namespace dataRepository */ } /* namespace geos */ + + /** * @brief Formatter to be able to directly use a DataContext as a GEOS_FMT() argument. * Inherits from formatter to reuse its parse() method. From c9fea309e2436a075748973a767195aa3892f2e0 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 4 Jun 2025 11:24:00 +0200 Subject: [PATCH 037/173] Syntax fixes --- .../fluid/multifluid/CO2Brine/CO2BrineFluid.cpp | 9 ++++++--- .../fluid/multifluid/reactive/ReactiveBrineFluid.cpp | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp index 3961c94eb22..9dd5644d123 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp @@ -170,7 +170,8 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const { string const errorMsg = GEOS_FMT( "Table input error for {} phase (in table from \"{}\").\n", m_phaseNames[m_p1Index], m_phasePVTParaFiles[m_p1Index] ); - errorLogger.currentErrorMsg().addToMsg( errorMsg ) + errorLogger.currentErrorMsg() + .addToMsg( errorMsg ) .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); throw SimulationError( ex, errorMsg ); } @@ -184,7 +185,8 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const { string const errorMsg = GEOS_FMT( "Table input error for {} phase (in table from \"{}\").\n", m_phaseNames[m_p2Index], m_phasePVTParaFiles[m_p2Index] ); - errorLogger.currentErrorMsg().addToMsg( errorMsg ) + errorLogger.currentErrorMsg() + .addToMsg( errorMsg ) .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); throw SimulationError( ex, errorMsg ); } @@ -196,7 +198,8 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const { string const errorMsg = GEOS_FMT( "Table input error for flash phase (in table from \"{}\").\n", m_flashModelParaFile ); - errorLogger.currentErrorMsg().addToMsg( errorMsg ) + errorLogger.currentErrorMsg() + .addToMsg( errorMsg ) .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); throw SimulationError( ex, errorMsg ); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp index 8cc433aae5f..3e2ba4d6d68 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp @@ -233,7 +233,8 @@ void ReactiveBrineFluid< PHASE >::checkTablesParameters( real64 const pressure, { string const errorMsg = GEOS_FMT( "Table input error (in table from {}).\n", stringutilities::join( m_phasePVTParaFiles ) ); - errorLogger.currentErrorMsg().addToMsg( errorMsg ) + errorLogger.currentErrorMsg() + .addToMsg( errorMsg ) .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); throw SimulationError( ex, errorMsg ); } From 7fa2b74fabf7bf2e86a46c699c0606df21176b89 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 4 Jun 2025 11:52:05 +0200 Subject: [PATCH 038/173] Syntax fixes --- src/coreComponents/mainInterface/ProblemManager.cpp | 11 ++++++++--- src/coreComponents/mainInterface/ProblemManager.hpp | 5 ----- src/coreComponents/mesh/ElementRegionManager.cpp | 2 +- src/coreComponents/mesh/ElementRegionManager.hpp | 3 +-- .../physicsSolvers/PhysicsSolverBase.cpp | 3 +-- .../physicsSolvers/fluidFlow/FlowSolverBase.cpp | 6 ++---- .../physicsSolvers/fluidFlow/SinglePhaseBase.cpp | 3 +-- .../fluidFlow/SinglePhaseProppantBase.cpp | 3 +-- .../fluidFlow/SourceFluxStatistics.cpp | 6 ++---- .../proppantTransport/ProppantTransport.cpp | 3 +-- .../fluidFlow/wells/CompositionalMultiphaseWell.cpp | 5 ++--- .../fluidFlow/wells/SinglePhaseWell.cpp | 3 +-- .../physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp | 3 +-- .../solidMechanics/SolidMechanicsLagrangianFEM.cpp | 12 ++++-------- .../solidMechanics/SolidMechanicsMPM.cpp | 7 +++---- .../solidMechanics/contact/ContactSolverBase.cpp | 3 +-- .../contact/SolidMechanicsLagrangeContact.cpp | 3 +-- .../isotropic/AcousticFirstOrderWaveEquationSEM.cpp | 3 +-- .../wavePropagation/shared/WaveSolverBase.cpp | 4 ++-- .../wavePropagation/shared/WaveSolverUtils.hpp | 3 +-- 20 files changed, 35 insertions(+), 56 deletions(-) diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index c990e75b11f..6b90cac1cdc 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -168,12 +168,11 @@ Group * ProblemManager::createChild( string const & GEOS_UNUSED_PARAM( childKey void ProblemManager::problemSetup() { GEOS_MARK_FUNCTION; - postInputInitializationRecursive(); generateMesh(); - // initialize_postMeshGeneration(); +// initialize_postMeshGeneration(); applyNumericalMethods(); @@ -440,6 +439,7 @@ void ProblemManager::parseInputString( string const & xmlString ) parseXMLDocument( xmlDocument ); } + void ProblemManager::parseXMLDocument( xmlWrapper::xmlDocument & xmlDocument ) { // Extract the problem node and begin processing the user inputs @@ -490,7 +490,8 @@ void ProblemManager::parseXMLDocument( xmlWrapper::xmlDocument & xmlDocument ) { string const errorMsg = GEOS_FMT( "Error while parsing region {} ({}):\n", regionName, regionNodePos.toString() ); - errorLogger.currentErrorMsg().addToMsg( errorMsg ) + errorLogger.currentErrorMsg() + .addToMsg( errorMsg ) .addContextInfo( getDataContext().getContextInfo().setPriority( 1 ) ); throw InputError( e, errorMsg ); } @@ -720,6 +721,7 @@ void ProblemManager::generateMesh() edgeManager.setIsExternal( faceManager ); } ); } ); + } @@ -733,6 +735,7 @@ void ProblemManager::importFields() void ProblemManager::applyNumericalMethods() { + DomainPartition & domain = getDomainPartition(); ConstitutiveManager & constitutiveManager = domain.getGroup< ConstitutiveManager >( groupKeys.constitutiveManager ); Group & meshBodies = domain.getMeshBodies(); @@ -749,6 +752,7 @@ void ProblemManager::applyNumericalMethods() map< std::pair< string, Group const * const >, string_array const & > ProblemManager::getDiscretizations() const { + map< std::pair< string, Group const * const >, string_array const & > meshDiscretizations; NumericalMethodsManager const & @@ -1140,6 +1144,7 @@ DomainPartition const & ProblemManager::getDomainPartition() const void ProblemManager::applyInitialConditions() { + m_fieldSpecificationManager->forSubGroups< FieldSpecificationBase >( [&]( FieldSpecificationBase & fs ) { fs.setMeshObjectPath( getDomainPartition().getMeshBodies() ); diff --git a/src/coreComponents/mainInterface/ProblemManager.hpp b/src/coreComponents/mainInterface/ProblemManager.hpp index 757d6488c96..447ac419885 100644 --- a/src/coreComponents/mainInterface/ProblemManager.hpp +++ b/src/coreComponents/mainInterface/ProblemManager.hpp @@ -350,11 +350,6 @@ class ProblemManager : public dataRepository::Group map< std::pair< string, Group const * const >, string_array const & > getDiscretizations() const; - /** - * @copydoc parseXMLDocument( xmlWrapper::xmlDocument & xmlDocument ) - */ - void parseXMLDocumentImpl( xmlWrapper::xmlDocument & xmlDocument ); - void generateMeshLevel( MeshLevel & meshLevel, CellBlockManagerABC const & cellBlockManager, Group const * const discretization, diff --git a/src/coreComponents/mesh/ElementRegionManager.cpp b/src/coreComponents/mesh/ElementRegionManager.cpp index d8d75b76b17..59be89b4d6e 100644 --- a/src/coreComponents/mesh/ElementRegionManager.cpp +++ b/src/coreComponents/mesh/ElementRegionManager.cpp @@ -655,7 +655,7 @@ ElementRegionManager::unpackFaceElementToFace( buffer_unit_type const * & buffer string subRegionName; unpackedSize += bufferOps::Unpack( buffer, subRegionName ); GEOS_ERROR_IF( subRegionName != subRegion.getName(), - "Unpacked subregion name (" << subRegionName << ") does not equal object name (" << subRegion.getName() << ")" ); + "Unpacked subregion name (" << subRegionName << ") does not equal object name (" << subRegion.getName() << ")" ); localIndex_array & elemList = packList[kReg][kSubReg]; unpackedSize += subRegion.unpackToFaceRelation( buffer, elemList, false, overwriteMap ); diff --git a/src/coreComponents/mesh/ElementRegionManager.hpp b/src/coreComponents/mesh/ElementRegionManager.hpp index 2aec9197413..4756fedcf0a 100644 --- a/src/coreComponents/mesh/ElementRegionManager.hpp +++ b/src/coreComponents/mesh/ElementRegionManager.hpp @@ -1489,8 +1489,7 @@ ElementRegionManager::constructMaterialViewAccessor( string const & viewName, GEOS_ERROR_CTX_IF( !allowMissingViews, subRegion.getDataContext() << ": Material " << constitutiveRelation.getDataContext() << - " does not contain " << viewName, - subRegion.getDataContext() ); + " does not contain " << viewName, subRegion.getDataContext() ); } } ); } diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp b/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp index 6b29ebc702e..43ae37816c9 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp @@ -207,8 +207,7 @@ localIndex PhysicsSolverBase::targetRegionIndex( string const & regionName ) con auto const pos = std::find( m_targetRegionNames.begin(), m_targetRegionNames.end(), regionName ); GEOS_ERROR_CTX_IF( pos == m_targetRegionNames.end(), GEOS_FMT( "{}: Region {} is not a target of the solver.", - getDataContext(), regionName ), - getDataContext() ); + getDataContext(), regionName ), getDataContext() ); return std::distance( m_targetRegionNames.begin(), pos ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index 57d9b2d5cc4..8509b81b6f0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -325,8 +325,7 @@ void FlowSolverBase::setConstitutiveNamesCallSuper( ElementSubRegionBase & subRe solidName = getConstitutiveName< CoupledSolidBase >( subRegion ); GEOS_ERROR_CTX_IF( solidName.empty(), GEOS_FMT( "{}: Solid model not found on subregion {}", - getDataContext(), subRegion.getName() ), - getDataContext() ); + getDataContext(), subRegion.getName() ), getDataContext() ); subRegion.registerWrapper< string >( viewKeyStruct::permeabilityNamesString() ). setPlotLevel( PlotLevel::NOPLOT ). @@ -337,8 +336,7 @@ void FlowSolverBase::setConstitutiveNamesCallSuper( ElementSubRegionBase & subRe permName = getConstitutiveName< PermeabilityBase >( subRegion ); GEOS_ERROR_CTX_IF( permName.empty(), GEOS_FMT( "{}: Permeability model not found on subregion {}", - getDataContext(), subRegion.getName() ), - getDataContext() ); + getDataContext(), subRegion.getName() ), getDataContext() ); if( m_isThermal ) { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 061699f71c6..b366d41170a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -142,8 +142,7 @@ void SinglePhaseBase::setConstitutiveNames( ElementSubRegionBase & subRegion ) c fluidName = getConstitutiveName< SingleFluidBase >( subRegion ); GEOS_ERROR_CTX_IF( fluidName.empty(), GEOS_FMT( "{}: Fluid model not found on subregion {}", - getDataContext(), subRegion.getName() ), - getDataContext() ); + getDataContext(), subRegion.getName() ), getDataContext() ); if( m_isThermal ) { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp index 9dfe037bbc1..553f563ebd0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp @@ -70,8 +70,7 @@ void SinglePhaseProppantBase::setConstitutiveNames( ElementSubRegionBase & subRe fluidMaterialName = PhysicsSolverBase::getConstitutiveName< SlurryFluidBase >( subRegion ); GEOS_ERROR_CTX_IF( fluidMaterialName.empty(), GEOS_FMT( "{}: Fluid model not found on subregion {}", - getDataContext(), subRegion.getName() ), - getDataContext() ); + getDataContext(), subRegion.getName() ), getDataContext() ); } void SinglePhaseProppantBase::validateConstitutiveModels( DomainPartition & domain ) const diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp index 665f277367a..0c10ddd1d9f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp @@ -61,8 +61,7 @@ void SourceFluxStatsAggregator::postInputInitialization() GEOS_WARNING_CTX_IF( m_fluxNames.empty(), GEOS_FMT( "{}: No {} was found in {}.", getDataContext(), SourceFluxBoundaryCondition::catalogName(), - fsManager.getDataContext() ), - getDataContext() ); + fsManager.getDataContext() ), getDataContext() ); } else { @@ -71,8 +70,7 @@ void SourceFluxStatsAggregator::postInputInitialization() GEOS_ERROR_CTX_IF( !fsManager.hasGroup< SourceFluxBoundaryCondition >( fluxName ), GEOS_FMT( "{}: No {} named {} was found in {}.", getDataContext(), SourceFluxBoundaryCondition::catalogName(), - fluxName, fsManager.getDataContext() ), - getDataContext() ); + fluxName, fsManager.getDataContext() ), getDataContext() ); } } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp index 8b960be3ee2..06c0c0e8ec0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp @@ -777,8 +777,7 @@ void ProppantTransport::applyBoundaryConditions( real64 const time_n, GEOS_WARNING_CTX_IF( !bcConsistent, getDataContext() << ": Composition boundary condition not applied to component " << ic << " on region '" << bcStatusEntryOuter.first << "'," << - " set '" << bcStatusEntryInner.first << "'", - getDataContext() ); + " set '" << bcStatusEntryInner.first << "'", getDataContext() ); } } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 9f731095ce0..19ba53a6b60 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -193,8 +193,7 @@ void CompositionalMultiphaseWell::registerDataOnMesh( Group & meshBodies ) string const & fluidName = getConstitutiveName< MultiFluidBase >( subRegion ); GEOS_ERROR_CTX_IF( fluidName.empty(), GEOS_FMT( "{}: Fluid model not found on subregion {}", - getDataContext(), subRegion.getName() ), - getDataContext() ); + getDataContext(), subRegion.getName() ), getDataContext() ); MultiFluidBase const & fluid = subRegion.getConstitutiveModel< MultiFluidBase >( fluidName ); @@ -339,7 +338,7 @@ void compareMulticomponentModels( MODEL1_TYPE const & lhs, MODEL2_TYPE const & r { GEOS_THROW_IF_NE_MSG( lhs.componentNames()[ic], rhs.componentNames()[ic], GEOS_FMT( "Mismatch in component names between constitutive models {} and {}", - lhs.getDataContext (), rhs.getDataContext() ), + lhs.getDataContext(), rhs.getDataContext() ), InputError ); } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp index d29caf675d7..4ac07cd584a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp @@ -88,8 +88,7 @@ void SinglePhaseWell::registerDataOnMesh( Group & meshBodies ) fluidName = getConstitutiveName< SingleFluidBase >( subRegion ); GEOS_ERROR_CTX_IF( fluidName.empty(), GEOS_FMT( "{}: Fluid model not found on subregion {}", - getDataContext(), subRegion.getName() ), - getDataContext() ); + getDataContext(), subRegion.getName() ), getDataContext() ); subRegion.registerField< fields::well::connectionRate_n >( getName() ); subRegion.registerField< fields::well::connectionRate >( getName() ); diff --git a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp index 2e84ad8a584..4fe607ba2dd 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp @@ -127,8 +127,7 @@ void PhaseFieldDamageFEM::registerDataOnMesh( Group & meshBodies ) solidMaterialName = PhysicsSolverBase::getConstitutiveName< SolidBase >( subRegion ); GEOS_ERROR_CTX_IF( solidMaterialName.empty(), GEOS_FMT( "{}: SolidBase model not found on subregion {}", - getDataContext(), subRegion.getName() ), - getDataContext() ); + getDataContext(), subRegion.getName() ), getDataContext() ); } ); } ); diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index f33f03c0b46..86562167cc5 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -245,8 +245,7 @@ void SolidMechanicsLagrangianFEM::setConstitutiveNamesCallSuper( ElementSubRegio solidMaterialName = PhysicsSolverBase::getConstitutiveName< SolidBase >( subRegion ); GEOS_ERROR_CTX_IF( solidMaterialName.empty(), GEOS_FMT( "{}: SolidBase model not found on subregion {}", - getDataContext(), subRegion.getDataContext() ), - getDataContext() ); + getDataContext(), subRegion.getDataContext() ), getDataContext() ); } @@ -741,16 +740,13 @@ void SolidMechanicsLagrangianFEM::applyDisplacementBCImplicit( real64 const time "The problem may be ill-posed.\n"; GEOS_WARNING_CTX_IF( isDisplacementBCAppliedGlobal[0] == 0, // target set is empty GEOS_FMT( bcLogMessage, - getCatalogName(), getDataContext(), 'x' ), - getDataContext() ); + getCatalogName(), getDataContext(), 'x' ), getDataContext() ); GEOS_WARNING_CTX_IF( isDisplacementBCAppliedGlobal[1] == 0, // target set is empty GEOS_FMT( bcLogMessage, - getCatalogName(), getDataContext(), 'y' ), - getDataContext() ); + getCatalogName(), getDataContext(), 'y' ), getDataContext() ); GEOS_WARNING_CTX_IF( isDisplacementBCAppliedGlobal[2] == 0, // target set is empty GEOS_FMT( bcLogMessage, - getCatalogName(), getDataContext(), 'z' ), - getDataContext() ); + getCatalogName(), getDataContext(), 'z' ), getDataContext() ); } } diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp index 3bb0d30e58e..483a1bdaa7a 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp @@ -306,8 +306,8 @@ void SolidMechanicsMPM::postInputInitialization() // Throw error if boundary conditions are incorrectly specified GEOS_ERROR_IF( m_boundaryConditionTypes.size() != 6 && m_boundaryConditionTypes.size() > 0, - "boundaryConditionTypes must be of length 6. " - "The 6 entries correspond to BCs on the x-, x+, y-, y+, z- and z+ faces." ); + "boundaryConditionTypes must be of length 6. " + "The 6 entries correspond to BCs on the x-, x+, y-, y+, z- and z+ faces." ); // Initialize boundary condition types if they're not specified by the user if( m_boundaryConditionTypes.size() == 0 ) @@ -1980,8 +1980,7 @@ void SolidMechanicsMPM::setParticlesConstitutiveNames( ParticleSubRegionBase & s string & solidMaterialName = subRegion.getReference< string >( viewKeyStruct::solidMaterialNamesString() ); solidMaterialName = PhysicsSolverBase::getConstitutiveName< SolidBase >( subRegion ); - GEOS_ERROR_IF( solidMaterialName.empty(), - GEOS_FMT( "SolidBase model not found on subregion {}", subRegion.getName() ) ); + GEOS_ERROR_IF( solidMaterialName.empty(), GEOS_FMT( "SolidBase model not found on subregion {}", subRegion.getName() ) ); } real64 SolidMechanicsMPM::computeNeighborList( ParticleManager & particleManager ) diff --git a/src/coreComponents/physicsSolvers/solidMechanics/contact/ContactSolverBase.cpp b/src/coreComponents/physicsSolvers/solidMechanics/contact/ContactSolverBase.cpp index 93dff9987b8..d3a4a5ccc70 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/contact/ContactSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/contact/ContactSolverBase.cpp @@ -263,8 +263,7 @@ void ContactSolverBase::setConstitutiveNamesCallSuper( ElementSubRegionBase & su frictionLawName = PhysicsSolverBase::getConstitutiveName< FrictionBase >( subRegion ); GEOS_ERROR_CTX_IF( frictionLawName.empty(), GEOS_FMT( "{}: FrictionBase model not found on subregion {}", - getDataContext(), subRegion.getDataContext() ), - getDataContext() ); + getDataContext(), subRegion.getDataContext() ), getDataContext() ); } } diff --git a/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp index a4c0ef7bce5..3cd3ab1a93b 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp @@ -1732,8 +1732,7 @@ void SolidMechanicsLagrangeContact::assembleStabilization( MeshLevel const & mes SurfaceElementRegion const & fractureRegion = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); FaceElementSubRegion const & fractureSubRegion = fractureRegion.getUniqueSubRegion< FaceElementSubRegion >(); - GEOS_ERROR_IF( !fractureSubRegion.hasField< contact::traction >(), - "The fracture subregion must contain traction field." ); + GEOS_ERROR_IF( !fractureSubRegion.hasField< contact::traction >(), "The fracture subregion must contain traction field." ); arrayView2d< localIndex const > const elem2dToFaces = fractureSubRegion.faceList().toViewConst(); // Get the state of fracture elements diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp index 44edb2084d6..f1cab1150db 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp @@ -191,8 +191,7 @@ void AcousticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLev { GEOS_THROW_CTX_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, getDataContext() << ": Invalid type of element, the acoustic solver is designed for hexahedral meshes only (C3D8) ", - InputError, - getDataContext() ); + InputError, getDataContext() ); arrayView2d< localIndex const > const elemsToFaces = elementSubRegion.faceList(); arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes = elementSubRegion.nodeList(); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp index 17676ec22fa..1c575140451 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp @@ -342,10 +342,10 @@ void WaveSolverBase::postInputInitialization() m_useDAS == WaveSolverUtils::DASType::strainIntegration ? "strain integration" : "displacement difference" ) ); GEOS_ERROR_IF( m_linearDASGeometry.size( 1 ) != 3, - "Invalid number of geometry parameters for the linear DAS fiber. Three parameters are required: dip, azimuth, gauge length" ); + "Invalid number of geometry parameters for the linear DAS fiber. Three parameters are required: dip, azimuth, gauge length" ); GEOS_ERROR_IF( m_linearDASGeometry.size( 0 ) != m_receiverCoordinates.size( 0 ), - "Invalid number of geometry parameters instances for the linear DAS fiber. It should match the number of receivers." ); + "Invalid number of geometry parameters instances for the linear DAS fiber. It should match the number of receivers." ); m_linearDASVectorX.resize( m_linearDASGeometry.size( 0 ) ); m_linearDASVectorY.resize( m_linearDASGeometry.size( 0 ) ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp index e2f32a87ed9..530f7e3b8e0 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp @@ -113,8 +113,7 @@ struct WaveSolverUtils } ); localIndex const total = MpiWrapper::sum( count.get() ); - GEOS_ERROR_IF( nReceivers != total, - GEOS_FMT( ": Invalid distribution of receivers: nReceivers={} != MPI::sum={}.", nReceivers, total ) ); + GEOS_ERROR_IF( nReceivers != total, GEOS_FMT( ": Invalid distribution of receivers: nReceivers={} != MPI::sum={}.", nReceivers, total ) ); } /** From 8a9ff297fac9230ad62c479163ecf07ddcae464e Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 4 Jun 2025 13:36:26 +0200 Subject: [PATCH 039/173] xsd + revert comment --- .../unitTests/testBufferOps.cpp | 8 +- src/coreComponents/schema/schema.xsd | 4 +- src/coreComponents/schema/schema.xsd.other | 146 +++++++++--------- 3 files changed, 79 insertions(+), 79 deletions(-) diff --git a/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp b/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp index bc57bedccba..bc7fb8357b1 100644 --- a/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp +++ b/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp @@ -31,7 +31,7 @@ TEST( testGeosxTraits, test_is_noncontainer_type_packable ) static_assert( !is_noncontainer_type_packable< void >, "Should be false." ); static_assert( !is_noncontainer_type_packable< array1d< double > >, "Should be false." ); static_assert( !is_noncontainer_type_packable< SortedArray< double > >, "Should be false." ); - // static_assert( !is_noncontainer_type_packable< map< string, int > >, "Should be false." ); + static_assert( !is_noncontainer_type_packable< map< string, int > >, "Should be false." ); static_assert( !is_noncontainer_type_packable< std::pair< string, int > >, "Should be false." ); } @@ -49,7 +49,7 @@ TEST( testGeosxTraits, test_is_array_packable ) TEST( testGeosxTraits, test_is_packable_map ) { - // static_assert( is_packable_map< map< string, int > >, "Should be true." ); - // static_assert( is_packable_map< map< string, array1d< int > > >, "Should be true." ); - // static_assert( !is_packable_map< map< string, std::pair< int, int > > >, "Should be false" ); + static_assert( is_packable_map< map< string, int > >, "Should be true." ); + static_assert( is_packable_map< map< string, array1d< int > > >, "Should be true." ); + static_assert( !is_packable_map< map< string, std::pair< int, int > > >, "Should be false" ); } diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index c8137e5ce7c..ee95e352d66 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -3459,7 +3459,7 @@ Information output from lower logLevels is added with the desired log level - + @@ -3482,7 +3482,7 @@ Local- Add jump stabilization on interior of macro elements--> - + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 7cbfd61e863..728b907fe74 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -486,7 +486,7 @@ - + @@ -576,7 +576,7 @@ - + @@ -613,7 +613,7 @@ - + @@ -666,7 +666,7 @@ - + @@ -709,7 +709,7 @@ - + @@ -744,7 +744,7 @@ - + @@ -755,7 +755,7 @@ - + @@ -768,7 +768,7 @@ - + @@ -781,7 +781,7 @@ - + @@ -795,7 +795,7 @@ - + @@ -829,7 +829,7 @@ - + @@ -894,7 +894,7 @@ - + @@ -927,7 +927,7 @@ - + @@ -938,7 +938,7 @@ - + @@ -949,7 +949,7 @@ - + @@ -962,7 +962,7 @@ - + @@ -975,7 +975,7 @@ - + @@ -986,7 +986,7 @@ - + @@ -997,7 +997,7 @@ - + @@ -1008,7 +1008,7 @@ - + @@ -1021,7 +1021,7 @@ - + @@ -1034,7 +1034,7 @@ - + @@ -1047,7 +1047,7 @@ - + @@ -1060,7 +1060,7 @@ - + @@ -1071,7 +1071,7 @@ - + @@ -1084,7 +1084,7 @@ - + @@ -1097,7 +1097,7 @@ - + @@ -1108,7 +1108,7 @@ - + @@ -1119,7 +1119,7 @@ - + @@ -1132,7 +1132,7 @@ - + @@ -1143,7 +1143,7 @@ - + @@ -1154,7 +1154,7 @@ - + @@ -1167,7 +1167,7 @@ - + @@ -1180,7 +1180,7 @@ - + @@ -1193,7 +1193,7 @@ - + @@ -1206,7 +1206,7 @@ - + @@ -1219,7 +1219,7 @@ - + @@ -1230,7 +1230,7 @@ - + @@ -1243,7 +1243,7 @@ - + @@ -1256,7 +1256,7 @@ - + @@ -1269,7 +1269,7 @@ - + @@ -1283,7 +1283,7 @@ - + @@ -1298,7 +1298,7 @@ - + @@ -1315,7 +1315,7 @@ - + @@ -1332,7 +1332,7 @@ - + @@ -1349,7 +1349,7 @@ - + @@ -1364,7 +1364,7 @@ - + @@ -1403,7 +1403,7 @@ - + @@ -1432,7 +1432,7 @@ - + @@ -1527,7 +1527,7 @@ - + @@ -3191,7 +3191,7 @@ - + @@ -3219,7 +3219,7 @@ - + @@ -3238,11 +3238,11 @@ - + - + @@ -3252,7 +3252,7 @@ - + @@ -3262,11 +3262,11 @@ - + - + @@ -3276,7 +3276,7 @@ - + @@ -3286,7 +3286,7 @@ - + @@ -3296,7 +3296,7 @@ - + @@ -3320,7 +3320,7 @@ - + @@ -3338,7 +3338,7 @@ - + @@ -3350,7 +3350,7 @@ - + @@ -3362,7 +3362,7 @@ - + @@ -3370,11 +3370,11 @@ - + - + @@ -3397,7 +3397,7 @@ - + @@ -3423,7 +3423,7 @@ - + @@ -3444,7 +3444,7 @@ - + @@ -3474,7 +3474,7 @@ - + @@ -3488,7 +3488,7 @@ - + @@ -3515,7 +3515,7 @@ - + @@ -3554,7 +3554,7 @@ - + From c1e001ef52ea0148103f7ccddabfa68a1d086f23 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 4 Jun 2025 16:13:16 +0200 Subject: [PATCH 040/173] xsd + check includes --- .vscode/.vscode | 1 + .../common/logger/ErrorHandling.cpp | 4 - .../common/logger/ErrorHandling.hpp | 2 - .../unitTests/testBufferOps.cpp | 2 +- src/coreComponents/schema/schema.xsd | 4 +- src/coreComponents/schema/schema.xsd.other | 146 +++++++++--------- 6 files changed, 77 insertions(+), 82 deletions(-) create mode 120000 .vscode/.vscode diff --git a/.vscode/.vscode b/.vscode/.vscode new file mode 120000 index 00000000000..93e466159c5 --- /dev/null +++ b/.vscode/.vscode @@ -0,0 +1 @@ +/users/l1134701/vscode-configs/P4/.vscode \ No newline at end of file diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 9334b2b3508..36d209aa101 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -17,15 +17,11 @@ * @file ErrorHandling.cpp */ -// Source includes #include "ErrorHandling.hpp" #include "common/logger/Logger.hpp" -// System includes #include -#include #include -#include #include namespace geos diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 3ba348142cf..e0f2f537cb3 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -20,9 +20,7 @@ #ifndef INITIALIZATION_ERROR_LOGGER_HPP #define INITIALIZATION_ERROR_LOGGER_HPP -// Source includes #include "common/DataTypes.hpp" -#include "common/format/Format.hpp" using namespace std; diff --git a/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp b/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp index bc7fb8357b1..1e76a41929f 100644 --- a/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp +++ b/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp @@ -50,6 +50,6 @@ TEST( testGeosxTraits, test_is_array_packable ) TEST( testGeosxTraits, test_is_packable_map ) { static_assert( is_packable_map< map< string, int > >, "Should be true." ); - static_assert( is_packable_map< map< string, array1d< int > > >, "Should be true." ); + static_assert( is_packable_map > >, "Should be true." ); static_assert( !is_packable_map< map< string, std::pair< int, int > > >, "Should be false" ); } diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index ee95e352d66..c8137e5ce7c 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -3459,7 +3459,7 @@ Information output from lower logLevels is added with the desired log level - + @@ -3482,7 +3482,7 @@ Local- Add jump stabilization on interior of macro elements--> - + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 728b907fe74..7cbfd61e863 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -486,7 +486,7 @@ - + @@ -576,7 +576,7 @@ - + @@ -613,7 +613,7 @@ - + @@ -666,7 +666,7 @@ - + @@ -709,7 +709,7 @@ - + @@ -744,7 +744,7 @@ - + @@ -755,7 +755,7 @@ - + @@ -768,7 +768,7 @@ - + @@ -781,7 +781,7 @@ - + @@ -795,7 +795,7 @@ - + @@ -829,7 +829,7 @@ - + @@ -894,7 +894,7 @@ - + @@ -927,7 +927,7 @@ - + @@ -938,7 +938,7 @@ - + @@ -949,7 +949,7 @@ - + @@ -962,7 +962,7 @@ - + @@ -975,7 +975,7 @@ - + @@ -986,7 +986,7 @@ - + @@ -997,7 +997,7 @@ - + @@ -1008,7 +1008,7 @@ - + @@ -1021,7 +1021,7 @@ - + @@ -1034,7 +1034,7 @@ - + @@ -1047,7 +1047,7 @@ - + @@ -1060,7 +1060,7 @@ - + @@ -1071,7 +1071,7 @@ - + @@ -1084,7 +1084,7 @@ - + @@ -1097,7 +1097,7 @@ - + @@ -1108,7 +1108,7 @@ - + @@ -1119,7 +1119,7 @@ - + @@ -1132,7 +1132,7 @@ - + @@ -1143,7 +1143,7 @@ - + @@ -1154,7 +1154,7 @@ - + @@ -1167,7 +1167,7 @@ - + @@ -1180,7 +1180,7 @@ - + @@ -1193,7 +1193,7 @@ - + @@ -1206,7 +1206,7 @@ - + @@ -1219,7 +1219,7 @@ - + @@ -1230,7 +1230,7 @@ - + @@ -1243,7 +1243,7 @@ - + @@ -1256,7 +1256,7 @@ - + @@ -1269,7 +1269,7 @@ - + @@ -1283,7 +1283,7 @@ - + @@ -1298,7 +1298,7 @@ - + @@ -1315,7 +1315,7 @@ - + @@ -1332,7 +1332,7 @@ - + @@ -1349,7 +1349,7 @@ - + @@ -1364,7 +1364,7 @@ - + @@ -1403,7 +1403,7 @@ - + @@ -1432,7 +1432,7 @@ - + @@ -1527,7 +1527,7 @@ - + @@ -3191,7 +3191,7 @@ - + @@ -3219,7 +3219,7 @@ - + @@ -3238,11 +3238,11 @@ - + - + @@ -3252,7 +3252,7 @@ - + @@ -3262,11 +3262,11 @@ - + - + @@ -3276,7 +3276,7 @@ - + @@ -3286,7 +3286,7 @@ - + @@ -3296,7 +3296,7 @@ - + @@ -3320,7 +3320,7 @@ - + @@ -3338,7 +3338,7 @@ - + @@ -3350,7 +3350,7 @@ - + @@ -3362,7 +3362,7 @@ - + @@ -3370,11 +3370,11 @@ - + - + @@ -3397,7 +3397,7 @@ - + @@ -3423,7 +3423,7 @@ - + @@ -3444,7 +3444,7 @@ - + @@ -3474,7 +3474,7 @@ - + @@ -3488,7 +3488,7 @@ - + @@ -3515,7 +3515,7 @@ - + @@ -3554,7 +3554,7 @@ - + From a0eefd29dc898daefce3f824f474eaf208d80365 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Thu, 5 Jun 2025 11:33:34 +0200 Subject: [PATCH 041/173] Compilation error fix --- src/coreComponents/common/logger/ErrorHandling.cpp | 1 - src/coreComponents/common/logger/ErrorHandling.hpp | 4 +--- src/coreComponents/common/logger/Logger.hpp | 2 -- src/coreComponents/dataRepository/DataContext.cpp | 4 ++-- src/coreComponents/dataRepository/DataContext.hpp | 12 ++++++------ src/coreComponents/dataRepository/GroupContext.cpp | 2 +- src/coreComponents/dataRepository/GroupContext.hpp | 4 +++- src/coreComponents/dataRepository/WrapperContext.cpp | 2 +- src/coreComponents/dataRepository/WrapperContext.hpp | 4 +++- .../dataRepository/unitTests/testBufferOps.cpp | 8 ++++---- 10 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 36d209aa101..be30d257e5d 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -21,7 +21,6 @@ #include "common/logger/Logger.hpp" #include -#include #include namespace geos diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index e0f2f537cb3..a06038abce2 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -22,8 +22,6 @@ #include "common/DataTypes.hpp" -using namespace std; - namespace geos { @@ -65,7 +63,7 @@ class ErrorLogger */ struct ContextInfo { - std::map< std::string, std::string > m_ctxInfo; + map< std::string, std::string > m_ctxInfo; integer m_priority = 0; /** diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 3f3d6e8d605..f7584b2a299 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -29,8 +29,6 @@ // System includes #include -#include -#include #if defined(GEOS_USE_MPI) #include diff --git a/src/coreComponents/dataRepository/DataContext.cpp b/src/coreComponents/dataRepository/DataContext.cpp index 4bfe15c2ff0..e535ad3bed8 100644 --- a/src/coreComponents/dataRepository/DataContext.cpp +++ b/src/coreComponents/dataRepository/DataContext.cpp @@ -110,9 +110,9 @@ string DataFileContext::toString() const ErrorLogger::ContextInfo DataFileContext::getContextInfo() const { - std::map contextInfo; + map< std::string, std::string > contextInfo; contextInfo["inputFile"] = m_filePath; - contextInfo["inputFileLine"] = to_string( m_line ); + contextInfo["inputFileLine"] = std::to_string( m_line ); ErrorLogger::ContextInfo ctxInfo{ contextInfo }; return ctxInfo; diff --git a/src/coreComponents/dataRepository/DataContext.hpp b/src/coreComponents/dataRepository/DataContext.hpp index fdaf72c508a..f488ae5f083 100644 --- a/src/coreComponents/dataRepository/DataContext.hpp +++ b/src/coreComponents/dataRepository/DataContext.hpp @@ -60,14 +60,12 @@ class DataContext * object comes from. */ virtual string toString() const = 0; - + /** * @brief Returns contextual information, including the file name and the line number - * - * @return std::map< std::string, std::string > + * + * @return ErrorLogger::ContextInfo */ - // virtual std::map< std::string, std::string > getContextInfo() const = 0; - virtual ErrorLogger::ContextInfo getContextInfo() const = 0; /** @@ -175,7 +173,9 @@ class DataFileContext final : public DataContext string toString() const override; /** - * @return a map containing contextual information, including the file name and the line number + * @brief Returns contextual information, including the file name and the line number + * + * @return ErrorLogger::ContextInfo */ ErrorLogger::ContextInfo getContextInfo() const override; diff --git a/src/coreComponents/dataRepository/GroupContext.cpp b/src/coreComponents/dataRepository/GroupContext.cpp index c56f1bdbed8..4d461afa20e 100644 --- a/src/coreComponents/dataRepository/GroupContext.cpp +++ b/src/coreComponents/dataRepository/GroupContext.cpp @@ -56,7 +56,7 @@ string GroupContext::toString() const ErrorLogger::ContextInfo GroupContext::getContextInfo() const { - std::map contextInfo; + map< std::string, std::string > contextInfo; contextInfo["dataPath"] = toString(); ErrorLogger::ContextInfo ctxInfo{ contextInfo }; diff --git a/src/coreComponents/dataRepository/GroupContext.hpp b/src/coreComponents/dataRepository/GroupContext.hpp index 21d15e4613b..259f28fda72 100644 --- a/src/coreComponents/dataRepository/GroupContext.hpp +++ b/src/coreComponents/dataRepository/GroupContext.hpp @@ -70,7 +70,9 @@ class GroupContext : public DataContext string toString() const override; /** - * @return a map containing contextual information, including the targetName of the DataContext + * @brief Returns contextual information, including the file name and the line number + * + * @return ErrorLogger::ContextInfo */ ErrorLogger::ContextInfo getContextInfo() const override; diff --git a/src/coreComponents/dataRepository/WrapperContext.cpp b/src/coreComponents/dataRepository/WrapperContext.cpp index ec4fae1fdb0..62a51922d5d 100644 --- a/src/coreComponents/dataRepository/WrapperContext.cpp +++ b/src/coreComponents/dataRepository/WrapperContext.cpp @@ -40,7 +40,7 @@ string WrapperContext::toString() const ErrorLogger::ContextInfo WrapperContext::getContextInfo() const { - std::map contextInfo; + map< std::string, std::string > contextInfo; contextInfo["dataPath"] = toString(); ErrorLogger::ContextInfo ctxInfo{ contextInfo }; diff --git a/src/coreComponents/dataRepository/WrapperContext.hpp b/src/coreComponents/dataRepository/WrapperContext.hpp index 7e5208c7687..47bb981d36d 100644 --- a/src/coreComponents/dataRepository/WrapperContext.hpp +++ b/src/coreComponents/dataRepository/WrapperContext.hpp @@ -55,7 +55,9 @@ class WrapperContext final : public GroupContext string toString() const override; /** - * @return a map containing contextual information, including the targetName of the DataContext + * @brief Returns contextual information, including the file name and the line number + * + * @return ErrorLogger::ContextInfo */ ErrorLogger::ContextInfo getContextInfo() const override; }; diff --git a/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp b/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp index b4bb5f8c47e..bc7fb8357b1 100644 --- a/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp +++ b/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp @@ -31,7 +31,7 @@ TEST( testGeosxTraits, test_is_noncontainer_type_packable ) static_assert( !is_noncontainer_type_packable< void >, "Should be false." ); static_assert( !is_noncontainer_type_packable< array1d< double > >, "Should be false." ); static_assert( !is_noncontainer_type_packable< SortedArray< double > >, "Should be false." ); - // static_assert( !is_noncontainer_type_packable< map< string, int > >, "Should be false." ); + static_assert( !is_noncontainer_type_packable< map< string, int > >, "Should be false." ); static_assert( !is_noncontainer_type_packable< std::pair< string, int > >, "Should be false." ); } @@ -49,7 +49,7 @@ TEST( testGeosxTraits, test_is_array_packable ) TEST( testGeosxTraits, test_is_packable_map ) { - // static_assert( is_packable_map< map< string, int > >, "Should be true." ); - // static_assert( is_packable_map > >, "Should be true." ); - // static_assert( !is_packable_map< map< string, std::pair< int, int > > >, "Should be false" ); + static_assert( is_packable_map< map< string, int > >, "Should be true." ); + static_assert( is_packable_map< map< string, array1d< int > > >, "Should be true." ); + static_assert( !is_packable_map< map< string, std::pair< int, int > > >, "Should be false" ); } From 5caa099eaa43107dd7f762461c160cf9e9a9454e Mon Sep 17 00:00:00 2001 From: amandinehry Date: Thu, 5 Jun 2025 13:35:08 +0200 Subject: [PATCH 042/173] Remove vscode config files --- .vscode/.vscode | 1 - 1 file changed, 1 deletion(-) delete mode 120000 .vscode/.vscode diff --git a/.vscode/.vscode b/.vscode/.vscode deleted file mode 120000 index 93e466159c5..00000000000 --- a/.vscode/.vscode +++ /dev/null @@ -1 +0,0 @@ -/users/l1134701/vscode-configs/P4/.vscode \ No newline at end of file From 7aee0c6b36cff365fac9c0d36ed66520d82b9879 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Tue, 10 Jun 2025 13:01:19 +0200 Subject: [PATCH 043/173] Remove empty comment lines and commented code --- .../common/logger/ErrorHandling.hpp | 20 ------------------- .../dataRepository/DataContext.hpp | 3 --- .../dataRepository/GroupContext.hpp | 1 - .../dataRepository/WrapperContext.hpp | 1 - .../optionparser/src/optionparser.h | 13 +----------- 5 files changed, 1 insertion(+), 37 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index a06038abce2..9381778f048 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -36,13 +36,11 @@ class ErrorLogger /** * @brief Construct a new Error Logger object - * */ ErrorLogger(); /** * @brief Create the yaml file if the option is specified in the command line options - * */ void createFile(); @@ -59,7 +57,6 @@ class ErrorLogger /** * @brief Stores contextual information about the error that occurred and assigns it a priority (default is 0) - * */ struct ContextInfo { @@ -68,7 +65,6 @@ class ErrorLogger /** * @brief Set the priority of the current error context information - * * @param priority * @return ContextInfo& */ @@ -78,7 +74,6 @@ class ErrorLogger /** * @brief Struct to define the error/warning message - * */ struct ErrorMsg { @@ -94,13 +89,11 @@ class ErrorLogger /** * @brief Construct a new Error Msg object - * */ ErrorMsg() {}; /** * @brief Construct a new Error Msg object - * * @param msgType The type of the message (error or warning) * @param msgContent The error/warning message content * @param msgFile The file name where the error occcured @@ -114,7 +107,6 @@ class ErrorLogger /** * @brief Fill the msg field of the structure with the error message - * * @param e is the exception * @return ErrorMsg& */ @@ -122,7 +114,6 @@ class ErrorLogger /** * @brief - * * @param msg Add information about the error that occured to the msg field of the structure * @return ErrorMsg& */ @@ -130,7 +121,6 @@ class ErrorLogger /** * @brief Set the Code Location object - * * @param msgFile * @param msgLine * @return ErrorMsg& @@ -139,7 +129,6 @@ class ErrorLogger /** * @brief Set the Type object - * * @param msgType * @return ErrorMsg& */ @@ -147,7 +136,6 @@ class ErrorLogger /** * @brief Adds one or more context elements to the error - * * @tparam Args * @param args */ @@ -156,7 +144,6 @@ class ErrorLogger /** * @brief Set the rank on which the error is raised - * * @param rank * @return ErrorMsg& */ @@ -164,7 +151,6 @@ class ErrorLogger /** * @brief Add stack trace information about the error/warning message to the ErrorMsg structure - * * @param ossStackTrace stack trace information */ ErrorLogger::ErrorMsg & addCallStackInfo( std::string const & ossStackTrace ); @@ -172,7 +158,6 @@ class ErrorLogger private: /** * @brief Add contextual information about the error/warning message to the ErrorMsg structure - * * @param info DataContext information stored into a map */ void addContextInfoImpl( ContextInfo && ctxInfo ); @@ -187,7 +172,6 @@ class ErrorLogger /** * @brief Convert a MsgType into a string - * * @param type * @return std::string */ @@ -195,21 +179,18 @@ class ErrorLogger /** * @brief Write the error message in the yaml file regarding indentation and line break - * * @param msg */ void streamMultilineYamlAttribute( std::string_view msg, std::ofstream & yamlFile ); /** * @brief Add the error/warning message into the yaml file - * * @param errorMsg The error message informations formatted by the associated structure */ void write( ErrorMsg const & errorMsg ); /** * @brief Returns true whether the yaml file writing option is enabled by the user otherwise false - * * @return true * @return false */ @@ -226,7 +207,6 @@ class ErrorLogger /** * @brief Set the name of the yaml file if specified by user (default is "errors.yaml") - * * @param filename */ void setFilename( std::string filename ) diff --git a/src/coreComponents/dataRepository/DataContext.hpp b/src/coreComponents/dataRepository/DataContext.hpp index f488ae5f083..cbed1f2c21c 100644 --- a/src/coreComponents/dataRepository/DataContext.hpp +++ b/src/coreComponents/dataRepository/DataContext.hpp @@ -63,14 +63,12 @@ class DataContext /** * @brief Returns contextual information, including the file name and the line number - * * @return ErrorLogger::ContextInfo */ virtual ErrorLogger::ContextInfo getContextInfo() const = 0; /** * @brief Conversion operator to ErrorLogger::ContextInfo - * * @return ErrorLogger::ContextInfo */ explicit operator ErrorLogger::ContextInfo() const { @@ -174,7 +172,6 @@ class DataFileContext final : public DataContext /** * @brief Returns contextual information, including the file name and the line number - * * @return ErrorLogger::ContextInfo */ ErrorLogger::ContextInfo getContextInfo() const override; diff --git a/src/coreComponents/dataRepository/GroupContext.hpp b/src/coreComponents/dataRepository/GroupContext.hpp index 259f28fda72..ad84c486c8d 100644 --- a/src/coreComponents/dataRepository/GroupContext.hpp +++ b/src/coreComponents/dataRepository/GroupContext.hpp @@ -71,7 +71,6 @@ class GroupContext : public DataContext /** * @brief Returns contextual information, including the file name and the line number - * * @return ErrorLogger::ContextInfo */ ErrorLogger::ContextInfo getContextInfo() const override; diff --git a/src/coreComponents/dataRepository/WrapperContext.hpp b/src/coreComponents/dataRepository/WrapperContext.hpp index 47bb981d36d..b40ebdff6a6 100644 --- a/src/coreComponents/dataRepository/WrapperContext.hpp +++ b/src/coreComponents/dataRepository/WrapperContext.hpp @@ -56,7 +56,6 @@ class WrapperContext final : public GroupContext /** * @brief Returns contextual information, including the file name and the line number - * * @return ErrorLogger::ContextInfo */ ErrorLogger::ContextInfo getContextInfo() const override; diff --git a/src/thirdparty/optionparser/src/optionparser.h b/src/thirdparty/optionparser/src/optionparser.h index 97da4907fde..a9c80ccc14d 100644 --- a/src/thirdparty/optionparser/src/optionparser.h +++ b/src/thirdparty/optionparser/src/optionparser.h @@ -903,18 +903,7 @@ struct Arg return ARG_NONE; } - //! @brief Returns ARG_OK if the argument is attached and ARG_IGNORE otherwise. - // static ArgStatus Optional(const Option& option, bool) - // { - // std::cout << "Name: " << option.name < Date: Tue, 10 Jun 2025 13:08:11 +0200 Subject: [PATCH 044/173] Changes in macros names --- src/coreComponents/common/logger/Logger.hpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index f7584b2a299..646585b809a 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -132,7 +132,7 @@ */ #define GEOS_LOG_RANK_VAR( var ) GEOS_LOG_RANK( #var " = " << var ) -#define GEOS_ERROR_OUTPUT_IF( EXP, MSG ) \ +#define GEOS_ERROR_IF_IMPL( EXP, MSG ) \ do \ { \ if( EXP ) \ @@ -197,9 +197,9 @@ * @param msg a message to log (any expression that can be stream inserted) */ #if defined(GEOS_DEVICE_COMPILE) -#define GEOS_ERROR_IF( EXP, msg ) GEOS_ERROR_OUTPUT_IF( EXP, msg ) +#define GEOS_ERROR_IF( EXP, msg ) GEOS_ERROR_IF_IMPL( EXP, msg ) #else -#define GEOS_ERROR_IF( EXP, msg ) GEOS_ERROR_OUTPUT_IF( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define GEOS_ERROR_IF( EXP, msg ) GEOS_ERROR_IF_IMPL( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) #endif /** @@ -214,7 +214,7 @@ * @param MSG a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_OUTPUT_IF( EXP, MSG, EXCEPTIONTYPE ) \ +#define GEOS_THROW_IF_IMPL( EXP, MSG, EXCEPTIONTYPE ) \ do \ { \ if( EXP ) \ @@ -277,7 +277,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF( EXP, msg, TYPE ) GEOS_THROW_OUTPUT_IF( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +#define GEOS_THROW_IF( EXP, msg, TYPE ) GEOS_THROW_IF_IMPL( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) /** * @brief Throw an exception. @@ -286,7 +286,7 @@ */ #define GEOS_THROW( msg, TYPE ) GEOS_THROW_IF( true, msg, TYPE ) -#define GEOS_WARNING_OUTPUT_IF( EXP, MSG ) \ +#define GEOS_WARNING_IF_IMPL( EXP, MSG ) \ do \ { \ if( EXP ) \ @@ -344,7 +344,7 @@ * @param EXP an expression that will be evaluated as a predicate * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_WARNING_IF( EXP, msg ) GEOS_WARNING_OUTPUT_IF( EXP, msg ) +#define GEOS_WARNING_IF( EXP, msg ) GEOS_WARNING_IF_IMPL( EXP, msg ) /** * @brief Report a warning. @@ -374,7 +374,7 @@ * @param msg The message to diplay. */ #define GEOS_ERROR_IF_OP_MSG( lhs, OP, NOP, rhs, msg ) \ - GEOS_ERROR_OUTPUT_IF( lhs OP rhs, \ + GEOS_ERROR_IF_IMPL( lhs OP rhs, \ msg << "\n" << \ "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ " " << #lhs << " = " << lhs << "\n" << \ @@ -406,7 +406,7 @@ * @param TYPE the type of exception to throw. */ #define GEOS_THROW_IF_OP_MSG( lhs, OP, NOP, rhs, msg, TYPE ) \ - GEOS_THROW_OUTPUT_IF( lhs OP rhs, \ + GEOS_THROW_IF_IMPL( lhs OP rhs, \ msg << "\n" << \ "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ " " << #lhs << " = " << lhs << "\n" << \ @@ -703,7 +703,7 @@ * guaranteed. In fact it is only guaranteed to abort the current kernel. */ #if !defined(NDEBUG) -#define GEOS_ASSERT_MSG_IF( EXP, MSG ) GEOS_ERROR_OUTPUT_IF( !(EXP), MSG ) +#define GEOS_ASSERT_MSG_IF( EXP, MSG ) GEOS_ERROR_IF_IMPL( !(EXP), MSG ) #else #define GEOS_ASSERT_MSG_IF( EXP, MSG ) ((void) 0) #endif From 149789e74f5227ae00b2ffc405ef1eb6ba683930 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Tue, 10 Jun 2025 13:39:07 +0200 Subject: [PATCH 045/173] Change the loop syntax ito a for-each syntax to solve the issue of insufficient id usage --- .../common/logger/ErrorHandling.cpp | 8 ++-- .../common/logger/ErrorHandling.hpp | 41 ++++++++++--------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index be30d257e5d..998ad4fd61a 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -146,10 +146,10 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) //const if( !errorMsg.m_contextsInfo.empty() ) { yamlFile << g_level1Next << "contexts:\n"; - for( size_t i = 0; i < errorMsg.m_contextsInfo.size(); i++ ) + for( ContextInfo const & ctxInfo : errorMsg.m_contextsInfo ) { bool isFirst = true; - for( auto const & [key, value] : errorMsg.m_contextsInfo[i].m_ctxInfo ) + for( auto const & [key, value] : ctxInfo.m_ctxInfo ) { if( isFirst ) { @@ -163,11 +163,11 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) //const } if( isFirst ) { - yamlFile << g_level3Start << "priority: " << errorMsg.m_contextsInfo[i].m_priority << "\n"; + yamlFile << g_level3Start << "priority: " << ctxInfo.m_priority << "\n"; } else { - yamlFile << g_level3Next << "priority: " << errorMsg.m_contextsInfo[i].m_priority << "\n"; + yamlFile << g_level3Next << "priority: " < void addContextInfo( Args && ... args ); /** * @brief Set the rank on which the error is raised - * @param rank - * @return ErrorMsg& + * @param rank + * @return ErrorMsg& */ ErrorMsg & setRank( int rank ); @@ -155,12 +156,12 @@ class ErrorLogger */ ErrorLogger::ErrorMsg & addCallStackInfo( std::string const & ossStackTrace ); - private: - /** - * @brief Add contextual information about the error/warning message to the ErrorMsg structure - * @param info DataContext information stored into a map - */ - void addContextInfoImpl( ContextInfo && ctxInfo ); +private: + /** + * @brief Add contextual information about the error/warning message to the ErrorMsg structure + * @param info DataContext information stored into a map + */ + void addContextInfoImpl( ContextInfo && ctxInfo ); }; /** @@ -190,24 +191,24 @@ class ErrorLogger void write( ErrorMsg const & errorMsg ); /** - * @brief Returns true whether the yaml file writing option is enabled by the user otherwise false - * @return true - * @return false + * @brief Returns true whether the yaml file writing option is enabled by the user otherwise false + * @return true + * @return false */ - bool writeFile() const + bool writeFile() const { return m_writeYaml; } /** * @brief Set the Write Value object * True whether the yaml file writing option is enabled by the user otherwise false - * @param value + * @param value */ void setWriteValue( bool value ) { m_writeYaml = value; } /** * @brief Set the name of the yaml file if specified by user (default is "errors.yaml") - * @param filename + * @param filename */ void setFilename( std::string filename ) { m_filename = filename; } @@ -217,7 +218,7 @@ class ErrorLogger ErrorMsg m_currentErrorMsg; // Write in the yaml file bool m_writeYaml = false; - // Yaml file name + // Yaml file name std::string m_filename = "errors.yaml"; }; From 74de273066b32cccee5f1875eb06b3e31d227c22 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Tue, 10 Jun 2025 13:51:44 +0200 Subject: [PATCH 046/173] Add comments --- src/coreComponents/common/logger/Logger.hpp | 29 +++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 646585b809a..f1ede9be51a 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -132,6 +132,11 @@ */ #define GEOS_LOG_RANK_VAR( var ) GEOS_LOG_RANK( #var " = " << var ) +/** + * @brief Conditionally raise a hard error and terminate the program. + * @param EXP an expression that will be evaluated as a predicate + * @param MSG a message to log (any expression that can be stream inserted) + */ #define GEOS_ERROR_IF_IMPL( EXP, MSG ) \ do \ { \ @@ -161,6 +166,12 @@ } \ } while( false ) +/** + * @brief Conditionally raise a hard error and terminate the program. + * @param EXP an expression that will be evaluated as a predicate + * @param MSG a message to log (any expression that can be stream inserted) + * @param ... One or more DataContext (current error context information) + */ #define GEOS_ERROR_CTX_IF( EXP, MSG, ... ) \ do \ { \ @@ -242,6 +253,13 @@ } \ } while( false ) +/** + * @brief Conditionally throw an exception. + * @param EXP an expression that will be evaluated as a predicate + * @param MSG a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw + * @param ... One or more DataContext (current error context information) + */ #define GEOS_THROW_CTX_IF( EXP, MSG, EXCEPTIONTYPE, ... ) \ do \ { \ @@ -286,6 +304,11 @@ */ #define GEOS_THROW( msg, TYPE ) GEOS_THROW_IF( true, msg, TYPE ) +/** + * @brief Conditionally report a warning + * @param EXP an expression that will be evaluated as a predicate + * @param MSG a message to log (any expression that can be stream inserted) + */ #define GEOS_WARNING_IF_IMPL( EXP, MSG ) \ do \ { \ @@ -312,6 +335,12 @@ } \ } while( false ) +/** + * @brief Conditionally report a warning + * @param EXP an expression that will be evaluated as a predicate + * @param MSG a message to log (any expression that can be stream inserted) + * @param ... One or more DataContext (current error context information) + */ #define GEOS_WARNING_CTX_IF( EXP, MSG, ... ) \ do \ { \ From 92e6854384b5590d4db63ec09ea1a1877892238a Mon Sep 17 00:00:00 2001 From: amandinehry Date: Tue, 10 Jun 2025 15:47:21 +0200 Subject: [PATCH 047/173] Reorganization of declarations --- .../common/logger/ErrorHandling.cpp | 50 ++++++------ .../common/logger/ErrorHandling.hpp | 80 +++++++++---------- 2 files changed, 63 insertions(+), 67 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 998ad4fd61a..d44190a82f1 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -53,6 +53,31 @@ void ErrorLogger::createFile() } } +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::exception const & e ) +{ + parent->m_currentErrorMsg.m_msg = e.what(); + return parent->m_currentErrorMsg; +} + +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::string const & errorMsg ) +{ + parent->m_currentErrorMsg.m_msg = errorMsg + parent->m_currentErrorMsg.m_msg; + return parent->m_currentErrorMsg; +} + +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setCodeLocation( string msgFile, integer msgLine ) +{ + parent->m_currentErrorMsg.m_file = msgFile; + parent->m_currentErrorMsg.m_line = msgLine; + return parent->m_currentErrorMsg; +} + +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setType( ErrorLogger::MsgType msgType ) +{ + parent->m_currentErrorMsg.m_type = msgType; + return parent->m_currentErrorMsg; +} + void ErrorLogger::ErrorMsg::addContextInfoImpl( ErrorLogger::ContextInfo && ctxInfo ) { m_contextsInfo.emplace_back( std::move( ctxInfo ) ); @@ -90,31 +115,6 @@ std::string ErrorLogger::toString( ErrorLogger::MsgType type ) } } -ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::exception const & e ) -{ - parent->m_currentErrorMsg.m_msg = e.what(); - return parent->m_currentErrorMsg; -} - -ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::string const & errorMsg ) -{ - parent->m_currentErrorMsg.m_msg = errorMsg + parent->m_currentErrorMsg.m_msg; - return parent->m_currentErrorMsg; -} - -ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setCodeLocation( string msgFile, integer msgLine ) -{ - parent->m_currentErrorMsg.m_file = msgFile; - parent->m_currentErrorMsg.m_line = msgLine; - return parent->m_currentErrorMsg; -} - -ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setType( ErrorLogger::MsgType msgType ) -{ - parent->m_currentErrorMsg.m_type = msgType; - return parent->m_currentErrorMsg; -} - void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstream& yamlFile ) { while( !msg.empty() ) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 2f03fea6560..f1eff86b3dc 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -33,17 +33,6 @@ class ErrorLogger { public: - - /** - * @brief Construct a new Error Logger object - */ - ErrorLogger(); - - /** - * @brief Create the yaml file if the option is specified in the command line options - */ - void createFile(); - /** * @enum MsgType * Enum listing the different types of possible errors @@ -85,8 +74,7 @@ class ErrorLogger std::vector< int > m_ranksInfo; std::vector< ContextInfo > m_contextsInfo; std::vector< std::string > m_sourceCallStack; - - int n = 0; + ErrorLogger * parent = nullptr; /** * @brief Construct a new Error Msg object @@ -103,9 +91,6 @@ class ErrorLogger ErrorMsg( MsgType msgType, std::string msgContent, std::string msgFile, integer msgLine ) : m_type( msgType ), m_msg( msgContent ), m_file( msgFile ), m_line( msgLine ) {} - - ErrorLogger * parent = nullptr; - /** * @brief Fill the msg field of the structure with the error message * @param e is the exception @@ -135,14 +120,6 @@ class ErrorLogger */ ErrorMsg & setType( MsgType msgType ); - /** - * @brief Adds one or more context elements to the error - * @tparam Args - * @param args - */ - template< typename ... Args > - void addContextInfo( Args && ... args ); - /** * @brief Set the rank on which the error is raised * @param rank @@ -156,20 +133,32 @@ class ErrorLogger */ ErrorLogger::ErrorMsg & addCallStackInfo( std::string const & ossStackTrace ); -private: - /** - * @brief Add contextual information about the error/warning message to the ErrorMsg structure - * @param info DataContext information stored into a map - */ - void addContextInfoImpl( ContextInfo && ctxInfo ); + private: + /** + * @brief Add contextual information about the error/warning message to the ErrorMsg structure + * @param info DataContext information stored into a map + */ + void addContextInfoImpl( ContextInfo && ctxInfo ); + + public: + /** + * @brief Adds one or more context elements to the error + * @tparam Args + * @param args + */ + template< typename ... Args > + void addContextInfo( Args && ... args ); }; /** - * @brief Return the error message information at the step where this getter is called - * @return The current error msg + * @brief Construct a new Error Logger object */ - ErrorMsg & currentErrorMsg() - { return m_currentErrorMsg; } + ErrorLogger(); + + /** + * @brief Create the yaml file if the option is specified in the command line options + */ + void createFile(); /** * @brief Convert a MsgType into a string @@ -213,16 +202,23 @@ class ErrorLogger void setFilename( std::string filename ) { m_filename = filename; } -private: - // The error constructed via exceptions - ErrorMsg m_currentErrorMsg; - // Write in the yaml file - bool m_writeYaml = false; - // Yaml file name - std::string m_filename = "errors.yaml"; + /** + * @brief Return the error message information at the step where this getter is called + * @return The current error msg + */ + ErrorMsg & currentErrorMsg() + { return m_currentErrorMsg; } + + private: + // The error constructed via exceptions + ErrorMsg m_currentErrorMsg; + // Write in the yaml file + bool m_writeYaml = false; + // Yaml file name + std::string m_filename = "errors.yaml"; }; -extern ErrorLogger errorLogger; +extern ErrorLogger g_errorLogger; template< typename ... Args > void ErrorLogger::ErrorMsg::addContextInfo( Args && ... args ) From f910d0e4a9c236b4ed5d3bea788145296c0ef233 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Tue, 10 Jun 2025 16:23:41 +0200 Subject: [PATCH 048/173] add g_ before global variables + add comment to the addToMsg() method --- .../common/logger/ErrorHandling.cpp | 10 +++---- .../common/logger/ErrorHandling.hpp | 30 +++++++++---------- src/coreComponents/common/logger/Logger.hpp | 24 +++++++-------- .../multifluid/CO2Brine/CO2BrineFluid.cpp | 6 ++-- .../multifluid/blackOil/BlackOilFluidBase.cpp | 4 +-- .../reactive/ReactiveBrineFluid.cpp | 2 +- .../unitTests/testErrorHandling.cpp | 14 ++++----- src/coreComponents/events/EventBase.cpp | 2 +- .../FieldSpecificationBase.cpp | 2 +- .../FieldSpecificationBase.hpp | 2 +- .../fileIO/Outputs/TimeHistoryOutput.cpp | 2 +- .../timeHistory/HistoryCollectionBase.cpp | 2 +- .../fileIO/timeHistory/PackCollection.cpp | 2 +- .../mainInterface/ProblemManager.cpp | 2 +- .../mainInterface/initialization.cpp | 8 ++--- src/coreComponents/mesh/FaceManager.cpp | 2 +- .../mesh/generators/InternalMeshGenerator.cpp | 2 +- .../wells/CompositionalMultiphaseWell.cpp | 2 +- src/main/main.cpp | 8 ++--- 19 files changed, 63 insertions(+), 63 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index d44190a82f1..af7cc5c12d9 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -32,7 +32,7 @@ static constexpr std::string_view g_level2Next = " "; static constexpr std::string_view g_level3Start = " - "; static constexpr std::string_view g_level3Next = " "; -ErrorLogger errorLogger{}; +ErrorLogger g_errorLogger{}; ErrorLogger::ErrorLogger() { @@ -59,13 +59,13 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::exception const & return parent->m_currentErrorMsg; } -ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::string const & errorMsg ) +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::string errorMsg ) { parent->m_currentErrorMsg.m_msg = errorMsg + parent->m_currentErrorMsg.m_msg; return parent->m_currentErrorMsg; } -ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setCodeLocation( string msgFile, integer msgLine ) +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setCodeLocation( std::string_view msgFile, integer msgLine ) { parent->m_currentErrorMsg.m_file = msgFile; parent->m_currentErrorMsg.m_line = msgLine; @@ -89,7 +89,7 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setRank( int rank ) return *this; } -ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addCallStackInfo( std::string const & ossStackTrace ) +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addCallStackInfo( std::string ossStackTrace ) { std::istringstream iss( ossStackTrace ); std::string stackLine; @@ -134,7 +134,7 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) //const std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); if( yamlFile.is_open() ) { - yamlFile << "\n" << g_level1Start << "type: " << errorLogger.toString( errorMsg.m_type ) << "\n"; + yamlFile << "\n" << g_level1Start << "type: " << g_errorLogger.toString( errorMsg.m_type ) << "\n"; yamlFile << g_level1Next << "rank: "; for( size_t i = 0; i < errorMsg.m_ranksInfo.size(); i++ ) { diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index f1eff86b3dc..41cbb2c9c98 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -91,19 +91,19 @@ class ErrorLogger ErrorMsg( MsgType msgType, std::string msgContent, std::string msgFile, integer msgLine ) : m_type( msgType ), m_msg( msgContent ), m_file( msgFile ), m_line( msgLine ) {} - /** - * @brief Fill the msg field of the structure with the error message - * @param e is the exception - * @return ErrorMsg& - */ + /** + * @brief Add text to the error msg that occured to the msg field of the structure + * @param e The exception to add. + * @return The instance, for builder pattern. + */ ErrorMsg & addToMsg( std::exception const & e ); - /** - * @brief - * @param msg Add information about the error that occured to the msg field of the structure - * @return ErrorMsg& - */ - ErrorMsg & addToMsg( std::string const & msg ); + /** + * @brief Add text to the error msg that occured to the msg field of the structure + * @param msg The text to add. + * @return The instance, for builder pattern. + */ + ErrorMsg & addToMsg( std::string msg ); /** * @brief Set the Code Location object @@ -111,7 +111,7 @@ class ErrorLogger * @param msgLine * @return ErrorMsg& */ - ErrorMsg & setCodeLocation( string msgFile, integer msgLine ); + ErrorMsg & setCodeLocation( std::string_view msgFile, integer msgLine ); /** * @brief Set the Type object @@ -131,7 +131,7 @@ class ErrorLogger * @brief Add stack trace information about the error/warning message to the ErrorMsg structure * @param ossStackTrace stack trace information */ - ErrorLogger::ErrorMsg & addCallStackInfo( std::string const & ossStackTrace ); + ErrorLogger::ErrorMsg & addCallStackInfo( std::string ossStackTrace ); private: /** @@ -199,7 +199,7 @@ class ErrorLogger * @brief Set the name of the yaml file if specified by user (default is "errors.yaml") * @param filename */ - void setFilename( std::string filename ) + void setFilename( std::string_view filename ) { m_filename = filename; } /** @@ -215,7 +215,7 @@ class ErrorLogger // Write in the yaml file bool m_writeYaml = false; // Yaml file name - std::string m_filename = "errors.yaml"; + std::string_view m_filename = "errors.yaml"; }; extern ErrorLogger g_errorLogger; diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index f1ede9be51a..7732f69cfb7 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -152,7 +152,7 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - if( errorLogger.writeFile() ) \ + if( g_errorLogger.writeFile() ) \ { \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ __msgoss.str(), \ @@ -160,7 +160,7 @@ __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addCallStackInfo( stackHistory ); \ - errorLogger.write( msgStruct ); \ + g_errorLogger.write( msgStruct ); \ } \ LvArray::system::callErrorHandler(); \ } \ @@ -187,7 +187,7 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - if( errorLogger.writeFile() ) \ + if( g_errorLogger.writeFile() ) \ { \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ __msgoss.str(), \ @@ -196,7 +196,7 @@ msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addContextInfo( __VA_ARGS__ ); \ msgStruct.addCallStackInfo( stackHistory ); \ - errorLogger.write( msgStruct ); \ + g_errorLogger.write( msgStruct ); \ } \ LvArray::system::callErrorHandler(); \ } \ @@ -240,9 +240,9 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - if( errorLogger.writeFile() ) \ + if( g_errorLogger.writeFile() ) \ { \ - errorLogger.currentErrorMsg() \ + g_errorLogger.currentErrorMsg() \ .setType( ErrorLogger::MsgType::Exception ) \ .setCodeLocation( __FILE__, __LINE__ ) \ .addToMsg( __msgoss.str() ) \ @@ -275,9 +275,9 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - if( errorLogger.writeFile() ) \ + if( g_errorLogger.writeFile() ) \ { \ - errorLogger.currentErrorMsg() \ + g_errorLogger.currentErrorMsg() \ .setType( ErrorLogger::MsgType::Exception ) \ .setCodeLocation( __FILE__, __LINE__ ) \ .addToMsg( __msgoss.str() ) \ @@ -322,7 +322,7 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - if( errorLogger.writeFile() ) \ + if( g_errorLogger.writeFile() ) \ { \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ __msgoss.str(), \ @@ -330,7 +330,7 @@ __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ - errorLogger.write( msgStruct ); \ + g_errorLogger.write( msgStruct ); \ } \ } \ } while( false ) @@ -354,7 +354,7 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - if( errorLogger.writeFile() ) \ + if( g_errorLogger.writeFile() ) \ { \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ __msgoss.str(), \ @@ -363,7 +363,7 @@ msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addContextInfo( __VA_ARGS__ ); \ msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ - errorLogger.write( msgStruct ); \ + g_errorLogger.write( msgStruct ); \ } \ } \ } while( false ) diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp index 5e30f8ae412..f4e002130b5 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp @@ -170,7 +170,7 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const { string const errorMsg = GEOS_FMT( "Table input error for {} phase (in table from \"{}\").\n", m_phaseNames[m_p1Index], m_phasePVTParaFiles[m_p1Index] ); - errorLogger.currentErrorMsg() + g_errorLogger.currentErrorMsg() .addToMsg( errorMsg ) .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); throw SimulationError( ex, errorMsg ); @@ -185,7 +185,7 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const { string const errorMsg = GEOS_FMT( "Table input error for {} phase (in table from \"{}\").\n", m_phaseNames[m_p2Index], m_phasePVTParaFiles[m_p2Index] ); - errorLogger.currentErrorMsg() + g_errorLogger.currentErrorMsg() .addToMsg( errorMsg ) .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); throw SimulationError( ex, errorMsg ); @@ -198,7 +198,7 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const { string const errorMsg = GEOS_FMT( "Table input error for flash phase (in table from \"{}\").\n", m_flashModelParaFile ); - errorLogger.currentErrorMsg() + g_errorLogger.currentErrorMsg() .addToMsg( errorMsg ) .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); throw SimulationError( ex, errorMsg ); diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp index c651db73bb1..8de796023f9 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp @@ -257,7 +257,7 @@ void BlackOilFluidBase::checkTablesParameters( real64 const pressure, { string const msg = GEOS_FMT( errorMsg, getCatalogName(), getDataContext(), "formation volume factor", iph ); - errorLogger.currentErrorMsg() + g_errorLogger.currentErrorMsg() .addToMsg( msg ) .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); throw SimulationError( ex, msg ); @@ -270,7 +270,7 @@ void BlackOilFluidBase::checkTablesParameters( real64 const pressure, { string const msg = GEOS_FMT( errorMsg, getCatalogName(), getDataContext(), "viscosity", iph ); - errorLogger.currentErrorMsg() + g_errorLogger.currentErrorMsg() .addToMsg( msg ) .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); throw SimulationError( ex, msg ); diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp index bcd8b6ae457..e15847e7100 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp @@ -233,7 +233,7 @@ void ReactiveBrineFluid< PHASE >::checkTablesParameters( real64 const pressure, { string const errorMsg = GEOS_FMT( "Table input error (in table from {}).\n", stringutilities::join( m_phasePVTParaFiles ) ); - errorLogger.currentErrorMsg() + g_errorLogger.currentErrorMsg() .addToMsg( errorMsg ) .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); throw SimulationError( ex, errorMsg ); diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index 92ba5213ac6..a96b8a9fee3 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -23,17 +23,17 @@ using namespace dataRepository; TEST( ErrorHandling, testYaml ) { - errorLogger.setFilename( "errorsOutput.yaml" ); - errorLogger.setWriteValue( true ); + g_errorLogger.setFilename( "errorsOutput.yaml" ); + g_errorLogger.setWriteValue( true ); double minPrecision = 1e-6; double maxPrecision = 1e-3; int x = 5; DataFileContext const context = DataFileContext( "Base Test Class", __FILE__, __LINE__ ); - if( errorLogger.writeFile() ) + if( g_errorLogger.writeFile() ) { - errorLogger.createFile(); + g_errorLogger.createFile(); } GEOS_WARNING( "Conflicting pressure boundary conditions" ); @@ -52,13 +52,13 @@ TEST( ErrorHandling, testYaml ) catch( std::domain_error const & ex ) { string const errorMsg = "Table input error.\n"; - errorLogger.currentErrorMsg().addToMsg( errorMsg ) + g_errorLogger.currentErrorMsg().addToMsg( errorMsg ) .addContextInfo( context.getContextInfo().setPriority( 2 ) ); } - if( errorLogger.writeFile() ) + if( g_errorLogger.writeFile() ) { - errorLogger.write( errorLogger.currentErrorMsg() ); + g_errorLogger.write( g_errorLogger.currentErrorMsg() ); } } diff --git a/src/coreComponents/events/EventBase.cpp b/src/coreComponents/events/EventBase.cpp index 9c5ad73af7f..a26b85f0594 100644 --- a/src/coreComponents/events/EventBase.cpp +++ b/src/coreComponents/events/EventBase.cpp @@ -155,7 +155,7 @@ void EventBase::getTargetReferences() { string const errorMsg = GEOS_FMT( "Error while reading {}:\n", getWrapperDataContext( viewKeyStruct::eventTargetString() ) ); - errorLogger.currentErrorMsg() + g_errorLogger.currentErrorMsg() .addToMsg( errorMsg ) .addContextInfo( getWrapperDataContext( viewKeyStruct::eventTargetString() ).getContextInfo().setPriority( 1 ) ); throw InputError( e, errorMsg ); diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp b/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp index acc92969ef9..5ca9767658b 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp @@ -110,7 +110,7 @@ void FieldSpecificationBase::setMeshObjectPath( Group const & meshBodies ) } catch( std::exception const & e ) { - errorLogger.currentErrorMsg() + g_errorLogger.currentErrorMsg() .addToMsg( getWrapperDataContext( viewKeyStruct::objectPathString() ).toString() + " is a wrong objectPath: " + m_objectPath + "\n" ) .addContextInfo( getWrapperDataContext( viewKeyStruct::objectPathString() ).getContextInfo().setPriority( 2 ) ); diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp index b6e7f16094c..6b9bb48d48e 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp @@ -624,7 +624,7 @@ void FieldSpecificationBase::applyFieldValueKernel( ArrayView< T, N, USD > const { string const errorMsg = GEOS_FMT( "Error while reading {}:\n", getWrapperDataContext( viewKeyStruct::functionNameString() ) ); - errorLogger.currentErrorMsg() + g_errorLogger.currentErrorMsg() .addToMsg( errorMsg ) .addContextInfo( getWrapperDataContext( viewKeyStruct::functionNameString() ).getContextInfo().setPriority( 1 ) ); throw InputError( e, errorMsg ); diff --git a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp index 2c3a88213c5..a8ffea4b822 100644 --- a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp @@ -160,7 +160,7 @@ void TimeHistoryOutput::initializePostInitialConditionsPostSubGroups() { string const errorMsg = GEOS_FMT( "Error while reading {}:\n", getWrapperDataContext( viewKeys::timeHistoryOutputTargetString() ) ); - errorLogger.currentErrorMsg() + g_errorLogger.currentErrorMsg() .addToMsg( errorMsg ) .addContextInfo( getWrapperDataContext( viewKeys::timeHistoryOutputTargetString() ).getContextInfo().setPriority( 1 ) ); throw InputError( e, errorMsg ); diff --git a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp index 738712c4266..16f9c894f63 100644 --- a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp +++ b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp @@ -200,7 +200,7 @@ dataRepository::Group const * HistoryCollectionBase::getTargetObject( DomainPart } catch( std::exception const & e ) { - errorLogger.currentErrorMsg() + g_errorLogger.currentErrorMsg() .addToMsg( getDataContext().toString() + " has a wrong objectPath: " + objectPath + "\n" ) .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); throw InputError( e, getDataContext().toString() + " has a wrong objectPath: " + objectPath + "\n" ); diff --git a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp index 68630cc7838..1c248d06460 100644 --- a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp +++ b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp @@ -153,7 +153,7 @@ void PackCollection::updateSetsIndices( DomainPartition const & domain ) } catch( std::exception const & e ) { - errorLogger.currentErrorMsg() + g_errorLogger.currentErrorMsg() .addToMsg( getWrapperDataContext( viewKeysStruct::fieldNameString() ).toString() + ": Target not found !\n" ) .addContextInfo( getWrapperDataContext( viewKeysStruct::fieldNameString() ).getContextInfo().setPriority( 1 ) ); diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index 68e0a2c645f..92e12edf905 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -500,7 +500,7 @@ void ProblemManager::parseXMLDocument( xmlWrapper::xmlDocument & xmlDocument ) { string const errorMsg = GEOS_FMT( "Error while parsing region {} ({}):\n", regionName, regionNodePos.toString() ); - errorLogger.currentErrorMsg() + g_errorLogger.currentErrorMsg() .addToMsg( errorMsg ) .addContextInfo( getDataContext().getContextInfo().setPriority( 1 ) ); throw InputError( e, errorMsg ); diff --git a/src/coreComponents/mainInterface/initialization.cpp b/src/coreComponents/mainInterface/initialization.cpp index 8144fa461f4..15287a726e0 100644 --- a/src/coreComponents/mainInterface/initialization.cpp +++ b/src/coreComponents/mainInterface/initialization.cpp @@ -242,13 +242,13 @@ std::unique_ptr< CommandLineOptions > parseCommandLineOptions( int argc, char * break; case ERRORSOUTPUT: { - errorLogger.setWriteValue( true ); + g_errorLogger.setWriteValue( true ); if( options[ERRORSOUTPUT].arg != nullptr ) { - std::string filename = options[ERRORSOUTPUT].arg; - errorLogger.setFilename( filename ); + std::string_view filename = options[ERRORSOUTPUT].arg; + g_errorLogger.setFilename( filename ); } - errorLogger.createFile(); + g_errorLogger.createFile(); } break; } diff --git a/src/coreComponents/mesh/FaceManager.cpp b/src/coreComponents/mesh/FaceManager.cpp index efa5b2a14a7..c3b79b504a7 100644 --- a/src/coreComponents/mesh/FaceManager.cpp +++ b/src/coreComponents/mesh/FaceManager.cpp @@ -299,7 +299,7 @@ void FaceManager::sortAllFaceNodes( NodeManager const & nodeManager, sortFaceNodes( X, elemCenter[er][esr][ei], facesToNodes[faceIndex] ); } catch( std::runtime_error const & e ) { - errorLogger.currentErrorMsg() + g_errorLogger.currentErrorMsg() .addToMsg( getDataContext().toString() + ": " + e.what() ) .addContextInfo( getDataContext().getContextInfo().setPriority( 1 ) ); throw std::runtime_error( getDataContext().toString() + ": " + e.what() ); diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp index fc4d2076830..86215cbd01a 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp @@ -182,7 +182,7 @@ void InternalMeshGenerator::postInputInitialization() } catch( InputError const & e ) { WrapperBase const & wrapper = getWrapperBase( viewKeyStruct::elementTypesString() ); - errorLogger.currentErrorMsg() + g_errorLogger.currentErrorMsg() .addToMsg( "InternalMesh " + wrapper.getDataContext().toString() + ", element index = " + std::to_string( i ) + ": " ) .addContextInfo( wrapper.getDataContext().getContextInfo().setPriority( 2 ) ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 61215e9edc2..598aa5edd68 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -356,7 +356,7 @@ void CompositionalMultiphaseWell::validateWellControlsForFluid( WellControls con } catch( SimulationError const & ex ) { string const errorMsg = GEOS_FMT( "{}: wrong surface pressure / temperature.\n", getDataContext() ); - errorLogger.currentErrorMsg() + g_errorLogger.currentErrorMsg() .addToMsg( errorMsg ) .addContextInfo( getDataContext().getContextInfo().setPriority( 1 ) ); throw SimulationError( ex, errorMsg ); diff --git a/src/main/main.cpp b/src/main/main.cpp index 2ba75480cb4..017a81d73c8 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -71,9 +71,9 @@ int main( int argc, char *argv[] ) // A NotAnError is thrown if "-h" or "--help" option is used. catch( NotAnError const & ) { - if( errorLogger.writeFile() ) + if( g_errorLogger.writeFile() ) { - errorLogger.write( errorLogger.currentErrorMsg() ); + g_errorLogger.write( g_errorLogger.currentErrorMsg() ); } basicCleanup(); return 0; @@ -81,9 +81,9 @@ int main( int argc, char *argv[] ) catch( std::exception const & e ) { GEOS_LOG( e.what() ); - if( errorLogger.writeFile() ) + if( g_errorLogger.writeFile() ) { - errorLogger.write( errorLogger.currentErrorMsg() ); + g_errorLogger.write( g_errorLogger.currentErrorMsg() ); } LvArray::system::callErrorHandler(); basicCleanup(); From 67fce43f896f91f4aa6d69fc2660778b05569eed Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 11 Jun 2025 10:20:10 +0200 Subject: [PATCH 049/173] Fix in writing the stack trace in the yaml --- .../common/logger/ErrorHandling.cpp | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index af7cc5c12d9..06cb81cf670 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -94,11 +94,23 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addCallStackInfo( std::string oss std::istringstream iss( ossStackTrace ); std::string stackLine; std::size_t index; + bool isWellFormatted = false; + + std::regex pattern(R"(Frame \d+: \S+)"); while( std::getline( iss, stackLine ) ) { - index = stackLine.find( ':' ); - m_sourceCallStack.push_back( stackLine.substr( index + 1 ) ); + stackLine = "this is a test"; + if (std::regex_search(stackLine, pattern)) { + isWellFormatted = true; + index = stackLine.find( ':' ); + m_sourceCallStack.push_back( stackLine.substr( index + 1 ) ); + } + } + + if( !isWellFormatted ) + { + m_sourceCallStack.push_back( "Callstack could not be retrieved. The format does not match the expected one." ); } return *this; @@ -180,9 +192,7 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) //const for( size_t i = 0; i < errorMsg.m_sourceCallStack.size(); i++ ) { - if( i < 2 || i == errorMsg.m_sourceCallStack.size() - 1 ) - continue; - yamlFile << g_level3Start << i-2 << errorMsg.m_sourceCallStack[i] << "\n"; + yamlFile << g_level3Start << "frame" << i << ": " << errorMsg.m_sourceCallStack[i] << "\n"; } yamlFile.flush(); From 5c801a5ec81a63586f7b4ee1102beaf429aa80e9 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 11 Jun 2025 11:35:39 +0200 Subject: [PATCH 050/173] Add an error msg when the call stack is not formatted as expected + remove break; in the streamMultilineYamlAttribute() method --- .../common/logger/ErrorHandling.cpp | 58 ++++++++++++------- .../common/logger/ErrorHandling.hpp | 7 +++ 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 06cb81cf670..3b3bddfd765 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -31,6 +31,8 @@ static constexpr std::string_view g_level2Start = " - "; static constexpr std::string_view g_level2Next = " "; static constexpr std::string_view g_level3Start = " - "; static constexpr std::string_view g_level3Next = " "; +static constexpr const char* g_callStackMessage = + "Callstack could not be retrieved. The format does not match the expected one."; ErrorLogger g_errorLogger{}; @@ -61,7 +63,7 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::exception const & ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::string errorMsg ) { - parent->m_currentErrorMsg.m_msg = errorMsg + parent->m_currentErrorMsg.m_msg; + parent->m_currentErrorMsg.m_msg = errorMsg + parent->m_currentErrorMsg.m_msg; return parent->m_currentErrorMsg; } @@ -96,12 +98,12 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addCallStackInfo( std::string oss std::size_t index; bool isWellFormatted = false; - std::regex pattern(R"(Frame \d+: \S+)"); + std::regex pattern( R"(Frame \d+: \S+)" ); while( std::getline( iss, stackLine ) ) { - stackLine = "this is a test"; - if (std::regex_search(stackLine, pattern)) { + if( std::regex_search( stackLine, pattern )) + { isWellFormatted = true; index = stackLine.find( ':' ); m_sourceCallStack.push_back( stackLine.substr( index + 1 ) ); @@ -110,7 +112,7 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addCallStackInfo( std::string oss if( !isWellFormatted ) { - m_sourceCallStack.push_back( "Callstack could not be retrieved. The format does not match the expected one." ); + m_sourceCallStack.push_back( g_callStackMessage ); } return *this; @@ -127,7 +129,7 @@ std::string ErrorLogger::toString( ErrorLogger::MsgType type ) } } -void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstream& yamlFile ) +void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstream & yamlFile ) { while( !msg.empty() ) { @@ -135,13 +137,24 @@ void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstr std::string_view line = msg.substr( 0, index ); yamlFile << g_level2Next << line << "\n"; - if( index == msg.npos ) - break; - msg.remove_prefix( index + 1 ); + if( index != msg.npos ) + { + msg.remove_prefix( index + 1 ); + } + else + { + msg = {}; + } } } -void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) //const +bool ErrorLogger::isValidStackTrace( ErrorLogger::ErrorMsg const & errorMsg ) const +{ + return( errorMsg.m_sourceCallStack.size() == 1 && + errorMsg.m_sourceCallStack[0] == g_callStackMessage ); +} + +void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) { std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); if( yamlFile.is_open() ) @@ -158,43 +171,46 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) //const if( !errorMsg.m_contextsInfo.empty() ) { yamlFile << g_level1Next << "contexts:\n"; - for( ContextInfo const & ctxInfo : errorMsg.m_contextsInfo ) + for( ContextInfo const & ctxInfo : errorMsg.m_contextsInfo ) { bool isFirst = true; for( auto const & [key, value] : ctxInfo.m_ctxInfo ) { if( isFirst ) { - yamlFile << g_level3Start << key << ": " << value << "\n"; - isFirst = false; + yamlFile << g_level3Start << key << ": " << value << "\n"; + isFirst = false; } else { - yamlFile << g_level3Next << key << ": " << value << "\n"; + yamlFile << g_level3Next << key << ": " << value << "\n"; } } if( isFirst ) { yamlFile << g_level3Start << "priority: " << ctxInfo.m_priority << "\n"; } - else + else { yamlFile << g_level3Next << "priority: " < Date: Wed, 11 Jun 2025 11:48:50 +0200 Subject: [PATCH 051/173] Add comment in the write() function --- src/coreComponents/common/logger/ErrorHandling.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 3b3bddfd765..8213964e75f 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -159,6 +159,7 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); if( yamlFile.is_open() ) { + // General errors info (type, rank on which the error occured) yamlFile << "\n" << g_level1Start << "type: " << g_errorLogger.toString( errorMsg.m_type ) << "\n"; yamlFile << g_level1Next << "rank: "; for( size_t i = 0; i < errorMsg.m_ranksInfo.size(); i++ ) @@ -166,10 +167,12 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) yamlFile << errorMsg.m_ranksInfo[i]; } yamlFile << "\n"; + // Error message yamlFile << g_level1Next << "message: >-\n"; streamMultilineYamlAttribute( errorMsg.m_msg, yamlFile ); if( !errorMsg.m_contextsInfo.empty() ) { + // Additional informations about the context of the error and priority information of each context yamlFile << g_level1Next << "contexts:\n"; for( ContextInfo const & ctxInfo : errorMsg.m_contextsInfo ) { @@ -196,9 +199,11 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) } } } + // Location of the error in the code yamlFile << g_level1Next << "sourceLocation:\n"; yamlFile << g_level2Next << "file: " << errorMsg.m_file << "\n"; yamlFile << g_level2Next << "line: " << errorMsg.m_line << "\n"; + // Information about the stack trace yamlFile << g_level1Next << "sourceCallStack:\n"; if( isValidStackTrace( errorMsg ) ) { From 5c4fbcb57df3ced134ea22de0f80fc53062699c4 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 11 Jun 2025 12:06:12 +0200 Subject: [PATCH 052/173] Modification of the streamMultilineYamlAttribute() function: no longer delete the first line over and over again but loop over the lines --- .../common/logger/ErrorHandling.cpp | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 8213964e75f..df3d85ba51b 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -131,20 +131,22 @@ std::string ErrorLogger::toString( ErrorLogger::MsgType type ) void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstream & yamlFile ) { - while( !msg.empty() ) + std::size_t i = 0; + // Loop that runs through the string_view named msg + while( i < msg.size() ) { - const size_t index = msg.find( "\n" ); - std::string_view line = msg.substr( 0, index ); - yamlFile << g_level2Next << line << "\n"; - - if( index != msg.npos ) - { - msg.remove_prefix( index + 1 ); - } - else + // Index of the next line break + std::size_t index = msg.find( "\n", i ); + // If there is no line break, the entire string is taken + if( index == std::string_view::npos ) { - msg = {}; + index = msg.size(); } + // Writes the current line to the YAML file with the desired indentation + std::string_view msgLine = msg.substr( i, index - i ); + yamlFile << g_level2Next << msgLine << "\n"; + // Move to the next line + i = index + 1; } } From 75eff2743bf61e14e090e38c10ff414c676ae1be Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 11 Jun 2025 13:39:57 +0200 Subject: [PATCH 053/173] Modification of the streamMultilineYamlAttribute() method: take the indentation as parameter --- .../common/logger/ErrorHandling.cpp | 15 ++-- .../common/logger/ErrorHandling.hpp | 73 ++++++++++--------- 2 files changed, 45 insertions(+), 43 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index df3d85ba51b..0447aa06196 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -31,7 +31,7 @@ static constexpr std::string_view g_level2Start = " - "; static constexpr std::string_view g_level2Next = " "; static constexpr std::string_view g_level3Start = " - "; static constexpr std::string_view g_level3Next = " "; -static constexpr const char* g_callStackMessage = +static constexpr const char * g_callStackMessage = "Callstack could not be retrieved. The format does not match the expected one."; ErrorLogger g_errorLogger{}; @@ -129,7 +129,8 @@ std::string ErrorLogger::toString( ErrorLogger::MsgType type ) } } -void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstream & yamlFile ) +void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstream & yamlFile, + std::string_view indent ) { std::size_t i = 0; // Loop that runs through the string_view named msg @@ -144,7 +145,7 @@ void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstr } // Writes the current line to the YAML file with the desired indentation std::string_view msgLine = msg.substr( i, index - i ); - yamlFile << g_level2Next << msgLine << "\n"; + yamlFile << indent << msgLine << "\n"; // Move to the next line i = index + 1; } @@ -169,9 +170,9 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) yamlFile << errorMsg.m_ranksInfo[i]; } yamlFile << "\n"; - // Error message + // Error message yamlFile << g_level1Next << "message: >-\n"; - streamMultilineYamlAttribute( errorMsg.m_msg, yamlFile ); + streamMultilineYamlAttribute( errorMsg.m_msg, yamlFile, g_level2Next ); if( !errorMsg.m_contextsInfo.empty() ) { // Additional informations about the context of the error and priority information of each context @@ -201,11 +202,11 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) } } } - // Location of the error in the code + // Location of the error in the code yamlFile << g_level1Next << "sourceLocation:\n"; yamlFile << g_level2Next << "file: " << errorMsg.m_file << "\n"; yamlFile << g_level2Next << "line: " << errorMsg.m_line << "\n"; - // Information about the stack trace + // Information about the stack trace yamlFile << g_level1Next << "sourceCallStack:\n"; if( isValidStackTrace( errorMsg ) ) { diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 00fc0ee7dc0..11fce6c7801 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -45,7 +45,7 @@ class ErrorLogger }; /** - * @brief Stores contextual information about the error that occurred and assigns it a priority + * @brief Stores contextual information about the error that occurred and assigns it a priority * default is 0 */ struct ContextInfo @@ -91,18 +91,18 @@ class ErrorLogger ErrorMsg( MsgType msgType, std::string msgContent, std::string msgFile, integer msgLine ) : m_type( msgType ), m_msg( msgContent ), m_file( msgFile ), m_line( msgLine ) {} - /** - * @brief Add text to the error msg that occured to the msg field of the structure - * @param e The exception to add. - * @return The instance, for builder pattern. - */ + /** + * @brief Add text to the error msg that occured to the msg field of the structure + * @param e The exception to add. + * @return The instance, for builder pattern. + */ ErrorMsg & addToMsg( std::exception const & e ); - /** - * @brief Add text to the error msg that occured to the msg field of the structure - * @param msg The text to add. - * @return The instance, for builder pattern. - */ + /** + * @brief Add text to the error msg that occured to the msg field of the structure + * @param msg The text to add. + * @return The instance, for builder pattern. + */ ErrorMsg & addToMsg( std::string msg ); /** @@ -133,21 +133,21 @@ class ErrorLogger */ ErrorLogger::ErrorMsg & addCallStackInfo( std::string ossStackTrace ); - private: - /** - * @brief Add contextual information about the error/warning message to the ErrorMsg structure - * @param info DataContext information stored into a map - */ - void addContextInfoImpl( ContextInfo && ctxInfo ); - - public: - /** - * @brief Adds one or more context elements to the error - * @tparam Args - * @param args - */ - template< typename ... Args > - void addContextInfo( Args && ... args ); +private: + /** + * @brief Add contextual information about the error/warning message to the ErrorMsg structure + * @param info DataContext information stored into a map + */ + void addContextInfoImpl( ContextInfo && ctxInfo ); + +public: + /** + * @brief Adds one or more context elements to the error + * @tparam Args + * @param args + */ + template< typename ... Args > + void addContextInfo( Args && ... args ); }; /** @@ -171,12 +171,13 @@ class ErrorLogger * @brief Write the error message in the yaml file regarding indentation and line break * @param msg */ - void streamMultilineYamlAttribute( std::string_view msg, std::ofstream & yamlFile ); + void streamMultilineYamlAttribute( std::string_view msg, std::ofstream & yamlFile, + std::string_view indent ); /** * @brief Checks if the vector contains a valid stack or just the error message - * @return true - * @return false + * @return true + * @return false */ bool isValidStackTrace( ErrorMsg const & errorMsg ) const; @@ -216,13 +217,13 @@ class ErrorLogger ErrorMsg & currentErrorMsg() { return m_currentErrorMsg; } - private: - // The error constructed via exceptions - ErrorMsg m_currentErrorMsg; - // Write in the yaml file - bool m_writeYaml = false; - // Yaml file name - std::string_view m_filename = "errors.yaml"; +private: + // The error constructed via exceptions + ErrorMsg m_currentErrorMsg; + // Write in the yaml file + bool m_writeYaml = false; + // Yaml file name + std::string_view m_filename = "errors.yaml"; }; extern ErrorLogger g_errorLogger; From dab2da50c1084bba193ed98a4228a9359a0d25ff Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 11 Jun 2025 15:05:09 +0200 Subject: [PATCH 054/173] Fix null pointer access on parent by using instance field instead --- .../common/logger/ErrorHandling.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 0447aa06196..1c60b2aabc0 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -57,27 +57,27 @@ void ErrorLogger::createFile() ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::exception const & e ) { - parent->m_currentErrorMsg.m_msg = e.what(); - return parent->m_currentErrorMsg; + m_msg = e.what(); + return *this; } ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::string errorMsg ) { - parent->m_currentErrorMsg.m_msg = errorMsg + parent->m_currentErrorMsg.m_msg; - return parent->m_currentErrorMsg; + m_msg = errorMsg + m_msg; + return *this; } ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setCodeLocation( std::string_view msgFile, integer msgLine ) { - parent->m_currentErrorMsg.m_file = msgFile; - parent->m_currentErrorMsg.m_line = msgLine; - return parent->m_currentErrorMsg; + m_file = msgFile; + m_line = msgLine; + return *this; } ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setType( ErrorLogger::MsgType msgType ) { - parent->m_currentErrorMsg.m_type = msgType; - return parent->m_currentErrorMsg; + m_type = msgType; + return *this; } void ErrorLogger::ErrorMsg::addContextInfoImpl( ErrorLogger::ContextInfo && ctxInfo ) From 0a952966017e45e9e3496a077ead7dc48deb428f Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 11 Jun 2025 15:19:49 +0200 Subject: [PATCH 055/173] Add comments --- src/coreComponents/common/logger/ErrorHandling.hpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 11fce6c7801..81bc2d0810d 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -50,6 +50,12 @@ class ErrorLogger */ struct ContextInfo { + // The map contains contextual information about the error + // It could be something like + // "file" = "/path/to/file.xml" + // "line" = "24" + // or something like + // "dataPath" = "/Functions/co2brine_philipsDensityTable" map< std::string, std::string > m_ctxInfo; integer m_priority = 0; From c4a002e1ff3ce361c1ff2e8f7137a022506ec299 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 11 Jun 2025 15:41:18 +0200 Subject: [PATCH 056/173] Just silently kill GEOS when a NotAnError is raised --- src/main/main.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index 017a81d73c8..ead557e453e 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -71,10 +71,6 @@ int main( int argc, char *argv[] ) // A NotAnError is thrown if "-h" or "--help" option is used. catch( NotAnError const & ) { - if( g_errorLogger.writeFile() ) - { - g_errorLogger.write( g_errorLogger.currentErrorMsg() ); - } basicCleanup(); return 0; } From cbc5102984b1e772caef20820c232b86bda198bb Mon Sep 17 00:00:00 2001 From: amandinehry Date: Thu, 12 Jun 2025 10:10:22 +0200 Subject: [PATCH 057/173] Removed the pointer to an Error Logger object (this is no longer useful at this time) + ensure that opening and writing to the file is exception-free --- .../common/logger/ErrorHandling.cpp | 131 ++++++++++-------- .../common/logger/ErrorHandling.hpp | 21 +-- 2 files changed, 81 insertions(+), 71 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 1c60b2aabc0..14025ee20da 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -36,22 +36,28 @@ static constexpr const char * g_callStackMessage = ErrorLogger g_errorLogger{}; -ErrorLogger::ErrorLogger() -{ - m_currentErrorMsg.parent = this; -} - void ErrorLogger::createFile() { - std::ofstream yamlFile( std::string( m_filename ), std::ios::out ); - if( yamlFile.is_open() ) + try + { + std::ofstream yamlFile( std::string( m_filename ), std::ios::out ); + if( yamlFile.is_open() ) + { + yamlFile << "errors: \n"; + yamlFile.close(); + } + else + { + GEOS_LOG( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); + } + } + catch(const std::exception& e) { - yamlFile << "errors: \n"; - yamlFile.close(); + std::cerr << e.what() << '\n'; } - else + catch ( ... ) { - GEOS_LOG( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); + std::cerr << "Unexpected exception." << '\n'; } } @@ -159,72 +165,83 @@ bool ErrorLogger::isValidStackTrace( ErrorLogger::ErrorMsg const & errorMsg ) co void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) { - std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); - if( yamlFile.is_open() ) + try { - // General errors info (type, rank on which the error occured) - yamlFile << "\n" << g_level1Start << "type: " << g_errorLogger.toString( errorMsg.m_type ) << "\n"; - yamlFile << g_level1Next << "rank: "; - for( size_t i = 0; i < errorMsg.m_ranksInfo.size(); i++ ) - { - yamlFile << errorMsg.m_ranksInfo[i]; - } - yamlFile << "\n"; - // Error message - yamlFile << g_level1Next << "message: >-\n"; - streamMultilineYamlAttribute( errorMsg.m_msg, yamlFile, g_level2Next ); - if( !errorMsg.m_contextsInfo.empty() ) + std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); + if( yamlFile.is_open() ) { - // Additional informations about the context of the error and priority information of each context - yamlFile << g_level1Next << "contexts:\n"; - for( ContextInfo const & ctxInfo : errorMsg.m_contextsInfo ) + // General errors info (type, rank on which the error occured) + yamlFile << "\n" << g_level1Start << "type: " << g_errorLogger.toString( errorMsg.m_type ) << "\n"; + yamlFile << g_level1Next << "rank: "; + for( size_t i = 0; i < errorMsg.m_ranksInfo.size(); i++ ) { - bool isFirst = true; - for( auto const & [key, value] : ctxInfo.m_ctxInfo ) + yamlFile << errorMsg.m_ranksInfo[i]; + } + yamlFile << "\n"; + // Error message + yamlFile << g_level1Next << "message: >-\n"; + streamMultilineYamlAttribute( errorMsg.m_msg, yamlFile, g_level2Next ); + if( !errorMsg.m_contextsInfo.empty() ) + { + // Additional informations about the context of the error and priority information of each context + yamlFile << g_level1Next << "contexts:\n"; + for( ContextInfo const & ctxInfo : errorMsg.m_contextsInfo ) { + bool isFirst = true; + for( auto const & [key, value] : ctxInfo.m_ctxInfo ) + { + if( isFirst ) + { + yamlFile << g_level3Start << key << ": " << value << "\n"; + isFirst = false; + } + else + { + yamlFile << g_level3Next << key << ": " << value << "\n"; + } + } if( isFirst ) { - yamlFile << g_level3Start << key << ": " << value << "\n"; - isFirst = false; + yamlFile << g_level3Start << "priority: " << ctxInfo.m_priority << "\n"; } else { - yamlFile << g_level3Next << key << ": " << value << "\n"; + yamlFile << g_level3Next << "priority: " < m_ranksInfo; std::vector< ContextInfo > m_contextsInfo; std::vector< std::string > m_sourceCallStack; - ErrorLogger * parent = nullptr; /** * @brief Construct a new Error Msg object @@ -139,14 +138,6 @@ class ErrorLogger */ ErrorLogger::ErrorMsg & addCallStackInfo( std::string ossStackTrace ); -private: - /** - * @brief Add contextual information about the error/warning message to the ErrorMsg structure - * @param info DataContext information stored into a map - */ - void addContextInfoImpl( ContextInfo && ctxInfo ); - -public: /** * @brief Adds one or more context elements to the error * @tparam Args @@ -154,12 +145,14 @@ class ErrorLogger */ template< typename ... Args > void addContextInfo( Args && ... args ); - }; - /** - * @brief Construct a new Error Logger object - */ - ErrorLogger(); +private: + /** + * @brief Add contextual information about the error/warning message to the ErrorMsg structure + * @param info DataContext information stored into a map + */ + void addContextInfoImpl( ContextInfo && ctxInfo ); + }; /** * @brief Create the yaml file if the option is specified in the command line options From 3318d8536d3d7fd07c5b562221d9fdb350447c2e Mon Sep 17 00:00:00 2001 From: amandinehry Date: Thu, 12 Jun 2025 10:20:21 +0200 Subject: [PATCH 058/173] Minor syntax modification --- .../dataRepository/unitTests/testErrorHandling.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index a96b8a9fee3..e11b55cf6dd 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -45,14 +45,15 @@ TEST( ErrorHandling, testYaml ) try { GEOS_THROW_CTX_IF( x == 5, - "Group " << context.toString() << " has no wrapper named" << std::endl, - std::domain_error, - context ); + "Group " << context.toString() << " has no wrapper named" << std::endl, + std::domain_error, + context ); } catch( std::domain_error const & ex ) { string const errorMsg = "Table input error.\n"; - g_errorLogger.currentErrorMsg().addToMsg( errorMsg ) + g_errorLogger.currentErrorMsg() + .addToMsg( errorMsg ) .addContextInfo( context.getContextInfo().setPriority( 2 ) ); } From 343b8301de7eca1d7adfef80f1eaf5788c8d081c Mon Sep 17 00:00:00 2001 From: amandinehry Date: Thu, 12 Jun 2025 11:38:41 +0200 Subject: [PATCH 059/173] Renaming ContextInfo in ErrorContext + minor correction on the formatting of the yaml --- .../common/logger/ErrorHandling.cpp | 13 ++++-------- .../common/logger/ErrorHandling.hpp | 21 +++++++------------ .../dataRepository/DataContext.cpp | 4 ++-- .../dataRepository/DataContext.hpp | 14 ++++++------- .../dataRepository/GroupContext.cpp | 4 ++-- .../dataRepository/GroupContext.hpp | 4 ++-- .../dataRepository/WrapperContext.cpp | 4 ++-- .../dataRepository/WrapperContext.hpp | 4 ++-- 8 files changed, 28 insertions(+), 40 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 14025ee20da..3b33554cf72 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -61,12 +61,6 @@ void ErrorLogger::createFile() } } -ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::exception const & e ) -{ - m_msg = e.what(); - return *this; -} - ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::string errorMsg ) { m_msg = errorMsg + m_msg; @@ -86,7 +80,7 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setType( ErrorLogger::MsgType msg return *this; } -void ErrorLogger::ErrorMsg::addContextInfoImpl( ErrorLogger::ContextInfo && ctxInfo ) +void ErrorLogger::ErrorMsg::addContextInfoImpl( ErrorLogger::ErrorContext && ctxInfo ) { m_contextsInfo.emplace_back( std::move( ctxInfo ) ); } @@ -185,10 +179,10 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) { // Additional informations about the context of the error and priority information of each context yamlFile << g_level1Next << "contexts:\n"; - for( ContextInfo const & ctxInfo : errorMsg.m_contextsInfo ) + for( ErrorContext const & ctxInfo : errorMsg.m_contextsInfo ) { bool isFirst = true; - for( auto const & [key, value] : ctxInfo.m_ctxInfo ) + for( auto const & [key, value] : ctxInfo.m_attributes ) { if( isFirst ) { @@ -203,6 +197,7 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) if( isFirst ) { yamlFile << g_level3Start << "priority: " << ctxInfo.m_priority << "\n"; + isFirst = false; } else { diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index a95978216f3..8ad6b218356 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -48,7 +48,7 @@ class ErrorLogger * @brief Stores contextual information about the error that occurred and assigns it a priority * default is 0 */ - struct ContextInfo + struct ErrorContext { // The map contains contextual information about the error // It could be something like @@ -56,15 +56,15 @@ class ErrorLogger // "line" = "24" // or something like // "dataPath" = "/Functions/co2brine_philipsDensityTable" - map< std::string, std::string > m_ctxInfo; + map< std::string, std::string > m_attributes; integer m_priority = 0; /** * @brief Set the priority of the current error context information * @param priority - * @return ContextInfo& + * @return ErrorContext& */ - ContextInfo & setPriority( integer priority ) + ErrorContext & setPriority( integer priority ) { m_priority = priority; return *this; } }; @@ -78,7 +78,7 @@ class ErrorLogger std::string m_file; integer m_line; std::vector< int > m_ranksInfo; - std::vector< ContextInfo > m_contextsInfo; + std::vector< ErrorContext > m_contextsInfo; std::vector< std::string > m_sourceCallStack; /** @@ -96,13 +96,6 @@ class ErrorLogger ErrorMsg( MsgType msgType, std::string msgContent, std::string msgFile, integer msgLine ) : m_type( msgType ), m_msg( msgContent ), m_file( msgFile ), m_line( msgLine ) {} - /** - * @brief Add text to the error msg that occured to the msg field of the structure - * @param e The exception to add. - * @return The instance, for builder pattern. - */ - ErrorMsg & addToMsg( std::exception const & e ); - /** * @brief Add text to the error msg that occured to the msg field of the structure * @param msg The text to add. @@ -151,7 +144,7 @@ class ErrorLogger * @brief Add contextual information about the error/warning message to the ErrorMsg structure * @param info DataContext information stored into a map */ - void addContextInfoImpl( ContextInfo && ctxInfo ); + void addContextInfoImpl( ErrorContext && ctxInfo ); }; /** @@ -230,7 +223,7 @@ extern ErrorLogger g_errorLogger; template< typename ... Args > void ErrorLogger::ErrorMsg::addContextInfo( Args && ... args ) { - ( this->addContextInfoImpl( ContextInfo( args ) ), ... ); + ( this->addContextInfoImpl( ErrorContext( args ) ), ... ); } } /* namespace geos */ diff --git a/src/coreComponents/dataRepository/DataContext.cpp b/src/coreComponents/dataRepository/DataContext.cpp index e535ad3bed8..728258e9b28 100644 --- a/src/coreComponents/dataRepository/DataContext.cpp +++ b/src/coreComponents/dataRepository/DataContext.cpp @@ -108,12 +108,12 @@ string DataFileContext::toString() const } } -ErrorLogger::ContextInfo DataFileContext::getContextInfo() const +ErrorLogger::ErrorContext DataFileContext::getContextInfo() const { map< std::string, std::string > contextInfo; contextInfo["inputFile"] = m_filePath; contextInfo["inputFileLine"] = std::to_string( m_line ); - ErrorLogger::ContextInfo ctxInfo{ contextInfo }; + ErrorLogger::ErrorContext ctxInfo{ contextInfo }; return ctxInfo; } diff --git a/src/coreComponents/dataRepository/DataContext.hpp b/src/coreComponents/dataRepository/DataContext.hpp index cbed1f2c21c..6797d258acd 100644 --- a/src/coreComponents/dataRepository/DataContext.hpp +++ b/src/coreComponents/dataRepository/DataContext.hpp @@ -63,15 +63,15 @@ class DataContext /** * @brief Returns contextual information, including the file name and the line number - * @return ErrorLogger::ContextInfo + * @return ErrorLogger::ErrorContext */ - virtual ErrorLogger::ContextInfo getContextInfo() const = 0; + virtual ErrorLogger::ErrorContext getContextInfo() const = 0; /** - * @brief Conversion operator to ErrorLogger::ContextInfo - * @return ErrorLogger::ContextInfo + * @brief Conversion operator to ErrorLogger::ErrorContext + * @return ErrorLogger::ErrorContext */ - explicit operator ErrorLogger::ContextInfo() const { + explicit operator ErrorLogger::ErrorContext() const { return getContextInfo(); } @@ -172,9 +172,9 @@ class DataFileContext final : public DataContext /** * @brief Returns contextual information, including the file name and the line number - * @return ErrorLogger::ContextInfo + * @return ErrorLogger::ErrorContext */ - ErrorLogger::ContextInfo getContextInfo() const override; + ErrorLogger::ErrorContext getContextInfo() const override; /** * @return the type name in the source file (XML node tag name / attribute name). diff --git a/src/coreComponents/dataRepository/GroupContext.cpp b/src/coreComponents/dataRepository/GroupContext.cpp index 4d461afa20e..1e65ab8c9cc 100644 --- a/src/coreComponents/dataRepository/GroupContext.cpp +++ b/src/coreComponents/dataRepository/GroupContext.cpp @@ -54,11 +54,11 @@ string GroupContext::toString() const return path.str(); } -ErrorLogger::ContextInfo GroupContext::getContextInfo() const +ErrorLogger::ErrorContext GroupContext::getContextInfo() const { map< std::string, std::string > contextInfo; contextInfo["dataPath"] = toString(); - ErrorLogger::ContextInfo ctxInfo{ contextInfo }; + ErrorLogger::ErrorContext ctxInfo{ contextInfo }; return ctxInfo; } diff --git a/src/coreComponents/dataRepository/GroupContext.hpp b/src/coreComponents/dataRepository/GroupContext.hpp index ad84c486c8d..6436ef1bdaf 100644 --- a/src/coreComponents/dataRepository/GroupContext.hpp +++ b/src/coreComponents/dataRepository/GroupContext.hpp @@ -71,9 +71,9 @@ class GroupContext : public DataContext /** * @brief Returns contextual information, including the file name and the line number - * @return ErrorLogger::ContextInfo + * @return ErrorLogger::ErrorContext */ - ErrorLogger::ContextInfo getContextInfo() const override; + ErrorLogger::ErrorContext getContextInfo() const override; /** * @copydoc DataContext::getToStringInfo() diff --git a/src/coreComponents/dataRepository/WrapperContext.cpp b/src/coreComponents/dataRepository/WrapperContext.cpp index 62a51922d5d..589af68654a 100644 --- a/src/coreComponents/dataRepository/WrapperContext.cpp +++ b/src/coreComponents/dataRepository/WrapperContext.cpp @@ -38,11 +38,11 @@ string WrapperContext::toString() const GEOS_FMT( "{}/{}", m_group.getDataContext().toString(), m_typeName ); } -ErrorLogger::ContextInfo WrapperContext::getContextInfo() const +ErrorLogger::ErrorContext WrapperContext::getContextInfo() const { map< std::string, std::string > contextInfo; contextInfo["dataPath"] = toString(); - ErrorLogger::ContextInfo ctxInfo{ contextInfo }; + ErrorLogger::ErrorContext ctxInfo{ contextInfo }; return ctxInfo; } diff --git a/src/coreComponents/dataRepository/WrapperContext.hpp b/src/coreComponents/dataRepository/WrapperContext.hpp index b40ebdff6a6..8c392bde57a 100644 --- a/src/coreComponents/dataRepository/WrapperContext.hpp +++ b/src/coreComponents/dataRepository/WrapperContext.hpp @@ -56,9 +56,9 @@ class WrapperContext final : public GroupContext /** * @brief Returns contextual information, including the file name and the line number - * @return ErrorLogger::ContextInfo + * @return ErrorLogger::ErrorContext */ - ErrorLogger::ContextInfo getContextInfo() const override; + ErrorLogger::ErrorContext getContextInfo() const override; }; From e22e53834363ecf6772b178177831151e063c4b8 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Thu, 12 Jun 2025 12:00:17 +0200 Subject: [PATCH 060/173] Minor modifications on the GEOS_THROW_IF_GT_MSG message --- src/coreComponents/mesh/FaceManager.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/coreComponents/mesh/FaceManager.cpp b/src/coreComponents/mesh/FaceManager.cpp index c3b79b504a7..b5556eec921 100644 --- a/src/coreComponents/mesh/FaceManager.cpp +++ b/src/coreComponents/mesh/FaceManager.cpp @@ -312,7 +312,10 @@ void FaceManager::sortFaceNodes( arrayView2d< real64 const, nodes::REFERENCE_POS Span< localIndex > const faceNodes ) { localIndex const numFaceNodes = LvArray::integerConversion< localIndex >( faceNodes.size() ); - GEOS_THROW_IF_GT_MSG( numFaceNodes, MAX_FACE_NODES, "The number of maximum nodes allocated per cell face has been reached.", std::runtime_error ); + GEOS_THROW_IF_GT_MSG( numFaceNodes, MAX_FACE_NODES, + GEOS_FMT( "The number of maximum nodes allocated per cell face has been reached " + "at position {}.", elementCenter ), + std::runtime_error ); localIndex const firstNodeIndex = faceNodes[0]; From 8de9060cdf98bead87f5afebbfef031407815cf2 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Thu, 12 Jun 2025 12:05:29 +0200 Subject: [PATCH 061/173] Using GEOS_LOG_RANK instead of GEOS_LOG --- src/coreComponents/common/logger/ErrorHandling.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 3b33554cf72..24808ab2504 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -48,7 +48,7 @@ void ErrorLogger::createFile() } else { - GEOS_LOG( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); + GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); } } catch(const std::exception& e) @@ -223,11 +223,11 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) } } yamlFile.flush(); - GEOS_LOG( GEOS_FMT( "The error file {} was appended.", m_filename ) ); + GEOS_LOG_RANK( GEOS_FMT( "The error file {} was appended.", m_filename ) ); } else { - GEOS_LOG( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); + GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); } } catch( const std::exception & e ) From 6c762e748f58af82565792b6e670e9a8e4afe856 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Thu, 12 Jun 2025 15:53:17 +0200 Subject: [PATCH 062/173] Add an enumeration to secure the keys that can be entered for the map + methods reanming + switch the streamMultilineYamlAttribute() method to private --- .../common/logger/ErrorHandling.cpp | 15 ++- .../common/logger/ErrorHandling.hpp | 104 ++++++++++-------- src/coreComponents/common/logger/Logger.hpp | 12 +- .../dataRepository/DataContext.cpp | 9 +- .../dataRepository/GroupContext.cpp | 7 +- .../dataRepository/WrapperContext.cpp | 7 +- .../unitTests/testErrorHandling.cpp | 8 +- .../mainInterface/initialization.cpp | 4 +- src/main/main.cpp | 2 +- 9 files changed, 92 insertions(+), 76 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 24808ab2504..fc576a3e95a 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -61,6 +61,17 @@ void ErrorLogger::createFile() } } +std::string ErrorLogger::ErrorContext::attributeToString( ErrorLogger::ErrorContext::Attribute attribute ) +{ + switch( attribute ) + { + case ErrorLogger::ErrorContext::Attribute::InputFile: return "inputFile"; + case ErrorLogger::ErrorContext::Attribute::InputLine: return "inputLine"; + case ErrorLogger::ErrorContext::Attribute::DataPath: return "dataPath"; + default: return "Unknown"; + } +} + ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::string errorMsg ) { m_msg = errorMsg + m_msg; @@ -186,12 +197,12 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) { if( isFirst ) { - yamlFile << g_level3Start << key << ": " << value << "\n"; + yamlFile << g_level3Start << ErrorContext::attributeToString( key ) << ": " << value << "\n"; isFirst = false; } else { - yamlFile << g_level3Next << key << ": " << value << "\n"; + yamlFile << g_level3Next << ErrorContext::attributeToString( key ) << ": " << value << "\n"; } } if( isFirst ) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 8ad6b218356..93089d73bbf 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -50,13 +50,20 @@ class ErrorLogger */ struct ErrorContext { + enum class Attribute + { + InputFile, + InputLine, + DataPath + }; + // The map contains contextual information about the error // It could be something like // "file" = "/path/to/file.xml" // "line" = "24" // or something like // "dataPath" = "/Functions/co2brine_philipsDensityTable" - map< std::string, std::string > m_attributes; + map< Attribute, std::string > m_attributes; integer m_priority = 0; /** @@ -66,6 +73,8 @@ class ErrorLogger */ ErrorContext & setPriority( integer priority ) { m_priority = priority; return *this; } + + static std::string attributeToString( Attribute attribute ); }; /** @@ -139,83 +148,82 @@ class ErrorLogger template< typename ... Args > void addContextInfo( Args && ... args ); -private: - /** - * @brief Add contextual information about the error/warning message to the ErrorMsg structure - * @param info DataContext information stored into a map - */ - void addContextInfoImpl( ErrorContext && ctxInfo ); + private: + /** + * @brief Add contextual information about the error/warning message to the ErrorMsg structure + * @param info DataContext information stored into a map + */ + void addContextInfoImpl( ErrorContext && ctxInfo ); }; /** - * @brief Create the yaml file if the option is specified in the command line options + * @brief Returns true whether the YAML file writing option is enabled by the user otherwise false + * @return true + * @return false */ - void createFile(); + bool isOutputFileEnabled() const + { return m_writeYaml; } /** - * @brief Convert a MsgType into a string - * @param type - * @return std::string + * @brief Enable the YAML file output, which is false by default + * @param value A value of true enable the file writing */ - std::string toString( MsgType type ); - - /** - * @brief Write the error message in the yaml file regarding indentation and line break - * @param msg - */ - void streamMultilineYamlAttribute( std::string_view msg, std::ofstream & yamlFile, - std::string_view indent ); + void enableFileOutput( bool value ) + { m_writeYaml = value; } /** - * @brief Checks if the vector contains a valid stack or just the error message - * @return true - * @return false + * @brief Set the name of the YAML file if specified by user (default is "errors.yaml") + * @param filename */ - bool isValidStackTrace( ErrorMsg const & errorMsg ) const; + void setOutputFilename( std::string_view filename ) + { m_filename = filename; } /** - * @brief Add the error/warning message into the yaml file - * @param errorMsg The error message informations formatted by the associated structure + * @brief Return the error message information at the step where this getter is called + * @return The current error msg */ - void write( ErrorMsg const & errorMsg ); + ErrorMsg & currentErrorMsg() + { return m_currentErrorMsg; } /** - * @brief Returns true whether the yaml file writing option is enabled by the user otherwise false - * @return true - * @return false + * @brief Create the YAML file if the option is specified in the command line options */ - bool writeFile() const - { return m_writeYaml; } + void createFile(); /** - * @brief Set the Write Value object - * True whether the yaml file writing option is enabled by the user otherwise false - * @param value + * @brief Convert a MsgType into a string + * @param type the message type label + * @return the string representation of the message type */ - void setWriteValue( bool value ) - { m_writeYaml = value; } + static std::string toString( MsgType type ); /** - * @brief Set the name of the yaml file if specified by user (default is "errors.yaml") - * @param filename + * @brief Checks + * @return trueif the vector contains a valid stack or just the error message + * @return false */ - void setFilename( std::string_view filename ) - { m_filename = filename; } + bool isValidStackTrace( ErrorMsg const & errorMsg ) const; /** - * @brief Return the error message information at the step where this getter is called - * @return The current error msg + * @brief Add the error/warning message into the YAML file + * @param errorMsg The error message informations formatted by the associated structure */ - ErrorMsg & currentErrorMsg() - { return m_currentErrorMsg; } + void write( ErrorMsg const & errorMsg ); private: // The error constructed via exceptions ErrorMsg m_currentErrorMsg; - // Write in the yaml file + // Write in the YAML file bool m_writeYaml = false; - // Yaml file name + // YAML file name std::string_view m_filename = "errors.yaml"; + + /** + * @brief Write the error message in the YAML file regarding indentation and line break + * @param msg + */ + void streamMultilineYamlAttribute( std::string_view msg, std::ofstream & yamlFile, + std::string_view indent ); }; extern ErrorLogger g_errorLogger; @@ -228,4 +236,4 @@ void ErrorLogger::ErrorMsg::addContextInfo( Args && ... args ) } /* namespace geos */ -#endif +#endif \ No newline at end of file diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 7732f69cfb7..fb0b9f5fbb1 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -152,7 +152,7 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - if( g_errorLogger.writeFile() ) \ + if( g_errorLogger.isOutputFileEnabled() ) \ { \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ __msgoss.str(), \ @@ -187,7 +187,7 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - if( g_errorLogger.writeFile() ) \ + if( g_errorLogger.isOutputFileEnabled() ) \ { \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ __msgoss.str(), \ @@ -240,7 +240,7 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - if( g_errorLogger.writeFile() ) \ + if( g_errorLogger.isOutputFileEnabled() ) \ { \ g_errorLogger.currentErrorMsg() \ .setType( ErrorLogger::MsgType::Exception ) \ @@ -275,7 +275,7 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - if( g_errorLogger.writeFile() ) \ + if( g_errorLogger.isOutputFileEnabled() ) \ { \ g_errorLogger.currentErrorMsg() \ .setType( ErrorLogger::MsgType::Exception ) \ @@ -322,7 +322,7 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - if( g_errorLogger.writeFile() ) \ + if( g_errorLogger.isOutputFileEnabled() ) \ { \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ __msgoss.str(), \ @@ -354,7 +354,7 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ - if( g_errorLogger.writeFile() ) \ + if( g_errorLogger.isOutputFileEnabled() ) \ { \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ __msgoss.str(), \ diff --git a/src/coreComponents/dataRepository/DataContext.cpp b/src/coreComponents/dataRepository/DataContext.cpp index 728258e9b28..8e01140759f 100644 --- a/src/coreComponents/dataRepository/DataContext.cpp +++ b/src/coreComponents/dataRepository/DataContext.cpp @@ -110,11 +110,10 @@ string DataFileContext::toString() const ErrorLogger::ErrorContext DataFileContext::getContextInfo() const { - map< std::string, std::string > contextInfo; - contextInfo["inputFile"] = m_filePath; - contextInfo["inputFileLine"] = std::to_string( m_line ); - ErrorLogger::ErrorContext ctxInfo{ contextInfo }; - + ErrorLogger::ErrorContext ctxInfo{ + { { ErrorLogger::ErrorContext::Attribute::InputFile, m_filePath }, + { ErrorLogger::ErrorContext::Attribute::InputLine, std::to_string( m_line )} } // m_attributes + }; return ctxInfo; } diff --git a/src/coreComponents/dataRepository/GroupContext.cpp b/src/coreComponents/dataRepository/GroupContext.cpp index 1e65ab8c9cc..1ab50c96f4a 100644 --- a/src/coreComponents/dataRepository/GroupContext.cpp +++ b/src/coreComponents/dataRepository/GroupContext.cpp @@ -56,10 +56,9 @@ string GroupContext::toString() const ErrorLogger::ErrorContext GroupContext::getContextInfo() const { - map< std::string, std::string > contextInfo; - contextInfo["dataPath"] = toString(); - ErrorLogger::ErrorContext ctxInfo{ contextInfo }; - + ErrorLogger::ErrorContext ctxInfo{ + { { ErrorLogger::ErrorContext::Attribute::DataPath, toString() } } // m_attributes + }; return ctxInfo; } diff --git a/src/coreComponents/dataRepository/WrapperContext.cpp b/src/coreComponents/dataRepository/WrapperContext.cpp index 589af68654a..14c0ab332a3 100644 --- a/src/coreComponents/dataRepository/WrapperContext.cpp +++ b/src/coreComponents/dataRepository/WrapperContext.cpp @@ -40,10 +40,9 @@ string WrapperContext::toString() const ErrorLogger::ErrorContext WrapperContext::getContextInfo() const { - map< std::string, std::string > contextInfo; - contextInfo["dataPath"] = toString(); - ErrorLogger::ErrorContext ctxInfo{ contextInfo }; - + ErrorLogger::ErrorContext ctxInfo{ + { { ErrorLogger::ErrorContext::Attribute::DataPath, toString() } } // m_attributes + }; return ctxInfo; } diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index e11b55cf6dd..a45491a7b49 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -23,15 +23,15 @@ using namespace dataRepository; TEST( ErrorHandling, testYaml ) { - g_errorLogger.setFilename( "errorsOutput.yaml" ); - g_errorLogger.setWriteValue( true ); + g_errorLogger.setOutputFilename( "errorsOutput.yaml" ); + g_errorLogger.enableFileOutput( true ); double minPrecision = 1e-6; double maxPrecision = 1e-3; int x = 5; DataFileContext const context = DataFileContext( "Base Test Class", __FILE__, __LINE__ ); - if( g_errorLogger.writeFile() ) + if( g_errorLogger.isOutputFileEnabled() ) { g_errorLogger.createFile(); } @@ -57,7 +57,7 @@ TEST( ErrorHandling, testYaml ) .addContextInfo( context.getContextInfo().setPriority( 2 ) ); } - if( g_errorLogger.writeFile() ) + if( g_errorLogger.isOutputFileEnabled() ) { g_errorLogger.write( g_errorLogger.currentErrorMsg() ); } diff --git a/src/coreComponents/mainInterface/initialization.cpp b/src/coreComponents/mainInterface/initialization.cpp index 15287a726e0..c6d0cd33c64 100644 --- a/src/coreComponents/mainInterface/initialization.cpp +++ b/src/coreComponents/mainInterface/initialization.cpp @@ -242,11 +242,11 @@ std::unique_ptr< CommandLineOptions > parseCommandLineOptions( int argc, char * break; case ERRORSOUTPUT: { - g_errorLogger.setWriteValue( true ); + g_errorLogger.enableFileOutput( true ); if( options[ERRORSOUTPUT].arg != nullptr ) { std::string_view filename = options[ERRORSOUTPUT].arg; - g_errorLogger.setFilename( filename ); + g_errorLogger.setOutputFilename( filename ); } g_errorLogger.createFile(); } diff --git a/src/main/main.cpp b/src/main/main.cpp index ead557e453e..542e33cccf3 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -77,7 +77,7 @@ int main( int argc, char *argv[] ) catch( std::exception const & e ) { GEOS_LOG( e.what() ); - if( g_errorLogger.writeFile() ) + if( g_errorLogger.isOutputFileEnabled() ) { g_errorLogger.write( g_errorLogger.currentErrorMsg() ); } From d2884905519c7b092093693c839c7851d1eaf491 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Fri, 13 Jun 2025 10:48:35 +0200 Subject: [PATCH 063/173] Improved code comments --- .../common/logger/ErrorHandling.cpp | 12 +- .../common/logger/ErrorHandling.hpp | 135 ++++++++++-------- .../dataRepository/DataContext.hpp | 4 +- .../dataRepository/GroupContext.hpp | 4 +- .../dataRepository/WrapperContext.hpp | 5 +- 5 files changed, 94 insertions(+), 66 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index fc576a3e95a..87e70412d8b 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -164,10 +164,16 @@ void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstr bool ErrorLogger::isValidStackTrace( ErrorLogger::ErrorMsg const & errorMsg ) const { - return( errorMsg.m_sourceCallStack.size() == 1 && - errorMsg.m_sourceCallStack[0] == g_callStackMessage ); + return( errorMsg.m_sourceCallStack.size() != 1 || + errorMsg.m_sourceCallStack[0] != g_callStackMessage ); } +// void ErrorLogger::writeCurrentMsg() +// { +// write( m_currentErrorMsg ); +// m_currentErrorMsg = ErrorMsg{}; +// } + void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) { try @@ -222,7 +228,7 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) yamlFile << g_level2Next << "line: " << errorMsg.m_line << "\n"; // Information about the stack trace yamlFile << g_level1Next << "sourceCallStack:\n"; - if( isValidStackTrace( errorMsg ) ) + if( !isValidStackTrace( errorMsg ) ) { yamlFile << g_level3Start << "callStackMessage: " << errorMsg.m_sourceCallStack[0] << "\n"; } diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 93089d73bbf..315de6505ca 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -27,7 +27,8 @@ namespace geos /** * @class ErrorLogger - * @brief Class to format and write the error/warning message that occured during the initialization + * @brief Class to format and write different error/warning information that occured during the initialization + * */ class ErrorLogger { @@ -45,11 +46,17 @@ class ErrorLogger }; /** - * @brief Stores contextual information about the error that occurred and assigns it a priority + * @struct ErrorContext + * Store contextual information about the error that occurred and assign it a priority * default is 0 */ struct ErrorContext { + + /** + * @enum Attribute + * Enumeration used to secure potential map keys. + */ enum class Attribute { InputFile, @@ -58,169 +65,183 @@ class ErrorLogger }; // The map contains contextual information about the error - // It could be something like + // It could be something like // "file" = "/path/to/file.xml" // "line" = "24" - // or something like - // "dataPath" = "/Functions/co2brine_philipsDensityTable" + // or something like + // "dataPath" = "/Functions/co2brine_philipsDensityTable + // The key is a field of the Attribute enumeration and is converted to a string for writing in the YAML map< Attribute, std::string > m_attributes; integer m_priority = 0; /** - * @brief Set the priority of the current error context information - * @param priority - * @return ErrorContext& + * @brief Set the priority value of the current error context information + * @param priority the new value to asign + * @return ErrorContext& the reference to the corresponding error */ ErrorContext & setPriority( integer priority ) { m_priority = priority; return *this; } + /** + * @brief Convert a value from the Attribute enumeration to a string + * @param attribute the value of the enumeration to be converted + * @return std::string a string representation of the enumeration value + */ static std::string attributeToString( Attribute attribute ); }; /** - * @brief Struct to define the error/warning message + * @brief Struct to construct the error/warning object */ struct ErrorMsg { + // the error type (Warning, Error or Exception) MsgType m_type; + // the erreur message that can be completed std::string m_msg; + // the source location (file and line corresponding to the error in the code) std::string m_file; integer m_line; + // the rank(s) on which the error occured std::vector< int > m_ranksInfo; + // Additional information about the error in the input file std::vector< ErrorContext > m_contextsInfo; + // the stack trace std::vector< std::string > m_sourceCallStack; /** - * @brief Construct a new Error Msg object + * @brief Construct a default Error Message without field specification */ ErrorMsg() {}; /** - * @brief Construct a new Error Msg object - * @param msgType The type of the message (error or warning) - * @param msgContent The error/warning message content - * @param msgFile The file name where the error occcured - * @param msgLine The line where the error occured + * @brief Construct a new Error Message from attributes + * @param msgType the type of the message (error or warning) + * @param msgContent the error/warning message content + * @param msgFile the source file name where the error occcured + * @param msgLine the line where the error occured */ ErrorMsg( MsgType msgType, std::string msgContent, std::string msgFile, integer msgLine ) : m_type( msgType ), m_msg( msgContent ), m_file( msgFile ), m_line( msgLine ) {} /** - * @brief Add text to the error msg that occured to the msg field of the structure - * @param msg The text to add. - * @return The instance, for builder pattern. + * @brief Add text to the current error msg + * @param msg the text to add + * @return reference to the current instance */ ErrorMsg & addToMsg( std::string msg ); /** - * @brief Set the Code Location object - * @param msgFile - * @param msgLine - * @return ErrorMsg& + * @brief Set the source code location values (file and line where the error is detected) + * @param msgFile name of the source file location to add + * @param msgLine line of the source file location to add + * @return ErrorMsg& reference to the current instance */ ErrorMsg & setCodeLocation( std::string_view msgFile, integer msgLine ); /** - * @brief Set the Type object - * @param msgType - * @return ErrorMsg& + * @brief Set the type of the error + * @param msgType the type can be error, warning or exception + * @return ErrorMsg& reference to the current instance */ ErrorMsg & setType( MsgType msgType ); /** * @brief Set the rank on which the error is raised - * @param rank - * @return ErrorMsg& + * @param rank the value to asign + * @return ErrorMsg& reference to the current instance */ ErrorMsg & setRank( int rank ); /** - * @brief Add stack trace information about the error/warning message to the ErrorMsg structure - * @param ossStackTrace stack trace information + * @brief Add stack trace information about the error + * @param ossStackTrace stack trace information to add + * @return ErrorMsg& reference to the current instance */ - ErrorLogger::ErrorMsg & addCallStackInfo( std::string ossStackTrace ); + ErrorMsg & addCallStackInfo( std::string ossStackTrace ); /** * @brief Adds one or more context elements to the error - * @tparam Args - * @param args + * @tparam Args variadic pack of argument types + * @param args list of DataContexts */ template< typename ... Args > void addContextInfo( Args && ... args ); - private: - /** - * @brief Add contextual information about the error/warning message to the ErrorMsg structure - * @param info DataContext information stored into a map - */ - void addContextInfoImpl( ErrorContext && ctxInfo ); +private: + /** + * @brief Add contextual information about the error/warning + * @param ctxInfo rvalue of the ErrorContext class + */ + void addContextInfoImpl( ErrorContext && ctxInfo ); }; /** - * @brief Returns true whether the YAML file writing option is enabled by the user otherwise false - * @return true - * @return false + * @return true if the YAML file output is enabled */ bool isOutputFileEnabled() const { return m_writeYaml; } /** - * @brief Enable the YAML file output, which is false by default + * @brief Enable the YAML file output, which is false by default * @param value A value of true enable the file writing */ void enableFileOutput( bool value ) { m_writeYaml = value; } /** - * @brief Set the name of the YAML file if specified by user (default is "errors.yaml") - * @param filename + * @brief Set the name of the YAML file if specified by user + * default is "errors.yaml" + * @param filename the name of the YAML file */ void setOutputFilename( std::string_view filename ) { m_filename = filename; } /** - * @brief Return the error message information at the step where this getter is called - * @return The current error msg + * @brief Return the error message information at this point + * @return reference to the current instance */ ErrorMsg & currentErrorMsg() { return m_currentErrorMsg; } /** - * @brief Create the YAML file if the option is specified in the command line options + * @brief Create the YAML file or overwrite the contents if a YAML file of the same name already exists + * And write its header when the command line option is enabled */ void createFile(); /** * @brief Convert a MsgType into a string - * @param type the message type label - * @return the string representation of the message type + * @param type the message type label + * @return the string representation of the message type */ static std::string toString( MsgType type ); /** - * @brief Checks - * @return trueif the vector contains a valid stack or just the error message - * @return false + * @return true if the vector contains a valid stack */ bool isValidStackTrace( ErrorMsg const & errorMsg ) const; + // void writeCurrentMsg(); + /** - * @brief Add the error/warning message into the YAML file - * @param errorMsg The error message informations formatted by the associated structure + * @brief Write all the information retrieved about the error/warning message into the YAML file + * @param errorMsg a constant reference to the error */ void write( ErrorMsg const & errorMsg ); private: // The error constructed via exceptions ErrorMsg m_currentErrorMsg; - // Write in the YAML file + // Indicate whether the write to YAML command line option is enabled bool m_writeYaml = false; // YAML file name std::string_view m_filename = "errors.yaml"; /** * @brief Write the error message in the YAML file regarding indentation and line break - * @param msg + * @param msg the message to write in the YAML + * For the exception type, this message can be added as needed. */ void streamMultilineYamlAttribute( std::string_view msg, std::ofstream & yamlFile, std::string_view indent ); @@ -236,4 +257,4 @@ void ErrorLogger::ErrorMsg::addContextInfo( Args && ... args ) } /* namespace geos */ -#endif \ No newline at end of file +#endif diff --git a/src/coreComponents/dataRepository/DataContext.hpp b/src/coreComponents/dataRepository/DataContext.hpp index 6797d258acd..2720b80a4fa 100644 --- a/src/coreComponents/dataRepository/DataContext.hpp +++ b/src/coreComponents/dataRepository/DataContext.hpp @@ -171,8 +171,8 @@ class DataFileContext final : public DataContext string toString() const override; /** - * @brief Returns contextual information, including the file name and the line number - * @return ErrorLogger::ErrorContext + * @brief Return contextual information (file and line of the input file where the error occured) + * @return ErrorLogger::ErrorContext ErrorLogger instance updated with context information */ ErrorLogger::ErrorContext getContextInfo() const override; diff --git a/src/coreComponents/dataRepository/GroupContext.hpp b/src/coreComponents/dataRepository/GroupContext.hpp index 6436ef1bdaf..a248dc5c352 100644 --- a/src/coreComponents/dataRepository/GroupContext.hpp +++ b/src/coreComponents/dataRepository/GroupContext.hpp @@ -70,8 +70,8 @@ class GroupContext : public DataContext string toString() const override; /** - * @brief Returns contextual information, including the file name and the line number - * @return ErrorLogger::ErrorContext + * @brief Return contextual information here it is a data path + * @return ErrorLogger::ErrorContext ErrorLogger instance updated with context information */ ErrorLogger::ErrorContext getContextInfo() const override; diff --git a/src/coreComponents/dataRepository/WrapperContext.hpp b/src/coreComponents/dataRepository/WrapperContext.hpp index 8c392bde57a..27e9bd98583 100644 --- a/src/coreComponents/dataRepository/WrapperContext.hpp +++ b/src/coreComponents/dataRepository/WrapperContext.hpp @@ -55,8 +55,9 @@ class WrapperContext final : public GroupContext string toString() const override; /** - * @brief Returns contextual information, including the file name and the line number - * @return ErrorLogger::ErrorContext + * @brief Return contextual information here it is a data path + * @return ErrorLogger::ErrorContext ErrorLogger instance updated with context information + */ ErrorLogger::ErrorContext getContextInfo() const override; }; From 99d9b5bcc45b242b98a1370e6bf2585b96e590eb Mon Sep 17 00:00:00 2001 From: amandinehry Date: Fri, 13 Jun 2025 13:55:46 +0200 Subject: [PATCH 064/173] reverse the change from GEOS_LOG to GEOS_LOG_RANK +empty the object after writing --- .../common/logger/ErrorHandling.cpp | 15 +++++---------- .../common/logger/ErrorHandling.hpp | 9 ++++----- src/coreComponents/common/logger/Logger.hpp | 8 ++++---- .../unitTests/testErrorHandling.cpp | 2 +- src/main/main.cpp | 2 +- 5 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 87e70412d8b..ae4c29e3461 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -48,7 +48,7 @@ void ErrorLogger::createFile() } else { - GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); + GEOS_LOG( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); } } catch(const std::exception& e) @@ -168,13 +168,7 @@ bool ErrorLogger::isValidStackTrace( ErrorLogger::ErrorMsg const & errorMsg ) co errorMsg.m_sourceCallStack[0] != g_callStackMessage ); } -// void ErrorLogger::writeCurrentMsg() -// { -// write( m_currentErrorMsg ); -// m_currentErrorMsg = ErrorMsg{}; -// } - -void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) +void ErrorLogger::flushCurrentErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) { try { @@ -240,11 +234,12 @@ void ErrorLogger::write( ErrorLogger::ErrorMsg const & errorMsg ) } } yamlFile.flush(); - GEOS_LOG_RANK( GEOS_FMT( "The error file {} was appended.", m_filename ) ); + errorMsg = ErrorMsg(); + GEOS_LOG( GEOS_FMT( "The error file {} was appended.", m_filename ) ); } else { - GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); + GEOS_LOG( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); } } catch( const std::exception & e ) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 315de6505ca..64fc13c4339 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -42,7 +42,8 @@ class ErrorLogger { Error, Warning, - Exception + Exception, + Undefined }; /** @@ -96,7 +97,7 @@ class ErrorLogger struct ErrorMsg { // the error type (Warning, Error or Exception) - MsgType m_type; + MsgType m_type = ErrorLogger::MsgType::Undefined; // the erreur message that can be completed std::string m_msg; // the source location (file and line corresponding to the error in the code) @@ -222,13 +223,11 @@ class ErrorLogger */ bool isValidStackTrace( ErrorMsg const & errorMsg ) const; - // void writeCurrentMsg(); - /** * @brief Write all the information retrieved about the error/warning message into the YAML file * @param errorMsg a constant reference to the error */ - void write( ErrorMsg const & errorMsg ); + void flushCurrentErrorMsg( ErrorMsg & errorMsg ); private: // The error constructed via exceptions diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index fb0b9f5fbb1..62d2c0a0a99 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -160,7 +160,7 @@ __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addCallStackInfo( stackHistory ); \ - g_errorLogger.write( msgStruct ); \ + g_errorLogger.flushCurrentErrorMsg( msgStruct ); \ } \ LvArray::system::callErrorHandler(); \ } \ @@ -196,7 +196,7 @@ msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addContextInfo( __VA_ARGS__ ); \ msgStruct.addCallStackInfo( stackHistory ); \ - g_errorLogger.write( msgStruct ); \ + g_errorLogger.flushCurrentErrorMsg( msgStruct ); \ } \ LvArray::system::callErrorHandler(); \ } \ @@ -330,7 +330,7 @@ __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ - g_errorLogger.write( msgStruct ); \ + g_errorLogger.flushCurrentErrorMsg( msgStruct ); \ } \ } \ } while( false ) @@ -363,7 +363,7 @@ msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addContextInfo( __VA_ARGS__ ); \ msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ - g_errorLogger.write( msgStruct ); \ + g_errorLogger.flushCurrentErrorMsg( msgStruct ); \ } \ } \ } while( false ) diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index a45491a7b49..098b846a37d 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -59,7 +59,7 @@ TEST( ErrorHandling, testYaml ) if( g_errorLogger.isOutputFileEnabled() ) { - g_errorLogger.write( g_errorLogger.currentErrorMsg() ); + g_errorLogger.flushCurrentErrorMsg( g_errorLogger.currentErrorMsg() ); } } diff --git a/src/main/main.cpp b/src/main/main.cpp index 542e33cccf3..31b19471ce0 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -79,7 +79,7 @@ int main( int argc, char *argv[] ) GEOS_LOG( e.what() ); if( g_errorLogger.isOutputFileEnabled() ) { - g_errorLogger.write( g_errorLogger.currentErrorMsg() ); + g_errorLogger.flushCurrentErrorMsg( g_errorLogger.currentErrorMsg() ); } LvArray::system::callErrorHandler(); basicCleanup(); From f929f979001069b269e2f7f1fe024fce253f16ee Mon Sep 17 00:00:00 2001 From: amandinehry Date: Fri, 13 Jun 2025 17:01:20 +0200 Subject: [PATCH 065/173] minor changes syntax + remove isValidStackTrace() method and replace it by a boolean --- .../common/logger/ErrorHandling.cpp | 18 ++++------ .../common/logger/ErrorHandling.hpp | 33 ++++++++++--------- .../dataRepository/WrapperContext.hpp | 1 - 3 files changed, 23 insertions(+), 29 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index ae4c29e3461..2c02ea12c8c 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -107,7 +107,6 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addCallStackInfo( std::string oss std::istringstream iss( ossStackTrace ); std::string stackLine; std::size_t index; - bool isWellFormatted = false; std::regex pattern( R"(Frame \d+: \S+)" ); @@ -115,13 +114,13 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addCallStackInfo( std::string oss { if( std::regex_search( stackLine, pattern )) { - isWellFormatted = true; + m_isValidStackTrace = true; index = stackLine.find( ':' ); m_sourceCallStack.push_back( stackLine.substr( index + 1 ) ); } } - if( !isWellFormatted ) + if( !m_isValidStackTrace ) { m_sourceCallStack.push_back( g_callStackMessage ); } @@ -162,12 +161,6 @@ void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstr } } -bool ErrorLogger::isValidStackTrace( ErrorLogger::ErrorMsg const & errorMsg ) const -{ - return( errorMsg.m_sourceCallStack.size() != 1 || - errorMsg.m_sourceCallStack[0] != g_callStackMessage ); -} - void ErrorLogger::flushCurrentErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) { try @@ -178,9 +171,9 @@ void ErrorLogger::flushCurrentErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) // General errors info (type, rank on which the error occured) yamlFile << "\n" << g_level1Start << "type: " << g_errorLogger.toString( errorMsg.m_type ) << "\n"; yamlFile << g_level1Next << "rank: "; - for( size_t i = 0; i < errorMsg.m_ranksInfo.size(); i++ ) + for( auto const & info: errorMsg.m_ranksInfo ) { - yamlFile << errorMsg.m_ranksInfo[i]; + yamlFile << info; } yamlFile << "\n"; // Error message @@ -222,7 +215,7 @@ void ErrorLogger::flushCurrentErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) yamlFile << g_level2Next << "line: " << errorMsg.m_line << "\n"; // Information about the stack trace yamlFile << g_level1Next << "sourceCallStack:\n"; - if( !isValidStackTrace( errorMsg ) ) + if( !errorMsg.isValidStackTrace() ) { yamlFile << g_level3Start << "callStackMessage: " << errorMsg.m_sourceCallStack[0] << "\n"; } @@ -240,6 +233,7 @@ void ErrorLogger::flushCurrentErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) else { GEOS_LOG( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); + } } catch( const std::exception & e ) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 64fc13c4339..9b79fe467da 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -28,7 +28,6 @@ namespace geos /** * @class ErrorLogger * @brief Class to format and write different error/warning information that occured during the initialization - * */ class ErrorLogger { @@ -78,7 +77,7 @@ class ErrorLogger /** * @brief Set the priority value of the current error context information * @param priority the new value to asign - * @return ErrorContext& the reference to the corresponding error + * @return the reference to the corresponding error */ ErrorContext & setPriority( integer priority ) { m_priority = priority; return *this; } @@ -86,7 +85,7 @@ class ErrorLogger /** * @brief Convert a value from the Attribute enumeration to a string * @param attribute the value of the enumeration to be converted - * @return std::string a string representation of the enumeration value + * @return a string representation of the enumeration value */ static std::string attributeToString( Attribute attribute ); }; @@ -116,7 +115,7 @@ class ErrorLogger ErrorMsg() {}; /** - * @brief Construct a new Error Message from attributes + * @brief Construct a new Error Message from parameters * @param msgType the type of the message (error or warning) * @param msgContent the error/warning message content * @param msgFile the source file name where the error occcured @@ -128,7 +127,7 @@ class ErrorLogger /** * @brief Add text to the current error msg * @param msg the text to add - * @return reference to the current instance + * @return the reference to the current instance */ ErrorMsg & addToMsg( std::string msg ); @@ -136,31 +135,37 @@ class ErrorLogger * @brief Set the source code location values (file and line where the error is detected) * @param msgFile name of the source file location to add * @param msgLine line of the source file location to add - * @return ErrorMsg& reference to the current instance + * @return the reference to the current instance */ ErrorMsg & setCodeLocation( std::string_view msgFile, integer msgLine ); /** * @brief Set the type of the error * @param msgType the type can be error, warning or exception - * @return ErrorMsg& reference to the current instance + * @return the reference to the current instance */ ErrorMsg & setType( MsgType msgType ); /** * @brief Set the rank on which the error is raised * @param rank the value to asign - * @return ErrorMsg& reference to the current instance + * @return the reference to the current instance */ ErrorMsg & setRank( int rank ); /** * @brief Add stack trace information about the error * @param ossStackTrace stack trace information to add - * @return ErrorMsg& reference to the current instance + * @return the reference to the current instance */ ErrorMsg & addCallStackInfo( std::string ossStackTrace ); + /** + * @return true if the YAML file output is enabled + */ + bool isValidStackTrace() const + { return m_isValidStackTrace; } + /** * @brief Adds one or more context elements to the error * @tparam Args variadic pack of argument types @@ -175,6 +180,8 @@ class ErrorLogger * @param ctxInfo rvalue of the ErrorContext class */ void addContextInfoImpl( ErrorContext && ctxInfo ); + + bool m_isValidStackTrace = false; }; /** @@ -200,7 +207,7 @@ class ErrorLogger /** * @brief Return the error message information at this point - * @return reference to the current instance + * @return the reference to the current instance */ ErrorMsg & currentErrorMsg() { return m_currentErrorMsg; } @@ -217,12 +224,6 @@ class ErrorLogger * @return the string representation of the message type */ static std::string toString( MsgType type ); - - /** - * @return true if the vector contains a valid stack - */ - bool isValidStackTrace( ErrorMsg const & errorMsg ) const; - /** * @brief Write all the information retrieved about the error/warning message into the YAML file * @param errorMsg a constant reference to the error diff --git a/src/coreComponents/dataRepository/WrapperContext.hpp b/src/coreComponents/dataRepository/WrapperContext.hpp index 27e9bd98583..48c8e28446d 100644 --- a/src/coreComponents/dataRepository/WrapperContext.hpp +++ b/src/coreComponents/dataRepository/WrapperContext.hpp @@ -57,7 +57,6 @@ class WrapperContext final : public GroupContext /** * @brief Return contextual information here it is a data path * @return ErrorLogger::ErrorContext ErrorLogger instance updated with context information - */ ErrorLogger::ErrorContext getContextInfo() const override; }; From 709d8a49a2ea45ee93b3f465f4492330c2c3f337 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Mon, 16 Jun 2025 10:50:18 +0200 Subject: [PATCH 066/173] Minor changes: string to string_view when it was possible + add an addToMsg method which takes an std::exception + add a boolean toEnd in the addToMsg methods --- .../common/logger/ErrorHandling.cpp | 33 +++++++++++++++---- .../common/logger/ErrorHandling.hpp | 13 ++++++-- src/coreComponents/common/logger/Logger.hpp | 6 ++-- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 2c02ea12c8c..fcb5e593b52 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -31,7 +31,7 @@ static constexpr std::string_view g_level2Start = " - "; static constexpr std::string_view g_level2Next = " "; static constexpr std::string_view g_level3Start = " - "; static constexpr std::string_view g_level3Next = " "; -static constexpr const char * g_callStackMessage = +static constexpr std::string_view g_callStackMessage = "Callstack could not be retrieved. The format does not match the expected one."; ErrorLogger g_errorLogger{}; @@ -72,9 +72,29 @@ std::string ErrorLogger::ErrorContext::attributeToString( ErrorLogger::ErrorCon } } -ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::string errorMsg ) +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::exception const & e, bool toEnd ) { - m_msg = errorMsg + m_msg; + if( toEnd ) + { + m_msg = m_msg + e.what(); + } + else + { + m_msg = e.what() + m_msg; + } + return *this; +} + +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::string_view errorMsg, bool toEnd ) +{ + if( toEnd ) + { + m_msg = m_msg + std::string( errorMsg ); + } + else + { + m_msg = std::string( errorMsg ) + m_msg; + } return *this; } @@ -102,9 +122,10 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setRank( int rank ) return *this; } -ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addCallStackInfo( std::string ossStackTrace ) +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addCallStackInfo( std::string_view ossStackTrace ) { - std::istringstream iss( ossStackTrace ); + std::string str = std::string( ossStackTrace ); + std::istringstream iss( str ); std::string stackLine; std::size_t index; @@ -122,7 +143,7 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addCallStackInfo( std::string oss if( !m_isValidStackTrace ) { - m_sourceCallStack.push_back( g_callStackMessage ); + m_sourceCallStack.push_back( std::string( g_callStackMessage ) ); } return *this; diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 9b79fe467da..c17824ab619 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -121,15 +121,22 @@ class ErrorLogger * @param msgFile the source file name where the error occcured * @param msgLine the line where the error occured */ - ErrorMsg( MsgType msgType, std::string msgContent, std::string msgFile, integer msgLine ) + ErrorMsg( MsgType msgType, std::string_view msgContent, std::string_view msgFile, integer msgLine ) : m_type( msgType ), m_msg( msgContent ), m_file( msgFile ), m_line( msgLine ) {} + + /** + * @brief Add text to the current error msg + * @param e the exception containing text to add + * @return the reference to the current instance + */ + ErrorMsg & addToMsg( std::exception const & e, bool toEnd = false ); /** * @brief Add text to the current error msg * @param msg the text to add * @return the reference to the current instance */ - ErrorMsg & addToMsg( std::string msg ); + ErrorMsg & addToMsg( std::string_view msg, bool toEnd = false ); /** * @brief Set the source code location values (file and line where the error is detected) @@ -158,7 +165,7 @@ class ErrorLogger * @param ossStackTrace stack trace information to add * @return the reference to the current instance */ - ErrorMsg & addCallStackInfo( std::string ossStackTrace ); + ErrorMsg & addCallStackInfo( std::string_view ossStackTrace ); /** * @return true if the YAML file output is enabled diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 62d2c0a0a99..e7e6903b3dd 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -240,12 +240,13 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ + std::string msg = __msgoss.str(); \ if( g_errorLogger.isOutputFileEnabled() ) \ { \ g_errorLogger.currentErrorMsg() \ .setType( ErrorLogger::MsgType::Exception ) \ .setCodeLocation( __FILE__, __LINE__ ) \ - .addToMsg( __msgoss.str() ) \ + .addToMsg( msg ) \ .setRank( ::geos::logger::internal::rank ) \ .addCallStackInfo( stackHistory ); \ } \ @@ -275,12 +276,13 @@ std::cout << __oss.str() << std::endl; \ std::ostringstream __msgoss; \ __msgoss << MSG; \ + std::string msg = __msgoss.str(); \ if( g_errorLogger.isOutputFileEnabled() ) \ { \ g_errorLogger.currentErrorMsg() \ .setType( ErrorLogger::MsgType::Exception ) \ .setCodeLocation( __FILE__, __LINE__ ) \ - .addToMsg( __msgoss.str() ) \ + .addToMsg( msg ) \ .setRank( ::geos::logger::internal::rank ) \ .addCallStackInfo( stackHistory ) \ .addContextInfo( __VA_ARGS__ ); \ From 051e85b0240a4f2facc0ad69b71c7c620c1d6153 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Mon, 16 Jun 2025 11:33:15 +0200 Subject: [PATCH 067/173] Remove try/catch in the createFile() and the flushCurrentErrorMsg() method because this code is already exception-free --- .../common/logger/ErrorHandling.cpp | 132 ++++++++---------- 1 file changed, 55 insertions(+), 77 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index fcb5e593b52..512c78e9883 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -37,27 +37,16 @@ static constexpr std::string_view g_callStackMessage = ErrorLogger g_errorLogger{}; void ErrorLogger::createFile() -{ - try - { - std::ofstream yamlFile( std::string( m_filename ), std::ios::out ); - if( yamlFile.is_open() ) - { - yamlFile << "errors: \n"; - yamlFile.close(); - } - else - { - GEOS_LOG( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); - } - } - catch(const std::exception& e) +{ + std::ofstream yamlFile( std::string( m_filename ), std::ios::out ); + if( yamlFile.is_open() ) { - std::cerr << e.what() << '\n'; + yamlFile << "errors: \n"; + yamlFile.close(); } - catch ( ... ) + else { - std::cerr << "Unexpected exception." << '\n'; + GEOS_LOG( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); } } @@ -184,86 +173,75 @@ void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstr void ErrorLogger::flushCurrentErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) { - try + std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); + if( yamlFile.is_open() ) { - std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); - if( yamlFile.is_open() ) + // General errors info (type, rank on which the error occured) + yamlFile << "\n" << g_level1Start << "type: " << g_errorLogger.toString( errorMsg.m_type ) << "\n"; + yamlFile << g_level1Next << "rank: "; + for( auto const & info: errorMsg.m_ranksInfo ) { - // General errors info (type, rank on which the error occured) - yamlFile << "\n" << g_level1Start << "type: " << g_errorLogger.toString( errorMsg.m_type ) << "\n"; - yamlFile << g_level1Next << "rank: "; - for( auto const & info: errorMsg.m_ranksInfo ) - { - yamlFile << info; - } - yamlFile << "\n"; - // Error message - yamlFile << g_level1Next << "message: >-\n"; - streamMultilineYamlAttribute( errorMsg.m_msg, yamlFile, g_level2Next ); - if( !errorMsg.m_contextsInfo.empty() ) + yamlFile << info; + } + yamlFile << "\n"; + // Error message + yamlFile << g_level1Next << "message: >-\n"; + streamMultilineYamlAttribute( errorMsg.m_msg, yamlFile, g_level2Next ); + if( !errorMsg.m_contextsInfo.empty() ) + { + // Additional informations about the context of the error and priority information of each context + yamlFile << g_level1Next << "contexts:\n"; + for( ErrorContext const & ctxInfo : errorMsg.m_contextsInfo ) { - // Additional informations about the context of the error and priority information of each context - yamlFile << g_level1Next << "contexts:\n"; - for( ErrorContext const & ctxInfo : errorMsg.m_contextsInfo ) + bool isFirst = true; + for( auto const & [key, value] : ctxInfo.m_attributes ) { - bool isFirst = true; - for( auto const & [key, value] : ctxInfo.m_attributes ) - { - if( isFirst ) - { - yamlFile << g_level3Start << ErrorContext::attributeToString( key ) << ": " << value << "\n"; - isFirst = false; - } - else - { - yamlFile << g_level3Next << ErrorContext::attributeToString( key ) << ": " << value << "\n"; - } - } if( isFirst ) { - yamlFile << g_level3Start << "priority: " << ctxInfo.m_priority << "\n"; + yamlFile << g_level3Start << ErrorContext::attributeToString( key ) << ": " << value << "\n"; isFirst = false; } else { - yamlFile << g_level3Next << "priority: " < Date: Mon, 16 Jun 2025 11:40:36 +0200 Subject: [PATCH 068/173] Renaming: flushCurrentErrorMsg() into flushErrorMsg() --- src/coreComponents/common/logger/ErrorHandling.cpp | 2 +- src/coreComponents/common/logger/ErrorHandling.hpp | 2 +- src/coreComponents/common/logger/Logger.hpp | 8 ++++---- .../dataRepository/unitTests/testErrorHandling.cpp | 2 +- src/main/main.cpp | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 512c78e9883..38bbdc37f1c 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -171,7 +171,7 @@ void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstr } } -void ErrorLogger::flushCurrentErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) +void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) { std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); if( yamlFile.is_open() ) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index c17824ab619..d1a6c1edd5c 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -235,7 +235,7 @@ class ErrorLogger * @brief Write all the information retrieved about the error/warning message into the YAML file * @param errorMsg a constant reference to the error */ - void flushCurrentErrorMsg( ErrorMsg & errorMsg ); + void flushErrorMsg( ErrorMsg & errorMsg ); private: // The error constructed via exceptions diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index e7e6903b3dd..0763390b87e 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -160,7 +160,7 @@ __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addCallStackInfo( stackHistory ); \ - g_errorLogger.flushCurrentErrorMsg( msgStruct ); \ + g_errorLogger.flushErrorMsg( msgStruct ); \ } \ LvArray::system::callErrorHandler(); \ } \ @@ -196,7 +196,7 @@ msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addContextInfo( __VA_ARGS__ ); \ msgStruct.addCallStackInfo( stackHistory ); \ - g_errorLogger.flushCurrentErrorMsg( msgStruct ); \ + g_errorLogger.flushErrorMsg( msgStruct ); \ } \ LvArray::system::callErrorHandler(); \ } \ @@ -332,7 +332,7 @@ __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ - g_errorLogger.flushCurrentErrorMsg( msgStruct ); \ + g_errorLogger.flushErrorMsg( msgStruct ); \ } \ } \ } while( false ) @@ -365,7 +365,7 @@ msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.addContextInfo( __VA_ARGS__ ); \ msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ - g_errorLogger.flushCurrentErrorMsg( msgStruct ); \ + g_errorLogger.flushErrorMsg( msgStruct ); \ } \ } \ } while( false ) diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index 098b846a37d..649c8bdeace 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -59,7 +59,7 @@ TEST( ErrorHandling, testYaml ) if( g_errorLogger.isOutputFileEnabled() ) { - g_errorLogger.flushCurrentErrorMsg( g_errorLogger.currentErrorMsg() ); + g_errorLogger.flushErrorMsg( g_errorLogger.currentErrorMsg() ); } } diff --git a/src/main/main.cpp b/src/main/main.cpp index 31b19471ce0..d9e9b8849fe 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -79,7 +79,7 @@ int main( int argc, char *argv[] ) GEOS_LOG( e.what() ); if( g_errorLogger.isOutputFileEnabled() ) { - g_errorLogger.flushCurrentErrorMsg( g_errorLogger.currentErrorMsg() ); + g_errorLogger.flushErrorMsg( g_errorLogger.currentErrorMsg() ); } LvArray::system::callErrorHandler(); basicCleanup(); From 2e0e39617991c2327eba75adf4c1a080c6bcdc07 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 18 Jun 2025 09:31:26 +0200 Subject: [PATCH 069/173] Change GEOS_LOG() to GEOS_LOG_RANK() --- src/coreComponents/common/logger/ErrorHandling.cpp | 6 +++--- .../dataRepository/unitTests/testErrorHandling.cpp | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 38bbdc37f1c..3e5954c8e13 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -46,7 +46,7 @@ void ErrorLogger::createFile() } else { - GEOS_LOG( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); + GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); } } @@ -236,11 +236,11 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) } yamlFile.flush(); errorMsg = ErrorMsg(); - GEOS_LOG( GEOS_FMT( "The error file {} was appended.", m_filename ) ); + GEOS_LOG_RANK( GEOS_FMT( "The error file {} was appended.", m_filename ) ); } else { - GEOS_LOG( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); + GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); } } diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index 649c8bdeace..5a15a513545 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -15,6 +15,7 @@ #include "common/logger/ErrorHandling.hpp" #include "common/logger/Logger.hpp" #include "dataRepository/DataContext.hpp" +#include "common/initializeEnvironment.hpp" #include @@ -66,7 +67,8 @@ TEST( ErrorHandling, testYaml ) int main( int ac, char * av[] ) { ::testing::InitGoogleTest( &ac, av ); + geos::setupEnvironment( ac, av ); int const result = RUN_ALL_TESTS(); - + geos::cleanupEnvironment(); return result; } From a83a3a130d3efa917b42f109031f4aff964a1e89 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Thu, 19 Jun 2025 14:28:42 +0200 Subject: [PATCH 070/173] initialize the error message line by default --- src/coreComponents/common/logger/ErrorHandling.hpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index d1a6c1edd5c..ed51344c3b2 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -99,9 +99,10 @@ class ErrorLogger MsgType m_type = ErrorLogger::MsgType::Undefined; // the erreur message that can be completed std::string m_msg; - // the source location (file and line corresponding to the error in the code) + // the source location file corresponding to the error in the code std::string m_file; - integer m_line; + // the source location line corresponding to the error in the code (default is 0) + integer m_line = 0; // the rank(s) on which the error occured std::vector< int > m_ranksInfo; // Additional information about the error in the input file From 9fe289a639020af4d9eccd165513e193e47cd981 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Tue, 24 Jun 2025 09:15:07 +0200 Subject: [PATCH 071/173] Doxygen comments --- .../common/logger/ErrorHandling.hpp | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index ed51344c3b2..f7d0b6b19ec 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -64,13 +64,13 @@ class ErrorLogger DataPath }; - // The map contains contextual information about the error - // It could be something like - // "file" = "/path/to/file.xml" - // "line" = "24" - // or something like - // "dataPath" = "/Functions/co2brine_philipsDensityTable - // The key is a field of the Attribute enumeration and is converted to a string for writing in the YAML + /// The map contains contextual information about the error + /// It could be something like + /// "file" = "/path/to/file.xml" + /// "line" = "24" + /// or something like + /// "dataPath" = "/Functions/co2brine_philipsDensityTable + /// The key is a field of the Attribute enumeration and is converted to a string for writing in the YAML map< Attribute, std::string > m_attributes; integer m_priority = 0; @@ -95,19 +95,19 @@ class ErrorLogger */ struct ErrorMsg { - // the error type (Warning, Error or Exception) + /// the error type (Warning, Error or Exception) MsgType m_type = ErrorLogger::MsgType::Undefined; - // the erreur message that can be completed + /// the erreur message that can be completed std::string m_msg; - // the source location file corresponding to the error in the code + /// the source location file corresponding to the error in the code std::string m_file; - // the source location line corresponding to the error in the code (default is 0) + /// the source location line corresponding to the error in the code (default is 0) integer m_line = 0; - // the rank(s) on which the error occured + /// the rank(s) on which the error occured std::vector< int > m_ranksInfo; - // Additional information about the error in the input file + /// Additional information about the error in the input file std::vector< ErrorContext > m_contextsInfo; - // the stack trace + /// the stack trace std::vector< std::string > m_sourceCallStack; /** @@ -232,6 +232,7 @@ class ErrorLogger * @return the string representation of the message type */ static std::string toString( MsgType type ); + /** * @brief Write all the information retrieved about the error/warning message into the YAML file * @param errorMsg a constant reference to the error @@ -239,11 +240,11 @@ class ErrorLogger void flushErrorMsg( ErrorMsg & errorMsg ); private: - // The error constructed via exceptions + /// The error constructed via exceptions ErrorMsg m_currentErrorMsg; - // Indicate whether the write to YAML command line option is enabled + /// Indicate whether the write to YAML command line option is enabled bool m_writeYaml = false; - // YAML file name + /// YAML file name std::string_view m_filename = "errors.yaml"; /** From da7dc824b980b2094df136dbd2006aacd7323de9 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Tue, 24 Jun 2025 09:26:37 +0200 Subject: [PATCH 072/173] Comments added --- src/coreComponents/common/logger/ErrorHandling.hpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index f7d0b6b19ec..3c8654b6a6d 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -128,6 +128,8 @@ class ErrorLogger /** * @brief Add text to the current error msg * @param e the exception containing text to add + * @param toEnd indicates whether to add the message at the beginning (true) or at the end (false) + * default is false * @return the reference to the current instance */ ErrorMsg & addToMsg( std::exception const & e, bool toEnd = false ); @@ -135,6 +137,8 @@ class ErrorLogger /** * @brief Add text to the current error msg * @param msg the text to add + * @param toEnd indicates whether to add the message at the beginning (true) or at the end (false) + * default is false * @return the reference to the current instance */ ErrorMsg & addToMsg( std::string_view msg, bool toEnd = false ); @@ -214,7 +218,8 @@ class ErrorLogger { m_filename = filename; } /** - * @brief Return the error message information at this point + * @brief Gives acces to the error message that is currently being constructed, potencially at various application layers. + * Use flushErrorMsg() when the message is fully constructed and you want it to be output. * @return the reference to the current instance */ ErrorMsg & currentErrorMsg() From 260133ee91c79c1ea32c80a572903ffa23ff1c86 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Tue, 24 Jun 2025 13:56:57 +0200 Subject: [PATCH 073/173] Sort contextual information by decreasing priority --- .../common/logger/ErrorHandling.cpp | 16 +++++++++++----- .../common/logger/ErrorHandling.hpp | 10 ++++++---- .../unitTests/testErrorHandling.cpp | 3 ++- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 3e5954c8e13..f554defb250 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -37,11 +37,11 @@ static constexpr std::string_view g_callStackMessage = ErrorLogger g_errorLogger{}; void ErrorLogger::createFile() -{ +{ std::ofstream yamlFile( std::string( m_filename ), std::ios::out ); if( yamlFile.is_open() ) { - yamlFile << "errors: \n"; + yamlFile << "errors: \n\n"; yamlFile.close(); } else @@ -50,7 +50,7 @@ void ErrorLogger::createFile() } } -std::string ErrorLogger::ErrorContext::attributeToString( ErrorLogger::ErrorContext::Attribute attribute ) +std::string ErrorLogger::ErrorContext::attributeToString( ErrorLogger::ErrorContext::Attribute attribute ) { switch( attribute ) { @@ -71,7 +71,7 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::exception const & { m_msg = e.what() + m_msg; } - return *this; + return *this; } ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addToMsg( std::string_view errorMsg, bool toEnd ) @@ -177,7 +177,7 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) if( yamlFile.is_open() ) { // General errors info (type, rank on which the error occured) - yamlFile << "\n" << g_level1Start << "type: " << g_errorLogger.toString( errorMsg.m_type ) << "\n"; + yamlFile << g_level1Start << "type: " << g_errorLogger.toString( errorMsg.m_type ) << "\n"; yamlFile << g_level1Next << "rank: "; for( auto const & info: errorMsg.m_ranksInfo ) { @@ -189,6 +189,11 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) streamMultilineYamlAttribute( errorMsg.m_msg, yamlFile, g_level2Next ); if( !errorMsg.m_contextsInfo.empty() ) { + // Sort contextual information by decreasing priority + std::sort( errorMsg.m_contextsInfo.begin(), errorMsg.m_contextsInfo.end(), + []( const ErrorLogger::ErrorContext & a, const ErrorLogger::ErrorContext & b ) { + return a.m_priority > b.m_priority; + } ); // Additional informations about the context of the error and priority information of each context yamlFile << g_level1Next << "contexts:\n"; for( ErrorContext const & ctxInfo : errorMsg.m_contextsInfo ) @@ -234,6 +239,7 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) yamlFile << g_level3Start << "frame" << i << ": " << errorMsg.m_sourceCallStack[i] << "\n"; } } + yamlFile << "\n"; yamlFile.flush(); errorMsg = ErrorMsg(); GEOS_LOG_RANK( GEOS_FMT( "The error file {} was appended.", m_filename ) ); diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 3c8654b6a6d..17e20a79970 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -55,7 +55,7 @@ class ErrorLogger /** * @enum Attribute - * Enumeration used to secure potential map keys. + * Enumeration used to secure potential map keys */ enum class Attribute { @@ -218,8 +218,9 @@ class ErrorLogger { m_filename = filename; } /** - * @brief Gives acces to the error message that is currently being constructed, potencially at various application layers. - * Use flushErrorMsg() when the message is fully constructed and you want it to be output. + * @brief Gives acces to the error message that is currently being constructed, + * potencially at various application layers + * Use flushErrorMsg() when the message is fully constructed and you want it to be output * @return the reference to the current instance */ ErrorMsg & currentErrorMsg() @@ -240,6 +241,7 @@ class ErrorLogger /** * @brief Write all the information retrieved about the error/warning message into the YAML file + * and reset the errorMsg instance to its initial state * @param errorMsg a constant reference to the error */ void flushErrorMsg( ErrorMsg & errorMsg ); @@ -255,7 +257,7 @@ class ErrorLogger /** * @brief Write the error message in the YAML file regarding indentation and line break * @param msg the message to write in the YAML - * For the exception type, this message can be added as needed. + * For the exception type, this message can be added as needed */ void streamMultilineYamlAttribute( std::string_view msg, std::ofstream & yamlFile, std::string_view indent ); diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index 5a15a513545..3e0f7c0adff 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -31,6 +31,7 @@ TEST( ErrorHandling, testYaml ) int x = 5; DataFileContext const context = DataFileContext( "Base Test Class", __FILE__, __LINE__ ); + DataFileContext const additionalContext = DataFileContext( "Base Test Class", "/path/to/file.xml", 14 ); if( g_errorLogger.isOutputFileEnabled() ) { @@ -48,7 +49,7 @@ TEST( ErrorHandling, testYaml ) GEOS_THROW_CTX_IF( x == 5, "Group " << context.toString() << " has no wrapper named" << std::endl, std::domain_error, - context ); + context, additionalContext ); } catch( std::domain_error const & ex ) { From e0c876f933a4c88ce665f389c8938925ba220d3c Mon Sep 17 00:00:00 2001 From: amandinehry Date: Tue, 24 Jun 2025 15:35:26 +0200 Subject: [PATCH 074/173] Simplification of the for loop which write context information --- .../common/logger/ErrorHandling.cpp | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index f554defb250..71dda559d91 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -198,27 +198,10 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) yamlFile << g_level1Next << "contexts:\n"; for( ErrorContext const & ctxInfo : errorMsg.m_contextsInfo ) { - bool isFirst = true; + yamlFile << g_level3Start << "priority: " << ctxInfo.m_priority << "\n"; for( auto const & [key, value] : ctxInfo.m_attributes ) { - if( isFirst ) - { - yamlFile << g_level3Start << ErrorContext::attributeToString( key ) << ": " << value << "\n"; - isFirst = false; - } - else - { yamlFile << g_level3Next << ErrorContext::attributeToString( key ) << ": " << value << "\n"; - } - } - if( isFirst ) - { - yamlFile << g_level3Start << "priority: " << ctxInfo.m_priority << "\n"; - isFirst = false; - } - else - { - yamlFile << g_level3Next << "priority: " < Date: Wed, 25 Jun 2025 13:55:06 +0200 Subject: [PATCH 075/173] Changes following comments received on my PR --- .../common/logger/ErrorHandling.cpp | 19 +- src/coreComponents/dataRepository/Macros.hpp | 735 ------------------ src/coreComponents/events/EventBase.cpp | 5 +- src/coreComponents/events/PeriodicEvent.cpp | 8 +- .../FieldSpecificationBase.cpp | 5 +- .../FieldSpecificationBase.hpp | 5 +- .../fileIO/Outputs/TimeHistoryOutput.cpp | 3 +- .../fileIO/timeHistory/PackCollection.cpp | 3 +- .../mainInterface/ProblemManager.cpp | 2 +- .../mainInterface/initialization.cpp | 2 +- .../mesh/ElementRegionManager.hpp | 5 +- .../mesh/generators/InternalMeshGenerator.cpp | 8 +- .../mesh/generators/InternalMeshGenerator.hpp | 12 +- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 7 +- .../fluidFlow/SinglePhaseProppantBase.cpp | 3 +- .../fluidFlow/SourceFluxStatistics.cpp | 3 +- .../multiphysics/PoromechanicsSolver.hpp | 4 +- .../simplePDE/PhaseFieldDamageFEM.cpp | 3 +- .../ElasticFirstOrderWaveEquationSEM.cpp | 5 +- .../isotropic/ElasticWaveEquationSEM.cpp | 5 +- 20 files changed, 64 insertions(+), 778 deletions(-) delete mode 100644 src/coreComponents/dataRepository/Macros.hpp diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 71dda559d91..2695ab70aee 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -19,6 +19,7 @@ #include "ErrorHandling.hpp" #include "common/logger/Logger.hpp" +#include "common/format/StringUtilities.hpp" #include #include @@ -38,15 +39,23 @@ ErrorLogger g_errorLogger{}; void ErrorLogger::createFile() { - std::ofstream yamlFile( std::string( m_filename ), std::ios::out ); - if( yamlFile.is_open() ) + if( stringutilities::endsWith( m_filename, ".yaml") ) { - yamlFile << "errors: \n\n"; - yamlFile.close(); + std::ofstream yamlFile( std::string( m_filename ), std::ios::out ); + if( yamlFile.is_open() ) + { + yamlFile << "errors: \n\n"; + yamlFile.close(); + } + else + { + GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); + } } else { - GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); + enableFileOutput( false ); + GEOS_LOG_RANK( GEOS_FMT( "{} is a bad file name argument. The file must be in yaml format.", m_filename ) ); } } diff --git a/src/coreComponents/dataRepository/Macros.hpp b/src/coreComponents/dataRepository/Macros.hpp deleted file mode 100644 index e5ec9ff05f9..00000000000 --- a/src/coreComponents/dataRepository/Macros.hpp +++ /dev/null @@ -1,735 +0,0 @@ -/* - * Copyright (c) 2021, Lawrence Livermore National Security, LLC and LvArray contributors. - * All rights reserved. - * See the LICENSE file for details. - * SPDX-License-Identifier: (BSD-3-Clause) - */ - -/** - * @file Macros.hpp - * @brief Contains a bunch of macro definitions. - */ - -#pragma once - -// Source includes -#include "LvArrayConfig.hpp" -#include "system.hpp" - -// System includes -#include -#include -#include -#include - - -#if defined(LVARRAY_USE_CUDA) || defined(LVARRAY_USE_HIP) -/// Macro defined when using a device. -#define LVARRAY_USE_DEVICE -#endif - -#if defined(LVARRAY_USE_CUDA) -#define LVARRAY_DEFAULT_DEVICE_SPACE MemorySpace::cuda -#elif defined(LVARRAY_USE_HIP) -#define LVARRAY_DEFAULT_DEVICE_SPACE MemorySpace::hip -#endif - -#if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__) -/// Macro defined when currently compiling on device (only defined in the device context). -#define LVARRAY_DEVICE_COMPILE -/// Marks a function/lambda for inlining -#define LVARRAY_FORCE_INLINE __forceinline__ -#else -/// Marks a function/lambda for inlining -#define LVARRAY_FORCE_INLINE inline -#endif - -#if defined(__CUDACC__) || defined(__HIPCC__) -// Denotes whether to define decorator macros later in this file. -#define LVARRAY_DECORATE -#endif - - -//#if !defined(NDEBUG) && defined(LVARRAY_DEVICE_COMPILE) - #include -//#endif - -/** - * @brief Convert @p A into a string. - * @param A the token to convert to a string. - */ -#define STRINGIZE_NX( A ) #A - -/** - * @brief Convert the macro expansion of @p A into a string. - * @param A the token to convert to a string. - */ -#define STRINGIZE( A ) STRINGIZE_NX( A ) - -/** - * @brief Mark @p X as an unused argument, used to silence compiler warnings. - * @param X the unused argument. - */ -#define LVARRAY_UNUSED_ARG( X ) - -/** - * @brief Mark @p X as an unused variable, used to silence compiler warnings. - * @param X the unused variable. - */ -#define LVARRAY_UNUSED_VARIABLE( X ) ( ( void ) X ) - -/** - * @brief Mark @p X as an debug variable, used to silence compiler warnings. - * @param X the debug variable. - */ -#define LVARRAY_DEBUG_VAR( X ) LVARRAY_UNUSED_VARIABLE( X ) - -/// Expands to a string representing the current file and line. -#define LOCATION __FILE__ ":" STRINGIZE( __LINE__ ) - -/** - * @brief Given an expression @p X that evaluates to a pointer, expands to the type pointed to. - * @param X The expression to evaluate. - */ -#define TYPEOFPTR( X ) std::remove_pointer_t< decltype( X ) > - -/** - * @brief Given an expression @p X that evaluates to a reference, expands to the type referred to. - * @param X The expression to evaluate. - */ -#define TYPEOFREF( X ) std::remove_reference_t< decltype( X ) > - -/** - * @brief Print the expression. - */ -#define LVARRAY_LOG( ... ) std::cout << __VA_ARGS__ << std::endl - -/** - * @brief Print the expression string along with its value. - */ -#define LVARRAY_LOG_VAR( ... ) LVARRAY_LOG( STRINGIZE( __VA_ARGS__ ) << " = " << __VA_ARGS__ ) - -/** - * @brief Abort execution if @p EXP is true. - * @param EXP The expression to check. - * @param MSG The message to associate with the error, can be anything streamable to a std::ostream. - * @note This macro can be used in both host and device code. - * @note Tries to provide as much information about the location of the error - * as possible. On host this should result in the file and line of the error - * and a stack trace along with the provided message. On device none of this is - * guaranteed. In fact it is only guaranteed to abort the current kernel. - */ - -#if defined(LVARRAY_DEVICE_COMPILE) -// #if defined(__HIP_DEVICE_COMPILE__) -// // empty impl to avoid the possibility of printfs in device code -// // on AMD, which can cause performance degradation just by being present -// #define LVARRAY_ERROR_IF( EXP, MSG ) - #if (!defined(NDEBUG)) || defined(__HIP_DEVICE_COMPILE__) -#define LVARRAY_ERROR_IF( EXP, MSG ) \ - do \ - { \ - if( EXP ) \ - { \ - assert( false && "EXP = " STRINGIZE( EXP ) "MSG = " STRINGIZE( MSG ) ); \ - } \ - } while( false ) - #else -#define LVARRAY_ERROR_IF( EXP, MSG ) \ - do \ - { \ - if( EXP ) \ - { \ - constexpr char const * formatString = "***** ERROR\n" \ - "***** LOCATION: " LOCATION "\n" \ - "***** Block: [%u, %u, %u]\n" \ - "***** Thread: [%u, %u, %u]\n" \ - "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n" \ - "***** MSG: " STRINGIZE( MSG ) "\n\n"; \ - printf( formatString, blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z ); \ - asm ( "trap;" ); \ - } \ - } while( false ) - #endif -#else -#define LVARRAY_ERROR_IF( EXP, MSG ) \ - do \ - { \ - if( EXP ) \ - { \ - std::ostringstream __oss; \ - __oss << "***** ERROR\n"; \ - __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << MSG << "\n"; \ - __oss << LvArray::system::stackTrace( true ); \ - std::cout << __oss.str() << std::endl; \ - LvArray::system::callErrorHandler(); \ - } \ - } while( false ) -#endif - -/** - * @brief Abort execution. - * @param MSG The message to associate with the error, can be anything streamable to a std::ostream. - */ -#define LVARRAY_ERROR( MSG ) LVARRAY_ERROR_IF( true, MSG ) - -/** - * @brief Abort execution if @p EXP is false but only when - * NDEBUG is not defined.. - * @param EXP The expression to check. - * @param MSG The message to associate with the error, can be anything streamable to a std::ostream. - * @note This macro can be used in both host and device code. - * @note Tries to provide as much information about the location of the error - * as possible. On host this should result in the file and line of the error - * and a stack trace along with the provided message. On device none of this is - * guaranteed. In fact it is only guaranteed to abort the current kernel. - */ -#if !defined(NDEBUG) -#define LVARRAY_ASSERT_MSG( EXP, MSG ) LVARRAY_ERROR_IF( !(EXP), MSG ) -#else -#define LVARRAY_ASSERT_MSG( EXP, MSG ) ((void) 0) -#endif - -/** - * @brief Conditionally throw an exception. - * @param EXP an expression that will be evaluated as a predicate - * @param MSG a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define LVARRAY_THROW_IF( EXP, MSG, TYPE ) \ - do \ - { \ - if( EXP ) \ - { \ - std::ostringstream __oss; \ - __oss << "\n"; \ - __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << MSG << "\n"; \ - __oss << LvArray::system::stackTrace( true ); \ - throw TYPE( __oss.str() ); \ - } \ - } while( false ) - -/** - * @brief Throw an exception. - * @param MSG The message to associate with the error, can be anything streamable to a std::ostream. - */ -#define LVARRAY_THROW( MSG, TYPE ) LVARRAY_THROW_IF( true, MSG, TYPE ) - -/// Assert @p EXP is true with no message. -#define LVARRAY_ASSERT( EXP ) LVARRAY_ASSERT_MSG( EXP, "" ) - -/** - * @brief Print a warning if @p EXP is true. - * @param EXP The expression to check. - * @param MSG The message to associate with the warning, can be anything streamable to a std::ostream. - */ -#define LVARRAY_WARNING_IF( EXP, MSG ) \ - do \ - { \ - if( EXP ) \ - { \ - std::ostringstream __oss; \ - __oss << "***** WARNING\n"; \ - __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << MSG; \ - std::cout << __oss.str() << std::endl; \ - } \ - } while( false ) - -/** - * @brief Print a warning with a message. - * @param MSG The message to print. - */ -#define LVARRAY_WARNING( MSG ) LVARRAY_WARNING_IF( true, MSG ) - -/** - * @brief Print @p msg along with the location if @p EXP is true. - * @param EXP The expression to test. - * @param MSG The message to print. - */ -#define LVARRAY_INFO_IF( EXP, MSG ) \ - do \ - { \ - if( EXP ) \ - { \ - std::ostringstream __oss; \ - __oss << "***** INFO\n"; \ - __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** Controlling expression: " STRINGIZE( EXP ) "\n"; \ - __oss << MSG; \ - std::cout << __oss.str() << std::endl; \ - } \ - } while( false ) - -/** - * @brief Print @p msg along with the location. - * @param msg The message to print. - */ -#define LVARRAY_INFO( msg ) LVARRAY_INFO_IF( true, msg ) - -/** - * @brief Abort execution if @p lhs @p OP @p rhs. - * @param lhs The left side of the operation. - * @param OP The operation to apply. - * @param NOP The opposite of @p OP, used in the message. - * @param rhs The right side of the operation. - * @param msg The message to diplay. - */ -#define LVARRAY_ERROR_IF_OP_MSG( lhs, OP, NOP, rhs, msg ) \ - LVARRAY_ERROR_IF( lhs OP rhs, \ - msg << "\n" << \ - "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ - " " << #lhs << " = " << lhs << "\n" << \ - " " << #rhs << " = " << rhs << "\n" ) - -/** - * @brief Throw an exception if @p lhs @p OP @p rhs. - * @param lhs The left side of the operation. - * @param OP The operation to apply. - * @param NOP The opposite of @p OP, used in the message. - * @param rhs The right side of the operation. - * @param msg The message to diplay. - * @param TYPE the type of exception to throw. - */ -#define LVARRAY_THROW_IF_OP_MSG( lhs, OP, NOP, rhs, msg, TYPE ) \ - LVARRAY_THROW_IF( lhs OP rhs, \ - msg << "\n" << \ - "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ - " " << #lhs << " = " << lhs << "\n" << \ - " " << #rhs << " = " << rhs << "\n", TYPE ) - -/** - * @brief Raise a hard error if two values are equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define LVARRAY_ERROR_IF_EQ_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_OP_MSG( lhs, ==, !=, rhs, msg ) - -/** - * @brief Throw an exception if two values are equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define LVARRAY_THROW_IF_EQ_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_OP_MSG( lhs, ==, !=, rhs, msg, TYPE ) - -/** - * @brief Raise a hard error if two values are equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define LVARRAY_ERROR_IF_EQ( lhs, rhs ) LVARRAY_ERROR_IF_EQ_MSG( lhs, rhs, "" ) - -/** - * @brief Throw an exception if two values are equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw - */ -#define LVARRAY_THROW_IF_EQ( lhs, rhs, TYPE ) LVARRAY_THROW_IF_EQ_MSG( lhs, rhs, "", TYPE ) - -/** - * @brief Raise a hard error if two values are not equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define LVARRAY_ERROR_IF_NE_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_OP_MSG( lhs, !=, ==, rhs, msg ) - -/** - * @brief Throw an exception if two values are not equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define LVARRAY_THROW_IF_NE_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_OP_MSG( lhs, !=, ==, rhs, msg, TYPE ) - -/** - * @brief Raise a hard error if two values are not equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define LVARRAY_ERROR_IF_NE( lhs, rhs ) LVARRAY_ERROR_IF_NE_MSG( lhs, rhs, "" ) - -/** - * @brief Throw an exception if two values are not equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw - */ -#define LVARRAY_THROW_IF_NE( lhs, rhs, TYPE ) LVARRAY_THROW_IF_NE_MSG( lhs, rhs, "", TYPE ) - -/** - * @brief Raise a hard error if one value compares greater than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define LVARRAY_ERROR_IF_GT_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_OP_MSG( lhs, >, <=, rhs, msg ) - -/** - * @brief Throw an exception if one value compares greater than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define LVARRAY_THROW_IF_GT_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_OP_MSG( lhs, >, <=, rhs, msg, TYPE ) - -/** - * @brief Raise a hard error if one value compares greater than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define LVARRAY_ERROR_IF_GT( lhs, rhs ) LVARRAY_ERROR_IF_GT_MSG( lhs, rhs, "" ) - -/** - * @brief Throw an exception if one value compares greater than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw - */ -#define LVARRAY_THROW_IF_GT( lhs, rhs, TYPE ) LVARRAY_THROW_IF_GT_MSG( lhs, rhs, "", TYPE ) - -/** - * @brief Raise a hard error if one value compares greater than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define LVARRAY_ERROR_IF_GE_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_OP_MSG( lhs, >=, <, rhs, msg ) - -/** - * @brief Throw an exception if one value compares greater than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define LVARRAY_THROW_IF_GE_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_OP_MSG( lhs, >=, <, rhs, msg, TYPE ) - -/** - * @brief Raise a hard error if one value compares greater than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define LVARRAY_ERROR_IF_GE( lhs, rhs ) LVARRAY_ERROR_IF_GE_MSG( lhs, rhs, "" ) - -/** - * @brief Throw an exception if one value compares greater than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw - */ -#define LVARRAY_THROW_IF_GE( lhs, rhs, TYPE ) LVARRAY_THROW_IF_GE_MSG( lhs, rhs, "", TYPE ) - -/** - * @brief Raise a hard error if one value compares less than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define LVARRAY_ERROR_IF_LT_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_OP_MSG( lhs, <, >=, rhs, msg ) - -/** - * @brief Throw an exception if one value compares less than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define LVARRAY_THROW_IF_LT_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_OP_MSG( lhs, <, >=, rhs, msg, TYPE ) - -/** - * @brief Raise a hard error if one value compares less than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define LVARRAY_ERROR_IF_LT( lhs, rhs ) LVARRAY_ERROR_IF_LT_MSG( lhs, rhs, "" ) - -/** - * @brief Throw an exception if one value compares less than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw - */ -#define LVARRAY_THROW_IF_LT( lhs, rhs, TYPE ) LVARRAY_THROW_IF_LT_MSG( lhs, rhs, "", TYPE ) - -/** - * @brief Raise a hard error if one value compares less than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define LVARRAY_ERROR_IF_LE_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_OP_MSG( lhs, <=, >, rhs, msg ) - -/** - * @brief Throw an exception if one value compares less than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define LVARRAY_THROW_IF_LE_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_OP_MSG( lhs, <=, >, rhs, msg, TYPE ) - -/** - * @brief Raise a hard error if one value compares less than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define LVARRAY_ERROR_IF_LE( lhs, rhs ) LVARRAY_ERROR_IF_GE_MSG( lhs, rhs, "" ) - -/** - * @brief Throw an exception if one value compares less than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw - */ -#define LVARRAY_THROW_IF_LE( lhs, rhs, TYPE ) LVARRAY_THROW_IF_GE_MSG( lhs, rhs, "", TYPE ) - -/** - * @brief Abort execution if @p lhs @p OP @p rhs is false. - * @param lhs The left side of the operation. - * @param OP The operation to apply. - * @param rhs The right side of the operation. - * @param msg The message to diplay. - */ -#define LVARRAY_ASSERT_OP_MSG( lhs, OP, rhs, msg ) \ - LVARRAY_ASSERT_MSG( lhs OP rhs, \ - msg << "\n" << \ - " " << #lhs << " = " << lhs << "\n" << \ - " " << #rhs << " = " << rhs << "\n" ) - -/** - * @brief Assert that two values compare equal in debug builds. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define LVARRAY_ASSERT_EQ_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_OP_MSG( lhs, ==, rhs, msg ) - -/** - * @brief Assert that two values compare equal in debug builds. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define LVARRAY_ASSERT_EQ( lhs, rhs ) LVARRAY_ASSERT_EQ_MSG( lhs, rhs, "" ) - -/** - * @brief Assert that two values compare not equal in debug builds. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define LVARRAY_ASSERT_NE_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_OP_MSG( lhs, !=, rhs, msg ) - -/** - * @brief Assert that two values compare not equal in debug builds. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define LVARRAY_ASSERT_NE( lhs, rhs ) LVARRAY_ASSERT_NE_MSG( lhs, rhs, "" ) - -/** - * @brief Assert that one value compares greater than the other in debug builds. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define LVARRAY_ASSERT_GT_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_OP_MSG( lhs, >, rhs, msg ) - -/** - * @brief Assert that one value compares greater than the other in debug builds. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define LVARRAY_ASSERT_GT( lhs, rhs ) LVARRAY_ASSERT_GT_MSG( lhs, rhs, "" ) - -/** - * @brief Assert that one value compares greater than or equal to the other in debug builds. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define LVARRAY_ASSERT_GE_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_OP_MSG( lhs, >=, rhs, msg ) - -/** - * @brief Assert that one value compares greater than or equal to the other in debug builds. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - */ -#define LVARRAY_ASSERT_GE( lhs, rhs ) LVARRAY_ASSERT_GE_MSG( lhs, rhs, "" ) - -#if defined(LVARRAY_DECORATE) -/// Mark a function for both host and device usage. -#define LVARRAY_HOST_DEVICE __host__ __device__ - -#if defined( LVARRAY_USE_HIP ) -/// Mark a function for both host and device usage when using HIP only. -#define LVARRAY_HOST_DEVICE_HIP __host__ __device__ -#else -/// Mark a function for both host and device usage when using HIP only. -#define LVARRAY_HOST_DEVICE_HIP -#endif - -/// Mark a function for only device usage. -#define LVARRAY_DEVICE __device__ - -/** - * @brief Disable host device warnings. - * @details This pragma disables nvcc warnings about calling a host function from a host-device - * function. This is used on templated host-device functions where some template instantiations - * call host only code. This is safe as long as the host only instantiations are only called on - * the host. To use place directly above a the template. - */ -#if defined(LVARRAY_USE_CUDA) -#define DISABLE_HD_WARNING _Pragma("hd_warning_disable") -#else -#define DISABLE_HD_WARNING -#endif -#else -/// Mark a function for both host and device usage. -#define LVARRAY_HOST_DEVICE -/// Mark a function for both host and device usage when using HIP only. -#define LVARRAY_HOST_DEVICE_HIP - -/// Mark a function for only device usage. -#define LVARRAY_DEVICE - -/** - * @brief Disable host device warnings. - * @details This pragma disables nvcc warnings about calling a host function from a host-device - * function. This is used on templated host-device functions where some template instantiations - * call host only code. This is safe as long as the host only instantiations are only called on - * the host. To use place directly above a the template. - */ -#define DISABLE_HD_WARNING -#endif - - -#if defined(__clang__) -#define LVARRAY_RESTRICT __restrict__ -#define LVARRAY_RESTRICT_REF __restrict__ -#define LVARRAY_INTEL_CONSTEXPR constexpr -#elif defined(__GNUC__) - #if defined(__INTEL_COMPILER) -#define LVARRAY_RESTRICT __restrict__ -#define LVARRAY_RESTRICT_REF __restrict__ -#define LVARRAY_INTEL_CONSTEXPR - #else -#define LVARRAY_RESTRICT __restrict__ -#define LVARRAY_RESTRICT_REF __restrict__ -#define LVARRAY_INTEL_CONSTEXPR constexpr - #endif -#endif - -#if !defined(LVARRAY_BOUNDS_CHECK) -/** - * @brief Expands to constexpr when array bound checking is disabled. - */ -#define CONSTEXPR_WITHOUT_BOUNDS_CHECK constexpr -#else -/** - * @brief Expands to constexpr when array bound checking is disabled. - */ -#define CONSTEXPR_WITHOUT_BOUNDS_CHECK -#endif - -#if defined(NDEBUG) -/** - * @brief Expands to constexpr in release builds (when NDEBUG is defined). - */ -#define CONSTEXPR_WITH_NDEBUG constexpr -#else -/** - * @brief Expands to constexpr in release builds (when NDEBUG is defined). - */ -#define CONSTEXPR_WITH_NDEBUG -#endif - -#if !defined(LVARRAY_BOUNDS_CHECK) -/** - * @brief Expands to constexpr when array bound checking is disabled. - */ -#define CONSTEXPR_WITHOUT_BOUNDS_CHECK constexpr -#else -/** - * @brief Expands to constexpr when array bound checking is disabled. - */ -#define CONSTEXPR_WITHOUT_BOUNDS_CHECK -#endif - -#if defined(NDEBUG) -/** - * @brief Expands to constexpr in release builds (when NDEBUG is defined). - */ -#define CONSTEXPR_WITH_NDEBUG constexpr -#else -/** - * @brief Expands to constexpr in release builds (when NDEBUG is defined). - */ -#define CONSTEXPR_WITH_NDEBUG -#endif - -// TPL includes -#include - -template< typename > -struct RAJAHelper -{}; - -using serialPolicy = RAJA::seq_exec; - -template<> -struct RAJAHelper< serialPolicy > -{ - using ReducePolicy = RAJA::seq_reduce; - using AtomicPolicy = RAJA::seq_atomic; -}; - -#if defined(RAJA_ENABLE_OPENMP) - -using parallelHostPolicy = RAJA::omp_parallel_for_exec; - -template<> -struct RAJAHelper< parallelHostPolicy > -{ - using ReducePolicy = RAJA::omp_reduce; - using AtomicPolicy = RAJA::omp_atomic; -}; - -#endif - -#if defined(LVARRAY_USE_CUDA) - -template< unsigned long THREADS_PER_BLOCK > -using parallelDevicePolicy = RAJA::cuda_exec< THREADS_PER_BLOCK >; - -template< unsigned long N > -struct RAJAHelper< RAJA::cuda_exec< N > > -{ - using ReducePolicy = RAJA::cuda_reduce; - using AtomicPolicy = RAJA::cuda_atomic; -}; - -#elif defined(LVARRAY_USE_HIP) - -template< unsigned long THREADS_PER_BLOCK > -using parallelDevicePolicy = RAJA::hip_exec< THREADS_PER_BLOCK >; - -template< unsigned long N > -struct RAJAHelper< RAJA::hip_exec< N > > -{ - using ReducePolicy = RAJA::hip_reduce; - using AtomicPolicy = RAJA::hip_atomic; -}; - -#endif diff --git a/src/coreComponents/events/EventBase.cpp b/src/coreComponents/events/EventBase.cpp index a26b85f0594..0cc634a8a8e 100644 --- a/src/coreComponents/events/EventBase.cpp +++ b/src/coreComponents/events/EventBase.cpp @@ -154,10 +154,11 @@ void EventBase::getTargetReferences() catch( std::exception const & e ) { string const errorMsg = GEOS_FMT( "Error while reading {}:\n", - getWrapperDataContext( viewKeyStruct::eventTargetString() ) ); + getWrapperDataContext( viewKeyStruct::eventTargetString() ) ); g_errorLogger.currentErrorMsg() .addToMsg( errorMsg ) - .addContextInfo( getWrapperDataContext( viewKeyStruct::eventTargetString() ).getContextInfo().setPriority( 1 ) ); + .addContextInfo( getWrapperDataContext( viewKeyStruct::eventTargetString() ).getContextInfo() + .setPriority( 1 ) ); throw InputError( e, errorMsg ); } } diff --git a/src/coreComponents/events/PeriodicEvent.cpp b/src/coreComponents/events/PeriodicEvent.cpp index f8e5350ca95..1fb2e3964e8 100644 --- a/src/coreComponents/events/PeriodicEvent.cpp +++ b/src/coreComponents/events/PeriodicEvent.cpp @@ -267,16 +267,16 @@ void PeriodicEvent::validate() const return; } - GEOS_THROW_CTX_IF( m_timeFrequency > 0 && - target->getTimesteppingBehavior() == ExecutableGroup::TimesteppingBehavior::DeterminesTimeStepSize, + constexpr auto determinesTimeStepSize = ExecutableGroup::TimesteppingBehavior::DeterminesTimeStepSize; + + GEOS_THROW_CTX_IF( m_timeFrequency > 0 && target->getTimesteppingBehavior() == determinesTimeStepSize, GEOS_FMT( "`{}`: This event targets an object that automatically selects the time " "step size. Therefore, `{}` cannot be used here. However, forcing a " "constant time step size can still be achived with `{}`.", getDataContext(), viewKeyStruct::timeFrequencyString(), EventBase::viewKeyStruct::forceDtString() ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_cycleFrequency != 1 && - target->getTimesteppingBehavior() == ExecutableGroup::TimesteppingBehavior::DeterminesTimeStepSize, + GEOS_THROW_CTX_IF( m_cycleFrequency != 1 && target->getTimesteppingBehavior() == determinesTimeStepSize, GEOS_FMT( "`{}`: This event targets an object that automatically selects the time " "step size. Therefore, `{}` cannot be used here. However, forcing a " "constant time step size can still be achived with `{}`.", diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp b/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp index 5ca9767658b..13c1f30dafe 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp @@ -112,8 +112,9 @@ void FieldSpecificationBase::setMeshObjectPath( Group const & meshBodies ) { g_errorLogger.currentErrorMsg() .addToMsg( getWrapperDataContext( viewKeyStruct::objectPathString() ).toString() + - " is a wrong objectPath: " + m_objectPath + "\n" ) - .addContextInfo( getWrapperDataContext( viewKeyStruct::objectPathString() ).getContextInfo().setPriority( 2 ) ); + " is a wrong objectPath: " + m_objectPath + "\n" ) + .addContextInfo( getWrapperDataContext( viewKeyStruct::objectPathString() ).getContextInfo() + .setPriority( 2 ) ); throw InputError( e, getWrapperDataContext( viewKeyStruct::objectPathString() ).toString() + " is a wrong objectPath: " + m_objectPath + "\n" ); } diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp index 6b9bb48d48e..1682563191d 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp @@ -623,10 +623,11 @@ void FieldSpecificationBase::applyFieldValueKernel( ArrayView< T, N, USD > const catch( std::exception const & e ) { string const errorMsg = GEOS_FMT( "Error while reading {}:\n", - getWrapperDataContext( viewKeyStruct::functionNameString() ) ); + getWrapperDataContext( viewKeyStruct::functionNameString() ) ); g_errorLogger.currentErrorMsg() .addToMsg( errorMsg ) - .addContextInfo( getWrapperDataContext( viewKeyStruct::functionNameString() ).getContextInfo().setPriority( 1 ) ); + .addContextInfo( getWrapperDataContext( viewKeyStruct::functionNameString() ).getContextInfo() + .setPriority( 1 ) ); throw InputError( e, errorMsg ); } }(); diff --git a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp index a8ffea4b822..0faa31303a9 100644 --- a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp @@ -162,7 +162,8 @@ void TimeHistoryOutput::initializePostInitialConditionsPostSubGroups() getWrapperDataContext( viewKeys::timeHistoryOutputTargetString() ) ); g_errorLogger.currentErrorMsg() .addToMsg( errorMsg ) - .addContextInfo( getWrapperDataContext( viewKeys::timeHistoryOutputTargetString() ).getContextInfo().setPriority( 1 ) ); + .addContextInfo( getWrapperDataContext( viewKeys::timeHistoryOutputTargetString() ).getContextInfo() + .setPriority( 1 ) ); throw InputError( e, errorMsg ); } } diff --git a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp index 1c248d06460..080749caf2e 100644 --- a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp +++ b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp @@ -156,7 +156,8 @@ void PackCollection::updateSetsIndices( DomainPartition const & domain ) g_errorLogger.currentErrorMsg() .addToMsg( getWrapperDataContext( viewKeysStruct::fieldNameString() ).toString() + ": Target not found !\n" ) - .addContextInfo( getWrapperDataContext( viewKeysStruct::fieldNameString() ).getContextInfo().setPriority( 1 ) ); + .addContextInfo( getWrapperDataContext( viewKeysStruct::fieldNameString() ).getContextInfo() + .setPriority( 1 ) ); throw InputError( e, getWrapperDataContext( viewKeysStruct::fieldNameString() ).toString() + ": Target not found !\n" ); } diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index 92e12edf905..1eb4301c9c3 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -502,7 +502,7 @@ void ProblemManager::parseXMLDocument( xmlWrapper::xmlDocument & xmlDocument ) regionName, regionNodePos.toString() ); g_errorLogger.currentErrorMsg() .addToMsg( errorMsg ) - .addContextInfo( getDataContext().getContextInfo().setPriority( 1 ) ); + .addContextInfo( getDataContext().getContextInfo().setPriority( -1 ) ); throw InputError( e, errorMsg ); } } diff --git a/src/coreComponents/mainInterface/initialization.cpp b/src/coreComponents/mainInterface/initialization.cpp index c6d0cd33c64..b324c944790 100644 --- a/src/coreComponents/mainInterface/initialization.cpp +++ b/src/coreComponents/mainInterface/initialization.cpp @@ -125,7 +125,7 @@ std::unique_ptr< CommandLineOptions > parseCommandLineOptions( int argc, char * { TRACE_DATA_MIGRATION, 0, "", "trace-data-migration", Arg::None, "\t--trace-data-migration, \t Trace host-device data migration" }, { MEMORY_USAGE, 0, "m", "memory-usage", Arg::nonEmpty, "\t-m, --memory-usage, \t Minimum threshold for printing out memory allocations in a member of the data repository." }, { PAUSE_FOR, 0, "", "pause-for", Arg::numeric, "\t--pause-for, \t Pause geosx for a given number of seconds before starting execution" }, - { ERRORSOUTPUT, 0, "e", "errorsOutput", Arg::Optional, "\t-e, --errors-output, \t Output path for the errors file" }, + { ERRORSOUTPUT, 0, "e", "errorsOutput", Arg::Optional, "\t-e, --errors-output, \t Output path for the errors file (\".yaml\" supported)" }, { 0, 0, nullptr, nullptr, nullptr, nullptr } }; diff --git a/src/coreComponents/mesh/ElementRegionManager.hpp b/src/coreComponents/mesh/ElementRegionManager.hpp index b1b418b4e01..1ca8880b49b 100644 --- a/src/coreComponents/mesh/ElementRegionManager.hpp +++ b/src/coreComponents/mesh/ElementRegionManager.hpp @@ -1513,7 +1513,8 @@ ElementRegionManager::constructMaterialViewAccessor( string const & viewName, GEOS_ERROR_CTX_IF( !allowMissingViews, subRegion.getDataContext() << ": Material " << constitutiveRelation.getDataContext() << - " does not contain " << viewName, subRegion.getDataContext() ); + " does not contain " << viewName, + subRegion.getDataContext(), constitutiveRelation.getDataContext() ); } } ); } @@ -1562,7 +1563,7 @@ ElementRegionManager::constructMaterialViewAccessor( string const & viewName, { GEOS_ERROR_CTX_IF( !allowMissingViews, region.getDataContext() << ": Material " << materialName << " does not contain " << viewName, - subRegion.getDataContext() ); + region.getDataContext(), subRegion.getDataContext() ); } } ); } diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp index 86215cbd01a..04441455669 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp @@ -182,12 +182,12 @@ void InternalMeshGenerator::postInputInitialization() } catch( InputError const & e ) { WrapperBase const & wrapper = getWrapperBase( viewKeyStruct::elementTypesString() ); + std::string const msg = GEOS_FMT( "InternalMesh {}, element index = {}: ", + wrapper.getDataContext().toString(), std::to_string( i ) ); g_errorLogger.currentErrorMsg() - .addToMsg( "InternalMesh " + wrapper.getDataContext().toString() + - ", element index = " + std::to_string( i ) + ": " ) + .addToMsg( msg ) .addContextInfo( wrapper.getDataContext().getContextInfo().setPriority( 2 ) ); - throw InputError( e, "InternalMesh " + wrapper.getDataContext().toString() + - ", element index = " + std::to_string( i ) + ": " ); + throw InputError( e, msg ); } } diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp index 6c29620d346..e453d56c4ac 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp @@ -346,14 +346,14 @@ class InternalMeshGenerator : public MeshGeneratorBase // Verify that the bias is non-zero and applied to more than one block: if( ( !isZero( m_nElemBias[i][block] ) ) && (m_nElems[i][block]>1)) { + dataRepository::DataContext const & wrapperContext = + getWrapperDataContext( i == 0 ? viewKeyStruct::xBiasString() : + i == 1 ? viewKeyStruct::yBiasString() : + viewKeyStruct::zBiasString() ); GEOS_ERROR_CTX_IF( fabs( m_nElemBias[i][block] ) >= 1, - getWrapperDataContext( i == 0 ? viewKeyStruct::xBiasString() : - i == 1 ? viewKeyStruct::yBiasString() : - viewKeyStruct::zBiasString() ) << + wrapperContext << ", block index = " << block << " : Mesh bias must between -1 and 1!", - getWrapperDataContext( i == 0 ? viewKeyStruct::xBiasString() : - i == 1 ? viewKeyStruct::yBiasString() : - viewKeyStruct::zBiasString() ) ); + wrapperContext ); real64 len = max - min; real64 xmean = len / m_nElems[i][block]; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 51e4e7ea988..57e76645e3a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -210,9 +210,10 @@ void CompositionalMultiphaseFVM::initializePreSubGroups() NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager(); FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); FluxApproximationBase const & fluxApprox = fvManager.getFluxApproximation( m_discretizationName ); - GEOS_ERROR_IF( fluxApprox.upwindingParams().upwindingScheme == UpwindingScheme::HU2PH && m_numPhases != 2, - GEOS_FMT( "{}: upwinding scheme {} only supports 2-phase flow", - getName(), EnumStrings< UpwindingScheme >::toString( UpwindingScheme::HU2PH ))); + GEOS_ERROR_CTX_IF( fluxApprox.upwindingParams().upwindingScheme == UpwindingScheme::HU2PH && m_numPhases != 2, + GEOS_FMT( "{}: upwinding scheme {} only supports 2-phase flow", getDataContext(), + EnumStrings< UpwindingScheme >::toString( UpwindingScheme::HU2PH )), + getDataContext() ); } void CompositionalMultiphaseFVM::setupDofs( DomainPartition const & domain, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp index c925bf3847b..6067dd0f973 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp @@ -70,7 +70,8 @@ void SinglePhaseProppantBase::setConstitutiveNames( ElementSubRegionBase & subRe fluidMaterialName = PhysicsSolverBase::getConstitutiveName< SlurryFluidBase >( subRegion ); GEOS_ERROR_CTX_IF( fluidMaterialName.empty(), GEOS_FMT( "{}: Fluid model not found on subregion {}", - getDataContext(), subRegion.getName() ), getDataContext() ); + getDataContext(), subRegion.getName() ), + getDataContext(), subRegion.getDataContext() ); } void SinglePhaseProppantBase::validateConstitutiveModels( DomainPartition & domain ) const diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp index 0c10ddd1d9f..f67f7d3e409 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp @@ -61,7 +61,8 @@ void SourceFluxStatsAggregator::postInputInitialization() GEOS_WARNING_CTX_IF( m_fluxNames.empty(), GEOS_FMT( "{}: No {} was found in {}.", getDataContext(), SourceFluxBoundaryCondition::catalogName(), - fsManager.getDataContext() ), getDataContext() ); + fsManager.getDataContext() ), + getDataContext(), fsManager.getDataContext() ); } else { diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index e404503c772..3644219533c 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -131,7 +131,7 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER GEOS_ERROR_CTX_IF( hydraulicApertureModelName.empty(), GEOS_FMT( "{}: HydraulicApertureBase model not found on subregion {}", this->getDataContext(), subRegion.getDataContext() ), - this->getDataContext() ); + this->getDataContext(), subRegion.getDataContext() ); } } @@ -161,7 +161,7 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER GEOS_THROW_CTX_IF( porousName.empty(), GEOS_FMT( "{} {} : Solid model not found on subregion {}", this->getCatalogName(), this->getDataContext().toString(), subRegion.getName() ), - InputError, this->getDataContext() ); + InputError, this->getDataContext(), subRegion.getDataContext() ); string & porosityModelName = subRegion.getReference< string >( constitutive::CoupledSolidBase::viewKeyStruct::porosityModelNameString() ); porosityModelName = this->template getConstitutiveName< constitutive::PorosityBase >( subRegion ); diff --git a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp index 4fe607ba2dd..8253358b52f 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp @@ -127,7 +127,8 @@ void PhaseFieldDamageFEM::registerDataOnMesh( Group & meshBodies ) solidMaterialName = PhysicsSolverBase::getConstitutiveName< SolidBase >( subRegion ); GEOS_ERROR_CTX_IF( solidMaterialName.empty(), GEOS_FMT( "{}: SolidBase model not found on subregion {}", - getDataContext(), subRegion.getName() ), getDataContext() ); + getDataContext(), subRegion.getName() ), + getDataContext(), subRegion.getDataContext() ); } ); } ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp index cf421e50595..ddfc0b91bbb 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp @@ -241,8 +241,9 @@ void ElasticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLeve { GEOS_THROW_CTX_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, - getDataContext() << ": Invalid type of element, the elastic solver is designed for hexahedral meshes only (C3D8) ", - InputError, getDataContext() ); + getDataContext() << ": Invalid type of element, the elastic solver is designed for hexahedral meshes only (C3D8) ", + InputError, getDataContext(), + elementSubRegion.getDataContext().getContextInfo().setPriority( -1 ) ); arrayView2d< localIndex const > const elemsToFaces = elementSubRegion.faceList(); arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes = elementSubRegion.nodeList(); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index a1f15de009e..f52a9940f99 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -262,8 +262,9 @@ void ElasticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseMe { GEOS_THROW_CTX_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, - getDataContext() << ": Invalid type of element, the elastic solver is designed for hexahedral meshes only (C3D8) ", - InputError, getDataContext() ); + getDataContext() << ": Invalid type of element, the elastic solver is designed for hexahedral meshes only (C3D8) ", + InputError, getDataContext(), + elementSubRegion.getDataContext().getContextInfo().setPriority( -1 ) ); arrayView2d< localIndex const > const elemsToFaces = elementSubRegion.faceList(); arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes = elementSubRegion.nodeList(); From 4811b6cf742730517c530b9464080fa9e7dde6fe Mon Sep 17 00:00:00 2001 From: amandinehry Date: Wed, 25 Jun 2025 16:37:56 +0200 Subject: [PATCH 076/173] Unit test implemented --- .../unitTests/testErrorHandling.cpp | 183 +++++++++++++++++- 1 file changed, 179 insertions(+), 4 deletions(-) diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index 3e0f7c0adff..ee828230751 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -18,20 +18,173 @@ #include "common/initializeEnvironment.hpp" #include +#include using namespace geos; using namespace dataRepository; +static constexpr std::string_view filename = "errorsOutput.yaml"; + +namespace fs = std::filesystem; + +void removeFile() +{ + if( fs::exists( filename ) ) + { + fs::remove( filename ); + } +} + + +std::string readFile( std::optional< size_t > startLine = std::nullopt, + std::optional< size_t > endLine = std::nullopt ) +{ + if( !fs::exists( filename )) + { + throw std::runtime_error( "File not found: " + std::string( filename ) ); + } + + std::ifstream file{ std::string( filename ) }; + if( !file.is_open()) + { + throw std::runtime_error( "Failed to open file: " + std::string( filename ) ); + } + + std::stringstream buffer; + std::string line; + size_t currentLine = 0; + + while( std::getline( file, line )) + { + if((!startLine || currentLine >= *startLine) && + (!endLine || currentLine < *endLine)) + { + buffer << line << '\n'; + } + currentLine++; + } + + return buffer.str(); +} + +static constexpr std::array< std::string_view, 5 > expectedFileBits = { + R"(errors: + + - type: Warning + rank: 0 + message: >- + Conflicting pressure boundary conditions + sourceLocation: + file: )", + R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp + line: 194 + sourceCallStack: + - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) + - frame1: testing::Test::Run() + - frame2: testing::TestInfo::Run() + - frame3: testing::TestSuite::Run() + - frame4: testing::internal::UnitTestImpl::RunAllTests() + - frame5: testing::UnitTest::Run() + - frame6: main + - frame7: __libc_start_main + - frame8: _start + + - type: Warning + rank: 0 + message: >- + Pressure value is too small. + sourceLocation: + file: )", + R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp + line: 195 + sourceCallStack: + - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) + - frame1: testing::Test::Run() + - frame2: testing::TestInfo::Run() + - frame3: testing::TestSuite::Run() + - frame4: testing::internal::UnitTestImpl::RunAllTests() + - frame5: testing::UnitTest::Run() + - frame6: main + - frame7: __libc_start_main + - frame8: _start + + - type: Warning + rank: 0 + message: >- + Base Test Class (file.xml, l.23): option should be between 1e-06 and 0.001. A value of 1e-06 will be used. + contexts: + - priority: 0 + inputFile: /path/to/file.xml + inputLine: 23 + - priority: 0 + inputFile: /path/to/file.xml + inputLine: 12 + sourceLocation: + file: )", + R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp + line: 196 + sourceCallStack: + - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) + - frame1: testing::Test::Run() + - frame2: testing::TestInfo::Run() + - frame3: testing::TestSuite::Run() + - frame4: testing::internal::UnitTestImpl::RunAllTests() + - frame5: testing::UnitTest::Run() + - frame6: main + - frame7: __libc_start_main + - frame8: _start + + - type: Exception + rank: 0 + message: >- + Table input error. + Group Base Test Class (file.xml, l.23) has no wrapper named + contexts: + - priority: 2 + inputFile: /path/to/file.xml + inputLine: 23 + - priority: 0 + inputFile: /path/to/file.xml + inputLine: 23 + - priority: 0 + inputFile: /path/to/file.xml + inputLine: 12 + sourceLocation: + file: )", + R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp + line: 202 + sourceCallStack: + - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) + - frame1: testing::Test::Run() + - frame2: testing::TestInfo::Run() + - frame3: testing::TestSuite::Run() + - frame4: testing::internal::UnitTestImpl::RunAllTests() + - frame5: testing::UnitTest::Run() + - frame6: main + - frame7: __libc_start_main + - frame8: _start +)" }; + +static constexpr std::string_view exceptionFormat = + R"( message: >- + Table input error. + Group Base Test Class (file.xml, l.23) has no wrapper named + contexts: + - priority: 2 + inputFile: /path/to/file.xml + inputLine: 23 +)"; + TEST( ErrorHandling, testYaml ) { - g_errorLogger.setOutputFilename( "errorsOutput.yaml" ); + g_errorLogger.setOutputFilename( filename ); g_errorLogger.enableFileOutput( true ); double minPrecision = 1e-6; double maxPrecision = 1e-3; int x = 5; - DataFileContext const context = DataFileContext( "Base Test Class", __FILE__, __LINE__ ); - DataFileContext const additionalContext = DataFileContext( "Base Test Class", "/path/to/file.xml", 14 ); + DataFileContext const context = DataFileContext( "Base Test Class", "/path/to/file.xml", 23 ); + DataFileContext const additionalContext = DataFileContext( "Additional Test Class", "/path/to/file.xml", 12 ); if( g_errorLogger.isOutputFileEnabled() ) { @@ -43,7 +196,7 @@ TEST( ErrorHandling, testYaml ) GEOS_WARNING_CTX_IF( x == 5, GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", context.toString(), minPrecision, maxPrecision, minPrecision ), - context ); + context, additionalContext ); try { GEOS_THROW_CTX_IF( x == 5, @@ -63,10 +216,32 @@ TEST( ErrorHandling, testYaml ) { g_errorLogger.flushErrorMsg( g_errorLogger.currentErrorMsg() ); } + + std::string fileContent = readFile(); + + for( size_t i = 0; i < expectedFileBits.size(); ++i ) + { + auto it = fileContent.find( expectedFileBits[i] ); + EXPECT_NE( it, std::string::npos ) << "Expected bit not found: " << expectedFileBits[i]; + } + + std::string additionalExceptionInformation = readFile( 65, 72 ); + EXPECT_EQ( additionalExceptionInformation, exceptionFormat ); + + EXPECT_EXIT( GEOS_ERROR_CTX_IF( x == 5, + GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", + context.toString(), minPrecision, maxPrecision, minPrecision ), + context, additionalContext ), + ::testing::ExitedWithCode( 1 ), + ".*" ); + + g_errorLogger = ErrorLogger{}; + removeFile(); } int main( int ac, char * av[] ) { + ::testing::GTEST_FLAG( death_test_style ) = "threadsafe"; ::testing::InitGoogleTest( &ac, av ); geos::setupEnvironment( ac, av ); int const result = RUN_ALL_TESTS(); From 4a8ea5bbe0699d03da0a8f65d008858ca22664a4 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Fri, 4 Jul 2025 15:10:04 +0200 Subject: [PATCH 077/173] evaluate MSG only one time in macros --- .../common/logger/ErrorHandling.cpp | 1 - src/coreComponents/common/logger/Logger.hpp | 58 ++++++++++--------- .../unitTests/testErrorHandling.cpp | 11 ++-- src/coreComponents/events/EventBase.cpp | 1 - 4 files changed, 36 insertions(+), 35 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 2695ab70aee..f59643b1305 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -239,7 +239,6 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) else { GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); - } } diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 0763390b87e..7f507f86f3a 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -142,20 +142,21 @@ { \ if( EXP ) \ { \ + std::ostringstream __msgoss; \ + __msgoss << MSG; \ + std::string message = __msgoss.str(); \ std::ostringstream __oss; \ __oss << "***** ERROR\n"; \ __oss << "***** LOCATION: " LOCATION "\n"; \ __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << MSG << "\n"; \ + __oss << message << "\n"; \ std::string stackHistory = LvArray::system::stackTrace( true ); \ __oss << stackHistory; \ std::cout << __oss.str() << std::endl; \ - std::ostringstream __msgoss; \ - __msgoss << MSG; \ if( g_errorLogger.isOutputFileEnabled() ) \ { \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ - __msgoss.str(), \ + message, \ __FILE__, \ __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ @@ -177,20 +178,21 @@ { \ if( EXP ) \ { \ + std::ostringstream __msgoss; \ + __msgoss << MSG; \ + std::string message = __msgoss.str(); \ std::ostringstream __oss; \ __oss << "***** ERROR\n"; \ __oss << "***** LOCATION: " LOCATION "\n"; \ __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << MSG << "\n"; \ + __oss << message << "\n"; \ std::string stackHistory = LvArray::system::stackTrace( true ); \ __oss << stackHistory; \ std::cout << __oss.str() << std::endl; \ - std::ostringstream __msgoss; \ - __msgoss << MSG; \ if( g_errorLogger.isOutputFileEnabled() ) \ { \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ - __msgoss.str(), \ + message, \ __FILE__, \ __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ @@ -230,23 +232,22 @@ { \ if( EXP ) \ { \ + std::ostringstream __msgoss; \ + __msgoss << MSG; \ + std::string message = __msgoss.str(); \ std::ostringstream __oss; \ __oss << "\n"; \ __oss << "***** LOCATION: " LOCATION "\n"; \ __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << MSG << "\n"; \ + __oss << message << "\n"; \ std::string stackHistory = LvArray::system::stackTrace( true ); \ __oss << stackHistory; \ - std::cout << __oss.str() << std::endl; \ - std::ostringstream __msgoss; \ - __msgoss << MSG; \ - std::string msg = __msgoss.str(); \ if( g_errorLogger.isOutputFileEnabled() ) \ { \ g_errorLogger.currentErrorMsg() \ .setType( ErrorLogger::MsgType::Exception ) \ .setCodeLocation( __FILE__, __LINE__ ) \ - .addToMsg( msg ) \ + .addToMsg( message ) \ .setRank( ::geos::logger::internal::rank ) \ .addCallStackInfo( stackHistory ); \ } \ @@ -266,23 +267,22 @@ { \ if( EXP ) \ { \ + std::ostringstream __msgoss; \ + __msgoss << MSG; \ + std::string message = __msgoss.str(); \ std::ostringstream __oss; \ __oss << "\n"; \ __oss << "***** LOCATION: " LOCATION "\n"; \ __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << MSG << "\n"; \ + __oss << message << "\n"; \ std::string stackHistory = LvArray::system::stackTrace( true ); \ __oss << stackHistory; \ - std::cout << __oss.str() << std::endl; \ - std::ostringstream __msgoss; \ - __msgoss << MSG; \ - std::string msg = __msgoss.str(); \ if( g_errorLogger.isOutputFileEnabled() ) \ { \ g_errorLogger.currentErrorMsg() \ .setType( ErrorLogger::MsgType::Exception ) \ .setCodeLocation( __FILE__, __LINE__ ) \ - .addToMsg( msg ) \ + .addToMsg( message ) \ .setRank( ::geos::logger::internal::rank ) \ .addCallStackInfo( stackHistory ) \ .addContextInfo( __VA_ARGS__ ); \ @@ -316,18 +316,19 @@ { \ if( EXP ) \ { \ + std::ostringstream __msgoss; \ + __msgoss << MSG; \ + std::string message = __msgoss.str(); \ std::ostringstream __oss; \ __oss << "***** WARNING\n"; \ __oss << "***** LOCATION: " LOCATION "\n"; \ __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << MSG; \ + __oss << message << "\n"; \ std::cout << __oss.str() << std::endl; \ - std::ostringstream __msgoss; \ - __msgoss << MSG; \ if( g_errorLogger.isOutputFileEnabled() ) \ { \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ - __msgoss.str(), \ + message, \ __FILE__, \ __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ @@ -348,18 +349,19 @@ { \ if( EXP ) \ { \ + std::ostringstream __msgoss; \ + __msgoss << MSG; \ + std::string message = __msgoss.str(); \ std::ostringstream __oss; \ __oss << "***** WARNING\n"; \ __oss << "***** LOCATION: " LOCATION "\n"; \ __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << MSG; \ + __oss << message << "\n"; \ std::cout << __oss.str() << std::endl; \ - std::ostringstream __msgoss; \ - __msgoss << MSG; \ if( g_errorLogger.isOutputFileEnabled() ) \ { \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ - __msgoss.str(), \ + message, \ __FILE__, \ __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index ee828230751..9e9ba408625 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -96,7 +96,7 @@ static constexpr std::array< std::string_view, 5 > expectedFileBits = { sourceLocation: file: )", R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp - line: 195 + line: 196 sourceCallStack: - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) - frame1: testing::Test::Run() @@ -122,7 +122,7 @@ static constexpr std::array< std::string_view, 5 > expectedFileBits = { sourceLocation: file: )", R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp - line: 196 + line: 197 sourceCallStack: - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) - frame1: testing::Test::Run() @@ -152,7 +152,7 @@ static constexpr std::array< std::string_view, 5 > expectedFileBits = { sourceLocation: file: )", R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp - line: 202 + line: 203 sourceCallStack: - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) - frame1: testing::Test::Run() @@ -192,6 +192,7 @@ TEST( ErrorHandling, testYaml ) } GEOS_WARNING( "Conflicting pressure boundary conditions" ); + GEOS_WARNING_IF( x == 5, "Pressure value is too small." ); GEOS_WARNING_CTX_IF( x == 5, GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", @@ -229,8 +230,8 @@ TEST( ErrorHandling, testYaml ) EXPECT_EQ( additionalExceptionInformation, exceptionFormat ); EXPECT_EXIT( GEOS_ERROR_CTX_IF( x == 5, - GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", - context.toString(), minPrecision, maxPrecision, minPrecision ), + GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.PID {}", + context.toString(), minPrecision, maxPrecision, minPrecision, getpid() ), context, additionalContext ), ::testing::ExitedWithCode( 1 ), ".*" ); diff --git a/src/coreComponents/events/EventBase.cpp b/src/coreComponents/events/EventBase.cpp index 0cc634a8a8e..b0fdfc2cbaa 100644 --- a/src/coreComponents/events/EventBase.cpp +++ b/src/coreComponents/events/EventBase.cpp @@ -19,7 +19,6 @@ #include "EventBase.hpp" #include - #include "events/LogLevelsInfo.hpp" #include "common/DataTypes.hpp" #include "common/TimingMacros.hpp" From 7fc0ced2f58761291efe57d62b83d07d9aeed7fd Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Mon, 21 Jul 2025 16:58:04 +0200 Subject: [PATCH 078/173] =?UTF-8?q?=F0=9F=94=8A=20warn=20the=20deveveloppe?= =?UTF-8?q?rs=20that=20a=20yamlFile=20should=20not=20be=20written=20if=20n?= =?UTF-8?q?ot=20created=20first?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/ErrorHandling.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index f59643b1305..141c853e45f 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -183,7 +183,7 @@ void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstr void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) { std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); - if( yamlFile.is_open() ) + if( yamlFile.is_open() && g_errorLogger.isOutputFileEnabled() ) { // General errors info (type, rank on which the error occured) yamlFile << g_level1Start << "type: " << g_errorLogger.toString( errorMsg.m_type ) << "\n"; @@ -238,7 +238,8 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) } else { - GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); + GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing.\n- Error file: {}\n- Error file enabled = {}).\n", + m_filename, g_errorLogger.isOutputFileEnabled() ) ); } } From 35f7686be59eb2e0b29f1dd0fd2f93b6701728b6 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Wed, 23 Jul 2025 17:24:50 +0200 Subject: [PATCH 079/173] =?UTF-8?q?=F0=9F=90=9B=20=E2=8F=AA=20set=20the=20?= =?UTF-8?q?--errorsOutput=20mandatory=20because=20of=20bug=20+=20revert=20?= =?UTF-8?q?optionparser.h=20modifications=20since=20no=20longer=20useful?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/mainInterface/initialization.cpp | 2 +- src/thirdparty/optionparser/src/optionparser.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coreComponents/mainInterface/initialization.cpp b/src/coreComponents/mainInterface/initialization.cpp index b324c944790..0b49f9fc243 100644 --- a/src/coreComponents/mainInterface/initialization.cpp +++ b/src/coreComponents/mainInterface/initialization.cpp @@ -125,7 +125,7 @@ std::unique_ptr< CommandLineOptions > parseCommandLineOptions( int argc, char * { TRACE_DATA_MIGRATION, 0, "", "trace-data-migration", Arg::None, "\t--trace-data-migration, \t Trace host-device data migration" }, { MEMORY_USAGE, 0, "m", "memory-usage", Arg::nonEmpty, "\t-m, --memory-usage, \t Minimum threshold for printing out memory allocations in a member of the data repository." }, { PAUSE_FOR, 0, "", "pause-for", Arg::numeric, "\t--pause-for, \t Pause geosx for a given number of seconds before starting execution" }, - { ERRORSOUTPUT, 0, "e", "errorsOutput", Arg::Optional, "\t-e, --errors-output, \t Output path for the errors file (\".yaml\" supported)" }, + { ERRORSOUTPUT, 0, "e", "errorsOutput", Arg::nonEmpty, "\t-e, --errors-output, \t Output path for the errors file (\".yaml\" supported)" }, { 0, 0, nullptr, nullptr, nullptr, nullptr } }; diff --git a/src/thirdparty/optionparser/src/optionparser.h b/src/thirdparty/optionparser/src/optionparser.h index a9c80ccc14d..ff46eab17a1 100644 --- a/src/thirdparty/optionparser/src/optionparser.h +++ b/src/thirdparty/optionparser/src/optionparser.h @@ -903,10 +903,10 @@ struct Arg return ARG_NONE; } - //! @brief Returns ARG_OK if there is an argument and ARG_IGNORE otherwise. + //! @brief Returns ARG_OK if the argument is attached and ARG_IGNORE otherwise. static ArgStatus Optional(const Option& option, bool) { - if ( option.arg != nullptr ) + if (option.arg && option.name[option.namelen] != 0) return ARG_OK; else return ARG_IGNORE; From 31842a5319f8cc0daf56d2488853c0109f202047 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Fri, 25 Jul 2025 16:54:11 +0200 Subject: [PATCH 080/173] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/ErrorHandling.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 141c853e45f..35a525eceb7 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -238,7 +238,7 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) } else { - GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing.\n- Error file: {}\n- Error file enabled = {}).\n", + GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing.\n- Error file: {}\n- Error file enabled = {}.\n", m_filename, g_errorLogger.isOutputFileEnabled() ) ); } } From a1105e43a5fe2b89c05256d85f361d5b4091eb27 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Fri, 1 Aug 2025 10:03:53 +0200 Subject: [PATCH 081/173] =?UTF-8?q?=F0=9F=8E=A8=20uncrustify?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/logger/ErrorHandling.cpp | 4 ++-- .../common/logger/ErrorHandling.hpp | 22 +++++++++---------- src/coreComponents/common/logger/Logger.hpp | 22 +++++++++---------- .../dataRepository/DataContext.hpp | 8 +++---- src/coreComponents/dataRepository/Group.cpp | 2 +- .../dataRepository/GroupContext.cpp | 2 +- .../dataRepository/GroupContext.hpp | 4 ++-- .../dataRepository/WrapperContext.cpp | 2 +- .../dataRepository/WrapperContext.hpp | 2 +- .../mainInterface/initialization.cpp | 2 +- .../mesh/ElementRegionManager.cpp | 12 +++++----- src/coreComponents/mesh/FaceManager.cpp | 2 +- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 6 ++--- .../fluidFlow/wells/SinglePhaseWell.cpp | 20 ++++++++--------- .../CompositionalMultiphaseWellKernels.cpp | 12 +++++----- .../multiphysics/CoupledSolver.hpp | 22 +++++++++---------- .../PoromechanicsInitialization.cpp | 20 ++++++++--------- .../multiphysics/SinglePhasePoromechanics.cpp | 8 +++---- .../SolidMechanicsStateReset.cpp | 6 ++--- .../contact/SolidMechanicsLagrangeContact.cpp | 4 ++-- .../wavePropagation/shared/WaveSolverBase.cpp | 8 +++---- 21 files changed, 95 insertions(+), 95 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 35a525eceb7..9c42acca0d0 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -39,7 +39,7 @@ ErrorLogger g_errorLogger{}; void ErrorLogger::createFile() { - if( stringutilities::endsWith( m_filename, ".yaml") ) + if( stringutilities::endsWith( m_filename, ".yaml" ) ) { std::ofstream yamlFile( std::string( m_filename ), std::ios::out ); if( yamlFile.is_open() ) @@ -210,7 +210,7 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) yamlFile << g_level3Start << "priority: " << ctxInfo.m_priority << "\n"; for( auto const & [key, value] : ctxInfo.m_attributes ) { - yamlFile << g_level3Next << ErrorContext::attributeToString( key ) << ": " << value << "\n"; + yamlFile << g_level3Next << ErrorContext::attributeToString( key ) << ": " << value << "\n"; } } } diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 17e20a79970..b4f3b0b7a43 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -41,7 +41,7 @@ class ErrorLogger { Error, Warning, - Exception, + Exception, Undefined }; @@ -124,12 +124,12 @@ class ErrorLogger */ ErrorMsg( MsgType msgType, std::string_view msgContent, std::string_view msgFile, integer msgLine ) : m_type( msgType ), m_msg( msgContent ), m_file( msgFile ), m_line( msgLine ) {} - + /** * @brief Add text to the current error msg * @param e the exception containing text to add * @param toEnd indicates whether to add the message at the beginning (true) or at the end (false) - * default is false + * default is false * @return the reference to the current instance */ ErrorMsg & addToMsg( std::exception const & e, bool toEnd = false ); @@ -138,7 +138,7 @@ class ErrorLogger * @brief Add text to the current error msg * @param msg the text to add * @param toEnd indicates whether to add the message at the beginning (true) or at the end (false) - * default is false + * default is false * @return the reference to the current instance */ ErrorMsg & addToMsg( std::string_view msg, bool toEnd = false ); @@ -172,11 +172,11 @@ class ErrorLogger */ ErrorMsg & addCallStackInfo( std::string_view ossStackTrace ); - /** - * @return true if the YAML file output is enabled - */ - bool isValidStackTrace() const - { return m_isValidStackTrace; } + /** + * @return true if the YAML file output is enabled + */ + bool isValidStackTrace() const + { return m_isValidStackTrace; } /** * @brief Adds one or more context elements to the error @@ -218,8 +218,8 @@ class ErrorLogger { m_filename = filename; } /** - * @brief Gives acces to the error message that is currently being constructed, - * potencially at various application layers + * @brief Gives acces to the error message that is currently being constructed, + * potencially at various application layers * Use flushErrorMsg() when the message is fully constructed and you want it to be output * @return the reference to the current instance */ diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 7f507f86f3a..540b9c442a6 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -171,7 +171,7 @@ * @brief Conditionally raise a hard error and terminate the program. * @param EXP an expression that will be evaluated as a predicate * @param MSG a message to log (any expression that can be stream inserted) - * @param ... One or more DataContext (current error context information) + * @param ... One or more DataContext (current error context information) */ #define GEOS_ERROR_CTX_IF( EXP, MSG, ... ) \ do \ @@ -260,7 +260,7 @@ * @param EXP an expression that will be evaluated as a predicate * @param MSG a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw - * @param ... One or more DataContext (current error context information) + * @param ... One or more DataContext (current error context information) */ #define GEOS_THROW_CTX_IF( EXP, MSG, EXCEPTIONTYPE, ... ) \ do \ @@ -342,7 +342,7 @@ * @brief Conditionally report a warning * @param EXP an expression that will be evaluated as a predicate * @param MSG a message to log (any expression that can be stream inserted) - * @param ... One or more DataContext (current error context information) + * @param ... One or more DataContext (current error context information) */ #define GEOS_WARNING_CTX_IF( EXP, MSG, ... ) \ do \ @@ -408,10 +408,10 @@ */ #define GEOS_ERROR_IF_OP_MSG( lhs, OP, NOP, rhs, msg ) \ GEOS_ERROR_IF_IMPL( lhs OP rhs, \ - msg << "\n" << \ - "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ - " " << #lhs << " = " << lhs << "\n" << \ - " " << #rhs << " = " << rhs << "\n" ) + msg << "\n" << \ + "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ + " " << #lhs << " = " << lhs << "\n" << \ + " " << #rhs << " = " << rhs << "\n" ) /** * @brief Raise a hard error if two values are equal. @@ -440,10 +440,10 @@ */ #define GEOS_THROW_IF_OP_MSG( lhs, OP, NOP, rhs, msg, TYPE ) \ GEOS_THROW_IF_IMPL( lhs OP rhs, \ - msg << "\n" << \ - "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ - " " << #lhs << " = " << lhs << "\n" << \ - " " << #rhs << " = " << rhs << "\n", TYPE ) + msg << "\n" << \ + "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ + " " << #lhs << " = " << lhs << "\n" << \ + " " << #rhs << " = " << rhs << "\n", TYPE ) /** * @brief Throw an exception if two values are equal. diff --git a/src/coreComponents/dataRepository/DataContext.hpp b/src/coreComponents/dataRepository/DataContext.hpp index 2720b80a4fa..63b855e24f2 100644 --- a/src/coreComponents/dataRepository/DataContext.hpp +++ b/src/coreComponents/dataRepository/DataContext.hpp @@ -60,16 +60,16 @@ class DataContext * object comes from. */ virtual string toString() const = 0; - + /** * @brief Returns contextual information, including the file name and the line number - * @return ErrorLogger::ErrorContext + * @return ErrorLogger::ErrorContext */ virtual ErrorLogger::ErrorContext getContextInfo() const = 0; /** - * @brief Conversion operator to ErrorLogger::ErrorContext - * @return ErrorLogger::ErrorContext + * @brief Conversion operator to ErrorLogger::ErrorContext + * @return ErrorLogger::ErrorContext */ explicit operator ErrorLogger::ErrorContext() const { return getContextInfo(); diff --git a/src/coreComponents/dataRepository/Group.cpp b/src/coreComponents/dataRepository/Group.cpp index 8f87c2b98fc..37ddc54d5af 100644 --- a/src/coreComponents/dataRepository/Group.cpp +++ b/src/coreComponents/dataRepository/Group.cpp @@ -238,7 +238,7 @@ void Group::processInputFile( xmlWrapper::xmlNode const & targetNode, if( pair.second->processInputFile( targetNode, nodePos ) ) { processedAttributes.insert( pair.first ); - } + } } for( xmlWrapper::xmlAttribute attribute : targetNode.attributes() ) diff --git a/src/coreComponents/dataRepository/GroupContext.cpp b/src/coreComponents/dataRepository/GroupContext.cpp index 1ab50c96f4a..f5085f51663 100644 --- a/src/coreComponents/dataRepository/GroupContext.cpp +++ b/src/coreComponents/dataRepository/GroupContext.cpp @@ -56,7 +56,7 @@ string GroupContext::toString() const ErrorLogger::ErrorContext GroupContext::getContextInfo() const { - ErrorLogger::ErrorContext ctxInfo{ + ErrorLogger::ErrorContext ctxInfo{ { { ErrorLogger::ErrorContext::Attribute::DataPath, toString() } } // m_attributes }; return ctxInfo; diff --git a/src/coreComponents/dataRepository/GroupContext.hpp b/src/coreComponents/dataRepository/GroupContext.hpp index a248dc5c352..182245baa10 100644 --- a/src/coreComponents/dataRepository/GroupContext.hpp +++ b/src/coreComponents/dataRepository/GroupContext.hpp @@ -70,10 +70,10 @@ class GroupContext : public DataContext string toString() const override; /** - * @brief Return contextual information here it is a data path + * @brief Return contextual information here it is a data path * @return ErrorLogger::ErrorContext ErrorLogger instance updated with context information */ - ErrorLogger::ErrorContext getContextInfo() const override; + ErrorLogger::ErrorContext getContextInfo() const override; /** * @copydoc DataContext::getToStringInfo() diff --git a/src/coreComponents/dataRepository/WrapperContext.cpp b/src/coreComponents/dataRepository/WrapperContext.cpp index 14c0ab332a3..50a37277e32 100644 --- a/src/coreComponents/dataRepository/WrapperContext.cpp +++ b/src/coreComponents/dataRepository/WrapperContext.cpp @@ -40,7 +40,7 @@ string WrapperContext::toString() const ErrorLogger::ErrorContext WrapperContext::getContextInfo() const { - ErrorLogger::ErrorContext ctxInfo{ + ErrorLogger::ErrorContext ctxInfo{ { { ErrorLogger::ErrorContext::Attribute::DataPath, toString() } } // m_attributes }; return ctxInfo; diff --git a/src/coreComponents/dataRepository/WrapperContext.hpp b/src/coreComponents/dataRepository/WrapperContext.hpp index 48c8e28446d..40f36b135a3 100644 --- a/src/coreComponents/dataRepository/WrapperContext.hpp +++ b/src/coreComponents/dataRepository/WrapperContext.hpp @@ -58,7 +58,7 @@ class WrapperContext final : public GroupContext * @brief Return contextual information here it is a data path * @return ErrorLogger::ErrorContext ErrorLogger instance updated with context information */ - ErrorLogger::ErrorContext getContextInfo() const override; + ErrorLogger::ErrorContext getContextInfo() const override; }; diff --git a/src/coreComponents/mainInterface/initialization.cpp b/src/coreComponents/mainInterface/initialization.cpp index 0b49f9fc243..931e4b55e86 100644 --- a/src/coreComponents/mainInterface/initialization.cpp +++ b/src/coreComponents/mainInterface/initialization.cpp @@ -245,7 +245,7 @@ std::unique_ptr< CommandLineOptions > parseCommandLineOptions( int argc, char * g_errorLogger.enableFileOutput( true ); if( options[ERRORSOUTPUT].arg != nullptr ) { - std::string_view filename = options[ERRORSOUTPUT].arg; + std::string_view filename = options[ERRORSOUTPUT].arg; g_errorLogger.setOutputFilename( filename ); } g_errorLogger.createFile(); diff --git a/src/coreComponents/mesh/ElementRegionManager.cpp b/src/coreComponents/mesh/ElementRegionManager.cpp index 65c1075c7b8..59fdcaf31a4 100644 --- a/src/coreComponents/mesh/ElementRegionManager.cpp +++ b/src/coreComponents/mesh/ElementRegionManager.cpp @@ -781,13 +781,13 @@ ElementRegionManager::getCellBlockToSubRegionMap( CellBlockManagerABC const & ce GEOS_UNUSED_VAR( region ); // unused if geos_error_if is nulld localIndex const blockIndex = cellBlocks.getIndex( subRegion.getName() ); GEOS_ERROR_CTX_IF( blockIndex == Group::subGroupMap::KeyIndex::invalid_index, - GEOS_FMT( "{}, subregion {}: Cell block not found at index {}.", - region.getDataContext().toString(), subRegion.getName(), blockIndex ), - region.getDataContext() ); + GEOS_FMT( "{}, subregion {}: Cell block not found at index {}.", + region.getDataContext().toString(), subRegion.getName(), blockIndex ), + region.getDataContext() ); GEOS_ERROR_CTX_IF( blockMap( blockIndex, 1 ) != -1, - GEOS_FMT( "{}, subregion {}: Cell block at index {} is mapped to more than one subregion.", - region.getDataContext().toString(), subRegion.getName(), blockIndex ), - region.getDataContext() ); + GEOS_FMT( "{}, subregion {}: Cell block at index {} is mapped to more than one subregion.", + region.getDataContext().toString(), subRegion.getName(), blockIndex ), + region.getDataContext() ); blockMap( blockIndex, 0 ) = er; blockMap( blockIndex, 1 ) = esr; diff --git a/src/coreComponents/mesh/FaceManager.cpp b/src/coreComponents/mesh/FaceManager.cpp index f5807edce7b..addc4ac147d 100644 --- a/src/coreComponents/mesh/FaceManager.cpp +++ b/src/coreComponents/mesh/FaceManager.cpp @@ -313,7 +313,7 @@ void FaceManager::sortFaceNodes( arrayView2d< real64 const, nodes::REFERENCE_POS localIndex const numFaceNodes = LvArray::integerConversion< localIndex >( faceNodes.size() ); GEOS_THROW_IF_GT_MSG( numFaceNodes, MAX_FACE_NODES, GEOS_FMT( "The number of maximum nodes allocated per cell face has been reached " - "at position {}.", elementCenter ), + "at position {}.", elementCenter ), std::runtime_error ); localIndex const firstNodeIndex = faceNodes[0]; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index ff55f2c243e..b7401da6bf2 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -210,9 +210,9 @@ void CompositionalMultiphaseFVM::initializePreSubGroups() FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); FluxApproximationBase const & fluxApprox = fvManager.getFluxApproximation( m_discretizationName ); GEOS_ERROR_CTX_IF( fluxApprox.upwindingParams().upwindingScheme == UpwindingScheme::HU2PH && m_numPhases != 2, - GEOS_FMT( "{}: upwinding scheme {} only supports 2-phase flow", getDataContext(), - EnumStrings< UpwindingScheme >::toString( UpwindingScheme::HU2PH )), - getDataContext() ); + GEOS_FMT( "{}: upwinding scheme {} only supports 2-phase flow", getDataContext(), + EnumStrings< UpwindingScheme >::toString( UpwindingScheme::HU2PH )), + getDataContext() ); } void CompositionalMultiphaseFVM::setupDofs( DomainPartition const & domain, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp index 01f3dd178af..31b91c807ec 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp @@ -151,19 +151,19 @@ void SinglePhaseWell::validateWellConstraints( real64 const & time_n, real64 const targetTotalRate = wellControls.getTargetTotalRate( time_n ); real64 const targetPhaseRate = wellControls.getTargetPhaseRate( time_n ); GEOS_THROW_CTX_IF( currentControl == WellControls::Control::PHASEVOLRATE, - "WellControls " << wellControls.getDataContext() << - ": Phase rate control is not available for SinglePhaseWell", - InputError, wellControls.getDataContext() ); + "WellControls " << wellControls.getDataContext() << + ": Phase rate control is not available for SinglePhaseWell", + InputError, wellControls.getDataContext() ); // The user always provides positive rates, but these rates are later multiplied by -1 internally for producers GEOS_THROW_CTX_IF( ( ( wellControls.isInjector() && targetTotalRate < 0.0 ) || - ( wellControls.isProducer() && targetTotalRate > 0.0) ), - "WellControls " << wellControls.getDataContext() << - ": Target total rate cannot be negative", - InputError, wellControls.getDataContext() ); + ( wellControls.isProducer() && targetTotalRate > 0.0) ), + "WellControls " << wellControls.getDataContext() << + ": Target total rate cannot be negative", + InputError, wellControls.getDataContext() ); GEOS_THROW_CTX_IF( !isZero( targetPhaseRate ), - "WellControls " << wellControls.getDataContext() << - ": Target phase rate cannot be used for SinglePhaseWell", - InputError, wellControls.getDataContext() ); + "WellControls " << wellControls.getDataContext() << + ": Target phase rate cannot be used for SinglePhaseWell", + InputError, wellControls.getDataContext() ); } void SinglePhaseWell::updateBHPForConstraint( WellElementSubRegion & subRegion ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp index fda8a78f2c8..b3de5b007f3 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp @@ -664,14 +664,14 @@ PresTempCompFracInitializationKernel:: GEOS_THROW_CTX_IF( foundNegativePres.get() == 1, - wellControls.getDataContext() << "Invalid well initialization, negative pressure was found.", - InputError, wellControls.getDataContext() ); + wellControls.getDataContext() << "Invalid well initialization, negative pressure was found.", + InputError, wellControls.getDataContext() ); GEOS_THROW_CTX_IF( foundNegativeTemp.get() == 1, - wellControls.getDataContext() << "Invalid well initialization, negative temperature was found.", - InputError, wellControls.getDataContext() ); + wellControls.getDataContext() << "Invalid well initialization, negative temperature was found.", + InputError, wellControls.getDataContext() ); GEOS_THROW_CTX_IF( foundInconsistentCompFrac.get() == 1, - wellControls.getDataContext() << "Invalid well initialization, inconsistent component fractions were found.", - InputError, wellControls.getDataContext() ); + wellControls.getDataContext() << "Invalid well initialization, inconsistent component fractions were found.", + InputError, wellControls.getDataContext() ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp index a90a7a301c1..0b530524262 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp @@ -89,10 +89,10 @@ class CoupledSolver : public PhysicsSolverBase auto const & solverType = LvArray::system::demangleType< SolverType >(); solver = this->getParent().template getGroupPointer< SolverType >( solverName ); GEOS_THROW_CTX_IF( solver == nullptr, - GEOS_FMT( "{}: Could not find solver '{}' of type {}", - getDataContext(), - solverName, solverType ), - InputError, getDataContext() ); + GEOS_FMT( "{}: Could not find solver '{}' of type {}", + getDataContext(), + solverName, solverType ), + InputError, getDataContext() ); GEOS_LOG_LEVEL_RANK_0( logInfo::Coupling, GEOS_FMT( "{}: found {} solver named {}", getName(), solver->getCatalogName(), solverName ) ); @@ -676,13 +676,13 @@ class CoupledSolver : public PhysicsSolverBase bool const isSequential = getNonlinearSolverParameters().couplingType() == NonlinearSolverParameters::CouplingType::Sequential; bool const usesLineSearch = getNonlinearSolverParameters().m_lineSearchAction != NonlinearSolverParameters::LineSearchAction::None; GEOS_THROW_CTX_IF( isSequential && usesLineSearch, - GEOS_FMT( "{}: line search is not supported by the coupled solver when {} is set to `{}`. Please set {} to `{}` to remove this error", - getNonlinearSolverParameters().getWrapperDataContext( NonlinearSolverParameters::viewKeysStruct::couplingTypeString() ), - NonlinearSolverParameters::viewKeysStruct::couplingTypeString(), - EnumStrings< NonlinearSolverParameters::CouplingType >::toString( NonlinearSolverParameters::CouplingType::Sequential ), - NonlinearSolverParameters::viewKeysStruct::lineSearchActionString(), - EnumStrings< NonlinearSolverParameters::LineSearchAction >::toString( NonlinearSolverParameters::LineSearchAction::None ) ), - InputError, getNonlinearSolverParameters().getWrapperDataContext( NonlinearSolverParameters::viewKeysStruct::couplingTypeString() ) ); + GEOS_FMT( "{}: line search is not supported by the coupled solver when {} is set to `{}`. Please set {} to `{}` to remove this error", + getNonlinearSolverParameters().getWrapperDataContext( NonlinearSolverParameters::viewKeysStruct::couplingTypeString() ), + NonlinearSolverParameters::viewKeysStruct::couplingTypeString(), + EnumStrings< NonlinearSolverParameters::CouplingType >::toString( NonlinearSolverParameters::CouplingType::Sequential ), + NonlinearSolverParameters::viewKeysStruct::lineSearchActionString(), + EnumStrings< NonlinearSolverParameters::LineSearchAction >::toString( NonlinearSolverParameters::LineSearchAction::None ) ), + InputError, getNonlinearSolverParameters().getWrapperDataContext( NonlinearSolverParameters::viewKeysStruct::couplingTypeString() ) ); if( !isSequential ) { diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp index 8059581cda4..a8c54e149cc 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp @@ -72,11 +72,11 @@ postInputInitialization() Group & physicsSolverManager = problemManager.getGroup( "Solvers" ); GEOS_THROW_CTX_IF( !physicsSolverManager.hasGroup( m_poromechanicsSolverName ), - GEOS_FMT( "{}: {} solver named {} not found", - getWrapperDataContext( viewKeyStruct::poromechanicsSolverNameString() ), - POROMECHANICS_SOLVER::catalogName(), - m_poromechanicsSolverName ), - InputError, getWrapperDataContext( viewKeyStruct::poromechanicsSolverNameString() ) ); + GEOS_FMT( "{}: {} solver named {} not found", + getWrapperDataContext( viewKeyStruct::poromechanicsSolverNameString() ), + POROMECHANICS_SOLVER::catalogName(), + m_poromechanicsSolverName ), + InputError, getWrapperDataContext( viewKeyStruct::poromechanicsSolverNameString() ) ); m_poromechanicsSolver = &physicsSolverManager.getGroup< POROMECHANICS_SOLVER >( m_poromechanicsSolverName ); @@ -85,11 +85,11 @@ postInputInitialization() TasksManager & tasksManager = problemManager.getGroup< TasksManager >( "Tasks" ); GEOS_THROW_CTX_IF( !tasksManager.hasGroup( m_solidMechanicsStatisticsName ), - GEOS_FMT( "{}: {} task named {} not found", - getWrapperDataContext( viewKeyStruct::solidMechanicsStatisticsNameString() ), - SolidMechanicsStatistics::catalogName(), - m_solidMechanicsStatisticsName ), - InputError, getWrapperDataContext( viewKeyStruct::solidMechanicsStatisticsNameString() ) ); + GEOS_FMT( "{}: {} task named {} not found", + getWrapperDataContext( viewKeyStruct::solidMechanicsStatisticsNameString() ), + SolidMechanicsStatistics::catalogName(), + m_solidMechanicsStatisticsName ), + InputError, getWrapperDataContext( viewKeyStruct::solidMechanicsStatisticsNameString() ) ); m_solidMechanicsStatistics = &tasksManager.getGroup< SolidMechanicsStatistics >( m_solidMechanicsStatisticsName ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index 95df3b6d33a..788c5948f9a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -114,10 +114,10 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::initializePostIn for( size_t i = 0; i < poromechanicsTargetRegionNames.size(); ++i ) { GEOS_THROW_CTX_IF( std::find( flowTargetRegionNames.begin(), flowTargetRegionNames.end(), poromechanicsTargetRegionNames[i] ) - == flowTargetRegionNames.end(), - GEOS_FMT( "{} {}: region `{}` must be a target region of `{}`", - getCatalogName(), this->getDataContext(), poromechanicsTargetRegionNames[i], this->flowSolver()->getDataContext() ), - InputError, this->getDataContext(), this->flowSolver()->getDataContext() ); + == flowTargetRegionNames.end(), + GEOS_FMT( "{} {}: region `{}` must be a target region of `{}`", + getCatalogName(), this->getDataContext(), poromechanicsTargetRegionNames[i], this->flowSolver()->getDataContext() ), + InputError, this->getDataContext(), this->flowSolver()->getDataContext() ); } } diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp index 13bcc92aaf0..15a5e2acfa0 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp @@ -65,9 +65,9 @@ void SolidMechanicsStateReset::postInputInitialization() Group & physicsSolverManager = problemManager.getGroup( "Solvers" ); GEOS_THROW_CTX_IF( !physicsSolverManager.hasGroup( m_solidSolverName ), - GEOS_FMT( "Task {}: physics solver named {} not found", - getDataContext(), m_solidSolverName ), - InputError, getDataContext() ); + GEOS_FMT( "Task {}: physics solver named {} not found", + getDataContext(), m_solidSolverName ), + InputError, getDataContext() ); m_solidSolver = &physicsSolverManager.getGroup< SolidMechanicsLagrangianFEM >( m_solidSolverName ); } diff --git a/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp index c6689d9d3e2..8d3359a5f19 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp @@ -1823,8 +1823,8 @@ void SolidMechanicsLagrangeContact::assembleStabilization( MeshLevel const & mes } } GEOS_ERROR_CTX_IF( realNodes != 2, - getDataContext() << ": An edge shared by two fracture elements must have 2 nodes.", - getDataContext() ); + getDataContext() << ": An edge shared by two fracture elements must have 2 nodes.", + getDataContext() ); edge.resize( realNodes ); // Compute nodal area factor diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp index 422c09f1c6d..4bd07efb1f3 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp @@ -317,8 +317,8 @@ void WaveSolverBase::postInputInitialization() counter++; } ); GEOS_THROW_CTX_IF( counter > 1, - getDataContext() << ": One single PML field specification is allowed", - InputError, getDataContext() ); + getDataContext() << ": One single PML field specification is allowed", + InputError, getDataContext() ); m_usePML = counter; @@ -441,8 +441,8 @@ localIndex WaveSolverBase::getNumNodesPerElem() FiniteElementDiscretization const * const feDiscretization = feDiscretizationManager.getGroupPointer< FiniteElementDiscretization >( m_discretizationName ); GEOS_THROW_CTX_IF( feDiscretization == nullptr, - getDataContext() << ": FE discretization not found: " << m_discretizationName, - InputError, getDataContext() ); + getDataContext() << ": FE discretization not found: " << m_discretizationName, + InputError, getDataContext() ); localIndex numNodesPerElem = 0; forDiscretizationOnMeshTargets( domain.getMeshBodies(), From c118dd4dcc21ca3d2575aab519c3bc8d1acd7853 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Fri, 1 Aug 2025 10:10:49 +0200 Subject: [PATCH 082/173] =?UTF-8?q?=F0=9F=8E=A8=20docs=20alignement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/ErrorHandling.hpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index b4f3b0b7a43..36237217a88 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -129,7 +129,7 @@ class ErrorLogger * @brief Add text to the current error msg * @param e the exception containing text to add * @param toEnd indicates whether to add the message at the beginning (true) or at the end (false) - * default is false + * default is false * @return the reference to the current instance */ ErrorMsg & addToMsg( std::exception const & e, bool toEnd = false ); @@ -138,7 +138,7 @@ class ErrorLogger * @brief Add text to the current error msg * @param msg the text to add * @param toEnd indicates whether to add the message at the beginning (true) or at the end (false) - * default is false + * default is false * @return the reference to the current instance */ ErrorMsg & addToMsg( std::string_view msg, bool toEnd = false ); @@ -219,8 +219,8 @@ class ErrorLogger /** * @brief Gives acces to the error message that is currently being constructed, - * potencially at various application layers - * Use flushErrorMsg() when the message is fully constructed and you want it to be output + * potencially at various application layers + * Use flushErrorMsg() when the message is fully constructed and you want it to be output * @return the reference to the current instance */ ErrorMsg & currentErrorMsg() @@ -241,7 +241,7 @@ class ErrorLogger /** * @brief Write all the information retrieved about the error/warning message into the YAML file - * and reset the errorMsg instance to its initial state + * and reset the errorMsg instance to its initial state * @param errorMsg a constant reference to the error */ void flushErrorMsg( ErrorMsg & errorMsg ); @@ -257,7 +257,7 @@ class ErrorLogger /** * @brief Write the error message in the YAML file regarding indentation and line break * @param msg the message to write in the YAML - * For the exception type, this message can be added as needed + * For the exception type, this message can be added as needed */ void streamMultilineYamlAttribute( std::string_view msg, std::ofstream & yamlFile, std::string_view indent ); From 4215fad033e57d7805758395033542105d98cdc6 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Fri, 1 Aug 2025 11:09:24 +0200 Subject: [PATCH 083/173] =?UTF-8?q?=F0=9F=8E=A8=20format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/ErrorHandling.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 9c42acca0d0..c1b8dbb4758 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -193,9 +193,12 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) yamlFile << info; } yamlFile << "\n"; + // Error message yamlFile << g_level1Next << "message: >-\n"; streamMultilineYamlAttribute( errorMsg.m_msg, yamlFile, g_level2Next ); + + // context information if( !errorMsg.m_contextsInfo.empty() ) { // Sort contextual information by decreasing priority @@ -214,10 +217,12 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) } } } + // Location of the error in the code yamlFile << g_level1Next << "sourceLocation:\n"; yamlFile << g_level2Next << "file: " << errorMsg.m_file << "\n"; yamlFile << g_level2Next << "line: " << errorMsg.m_line << "\n"; + // Information about the stack trace yamlFile << g_level1Next << "sourceCallStack:\n"; if( !errorMsg.isValidStackTrace() ) @@ -231,6 +236,7 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) yamlFile << g_level3Start << "frame" << i << ": " << errorMsg.m_sourceCallStack[i] << "\n"; } } + yamlFile << "\n"; yamlFile.flush(); errorMsg = ErrorMsg(); From 507ac66a684a1089496039e2014981e2d838cf68 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Fri, 1 Aug 2025 11:11:10 +0200 Subject: [PATCH 084/173] builder pattern for addContextInfo --- .../common/logger/ErrorHandling.hpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 36237217a88..db28e2ba927 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -172,19 +172,20 @@ class ErrorLogger */ ErrorMsg & addCallStackInfo( std::string_view ossStackTrace ); - /** - * @return true if the YAML file output is enabled - */ - bool isValidStackTrace() const - { return m_isValidStackTrace; } - /** * @brief Adds one or more context elements to the error * @tparam Args variadic pack of argument types * @param args list of DataContexts + * @return the reference to the current instance */ template< typename ... Args > - void addContextInfo( Args && ... args ); + ErrorMsg & addContextInfo( Args && ... args ); + + /** + * @return true if the YAML file output is enabled + */ + bool isValidStackTrace() const + { return m_isValidStackTrace; } private: /** @@ -266,9 +267,10 @@ class ErrorLogger extern ErrorLogger g_errorLogger; template< typename ... Args > -void ErrorLogger::ErrorMsg::addContextInfo( Args && ... args ) +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addContextInfo( Args && ... args ) { ( this->addContextInfoImpl( ErrorContext( args ) ), ... ); + return *this; } } /* namespace geos */ From 7b4ec52a05e5e8cf501888b15f00dc3df07ba3b5 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Fri, 1 Aug 2025 12:22:03 +0200 Subject: [PATCH 085/173] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20of=20th?= =?UTF-8?q?e=20test:=20keeping=20only=20necessary=20testing,=20separated?= =?UTF-8?q?=20tests=20by=20feature?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../unitTests/testErrorHandling.cpp | 130 ++++++++++-------- 1 file changed, 75 insertions(+), 55 deletions(-) diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index 9e9ba408625..ff9d6ffbb33 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -67,6 +67,9 @@ std::string readFile( std::optional< size_t > startLine = std::nullopt, return buffer.str(); } +// separated file bits, which allow us to ignore the absolute path of the workspace ("file:" attribute). +// note: "line:" attribute of "sourceLocation:" need to be manually updated if test code changes (to +// verify they are correctly reported) static constexpr std::array< std::string_view, 5 > expectedFileBits = { R"(errors: @@ -77,7 +80,7 @@ static constexpr std::array< std::string_view, 5 > expectedFileBits = { sourceLocation: file: )", R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp - line: 194 + line: 204 sourceCallStack: - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) - frame1: testing::Test::Run() @@ -96,7 +99,7 @@ static constexpr std::array< std::string_view, 5 > expectedFileBits = { sourceLocation: file: )", R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp - line: 196 + line: 206 sourceCallStack: - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) - frame1: testing::Test::Run() @@ -118,11 +121,11 @@ static constexpr std::array< std::string_view, 5 > expectedFileBits = { inputLine: 23 - priority: 0 inputFile: /path/to/file.xml - inputLine: 12 + inputLine: 32 sourceLocation: file: )", R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp - line: 197 + line: 207 sourceCallStack: - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) - frame1: testing::Test::Run() @@ -142,17 +145,17 @@ static constexpr std::array< std::string_view, 5 > expectedFileBits = { contexts: - priority: 2 inputFile: /path/to/file.xml - inputLine: 23 - - priority: 0 + inputLine: 64 + - priority: 1 inputFile: /path/to/file.xml inputLine: 23 - priority: 0 inputFile: /path/to/file.xml - inputLine: 12 + inputLine: 32 sourceLocation: file: )", R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp - line: 203 + line: 215 sourceCallStack: - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) - frame1: testing::Test::Run() @@ -175,69 +178,86 @@ static constexpr std::string_view exceptionFormat = inputLine: 23 )"; -TEST( ErrorHandling, testYaml ) +double testMinPrecision = 1e-6; +double testMaxPrecision = 1e-3; +int testValue = 5; + +TEST( ErrorHandling, testYamlFileOutputFormat ) { - g_errorLogger.setOutputFilename( filename ); - g_errorLogger.enableFileOutput( true ); - double minPrecision = 1e-6; - double maxPrecision = 1e-3; - int x = 5; + { // building the error yaml test case file + // Local overriding of global 'g_errorLogger' (to contain test macros effects to local scope) + ErrorLogger g_errorLogger; - DataFileContext const context = DataFileContext( "Base Test Class", "/path/to/file.xml", 23 ); - DataFileContext const additionalContext = DataFileContext( "Additional Test Class", "/path/to/file.xml", 12 ); + g_errorLogger.enableFileOutput( true ); + g_errorLogger.setOutputFilename( filename ); - if( g_errorLogger.isOutputFileEnabled() ) - { - g_errorLogger.createFile(); - } + DataFileContext const context = DataFileContext( "Base Test Class", "/path/to/file.xml", 23 ); + DataFileContext const additionalContext = DataFileContext( "Additional Test Class", "/path/to/file.xml", 32 ); + DataFileContext const importantAdditionalContext = DataFileContext( "Additional Test Class", "/path/to/file.xml", 64 ); + + if( g_errorLogger.isOutputFileEnabled() ) + { + g_errorLogger.createFile(); + } - GEOS_WARNING( "Conflicting pressure boundary conditions" ); + // Warning tests + GEOS_WARNING( "Conflicting pressure boundary conditions" ); - GEOS_WARNING_IF( x == 5, "Pressure value is too small." ); - GEOS_WARNING_CTX_IF( x == 5, - GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", - context.toString(), minPrecision, maxPrecision, minPrecision ), - context, additionalContext ); - try - { - GEOS_THROW_CTX_IF( x == 5, - "Group " << context.toString() << " has no wrapper named" << std::endl, - std::domain_error, - context, additionalContext ); - } - catch( std::domain_error const & ex ) - { - string const errorMsg = "Table input error.\n"; - g_errorLogger.currentErrorMsg() - .addToMsg( errorMsg ) - .addContextInfo( context.getContextInfo().setPriority( 2 ) ); - } + GEOS_WARNING_IF( testValue == 5, "Pressure value is too small." ); + GEOS_WARNING_CTX_IF( testValue == 5, + GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", + context.toString(), testMinPrecision, testMaxPrecision, testMinPrecision ), + context, additionalContext ); - if( g_errorLogger.isOutputFileEnabled() ) - { + // Stacked exception test (contexts must appear sorted by priority) + try + { + GEOS_THROW_CTX_IF( testValue == 5, + "Group " << context.toString() << " has no wrapper named" << std::endl, + std::domain_error, + context.getContextInfo().setPriority( 1 ) ); + } + catch( std::domain_error const & ex ) + { + string const errorMsg = "Table input error.\n"; + g_errorLogger.currentErrorMsg() + .addToMsg( errorMsg ) + .addContextInfo( additionalContext.getContextInfo() ) + .addContextInfo( importantAdditionalContext.getContextInfo().setPriority( 2 ) ); + } g_errorLogger.flushErrorMsg( g_errorLogger.currentErrorMsg() ); } - std::string fileContent = readFile(); - for( size_t i = 0; i < expectedFileBits.size(); ++i ) - { - auto it = fileContent.find( expectedFileBits[i] ); - EXPECT_NE( it, std::string::npos ) << "Expected bit not found: " << expectedFileBits[i]; + { // read back yaml file and check its formatting + std::string fileContent = readFile(); + + for( size_t i = 0; i < expectedFileBits.size(); ++i ) + { + auto it = fileContent.find( expectedFileBits[i] ); + EXPECT_NE( it, std::string::npos ) << "Expected bit not found (no." << i << "):\n" + << "-----------------------\n" + << expectedFileBits[i] << '\n' + << "-----------------------\n"; + } + + // removeFile(); } +} - std::string additionalExceptionInformation = readFile( 65, 72 ); - EXPECT_EQ( additionalExceptionInformation, exceptionFormat ); +TEST( ErrorHandling, testErrorBehaviour ) +{ + // Local overriding of global 'g_errorLogger' (to contain test macros effects to local scope) + ErrorLogger g_errorLogger; - EXPECT_EXIT( GEOS_ERROR_CTX_IF( x == 5, + DataFileContext const context = DataFileContext( "Base Test Class", "/path/to/file.xml", 23 ); + + EXPECT_EXIT( GEOS_ERROR_CTX_IF( testValue == 5, GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.PID {}", - context.toString(), minPrecision, maxPrecision, minPrecision, getpid() ), - context, additionalContext ), + context.toString(), testMinPrecision, testMaxPrecision, testMinPrecision, getpid() ), + context ), ::testing::ExitedWithCode( 1 ), ".*" ); - - g_errorLogger = ErrorLogger{}; - removeFile(); } int main( int ac, char * av[] ) From a01d8acb896ee26ed4719ab5a3d4dd316b8c27ca Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Fri, 1 Aug 2025 12:23:10 +0200 Subject: [PATCH 086/173] =?UTF-8?q?=F0=9F=90=9B=20=20bugfix=20for=20test,?= =?UTF-8?q?=20wrong=20global=20instance=20impacting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/ErrorHandling.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index c1b8dbb4758..69375c7f087 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -183,10 +183,10 @@ void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstr void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) { std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); - if( yamlFile.is_open() && g_errorLogger.isOutputFileEnabled() ) + if( yamlFile.is_open() && isOutputFileEnabled() ) { // General errors info (type, rank on which the error occured) - yamlFile << g_level1Start << "type: " << g_errorLogger.toString( errorMsg.m_type ) << "\n"; + yamlFile << g_level1Start << "type: " << ErrorLogger::toString( errorMsg.m_type ) << "\n"; yamlFile << g_level1Next << "rank: "; for( auto const & info: errorMsg.m_ranksInfo ) { From d4c465b99070e2d80a305f7cc0ce0961b0bb65df Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Fri, 1 Aug 2025 12:23:29 +0200 Subject: [PATCH 087/173] =?UTF-8?q?=F0=9F=8E=A8=20format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index b7401da6bf2..ffe9873752d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -210,7 +210,8 @@ void CompositionalMultiphaseFVM::initializePreSubGroups() FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); FluxApproximationBase const & fluxApprox = fvManager.getFluxApproximation( m_discretizationName ); GEOS_ERROR_CTX_IF( fluxApprox.upwindingParams().upwindingScheme == UpwindingScheme::HU2PH && m_numPhases != 2, - GEOS_FMT( "{}: upwinding scheme {} only supports 2-phase flow", getDataContext(), + GEOS_FMT( "{}: upwinding scheme {} only supports 2-phase flow", + getDataContext(), EnumStrings< UpwindingScheme >::toString( UpwindingScheme::HU2PH )), getDataContext() ); } From 6d10e3aad688c2166ef75addc04936d4bd417c62 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Fri, 1 Aug 2025 13:16:14 +0200 Subject: [PATCH 088/173] =?UTF-8?q?=E2=8F=AA=20restored=20"Rank=20N:"=20if?= =?UTF-8?q?=20error=20messages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/Logger.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 540b9c442a6..86ff5485a0c 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -149,7 +149,7 @@ __oss << "***** ERROR\n"; \ __oss << "***** LOCATION: " LOCATION "\n"; \ __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << message << "\n"; \ + __oss << "***** Rank " << ::geos::logger::internal::rankString << ": " << message << "\n"; \ std::string stackHistory = LvArray::system::stackTrace( true ); \ __oss << stackHistory; \ std::cout << __oss.str() << std::endl; \ @@ -185,7 +185,7 @@ __oss << "***** ERROR\n"; \ __oss << "***** LOCATION: " LOCATION "\n"; \ __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << message << "\n"; \ + __oss << "***** Rank " << ::geos::logger::internal::rankString << ": " << message << "\n"; \ std::string stackHistory = LvArray::system::stackTrace( true ); \ __oss << stackHistory; \ std::cout << __oss.str() << std::endl; \ @@ -239,7 +239,7 @@ __oss << "\n"; \ __oss << "***** LOCATION: " LOCATION "\n"; \ __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << message << "\n"; \ + __oss << "***** Rank " << ::geos::logger::internal::rankString << ": " << message << "\n"; \ std::string stackHistory = LvArray::system::stackTrace( true ); \ __oss << stackHistory; \ if( g_errorLogger.isOutputFileEnabled() ) \ @@ -274,7 +274,7 @@ __oss << "\n"; \ __oss << "***** LOCATION: " LOCATION "\n"; \ __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << message << "\n"; \ + __oss << "***** Rank " << ::geos::logger::internal::rankString << ": " << message << "\n"; \ std::string stackHistory = LvArray::system::stackTrace( true ); \ __oss << stackHistory; \ if( g_errorLogger.isOutputFileEnabled() ) \ From e9cd64c1fd24347a0428bdca8cc1e58c7809718e Mon Sep 17 00:00:00 2001 From: amandinehry Date: Thu, 7 Aug 2025 14:08:40 +0200 Subject: [PATCH 089/173] test --- src/coreComponents/common/logger/Logger.hpp | 48 ++++++++++----------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 7f507f86f3a..d22253c9e42 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -419,7 +419,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define LOG_GEOS_ERROR_IF_EQ_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, ==, !=, rhs, msg ) +#define GEOS_LOG_ERROR_IF_EQ_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, ==, !=, rhs, msg ) /** * @brief Raise a hard error if two values are equal. @@ -427,7 +427,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ERROR_IF_EQ_MSG( lhs, rhs, msg ) LOG_GEOS_ERROR_IF_EQ_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define GEOS_ERROR_IF_EQ_MSG( lhs, rhs, msg ) GEOS_LOG_ERROR_IF_EQ_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) /** * @brief Throw an exception if @p lhs @p OP @p rhs. @@ -452,7 +452,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define LOG_GEOS_THROW_IF_EQ_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, ==, !=, rhs, msg, TYPE ) +#define GEOS_LOG_THROW_IF_EQ_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, ==, !=, rhs, msg, TYPE ) /** * @brief Raise a hard error if two values are equal. @@ -461,7 +461,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_EQ_MSG( lhs, rhs, msg, TYPE ) LOG_GEOS_THROW_IF_EQ_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +#define GEOS_THROW_IF_EQ_MSG( lhs, rhs, msg, TYPE ) GEOS_LOG_THROW_IF_EQ_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) /** * @brief Raise a hard error if two values are equal. @@ -484,7 +484,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define LOG_GEOS_ERROR_IF_NE_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, !=, ==, rhs, msg ) +#define GEOS_LOG_ERROR_IF_NE_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, !=, ==, rhs, msg ) /** * @brief Raise a hard error if two values are not equal. @@ -492,7 +492,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ERROR_IF_NE_MSG( lhs, rhs, msg ) LOG_GEOS_ERROR_IF_NE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define GEOS_ERROR_IF_NE_MSG( lhs, rhs, msg ) GEOS_LOG_ERROR_IF_NE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) /** * @brief Throw an exception if two values are not equal. @@ -501,7 +501,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define LOG_GEOS_THROW_IF_NE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, !=, ==, rhs, msg, TYPE ) +#define GEOS_LOG_THROW_IF_NE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, !=, ==, rhs, msg, TYPE ) /** * @brief Throw an exception if two values are not equal. @@ -510,7 +510,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_NE_MSG( lhs, rhs, msg, TYPE ) LOG_GEOS_THROW_IF_NE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +#define GEOS_THROW_IF_NE_MSG( lhs, rhs, msg, TYPE ) GEOS_LOG_THROW_IF_NE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) /** * @brief Raise a hard error if two values are not equal. @@ -533,7 +533,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define LOG_GEOS_ERROR_IF_GT_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, >, <=, rhs, msg ) +#define GEOS_LOG_ERROR_IF_GT_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, >, <=, rhs, msg ) /** * @brief Raise a hard error if one value compares greater than the other. @@ -541,7 +541,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ERROR_IF_GT_MSG( lhs, rhs, msg ) LOG_GEOS_ERROR_IF_GT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define GEOS_ERROR_IF_GT_MSG( lhs, rhs, msg ) GEOS_LOG_ERROR_IF_GT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) /** * @brief Throw an exception if one value compares greater than the other. @@ -550,7 +550,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define LOG_GEOS_THROW_IF_GT_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, >, <=, rhs, msg, TYPE ) +#define GEOS_LOG_THROW_IF_GT_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, >, <=, rhs, msg, TYPE ) /** * @brief Throw an exception if one value compares greater than the other. @@ -559,7 +559,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_GT_MSG( lhs, rhs, msg, TYPE ) LOG_GEOS_THROW_IF_GT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +#define GEOS_THROW_IF_GT_MSG( lhs, rhs, msg, TYPE ) GEOS_LOG_THROW_IF_GT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) /** * @brief Raise a hard error if one value compares greater than the other. @@ -582,7 +582,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define LOG_GEOS_ERROR_IF_GE_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, >=, <, rhs, msg ) +#define GEOS_LOG_ERROR_IF_GE_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, >=, <, rhs, msg ) /** @@ -591,7 +591,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ERROR_IF_GE_MSG( lhs, rhs, msg ) LOG_GEOS_ERROR_IF_GE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define GEOS_ERROR_IF_GE_MSG( lhs, rhs, msg ) GEOS_LOG_ERROR_IF_GE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) /** * @brief Throw an exception if one value compares greater than or equal to the other. @@ -600,7 +600,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define LOG_GEOS_THROW_IF_GE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, >=, <, rhs, msg, TYPE ) +#define GEOS_LOG_THROW_IF_GE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, >=, <, rhs, msg, TYPE ) /** * @brief Throw an exception if one value compares greater than or equal to the other. @@ -609,7 +609,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_GE_MSG( lhs, rhs, msg, TYPE ) LOG_GEOS_THROW_IF_GE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +#define GEOS_THROW_IF_GE_MSG( lhs, rhs, msg, TYPE ) GEOS_LOG_THROW_IF_GE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) /** * @brief Raise a hard error if one value compares greater than or equal to the other. @@ -632,7 +632,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define LOG_GEOS_ERROR_IF_LT_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, <, >=, rhs, msg ) +#define GEOS_LOG_ERROR_IF_LT_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, <, >=, rhs, msg ) /** * @brief Raise a hard error if one value compares less than the other. @@ -640,7 +640,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ERROR_IF_LT_MSG( lhs, rhs, msg ) LOG_GEOS_ERROR_IF_LT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define GEOS_ERROR_IF_LT_MSG( lhs, rhs, msg ) GEOS_LOG_ERROR_IF_LT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) /** * @brief Throw an exception if one value compares less than the other. @@ -649,7 +649,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define LOG_GEOS_THROW_IF_LT_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, <, >=, rhs, msg, TYPE ) +#define GEOS_LOG_THROW_IF_LT_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, <, >=, rhs, msg, TYPE ) /** * @brief Throw an exception if one value compares less than the other. @@ -658,7 +658,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_LT_MSG( lhs, rhs, msg, TYPE ) LOG_GEOS_THROW_IF_LT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +#define GEOS_THROW_IF_LT_MSG( lhs, rhs, msg, TYPE ) GEOS_LOG_THROW_IF_LT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) /** * @brief Raise a hard error if one value compares less than the other. @@ -681,7 +681,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define LOG_GEOS_ERROR_IF_LE_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, <=, >, rhs, msg ) +#define GEOS_LOG_ERROR_IF_LE_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, <=, >, rhs, msg ) /** * @brief Raise a hard error if one value compares less than or equal to the other. @@ -689,7 +689,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ERROR_IF_LE_MSG( lhs, rhs, msg ) LOG_GEOS_ERROR_IF_LE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define GEOS_ERROR_IF_LE_MSG( lhs, rhs, msg ) GEOS_LOG_ERROR_IF_LE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) /** * @brief Throw an exception if one value compares less than or equal to the other. @@ -698,7 +698,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define LOG_GEOS_THROW_IF_LE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, <=, >, rhs, msg, TYPE ) +#define GEOS_LOG_THROW_IF_LE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, <=, >, rhs, msg, TYPE ) /** * @brief Throw an exception if one value compares less than or equal to the other. @@ -707,7 +707,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_LE_MSG( lhs, rhs, msg, TYPE ) LOG_GEOS_THROW_IF_LE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +#define GEOS_THROW_IF_LE_MSG( lhs, rhs, msg, TYPE ) GEOS_LOG_THROW_IF_LE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) /** * @brief Raise a hard error if one value compares less than or equal to the other. From e07d0b72b1ee9d65296d6ed880361afd98b9d519 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Thu, 21 Aug 2025 15:07:34 +0200 Subject: [PATCH 090/173] uncomment the rmoveFile() function --- .../dataRepository/unitTests/testErrorHandling.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index ff9d6ffbb33..369c45780e7 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -241,7 +241,7 @@ TEST( ErrorHandling, testYamlFileOutputFormat ) << "-----------------------\n"; } - // removeFile(); + removeFile(); } } From 785636b34b5b97ee8a1140786a3580dfa3a99b93 Mon Sep 17 00:00:00 2001 From: amandinehry Date: Thu, 21 Aug 2025 15:13:02 +0200 Subject: [PATCH 091/173] stack trace management --- .../common/logger/ErrorHandling.cpp | 4 +- src/coreComponents/schema/schema.xsd | 15 ++- src/coreComponents/schema/schema.xsd.other | 114 ++++++++++++++++-- 3 files changed, 118 insertions(+), 15 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 69375c7f087..30a2501901a 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -32,8 +32,6 @@ static constexpr std::string_view g_level2Start = " - "; static constexpr std::string_view g_level2Next = " "; static constexpr std::string_view g_level3Start = " - "; static constexpr std::string_view g_level3Next = " "; -static constexpr std::string_view g_callStackMessage = - "Callstack could not be retrieved. The format does not match the expected one."; ErrorLogger g_errorLogger{}; @@ -141,7 +139,7 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addCallStackInfo( std::string_vie if( !m_isValidStackTrace ) { - m_sourceCallStack.push_back( std::string( g_callStackMessage ) ); + m_sourceCallStack.push_back( str ); } return *this; diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index aca2fe256fa..09e5b146167 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -595,6 +595,10 @@ + + + + @@ -1399,7 +1403,7 @@ Information output from lower logLevels is added with the desired log level - + @@ -5456,6 +5460,7 @@ Information output from lower logLevels is added with the desired log level + @@ -5548,6 +5553,14 @@ Information output from lower logLevels is added with the desired log level + + + + + + + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 90bd4aacb07..1666ea14250 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -486,7 +486,7 @@ - + @@ -574,6 +574,8 @@ + + @@ -607,6 +609,8 @@ + + @@ -656,6 +660,8 @@ + + @@ -695,6 +701,8 @@ + + @@ -726,6 +734,8 @@ + + @@ -733,6 +743,8 @@ + + @@ -742,6 +754,8 @@ + + @@ -751,6 +765,8 @@ + + @@ -761,6 +777,8 @@ + + @@ -791,6 +809,8 @@ + + @@ -852,6 +872,8 @@ + + @@ -881,6 +903,8 @@ + + @@ -888,6 +912,8 @@ + + @@ -895,6 +921,8 @@ + + @@ -904,6 +932,8 @@ + + @@ -913,6 +943,8 @@ + + @@ -920,6 +952,8 @@ + + @@ -927,6 +961,8 @@ + + @@ -934,6 +970,8 @@ + + @@ -941,6 +979,8 @@ + + @@ -950,6 +990,8 @@ + + @@ -959,6 +1001,8 @@ + + @@ -968,6 +1012,8 @@ + + @@ -977,6 +1023,8 @@ + + @@ -984,6 +1032,8 @@ + + @@ -993,6 +1043,8 @@ + + @@ -1002,6 +1054,8 @@ + + @@ -1009,6 +1063,8 @@ + + @@ -1016,6 +1072,8 @@ + + @@ -1025,6 +1083,8 @@ + + @@ -1032,6 +1092,8 @@ + + @@ -1039,6 +1101,8 @@ + + @@ -1048,6 +1112,8 @@ + + @@ -1057,6 +1123,8 @@ + + @@ -1066,6 +1134,8 @@ + + @@ -1075,6 +1145,8 @@ + + @@ -1084,6 +1156,8 @@ + + @@ -1091,6 +1165,8 @@ + + @@ -1100,6 +1176,8 @@ + + @@ -1109,6 +1187,8 @@ + + @@ -1118,6 +1198,8 @@ + + @@ -1128,6 +1210,8 @@ + + @@ -1139,6 +1223,8 @@ + + @@ -1152,6 +1238,8 @@ + + @@ -1165,6 +1253,8 @@ + + @@ -1178,6 +1268,8 @@ + + @@ -1189,6 +1281,8 @@ + + @@ -1232,6 +1326,8 @@ + + @@ -1249,6 +1345,8 @@ + + @@ -1343,12 +1441,13 @@ - + + @@ -1441,6 +1540,7 @@ + @@ -1886,8 +1986,6 @@ - - @@ -1938,8 +2036,6 @@ - - @@ -1990,8 +2086,6 @@ - - @@ -2042,8 +2136,6 @@ - - @@ -3221,7 +3313,7 @@ - + From e0bad67d8b4a4cf05d9a4c7368406f8daf21d411 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Mon, 15 Sep 2025 11:46:22 +0200 Subject: [PATCH 092/173] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=E2=9C=85=20New=20?= =?UTF-8?q?GEOS=5FERROR=20macros=20with=20context=20included=20+=20new=20u?= =?UTF-8?q?nit=20macro=20unit-test=20+=20testing=20GEOS=5FERROR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/GeosxMacros.hpp | 49 +++++++++ src/coreComponents/common/logger/Logger.hpp | 96 ++++++++++++----- .../common/unitTests/CMakeLists.txt | 1 + .../common/unitTests/testMacros.cpp | 95 ++++++++++++++++ .../unitTests/testErrorHandling.cpp | 101 +++++++++++------- 5 files changed, 282 insertions(+), 60 deletions(-) create mode 100644 src/coreComponents/common/unitTests/testMacros.cpp diff --git a/src/coreComponents/common/GeosxMacros.hpp b/src/coreComponents/common/GeosxMacros.hpp index bf3ab070948..5e2f881ad5c 100644 --- a/src/coreComponents/common/GeosxMacros.hpp +++ b/src/coreComponents/common/GeosxMacros.hpp @@ -133,4 +133,53 @@ void i_g_n_o_r_e( ARGS const & ... ) {} #endif #endif +/** + * @name Parameters processing internal macros + * + * These internal macros allow to craft macros with multiple count of parameters. + */ +///@{ + +/// internal macro for GEOS_DETAIL_MORE_THAN_ONE_ARG +#define GEOS_DETAIL_MORE_THAN_ONE_ARG_VALUE( _00, _01, _02, _03, _04, _05, _06, _07, \ + _08, _09, _10, _11, _12, _13, _14, _15, \ + _INDEX, ... ) _INDEX + +/** + * @return 1 if variadic argument has more than 1 element, 0 otherwise. + * @note Undefined behaviour if variadic argument has more that 16 elements. + */ +#define GEOS_DETAIL_MORE_THAN_ONE_ARG( ... ) \ + GEOS_DETAIL_MORE_THAN_ONE_ARG_VALUE( __VA_ARGS__, \ + true, true, true, true, true, true, true, true, \ + true, true, true, true, true, true, true, false, false ) + +/// internal macros for GEOS_DETAIL_FIRST_ARG +#define GEOS_DETAIL_FIRST_ARG_false( FIRST ) FIRST +#define GEOS_DETAIL_FIRST_ARG_true( FIRST, ... ) FIRST +#define GEOS_DETAIL_FIRST_ARG_FUNC( COND ) GEOS_DETAIL_FIRST_ARG_ ## COND +#define GEOS_DETAIL_FIRST_ARG_DISPATCH( COND, ... ) GEOS_DETAIL_FIRST_ARG_FUNC( COND )(__VA_ARGS__) + +/// internal macros for GEOS_DETAIL_LAST_ARG +#define GEOS_DETAIL_REST_ARGS_false( FIRST ) +#define GEOS_DETAIL_REST_ARGS_true( FIRST, ... ) __VA_ARGS__ +#define GEOS_DETAIL_REST_ARGS_FUNC( COND ) GEOS_DETAIL_REST_ARGS_ ## COND +#define GEOS_DETAIL_REST_ARGS_DISPATCH( COND, ... ) GEOS_DETAIL_REST_ARGS_FUNC( COND )(__VA_ARGS__) + +/** + * @return Return the first parameter of the variadic parameters (__VA_ARGS__). + * @note Undefined behaviour if variadic argument has more that 16 elements. + */ +#define GEOS_DETAIL_FIRST_ARG( ... ) GEOS_DETAIL_FIRST_ARG_DISPATCH( GEOS_DETAIL_MORE_THAN_ONE_ARG( __VA_ARGS__ ), \ + __VA_ARGS__ ) + +/** + * @return Return the parameters following the first of the variadic parameters (__VA_ARGS__). + * @note Undefined behaviour if variadic argument has more that 16 elements. + */ +#define GEOS_DETAIL_REST_ARGS( ... ) GEOS_DETAIL_REST_ARGS_DISPATCH( GEOS_DETAIL_MORE_THAN_ONE_ARG( __VA_ARGS__ ), \ + __VA_ARGS__ ) + +///@} + #endif // GEOS_COMMON_GEOSXMACROS_HPP_ diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index db6c9622e3e..4f939798f5b 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -132,12 +132,48 @@ */ #define GEOS_LOG_RANK_VAR( var ) GEOS_LOG_RANK( #var " = " << var ) +// /** +// * @brief Conditionally raise a hard error and terminate the program. +// * @param EXP an expression that will be evaluated as a predicate +// * @param MSG a message to log (any expression that can be stream inserted) +// */ +// #define GEOS_ERROR_IF_IMPL( EXP, MSG ) \| +// do \| +// { \| +// if( EXP ) \| +// { \| +// std::ostringstream __msgoss; \| +// __msgoss << MSG; \| +// std::string message = __msgoss.str(); \| +// std::ostringstream __oss; \| +// __oss << "***** ERROR\n"; \| +// __oss << "***** LOCATION: " LOCATION "\n"; \| +// __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \| +// __oss << "***** Rank " << ::geos::logger::internal::rankString << ": " << message << "\n"; \| +// std::string stackHistory = LvArray::system::stackTrace( true ); \| +// __oss << stackHistory; \| +// std::cout << __oss.str() << std::endl; \| +// if( g_errorLogger.isOutputFileEnabled() ) \| +// { \| +// ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \| +// message, \| +// __FILE__, \| +// __LINE__ ); \| +// msgStruct.setRank( ::geos::logger::internal::rank ); \| +// msgStruct.addCallStackInfo( stackHistory ); \| +// g_errorLogger.flushErrorMsg( msgStruct ); \| +// } \| +// LvArray::system::callErrorHandler(); \| +// } \| +// } while( false ) + /** * @brief Conditionally raise a hard error and terminate the program. * @param EXP an expression that will be evaluated as a predicate * @param MSG a message to log (any expression that can be stream inserted) + * @param ... One or more DataContext (current error context information) */ -#define GEOS_ERROR_IF_IMPL( EXP, MSG ) \ +#define GEOS_ERROR_CTX_IF( EXP, MSG, ... ) \ do \ { \ if( EXP ) \ @@ -160,6 +196,7 @@ __FILE__, \ __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ + msgStruct.addContextInfo( __VA_ARGS__ ); \ msgStruct.addCallStackInfo( stackHistory ); \ g_errorLogger.flushErrorMsg( msgStruct ); \ } \ @@ -167,19 +204,31 @@ } \ } while( false ) +// /** +// * @brief Conditionally raise a hard error and terminate the program. +// * @param EXP an expression that will be evaluated as a predicate +// * @param msg a message to log (any expression that can be stream inserted) +// */ +// #if defined(GEOS_DEVICE_COMPILE) +// #define GEOS_ERROR_IF( EXP, msg ) GEOS_ERROR_IF_IMPL( EXP, msg ) +// #else +// #define GEOS_ERROR_IF( EXP, msg ) GEOS_ERROR_IF_IMPL( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +// #endif + /** * @brief Conditionally raise a hard error and terminate the program. - * @param EXP an expression that will be evaluated as a predicate - * @param MSG a message to log (any expression that can be stream inserted) - * @param ... One or more DataContext (current error context information) + * @param EXP An expression that will be evaluated as a predicate + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_ERROR_CTX_IF( EXP, MSG, ... ) \ +#define GEOS_ERROR_IF( EXP, ... ) \ do \ { \ if( EXP ) \ { \ std::ostringstream __msgoss; \ - __msgoss << MSG; \ + __msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ std::string message = __msgoss.str(); \ std::ostringstream __oss; \ __oss << "***** ERROR\n"; \ @@ -196,25 +245,14 @@ __FILE__, \ __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ - msgStruct.addContextInfo( __VA_ARGS__ ); \ msgStruct.addCallStackInfo( stackHistory ); \ + msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS(__VA_ARGS__) ); \ g_errorLogger.flushErrorMsg( msgStruct ); \ } \ LvArray::system::callErrorHandler(); \ } \ } while( false ) -/** - * @brief Conditionally raise a hard error and terminate the program. - * @param EXP an expression that will be evaluated as a predicate - * @param msg a message to log (any expression that can be stream inserted) - */ -#if defined(GEOS_DEVICE_COMPILE) -#define GEOS_ERROR_IF( EXP, msg ) GEOS_ERROR_IF_IMPL( EXP, msg ) -#else -#define GEOS_ERROR_IF( EXP, msg ) GEOS_ERROR_IF_IMPL( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) -#endif - /** * @brief Raise a hard error and terminate the program. * @param msg a message to log (any expression that can be stream inserted) @@ -407,11 +445,11 @@ * @param msg The message to diplay. */ #define GEOS_ERROR_IF_OP_MSG( lhs, OP, NOP, rhs, msg ) \ - GEOS_ERROR_IF_IMPL( lhs OP rhs, \ - msg << "\n" << \ - "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ - " " << #lhs << " = " << lhs << "\n" << \ - " " << #rhs << " = " << rhs << "\n" ) + GEOS_ERROR_IF( lhs OP rhs, \ + msg << "\n" << \ + "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ + " " << #lhs << " = " << lhs << "\n" << \ + " " << #rhs << " = " << rhs << "\n" ) /** * @brief Raise a hard error if two values are equal. @@ -736,7 +774,7 @@ * guaranteed. In fact it is only guaranteed to abort the current kernel. */ #if !defined(NDEBUG) -#define GEOS_ASSERT_MSG_IF( EXP, MSG ) GEOS_ERROR_IF_IMPL( !(EXP), MSG ) +#define GEOS_ASSERT_MSG_IF( EXP, MSG ) GEOS_ERROR_IF( !(EXP), MSG ) #else #define GEOS_ASSERT_MSG_IF( EXP, MSG ) ((void) 0) #endif @@ -866,6 +904,16 @@ */ #define GEOS_ASSERT_GE( lhs, rhs ) GEOS_ASSERT_GE_MSG( lhs, rhs, "" ) +/** + * @name Logger utility macros + */ +///@{ +#define GEOS_ERROR_IMPL_ADD_CONTEXT_0( ... ) +#define GEOS_ERROR_IMPL_ADD_CONTEXT_1( ... ) addContextInfo( __VA_ARGS__ ) +#define GEOS_ERROR_IMPL_ADD_CONTEXT_DISPATCH( N ) GEOS_ERROR_IMPL_ADD_CONTEXT_ ## N +#define GEOS_ERROR_IMPL_ADD_CONTEXT_IMPL( N, ... ) GEOS_ERROR_IMPL_ADD_CONTEXT_DISPATCH( N )(__VA_ARGS__) +///@} + namespace geos { diff --git a/src/coreComponents/common/unitTests/CMakeLists.txt b/src/coreComponents/common/unitTests/CMakeLists.txt index a778823f1ac..013ddc465c5 100644 --- a/src/coreComponents/common/unitTests/CMakeLists.txt +++ b/src/coreComponents/common/unitTests/CMakeLists.txt @@ -2,6 +2,7 @@ set( gtest_geosx_tests testDataTypes.cpp testFixedSizeDeque.cpp + testMacros.cpp testMpiWrapper.cpp testTypeDispatch.cpp testLifoStorage.cpp diff --git a/src/coreComponents/common/unitTests/testMacros.cpp b/src/coreComponents/common/unitTests/testMacros.cpp new file mode 100644 index 00000000000..961f5cead15 --- /dev/null +++ b/src/coreComponents/common/unitTests/testMacros.cpp @@ -0,0 +1,95 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 TotalEnergies + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2023-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// Source includes +#include "common/GeosxMacros.hpp" +// TPL includes +#include +#include +// test dependancies +#include + +TEST( testMacros, testArgumentCount ) +{ + EXPECT_EQ( 0, int( GEOS_DETAIL_MORE_THAN_ONE_ARG( 'a' ) ) ); + EXPECT_EQ( 1, int( GEOS_DETAIL_MORE_THAN_ONE_ARG( 'a', 'b' ) ) ); + EXPECT_EQ( 1, int( GEOS_DETAIL_MORE_THAN_ONE_ARG( 'a', 'b', 'c' ) ) ); + + EXPECT_EQ( 1, int( GEOS_DETAIL_MORE_THAN_ONE_ARG( 'a', 'b', 'c', 'd', + 'e', 'f', 'g', 'h', + 'i', 'j', 'k', 'l', + 'w', 'x', 'y', 'z' ) ) ); + + // Expected out of bound (>16 params): wrongly cast the last '!' to integer type + EXPECT_EQ( 33, int( GEOS_DETAIL_MORE_THAN_ONE_ARG( 'a', 'b', 'c', 'd', + 'e', 'f', 'g', 'h', + 'i', 'j', 'k', 'l', + 'w', 'x', 'y', 'z', '!' ) ) ); +} + + +TEST( testMacros, testFirstArgument ) +{ + EXPECT_EQ( 'a', GEOS_DETAIL_FIRST_ARG( 'a' ) ); + EXPECT_EQ( 'a', GEOS_DETAIL_FIRST_ARG( 'a', 'b' ) ); + EXPECT_EQ( 'a', GEOS_DETAIL_FIRST_ARG( 'a', 'b', 'c' ) ); + + EXPECT_EQ( 'a', GEOS_DETAIL_FIRST_ARG( 'a', 'b', 'c', 'd', + 'e', 'f', 'g', 'h', + 'i', 'j', 'k', 'l', + 'w', 'x', 'y', 'z' ) ); + + // Out of bound (>16 params): Cannot compile here, not testable. + // EXPECT_EXIT( GEOS_DETAIL_FIRST_ARG( 'a', 'b', 'c', 'd', + // 'e', 'f', 'g', 'h', + // 'i', 'j', 'k', 'l', + // 'w', 'x', 'y', 'z', '!' ) ); +} + +TEST( testMacros, testRestArguments ) +{ + // no param after the first -> double(void) called -> 0.0 value + EXPECT_EQ( 0.0, double( GEOS_DETAIL_REST_ARGS( 1.0 ) ) ); + + EXPECT_EQ( 2.0, double( GEOS_DETAIL_REST_ARGS( 1.0, 2.0 ) ) ); + + { + auto const generatedArray = std::array< double, 3 >{ GEOS_DETAIL_REST_ARGS( 1.0, 2.0, 3.0, 4.0 ) }; + auto const expectedArray = std::array< double, 3 >{ 2.0, 3.0, 4.0 }; + EXPECT_EQ( generatedArray, expectedArray ); + } + + { + auto const generatedArray = std::array< double, 16 >{ GEOS_DETAIL_REST_ARGS( 01.0, 02.0, 03.0, 04.0, 05.0, 06.0, 07.0, 08.0, + 09.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0 ) }; + auto const expectedArray = std::array< double, 16 >{ 02.0, 03.0, 04.0, 05.0, 06.0, 07.0, 08.0, 09.0, + 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0 }; + EXPECT_EQ( generatedArray, expectedArray ); + } + + // { // Out of bound (>16 params): Cannot compile here, not testable. + // auto const generatedArray = std::array< double, 3 >{ GEOS_DETAIL_REST_ARGS( 01.0, 02.0, 03.0, 04.0, 05.0, 06.0, 07.0, 08.0, + // 09.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0 ) }; + // auto const expectedArray = std::array< double, 3 >{ 02.0, 03.0, 04.0, 05.0, 06.0, 07.0, 08.0, + // 09.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0 }; + // EXPECT_EQ( generatedArray, expectedArray ); + // } +} + +int main( int argc, char * * argv ) +{ + testing::InitGoogleTest( &argc, argv ); + return RUN_ALL_TESTS(); +} diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index 369c45780e7..edca8164da5 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -70,17 +70,17 @@ std::string readFile( std::optional< size_t > startLine = std::nullopt, // separated file bits, which allow us to ignore the absolute path of the workspace ("file:" attribute). // note: "line:" attribute of "sourceLocation:" need to be manually updated if test code changes (to // verify they are correctly reported) -static constexpr std::array< std::string_view, 5 > expectedFileBits = { - R"(errors: +static constexpr std::array< std::string_view, 12 > expectedFileBits = { + R"(errors:)", - - type: Warning + R"(- type: Warning rank: 0 message: >- Conflicting pressure boundary conditions sourceLocation: file: )", R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp - line: 204 + line: 233 sourceCallStack: - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) - frame1: testing::Test::Run() @@ -90,16 +90,16 @@ static constexpr std::array< std::string_view, 5 > expectedFileBits = { - frame5: testing::UnitTest::Run() - frame6: main - frame7: __libc_start_main - - frame8: _start + - frame8: _start)", - - type: Warning + R"(- type: Warning rank: 0 message: >- Pressure value is too small. sourceLocation: file: )", R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp - line: 206 + line: 235 sourceCallStack: - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) - frame1: testing::Test::Run() @@ -109,9 +109,9 @@ static constexpr std::array< std::string_view, 5 > expectedFileBits = { - frame5: testing::UnitTest::Run() - frame6: main - frame7: __libc_start_main - - frame8: _start + - frame8: _start)", - - type: Warning + R"(- type: Warning rank: 0 message: >- Base Test Class (file.xml, l.23): option should be between 1e-06 and 0.001. A value of 1e-06 will be used. @@ -125,7 +125,7 @@ static constexpr std::array< std::string_view, 5 > expectedFileBits = { sourceLocation: file: )", R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp - line: 207 + line: 236 sourceCallStack: - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) - frame1: testing::Test::Run() @@ -135,9 +135,9 @@ static constexpr std::array< std::string_view, 5 > expectedFileBits = { - frame5: testing::UnitTest::Run() - frame6: main - frame7: __libc_start_main - - frame8: _start + - frame8: _start)", - - type: Exception + R"(- type: Exception rank: 0 message: >- Table input error. @@ -155,7 +155,7 @@ static constexpr std::array< std::string_view, 5 > expectedFileBits = { sourceLocation: file: )", R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp - line: 215 + line: 244 sourceCallStack: - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) - frame1: testing::Test::Run() @@ -165,8 +165,37 @@ static constexpr std::array< std::string_view, 5 > expectedFileBits = { - frame5: testing::UnitTest::Run() - frame6: main - frame7: __libc_start_main - - frame8: _start -)" }; + - frame8: _start)", + + R"(- type: Error + rank: 0 + message: >- + Base Test Class (file.xml, l.23): option should be between 1e-06 and 0.001. A value of 1e-06 will be used. + contexts: + - priority: 2 + inputFile: /path/to/file.xml + inputLine: 64 + - priority: 0 + inputFile: /path/to/file.xml + inputLine: 23 + - priority: 0 + inputFile: /path/to/file.xml + inputLine: 32 + sourceLocation: + file: )", + R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp + line: 259 + sourceCallStack: + - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) + - frame1: testing::Test::Run() + - frame2: testing::TestInfo::Run() + - frame3: testing::TestSuite::Run() + - frame4: testing::internal::UnitTestImpl::RunAllTests() + - frame5: testing::UnitTest::Run() + - frame6: main + - frame7: __libc_start_main + - frame8: _start)" +}; static constexpr std::string_view exceptionFormat = R"( message: >- @@ -226,40 +255,40 @@ TEST( ErrorHandling, testYamlFileOutputFormat ) .addContextInfo( importantAdditionalContext.getContextInfo().setPriority( 2 ) ); } g_errorLogger.flushErrorMsg( g_errorLogger.currentErrorMsg() ); + + EXPECT_EXIT( GEOS_ERROR_IF( testValue == 5, + GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", + context.toString(), testMinPrecision, testMaxPrecision, testMinPrecision ), + context, + additionalContext, + importantAdditionalContext.getContextInfo().setPriority( 2 ) ), + ::testing::ExitedWithCode( 1 ), + ".*" ); } - { // read back yaml file and check its formatting + { // read back yaml file and check its content std::string fileContent = readFile(); + bool testFailed = false; for( size_t i = 0; i < expectedFileBits.size(); ++i ) { - auto it = fileContent.find( expectedFileBits[i] ); - EXPECT_NE( it, std::string::npos ) << "Expected bit not found (no." << i << "):\n" - << "-----------------------\n" - << expectedFileBits[i] << '\n' - << "-----------------------\n"; + bool const foundFileBit = fileContent.find( expectedFileBits[i] ) != string::npos; + EXPECT_TRUE( foundFileBit ) << "Expected bit not found (no." << i << "):\n" + << "-----------------------\n" + << expectedFileBits[i] << '\n' + << "-----------------------\n"; + testFailed |= !foundFileBit; } + EXPECT_FALSE( testFailed ) << "Generated error file content:\n" + << "-----------------------\n" + << fileContent << '\n' + << "-----------------------\n"; removeFile(); } } -TEST( ErrorHandling, testErrorBehaviour ) -{ - // Local overriding of global 'g_errorLogger' (to contain test macros effects to local scope) - ErrorLogger g_errorLogger; - - DataFileContext const context = DataFileContext( "Base Test Class", "/path/to/file.xml", 23 ); - - EXPECT_EXIT( GEOS_ERROR_CTX_IF( testValue == 5, - GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.PID {}", - context.toString(), testMinPrecision, testMaxPrecision, testMinPrecision, getpid() ), - context ), - ::testing::ExitedWithCode( 1 ), - ".*" ); -} - int main( int ac, char * av[] ) { ::testing::GTEST_FLAG( death_test_style ) = "threadsafe"; From ab40edc5bb474f0349ddc5e21b2b1afeb0b2ef35 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Thu, 18 Sep 2025 14:23:07 +0200 Subject: [PATCH 093/173] =?UTF-8?q?=E2=9C=85=20=E2=99=BB=EF=B8=8F=20Simpli?= =?UTF-8?q?fying=20+=20testing=20macros=20(GEOS=5FERROR=5F*=20and=20GEOS?= =?UTF-8?q?=5FASSERT=5F*)=20+=20unit=20test=20separation=20for=20multiple?= =?UTF-8?q?=20EXPECT=5FEXIT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/GeosxMacros.hpp | 14 + .../common/logger/ErrorHandling.hpp | 6 + src/coreComponents/common/logger/Logger.hpp | 350 ++++------------ .../unitTests/testErrorHandling.cpp | 386 +++++++++--------- 4 files changed, 290 insertions(+), 466 deletions(-) diff --git a/src/coreComponents/common/GeosxMacros.hpp b/src/coreComponents/common/GeosxMacros.hpp index 5e2f881ad5c..d47514f34bf 100644 --- a/src/coreComponents/common/GeosxMacros.hpp +++ b/src/coreComponents/common/GeosxMacros.hpp @@ -166,6 +166,12 @@ void i_g_n_o_r_e( ARGS const & ... ) {} #define GEOS_DETAIL_REST_ARGS_FUNC( COND ) GEOS_DETAIL_REST_ARGS_ ## COND #define GEOS_DETAIL_REST_ARGS_DISPATCH( COND, ... ) GEOS_DETAIL_REST_ARGS_FUNC( COND )(__VA_ARGS__) +/// internal macros for GEOS_DETAIL_LAST_ARG_PREP +#define GEOS_DETAIL_REST_PREP_ARGS_false( FIRST ) +#define GEOS_DETAIL_REST_PREP_ARGS_true( FIRST, ... ) , __VA_ARGS__ +#define GEOS_DETAIL_REST_PREP_ARGS_FUNC( COND ) GEOS_DETAIL_REST_PREP_ARGS_ ## COND +#define GEOS_DETAIL_REST_PREP_ARGS_DISPATCH( COND, ... ) GEOS_DETAIL_REST_PREP_ARGS_FUNC( COND )(__VA_ARGS__) + /** * @return Return the first parameter of the variadic parameters (__VA_ARGS__). * @note Undefined behaviour if variadic argument has more that 16 elements. @@ -180,6 +186,14 @@ void i_g_n_o_r_e( ARGS const & ... ) {} #define GEOS_DETAIL_REST_ARGS( ... ) GEOS_DETAIL_REST_ARGS_DISPATCH( GEOS_DETAIL_MORE_THAN_ONE_ARG( __VA_ARGS__ ), \ __VA_ARGS__ ) +/** + * @return Return the parameters following the first of the variadic parameters (__VA_ARGS__), + * prepended with a comma when not empty. + * @note Undefined behaviour if variadic argument has more that 16 elements. + */ +#define GEOS_DETAIL_REST_PREP_ARGS( ... ) GEOS_DETAIL_REST_PREP_ARGS_DISPATCH( GEOS_DETAIL_MORE_THAN_ONE_ARG( __VA_ARGS__ ), \ + __VA_ARGS__ ) + ///@} #endif // GEOS_COMMON_GEOSXMACROS_HPP_ diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index db28e2ba927..1b4daa22fed 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -218,6 +218,12 @@ class ErrorLogger void setOutputFilename( std::string_view filename ) { m_filename = filename; } + /** + * @return The file name of the output error file + */ + std::string_view getOutputFilename() + { return m_filename; } + /** * @brief Gives acces to the error message that is currently being constructed, * potencially at various application layers diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 4f939798f5b..0f6505aac21 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -132,59 +132,21 @@ */ #define GEOS_LOG_RANK_VAR( var ) GEOS_LOG_RANK( #var " = " << var ) -// /** -// * @brief Conditionally raise a hard error and terminate the program. -// * @param EXP an expression that will be evaluated as a predicate -// * @param MSG a message to log (any expression that can be stream inserted) -// */ -// #define GEOS_ERROR_IF_IMPL( EXP, MSG ) \| -// do \| -// { \| -// if( EXP ) \| -// { \| -// std::ostringstream __msgoss; \| -// __msgoss << MSG; \| -// std::string message = __msgoss.str(); \| -// std::ostringstream __oss; \| -// __oss << "***** ERROR\n"; \| -// __oss << "***** LOCATION: " LOCATION "\n"; \| -// __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \| -// __oss << "***** Rank " << ::geos::logger::internal::rankString << ": " << message << "\n"; \| -// std::string stackHistory = LvArray::system::stackTrace( true ); \| -// __oss << stackHistory; \| -// std::cout << __oss.str() << std::endl; \| -// if( g_errorLogger.isOutputFileEnabled() ) \| -// { \| -// ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \| -// message, \| -// __FILE__, \| -// __LINE__ ); \| -// msgStruct.setRank( ::geos::logger::internal::rank ); \| -// msgStruct.addCallStackInfo( stackHistory ); \| -// g_errorLogger.flushErrorMsg( msgStruct ); \| -// } \| -// LvArray::system::callErrorHandler(); \| -// } \| -// } while( false ) - /** - * @brief Conditionally raise a hard error and terminate the program. - * @param EXP an expression that will be evaluated as a predicate - * @param MSG a message to log (any expression that can be stream inserted) - * @param ... One or more DataContext (current error context information) + * @brief Implementation of GEOS_ERROR_* and GEOS_ASSERT_* macros. */ -#define GEOS_ERROR_CTX_IF( EXP, MSG, ... ) \ +#define GEOS_ERROR_IF_CAUSE( COND, CAUSE_MESSAGE, ... ) \ do \ { \ - if( EXP ) \ + if( COND ) \ { \ std::ostringstream __msgoss; \ - __msgoss << MSG; \ + __msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ std::string message = __msgoss.str(); \ std::ostringstream __oss; \ __oss << "***** ERROR\n"; \ __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ + __oss << "***** " CAUSE_MESSAGE "\n"; \ __oss << "***** Rank " << ::geos::logger::internal::rankString << ": " << message << "\n"; \ std::string stackHistory = LvArray::system::stackTrace( true ); \ __oss << stackHistory; \ @@ -196,68 +158,32 @@ __FILE__, \ __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ - msgStruct.addContextInfo( __VA_ARGS__ ); \ msgStruct.addCallStackInfo( stackHistory ); \ + msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ g_errorLogger.flushErrorMsg( msgStruct ); \ } \ LvArray::system::callErrorHandler(); \ } \ } while( false ) -// /** -// * @brief Conditionally raise a hard error and terminate the program. -// * @param EXP an expression that will be evaluated as a predicate -// * @param msg a message to log (any expression that can be stream inserted) -// */ -// #if defined(GEOS_DEVICE_COMPILE) -// #define GEOS_ERROR_IF( EXP, msg ) GEOS_ERROR_IF_IMPL( EXP, msg ) -// #else -// #define GEOS_ERROR_IF( EXP, msg ) GEOS_ERROR_IF_IMPL( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) -// #endif - /** * @brief Conditionally raise a hard error and terminate the program. - * @param EXP An expression that will be evaluated as a predicate + * @param COND A condition that causes the error if true. * @param ... Variable arguments with the following structure: * - First mandatory parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_ERROR_IF( EXP, ... ) \ - do \ - { \ - if( EXP ) \ - { \ - std::ostringstream __msgoss; \ - __msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ - std::string message = __msgoss.str(); \ - std::ostringstream __oss; \ - __oss << "***** ERROR\n"; \ - __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << "***** Rank " << ::geos::logger::internal::rankString << ": " << message << "\n"; \ - std::string stackHistory = LvArray::system::stackTrace( true ); \ - __oss << stackHistory; \ - std::cout << __oss.str() << std::endl; \ - if( g_errorLogger.isOutputFileEnabled() ) \ - { \ - ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ - message, \ - __FILE__, \ - __LINE__ ); \ - msgStruct.setRank( ::geos::logger::internal::rank ); \ - msgStruct.addCallStackInfo( stackHistory ); \ - msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS(__VA_ARGS__) ); \ - g_errorLogger.flushErrorMsg( msgStruct ); \ - } \ - LvArray::system::callErrorHandler(); \ - } \ - } while( false ) +#define GEOS_ERROR_IF( COND, ... ) \ + GEOS_ERROR_IF_CAUSE( COND, "Error cause: " STRINGIZE( COND ), __VA_ARGS__ ) + +// TODO: to be deleted +#define GEOS_ERROR_CTX_IF( COND, MSG, ... ) GEOS_ERROR_IF( COND, MSG, __VA_ARGS__ ) /** * @brief Raise a hard error and terminate the program. * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ERROR( msg ) GEOS_ERROR_IF( true, msg ) +#define GEOS_ERROR( ... ) GEOS_ERROR_IF_CAUSE( true, "", __VA_ARGS__ ) /** * @brief Conditionally throw an exception. @@ -440,38 +366,22 @@ * @brief Abort execution if @p lhs @p OP @p rhs. * @param lhs The left side of the operation. * @param OP The operation to apply. - * @param NOP The opposite of @p OP, used in the message. + * @param NOP The operation that caused the error, used in the message (typically opposite of @p OP). * @param rhs The right side of the operation. * @param msg The message to diplay. */ -#define GEOS_ERROR_IF_OP_MSG( lhs, OP, NOP, rhs, msg ) \ - GEOS_ERROR_IF( lhs OP rhs, \ - msg << "\n" << \ - "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ - " " << #lhs << " = " << lhs << "\n" << \ - " " << #rhs << " = " << rhs << "\n" ) - -/** - * @brief Raise a hard error if two values are equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_LOG_ERROR_IF_EQ_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, ==, !=, rhs, msg ) - -/** - * @brief Raise a hard error if two values are equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ERROR_IF_EQ_MSG( lhs, rhs, msg ) GEOS_LOG_ERROR_IF_EQ_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define GEOS_ERROR_IF_OP_MSG( lhs, OP, NOP, rhs, ... ) \ + GEOS_ERROR_IF_CAUSE( lhs OP rhs, \ + "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ + " " << #lhs << " = " << lhs << "\n" << \ + " " << #rhs << " = " << rhs << "\n", \ + __VA_ARGS__ ) /** * @brief Throw an exception if @p lhs @p OP @p rhs. * @param lhs The left side of the operation. * @param OP The operation to apply. - * @param NOP The opposite of @p OP, used in the message. + * @param NOP The operation that caused the error, used in the message (typically opposite of @p OP). * @param rhs The right side of the operation. * @param msg The message to diplay. * @param TYPE the type of exception to throw. @@ -484,13 +394,12 @@ " " << #rhs << " = " << rhs << "\n", TYPE ) /** - * @brief Throw an exception if two values are equal. + * @brief Raise a hard error if two values are equal. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw */ -#define GEOS_LOG_THROW_IF_EQ_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, ==, !=, rhs, msg, TYPE ) +#define GEOS_ERROR_IF_EQ_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, ==, !=, rhs, __VA_ARGS__ ) /** * @brief Raise a hard error if two values are equal. @@ -499,7 +408,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_EQ_MSG( lhs, rhs, msg, TYPE ) GEOS_LOG_THROW_IF_EQ_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +#define GEOS_THROW_IF_EQ_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, ==, !=, rhs, msg, TYPE ) /** * @brief Raise a hard error if two values are equal. @@ -522,24 +431,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_LOG_ERROR_IF_NE_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, !=, ==, rhs, msg ) - -/** - * @brief Raise a hard error if two values are not equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ERROR_IF_NE_MSG( lhs, rhs, msg ) GEOS_LOG_ERROR_IF_NE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) - -/** - * @brief Throw an exception if two values are not equal. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define GEOS_LOG_THROW_IF_NE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, !=, ==, rhs, msg, TYPE ) +#define GEOS_ERROR_IF_NE_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, !=, ==, rhs, __VA_ARGS__ ) /** * @brief Throw an exception if two values are not equal. @@ -548,7 +440,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_NE_MSG( lhs, rhs, msg, TYPE ) GEOS_LOG_THROW_IF_NE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +#define GEOS_THROW_IF_NE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, !=, ==, rhs, msg, TYPE ) /** * @brief Raise a hard error if two values are not equal. @@ -571,15 +463,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_LOG_ERROR_IF_GT_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, >, <=, rhs, msg ) - -/** - * @brief Raise a hard error if one value compares greater than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ERROR_IF_GT_MSG( lhs, rhs, msg ) GEOS_LOG_ERROR_IF_GT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define GEOS_ERROR_IF_GT_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, >, <=, rhs, __VA_ARGS__ ) /** * @brief Throw an exception if one value compares greater than the other. @@ -588,16 +472,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_LOG_THROW_IF_GT_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, >, <=, rhs, msg, TYPE ) - -/** - * @brief Throw an exception if one value compares greater than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define GEOS_THROW_IF_GT_MSG( lhs, rhs, msg, TYPE ) GEOS_LOG_THROW_IF_GT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +#define GEOS_THROW_IF_GT_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, >, <=, rhs, msg, TYPE ) /** * @brief Raise a hard error if one value compares greater than the other. @@ -612,16 +487,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_GT( lhs, rhs, TYPE ) GEOS_ERROR_IF_GT_MSG( lhs, rhs, "", TYPE ) - -/** - * @brief Raise a hard error if one value compares greater than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_LOG_ERROR_IF_GE_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, >=, <, rhs, msg ) - +#define GEOS_THROW_IF_GT( lhs, rhs, TYPE ) GEOS_THROW_IF_GT_MSG( lhs, rhs, "", TYPE ) /** * @brief Raise a hard error if one value compares greater than or equal to the other. @@ -629,16 +495,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ERROR_IF_GE_MSG( lhs, rhs, msg ) GEOS_LOG_ERROR_IF_GE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) - -/** - * @brief Throw an exception if one value compares greater than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define GEOS_LOG_THROW_IF_GE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, >=, <, rhs, msg, TYPE ) +#define GEOS_ERROR_IF_GE_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, >=, <, rhs, __VA_ARGS__ ) /** * @brief Throw an exception if one value compares greater than or equal to the other. @@ -647,7 +504,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_GE_MSG( lhs, rhs, msg, TYPE ) GEOS_LOG_THROW_IF_GE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +#define GEOS_THROW_IF_GE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, >=, <, rhs, msg, TYPE ) /** * @brief Raise a hard error if one value compares greater than or equal to the other. @@ -662,7 +519,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_GE( lhs, rhs, TYPE ) GEOS_ERROR_IF_GE_MSG( lhs, rhs, "", TYPE ) +#define GEOS_THROW_IF_GE( lhs, rhs, TYPE ) GEOS_THROW_IF_GE_MSG( lhs, rhs, "", TYPE ) /** * @brief Raise a hard error if one value compares less than the other. @@ -670,24 +527,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_LOG_ERROR_IF_LT_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, <, >=, rhs, msg ) - -/** - * @brief Raise a hard error if one value compares less than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ERROR_IF_LT_MSG( lhs, rhs, msg ) GEOS_LOG_ERROR_IF_LT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) - -/** - * @brief Throw an exception if one value compares less than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define GEOS_LOG_THROW_IF_LT_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, <, >=, rhs, msg, TYPE ) +#define GEOS_ERROR_IF_LT_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, <, >=, rhs, __VA_ARGS__ ) /** * @brief Throw an exception if one value compares less than the other. @@ -696,7 +536,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_LT_MSG( lhs, rhs, msg, TYPE ) GEOS_LOG_THROW_IF_LT_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +#define GEOS_THROW_IF_LT_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, <, >=, rhs, msg, TYPE ) /** * @brief Raise a hard error if one value compares less than the other. @@ -711,15 +551,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_LT( lhs, rhs, TYPE ) GEOS_ERROR_IF_LT_MSG( lhs, rhs, "", TYPE ) - -/** - * @brief Raise a hard error if one value compares less than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_LOG_ERROR_IF_LE_MSG( lhs, rhs, msg ) GEOS_ERROR_IF_OP_MSG( lhs, <=, >, rhs, msg ) +#define GEOS_THROW_IF_LT( lhs, rhs, TYPE ) GEOS_THROW_IF_LT_MSG( lhs, rhs, "", TYPE ) /** * @brief Raise a hard error if one value compares less than or equal to the other. @@ -727,16 +559,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ERROR_IF_LE_MSG( lhs, rhs, msg ) GEOS_LOG_ERROR_IF_LE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) - -/** - * @brief Throw an exception if one value compares less than or equal to the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define GEOS_LOG_THROW_IF_LE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, <=, >, rhs, msg, TYPE ) +#define GEOS_ERROR_IF_LE_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, <=, >, rhs, __VA_ARGS__ ) /** * @brief Throw an exception if one value compares less than or equal to the other. @@ -745,7 +568,7 @@ * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_LE_MSG( lhs, rhs, msg, TYPE ) GEOS_LOG_THROW_IF_LE_MSG( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +#define GEOS_THROW_IF_LE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, <=, >, rhs, msg, TYPE ) /** * @brief Raise a hard error if one value compares less than or equal to the other. @@ -760,12 +583,16 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_LE( lhs, rhs, TYPE ) GEOS_ERROR_IF_LE_MSG( lhs, rhs, "", TYPE ) +#define GEOS_THROW_IF_LE( lhs, rhs, TYPE ) GEOS_THROW_IF_LE_MSG( lhs, rhs, "", TYPE ) + +#if !defined(NDEBUG) + +#define GEOS_ASSERT_ENABLED /** - * @brief Abort execution if @p EXP is false but only when + * @brief Abort execution if @p COND is false but only when * NDEBUG is not defined.. - * @param EXP The expression to check. + * @param COND The condition to check, causes an error if false. * @param MSG The message to associate with the error, can be anything streamable to a std::ostream. * @note This macro can be used in both host and device code. * @note Tries to provide as much information about the location of the error @@ -773,24 +600,20 @@ * and a stack trace along with the provided message. On device none of this is * guaranteed. In fact it is only guaranteed to abort the current kernel. */ -#if !defined(NDEBUG) -#define GEOS_ASSERT_MSG_IF( EXP, MSG ) GEOS_ERROR_IF( !(EXP), MSG ) +#define GEOS_ASSERT_MSG( COND, ... ) \ + GEOS_ERROR_IF_CAUSE( !( COND ), "Expected: " STRINGIZE( COND ), __VA_ARGS__ ) + #else -#define GEOS_ASSERT_MSG_IF( EXP, MSG ) ((void) 0) -#endif -/** - * @brief Assert a condition in debug builds. - * @param EXP an expression that will be evaluated as a predicate - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ASSERT_MSG( EXP, msg ) GEOS_ASSERT_MSG_IF( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define GEOS_ASSERT_MSG( COND, ... ) ((void) 0) + +#endif /** * @brief Assert a condition in debug builds. - * @param EXP an expression that will be evaluated as a predicate + * @param COND The condition to check, causes an error if false. */ -#define GEOS_ASSERT( EXP ) GEOS_ASSERT_MSG( EXP, "" ) +#define GEOS_ASSERT( COND ) GEOS_ASSERT_MSG( COND, "" ) /** * @brief Abort execution if @p lhs @p OP @p rhs is false. @@ -799,19 +622,13 @@ * @param rhs The right side of the operation. * @param msg The message to diplay. */ -#define GEOS_ASSERT_OP_MSG( lhs, OP, rhs, msg ) \ - GEOS_ASSERT_MSG_IF( lhs OP rhs, \ - msg << "\n" << \ - " " << #lhs << " = " << lhs << "\n" << \ - " " << #rhs << " = " << rhs << "\n" ) +#define GEOS_ASSERT_OP_MSG( lhs, OP, rhs, ... ) \ + GEOS_ERROR_IF_CAUSE( !( lhs OP rhs ), \ + "Expected: " STRINGIZE( COND ) \ + " " << #lhs << " = " << lhs << "\n" << \ + " " << #rhs << " = " << rhs << "\n", \ + __VA_ARGS__ ) -/** - * @brief Assert that two values compare equal in debug builds. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - */ -#define GEOS_ASSERT_EQ_MSG_IF( lhs, rhs, msg ) GEOS_ASSERT_OP_MSG( lhs, ==, rhs, msg ) /** * @brief Assert that two values compare equal in debug builds. @@ -819,7 +636,7 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ASSERT_EQ_MSG( lhs, rhs, msg ) GEOS_ASSERT_EQ_MSG_IF( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define GEOS_ASSERT_EQ_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, ==, rhs, __VA_ARGS__ ) /** * @brief Assert that two values compare equal in debug builds. @@ -834,60 +651,59 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ASSERT_NE_MSG_IF( lhs, rhs, msg ) GEOS_ASSERT_OP_MSG( lhs, !=, rhs, msg ) +#define GEOS_ASSERT_NE_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, !=, rhs, __VA_ARGS__ ) /** * @brief Assert that two values compare not equal in debug builds. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ASSERT_NE_MSG( lhs, rhs, msg ) GEOS_ASSERT_NE_MSG_IF( lhs, rhs, msg ) +#define GEOS_ASSERT_NE( lhs, rhs ) GEOS_ASSERT_NE( lhs, rhs ) /** - * @brief Assert that two values compare not equal in debug builds. + * @brief Assert that one value compares greater than the other in debug builds. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ASSERT_NE_IF( lhs, rhs ) GEOS_ASSERT_NE_MSG( lhs, rhs, "" ) +#define GEOS_ASSERT_GT_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, >, rhs, __VA_ARGS__ ) /** - * @brief Assert that two values compare not equal in debug builds. + * @brief Assert that one value compares greater than the other in debug builds. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison */ -#define GEOS_ASSERT_NE( lhs, rhs ) GEOS_ASSERT_NE_IF( lhs, rhs ) +#define GEOS_ASSERT_GT( lhs, rhs ) GEOS_ASSERT_GT_MSG( lhs, rhs, "" ) /** - * @brief Assert that one value compares greater than the other in debug builds. + * @brief Assert that one value compares greater than or equal to the other in debug builds. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ASSERT_GT_MSG_IF( lhs, rhs, msg ) GEOS_ASSERT_OP_MSG( lhs, >, rhs, msg ) +#define GEOS_ASSERT_GE_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, >=, rhs, __VA_ARGS__ ) /** - * @brief Assert that one value compares greater than the other in debug builds. + * @brief Assert that one value compares greater than or equal to the other in debug builds. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ASSERT_GT_MSG( lhs, rhs, msg ) GEOS_ASSERT_GT_MSG_IF( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define GEOS_ASSERT_GE( lhs, rhs ) GEOS_ASSERT_GE_MSG( lhs, rhs, "" ) /** * @brief Assert that one value compares greater than the other in debug builds. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ASSERT_GT( lhs, rhs ) GEOS_ASSERT_GT_MSG( lhs, rhs, "" ) +#define GEOS_ASSERT_LT_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, <, rhs, __VA_ARGS__ ) /** - * @brief Assert that one value compares greater than or equal to the other in debug builds. + * @brief Assert that one value compares greater than the other in debug builds. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ASSERT_GE_MSG_IF( lhs, rhs, msg ) GEOS_ASSERT_OP_MSG( lhs, >=, rhs, msg ) +#define GEOS_ASSERT_LT( lhs, rhs ) GEOS_ASSERT_LT_MSG( lhs, rhs, "" ) /** * @brief Assert that one value compares greater than or equal to the other in debug builds. @@ -895,24 +711,14 @@ * @param rhs expression to be evaluated and used as right-hand side in comparison * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_ASSERT_GE_MSG( lhs, rhs, msg ) GEOS_ASSERT_GE_MSG_IF( lhs, rhs, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg ) +#define GEOS_ASSERT_LE_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, <=, rhs, __VA_ARGS__ ) /** * @brief Assert that one value compares greater than or equal to the other in debug builds. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison */ -#define GEOS_ASSERT_GE( lhs, rhs ) GEOS_ASSERT_GE_MSG( lhs, rhs, "" ) - -/** - * @name Logger utility macros - */ -///@{ -#define GEOS_ERROR_IMPL_ADD_CONTEXT_0( ... ) -#define GEOS_ERROR_IMPL_ADD_CONTEXT_1( ... ) addContextInfo( __VA_ARGS__ ) -#define GEOS_ERROR_IMPL_ADD_CONTEXT_DISPATCH( N ) GEOS_ERROR_IMPL_ADD_CONTEXT_ ## N -#define GEOS_ERROR_IMPL_ADD_CONTEXT_IMPL( N, ... ) GEOS_ERROR_IMPL_ADD_CONTEXT_DISPATCH( N )(__VA_ARGS__) -///@} +#define GEOS_ASSERT_LE( lhs, rhs ) GEOS_ASSERT_LE_MSG( lhs, rhs, "" ) namespace geos { @@ -1016,7 +822,7 @@ extern std::ostream * rankStream; #if defined(GEOS_USE_MPI) extern MPI_Comm comm; #endif -} // namespace internal +} // namespace internal #if defined(GEOS_USE_MPI) /** @@ -1038,7 +844,7 @@ void InitializeLogger( const std::string & rank_output_dir="" ); */ void FinalizeLogger(); -} // namespace logger +} // namespace logger } // namespace geos diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index edca8164da5..440b6d6d455 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -23,95 +23,119 @@ using namespace geos; using namespace dataRepository; -static constexpr std::string_view filename = "errorsOutput.yaml"; - namespace fs = std::filesystem; -void removeFile() +// declare a constant which value is the source file line (to predict the error file output). +#define GET_LINE( lineVar ) static size_t constexpr lineVar = __LINE__ + +// various dummy test values and contexts +double testMinPrecision = 1e-6; +double testMaxPrecision = 1e-3; +int testValue = 5; +DataFileContext const context = DataFileContext( "Base Test Class", "/path/to/file.xml", 23 ); +DataFileContext const additionalContext = DataFileContext( "Additional Test Class", "/path/to/file.xml", 32 ); +DataFileContext const importantAdditionalContext = DataFileContext( "Important Additional Test Class", "/path/to/file.xml", 64 ); + +/** + * @brief begin a test with a local logger + * @param errorLogger local error logger instance + * @param filename output error filename + */ +void beginLocalLoggerTest( ErrorLogger & errorLogger, string_view filename ) { - if( fs::exists( filename ) ) - { - fs::remove( filename ); - } + errorLogger.enableFileOutput( true ); + errorLogger.setOutputFilename( filename ); + errorLogger.createFile(); } - -std::string readFile( std::optional< size_t > startLine = std::nullopt, - std::optional< size_t > endLine = std::nullopt ) +/** + * @brief end the local logger test by reading the logger file output, comparing it to a reference, and removing it. + * @param errorLogger local error logger instance + * @param expectedFileBits reference file parts that must be in the logger file output + */ +void endLocalLoggerTest( ErrorLogger & errorLogger, + std::vector< string > expectedFileBits ) { - if( !fs::exists( filename )) - { - throw std::runtime_error( "File not found: " + std::string( filename ) ); - } + auto const readFile = [] ( string_view filename ) { + if( !fs::exists( filename )) + throw std::runtime_error( "File not found: " + std::string( filename ) ); - std::ifstream file{ std::string( filename ) }; - if( !file.is_open()) - { - throw std::runtime_error( "Failed to open file: " + std::string( filename ) ); - } + std::ifstream file{ std::string( filename ) }; + if( !file.is_open()) + throw std::runtime_error( "Failed to open file: " + std::string( filename ) ); - std::stringstream buffer; - std::string line; - size_t currentLine = 0; + std::stringstream buffer; + std::string line; + while( std::getline( file, line )) + buffer << line << '\n'; - while( std::getline( file, line )) + return buffer.str(); + }; + + string_view filename = errorLogger.getOutputFilename(); + string fileContent = readFile( filename ); + bool testFailed = false; + for( size_t i = 0; i < expectedFileBits.size(); ++i ) { - if((!startLine || currentLine >= *startLine) && - (!endLine || currentLine < *endLine)) - { - buffer << line << '\n'; - } - currentLine++; + bool const foundFileBit = fileContent.find( expectedFileBits[i] ) != string::npos; + EXPECT_TRUE( foundFileBit ) << "Expected bit not found (no." << i << "):\n" + << "-----------------------\n" + << expectedFileBits[i] << '\n' + << "-----------------------\n"; + testFailed |= !foundFileBit; } + EXPECT_FALSE( testFailed ) << "Generated error file content:\n" + << "-----------------------\n" + << fileContent << '\n' + << "-----------------------\n"; - return buffer.str(); + if( fs::exists( filename ) ) + fs::remove( filename ); } -// separated file bits, which allow us to ignore the absolute path of the workspace ("file:" attribute). -// note: "line:" attribute of "sourceLocation:" need to be manually updated if test code changes (to -// verify they are correctly reported) -static constexpr std::array< std::string_view, 12 > expectedFileBits = { - R"(errors:)", +TEST( ErrorHandling, testYamlFileWarningOutput ) +{ + ErrorLogger g_errorLogger; // Local overriding of global 'g_errorLogger' (to contain test macros effects to local scope) + beginLocalLoggerTest( g_errorLogger, "warningTestOutput.yaml" ); + + GET_LINE( line1 ); GEOS_WARNING( "Conflicting pressure boundary conditions" ); + + GET_LINE( line2 ); GEOS_WARNING_IF( testValue == 5, "Pressure value is too small." ); + + GET_LINE( line3 ); GEOS_WARNING_CTX_IF( testValue == 5, + GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", + context.toString(), testMinPrecision, testMaxPrecision, testMinPrecision ), + context, additionalContext ); - R"(- type: Warning + endLocalLoggerTest( g_errorLogger, { + R"(errors:)", + + GEOS_FMT( + R"(- type: Warning rank: 0 message: >- Conflicting pressure boundary conditions sourceLocation: - file: )", - R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp - line: 233 + file: {} + line: {} sourceCallStack: - - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) - - frame1: testing::Test::Run() - - frame2: testing::TestInfo::Run() - - frame3: testing::TestSuite::Run() - - frame4: testing::internal::UnitTestImpl::RunAllTests() - - frame5: testing::UnitTest::Run() - - frame6: main - - frame7: __libc_start_main - - frame8: _start)", - - R"(- type: Warning + - frame0: )", + __FILE__, line1 ), + + GEOS_FMT( + R"(- type: Warning rank: 0 message: >- Pressure value is too small. sourceLocation: - file: )", - R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp - line: 235 + file: {} + line: {} sourceCallStack: - - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) - - frame1: testing::Test::Run() - - frame2: testing::TestInfo::Run() - - frame3: testing::TestSuite::Run() - - frame4: testing::internal::UnitTestImpl::RunAllTests() - - frame5: testing::UnitTest::Run() - - frame6: main - - frame7: __libc_start_main - - frame8: _start)", - - R"(- type: Warning + - frame0: )", + __FILE__, line2 ), + + GEOS_FMT( + R"(- type: Warning rank: 0 message: >- Base Test Class (file.xml, l.23): option should be between 1e-06 and 0.001. A value of 1e-06 will be used. @@ -123,21 +147,43 @@ static constexpr std::array< std::string_view, 12 > expectedFileBits = { inputFile: /path/to/file.xml inputLine: 32 sourceLocation: - file: )", - R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp - line: 236 + file: {} + line: {} sourceCallStack: - - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) - - frame1: testing::Test::Run() - - frame2: testing::TestInfo::Run() - - frame3: testing::TestSuite::Run() - - frame4: testing::internal::UnitTestImpl::RunAllTests() - - frame5: testing::UnitTest::Run() - - frame6: main - - frame7: __libc_start_main - - frame8: _start)", - - R"(- type: Exception + - frame0: )", + __FILE__, line3 ), + } ); +} + +TEST( ErrorHandling, testYamlFileExceptionOutput ) +{ + ErrorLogger g_errorLogger; // Local overriding of global 'g_errorLogger' (to contain test macros effects to local scope) + beginLocalLoggerTest( g_errorLogger, "exceptionTestOutput.yaml" ); + size_t line1; + + // Stacked exception test (contexts must appear sorted by priority) + try + { + line1 = __LINE__; GEOS_THROW_CTX_IF( testValue == 5, + "Group " << context.toString() << " has no wrapper named" << std::endl, + std::domain_error, + context.getContextInfo().setPriority( 1 ) ); + } + catch( std::domain_error const & ex ) + { + string const errorMsg = "Table input error.\n"; + g_errorLogger.currentErrorMsg() + .addToMsg( errorMsg ) + .addContextInfo( additionalContext.getContextInfo() ) + .addContextInfo( importantAdditionalContext.getContextInfo().setPriority( 2 ) ); + } + g_errorLogger.flushErrorMsg( g_errorLogger.currentErrorMsg() ); + + endLocalLoggerTest( g_errorLogger, { + R"(errors:)", + + GEOS_FMT( + R"(- type: Exception rank: 0 message: >- Table input error. @@ -153,24 +199,36 @@ static constexpr std::array< std::string_view, 12 > expectedFileBits = { inputFile: /path/to/file.xml inputLine: 32 sourceLocation: - file: )", - R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp - line: 244 + file: {} + line: {} sourceCallStack: - - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) - - frame1: testing::Test::Run() - - frame2: testing::TestInfo::Run() - - frame3: testing::TestSuite::Run() - - frame4: testing::internal::UnitTestImpl::RunAllTests() - - frame5: testing::UnitTest::Run() - - frame6: main - - frame7: __libc_start_main - - frame8: _start)", - - R"(- type: Error + - frame0: )", + __FILE__, line1 ), + } ); +} + +TEST( ErrorHandling, testYamlFileErrorOutput ) +{ + ErrorLogger g_errorLogger; // Local overriding of global 'g_errorLogger' (to contain test macros effects to local scope) + beginLocalLoggerTest( g_errorLogger, "errorTestOutput.yaml" ); + + GET_LINE( line1 ); EXPECT_EXIT( GEOS_ERROR_IF( testValue > testMaxPrecision || testValue < testMinPrecision, + GEOS_FMT( "{}: option should be between {} and {}.", + context.toString(), testMinPrecision, testMaxPrecision ), + context, + additionalContext, + importantAdditionalContext.getContextInfo().setPriority( 2 ) ), + ::testing::ExitedWithCode( 1 ), + ".*" ); + + endLocalLoggerTest( g_errorLogger, { + R"(errors:)", + + GEOS_FMT( + R"(- type: Error rank: 0 message: >- - Base Test Class (file.xml, l.23): option should be between 1e-06 and 0.001. A value of 1e-06 will be used. + Base Test Class (file.xml, l.23): option should be between 1e-06 and 0.001. contexts: - priority: 2 inputFile: /path/to/file.xml @@ -182,112 +240,52 @@ static constexpr std::array< std::string_view, 12 > expectedFileBits = { inputFile: /path/to/file.xml inputLine: 32 sourceLocation: - file: )", - R"(src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp - line: 259 + file: {} + line: {} sourceCallStack: - - frame0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) - - frame1: testing::Test::Run() - - frame2: testing::TestInfo::Run() - - frame3: testing::TestSuite::Run() - - frame4: testing::internal::UnitTestImpl::RunAllTests() - - frame5: testing::UnitTest::Run() - - frame6: main - - frame7: __libc_start_main - - frame8: _start)" -}; - -static constexpr std::string_view exceptionFormat = - R"( message: >- - Table input error. - Group Base Test Class (file.xml, l.23) has no wrapper named + - frame0: )", + __FILE__, line1 ), + } ); +} + +#ifdef GEOS_ASSERT_ENABLED +TEST( ErrorHandling, testYamlFileAssertOutput ) +{ + ErrorLogger g_errorLogger; // Local overriding of global 'g_errorLogger' (to contain test macros effects to local scope) + beginLocalLoggerTest( g_errorLogger, "assertTestOutput.yaml" ); + + GET_LINE( line1 ); EXPECT_EXIT( GEOS_ASSERT_LT_MSG( testValue, testMaxPrecision, + GEOS_FMT( "{}: option should be lower than {}.", + context.toString(), testMaxPrecision ), + context, + additionalContext ), + ::testing::ExitedWithCode( 1 ), + ".*" ); + + endLocalLoggerTest( g_errorLogger, { + R"(errors:)", + + GEOS_FMT( + R"(- type: Error + rank: 0 + message: >- + Base Test Class (file.xml, l.23): option should be lower than 0.001. contexts: - - priority: 2 + - priority: 0 inputFile: /path/to/file.xml inputLine: 23 -)"; - -double testMinPrecision = 1e-6; -double testMaxPrecision = 1e-3; -int testValue = 5; - -TEST( ErrorHandling, testYamlFileOutputFormat ) -{ - { // building the error yaml test case file - // Local overriding of global 'g_errorLogger' (to contain test macros effects to local scope) - ErrorLogger g_errorLogger; - - g_errorLogger.enableFileOutput( true ); - g_errorLogger.setOutputFilename( filename ); - - DataFileContext const context = DataFileContext( "Base Test Class", "/path/to/file.xml", 23 ); - DataFileContext const additionalContext = DataFileContext( "Additional Test Class", "/path/to/file.xml", 32 ); - DataFileContext const importantAdditionalContext = DataFileContext( "Additional Test Class", "/path/to/file.xml", 64 ); - - if( g_errorLogger.isOutputFileEnabled() ) - { - g_errorLogger.createFile(); - } - - // Warning tests - GEOS_WARNING( "Conflicting pressure boundary conditions" ); - - GEOS_WARNING_IF( testValue == 5, "Pressure value is too small." ); - GEOS_WARNING_CTX_IF( testValue == 5, - GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", - context.toString(), testMinPrecision, testMaxPrecision, testMinPrecision ), - context, additionalContext ); - - // Stacked exception test (contexts must appear sorted by priority) - try - { - GEOS_THROW_CTX_IF( testValue == 5, - "Group " << context.toString() << " has no wrapper named" << std::endl, - std::domain_error, - context.getContextInfo().setPriority( 1 ) ); - } - catch( std::domain_error const & ex ) - { - string const errorMsg = "Table input error.\n"; - g_errorLogger.currentErrorMsg() - .addToMsg( errorMsg ) - .addContextInfo( additionalContext.getContextInfo() ) - .addContextInfo( importantAdditionalContext.getContextInfo().setPriority( 2 ) ); - } - g_errorLogger.flushErrorMsg( g_errorLogger.currentErrorMsg() ); - - EXPECT_EXIT( GEOS_ERROR_IF( testValue == 5, - GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", - context.toString(), testMinPrecision, testMaxPrecision, testMinPrecision ), - context, - additionalContext, - importantAdditionalContext.getContextInfo().setPriority( 2 ) ), - ::testing::ExitedWithCode( 1 ), - ".*" ); - } - - - { // read back yaml file and check its content - std::string fileContent = readFile(); - bool testFailed = false; - - for( size_t i = 0; i < expectedFileBits.size(); ++i ) - { - bool const foundFileBit = fileContent.find( expectedFileBits[i] ) != string::npos; - EXPECT_TRUE( foundFileBit ) << "Expected bit not found (no." << i << "):\n" - << "-----------------------\n" - << expectedFileBits[i] << '\n' - << "-----------------------\n"; - testFailed |= !foundFileBit; - } - EXPECT_FALSE( testFailed ) << "Generated error file content:\n" - << "-----------------------\n" - << fileContent << '\n' - << "-----------------------\n"; - - removeFile(); - } + - priority: 0 + inputFile: /path/to/file.xml + inputLine: 32 + sourceLocation: + file: {} + line: {} + sourceCallStack: + - frame0: )", + __FILE__, line1 ), + } ); } +#endif int main( int ac, char * av[] ) { From faa84faf9159626fa074ca3cf041729c25de28d4 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Thu, 18 Sep 2025 14:36:59 +0200 Subject: [PATCH 094/173] =?UTF-8?q?=F0=9F=93=9D=20adding=20macro=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/Logger.hpp | 80 ++++++++++++++++----- 1 file changed, 61 insertions(+), 19 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 0f6505aac21..9ead267bfea 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -133,7 +133,13 @@ #define GEOS_LOG_RANK_VAR( var ) GEOS_LOG_RANK( #var " = " << var ) /** - * @brief Implementation of GEOS_ERROR_* and GEOS_ASSERT_* macros. + * @brief Conditionally raise a hard error and terminate the program. + * Implementation of GEOS_ERROR_* and GEOS_ASSERT_* macros. + * @param COND A condition that causes the error if true. + * @param CAUSE_MESSAGE The condition that caused the error, in a readable text format for the user. + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ERROR_IF_CAUSE( COND, CAUSE_MESSAGE, ... ) \ do \ @@ -181,7 +187,9 @@ /** * @brief Raise a hard error and terminate the program. - * @param msg a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ERROR( ... ) GEOS_ERROR_IF_CAUSE( true, "", __VA_ARGS__ ) @@ -368,7 +376,9 @@ * @param OP The operation to apply. * @param NOP The operation that caused the error, used in the message (typically opposite of @p OP). * @param rhs The right side of the operation. - * @param msg The message to diplay. + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ERROR_IF_OP_MSG( lhs, OP, NOP, rhs, ... ) \ GEOS_ERROR_IF_CAUSE( lhs OP rhs, \ @@ -397,7 +407,9 @@ * @brief Raise a hard error if two values are equal. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ERROR_IF_EQ_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, ==, !=, rhs, __VA_ARGS__ ) @@ -405,7 +417,9 @@ * @brief Raise a hard error if two values are equal. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) * @param TYPE the type of exception to throw */ #define GEOS_THROW_IF_EQ_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, ==, !=, rhs, msg, TYPE ) @@ -429,7 +443,9 @@ * @brief Raise a hard error if two values are not equal. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ERROR_IF_NE_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, !=, ==, rhs, __VA_ARGS__ ) @@ -461,7 +477,9 @@ * @brief Raise a hard error if one value compares greater than the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ERROR_IF_GT_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, >, <=, rhs, __VA_ARGS__ ) @@ -469,7 +487,9 @@ * @brief Throw an exception if one value compares greater than the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) * @param TYPE the type of exception to throw */ #define GEOS_THROW_IF_GT_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, >, <=, rhs, msg, TYPE ) @@ -493,7 +513,9 @@ * @brief Raise a hard error if one value compares greater than or equal to the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ERROR_IF_GE_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, >=, <, rhs, __VA_ARGS__ ) @@ -525,7 +547,9 @@ * @brief Raise a hard error if one value compares less than the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ERROR_IF_LT_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, <, >=, rhs, __VA_ARGS__ ) @@ -557,7 +581,9 @@ * @brief Raise a hard error if one value compares less than or equal to the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ERROR_IF_LE_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, <=, >, rhs, __VA_ARGS__ ) @@ -593,7 +619,9 @@ * @brief Abort execution if @p COND is false but only when * NDEBUG is not defined.. * @param COND The condition to check, causes an error if false. - * @param MSG The message to associate with the error, can be anything streamable to a std::ostream. + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) * @note This macro can be used in both host and device code. * @note Tries to provide as much information about the location of the error * as possible. On host this should result in the file and line of the error @@ -620,7 +648,9 @@ * @param lhs The left side of the operation. * @param OP The operation to apply. * @param rhs The right side of the operation. - * @param msg The message to diplay. + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ASSERT_OP_MSG( lhs, OP, rhs, ... ) \ GEOS_ERROR_IF_CAUSE( !( lhs OP rhs ), \ @@ -634,7 +664,9 @@ * @brief Assert that two values compare equal in debug builds. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ASSERT_EQ_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, ==, rhs, __VA_ARGS__ ) @@ -649,7 +681,9 @@ * @brief Assert that two values compare not equal in debug builds. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ASSERT_NE_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, !=, rhs, __VA_ARGS__ ) @@ -664,7 +698,9 @@ * @brief Assert that one value compares greater than the other in debug builds. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ASSERT_GT_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, >, rhs, __VA_ARGS__ ) @@ -679,7 +715,9 @@ * @brief Assert that one value compares greater than or equal to the other in debug builds. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ASSERT_GE_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, >=, rhs, __VA_ARGS__ ) @@ -694,7 +732,9 @@ * @brief Assert that one value compares greater than the other in debug builds. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ASSERT_LT_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, <, rhs, __VA_ARGS__ ) @@ -709,7 +749,9 @@ * @brief Assert that one value compares greater than or equal to the other in debug builds. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ASSERT_LE_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, <=, rhs, __VA_ARGS__ ) From dd97f0e53f1548f18d3681128814c4b508a01252 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Thu, 18 Sep 2025 17:34:26 +0200 Subject: [PATCH 095/173] =?UTF-8?q?=E2=9C=A8=20=E2=9C=85=20adding=20error?= =?UTF-8?q?=20cause=20in=20unit=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/logger/ErrorHandling.cpp | 13 ++++++ .../common/logger/ErrorHandling.hpp | 11 ++++- src/coreComponents/common/logger/Logger.hpp | 42 +++++++++---------- .../unitTests/testErrorHandling.cpp | 36 ++++++++++------ 4 files changed, 66 insertions(+), 36 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 30a2501901a..7a10eceb148 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -107,6 +107,12 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setType( ErrorLogger::MsgType msg return *this; } +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setCause( std::string_view cause ) +{ + m_cause = cause; + return *this; +} + void ErrorLogger::ErrorMsg::addContextInfoImpl( ErrorLogger::ErrorContext && ctxInfo ) { m_contextsInfo.emplace_back( std::move( ctxInfo ) ); @@ -216,6 +222,13 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) } } + // error cause + if( !errorMsg.m_cause.empty() ) + { + yamlFile << g_level1Next << "cause: >-\n"; + streamMultilineYamlAttribute( errorMsg.m_cause, yamlFile, g_level2Next ); + } + // Location of the error in the code yamlFile << g_level1Next << "sourceLocation:\n"; yamlFile << g_level2Next << "file: " << errorMsg.m_file << "\n"; diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 1b4daa22fed..249ca67d56b 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -97,8 +97,10 @@ class ErrorLogger { /// the error type (Warning, Error or Exception) MsgType m_type = ErrorLogger::MsgType::Undefined; - /// the erreur message that can be completed + /// the error message that can be completed std::string m_msg; + /// the cause of the error (erroneous condition, failed assertion...) if identified (optional) + std::string m_cause; /// the source location file corresponding to the error in the code std::string m_file; /// the source location line corresponding to the error in the code (default is 0) @@ -158,6 +160,13 @@ class ErrorLogger */ ErrorMsg & setType( MsgType msgType ); + /** + * @brief Set the cause of the error + * @param cause See documentation of m_cause. + * @return The reference to the current instance + */ + ErrorMsg & setCause( std::string_view cause ); + /** * @brief Set the rank on which the error is raised * @param rank the value to asign diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 9ead267bfea..eaa06cd085d 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -152,7 +152,7 @@ std::ostringstream __oss; \ __oss << "***** ERROR\n"; \ __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** " CAUSE_MESSAGE "\n"; \ + __oss << "***** " << CAUSE_MESSAGE << "\n"; \ __oss << "***** Rank " << ::geos::logger::internal::rankString << ": " << message << "\n"; \ std::string stackHistory = LvArray::system::stackTrace( true ); \ __oss << stackHistory; \ @@ -164,6 +164,7 @@ __FILE__, \ __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ + msgStruct.setCause( CAUSE_MESSAGE ); \ msgStruct.addCallStackInfo( stackHistory ); \ msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ g_errorLogger.flushErrorMsg( msgStruct ); \ @@ -382,9 +383,8 @@ */ #define GEOS_ERROR_IF_OP_MSG( lhs, OP, NOP, rhs, ... ) \ GEOS_ERROR_IF_CAUSE( lhs OP rhs, \ - "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ - " " << #lhs << " = " << lhs << "\n" << \ - " " << #rhs << " = " << rhs << "\n", \ + GEOS_FMT( "Expected: " #lhs " " #NOP " " #rhs "\n* " #lhs " = {}\n* " #rhs " = {}\n", \ + lhs, rhs ), \ __VA_ARGS__ ) /** @@ -611,13 +611,12 @@ */ #define GEOS_THROW_IF_LE( lhs, rhs, TYPE ) GEOS_THROW_IF_LE_MSG( lhs, rhs, "", TYPE ) -#if !defined(NDEBUG) +#if !defined(NDEBUG) || defined(GEOS_ASSERT_ENABLED) #define GEOS_ASSERT_ENABLED /** - * @brief Abort execution if @p COND is false but only when - * NDEBUG is not defined.. + * @brief Abort execution if @p COND is false but only when NDEBUG is not defined.. * @param COND The condition to check, causes an error if false. * @param ... Variable arguments with the following structure: * - First mandatory parameter, the message to log (must be streamable) @@ -631,18 +630,6 @@ #define GEOS_ASSERT_MSG( COND, ... ) \ GEOS_ERROR_IF_CAUSE( !( COND ), "Expected: " STRINGIZE( COND ), __VA_ARGS__ ) -#else - -#define GEOS_ASSERT_MSG( COND, ... ) ((void) 0) - -#endif - -/** - * @brief Assert a condition in debug builds. - * @param COND The condition to check, causes an error if false. - */ -#define GEOS_ASSERT( COND ) GEOS_ASSERT_MSG( COND, "" ) - /** * @brief Abort execution if @p lhs @p OP @p rhs is false. * @param lhs The left side of the operation. @@ -654,11 +641,22 @@ */ #define GEOS_ASSERT_OP_MSG( lhs, OP, rhs, ... ) \ GEOS_ERROR_IF_CAUSE( !( lhs OP rhs ), \ - "Expected: " STRINGIZE( COND ) \ - " " << #lhs << " = " << lhs << "\n" << \ - " " << #rhs << " = " << rhs << "\n", \ + GEOS_FMT( "Expected: " #lhs " " #OP " " #rhs "\n* " #lhs " = {}\n* " #rhs " = {}\n", \ + lhs, rhs ), \ __VA_ARGS__ ) +#else + +#define GEOS_ASSERT_MSG( ... ) ((void) 0) +#define GEOS_ASSERT_OP_MSG( ... ) ((void) 0) + +#endif + +/** + * @brief Assert a condition in debug builds. + * @param COND The condition to check, causes an error if false. + */ +#define GEOS_ASSERT( COND ) GEOS_ASSERT_MSG( COND, "" ) /** * @brief Assert that two values compare equal in debug builds. diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index 440b6d6d455..994b3f80f88 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -12,6 +12,10 @@ * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ + +// forcefully enable asserts macros for this unit test +#define GEOS_ASSERT_ENABLED + #include "common/logger/ErrorHandling.hpp" #include "common/logger/Logger.hpp" #include "dataRepository/DataContext.hpp" @@ -212,12 +216,12 @@ TEST( ErrorHandling, testYamlFileErrorOutput ) ErrorLogger g_errorLogger; // Local overriding of global 'g_errorLogger' (to contain test macros effects to local scope) beginLocalLoggerTest( g_errorLogger, "errorTestOutput.yaml" ); - GET_LINE( line1 ); EXPECT_EXIT( GEOS_ERROR_IF( testValue > testMaxPrecision || testValue < testMinPrecision, - GEOS_FMT( "{}: option should be between {} and {}.", - context.toString(), testMinPrecision, testMaxPrecision ), - context, - additionalContext, - importantAdditionalContext.getContextInfo().setPriority( 2 ) ), + GET_LINE( line1 ); EXPECT_EXIT( GEOS_ERROR_IF_GT_MSG( testValue, testMaxPrecision, + GEOS_FMT( "{}: option should be lower than {}.", + context.toString(), testMaxPrecision ), + context, + additionalContext, + importantAdditionalContext.getContextInfo().setPriority( 2 ) ), ::testing::ExitedWithCode( 1 ), ".*" ); @@ -228,7 +232,7 @@ TEST( ErrorHandling, testYamlFileErrorOutput ) R"(- type: Error rank: 0 message: >- - Base Test Class (file.xml, l.23): option should be between 1e-06 and 0.001. + Base Test Class (file.xml, l.23): option should be lower than 0.001. contexts: - priority: 2 inputFile: /path/to/file.xml @@ -239,6 +243,10 @@ TEST( ErrorHandling, testYamlFileErrorOutput ) - priority: 0 inputFile: /path/to/file.xml inputLine: 32 + cause: >- + Expected: testValue <= testMaxPrecision + * testValue = 5 + * testMaxPrecision = 0.001 sourceLocation: file: {} line: {} @@ -254,11 +262,11 @@ TEST( ErrorHandling, testYamlFileAssertOutput ) ErrorLogger g_errorLogger; // Local overriding of global 'g_errorLogger' (to contain test macros effects to local scope) beginLocalLoggerTest( g_errorLogger, "assertTestOutput.yaml" ); - GET_LINE( line1 ); EXPECT_EXIT( GEOS_ASSERT_LT_MSG( testValue, testMaxPrecision, - GEOS_FMT( "{}: option should be lower than {}.", - context.toString(), testMaxPrecision ), - context, - additionalContext ), + GET_LINE( line1 ); EXPECT_EXIT( GEOS_ASSERT_MSG( testValue > testMinPrecision && testValue < testMaxPrecision, + GEOS_FMT( "{}: value should be between {} and {}, but is {}.", + context.toString(), testMinPrecision, testMaxPrecision, testValue ), + context, + additionalContext ), ::testing::ExitedWithCode( 1 ), ".*" ); @@ -269,7 +277,7 @@ TEST( ErrorHandling, testYamlFileAssertOutput ) R"(- type: Error rank: 0 message: >- - Base Test Class (file.xml, l.23): option should be lower than 0.001. + Base Test Class (file.xml, l.23): value should be between 1e-06 and 0.001, but is 5. contexts: - priority: 0 inputFile: /path/to/file.xml @@ -277,6 +285,8 @@ TEST( ErrorHandling, testYamlFileAssertOutput ) - priority: 0 inputFile: /path/to/file.xml inputLine: 32 + cause: >- + Expected: testValue > testMinPrecision && testValue < testMaxPrecision sourceLocation: file: {} line: {} From d708cac377b1d5451c3defb9775c23a8b4aa6668 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Thu, 18 Sep 2025 17:52:03 +0200 Subject: [PATCH 096/173] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20reordered=20error?= =?UTF-8?q?=20&=20throw=20macro=20to=20group=20them?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/Logger.hpp | 155 ++++++++++---------- 1 file changed, 78 insertions(+), 77 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index eaa06cd085d..4e3d955512a 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -387,22 +387,6 @@ lhs, rhs ), \ __VA_ARGS__ ) -/** - * @brief Throw an exception if @p lhs @p OP @p rhs. - * @param lhs The left side of the operation. - * @param OP The operation to apply. - * @param NOP The operation that caused the error, used in the message (typically opposite of @p OP). - * @param rhs The right side of the operation. - * @param msg The message to diplay. - * @param TYPE the type of exception to throw. - */ -#define GEOS_THROW_IF_OP_MSG( lhs, OP, NOP, rhs, msg, TYPE ) \ - GEOS_THROW_IF_IMPL( lhs OP rhs, \ - msg << "\n" << \ - "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ - " " << #lhs << " = " << lhs << "\n" << \ - " " << #rhs << " = " << rhs << "\n", TYPE ) - /** * @brief Raise a hard error if two values are equal. * @param lhs expression to be evaluated and used as left-hand side in comparison @@ -417,191 +401,208 @@ * @brief Raise a hard error if two values are equal. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) - * - Optional following parameters, context information on the current error (DataContext) - * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_EQ_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, ==, !=, rhs, msg, TYPE ) +#define GEOS_ERROR_IF_EQ( lhs, rhs ) GEOS_ERROR_IF_EQ_MSG( lhs, rhs, "" ) /** - * @brief Raise a hard error if two values are equal. + * @brief Raise a hard error if two values are not equal. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_ERROR_IF_EQ( lhs, rhs ) GEOS_ERROR_IF_EQ_MSG( lhs, rhs, "" ) +#define GEOS_ERROR_IF_NE_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, !=, ==, rhs, __VA_ARGS__ ) /** - * @brief Raise a hard error if two values are equal. + * @brief Raise a hard error if two values are not equal. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_EQ( lhs, rhs, TYPE ) GEOS_THROW_IF_EQ_MSG( lhs, rhs, "", TYPE ) +#define GEOS_ERROR_IF_NE( lhs, rhs ) GEOS_ERROR_IF_NE_MSG( lhs, rhs, "" ) /** - * @brief Raise a hard error if two values are not equal. + * @brief Raise a hard error if one value compares greater than the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: * - First mandatory parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_ERROR_IF_NE_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, !=, ==, rhs, __VA_ARGS__ ) +#define GEOS_ERROR_IF_GT_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, >, <=, rhs, __VA_ARGS__ ) /** - * @brief Throw an exception if two values are not equal. + * @brief Raise a hard error if one value compares greater than the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_NE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, !=, ==, rhs, msg, TYPE ) +#define GEOS_ERROR_IF_GT( lhs, rhs ) GEOS_ERROR_IF_GT_MSG( lhs, rhs, "" ) /** - * @brief Raise a hard error if two values are not equal. + * @brief Raise a hard error if one value compares greater than or equal to the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_ERROR_IF_NE( lhs, rhs ) GEOS_ERROR_IF_NE_MSG( lhs, rhs, "" ) +#define GEOS_ERROR_IF_GE_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, >=, <, rhs, __VA_ARGS__ ) /** - * @brief Throw an exception if two values are not equal. + * @brief Raise a hard error if one value compares greater than or equal to the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_NE( lhs, rhs, TYPE ) GEOS_THROW_IF_NE_MSG( lhs, rhs, "", TYPE ) +#define GEOS_ERROR_IF_GE( lhs, rhs ) GEOS_ERROR_IF_GE_MSG( lhs, rhs, "" ) /** - * @brief Raise a hard error if one value compares greater than the other. + * @brief Raise a hard error if one value compares less than the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: * - First mandatory parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_ERROR_IF_GT_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, >, <=, rhs, __VA_ARGS__ ) +#define GEOS_ERROR_IF_LT_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, <, >=, rhs, __VA_ARGS__ ) /** - * @brief Throw an exception if one value compares greater than the other. + * @brief Raise a hard error if one value compares less than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define GEOS_ERROR_IF_LT( lhs, rhs ) GEOS_ERROR_IF_LT_MSG( lhs, rhs, "" ) + +/** + * @brief Raise a hard error if one value compares less than or equal to the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: * - First mandatory parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) - * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_GT_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, >, <=, rhs, msg, TYPE ) +#define GEOS_ERROR_IF_LE_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, <=, >, rhs, __VA_ARGS__ ) + /** - * @brief Raise a hard error if one value compares greater than the other. + * @brief Raise a hard error if one value compares less than or equal to the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison */ -#define GEOS_ERROR_IF_GT( lhs, rhs ) GEOS_ERROR_IF_GT_MSG( lhs, rhs, "" ) +#define GEOS_ERROR_IF_LE( lhs, rhs ) GEOS_ERROR_IF_LE_MSG( lhs, rhs, "" ) /** - * @brief Throw an exception if one value compares greater than the other. - * @param lhs expression to be evaluated and used as left-hand side in comparison - * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw + * @brief Throw an exception if @p lhs @p OP @p rhs. + * @param lhs The left side of the operation. + * @param OP The operation to apply. + * @param NOP The operation that caused the error, used in the message (typically opposite of @p OP). + * @param rhs The right side of the operation. + * @param msg The message to diplay. + * @param TYPE the type of exception to throw. */ -#define GEOS_THROW_IF_GT( lhs, rhs, TYPE ) GEOS_THROW_IF_GT_MSG( lhs, rhs, "", TYPE ) +#define GEOS_THROW_IF_OP_MSG( lhs, OP, NOP, rhs, msg, TYPE ) \ + GEOS_THROW_IF_IMPL( lhs OP rhs, \ + msg << "\n" << \ + "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ + " " << #lhs << " = " << lhs << "\n" << \ + " " << #rhs << " = " << rhs << "\n", TYPE ) /** - * @brief Raise a hard error if one value compares greater than or equal to the other. + * @brief Raise a hard error if two values are equal. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: * - First mandatory parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) + * @param TYPE the type of exception to throw */ -#define GEOS_ERROR_IF_GE_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, >=, <, rhs, __VA_ARGS__ ) +#define GEOS_THROW_IF_EQ_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, ==, !=, rhs, msg, TYPE ) /** - * @brief Throw an exception if one value compares greater than or equal to the other. + * @brief Raise a hard error if two values are equal. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_GE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, >=, <, rhs, msg, TYPE ) +#define GEOS_THROW_IF_EQ( lhs, rhs, TYPE ) GEOS_THROW_IF_EQ_MSG( lhs, rhs, "", TYPE ) /** - * @brief Raise a hard error if one value compares greater than or equal to the other. + * @brief Throw an exception if two values are not equal. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw */ -#define GEOS_ERROR_IF_GE( lhs, rhs ) GEOS_ERROR_IF_GE_MSG( lhs, rhs, "" ) +#define GEOS_THROW_IF_NE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, !=, ==, rhs, msg, TYPE ) /** - * @brief Throw an exception if one value compares greater than or equal to the other. + * @brief Throw an exception if two values are not equal. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_GE( lhs, rhs, TYPE ) GEOS_THROW_IF_GE_MSG( lhs, rhs, "", TYPE ) +#define GEOS_THROW_IF_NE( lhs, rhs, TYPE ) GEOS_THROW_IF_NE_MSG( lhs, rhs, "", TYPE ) /** - * @brief Raise a hard error if one value compares less than the other. + * @brief Throw an exception if one value compares greater than the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: * - First mandatory parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) + * @param TYPE the type of exception to throw */ -#define GEOS_ERROR_IF_LT_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, <, >=, rhs, __VA_ARGS__ ) +#define GEOS_THROW_IF_GT_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, >, <=, rhs, msg, TYPE ) /** - * @brief Throw an exception if one value compares less than the other. + * @brief Throw an exception if one value compares greater than the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_LT_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, <, >=, rhs, msg, TYPE ) +#define GEOS_THROW_IF_GT( lhs, rhs, TYPE ) GEOS_THROW_IF_GT_MSG( lhs, rhs, "", TYPE ) /** - * @brief Raise a hard error if one value compares less than the other. + * @brief Throw an exception if one value compares greater than or equal to the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw */ -#define GEOS_ERROR_IF_LT( lhs, rhs ) GEOS_ERROR_IF_LT_MSG( lhs, rhs, "" ) +#define GEOS_THROW_IF_GE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, >=, <, rhs, msg, TYPE ) /** - * @brief Throw an exception if one value compares less than the other. + * @brief Throw an exception if one value compares greater than or equal to the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_LT( lhs, rhs, TYPE ) GEOS_THROW_IF_LT_MSG( lhs, rhs, "", TYPE ) +#define GEOS_THROW_IF_GE( lhs, rhs, TYPE ) GEOS_THROW_IF_GE_MSG( lhs, rhs, "", TYPE ) /** - * @brief Raise a hard error if one value compares less than or equal to the other. + * @brief Throw an exception if one value compares less than the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) - * - Optional following parameters, context information on the current error (DataContext) + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw */ -#define GEOS_ERROR_IF_LE_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, <=, >, rhs, __VA_ARGS__ ) +#define GEOS_THROW_IF_LT_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, <, >=, rhs, msg, TYPE ) /** - * @brief Throw an exception if one value compares less than or equal to the other. + * @brief Throw an exception if one value compares less than the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_LE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, <=, >, rhs, msg, TYPE ) +#define GEOS_THROW_IF_LT( lhs, rhs, TYPE ) GEOS_THROW_IF_LT_MSG( lhs, rhs, "", TYPE ) /** - * @brief Raise a hard error if one value compares less than or equal to the other. + * @brief Throw an exception if one value compares less than or equal to the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param msg a message to log (any expression that can be stream inserted) + * @param TYPE the type of exception to throw */ -#define GEOS_ERROR_IF_LE( lhs, rhs ) GEOS_ERROR_IF_LE_MSG( lhs, rhs, "" ) +#define GEOS_THROW_IF_LE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, <=, >, rhs, msg, TYPE ) /** * @brief Throw an exception if one value compares less than or equal to the other. From 66ab5cb5162145d3744c6ad90df31881df632ddf Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Fri, 19 Sep 2025 16:21:50 +0200 Subject: [PATCH 097/173] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=E2=9C=85=20unifor?= =?UTF-8?q?mized=20warning=20macros?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/Logger.hpp | 183 +++++++++++++----- .../unitTests/testErrorHandling.cpp | 12 +- 2 files changed, 147 insertions(+), 48 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 4e3d955512a..7dd5d2d68f8 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -281,22 +281,25 @@ /** * @brief Conditionally report a warning - * @param EXP an expression that will be evaluated as a predicate - * @param MSG a message to log (any expression that can be stream inserted) + * @param COND A condition that causes the error if true. + * @param CAUSE_MESSAGE The condition that caused the error, in a readable text format for the user. + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_WARNING_IF_IMPL( EXP, MSG ) \ +#define GEOS_WARNING_IF_CAUSE( COND, CAUSE_MESSAGE, ... ) \ do \ { \ - if( EXP ) \ + if( COND ) \ { \ std::ostringstream __msgoss; \ - __msgoss << MSG; \ + __msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ std::string message = __msgoss.str(); \ std::ostringstream __oss; \ __oss << "***** WARNING\n"; \ __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << message << "\n"; \ + __oss << "***** " << CAUSE_MESSAGE << "\n"; \ + __oss << "***** Rank " << ::geos::logger::internal::rankString << ": " << message << "\n"; \ std::cout << __oss.str() << std::endl; \ if( g_errorLogger.isOutputFileEnabled() ) \ { \ @@ -305,58 +308,32 @@ __FILE__, \ __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ + msgStruct.setCause( CAUSE_MESSAGE ); \ + msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ g_errorLogger.flushErrorMsg( msgStruct ); \ } \ } \ } while( false ) -/** - * @brief Conditionally report a warning - * @param EXP an expression that will be evaluated as a predicate - * @param MSG a message to log (any expression that can be stream inserted) - * @param ... One or more DataContext (current error context information) - */ -#define GEOS_WARNING_CTX_IF( EXP, MSG, ... ) \ - do \ - { \ - if( EXP ) \ - { \ - std::ostringstream __msgoss; \ - __msgoss << MSG; \ - std::string message = __msgoss.str(); \ - std::ostringstream __oss; \ - __oss << "***** WARNING\n"; \ - __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << message << "\n"; \ - std::cout << __oss.str() << std::endl; \ - if( g_errorLogger.isOutputFileEnabled() ) \ - { \ - ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ - message, \ - __FILE__, \ - __LINE__ ); \ - msgStruct.setRank( ::geos::logger::internal::rank ); \ - msgStruct.addContextInfo( __VA_ARGS__ ); \ - msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ - g_errorLogger.flushErrorMsg( msgStruct ); \ - } \ - } \ - } while( false ) +// TODO: to be deleted +#define GEOS_WARNING_CTX_IF( COND, MSG, ... ) GEOS_WARNING_IF( COND, MSG, __VA_ARGS__ ) /** * @brief Conditionally report a warning. - * @param EXP an expression that will be evaluated as a predicate - * @param msg a message to log (any expression that can be stream inserted) + * @param COND an expression that will be evaluated as a predicate + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_WARNING_IF( EXP, msg ) GEOS_WARNING_IF_IMPL( EXP, msg ) +#define GEOS_WARNING_IF( COND, ... ) \ + GEOS_WARNING_IF_CAUSE( COND, "Warning cause: " STRINGIZE( COND ), __VA_ARGS__ ) /** * @brief Report a warning. * @param msg a message to log (any expression that can be stream inserted) */ -#define GEOS_WARNING( msg ) GEOS_WARNING_IF( true, msg ) +#define GEOS_WARNING( ... ) GEOS_WARNING_IF_CAUSE( true, "", __VA_ARGS__ ) /** * @brief Conditionally log an info message. @@ -490,6 +467,124 @@ */ #define GEOS_ERROR_IF_LE( lhs, rhs ) GEOS_ERROR_IF_LE_MSG( lhs, rhs, "" ) +/** + * @brief Log a warning if @p lhs @p OP @p rhs. + * @param lhs The left side of the operation. + * @param OP The operation to apply. + * @param NOP The operation that caused the error, used in the message (typically opposite of @p OP). + * @param rhs The right side of the operation. + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) + */ +#define GEOS_WARNING_IF_OP_MSG( lhs, OP, NOP, rhs, ... ) \ + GEOS_WARNING_IF_CAUSE( lhs OP rhs, \ + GEOS_FMT( "Expected: " #lhs " " #NOP " " #rhs "\n* " #lhs " = {}\n* " #rhs " = {}\n", \ + lhs, rhs ), \ + __VA_ARGS__ ) + +/** + * @brief Log a warning if two values are equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) + */ +#define GEOS_WARNING_IF_EQ_MSG( lhs, rhs, ... ) GEOS_WARNING_IF_OP_MSG( lhs, ==, !=, rhs, __VA_ARGS__ ) + +/** + * @brief Log a warning if two values are equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define GEOS_WARNING_IF_EQ( lhs, rhs ) GEOS_WARNING_IF_EQ_MSG( lhs, rhs, "" ) + +/** + * @brief Log a warning if two values are not equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) + */ +#define GEOS_WARNING_IF_NE_MSG( lhs, rhs, ... ) GEOS_WARNING_IF_OP_MSG( lhs, !=, ==, rhs, __VA_ARGS__ ) + +/** + * @brief Log a warning if two values are not equal. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define GEOS_WARNING_IF_NE( lhs, rhs ) GEOS_WARNING_IF_NE_MSG( lhs, rhs, "" ) + +/** + * @brief Log a warning if one value compares greater than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) + */ +#define GEOS_WARNING_IF_GT_MSG( lhs, rhs, ... ) GEOS_WARNING_IF_OP_MSG( lhs, >, <=, rhs, __VA_ARGS__ ) + +/** + * @brief Log a warning if one value compares greater than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define GEOS_WARNING_IF_GT( lhs, rhs ) GEOS_WARNING_IF_GT_MSG( lhs, rhs, "" ) + +/** + * @brief Log a warning if one value compares greater than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) + */ +#define GEOS_WARNING_IF_GE_MSG( lhs, rhs, ... ) GEOS_WARNING_IF_OP_MSG( lhs, >=, <, rhs, __VA_ARGS__ ) + +/** + * @brief Log a warning if one value compares greater than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define GEOS_WARNING_IF_GE( lhs, rhs ) GEOS_WARNING_IF_GE_MSG( lhs, rhs, "" ) + +/** + * @brief Log a warning if one value compares less than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) + */ +#define GEOS_WARNING_IF_LT_MSG( lhs, rhs, ... ) GEOS_WARNING_IF_OP_MSG( lhs, <, >=, rhs, __VA_ARGS__ ) + +/** + * @brief Log a warning if one value compares less than the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define GEOS_WARNING_IF_LT( lhs, rhs ) GEOS_WARNING_IF_LT_MSG( lhs, rhs, "" ) + +/** + * @brief Log a warning if one value compares less than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param ... Variable arguments with the following structure: + * - First mandatory parameter, the message to log (must be streamable) + * - Optional following parameters, context information on the current error (DataContext) + */ +#define GEOS_WARNING_IF_LE_MSG( lhs, rhs, ... ) GEOS_WARNING_IF_OP_MSG( lhs, <=, >, rhs, __VA_ARGS__ ) + +/** + * @brief Log a warning if one value compares less than or equal to the other. + * @param lhs expression to be evaluated and used as left-hand side in comparison + * @param rhs expression to be evaluated and used as right-hand side in comparison + */ +#define GEOS_WARNING_IF_LE( lhs, rhs ) GEOS_WARNING_IF_LE_MSG( lhs, rhs, "" ) + /** * @brief Throw an exception if @p lhs @p OP @p rhs. * @param lhs The left side of the operation. diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index 994b3f80f88..50e962cf13d 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -104,12 +104,12 @@ TEST( ErrorHandling, testYamlFileWarningOutput ) GET_LINE( line1 ); GEOS_WARNING( "Conflicting pressure boundary conditions" ); - GET_LINE( line2 ); GEOS_WARNING_IF( testValue == 5, "Pressure value is too small." ); + GET_LINE( line2 ); /*GEOS_WARNING_IF_GT_MSG( testValue, testMaxPrecision, "Pressure value is too high." );*/ - GET_LINE( line3 ); GEOS_WARNING_CTX_IF( testValue == 5, + GET_LINE( line3 ); /*GEOS_WARNING_CTX_IF( testValue == 5, GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", context.toString(), testMinPrecision, testMaxPrecision, testMinPrecision ), - context, additionalContext ); + context, additionalContext );*/ endLocalLoggerTest( g_errorLogger, { R"(errors:)", @@ -130,7 +130,11 @@ TEST( ErrorHandling, testYamlFileWarningOutput ) R"(- type: Warning rank: 0 message: >- - Pressure value is too small. + Pressure value is too high. + cause: >- + Expected: testValue < 0.001 + * testValue = 5 + * testMaxPrecision = 0.001 sourceLocation: file: {} line: {} From e6135b1417c4595434c4e97c9193bbf74abacd8e Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Fri, 19 Sep 2025 17:20:03 +0200 Subject: [PATCH 098/173] =?UTF-8?q?=E2=9C=85=20=F0=9F=90=9B=20=E2=9A=A1?= =?UTF-8?q?=EF=B8=8F=20bugfix=20when=20callstack=20is=20empty=20+=20disabl?= =?UTF-8?q?e=20callstack=20for=20perfs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/logger/ErrorHandling.cpp | 12 +++--- src/coreComponents/common/logger/Logger.hpp | 1 - .../unitTests/testErrorHandling.cpp | 40 ++++++++++--------- 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 7a10eceb148..25c68426ee5 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -235,16 +235,14 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) yamlFile << g_level2Next << "line: " << errorMsg.m_line << "\n"; // Information about the stack trace - yamlFile << g_level1Next << "sourceCallStack:\n"; - if( !errorMsg.isValidStackTrace() ) - { - yamlFile << g_level3Start << "callStackMessage: " << errorMsg.m_sourceCallStack[0] << "\n"; - } - else + if( !errorMsg.m_sourceCallStack.empty() ) { + yamlFile << g_level1Next << "sourceCallStack:\n"; for( size_t i = 0; i < errorMsg.m_sourceCallStack.size(); i++ ) { - yamlFile << g_level3Start << "frame" << i << ": " << errorMsg.m_sourceCallStack[i] << "\n"; + yamlFile << ( errorMsg.isValidStackTrace() ? + GEOS_FMT( "{}frame{}: {}\n", g_level3Start, i, errorMsg.m_sourceCallStack[i] ) : + GEOS_FMT( "{}{}\n", g_level3Start, errorMsg.m_sourceCallStack[i] ) ); } } diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 7dd5d2d68f8..fce5bdedaf8 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -310,7 +310,6 @@ msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.setCause( CAUSE_MESSAGE ); \ msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ g_errorLogger.flushErrorMsg( msgStruct ); \ } \ } \ diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index 50e962cf13d..b698f22a944 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -104,12 +104,12 @@ TEST( ErrorHandling, testYamlFileWarningOutput ) GET_LINE( line1 ); GEOS_WARNING( "Conflicting pressure boundary conditions" ); - GET_LINE( line2 ); /*GEOS_WARNING_IF_GT_MSG( testValue, testMaxPrecision, "Pressure value is too high." );*/ + GET_LINE( line2 ); GEOS_WARNING_IF_GT_MSG( testValue, testMaxPrecision, "Pressure value is too high." ); - GET_LINE( line3 ); /*GEOS_WARNING_CTX_IF( testValue == 5, + GET_LINE( line3 ); GEOS_WARNING_CTX_IF( testValue == 5, GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", context.toString(), testMinPrecision, testMaxPrecision, testMinPrecision ), - context, additionalContext );*/ + context, additionalContext ); endLocalLoggerTest( g_errorLogger, { R"(errors:)", @@ -121,9 +121,7 @@ TEST( ErrorHandling, testYamlFileWarningOutput ) Conflicting pressure boundary conditions sourceLocation: file: {} - line: {} - sourceCallStack: - - frame0: )", + line: {})", __FILE__, line1 ), GEOS_FMT( @@ -132,14 +130,12 @@ TEST( ErrorHandling, testYamlFileWarningOutput ) message: >- Pressure value is too high. cause: >- - Expected: testValue < 0.001 + Expected: testValue <= testMaxPrecision * testValue = 5 * testMaxPrecision = 0.001 sourceLocation: file: {} - line: {} - sourceCallStack: - - frame0: )", + line: {})", __FILE__, line2 ), GEOS_FMT( @@ -154,11 +150,11 @@ TEST( ErrorHandling, testYamlFileWarningOutput ) - priority: 0 inputFile: /path/to/file.xml inputLine: 32 + cause: >- + Warning cause: testValue == 5 sourceLocation: file: {} - line: {} - sourceCallStack: - - frame0: )", + line: {})", __FILE__, line3 ), } ); } @@ -209,9 +205,11 @@ TEST( ErrorHandling, testYamlFileExceptionOutput ) sourceLocation: file: {} line: {} - sourceCallStack: - - frame0: )", + sourceCallStack:)", __FILE__, line1 ), + "- frame0: ", + "- frame1: ", + "- frame2: " } ); } @@ -254,9 +252,11 @@ TEST( ErrorHandling, testYamlFileErrorOutput ) sourceLocation: file: {} line: {} - sourceCallStack: - - frame0: )", + sourceCallStack:)", __FILE__, line1 ), + "- frame0: ", + "- frame1: ", + "- frame2: " } ); } @@ -294,9 +294,11 @@ TEST( ErrorHandling, testYamlFileAssertOutput ) sourceLocation: file: {} line: {} - sourceCallStack: - - frame0: )", + sourceCallStack:)", __FILE__, line1 ), + "- frame0: ", + "- frame1: ", + "- frame2: " } ); } #endif From 589fcfefe7d65c53c4ec960add552fd4bfebc1ea Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Fri, 19 Sep 2025 17:58:01 +0200 Subject: [PATCH 099/173] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=E2=9C=85=20unifor?= =?UTF-8?q?mized=20throw=20macros?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/Logger.hpp | 230 ++++++++++---------- 1 file changed, 114 insertions(+), 116 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index fce5bdedaf8..a5326a833cf 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -138,7 +138,7 @@ * @param COND A condition that causes the error if true. * @param CAUSE_MESSAGE The condition that caused the error, in a readable text format for the user. * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ERROR_IF_CAUSE( COND, CAUSE_MESSAGE, ... ) \ @@ -177,7 +177,7 @@ * @brief Conditionally raise a hard error and terminate the program. * @param COND A condition that causes the error if true. * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ERROR_IF( COND, ... ) \ @@ -189,29 +189,32 @@ /** * @brief Raise a hard error and terminate the program. * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ERROR( ... ) GEOS_ERROR_IF_CAUSE( true, "", __VA_ARGS__ ) /** * @brief Conditionally throw an exception. - * @param EXP an expression that will be evaluated as a predicate + * @param COND an expression that will be evaluated as a predicate + * @param CAUSE_MESSAGE The condition that caused the error, in a readable text format for the user. * @param MSG a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw + * @param ... Variable arguments with the following structure: + * - Mandatory first parameter, the type of the exception to throw + * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_THROW_IF_IMPL( EXP, MSG, EXCEPTIONTYPE ) \ +#define GEOS_THROW_IF_CAUSE( COND, CAUSE_MESSAGE, MSG, ... ) \ do \ { \ - if( EXP ) \ + if( COND ) \ { \ std::ostringstream __msgoss; \ __msgoss << MSG; \ std::string message = __msgoss.str(); \ std::ostringstream __oss; \ - __oss << "\n"; \ + __oss << "***** EXCEPTION\n"; \ __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ + __oss << "***** " << CAUSE_MESSAGE << "\n"; \ __oss << "***** Rank " << ::geos::logger::internal::rankString << ": " << message << "\n"; \ std::string stackHistory = LvArray::system::stackTrace( true ); \ __oss << stackHistory; \ @@ -222,69 +225,42 @@ .setCodeLocation( __FILE__, __LINE__ ) \ .addToMsg( message ) \ .setRank( ::geos::logger::internal::rank ) \ - .addCallStackInfo( stackHistory ); \ + .addCallStackInfo( stackHistory ) \ + .addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ } \ - throw EXCEPTIONTYPE( __oss.str() ); \ + throw GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ )( __oss.str() ); \ } \ } while( false ) /** - * @brief Conditionally throw an exception. - * @param EXP an expression that will be evaluated as a predicate + * @brief Conditionally raise a hard error and terminate the program. + * @param COND A condition that causes the error if true. * @param MSG a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - * @param ... One or more DataContext (current error context information) + * @param ... Variable arguments with the following structure: + * - Mandatory first parameter, the type of the exception to throw + * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_THROW_CTX_IF( EXP, MSG, EXCEPTIONTYPE, ... ) \ - do \ - { \ - if( EXP ) \ - { \ - std::ostringstream __msgoss; \ - __msgoss << MSG; \ - std::string message = __msgoss.str(); \ - std::ostringstream __oss; \ - __oss << "\n"; \ - __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ - __oss << "***** Rank " << ::geos::logger::internal::rankString << ": " << message << "\n"; \ - std::string stackHistory = LvArray::system::stackTrace( true ); \ - __oss << stackHistory; \ - if( g_errorLogger.isOutputFileEnabled() ) \ - { \ - g_errorLogger.currentErrorMsg() \ - .setType( ErrorLogger::MsgType::Exception ) \ - .setCodeLocation( __FILE__, __LINE__ ) \ - .addToMsg( message ) \ - .setRank( ::geos::logger::internal::rank ) \ - .addCallStackInfo( stackHistory ) \ - .addContextInfo( __VA_ARGS__ ); \ - } \ - throw EXCEPTIONTYPE( __oss.str() ); \ - } \ - } while( false ) +#define GEOS_THROW_IF( COND, MSG, ... ) \ + GEOS_THROW_IF_CAUSE( COND, "Error cause: " STRINGIZE( COND ), MSG, __VA_ARGS__ ) -/** - * @brief Conditionally throw an exception. - * @param EXP an expression that will be evaluated as a predicate - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw - */ -#define GEOS_THROW_IF( EXP, msg, TYPE ) GEOS_THROW_IF_IMPL( EXP, "***** Rank " << ::geos::logger::internal::rankString << ": " << msg, TYPE ) +// TODO: to be deleted +#define GEOS_THROW_CTX_IF( COND, MSG, EXCEPTION_TYPE, ... ) GEOS_THROW_IF( COND, MSG, EXCEPTION_TYPE, __VA_ARGS__ ) /** - * @brief Throw an exception. - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw + * @brief Conditionally raise a hard error and terminate the program. + * @param MSG a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - Mandatory first parameter, the type of the exception to throw + * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_THROW( msg, TYPE ) GEOS_THROW_IF( true, msg, TYPE ) +#define GEOS_THROW( MSG, ... ) GEOS_THROW_IF_CAUSE( true, "", MSG, __VA_ARGS__ ) /** * @brief Conditionally report a warning * @param COND A condition that causes the error if true. * @param CAUSE_MESSAGE The condition that caused the error, in a readable text format for the user. * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_WARNING_IF_CAUSE( COND, CAUSE_MESSAGE, ... ) \ @@ -322,7 +298,7 @@ * @brief Conditionally report a warning. * @param COND an expression that will be evaluated as a predicate * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_WARNING_IF( COND, ... ) \ @@ -354,7 +330,7 @@ * @param NOP The operation that caused the error, used in the message (typically opposite of @p OP). * @param rhs The right side of the operation. * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ERROR_IF_OP_MSG( lhs, OP, NOP, rhs, ... ) \ @@ -368,7 +344,7 @@ * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ERROR_IF_EQ_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, ==, !=, rhs, __VA_ARGS__ ) @@ -385,7 +361,7 @@ * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ERROR_IF_NE_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, !=, ==, rhs, __VA_ARGS__ ) @@ -402,7 +378,7 @@ * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ERROR_IF_GT_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, >, <=, rhs, __VA_ARGS__ ) @@ -419,7 +395,7 @@ * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ERROR_IF_GE_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, >=, <, rhs, __VA_ARGS__ ) @@ -436,7 +412,7 @@ * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ERROR_IF_LT_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, <, >=, rhs, __VA_ARGS__ ) @@ -453,7 +429,7 @@ * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ERROR_IF_LE_MSG( lhs, rhs, ... ) GEOS_ERROR_IF_OP_MSG( lhs, <=, >, rhs, __VA_ARGS__ ) @@ -473,7 +449,7 @@ * @param NOP The operation that caused the error, used in the message (typically opposite of @p OP). * @param rhs The right side of the operation. * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_WARNING_IF_OP_MSG( lhs, OP, NOP, rhs, ... ) \ @@ -487,7 +463,7 @@ * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_WARNING_IF_EQ_MSG( lhs, rhs, ... ) GEOS_WARNING_IF_OP_MSG( lhs, ==, !=, rhs, __VA_ARGS__ ) @@ -504,7 +480,7 @@ * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_WARNING_IF_NE_MSG( lhs, rhs, ... ) GEOS_WARNING_IF_OP_MSG( lhs, !=, ==, rhs, __VA_ARGS__ ) @@ -521,7 +497,7 @@ * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_WARNING_IF_GT_MSG( lhs, rhs, ... ) GEOS_WARNING_IF_OP_MSG( lhs, >, <=, rhs, __VA_ARGS__ ) @@ -538,7 +514,7 @@ * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_WARNING_IF_GE_MSG( lhs, rhs, ... ) GEOS_WARNING_IF_OP_MSG( lhs, >=, <, rhs, __VA_ARGS__ ) @@ -555,7 +531,7 @@ * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_WARNING_IF_LT_MSG( lhs, rhs, ... ) GEOS_WARNING_IF_OP_MSG( lhs, <, >=, rhs, __VA_ARGS__ ) @@ -572,7 +548,7 @@ * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_WARNING_IF_LE_MSG( lhs, rhs, ... ) GEOS_WARNING_IF_OP_MSG( lhs, <=, >, rhs, __VA_ARGS__ ) @@ -590,121 +566,143 @@ * @param OP The operation to apply. * @param NOP The operation that caused the error, used in the message (typically opposite of @p OP). * @param rhs The right side of the operation. - * @param msg The message to diplay. - * @param TYPE the type of exception to throw. + * @param MSG a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - Mandatory first parameter, the type of the exception to throw + * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_THROW_IF_OP_MSG( lhs, OP, NOP, rhs, msg, TYPE ) \ - GEOS_THROW_IF_IMPL( lhs OP rhs, \ - msg << "\n" << \ - "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ - " " << #lhs << " = " << lhs << "\n" << \ - " " << #rhs << " = " << rhs << "\n", TYPE ) +#define GEOS_THROW_IF_OP_MSG( lhs, OP, NOP, rhs, MSG, ... ) \ + GEOS_THROW_IF_CAUSE( lhs OP rhs, \ + GEOS_FMT( "Expected: " #lhs " " #NOP " " #rhs "\n* " #lhs " = {}\n* " #rhs " = {}\n", \ + lhs, rhs ), \ + MSG, __VA_ARGS__ ) + /** * @brief Raise a hard error if two values are equal. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param MSG a message to log (any expression that can be stream inserted) * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the type of the exception to throw * - Optional following parameters, context information on the current error (DataContext) - * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_EQ_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, ==, !=, rhs, msg, TYPE ) +#define GEOS_THROW_IF_EQ_MSG( lhs, rhs, MSG, ... ) GEOS_THROW_IF_OP_MSG( lhs, ==, !=, rhs, MSG, __VA_ARGS__ ) /** * @brief Raise a hard error if two values are equal. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw + * @param ... Variable arguments with the following structure: + * - Mandatory first parameter, the type of the exception to throw + * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_THROW_IF_EQ( lhs, rhs, TYPE ) GEOS_THROW_IF_EQ_MSG( lhs, rhs, "", TYPE ) +#define GEOS_THROW_IF_EQ( lhs, rhs, ... ) GEOS_THROW_IF_EQ_MSG( lhs, rhs, "", __VA_ARGS__ ) /** * @brief Throw an exception if two values are not equal. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw + * @param MSG a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - Mandatory first parameter, the type of the exception to throw + * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_THROW_IF_NE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, !=, ==, rhs, msg, TYPE ) +#define GEOS_THROW_IF_NE_MSG( lhs, rhs, MSG, ... ) GEOS_THROW_IF_OP_MSG( lhs, !=, ==, rhs, MSG, __VA_ARGS__ ) /** * @brief Throw an exception if two values are not equal. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw + * @param ... Variable arguments with the following structure: + * - Mandatory first parameter, the type of the exception to throw + * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_THROW_IF_NE( lhs, rhs, TYPE ) GEOS_THROW_IF_NE_MSG( lhs, rhs, "", TYPE ) +#define GEOS_THROW_IF_NE( lhs, rhs, ... ) GEOS_THROW_IF_NE_MSG( lhs, rhs, "", __VA_ARGS__ ) /** * @brief Throw an exception if one value compares greater than the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison + * @param MSG a message to log (any expression that can be stream inserted) * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the type of the exception to throw * - Optional following parameters, context information on the current error (DataContext) - * @param TYPE the type of exception to throw */ -#define GEOS_THROW_IF_GT_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, >, <=, rhs, msg, TYPE ) +#define GEOS_THROW_IF_GT_MSG( lhs, rhs, MSG, ... ) GEOS_THROW_IF_OP_MSG( lhs, >, <=, rhs, MSG, __VA_ARGS__ ) /** * @brief Throw an exception if one value compares greater than the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw + * @param ... Variable arguments with the following structure: + * - Mandatory first parameter, the type of the exception to throw + * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_THROW_IF_GT( lhs, rhs, TYPE ) GEOS_THROW_IF_GT_MSG( lhs, rhs, "", TYPE ) +#define GEOS_THROW_IF_GT( lhs, rhs, ... ) GEOS_THROW_IF_GT_MSG( lhs, rhs, "", __VA_ARGS__ ) /** * @brief Throw an exception if one value compares greater than or equal to the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw + * @param MSG a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - Mandatory first parameter, the type of the exception to throw + * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_THROW_IF_GE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, >=, <, rhs, msg, TYPE ) +#define GEOS_THROW_IF_GE_MSG( lhs, rhs, MSG, ... ) GEOS_THROW_IF_OP_MSG( lhs, >=, <, rhs, MSG, __VA_ARGS__ ) /** * @brief Throw an exception if one value compares greater than or equal to the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw + * @param ... Variable arguments with the following structure: + * - Mandatory first parameter, the type of the exception to throw + * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_THROW_IF_GE( lhs, rhs, TYPE ) GEOS_THROW_IF_GE_MSG( lhs, rhs, "", TYPE ) +#define GEOS_THROW_IF_GE( lhs, rhs, ... ) GEOS_THROW_IF_GE_MSG( lhs, rhs, "", __VA_ARGS__ ) /** * @brief Throw an exception if one value compares less than the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw + * @param MSG a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - Mandatory first parameter, the type of the exception to throw + * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_THROW_IF_LT_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, <, >=, rhs, msg, TYPE ) +#define GEOS_THROW_IF_LT_MSG( lhs, rhs, MSG, ... ) GEOS_THROW_IF_OP_MSG( lhs, <, >=, rhs, MSG, __VA_ARGS__ ) /** * @brief Throw an exception if one value compares less than the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw + * @param ... Variable arguments with the following structure: + * - Mandatory first parameter, the type of the exception to throw + * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_THROW_IF_LT( lhs, rhs, TYPE ) GEOS_THROW_IF_LT_MSG( lhs, rhs, "", TYPE ) +#define GEOS_THROW_IF_LT( lhs, rhs, ... ) GEOS_THROW_IF_LT_MSG( lhs, rhs, "", __VA_ARGS__ ) /** * @brief Throw an exception if one value compares less than or equal to the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param msg a message to log (any expression that can be stream inserted) - * @param TYPE the type of exception to throw + * @param MSG a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - Mandatory first parameter, the type of the exception to throw + * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_THROW_IF_LE_MSG( lhs, rhs, msg, TYPE ) GEOS_THROW_IF_OP_MSG( lhs, <=, >, rhs, msg, TYPE ) +#define GEOS_THROW_IF_LE_MSG( lhs, rhs, MSG, ... ) GEOS_THROW_IF_OP_MSG( lhs, <=, >, rhs, MSG, __VA_ARGS__ ) /** * @brief Throw an exception if one value compares less than or equal to the other. * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison - * @param TYPE the type of exception to throw + * @param ... Variable arguments with the following structure: + * - Mandatory first parameter, the type of the exception to throw + * - Optional following parameters, context information on the current error (DataContext) */ -#define GEOS_THROW_IF_LE( lhs, rhs, TYPE ) GEOS_THROW_IF_LE_MSG( lhs, rhs, "", TYPE ) +#define GEOS_THROW_IF_LE( lhs, rhs, ... ) GEOS_THROW_IF_LE_MSG( lhs, rhs, "", __VA_ARGS__ ) #if !defined(NDEBUG) || defined(GEOS_ASSERT_ENABLED) @@ -714,7 +712,7 @@ * @brief Abort execution if @p COND is false but only when NDEBUG is not defined.. * @param COND The condition to check, causes an error if false. * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) * @note This macro can be used in both host and device code. * @note Tries to provide as much information about the location of the error @@ -731,7 +729,7 @@ * @param OP The operation to apply. * @param rhs The right side of the operation. * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ASSERT_OP_MSG( lhs, OP, rhs, ... ) \ @@ -758,7 +756,7 @@ * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ASSERT_EQ_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, ==, rhs, __VA_ARGS__ ) @@ -775,7 +773,7 @@ * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ASSERT_NE_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, !=, rhs, __VA_ARGS__ ) @@ -792,7 +790,7 @@ * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ASSERT_GT_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, >, rhs, __VA_ARGS__ ) @@ -809,7 +807,7 @@ * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ASSERT_GE_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, >=, rhs, __VA_ARGS__ ) @@ -826,7 +824,7 @@ * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ASSERT_LT_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, <, rhs, __VA_ARGS__ ) @@ -843,7 +841,7 @@ * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison * @param ... Variable arguments with the following structure: - * - First mandatory parameter, the message to log (must be streamable) + * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ #define GEOS_ASSERT_LE_MSG( lhs, rhs, ... ) GEOS_ASSERT_OP_MSG( lhs, <=, rhs, __VA_ARGS__ ) From 6fc4b3005b62548da3e67ba2787adaf4c157b292 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Mon, 22 Sep 2025 11:04:52 +0200 Subject: [PATCH 100/173] =?UTF-8?q?=E2=9C=85=20removing=20=5FCTX=20macros?= =?UTF-8?q?=20from=20unit=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../unitTests/testErrorHandling.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index b698f22a944..6e227419809 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -106,10 +106,10 @@ TEST( ErrorHandling, testYamlFileWarningOutput ) GET_LINE( line2 ); GEOS_WARNING_IF_GT_MSG( testValue, testMaxPrecision, "Pressure value is too high." ); - GET_LINE( line3 ); GEOS_WARNING_CTX_IF( testValue == 5, - GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", - context.toString(), testMinPrecision, testMaxPrecision, testMinPrecision ), - context, additionalContext ); + GET_LINE( line3 ); GEOS_WARNING_IF( testValue == 5, + GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", + context.toString(), testMinPrecision, testMaxPrecision, testMinPrecision ), + context, additionalContext ); endLocalLoggerTest( g_errorLogger, { R"(errors:)", @@ -168,10 +168,10 @@ TEST( ErrorHandling, testYamlFileExceptionOutput ) // Stacked exception test (contexts must appear sorted by priority) try { - line1 = __LINE__; GEOS_THROW_CTX_IF( testValue == 5, - "Group " << context.toString() << " has no wrapper named" << std::endl, - std::domain_error, - context.getContextInfo().setPriority( 1 ) ); + line1 = __LINE__; GEOS_THROW_IF( testValue == 5, + "Group " << context.toString() << " has no wrapper named" << std::endl, + std::domain_error, + context.getContextInfo().setPriority( 1 ) ); } catch( std::domain_error const & ex ) { From 77f9fcb405f105b78dd4b576c550c5d924142e0c Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Mon, 22 Sep 2025 15:37:06 +0200 Subject: [PATCH 101/173] =?UTF-8?q?=F0=9F=90=9B=20use=20streamed=20cause?= =?UTF-8?q?=20string=20to=20support=20mpi=20pointers=20formatting=20(not?= =?UTF-8?q?=20supported=20by=20fmt=20for=20now)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/Logger.hpp | 32 ++++++++++++--------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index a5326a833cf..47cda154a9d 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -149,10 +149,13 @@ std::ostringstream __msgoss; \ __msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ std::string message = __msgoss.str(); \ + __msgoss.clear(); \ + __msgoss << CAUSE_MESSAGE; \ + std::string cause = __msgoss.str(); \ std::ostringstream __oss; \ __oss << "***** ERROR\n"; \ __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** " << CAUSE_MESSAGE << "\n"; \ + __oss << "***** " << cause << "\n"; \ __oss << "***** Rank " << ::geos::logger::internal::rankString << ": " << message << "\n"; \ std::string stackHistory = LvArray::system::stackTrace( true ); \ __oss << stackHistory; \ @@ -164,7 +167,7 @@ __FILE__, \ __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ - msgStruct.setCause( CAUSE_MESSAGE ); \ + msgStruct.setCause( cause ); \ msgStruct.addCallStackInfo( stackHistory ); \ msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ g_errorLogger.flushErrorMsg( msgStruct ); \ @@ -211,10 +214,13 @@ std::ostringstream __msgoss; \ __msgoss << MSG; \ std::string message = __msgoss.str(); \ + __msgoss.clear(); \ + __msgoss << CAUSE_MESSAGE; \ + std::string cause = __msgoss.str(); \ std::ostringstream __oss; \ __oss << "***** EXCEPTION\n"; \ __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** " << CAUSE_MESSAGE << "\n"; \ + __oss << "***** " << cause << "\n"; \ __oss << "***** Rank " << ::geos::logger::internal::rankString << ": " << message << "\n"; \ std::string stackHistory = LvArray::system::stackTrace( true ); \ __oss << stackHistory; \ @@ -224,6 +230,7 @@ .setType( ErrorLogger::MsgType::Exception ) \ .setCodeLocation( __FILE__, __LINE__ ) \ .addToMsg( message ) \ + .setCause( cause ) \ .setRank( ::geos::logger::internal::rank ) \ .addCallStackInfo( stackHistory ) \ .addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ @@ -271,10 +278,13 @@ std::ostringstream __msgoss; \ __msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ std::string message = __msgoss.str(); \ + __msgoss.clear(); \ + __msgoss << CAUSE_MESSAGE; \ + std::string cause = __msgoss.str(); \ std::ostringstream __oss; \ __oss << "***** WARNING\n"; \ __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** " << CAUSE_MESSAGE << "\n"; \ + __oss << "***** " << cause << "\n"; \ __oss << "***** Rank " << ::geos::logger::internal::rankString << ": " << message << "\n"; \ std::cout << __oss.str() << std::endl; \ if( g_errorLogger.isOutputFileEnabled() ) \ @@ -284,7 +294,7 @@ __FILE__, \ __LINE__ ); \ msgStruct.setRank( ::geos::logger::internal::rank ); \ - msgStruct.setCause( CAUSE_MESSAGE ); \ + msgStruct.setCause( cause ); \ msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ g_errorLogger.flushErrorMsg( msgStruct ); \ } \ @@ -335,8 +345,7 @@ */ #define GEOS_ERROR_IF_OP_MSG( lhs, OP, NOP, rhs, ... ) \ GEOS_ERROR_IF_CAUSE( lhs OP rhs, \ - GEOS_FMT( "Expected: " #lhs " " #NOP " " #rhs "\n* " #lhs " = {}\n* " #rhs " = {}\n", \ - lhs, rhs ), \ + "Expected: " #lhs " " #NOP " " #rhs "\n* " #lhs " = " << lhs << "\n* " #rhs " = " << rhs << "\n", \ __VA_ARGS__ ) /** @@ -454,8 +463,7 @@ */ #define GEOS_WARNING_IF_OP_MSG( lhs, OP, NOP, rhs, ... ) \ GEOS_WARNING_IF_CAUSE( lhs OP rhs, \ - GEOS_FMT( "Expected: " #lhs " " #NOP " " #rhs "\n* " #lhs " = {}\n* " #rhs " = {}\n", \ - lhs, rhs ), \ + "Expected: " #lhs " " #NOP " " #rhs "\n* " #lhs " = " << lhs << "\n* " #rhs " = " << rhs << "\n", \ __VA_ARGS__ ) /** @@ -573,8 +581,7 @@ */ #define GEOS_THROW_IF_OP_MSG( lhs, OP, NOP, rhs, MSG, ... ) \ GEOS_THROW_IF_CAUSE( lhs OP rhs, \ - GEOS_FMT( "Expected: " #lhs " " #NOP " " #rhs "\n* " #lhs " = {}\n* " #rhs " = {}\n", \ - lhs, rhs ), \ + "Expected: " #lhs " " #NOP " " #rhs "\n* " #lhs " = " << lhs << "\n* " #rhs " = " << rhs << "\n", \ MSG, __VA_ARGS__ ) @@ -734,8 +741,7 @@ */ #define GEOS_ASSERT_OP_MSG( lhs, OP, rhs, ... ) \ GEOS_ERROR_IF_CAUSE( !( lhs OP rhs ), \ - GEOS_FMT( "Expected: " #lhs " " #OP " " #rhs "\n* " #lhs " = {}\n* " #rhs " = {}\n", \ - lhs, rhs ), \ + "Expected: " #lhs " " #OP " " #rhs "\n* " #lhs " = " << lhs << "\n* " #rhs " = " << rhs << "\n", \ __VA_ARGS__ ) #else From 5747e7f4d0d8ec5785705481d1dffe8b910561fb Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Mon, 22 Sep 2025 16:14:52 +0200 Subject: [PATCH 102/173] =?UTF-8?q?=F0=9F=90=9B=20last=20mistake=3F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/Logger.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 47cda154a9d..e087c125629 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -789,7 +789,7 @@ * @param lhs expression to be evaluated and used as left-hand side in comparison * @param rhs expression to be evaluated and used as right-hand side in comparison */ -#define GEOS_ASSERT_NE( lhs, rhs ) GEOS_ASSERT_NE( lhs, rhs ) +#define GEOS_ASSERT_NE( lhs, rhs ) GEOS_ASSERT_NE_MSG( lhs, rhs, "" ) /** * @brief Assert that one value compares greater than the other in debug builds. From 10eb96944d71bb35206c84b2e28e57c673c695a6 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Mon, 22 Sep 2025 16:35:32 +0200 Subject: [PATCH 103/173] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20removing=20all=20G?= =?UTF-8?q?EOS=5F*=5FCTX=20macros=20(as=20GEOS=5FERROR,=20GEOS=5FWARNING,?= =?UTF-8?q?=20GEOS=5FASSERT=20and=20GEOS=5FTHROW=20are=20now=20compatible?= =?UTF-8?q?=20with=20context=20parameters)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/Logger.hpp | 9 - .../constitutive/ConstitutiveManager.cpp | 2 +- .../JFunctionCapillaryPressure.cpp | 16 +- .../TableCapillaryPressure.cpp | 10 +- .../constitutive/contact/CoulombFriction.cpp | 2 +- .../contact/HydraulicApertureTable.cpp | 12 +- .../diffusion/ConstantDiffusion.cpp | 4 +- .../constitutive/diffusion/DiffusionBase.cpp | 2 +- .../dispersion/LinearIsotropicDispersion.cpp | 2 +- .../multifluid/CO2Brine/CO2BrineFluid.cpp | 22 +- .../multifluid/blackOil/BlackOilFluid.cpp | 16 +- .../multifluid/blackOil/BlackOilFluidBase.cpp | 6 +- .../multifluid/blackOil/DeadOilFluid.cpp | 10 +- .../PressureTemperatureCoordinates.cpp | 4 +- .../reactive/ReactiveBrineFluid.cpp | 8 +- .../fluid/singlefluid/ParticleFluid.cpp | 12 +- .../ThermalCompressibleSinglePhaseFluid.cpp | 2 +- .../permeability/PressurePermeability.cpp | 2 +- .../BrooksCoreyBakerRelativePermeability.cpp | 2 +- .../BrooksCoreyStone2RelativePermeability.cpp | 2 +- .../TableRelativePermeability.cpp | 18 +- .../TableRelativePermeabilityHelpers.cpp | 6 +- .../TableRelativePermeabilityHysteresis.cpp | 28 +- .../VanGenuchtenBakerRelativePermeability.cpp | 2 +- ...VanGenuchtenStone2RelativePermeability.cpp | 2 +- .../constitutive/solid/Damage.cpp | 8 +- .../constitutive/solid/DelftEgg.cpp | 8 +- .../constitutive/solid/DruckerPrager.cpp | 8 +- .../solid/DruckerPragerExtended.cpp | 12 +- .../ElasticIsotropicPressureDependent.cpp | 4 +- .../constitutive/solid/ModifiedCamClay.cpp | 6 +- .../MultiPhaseConstantThermalConductivity.cpp | 2 +- ...PhaseVolumeWeightedThermalConductivity.cpp | 4 +- .../SinglePhaseThermalConductivity.cpp | 2 +- .../fluid/multiFluid/PVTDriver.cpp | 10 +- .../solid/TriaxialDriver.cpp | 4 +- src/coreComponents/dataRepository/Group.cpp | 4 +- src/coreComponents/dataRepository/Group.hpp | 16 +- src/coreComponents/events/PeriodicEvent.cpp | 4 +- .../AquiferBoundaryCondition.cpp | 4 +- .../EquilibriumInitialCondition.cpp | 26 +- .../PerfectlyMatchedLayer.cpp | 4 +- .../TractionBoundaryCondition.cpp | 4 +- .../fileIO/Outputs/SiloOutput.cpp | 2 +- .../fileIO/Outputs/VTKOutput.cpp | 4 +- .../FiniteElementDiscretization.cpp | 10 +- .../functions/MultivariableTableFunction.cpp | 12 +- .../functions/TableFunction.cpp | 8 +- src/coreComponents/mesh/CellElementRegion.cpp | 4 +- .../mesh/CellElementRegionSelector.cpp | 4 +- .../mesh/ElementRegionManager.cpp | 8 +- .../mesh/ElementRegionManager.hpp | 4 +- src/coreComponents/mesh/MeshObjectPath.cpp | 4 +- src/coreComponents/mesh/Perforation.cpp | 2 +- .../mesh/SurfaceElementRegion.hpp | 2 +- .../mesh/WellElementSubRegion.cpp | 4 +- .../generators/ExternalMeshGeneratorBase.cpp | 2 +- .../mesh/generators/InternalMeshGenerator.hpp | 2 +- .../mesh/generators/InternalWellGenerator.cpp | 6 +- .../generators/InternalWellboreGenerator.cpp | 6 +- .../mesh/generators/VTKMeshGenerator.cpp | 4 +- .../mesh/generators/WellGeneratorBase.cpp | 2 +- .../mesh/simpleGeometricObjects/Box.cpp | 2 +- .../simpleGeometricObjects/ThickPlane.cpp | 4 +- .../physicsSolvers/FieldStatisticsBase.hpp | 2 +- .../physicsSolvers/LinearSolverParameters.cpp | 12 +- .../physicsSolvers/PhysicsSolverBase.cpp | 12 +- .../fluidFlow/CompositionalMultiphaseBase.cpp | 18 +- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 4 +- .../CompositionalMultiphaseHybridFVM.cpp | 6 +- .../ReactiveCompositionalMultiphaseOBL.cpp | 2 +- .../fluidFlow/SinglePhaseBase.cpp | 8 +- .../fluidFlow/SinglePhaseHybridFVM.cpp | 4 +- .../fluidFlow/SourceFluxStatistics.cpp | 4 +- .../fluidFlow/StencilDataCollection.cpp | 6 +- .../proppantTransport/ProppantTransport.cpp | 8 +- .../wells/CompositionalMultiphaseWell.cpp | 24 +- .../fluidFlow/wells/SinglePhaseWell.cpp | 6 +- .../fluidFlow/wells/WellControls.cpp | 50 +- .../fluidFlow/wells/WellSolverBase.cpp | 2 +- .../CompositionalMultiphaseWellKernels.cpp | 6 +- .../wells/kernels/SinglePhaseWellKernels.cpp | 4 +- .../inducedSeismicity/SpringSlider.cpp | 2 +- ...mpositionalMultiphaseReservoirAndWells.cpp | 4 +- .../CoupledReservoirAndWellsBase.cpp | 2 +- .../multiphysics/CoupledSolver.hpp | 4 +- .../multiphysics/MultiphasePoromechanics.cpp | 4 +- .../PoromechanicsInitialization.cpp | 4 +- .../multiphysics/PoromechanicsSolver.hpp | 2 +- .../multiphysics/SinglePhasePoromechanics.cpp | 2 +- .../SolidMechanicsLagrangianFEM.cpp | 6 +- .../SolidMechanicsStateReset.cpp | 2 +- .../contact/SolidMechanicsLagrangeContact.cpp | 2 +- .../surfaceGeneration/SurfaceGenerator.cpp | 12 +- .../AcousticFirstOrderWaveEquationSEM.cpp | 2 +- .../isotropic/AcousticWaveEquationSEM.cpp | 10 +- .../ElasticFirstOrderWaveEquationSEM.cpp | 2 +- .../isotropic/ElasticWaveEquationSEM.cpp | 2 +- .../wavePropagation/shared/WaveSolverBase.cpp | 4 +- src/coreComponents/schema/schema.xsd | 463 +++++++++--------- src/coreComponents/schema/schema.xsd.other | 63 ++- 101 files changed, 609 insertions(+), 588 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index e087c125629..8dcb8fa90a1 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -186,9 +186,6 @@ #define GEOS_ERROR_IF( COND, ... ) \ GEOS_ERROR_IF_CAUSE( COND, "Error cause: " STRINGIZE( COND ), __VA_ARGS__ ) -// TODO: to be deleted -#define GEOS_ERROR_CTX_IF( COND, MSG, ... ) GEOS_ERROR_IF( COND, MSG, __VA_ARGS__ ) - /** * @brief Raise a hard error and terminate the program. * @param ... Variable arguments with the following structure: @@ -250,9 +247,6 @@ #define GEOS_THROW_IF( COND, MSG, ... ) \ GEOS_THROW_IF_CAUSE( COND, "Error cause: " STRINGIZE( COND ), MSG, __VA_ARGS__ ) -// TODO: to be deleted -#define GEOS_THROW_CTX_IF( COND, MSG, EXCEPTION_TYPE, ... ) GEOS_THROW_IF( COND, MSG, EXCEPTION_TYPE, __VA_ARGS__ ) - /** * @brief Conditionally raise a hard error and terminate the program. * @param MSG a message to log (any expression that can be stream inserted) @@ -301,9 +295,6 @@ } \ } while( false ) -// TODO: to be deleted -#define GEOS_WARNING_CTX_IF( COND, MSG, ... ) GEOS_WARNING_IF( COND, MSG, __VA_ARGS__ ) - /** * @brief Conditionally report a warning. * @param COND an expression that will be evaluated as a predicate diff --git a/src/coreComponents/constitutive/ConstitutiveManager.cpp b/src/coreComponents/constitutive/ConstitutiveManager.cpp index 558265b93a8..97199f10000 100644 --- a/src/coreComponents/constitutive/ConstitutiveManager.cpp +++ b/src/coreComponents/constitutive/ConstitutiveManager.cpp @@ -74,7 +74,7 @@ ConstitutiveManager::hangConstitutiveRelation( string const & constitutiveRelati // 1. Allocate constitutive relation // we only register the constitutive relation if it has not been registered yet. - GEOS_ERROR_CTX_IF( constitutiveGroup->hasGroup( constitutiveRelationInstanceName ), + GEOS_ERROR_IF( constitutiveGroup->hasGroup( constitutiveRelationInstanceName ), GEOS_FMT( "Error! The constitutive relation {} has already been registered on the subRegion {}. " "Make sure that the same constitutive model is not listed as a material on a" " region both as a stand-alone one and as part of a compound constitutive model.", diff --git a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp index 747a32fed75..077e46c88bc 100644 --- a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp @@ -127,19 +127,19 @@ void JFunctionCapillaryPressure::postInputInitialization() CapillaryPressureBase::postInputInitialization(); integer const numPhases = m_phaseNames.size(); - GEOS_THROW_CTX_IF( numPhases != 2 && numPhases != 3, + GEOS_THROW_IF( numPhases != 2 && numPhases != 3, GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", getFullName() ), InputError, getDataContext() ); if( numPhases == 2 ) { - GEOS_THROW_CTX_IF( m_wettingNonWettingJFuncTableName.empty(), + GEOS_THROW_IF( m_wettingNonWettingJFuncTableName.empty(), GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the J-function table for the pair (wetting phase, non-wetting phase)", getFullName(), viewKeyStruct::wettingNonWettingJFuncTableNameString() ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_wettingNonWettingSurfaceTension <= 0, + GEOS_THROW_IF( m_wettingNonWettingSurfaceTension <= 0, GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the surface tension for the pair (wetting phase, non-wetting phase)", getFullName(), viewKeyStruct::wettingNonWettingSurfaceTensionString() ), @@ -147,7 +147,7 @@ void JFunctionCapillaryPressure::postInputInitialization() } else if( numPhases == 3 ) { - GEOS_THROW_CTX_IF( m_wettingIntermediateJFuncTableName.empty() || m_nonWettingIntermediateJFuncTableName.empty(), + GEOS_THROW_IF( m_wettingIntermediateJFuncTableName.empty() || m_nonWettingIntermediateJFuncTableName.empty(), GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify the J-function table" "for the pair (wetting phase, intermediate phase), " "and {} to specify the J-function table for the pair (non-wetting phase, intermediate phase)", @@ -155,7 +155,7 @@ void JFunctionCapillaryPressure::postInputInitialization() viewKeyStruct::wettingIntermediateJFuncTableNameString(), viewKeyStruct::nonWettingIntermediateJFuncTableNameString() ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_wettingIntermediateSurfaceTension <= 0 || m_nonWettingIntermediateSurfaceTension <= 0, + GEOS_THROW_IF( m_wettingIntermediateSurfaceTension <= 0 || m_nonWettingIntermediateSurfaceTension <= 0, GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify the surface tension" "for the pair (wetting phase, intermediate phase), " "and {} to specify the J-function table for the pair (non-wetting phase, intermediate phase)", @@ -175,7 +175,7 @@ void JFunctionCapillaryPressure::initializePreSubGroups() if( numPhases == 2 ) { - GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_wettingNonWettingJFuncTableName ), + GEOS_THROW_IF( !functionManager.hasGroup( m_wettingNonWettingJFuncTableName ), GEOS_FMT( "{}: the table function named {} could not be found", getFullName(), m_wettingNonWettingJFuncTableName ), @@ -188,7 +188,7 @@ void JFunctionCapillaryPressure::initializePreSubGroups() } else if( numPhases == 3 ) { - GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_wettingIntermediateJFuncTableName ), + GEOS_THROW_IF( !functionManager.hasGroup( m_wettingIntermediateJFuncTableName ), GEOS_FMT( "{}: the table function named {} could not be found", getFullName(), m_wettingIntermediateJFuncTableName ), @@ -196,7 +196,7 @@ void JFunctionCapillaryPressure::initializePreSubGroups() TableFunction const & jFuncTableWI = functionManager.getGroup< TableFunction >( m_wettingIntermediateJFuncTableName ); TableCapillaryPressureHelpers::validateCapillaryPressureTable( jFuncTableWI, getFullName(), false ); - GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_nonWettingIntermediateJFuncTableName ), + GEOS_THROW_IF( !functionManager.hasGroup( m_nonWettingIntermediateJFuncTableName ), GEOS_FMT( "{}: the table function named {} could not be found", getFullName(), m_nonWettingIntermediateJFuncTableName ), diff --git a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp index 5c838d1e627..7de0e51ddb4 100644 --- a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp @@ -73,14 +73,14 @@ void TableCapillaryPressure::postInputInitialization() CapillaryPressureBase::postInputInitialization(); integer const numPhases = m_phaseNames.size(); - GEOS_THROW_CTX_IF( numPhases != 2 && numPhases != 3, + GEOS_THROW_IF( numPhases != 2 && numPhases != 3, GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", getFullName() ), InputError, getDataContext() ); if( numPhases == 2 ) { - GEOS_THROW_CTX_IF( m_wettingNonWettingCapPresTableName.empty(), + GEOS_THROW_IF( m_wettingNonWettingCapPresTableName.empty(), GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the capillary pressure table for the pair (wetting phase, non-wetting phase)", getFullName(), viewKeyStruct::wettingNonWettingCapPresTableNameString() ), @@ -88,7 +88,7 @@ void TableCapillaryPressure::postInputInitialization() } else if( numPhases == 3 ) { - GEOS_THROW_CTX_IF( m_wettingIntermediateCapPresTableName.empty() || m_nonWettingIntermediateCapPresTableName.empty(), + GEOS_THROW_IF( m_wettingIntermediateCapPresTableName.empty() || m_nonWettingIntermediateCapPresTableName.empty(), GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify the capillary pressure table " "for the pair (wetting phase, intermediate phase), and {} to specify the capillary pressure table " "for the pair (non-wetting phase, intermediate phase)", @@ -121,7 +121,7 @@ void TableCapillaryPressure::initializePreSubGroups() } else if( numPhases == 3 ) { - GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_wettingIntermediateCapPresTableName ), + GEOS_THROW_IF( !functionManager.hasGroup( m_wettingIntermediateCapPresTableName ), GEOS_FMT( "{}: the table function named {} could not be found", getFullName(), m_wettingIntermediateCapPresTableName ), @@ -129,7 +129,7 @@ void TableCapillaryPressure::initializePreSubGroups() TableFunction const & capPresTableWI = functionManager.getGroup< TableFunction >( m_wettingIntermediateCapPresTableName ); TableCapillaryPressureHelpers::validateCapillaryPressureTable( capPresTableWI, getFullName(), false ); - GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_nonWettingIntermediateCapPresTableName ), + GEOS_THROW_IF( !functionManager.hasGroup( m_nonWettingIntermediateCapPresTableName ), GEOS_FMT( "{}: the table function named {} could not be found", getFullName(), m_nonWettingIntermediateCapPresTableName ), diff --git a/src/coreComponents/constitutive/contact/CoulombFriction.cpp b/src/coreComponents/constitutive/contact/CoulombFriction.cpp index b3597747316..24d1be395ff 100644 --- a/src/coreComponents/constitutive/contact/CoulombFriction.cpp +++ b/src/coreComponents/constitutive/contact/CoulombFriction.cpp @@ -57,7 +57,7 @@ CoulombFriction::~CoulombFriction() void CoulombFriction::postInputInitialization() { - GEOS_THROW_CTX_IF( m_frictionCoefficient < 0.0, + GEOS_THROW_IF( m_frictionCoefficient < 0.0, getFullName() << ": The provided friction coefficient is less than zero. Value: " << m_frictionCoefficient, InputError, getDataContext() ); diff --git a/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp b/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp index 7d96bab2485..a97017fe30e 100644 --- a/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp +++ b/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp @@ -57,7 +57,7 @@ HydraulicApertureTable::~HydraulicApertureTable() void HydraulicApertureTable::postInputInitialization() { - GEOS_THROW_CTX_IF( m_apertureTableName.empty(), + GEOS_THROW_IF( m_apertureTableName.empty(), getFullName() << ": the aperture table name " << m_apertureTableName << " is empty", InputError, getDataContext() ); @@ -71,7 +71,7 @@ void HydraulicApertureTable::allocateConstitutiveData( Group & parent, FunctionManager & functionManager = FunctionManager::getInstance(); - GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_apertureTableName ), + GEOS_THROW_IF( !functionManager.hasGroup( m_apertureTableName ), getFullName() << ": the aperture table named " << m_apertureTableName << " could not be found", InputError, getDataContext() ); @@ -122,25 +122,25 @@ void HydraulicApertureTable::validateApertureTable( TableFunction const & apertu ArrayOfArraysView< real64 const > const coords = apertureTable.getCoordinates(); arrayView1d< real64 const > const & hydraulicApertureValues = apertureTable.getValues(); - GEOS_THROW_CTX_IF( coords.size() > 1, + GEOS_THROW_IF( coords.size() > 1, getFullName() << ": Aperture limiter table cannot be greater than a 1D table.", InputError, getDataContext() ); arraySlice1d< real64 const > apertureValues = coords[0]; localIndex const size = apertureValues.size(); - GEOS_THROW_CTX_IF( coords( 0, size-1 ) > 0.0 || coords( 0, size-1 ) < 0.0, + GEOS_THROW_IF( coords( 0, size-1 ) > 0.0 || coords( 0, size-1 ) < 0.0, getFullName() << ": Invalid aperture limiter table. Last coordinate must be zero!", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( apertureValues.size() < 2, + GEOS_THROW_IF( apertureValues.size() < 2, getFullName() << ": Invalid aperture limiter table. Must have more than two points specified", InputError, getDataContext() ); localIndex const n = apertureValues.size()-1; real64 const slope = ( hydraulicApertureValues[n] - hydraulicApertureValues[n-1] ) / ( apertureValues[n] - apertureValues[n-1] ); - GEOS_THROW_CTX_IF( slope >= 1.0, + GEOS_THROW_IF( slope >= 1.0, getFullName() << ": Invalid aperture table. The slope of the last two points >= 1 is invalid.", InputError, getDataContext() ); } diff --git a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp index 4aa4b73995d..62b31c7d3b7 100644 --- a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp +++ b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp @@ -62,12 +62,12 @@ void ConstantDiffusion::allocateConstitutiveData( dataRepository::Group & parent void ConstantDiffusion::postInputInitialization() { - GEOS_THROW_CTX_IF( m_diffusivityComponents.size() != 3, + GEOS_THROW_IF( m_diffusivityComponents.size() != 3, GEOS_FMT( "{}: the size of the diffusivity must be equal to 3", getFullName() ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_diffusivityComponents[0] < 0 || + GEOS_THROW_IF( m_diffusivityComponents[0] < 0 || m_diffusivityComponents[1] < 0 || m_diffusivityComponents[2] < 0, GEOS_FMT( "{}: the components of the diffusivity tensor must be non-negative", diff --git a/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp b/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp index 93ec4eff5a0..031313c25f3 100644 --- a/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp +++ b/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp @@ -57,7 +57,7 @@ void DiffusionBase::postInputInitialization() GEOS_FMT( "{}: invalid number of phases", getFullName() ), InputError ); - GEOS_THROW_CTX_IF( numPhases != m_defaultPhaseDiffusivityMultiplier.size(), + GEOS_THROW_IF( numPhases != m_defaultPhaseDiffusivityMultiplier.size(), GEOS_FMT( "{}: the arrays in `{}` and `{}` must have the same size", getFullName(), viewKeyStruct::phaseNamesString(), viewKeyStruct::defaultPhaseDiffusivityMultiplierString() ), InputError, getDataContext() ); diff --git a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp index 678bc9c9456..84281954299 100644 --- a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp +++ b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp @@ -45,7 +45,7 @@ LinearIsotropicDispersion::deliverClone( string const & name, void LinearIsotropicDispersion::postInputInitialization() { - GEOS_THROW_CTX_IF( m_longitudinalDispersivity < 0, + GEOS_THROW_IF( m_longitudinalDispersivity < 0, GEOS_FMT( "{}: longitudinal dispersivity must be positive", getFullName() ), InputError, getDataContext() ); diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp index 347b0eb05a4..1f3f115c4f3 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp @@ -237,7 +237,7 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::postInputInitialization() // Make sure one (and only one) of m_flashModelParaFile or m_solubilityTables is provided bool const hasParamFile = !m_flashModelParaFile.empty(); bool const hasTables = !m_solubilityTables.empty(); - GEOS_THROW_CTX_IF( hasParamFile == hasTables, + GEOS_THROW_IF( hasParamFile == hasTables, GEOS_FMT( "{}: One and only one of {} or {} should be specified", getFullName(), viewKeyStruct::flashModelParaFileString(), viewKeyStruct::solubilityTablesString() ), @@ -275,7 +275,7 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() if( !strs.empty() ) { - GEOS_THROW_CTX_IF( strs.size() < 2, + GEOS_THROW_IF( strs.size() < 2, GEOS_FMT( "{}: missing PVT model in line '{}'", getFullName(), str ), InputError, getDataContext() ); @@ -322,25 +322,25 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() } // at this point, we have read the file and we check the consistency of non-thermal models - GEOS_THROW_CTX_IF( phase1InputParams[PHASE1::InputParamOrder::DENSITY].empty(), + GEOS_THROW_IF( phase1InputParams[PHASE1::InputParamOrder::DENSITY].empty(), GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE1::Density::catalogName() ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( phase2InputParams[PHASE2::InputParamOrder::DENSITY].empty(), + GEOS_THROW_IF( phase2InputParams[PHASE2::InputParamOrder::DENSITY].empty(), GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE2::Density::catalogName() ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( phase1InputParams[PHASE1::InputParamOrder::VISCOSITY].empty(), + GEOS_THROW_IF( phase1InputParams[PHASE1::InputParamOrder::VISCOSITY].empty(), GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE1::Viscosity::catalogName() ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( phase2InputParams[PHASE2::InputParamOrder::VISCOSITY].empty(), + GEOS_THROW_IF( phase2InputParams[PHASE2::InputParamOrder::VISCOSITY].empty(), GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE2::Viscosity::catalogName() ), InputError, getDataContext() ); // we also detect any inconsistency arising in the enthalpy models - GEOS_THROW_CTX_IF( phase1InputParams[PHASE1::InputParamOrder::ENTHALPY].empty() && + GEOS_THROW_IF( phase1InputParams[PHASE1::InputParamOrder::ENTHALPY].empty() && ( PHASE1::Enthalpy::catalogName() != PVTProps::NoOpPVTFunction::catalogName() ), GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE1::Enthalpy::catalogName() ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( phase2InputParams[PHASE2::InputParamOrder::ENTHALPY].empty() && + GEOS_THROW_IF( phase2InputParams[PHASE2::InputParamOrder::ENTHALPY].empty() && ( PHASE2::Enthalpy::catalogName() != PVTProps::NoOpPVTFunction::catalogName() ), GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE2::Enthalpy::catalogName() ), InputError, getDataContext() ); @@ -375,7 +375,7 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() if( !strs.empty() ) { - GEOS_THROW_CTX_IF( strs.size() < 2, + GEOS_THROW_IF( strs.size() < 2, GEOS_FMT( "{}: missing flash model in line '{}'", getFullName(), str ), InputError, getDataContext() ); @@ -402,7 +402,7 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() else { // The user must provide 1 or 2 tables. - GEOS_THROW_CTX_IF( m_solubilityTables.size() != 1 && m_solubilityTables.size() != 2, + GEOS_THROW_IF( m_solubilityTables.size() != 1 && m_solubilityTables.size() != 2, GEOS_FMT( "{}: The number of table names in {} must be 1 or 2", getFullName(), viewKeyStruct::solubilityTablesString() ), InputError, getDataContext() ); @@ -433,7 +433,7 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() outputOpts ); } - GEOS_THROW_CTX_IF( m_flash == nullptr, + GEOS_THROW_IF( m_flash == nullptr, GEOS_FMT( "{}: flash model {} not found in input files", getFullName(), FLASH::catalogName() ), InputError, getDataContext() ); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp index f01fc1b77e8..788b4e4edf5 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp @@ -55,7 +55,7 @@ void BlackOilFluid::readInputDataFromTableFunctions() void BlackOilFluid::readInputDataFromPVTFiles() { - GEOS_THROW_CTX_IF( m_formationVolFactorTableNames.size() > 0.0 || m_viscosityTableNames.size() > 0.0, + GEOS_THROW_IF( m_formationVolFactorTableNames.size() > 0.0 || m_viscosityTableNames.size() > 0.0, GEOS_FMT( "{}: input is redundant (both TableFunction names and pvt files)", getFullName() ), InputError, getDataContext() ); @@ -439,7 +439,7 @@ void BlackOilFluid::checkTableConsistency() const using PT = BlackOilFluid::PhaseType; // check for the presence of one bubble point - GEOS_THROW_CTX_IF( m_PVTO.undersaturatedPressure[m_PVTO.numSaturatedPoints - 1].size() <= 1, + GEOS_THROW_IF( m_PVTO.undersaturatedPressure[m_PVTO.numSaturatedPoints - 1].size() <= 1, GEOS_FMT( "{}: at least one bubble pressure is required in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), InputError, getDataContext() ); @@ -447,16 +447,16 @@ void BlackOilFluid::checkTableConsistency() const for( integer i = 0; i < m_PVTO.numSaturatedPoints - 1; ++i ) { // Rs must increase with Pb - GEOS_THROW_CTX_IF( ( m_PVTO.Rs[i + 1] - m_PVTO.Rs[i] ) <= 0, + GEOS_THROW_IF( ( m_PVTO.Rs[i + 1] - m_PVTO.Rs[i] ) <= 0, GEOS_FMT( "{}: Rs must increase with Pb in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), InputError, getDataContext() ); // Bo must increase with Pb - GEOS_THROW_CTX_IF( ( m_PVTO.saturatedBo[i + 1] - m_PVTO.saturatedBo[i] ) <= 0, + GEOS_THROW_IF( ( m_PVTO.saturatedBo[i + 1] - m_PVTO.saturatedBo[i] ) <= 0, GEOS_FMT( "{}: Bo must increase with Pb in saturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), InputError, getDataContext() ); // Viscosity must decrease with Pb - GEOS_THROW_CTX_IF( ( m_PVTO.saturatedViscosity[i + 1] - m_PVTO.saturatedViscosity[i] ) >= 0, + GEOS_THROW_IF( ( m_PVTO.saturatedViscosity[i + 1] - m_PVTO.saturatedViscosity[i] ) >= 0, GEOS_FMT( "{}: Viscosity must decrease with Pb in saturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), InputError, getDataContext() ); } @@ -467,15 +467,15 @@ void BlackOilFluid::checkTableConsistency() const for( integer j = 0; j < m_PVTO.undersaturatedPressure[i].size() - 1; ++j ) { // Pressure - GEOS_THROW_CTX_IF( ( m_PVTO.undersaturatedPressure[i][j + 1] - m_PVTO.undersaturatedPressure[i][j] ) <= 0, + GEOS_THROW_IF( ( m_PVTO.undersaturatedPressure[i][j + 1] - m_PVTO.undersaturatedPressure[i][j] ) <= 0, GEOS_FMT( "{}: P must decrease in undersaturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), InputError, getDataContext() ); // Bo must decrease with P - GEOS_THROW_CTX_IF( ( m_PVTO.undersaturatedBo[i][j + 1] - m_PVTO.undersaturatedBo[i][j] ) >= 0, + GEOS_THROW_IF( ( m_PVTO.undersaturatedBo[i][j + 1] - m_PVTO.undersaturatedBo[i][j] ) >= 0, GEOS_FMT( "{}: Bo must decrease with P in undersaturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), InputError, getDataContext() ); // Viscosity must increase with Pb - GEOS_THROW_CTX_IF( ( m_PVTO.undersaturatedViscosity[i][j + 1] - m_PVTO.undersaturatedViscosity[i][j] ) < -1e-10, + GEOS_THROW_IF( ( m_PVTO.undersaturatedViscosity[i][j + 1] - m_PVTO.undersaturatedViscosity[i][j] ) < -1e-10, GEOS_FMT( "{}: viscosity must increase with P in undersaturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), InputError, getDataContext() ); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp index 8de796023f9..ebb05bc6d85 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp @@ -102,7 +102,7 @@ void BlackOilFluidBase::fillWaterData( array1d< array1d< real64 > > const & tabl getFullName() << ": four columns (pressure, formation volume factor, compressibility, and viscosity) are expected for water", InputError ); - GEOS_THROW_CTX_IF( m_waterParams.referencePressure > 0.0 || m_waterParams.formationVolFactor > 0.0 || + GEOS_THROW_IF( m_waterParams.referencePressure > 0.0 || m_waterParams.formationVolFactor > 0.0 || m_waterParams.compressibility > 0.0 || m_waterParams.viscosity > 0.0, getFullName() << ": input is redundant (user provided both water data and a water pvt file)", InputError, getDataContext() ); @@ -280,7 +280,7 @@ void BlackOilFluidBase::checkTablesParameters( real64 const pressure, void BlackOilFluidBase::createAllKernelWrappers() { - GEOS_THROW_CTX_IF( m_hydrocarbonPhaseOrder.size() != 1 && m_hydrocarbonPhaseOrder.size() != 2, + GEOS_THROW_IF( m_hydrocarbonPhaseOrder.size() != 1 && m_hydrocarbonPhaseOrder.size() != 2, GEOS_FMT( "{}: the number of hydrocarbon phases must be 1 (oil) or 2 (oil+gas)", getFullName() ), InputError, getDataContext() ); @@ -311,7 +311,7 @@ void BlackOilFluidBase::validateTable( TableFunction const & table, // we only issue a warning here, as we still want to allow this configuration for( localIndex i = 3; i < property.size(); ++i ) { - GEOS_THROW_CTX_IF( (property[i] - property[i-1]) * (property[i-1] - property[i-2]) < 0, + GEOS_THROW_IF( (property[i] - property[i-1]) * (property[i-1] - property[i-2]) < 0, GEOS_FMT( "{}: in table '{}', viscosity values must be monotone", getFullName(), table.getName() ), InputError, getDataContext() ); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp index 2811d3d9386..b9fb28a6496 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp @@ -38,7 +38,7 @@ void DeadOilFluid::postInputInitialization() BlackOilFluidBase::postInputInitialization(); integer const numComps = numFluidComponents(); - GEOS_THROW_CTX_IF( numComps != 2 && numComps != 3, + GEOS_THROW_IF( numComps != 2 && numComps != 3, GEOS_FMT( "{}: this model only supports 2 or 3 components", getFullName() ), InputError, getDataContext() ); } @@ -48,7 +48,7 @@ void DeadOilFluid::readInputDataFromPVTFiles() GEOS_THROW_IF_NE_MSG( m_tableFiles.size(), numFluidPhases(), GEOS_FMT( "{}: the number of table files must be equal to the number of phases", getFullName() ), InputError ); - GEOS_THROW_CTX_IF( m_formationVolFactorTableNames.size() > 0.0 || m_viscosityTableNames.size() > 0.0, + GEOS_THROW_IF( m_formationVolFactorTableNames.size() > 0.0 || m_viscosityTableNames.size() > 0.0, GEOS_FMT( "{}: input is redundant (both TableFunction names and pvt files)", getFullName() ), InputError, getDataContext() ); @@ -71,7 +71,7 @@ void DeadOilFluid::readInputDataFromPVTFiles() void DeadOilFluid::readInputDataFromTableFunctions() { - GEOS_THROW_CTX_IF( !m_tableFiles.empty(), + GEOS_THROW_IF( !m_tableFiles.empty(), GEOS_FMT( "{}: input is redundant (both TableFunction names and pvt files)", getFullName() ), InputError, getDataContext() ); @@ -114,10 +114,10 @@ void DeadOilFluid::readInputDataFromTableFunctions() FunctionManager const & functionManager = FunctionManager::getInstance(); for( integer iph = 0; iph < m_hydrocarbonPhaseOrder.size(); ++iph ) { - GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_formationVolFactorTableNames[iph] ), + GEOS_THROW_IF( !functionManager.hasGroup( m_formationVolFactorTableNames[iph] ), GEOS_FMT( "{}: formation volume factor table '{}' not found", getFullName(), m_formationVolFactorTableNames[iph] ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_viscosityTableNames[iph] ), + GEOS_THROW_IF( !functionManager.hasGroup( m_viscosityTableNames[iph] ), GEOS_FMT( "{}: viscosity table '{}' not found", getFullName(), m_viscosityTableNames[iph] ), InputError, getDataContext() ); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/parameters/PressureTemperatureCoordinates.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/parameters/PressureTemperatureCoordinates.cpp index fc978294e3c..fe91694eafc 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/parameters/PressureTemperatureCoordinates.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/parameters/PressureTemperatureCoordinates.cpp @@ -70,7 +70,7 @@ void PressureTemperatureCoordinates::postInputInitializationImpl( MultiFluidBase InputError ); // Values must be strictly increasing - GEOS_THROW_CTX_IF( !isStrictlyIncreasing( m_pressureCoordinates.toSliceConst()), + GEOS_THROW_IF( !isStrictlyIncreasing( m_pressureCoordinates.toSliceConst()), GEOS_FMT( "{}: invalid values of pressure coordinates provided in {}. " "Values must be strictly increasing.", fluid->getFullName(), viewKeyStruct::pressureCoordinatesString() ), InputError, fluid->getDataContext() ); @@ -85,7 +85,7 @@ void PressureTemperatureCoordinates::postInputInitializationImpl( MultiFluidBase InputError ); // Values must be strictly increasing - GEOS_THROW_CTX_IF( !isStrictlyIncreasing( m_temperatureCoordinates.toSliceConst()), + GEOS_THROW_IF( !isStrictlyIncreasing( m_temperatureCoordinates.toSliceConst()), GEOS_FMT( "{}: invalid values of temperature coordinates provided in {}. " "Values must be strictly increasing.", fluid->getFullName(), viewKeyStruct::temperatureCoordinatesString() ), InputError, fluid->getDataContext() ); diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp index a4b73aeb0b2..a9906bf8525 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp @@ -156,7 +156,7 @@ void ReactiveBrineFluid< PHASE > ::createPVTModels() if( !strs.empty() ) { - GEOS_THROW_CTX_IF( strs.size() < 2, + GEOS_THROW_IF( strs.size() < 2, GEOS_FMT( "{}: missing PVT model in line '{}'", getFullName(), str ), InputError, getDataContext() ); @@ -191,14 +191,14 @@ void ReactiveBrineFluid< PHASE > ::createPVTModels() } // at this point, we have read the file and we check the consistency of non-thermal models - GEOS_THROW_CTX_IF( phase1InputParams[PHASE::InputParamOrder::DENSITY].empty(), + GEOS_THROW_IF( phase1InputParams[PHASE::InputParamOrder::DENSITY].empty(), GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE::Density::catalogName() ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( phase1InputParams[PHASE::InputParamOrder::VISCOSITY].empty(), + GEOS_THROW_IF( phase1InputParams[PHASE::InputParamOrder::VISCOSITY].empty(), GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE::Viscosity::catalogName() ), InputError, getDataContext() ); // we also detect any inconsistency arising in the enthalpy models - GEOS_THROW_CTX_IF( phase1InputParams[PHASE::InputParamOrder::ENTHALPY].empty() && + GEOS_THROW_IF( phase1InputParams[PHASE::InputParamOrder::ENTHALPY].empty() && ( PHASE::Enthalpy::catalogName() != PVTProps::NoOpPVTFunction::catalogName() ), GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE::Enthalpy::catalogName() ), InputError, getDataContext() ); diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp index c99765bf908..4bd5777b862 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp @@ -84,32 +84,32 @@ void ParticleFluid::postInputInitialization() { ParticleFluidBase::postInputInitialization(); - GEOS_ERROR_CTX_IF( m_proppantDensity < 500.0, + GEOS_ERROR_IF( m_proppantDensity < 500.0, "Invalid proppantDensity in ParticleFluid " << getDataContext() << ", which must >= 500.0 ", getDataContext() ); - GEOS_ERROR_CTX_IF( m_proppantDiameter < 10e-6, + GEOS_ERROR_IF( m_proppantDiameter < 10e-6, "Invalid proppantDiameter in ParticleFluid " << getDataContext() << ", which must >= 10e-6 ", getDataContext() ); - GEOS_ERROR_CTX_IF( m_hinderedSettlingCoefficient< 0.0 || m_hinderedSettlingCoefficient > 10.0, + GEOS_ERROR_IF( m_hinderedSettlingCoefficient< 0.0 || m_hinderedSettlingCoefficient > 10.0, "Invalid hinderedSettlingCoefficient in ParticleFluid " << getDataContext() << ", which must between 0 and 10 ", getDataContext() ); - GEOS_ERROR_CTX_IF( m_collisionAlpha < 1.0, + GEOS_ERROR_IF( m_collisionAlpha < 1.0, "Invalid collisionAlpha in ParticleFluid " << getDataContext() << ", which must >= 1 ", getDataContext() ); - GEOS_ERROR_CTX_IF( m_collisionBeta < 0.0, + GEOS_ERROR_IF( m_collisionBeta < 0.0, "Invalid collisionBeta in ParticleFluid " << getDataContext() << ", which must >= 0", getDataContext() ); - GEOS_ERROR_CTX_IF( m_slipConcentration > 0.3, + GEOS_ERROR_IF( m_slipConcentration > 0.3, "Invalid slipConcentration in ParticleFluid " << getDataContext() << ", which must <= 0.3", getDataContext() ); diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp index 4646f0a64ae..55907aa8821 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp @@ -90,7 +90,7 @@ void ThermalCompressibleSinglePhaseFluid::postInputInitialization() // Due to the way update wrapper is currently implemented, we can only support one model type auto const checkModelType = [&]( ExponentApproximationType const value, auto const & attribute ) { - GEOS_THROW_CTX_IF( value != ExponentApproximationType::Linear && value != ExponentApproximationType::Full, + GEOS_THROW_IF( value != ExponentApproximationType::Linear && value != ExponentApproximationType::Full, GEOS_FMT( "{}: invalid model type in attribute '{}' (only linear or fully exponential currently supported)", getFullName(), attribute ), InputError, getDataContext() ); }; diff --git a/src/coreComponents/constitutive/permeability/PressurePermeability.cpp b/src/coreComponents/constitutive/permeability/PressurePermeability.cpp index 3778b2e3604..8bb8552564b 100644 --- a/src/coreComponents/constitutive/permeability/PressurePermeability.cpp +++ b/src/coreComponents/constitutive/permeability/PressurePermeability.cpp @@ -71,7 +71,7 @@ void PressurePermeability::postInputInitialization() { for( localIndex i=0; i < 3; i++ ) { - GEOS_ERROR_CTX_IF( fabs( m_pressureDependenceConstants[i] ) < 1e-15 && m_presModelType == PressureModelType::Hyperbolic, + GEOS_ERROR_IF( fabs( m_pressureDependenceConstants[i] ) < 1e-15 && m_presModelType == PressureModelType::Hyperbolic, getDataContext() << ": the pressure dependent constant at component " << i << " is too close to zero, which is not allowed for the hyperbolic model.", getDataContext() ); } diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp index 66c8344690a..680d0a83673 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp @@ -70,7 +70,7 @@ void BrooksCoreyBakerRelativePermeability::postInputInitialization() { RelativePermeabilityBase::postInputInitialization(); - GEOS_THROW_CTX_IF( m_phaseOrder[PhaseType::OIL] < 0, + GEOS_THROW_IF( m_phaseOrder[PhaseType::OIL] < 0, GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), InputError, getDataContext() ); diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp index e9f57733364..59a3b8811c6 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp @@ -70,7 +70,7 @@ void BrooksCoreyStone2RelativePermeability::postInputInitialization() { RelativePermeabilityBase::postInputInitialization(); - GEOS_THROW_CTX_IF( m_phaseOrder[PhaseType::OIL] < 0, + GEOS_THROW_IF( m_phaseOrder[PhaseType::OIL] < 0, GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), InputError, getDataContext() ); diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp index 05d9dbb91a0..3849dde9fad 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp @@ -90,20 +90,20 @@ void TableRelativePermeability::postInputInitialization() RelativePermeabilityBase::postInputInitialization(); integer const numPhases = m_phaseNames.size(); - GEOS_THROW_CTX_IF( numPhases != 2 && numPhases != 3, + GEOS_THROW_IF( numPhases != 2 && numPhases != 3, GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", getFullName() ), InputError, getDataContext() ); if( numPhases == 2 ) { - GEOS_THROW_CTX_IF( m_wettingNonWettingRelPermTableNames.empty(), + GEOS_THROW_IF( m_wettingNonWettingRelPermTableNames.empty(), GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the relative permeability tables for the pair (wetting phase, non-wetting phase)", getFullName(), viewKeyStruct::wettingNonWettingRelPermTableNamesString() ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_wettingNonWettingRelPermTableNames.size() != 2, + GEOS_THROW_IF( m_wettingNonWettingRelPermTableNames.size() != 2, GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify exactly two names: first the name of the wetting phase relperm table, second the name on the non-wetting phase relperm table", getFullName(), @@ -113,7 +113,7 @@ void TableRelativePermeability::postInputInitialization() } else if( numPhases == 3 ) { - GEOS_THROW_CTX_IF( m_wettingIntermediateRelPermTableNames.empty() || m_nonWettingIntermediateRelPermTableNames.empty(), + GEOS_THROW_IF( m_wettingIntermediateRelPermTableNames.empty() || m_nonWettingIntermediateRelPermTableNames.empty(), GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify the relative permeability tables for the pair (wetting phase, intermediate phase), and {} to specify the relative permeability tables for the pair (non-wetting phase, intermediate phase)", getFullName(), @@ -121,14 +121,14 @@ void TableRelativePermeability::postInputInitialization() viewKeyStruct::nonWettingIntermediateRelPermTableNamesString() ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_wettingIntermediateRelPermTableNames.size() != 2, + GEOS_THROW_IF( m_wettingIntermediateRelPermTableNames.size() != 2, GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: first the name of the wetting phase relperm table, second the name on the intermediate phase relperm table", getFullName(), viewKeyStruct::wettingIntermediateRelPermTableNamesString() ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_nonWettingIntermediateRelPermTableNames.size() != 2, + GEOS_THROW_IF( m_nonWettingIntermediateRelPermTableNames.size() != 2, GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: first the name of the non-wetting phase relperm table, second the name on the intermediate phase relperm table", getFullName(), @@ -160,7 +160,7 @@ void TableRelativePermeability::initializePreSubGroups() { for( size_t ip = 0; ip < m_wettingNonWettingRelPermTableNames.size(); ++ip ) { - GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_wettingNonWettingRelPermTableNames[ip] ), + GEOS_THROW_IF( !functionManager.hasGroup( m_wettingNonWettingRelPermTableNames[ip] ), GEOS_FMT( "{}: the table function named {} could not be found", getFullName(), m_wettingNonWettingRelPermTableNames[ip] ), @@ -189,7 +189,7 @@ void TableRelativePermeability::initializePreSubGroups() { for( size_t ip = 0; ip < m_wettingIntermediateRelPermTableNames.size(); ++ip ) { - GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_wettingIntermediateRelPermTableNames[ip] ), + GEOS_THROW_IF( !functionManager.hasGroup( m_wettingIntermediateRelPermTableNames[ip] ), GEOS_FMT( "{}: the table function named {} could not be found", getFullName(), m_wettingIntermediateRelPermTableNames[ip] ), @@ -217,7 +217,7 @@ void TableRelativePermeability::initializePreSubGroups() } for( size_t ip = 0; ip < m_nonWettingIntermediateRelPermTableNames.size(); ++ip ) { - GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_nonWettingIntermediateRelPermTableNames[ip] ), + GEOS_THROW_IF( !functionManager.hasGroup( m_nonWettingIntermediateRelPermTableNames[ip] ), GEOS_FMT( "{}: the table function named {} could not be found", getFullName(), m_nonWettingIntermediateRelPermTableNames[ip] ), diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp index a8a9446ebdb..2b7caf2e115 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp @@ -58,14 +58,14 @@ TableRelativePermeabilityHelpers::validateRelativePermeabilityTable( TableFuncti phaseRelPermMaxEndPoint = relPerm[relPerm.size() - 1]; // note that the TableFunction class has already checked that coords.sizeOfArray( 0 ) == relPerm.size() - GEOS_THROW_CTX_IF( !isZero( relPerm[0] ), + GEOS_THROW_IF( !isZero( relPerm[0] ), GEOS_FMT( "{}: TableFunction '{}' first value must be equal to 0", fullConstitutiveName, relPermTable.getDataContext() ), InputError, relPermTable.getDataContext() ); for( localIndex i = 1; i < coords.sizeOfArray( 0 ); ++i ) { // check phase volume fraction - GEOS_THROW_CTX_IF( phaseVolFrac[i] < 0 || phaseVolFrac[i] > 1, + GEOS_THROW_IF( phaseVolFrac[i] < 0 || phaseVolFrac[i] > 1, GEOS_FMT( "{}: TableFunction '{}' values must be between 0 and 1", fullConstitutiveName, relPermTable.getDataContext() ), InputError, relPermTable.getDataContext() ); @@ -73,7 +73,7 @@ TableRelativePermeabilityHelpers::validateRelativePermeabilityTable( TableFuncti // note that the TableFunction class has already checked that the coordinates are monotone // check phase relative permeability - GEOS_THROW_CTX_IF( !isZero( relPerm[i] ) && (relPerm[i] - relPerm[i-1]) < 1e-15, + GEOS_THROW_IF( !isZero( relPerm[i] ) && (relPerm[i] - relPerm[i-1]) < 1e-15, GEOS_FMT( "{}: TableFunction '{}' values must be strictly increasing (|Delta kr| > 1e-15 between two non-zero values)", fullConstitutiveName, relPermTable.getDataContext() ), InputError, relPermTable.getDataContext() ); diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp index e5d22573b2f..ef26eb97358 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp @@ -162,7 +162,7 @@ void TableRelativePermeabilityHysteresis::postInputInitialization() using IPT = TableRelativePermeabilityHysteresis::ImbibitionPhasePairPhaseType; integer const numPhases = m_phaseNames.size(); - GEOS_THROW_CTX_IF( numPhases != 2 && numPhases != 3, + GEOS_THROW_IF( numPhases != 2 && numPhases != 3, GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", getFullName() ), InputError, getDataContext() ); @@ -175,14 +175,14 @@ void TableRelativePermeabilityHysteresis::postInputInitialization() if( numPhases == 2 ) { - GEOS_THROW_CTX_IF( m_drainageWettingNonWettingRelPermTableNames.empty(), + GEOS_THROW_IF( m_drainageWettingNonWettingRelPermTableNames.empty(), GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the relative permeability tables " "for the pair (wetting phase, non-wetting phase)", getFullName(), viewKeyStruct::drainageWettingNonWettingRelPermTableNamesString() ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_drainageWettingNonWettingRelPermTableNames.size() != 2, + GEOS_THROW_IF( m_drainageWettingNonWettingRelPermTableNames.size() != 2, GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify exactly two names: " "first the name of the wetting phase relperm table, second the name on the non-wetting phase relperm table", getFullName(), @@ -198,7 +198,7 @@ void TableRelativePermeabilityHysteresis::postInputInitialization() } else if( numPhases == 3 ) { - GEOS_THROW_CTX_IF( m_drainageWettingIntermediateRelPermTableNames.empty() || m_drainageNonWettingIntermediateRelPermTableNames.empty(), + GEOS_THROW_IF( m_drainageWettingIntermediateRelPermTableNames.empty() || m_drainageNonWettingIntermediateRelPermTableNames.empty(), GEOS_FMT( "{}: for a three-phase flow simulation, " "we must use {} to specify the relative permeability tables for the pair (wetting phase, intermediate phase), " "and {} to specify the relative permeability tables for the pair (non-wetting phase, intermediate phase)", @@ -207,14 +207,14 @@ void TableRelativePermeabilityHysteresis::postInputInitialization() viewKeyStruct::drainageNonWettingIntermediateRelPermTableNamesString() ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_drainageWettingIntermediateRelPermTableNames.size() != 2, + GEOS_THROW_IF( m_drainageWettingIntermediateRelPermTableNames.size() != 2, GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: " "first the name of the wetting phase relperm table, second the name on the intermediate phase relperm table", getFullName(), viewKeyStruct::drainageWettingIntermediateRelPermTableNamesString() ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_drainageNonWettingIntermediateRelPermTableNames.size() != 2, + GEOS_THROW_IF( m_drainageNonWettingIntermediateRelPermTableNames.size() != 2, GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: " "first the name of the non-wetting phase relperm table, second the name on the intermediate phase relperm table", getFullName(), @@ -229,7 +229,7 @@ void TableRelativePermeabilityHysteresis::postInputInitialization() ? 0 : 1; } - GEOS_THROW_CTX_IF( m_phaseHasHysteresis[IPT::WETTING] == 0 && m_phaseHasHysteresis[IPT::NONWETTING] == 0, + GEOS_THROW_IF( m_phaseHasHysteresis[IPT::WETTING] == 0 && m_phaseHasHysteresis[IPT::NONWETTING] == 0, GEOS_FMT( "{}: we must use {} or {} to specify at least one imbibition relative permeability table", getFullName(), viewKeyStruct::imbibitionWettingRelPermTableNameString(), @@ -294,7 +294,7 @@ void TableRelativePermeabilityHysteresis::checkExistenceAndValidateWettingRelPer imbibitionPhaseRelPermMinEndPoint, imbibitionPhaseRelPermMaxEndPoint ); - GEOS_THROW_CTX_IF( !isZero( imbibitionPhaseMinVolFraction - drainagePhaseMinVolFraction ), + GEOS_THROW_IF( !isZero( imbibitionPhaseMinVolFraction - drainagePhaseMinVolFraction ), GEOS_FMT( "{}: the critical wetting-phase volume fraction (saturation) must be the same in drainage and imbibition.\n" "However, we found that the drainage critical wetting-phase volume fraction is {}, " "whereas the imbibition critical wetting-phase volume fraction is {}", @@ -302,7 +302,7 @@ void TableRelativePermeabilityHysteresis::checkExistenceAndValidateWettingRelPer drainagePhaseMinVolFraction, imbibitionPhaseMinVolFraction ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( imbibitionPhaseMaxVolFraction > drainagePhaseMaxVolFraction, + GEOS_THROW_IF( imbibitionPhaseMaxVolFraction > drainagePhaseMaxVolFraction, GEOS_FMT( "{}: the maximum wetting-phase volume fraction (saturation) must be smaller in imbibition (compared to the drainage value).\n" "However, we found that the drainage maximum wetting-phase volume fraction is {}, " "whereas the imbibition maximum wetting-phase volume fraction is {}", @@ -310,7 +310,7 @@ void TableRelativePermeabilityHysteresis::checkExistenceAndValidateWettingRelPer drainagePhaseMaxVolFraction, imbibitionPhaseMaxVolFraction ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( imbibitionPhaseRelPermMaxEndPoint > drainagePhaseRelPermMaxEndPoint, + GEOS_THROW_IF( imbibitionPhaseRelPermMaxEndPoint > drainagePhaseRelPermMaxEndPoint, GEOS_FMT( "{}: the maximum wetting-phase relperm must be smaller in imbibition (compared to the drainage value).\n" "However, we found that the drainage maximum wetting-phase relperm is {}, " "whereas the imbibition maximum wetting-phase relperm is {}", @@ -371,7 +371,7 @@ void TableRelativePermeabilityHysteresis::checkExistenceAndValidateNonWettingRel imbibitionPhaseRelPermMinEndPoint, imbibitionPhaseRelPermMaxEndPoint ); - GEOS_THROW_CTX_IF( !isZero ( imbibitionPhaseMaxVolFraction - drainagePhaseMaxVolFraction ), + GEOS_THROW_IF( !isZero ( imbibitionPhaseMaxVolFraction - drainagePhaseMaxVolFraction ), GEOS_FMT( string( "{}: the maximum non-wetting-phase volume fraction (saturation) must be the same in drainage and imbibition.\n" ) + string( "However, we found that the drainage maximum wetting-phase volume fraction is {}, " ) + string( "whereas the imbibition maximum wetting-phase volume fraction is {}" ), @@ -379,7 +379,7 @@ void TableRelativePermeabilityHysteresis::checkExistenceAndValidateNonWettingRel drainagePhaseMaxVolFraction, imbibitionPhaseMaxVolFraction ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( !isZero ( imbibitionPhaseRelPermMaxEndPoint - drainagePhaseRelPermMaxEndPoint ), + GEOS_THROW_IF( !isZero ( imbibitionPhaseRelPermMaxEndPoint - drainagePhaseRelPermMaxEndPoint ), GEOS_FMT( string( "{}: the non-wetting-phase relperm endpoint must be the same in drainage and imbibition.\n" ) + string( "However, we found that the drainage endpoint wetting-phase relperm is {}, " ) + string( "whereas the imbibition endpoint wetting-phase relperm is {}" ), @@ -387,7 +387,7 @@ void TableRelativePermeabilityHysteresis::checkExistenceAndValidateNonWettingRel drainagePhaseRelPermMaxEndPoint, imbibitionPhaseRelPermMaxEndPoint ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( imbibitionPhaseMinVolFraction < drainagePhaseMinVolFraction, + GEOS_THROW_IF( imbibitionPhaseMinVolFraction < drainagePhaseMinVolFraction, GEOS_FMT( string( "{}: the critical wetting-phase volume fraction (saturation) must be larger in imbibition (compared to the drainage value).\n" ) + string( "However, we found that the drainage critical wetting-phase volume fraction is {}, " ) + string( "whereas the imbibition critical wetting-phase volume fraction is {}" ), @@ -447,7 +447,7 @@ void TableRelativePermeabilityHysteresis::checkExistenceAndValidateRelPermTable( FunctionManager const & functionManager = FunctionManager::getInstance(); // check if the table actually exists - GEOS_THROW_CTX_IF( !functionManager.hasGroup( relPermTableName ), + GEOS_THROW_IF( !functionManager.hasGroup( relPermTableName ), GEOS_FMT( "{}: the table function named {} could not be found", getFullName(), relPermTableName ), diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp index 96758fcff69..547adb80d27 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp @@ -72,7 +72,7 @@ void VanGenuchtenBakerRelativePermeability::postInputInitialization() { RelativePermeabilityBase::postInputInitialization(); - GEOS_THROW_CTX_IF( m_phaseOrder[PhaseType::OIL] < 0, + GEOS_THROW_IF( m_phaseOrder[PhaseType::OIL] < 0, GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), InputError, getDataContext() ); diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp index fc2635b3c43..32227864753 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp @@ -72,7 +72,7 @@ void VanGenuchtenStone2RelativePermeability::postInputInitialization() { RelativePermeabilityBase::postInputInitialization(); - GEOS_THROW_CTX_IF( m_phaseOrder[PhaseType::OIL] < 0, + GEOS_THROW_IF( m_phaseOrder[PhaseType::OIL] < 0, GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), InputError, getDataContext() ); diff --git a/src/coreComponents/constitutive/solid/Damage.cpp b/src/coreComponents/constitutive/solid/Damage.cpp index cd44c56d9e7..05f36662fed 100644 --- a/src/coreComponents/constitutive/solid/Damage.cpp +++ b/src/coreComponents/constitutive/solid/Damage.cpp @@ -148,19 +148,19 @@ void Damage< BASE >::postInputInitialization() { BASE::postInputInitialization(); - GEOS_ERROR_CTX_IF( m_extDrivingForceFlag != 0 && m_extDrivingForceFlag!= 1, + GEOS_ERROR_IF( m_extDrivingForceFlag != 0 && m_extDrivingForceFlag!= 1, BASE::getDataContext() << ": invalid external driving force flag option - must" " be 0 or 1", BASE::getDataContext() ); - GEOS_ERROR_CTX_IF( m_extDrivingForceFlag == 1 && m_defaultTensileStrength <= 0.0, + GEOS_ERROR_IF( m_extDrivingForceFlag == 1 && m_defaultTensileStrength <= 0.0, BASE::getDataContext() << ": tensile strength must be input and positive when the" " external driving force flag is turned on", BASE::getDataContext() ); - GEOS_ERROR_CTX_IF( m_extDrivingForceFlag == 1 && m_defaultCompressStrength <= 0.0, + GEOS_ERROR_IF( m_extDrivingForceFlag == 1 && m_defaultCompressStrength <= 0.0, BASE::getDataContext() << ": compressive strength must be input and positive when the" " external driving force flag is turned on", BASE::getDataContext() ); - GEOS_ERROR_CTX_IF( m_extDrivingForceFlag == 1 && m_defaultDeltaCoefficient < 0.0, + GEOS_ERROR_IF( m_extDrivingForceFlag == 1 && m_defaultDeltaCoefficient < 0.0, BASE::getDataContext() << ": delta coefficient must be input and non-negative when the" " external driving force flag is turned on", BASE::getDataContext() ); diff --git a/src/coreComponents/constitutive/solid/DelftEgg.cpp b/src/coreComponents/constitutive/solid/DelftEgg.cpp index 045412a5ff4..cf509f26fe5 100644 --- a/src/coreComponents/constitutive/solid/DelftEgg.cpp +++ b/src/coreComponents/constitutive/solid/DelftEgg.cpp @@ -113,16 +113,16 @@ void DelftEgg::postInputInitialization() { ElasticIsotropic::postInputInitialization(); - GEOS_THROW_CTX_IF( m_defaultCslSlope <= 0, + GEOS_THROW_IF( m_defaultCslSlope <= 0, getFullName() << ": Non-positive slope of critical state line detected", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_defaultShapeParameter < 1., + GEOS_THROW_IF( m_defaultShapeParameter < 1., getFullName() << ": Shape parameter for yield surface must be greater than or equal to one", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_defaultVirginCompressionIndex <= 0, + GEOS_THROW_IF( m_defaultVirginCompressionIndex <= 0, getFullName() << ": Non-positive virgin compression index detected", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_defaultVirginCompressionIndex <= m_defaultRecompressionIndex, + GEOS_THROW_IF( m_defaultVirginCompressionIndex <= m_defaultRecompressionIndex, getFullName() << ": Recompression index should exceed virgin recompression index", InputError, getDataContext() ); diff --git a/src/coreComponents/constitutive/solid/DruckerPrager.cpp b/src/coreComponents/constitutive/solid/DruckerPrager.cpp index 8637841cc00..9cce2aaeb63 100644 --- a/src/coreComponents/constitutive/solid/DruckerPrager.cpp +++ b/src/coreComponents/constitutive/solid/DruckerPrager.cpp @@ -102,16 +102,16 @@ void DruckerPrager::postInputInitialization() { ElasticIsotropic::postInputInitialization(); - GEOS_THROW_CTX_IF( m_defaultCohesion < 0, + GEOS_THROW_IF( m_defaultCohesion < 0, getFullName() << ": Negative cohesion value detected", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_defaultFrictionAngle < 0, + GEOS_THROW_IF( m_defaultFrictionAngle < 0, getFullName() << ": Negative friction angle detected", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_defaultDilationAngle < 0, + GEOS_THROW_IF( m_defaultDilationAngle < 0, getFullName() << ": Negative dilation angle detected", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_defaultFrictionAngle < m_defaultDilationAngle, + GEOS_THROW_IF( m_defaultFrictionAngle < m_defaultDilationAngle, getFullName() << ": Dilation angle should not exceed friction angle", InputError, getDataContext() ); diff --git a/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp b/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp index 05decde3f65..bbf756dc2ea 100644 --- a/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp +++ b/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp @@ -118,22 +118,22 @@ void DruckerPragerExtended::postInputInitialization() { ElasticIsotropic::postInputInitialization(); - GEOS_THROW_CTX_IF( m_defaultCohesion < 0, + GEOS_THROW_IF( m_defaultCohesion < 0, getFullName() << ": Negative cohesion value detected", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_defaultInitialFrictionAngle < 0, + GEOS_THROW_IF( m_defaultInitialFrictionAngle < 0, getFullName() << ": Negative initial friction angle detected", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_defaultResidualFrictionAngle < 0, + GEOS_THROW_IF( m_defaultResidualFrictionAngle < 0, getFullName() << ": Negative residual friction angle detected", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_defaultDilationRatio < 0, + GEOS_THROW_IF( m_defaultDilationRatio < 0, getFullName() << ": Dilation ratio out of [0,1] range detected", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_defaultDilationRatio > 1, + GEOS_THROW_IF( m_defaultDilationRatio > 1, getFullName() << ": Dilation ratio out of [0,1] range detected", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_defaultHardening < 0, + GEOS_THROW_IF( m_defaultHardening < 0, getFullName() << ": Negative hardening parameter detected", InputError, getDataContext() ); diff --git a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp index 5c7f7641805..f11c4f7559d 100644 --- a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp +++ b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp @@ -104,11 +104,11 @@ void ElasticIsotropicPressureDependent::postInputInitialization() GEOS_ERROR_IF( numConstantsSpecified != 2, getFullName() << ": A specific pair of elastic constants is required: (Cr, G). " ); - GEOS_THROW_CTX_IF( m_defaultRecompressionIndex <= 0, + GEOS_THROW_IF( m_defaultRecompressionIndex <= 0, getFullName() << ": Non-positive recompression index detected " << m_defaultRecompressionIndex, InputError, getDataContext() ); real64 poisson = conversions::bulkModAndShearMod::toPoissonRatio( -1 * m_defaultRefPressure / m_defaultRecompressionIndex, m_defaultShearModulus ); - GEOS_THROW_CTX_IF( poisson < 0, + GEOS_THROW_IF( poisson < 0, getFullName() << ": Elastic parameters lead to negative Poisson ratio at reference pressure ", InputError, getDataContext() ); diff --git a/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp b/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp index ec5a1284b11..c220d161b37 100644 --- a/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp +++ b/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp @@ -91,13 +91,13 @@ void ModifiedCamClay::postInputInitialization() { ElasticIsotropicPressureDependent::postInputInitialization(); - GEOS_THROW_CTX_IF( m_defaultCslSlope <= 0, + GEOS_THROW_IF( m_defaultCslSlope <= 0, getFullName() << ": Non-positive slope of critical state line detected", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_defaultVirginCompressionIndex <= 0, + GEOS_THROW_IF( m_defaultVirginCompressionIndex <= 0, getFullName() << ": Non-positive virgin compression index detected", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_defaultVirginCompressionIndex <= m_defaultRecompressionIndex, + GEOS_THROW_IF( m_defaultVirginCompressionIndex <= m_defaultRecompressionIndex, getFullName() << ": Recompression index should exceed virgin recompression index", InputError, getDataContext() ); diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp index 209eabdd282..76aab05e9d0 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp @@ -62,7 +62,7 @@ void MultiPhaseConstantThermalConductivity::allocateConstitutiveData( dataReposi void MultiPhaseConstantThermalConductivity::postInputInitialization() { - GEOS_THROW_CTX_IF( m_thermalConductivityComponents[0] < 0 || + GEOS_THROW_IF( m_thermalConductivityComponents[0] < 0 || m_thermalConductivityComponents[1] < 0 || m_thermalConductivityComponents[2] < 0, GEOS_FMT( "{}: the components of the thermal conductivity tensor must be non-negative", diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp index 84563f32f3b..16ac004ff9e 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp @@ -74,7 +74,7 @@ void MultiPhaseVolumeWeightedThermalConductivity::allocateConstitutiveData( data void MultiPhaseVolumeWeightedThermalConductivity::postInputInitialization() { - GEOS_THROW_CTX_IF( m_rockThermalConductivityComponents[0] <= 0 || + GEOS_THROW_IF( m_rockThermalConductivityComponents[0] <= 0 || m_rockThermalConductivityComponents[1] <= 0 || m_rockThermalConductivityComponents[2] <= 0, GEOS_FMT( "{}: the components of the rock thermal conductivity tensor must be strictly positive", @@ -83,7 +83,7 @@ void MultiPhaseVolumeWeightedThermalConductivity::postInputInitialization() for( integer ip = 0; ip < numFluidPhases(); ++ip ) { - GEOS_THROW_CTX_IF( m_phaseThermalConductivity[ip] <= 0, + GEOS_THROW_IF( m_phaseThermalConductivity[ip] <= 0, GEOS_FMT( "{}: the phase thermal conductivity for phase {} must be strictly positive", getFullName(), ip ), InputError, getDataContext() ); diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp index c3d94cf44d4..87da90a3383 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp @@ -118,7 +118,7 @@ void SinglePhaseThermalConductivity::allocateConstitutiveData( dataRepository::G void SinglePhaseThermalConductivity::postInputInitialization() { - GEOS_THROW_CTX_IF( m_defaultThermalConductivityComponents[0] <= 0 || + GEOS_THROW_IF( m_defaultThermalConductivityComponents[0] <= 0 || m_defaultThermalConductivityComponents[1] <= 0 || m_defaultThermalConductivityComponents[2] <= 0, GEOS_FMT( "{}: the components of the default thermal conductivity tensor must be strictly positive", diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp index 6de70c9cfd1..4fd652465ce 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp @@ -102,28 +102,28 @@ PVTDriver::PVTDriver( const string & name, void PVTDriver::postInputInitialization() { // Validate some inputs - GEOS_ERROR_CTX_IF( m_outputMassDensity != 0 && m_outputMassDensity != 1, + GEOS_ERROR_IF( m_outputMassDensity != 0 && m_outputMassDensity != 1, getWrapperDataContext( viewKeyStruct::outputMassDensityString() ) << ": option can be either 0 (false) or 1 (true)", getWrapperDataContext( viewKeyStruct::outputMassDensityString() ) ); - GEOS_ERROR_CTX_IF( m_outputCompressibility != 0 && m_outputCompressibility != 1, + GEOS_ERROR_IF( m_outputCompressibility != 0 && m_outputCompressibility != 1, getWrapperDataContext( viewKeyStruct::outputCompressibilityString() ) << ": option can be either 0 (false) or 1 (true)", getWrapperDataContext( viewKeyStruct::outputCompressibilityString() ) ); - GEOS_ERROR_CTX_IF( m_outputPhaseComposition != 0 && m_outputPhaseComposition != 1, + GEOS_ERROR_IF( m_outputPhaseComposition != 0 && m_outputPhaseComposition != 1, getWrapperDataContext( viewKeyStruct::outputPhaseCompositionString() ) << ": option can be either 0 (false) or 1 (true)", getWrapperDataContext( viewKeyStruct::outputPhaseCompositionString() ) ); - GEOS_WARNING_CTX_IF( m_precision < minPrecision, + GEOS_WARNING_IF( m_precision < minPrecision, GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", getWrapperDataContext( viewKeyStruct::precisionString() ), minPrecision, maxPrecision, minPrecision ), getWrapperDataContext( viewKeyStruct::precisionString() )); - GEOS_WARNING_CTX_IF( maxPrecision < m_precision, + GEOS_WARNING_IF( maxPrecision < m_precision, GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", getWrapperDataContext( viewKeyStruct::precisionString() ), minPrecision, maxPrecision, maxPrecision ), diff --git a/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp b/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp index 3c57bbf47a6..6a5670faeba 100644 --- a/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp @@ -150,11 +150,11 @@ void TriaxialDriver::postInputInitialization() // double check the initial stress value is consistent with any function values that // may overwrite it. - GEOS_THROW_CTX_IF( !isEqual( m_initialStress, m_table( 0, SIG0 ), 1e-6 ), + GEOS_THROW_IF( !isEqual( m_initialStress, m_table( 0, SIG0 ), 1e-6 ), getDataContext() << ": Initial stress values indicated by initialStress and axialFunction(time=0) appear inconsistent", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( !isEqual( m_initialStress, m_table( 0, SIG1 ), 1e-6 ), + GEOS_THROW_IF( !isEqual( m_initialStress, m_table( 0, SIG1 ), 1e-6 ), getDataContext() << ": Initial stress values indicated by initialStress and radialFunction(time=0) appear inconsistent", InputError, getDataContext() ); } diff --git a/src/coreComponents/dataRepository/Group.cpp b/src/coreComponents/dataRepository/Group.cpp index 37ddc54d5af..8af7997698a 100644 --- a/src/coreComponents/dataRepository/Group.cpp +++ b/src/coreComponents/dataRepository/Group.cpp @@ -76,7 +76,7 @@ WrapperBase & Group::registerWrapper( std::unique_ptr< WrapperBase > wrapper ) void Group::deregisterWrapper( string const & name ) { - GEOS_ERROR_CTX_IF( !hasWrapper( name ), + GEOS_ERROR_IF( !hasWrapper( name ), "Wrapper " << name << " doesn't exist in Group" << getDataContext() << '.', getDataContext() ); m_wrappers.erase( name ); @@ -246,7 +246,7 @@ void Group::processInputFile( xmlWrapper::xmlNode const & targetNode, string const attributeName = attribute.name(); if( !xmlWrapper::isFileMetadataAttribute( attributeName ) ) { - GEOS_THROW_CTX_IF( processedAttributes.count( attributeName ) == 0, + GEOS_THROW_IF( processedAttributes.count( attributeName ) == 0, GEOS_FMT( "Error in {}: XML Node at '{}' contains unused attribute '{}'.\n" "Valid attributes are:\n{}\nFor more details, please refer to documentation at:\n" "http://geosx-geosx.readthedocs-hosted.com/en/latest/docs/sphinx/userGuide/Index.html", diff --git a/src/coreComponents/dataRepository/Group.hpp b/src/coreComponents/dataRepository/Group.hpp index 3be15d35ee9..b9b17a6de40 100644 --- a/src/coreComponents/dataRepository/Group.hpp +++ b/src/coreComponents/dataRepository/Group.hpp @@ -318,12 +318,12 @@ class Group T & getGroup( KEY const & key ) { Group * const child = m_subGroups[ key ]; - GEOS_THROW_CTX_IF( child == nullptr, + GEOS_THROW_IF( child == nullptr, "Group " << getDataContext() << " has no child named " << key << std::endl << dumpSubGroupsNames(), std::domain_error, getDataContext() ); T * const castedChild = dynamicCast< T * >( child ); - GEOS_THROW_CTX_IF( castedChild == nullptr, + GEOS_THROW_IF( castedChild == nullptr, GEOS_FMT( "{} was expected to be a '{}'.", child->getDataContext(), LvArray::system::demangleType< T >() ), BadTypeError, child->getDataContext() ); @@ -337,12 +337,12 @@ class Group T const & getGroup( KEY const & key ) const { Group const * const child = m_subGroups[ key ]; - GEOS_THROW_CTX_IF( child == nullptr, + GEOS_THROW_IF( child == nullptr, "Group " << getDataContext() << " has no child named " << key << std::endl << dumpSubGroupsNames(), std::domain_error, getDataContext() ); T const * const castedChild = dynamicCast< T const * >( child ); - GEOS_THROW_CTX_IF( castedChild == nullptr, + GEOS_THROW_IF( castedChild == nullptr, GEOS_FMT( "{} was expected to be a '{}'.", child->getDataContext(), LvArray::system::demangleType< T >() ), BadTypeError, child->getDataContext() ); @@ -1123,7 +1123,7 @@ class Group WrapperBase const & getWrapperBase( KEY const & key ) const { WrapperBase const * const wrapper = m_wrappers[ key ]; - GEOS_THROW_CTX_IF( wrapper == nullptr, + GEOS_THROW_IF( wrapper == nullptr, "Group " << getDataContext() << " has no wrapper named " << key << std::endl << dumpWrappersNames(), std::domain_error, getDataContext() ); @@ -1138,7 +1138,7 @@ class Group WrapperBase & getWrapperBase( KEY const & key ) { WrapperBase * const wrapper = m_wrappers[ key ]; - GEOS_THROW_CTX_IF( wrapper == nullptr, + GEOS_THROW_IF( wrapper == nullptr, "Group " << getDataContext() << " has no wrapper named " << key << std::endl << dumpWrappersNames(), std::domain_error, getDataContext() ); @@ -1363,7 +1363,7 @@ class Group */ Group & getParent() { - GEOS_THROW_CTX_IF( m_parent == nullptr, + GEOS_THROW_IF( m_parent == nullptr, "Group at " << getDataContext() << " does not have a parent.", std::domain_error, getDataContext() ); return *m_parent; @@ -1374,7 +1374,7 @@ class Group */ Group const & getParent() const { - GEOS_THROW_CTX_IF( m_parent == nullptr, + GEOS_THROW_IF( m_parent == nullptr, "Group at " << getDataContext() << " does not have a parent.", std::domain_error, getDataContext() ); return *m_parent; diff --git a/src/coreComponents/events/PeriodicEvent.cpp b/src/coreComponents/events/PeriodicEvent.cpp index 1fb2e3964e8..1b3b454750d 100644 --- a/src/coreComponents/events/PeriodicEvent.cpp +++ b/src/coreComponents/events/PeriodicEvent.cpp @@ -269,14 +269,14 @@ void PeriodicEvent::validate() const constexpr auto determinesTimeStepSize = ExecutableGroup::TimesteppingBehavior::DeterminesTimeStepSize; - GEOS_THROW_CTX_IF( m_timeFrequency > 0 && target->getTimesteppingBehavior() == determinesTimeStepSize, + GEOS_THROW_IF( m_timeFrequency > 0 && target->getTimesteppingBehavior() == determinesTimeStepSize, GEOS_FMT( "`{}`: This event targets an object that automatically selects the time " "step size. Therefore, `{}` cannot be used here. However, forcing a " "constant time step size can still be achived with `{}`.", getDataContext(), viewKeyStruct::timeFrequencyString(), EventBase::viewKeyStruct::forceDtString() ), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_cycleFrequency != 1 && target->getTimesteppingBehavior() == determinesTimeStepSize, + GEOS_THROW_IF( m_cycleFrequency != 1 && target->getTimesteppingBehavior() == determinesTimeStepSize, GEOS_FMT( "`{}`: This event targets an object that automatically selects the time " "step size. Therefore, `{}` cannot be used here. However, forcing a " "constant time step size can still be achived with `{}`.", diff --git a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp index 9d3c28c0855..3fd96e3294f 100644 --- a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp @@ -126,13 +126,13 @@ void AquiferBoundaryCondition::postInputInitialization() else { FunctionManager const & functionManager = FunctionManager::getInstance(); - GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_pressureInfluenceFunctionName ), + GEOS_THROW_IF( !functionManager.hasGroup( m_pressureInfluenceFunctionName ), getCatalogName() << " " << getDataContext() << ": the pressure influence table " << m_pressureInfluenceFunctionName << " could not be found", InputError, getDataContext() ); TableFunction const & pressureInfluenceFunction = functionManager.getGroup< TableFunction >( m_pressureInfluenceFunctionName ); - GEOS_THROW_CTX_IF( pressureInfluenceFunction.getInterpolationMethod() != TableFunction::InterpolationType::Linear, + GEOS_THROW_IF( pressureInfluenceFunction.getInterpolationMethod() != TableFunction::InterpolationType::Linear, getCatalogName() << " " << getDataContext() << ": The interpolation method for the pressure influence function table " << pressureInfluenceFunction.getDataContext() << diff --git a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp index 520c9848a18..23ba631b8f1 100644 --- a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp +++ b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp @@ -93,7 +93,7 @@ EquilibriumInitialCondition::EquilibriumInitialCondition( string const & name, G void EquilibriumInitialCondition::postInputInitialization() { - GEOS_THROW_CTX_IF( ( m_temperatureVsElevationTableName.empty() != m_componentFractionVsElevationTableNames.empty() ), + GEOS_THROW_IF( ( m_temperatureVsElevationTableName.empty() != m_componentFractionVsElevationTableNames.empty() ), getCatalogName() << " " << getDataContext() << ": both " << viewKeyStruct::componentFractionVsElevationTableNamesString() << " and " << viewKeyStruct::temperatureVsElevationTableNameString() << " must be provided for a multiphase simulation", @@ -103,16 +103,16 @@ void EquilibriumInitialCondition::postInputInitialization() if( !m_componentFractionVsElevationTableNames.empty() ) { - GEOS_THROW_CTX_IF( m_componentFractionVsElevationTableNames.size() <= 1, + GEOS_THROW_IF( m_componentFractionVsElevationTableNames.size() <= 1, getCatalogName() << " " << getDataContext() << ": at least two component names must be specified in " << viewKeyStruct::componentNamesString(), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_componentFractionVsElevationTableNames.size() != m_componentNames.size(), + GEOS_THROW_IF( m_componentFractionVsElevationTableNames.size() != m_componentNames.size(), getCatalogName() << " " << getDataContext() << ": mismatch between the size of " << viewKeyStruct::componentNamesString() << " and " << viewKeyStruct::componentFractionVsElevationTableNamesString(), InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_componentNames.size() >= 2 && m_initPhaseName.empty(), + GEOS_THROW_IF( m_componentNames.size() >= 2 && m_initPhaseName.empty(), getCatalogName() << " " << getDataContext() << ": for now, the keyword: " << viewKeyStruct::initPhaseNameString() << " must be filled for a multiphase simulation", InputError, getDataContext() ); @@ -120,19 +120,19 @@ void EquilibriumInitialCondition::postInputInitialization() array1d< localIndex > tableSizes( m_componentNames.size() ); for( size_t ic = 0; ic < m_componentNames.size(); ++ic ) { - GEOS_THROW_CTX_IF( m_componentFractionVsElevationTableNames[ic].empty(), + GEOS_THROW_IF( m_componentFractionVsElevationTableNames[ic].empty(), getCatalogName() << " " << getDataContext() << ": the component fraction vs elevation table name is missing for component " << ic, InputError, getDataContext() ); - GEOS_THROW_CTX_IF( !m_componentFractionVsElevationTableNames[ic].empty() && + GEOS_THROW_IF( !m_componentFractionVsElevationTableNames[ic].empty() && !functionManager.hasGroup( m_componentFractionVsElevationTableNames[ic] ), getCatalogName() << " " << getDataContext() << ": the component fraction vs elevation table " << m_componentFractionVsElevationTableNames[ic] << " could not be found" << " for component " << ic, InputError, getDataContext() ); TableFunction const & compFracTable = functionManager.getGroup< TableFunction >( m_componentFractionVsElevationTableNames[ic] ); - GEOS_THROW_CTX_IF( compFracTable.getInterpolationMethod() != TableFunction::InterpolationType::Linear, + GEOS_THROW_IF( compFracTable.getInterpolationMethod() != TableFunction::InterpolationType::Linear, getCatalogName() << " " << getDataContext() << ": the interpolation method for the component fraction vs elevation table " << compFracTable.getName() << " should be TableFunction::InterpolationType::Linear", @@ -144,13 +144,13 @@ void EquilibriumInitialCondition::postInputInitialization() if( !m_temperatureVsElevationTableName.empty() ) { - GEOS_THROW_CTX_IF( !functionManager.hasGroup( m_temperatureVsElevationTableName ), + GEOS_THROW_IF( !functionManager.hasGroup( m_temperatureVsElevationTableName ), getCatalogName() << " " << getDataContext() << ": the temperature vs elevation table " << m_temperatureVsElevationTableName << " could not be found", InputError, getDataContext() ); TableFunction const & tempTable = functionManager.getGroup< TableFunction >( m_temperatureVsElevationTableName ); - GEOS_THROW_CTX_IF( tempTable.getInterpolationMethod() != TableFunction::InterpolationType::Linear, + GEOS_THROW_IF( tempTable.getInterpolationMethod() != TableFunction::InterpolationType::Linear, getCatalogName() << " " << getDataContext() << ": The interpolation method for the temperature vs elevation table " << tempTable.getName() << " should be TableFunction::InterpolationType::Linear", @@ -171,7 +171,7 @@ void EquilibriumInitialCondition::initializePreSubGroups() { TableFunction const & compFracTable = functionManager.getGroup< TableFunction >( m_componentFractionVsElevationTableNames[ic] ); arrayView1d< real64 const > compFracValues = compFracTable.getValues(); - GEOS_THROW_CTX_IF( compFracValues.size() <= 1, + GEOS_THROW_IF( compFracValues.size() <= 1, getCatalogName() << " " << getDataContext() << ": the component fraction vs elevation table " << compFracTable.getName() << " must contain at least two values", @@ -180,7 +180,7 @@ void EquilibriumInitialCondition::initializePreSubGroups() tableSizes[ic] = compFracValues.size(); if( ic >= 1 ) { - GEOS_THROW_CTX_IF( tableSizes[ic] != tableSizes[ic-1], + GEOS_THROW_IF( tableSizes[ic] != tableSizes[ic-1], getCatalogName() << " " << getDataContext() << ": all the component fraction vs elevation tables must contain the same number of values", InputError, getDataContext() ); @@ -202,7 +202,7 @@ void EquilibriumInitialCondition::initializePreSubGroups() if( ic >= 1 ) { - GEOS_THROW_CTX_IF( !isZero( elevation[ic][i] - elevation[ic-1][i] ), + GEOS_THROW_IF( !isZero( elevation[ic][i] - elevation[ic-1][i] ), getCatalogName() << " " << getDataContext() << ": the elevation values must be the same in all the component vs elevation tables", InputError, getDataContext() ); @@ -210,7 +210,7 @@ void EquilibriumInitialCondition::initializePreSubGroups() if( ic == m_componentNames.size() - 1 ) { - GEOS_THROW_CTX_IF( !isZero( sumCompFrac[i] - 1 ), + GEOS_THROW_IF( !isZero( sumCompFrac[i] - 1 ), getCatalogName() << " " << getDataContext() << ": at a given elevation, the component fraction sum must be equal to one", InputError, getDataContext() ); diff --git a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp index a0aadb4d7d9..7d85dc89dd0 100644 --- a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp +++ b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp @@ -78,14 +78,14 @@ PerfectlyMatchedLayer::PerfectlyMatchedLayer( string const & name, Group * const void PerfectlyMatchedLayer::postInputInitialization() { - GEOS_THROW_CTX_IF( (m_xMax[0]1), + GEOS_THROW_IF( (m_reflectivity<=0 || m_reflectivity>1), getCatalogName() << " " << getDataContext() << " " << viewKeyStruct::reflectivityString() << " must satisfy 0 < reflectivity <= 1", diff --git a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp index 853b3f4da62..3d08c6b6dd2 100644 --- a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp @@ -77,7 +77,7 @@ void TractionBoundaryCondition::postInputInitialization() { if( m_tractionType == TractionType::vector ) { - GEOS_ERROR_CTX_IF( LvArray::tensorOps::l2Norm< 3 >( getDirection() ) < 1e-20, + GEOS_ERROR_IF( LvArray::tensorOps::l2Norm< 3 >( getDirection() ) < 1e-20, getDataContext() << ": " << viewKeyStruct::directionString() << " is required for " << viewKeyStruct::tractionTypeString() << " = " << TractionType::vector << ", but appears to be unspecified", @@ -98,7 +98,7 @@ void TractionBoundaryCondition::postInputInitialization() viewKeyStruct::tractionTypeString() << " != " << TractionType::stress << ", so value of " << viewKeyStruct::inputStressString() << " is unused." ); - GEOS_ERROR_CTX_IF( !inputStressRead && m_tractionType == TractionType::stress, + GEOS_ERROR_IF( !inputStressRead && m_tractionType == TractionType::stress, getDataContext() << ": " << viewKeyStruct::tractionTypeString() << " = " << TractionType::stress << ", but " << viewKeyStruct::inputStressString() << " is not specified.", getDataContext() ); diff --git a/src/coreComponents/fileIO/Outputs/SiloOutput.cpp b/src/coreComponents/fileIO/Outputs/SiloOutput.cpp index 5f17269ade1..99f25618374 100644 --- a/src/coreComponents/fileIO/Outputs/SiloOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/SiloOutput.cpp @@ -96,7 +96,7 @@ void SiloOutput::postInputInitialization() string const fieldNamesString = viewKeysStruct::fieldNames; string const onlyPlotSpecifiedFieldNamesString = viewKeysStruct::onlyPlotSpecifiedFieldNames; - GEOS_THROW_CTX_IF( ( m_onlyPlotSpecifiedFieldNames != 0 ) && m_fieldNames.empty(), + GEOS_THROW_IF( ( m_onlyPlotSpecifiedFieldNames != 0 ) && m_fieldNames.empty(), GEOS_FMT( "{} `{}`: the flag `{}` is different from zero, but `{}` is empty, which is inconsistent", catalogName(), getDataContext(), onlyPlotSpecifiedFieldNamesString, fieldNamesString ), diff --git a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp index c2ce08373a3..75fcf6ed2d6 100644 --- a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp @@ -119,7 +119,7 @@ void VTKOutput::postInputInitialization() string const fieldNamesString = viewKeysStruct::fieldNames; string const onlyPlotSpecifiedFieldNamesString = viewKeysStruct::onlyPlotSpecifiedFieldNames; - GEOS_THROW_CTX_IF( ( m_onlyPlotSpecifiedFieldNames != 0 ) && m_fieldNames.empty(), + GEOS_THROW_IF( ( m_onlyPlotSpecifiedFieldNames != 0 ) && m_fieldNames.empty(), GEOS_FMT( "{} `{}`: the flag `{}` is different from zero, but `{}` is empty, which is inconsistent", catalogName(), getDataContext(), onlyPlotSpecifiedFieldNamesString, fieldNamesString ), @@ -137,7 +137,7 @@ void VTKOutput::postInputInitialization() catalogName(), getDataContext(), std::to_string( m_fieldNames.size() ), fieldNamesString, m_plotLevel ) ); - GEOS_ERROR_CTX_IF( m_writeFaceElementsAs3D, + GEOS_ERROR_IF( m_writeFaceElementsAs3D, GEOS_FMT( "{} `{}`: 3D vtk plot of faceElements is not yet supported.", catalogName(), getDataContext() ), getDataContext() ); diff --git a/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp b/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp index f55324abc19..2044d529edb 100644 --- a/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp +++ b/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp @@ -62,7 +62,7 @@ FiniteElementDiscretization::~FiniteElementDiscretization() void FiniteElementDiscretization::postInputInitialization() { - GEOS_ERROR_CTX_IF( m_useVem < 0 || m_useVem > 1, + GEOS_ERROR_IF( m_useVem < 0 || m_useVem > 1, getDataContext() << ": The flag useVirtualElements can be either 0 or 1", getDataContext() ); } @@ -205,7 +205,7 @@ FiniteElementDiscretization::factory( ElementType const parentElementShape ) con { #if !defined( GEOS_USE_HIP ) case ElementType::Hexahedron: - GEOS_ERROR_CTX_IF( m_formulation != Formulation::SEM, + GEOS_ERROR_IF( m_formulation != Formulation::SEM, getDataContext() << ": Element type Hexahedron with order 2 available" << " only when using the Spectral Element Method", getDataContext() ); @@ -233,7 +233,7 @@ FiniteElementDiscretization::factory( ElementType const parentElementShape ) con { #if !defined( GEOS_USE_HIP ) case ElementType::Hexahedron: - GEOS_ERROR_CTX_IF( m_formulation != Formulation::SEM, + GEOS_ERROR_IF( m_formulation != Formulation::SEM, getDataContext() << ": Element type Hexahedron with order 3 available" << " only when using the Spectral Element Method", getDataContext() ); @@ -261,7 +261,7 @@ FiniteElementDiscretization::factory( ElementType const parentElementShape ) con { #if !defined( GEOS_USE_HIP ) case ElementType::Hexahedron: - GEOS_ERROR_CTX_IF( m_formulation != Formulation::SEM, + GEOS_ERROR_IF( m_formulation != Formulation::SEM, getDataContext() << ": Element type Hexahedron with order 4 available only" << " when using the Spectral Element Method", getDataContext() ); @@ -289,7 +289,7 @@ FiniteElementDiscretization::factory( ElementType const parentElementShape ) con { #if !defined( GEOS_USE_HIP ) case ElementType::Hexahedron: - GEOS_ERROR_CTX_IF( m_formulation != Formulation::SEM, + GEOS_ERROR_IF( m_formulation != Formulation::SEM, getDataContext() << ": Element type Hexahedron with order 5 available only" << " when using the Spectral Element Method", getDataContext() ); diff --git a/src/coreComponents/functions/MultivariableTableFunction.cpp b/src/coreComponents/functions/MultivariableTableFunction.cpp index cfc271b23df..1df8eb50d9f 100644 --- a/src/coreComponents/functions/MultivariableTableFunction.cpp +++ b/src/coreComponents/functions/MultivariableTableFunction.cpp @@ -35,7 +35,7 @@ MultivariableTableFunction::MultivariableTableFunction( const string & name, void MultivariableTableFunction::initializeFunctionFromFile( string const & filename ) { std::ifstream file( filename.c_str() ); - GEOS_THROW_CTX_IF( !file, catalogName() << " " << getDataContext() << ": could not read input file " << filename, + GEOS_THROW_IF( !file, catalogName() << " " << getDataContext() << ": could not read input file " << filename, InputError, getDataContext() ); integer numDims, numOps; @@ -68,14 +68,14 @@ void MultivariableTableFunction::initializeFunctionFromFile( string const & file for( integer i = 0; i < numDims; i++ ) { file >> axisPoints[i]; - GEOS_THROW_CTX_IF( !file, catalogName() << " " << getDataContext() << ": can`t read the number of points for axis " + std::to_string( i ), + GEOS_THROW_IF( !file, catalogName() << " " << getDataContext() << ": can`t read the number of points for axis " + std::to_string( i ), InputError, getDataContext() ); GEOS_THROW_IF_LE_MSG( axisPoints[i], 1, catalogName() << " " << getDataContext() << ": minimum 2 discretization point per axis are expected", InputError ); file >> axisMinimums[i]; - GEOS_THROW_CTX_IF( !file, catalogName() << " " << getDataContext() << ": can`t read minimum value for axis " + std::to_string( i ), + GEOS_THROW_IF( !file, catalogName() << " " << getDataContext() << ": can`t read minimum value for axis " + std::to_string( i ), InputError, getDataContext() ); file >> axisMaximums[i]; - GEOS_THROW_CTX_IF( !file, catalogName() << " " << getDataContext() << ": can`t read maximum value for axis " + std::to_string( i ), + GEOS_THROW_IF( !file, catalogName() << " " << getDataContext() << ": can`t read maximum value for axis " + std::to_string( i ), InputError, getDataContext() ); GEOS_THROW_IF_LT_MSG( axisMaximums[i], axisMinimums[i], catalogName() << " " << getDataContext() << ": maximum axis value is expected to be larger than minimum", InputError ); @@ -99,14 +99,14 @@ void MultivariableTableFunction::initializeFunctionFromFile( string const & file for( auto j = 0; j < numOps; j++ ) { file >> m_pointData[i * numOps + j]; - GEOS_THROW_CTX_IF( !file, catalogName() << " " << getDataContext() << ": table file is shorter than expected", + GEOS_THROW_IF( !file, catalogName() << " " << getDataContext() << ": table file is shorter than expected", InputError, getDataContext() ); } } real64 value; file >> value; - GEOS_THROW_CTX_IF( file, catalogName() << " " << getDataContext() << ": table file is longer than expected", + GEOS_THROW_IF( file, catalogName() << " " << getDataContext() << ": table file is longer than expected", InputError, getDataContext() ); file.close(); diff --git a/src/coreComponents/functions/TableFunction.cpp b/src/coreComponents/functions/TableFunction.cpp index 32c93ad9370..caae1662332 100644 --- a/src/coreComponents/functions/TableFunction.cpp +++ b/src/coreComponents/functions/TableFunction.cpp @@ -101,7 +101,7 @@ void TableFunction::setTableCoordinates( array1d< real64_array > const & coordin { for( localIndex j = 1; j < coordinates[i].size(); ++j ) { - GEOS_THROW_CTX_IF( coordinates[i][j] - coordinates[i][j-1] <= 0, + GEOS_THROW_IF( coordinates[i][j] - coordinates[i][j-1] <= 0, GEOS_FMT( "{} {}: coordinates must be strictly increasing, but axis {} is not", catalogName(), getDataContext(), i ), InputError, getDataContext() ); @@ -163,7 +163,7 @@ void TableFunction::reInitializeFunction() increment *= m_coordinates.sizeOfArray( ii ); for( localIndex j = 1; j < m_coordinates[ii].size(); ++j ) { - GEOS_THROW_CTX_IF( m_coordinates[ii][j] - m_coordinates[ii][j-1] <= 0, + GEOS_THROW_IF( m_coordinates[ii][j] - m_coordinates[ii][j-1] <= 0, GEOS_FMT( "{} {}: coordinates must be strictly increasing, but axis {} is not", catalogName(), getDataContext(), ii ), InputError, getDataContext() ); @@ -183,13 +183,13 @@ void TableFunction::reInitializeFunction() void TableFunction::checkCoord( real64 const coord, localIndex const dim ) const { - GEOS_THROW_CTX_IF( dim >= m_coordinates.size() || dim < 0, + GEOS_THROW_IF( dim >= m_coordinates.size() || dim < 0, GEOS_FMT( "{}: The {} dimension ( no. {} ) doesn't exist in the table.", getDataContext(), units::getDescription( getDimUnit( dim ) ), dim ), SimulationError, getDataContext() ); real64 const lowerBound = m_coordinates[dim][0]; real64 const upperBound = m_coordinates[dim][m_coordinates.sizeOfArray( dim ) - 1]; - GEOS_THROW_CTX_IF( coord > upperBound || coord < lowerBound, + GEOS_THROW_IF( coord > upperBound || coord < lowerBound, GEOS_FMT( "{}: Requested {} is out of the table bounds ( lower bound: {} -> upper bound: {} ).", getDataContext(), units::formatValue( coord, getDimUnit( dim ) ), diff --git a/src/coreComponents/mesh/CellElementRegion.cpp b/src/coreComponents/mesh/CellElementRegion.cpp index feba3a9f084..aa01b10c058 100644 --- a/src/coreComponents/mesh/CellElementRegion.cpp +++ b/src/coreComponents/mesh/CellElementRegion.cpp @@ -49,7 +49,7 @@ CellElementRegion::~CellElementRegion() void CellElementRegion::generateMesh( Group const & cellBlocks ) { - GEOS_THROW_CTX_IF( m_cellBlockNames.empty(), + GEOS_THROW_IF( m_cellBlockNames.empty(), GEOS_FMT( "{}: No cellBlock selected in this region.", getDataContext() ), InputError, getDataContext() ); @@ -57,7 +57,7 @@ void CellElementRegion::generateMesh( Group const & cellBlocks ) for( string const & cbName : m_cellBlockNames ) { CellBlockABC const * cellBlock = cellBlocks.getGroupPointer< CellBlockABC >( cbName ); - GEOS_THROW_CTX_IF( cellBlock == nullptr, + GEOS_THROW_IF( cellBlock == nullptr, GEOS_FMT( "{}: No cellBlock named '{}' found.\nAvailable cellBlock list: {{ {} }}\nNo CellElementRegionSelector has been used to verify the cellBlock selection.", getDataContext(), cbName, stringutilities::join( m_cellBlockNames, ", " ) ), InputError, getDataContext() ); diff --git a/src/coreComponents/mesh/CellElementRegionSelector.cpp b/src/coreComponents/mesh/CellElementRegionSelector.cpp index c47da1da8a2..9af01f63da9 100644 --- a/src/coreComponents/mesh/CellElementRegionSelector.cpp +++ b/src/coreComponents/mesh/CellElementRegionSelector.cpp @@ -62,7 +62,7 @@ CellElementRegionSelector::getMatchingCellblocks( CellElementRegion const & regi } } - GEOS_THROW_CTX_IF( !matching, + GEOS_THROW_IF( !matching, GEOS_FMT( "{}: No cellBlock name is satisfying the qualifier '{}'.\n" "Available cellBlock list: {{ {} }}\nAvailable region attribute list: {{ {} }}", region.getWrapperDataContext( ViewKeys::sourceCellBlockNamesString() ), @@ -82,7 +82,7 @@ CellElementRegionSelector::verifyRequestedCellBlocks( CellElementRegion const & for( string const & requestedCellBlockName : cellBlockNames ) { // if cell block does not exist in the mesh - GEOS_THROW_CTX_IF( m_cellBlocksOwners.count( requestedCellBlockName ) == 0, + GEOS_THROW_IF( m_cellBlocksOwners.count( requestedCellBlockName ) == 0, GEOS_FMT( "{}: No cellBlock named '{}'.\nAvailable cellBlock list: {{ {} }}", region.getWrapperDataContext( ViewKeys::sourceCellBlockNamesString() ), requestedCellBlockName, diff --git a/src/coreComponents/mesh/ElementRegionManager.cpp b/src/coreComponents/mesh/ElementRegionManager.cpp index b85fc31fba4..0222072022a 100644 --- a/src/coreComponents/mesh/ElementRegionManager.cpp +++ b/src/coreComponents/mesh/ElementRegionManager.cpp @@ -80,7 +80,7 @@ auto const & getUserAvailableKeys() Group * ElementRegionManager::createChild( string const & childKey, string const & childName ) { GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); - GEOS_ERROR_CTX_IF( getUserAvailableKeys().count( childKey ) == 0, + GEOS_ERROR_IF( getUserAvailableKeys().count( childKey ) == 0, CatalogInterface::unknownTypeError( childKey, getDataContext(), getUserAvailableKeys() ), getDataContext() ); Group & elementRegions = this->getGroup( ElementRegionManager::groupKeyStruct::elementRegionsGroup() ); @@ -217,7 +217,7 @@ void ElementRegionManager::generateWells( CellBlockManagerABC const & cellBlockM globalIndex const numWellElemsGlobal = MpiWrapper::sum( subRegion.size() ); - GEOS_ERROR_CTX_IF( numWellElemsGlobal != lineBlock.numElements(), + GEOS_ERROR_IF( numWellElemsGlobal != lineBlock.numElements(), "Invalid partitioning in well " << lineBlock.getDataContext() << ", subregion " << subRegion.getDataContext(), getDataContext() ); @@ -779,11 +779,11 @@ ElementRegionManager::getCellBlockToSubRegionMap( CellBlockManagerABC const & ce { GEOS_UNUSED_VAR( region ); // unused if geos_error_if is nulld localIndex const blockIndex = cellBlocks.getIndex( subRegion.getName() ); - GEOS_ERROR_CTX_IF( blockIndex == Group::subGroupMap::KeyIndex::invalid_index, + GEOS_ERROR_IF( blockIndex == Group::subGroupMap::KeyIndex::invalid_index, GEOS_FMT( "{}, subregion {}: Cell block not found at index {}.", region.getDataContext().toString(), subRegion.getName(), blockIndex ), region.getDataContext() ); - GEOS_ERROR_CTX_IF( blockMap( blockIndex, 1 ) != -1, + GEOS_ERROR_IF( blockMap( blockIndex, 1 ) != -1, GEOS_FMT( "{}, subregion {}: Cell block at index {} is mapped to more than one subregion.", region.getDataContext().toString(), subRegion.getName(), blockIndex ), region.getDataContext() ); diff --git a/src/coreComponents/mesh/ElementRegionManager.hpp b/src/coreComponents/mesh/ElementRegionManager.hpp index 1ca8880b49b..3da858ba538 100644 --- a/src/coreComponents/mesh/ElementRegionManager.hpp +++ b/src/coreComponents/mesh/ElementRegionManager.hpp @@ -1510,7 +1510,7 @@ ElementRegionManager::constructMaterialViewAccessor( string const & viewName, } else { - GEOS_ERROR_CTX_IF( !allowMissingViews, + GEOS_ERROR_IF( !allowMissingViews, subRegion.getDataContext() << ": Material " << constitutiveRelation.getDataContext() << " does not contain " << viewName, @@ -1561,7 +1561,7 @@ ElementRegionManager::constructMaterialViewAccessor( string const & viewName, } else { - GEOS_ERROR_CTX_IF( !allowMissingViews, region.getDataContext() << ": Material " << materialName + GEOS_ERROR_IF( !allowMissingViews, region.getDataContext() << ": Material " << materialName << " does not contain " << viewName, region.getDataContext(), subRegion.getDataContext() ); } diff --git a/src/coreComponents/mesh/MeshObjectPath.cpp b/src/coreComponents/mesh/MeshObjectPath.cpp index 64ed6bcc00a..76568f1aef9 100644 --- a/src/coreComponents/mesh/MeshObjectPath.cpp +++ b/src/coreComponents/mesh/MeshObjectPath.cpp @@ -211,7 +211,7 @@ void processTokenRecursive( dataRepository::Group const & parentGroup, namesInRepository.emplace_back( group.getName() ); } ); - GEOS_THROW_CTX_IF( namesInRepository.empty(), + GEOS_THROW_IF( namesInRepository.empty(), GEOS_FMT( "{0} has no children.", parentGroup.getDataContext().toString()), InputError, parentGroup.getDataContext() ); @@ -232,7 +232,7 @@ void processTokenRecursive( dataRepository::Group const & parentGroup, } } - GEOS_THROW_CTX_IF( !foundMatch, + GEOS_THROW_IF( !foundMatch, GEOS_FMT( "{0} has no child named {1}.\n" "{0} has the following children: {{ {2} }}", parentGroup.getDataContext().toString(), diff --git a/src/coreComponents/mesh/Perforation.cpp b/src/coreComponents/mesh/Perforation.cpp index 80e3fb03a6e..18e1f4b5ce1 100644 --- a/src/coreComponents/mesh/Perforation.cpp +++ b/src/coreComponents/mesh/Perforation.cpp @@ -56,7 +56,7 @@ Perforation::Perforation( string const & name, Group * const parent ) void Perforation::postInputInitialization() { - GEOS_ERROR_CTX_IF( m_distanceFromHead <= 0, + GEOS_ERROR_IF( m_distanceFromHead <= 0, getWrapperDataContext( viewKeyStruct::distanceFromHeadString() ) << ": distance from well head to perforation cannot be negative.", getWrapperDataContext( viewKeyStruct::distanceFromHeadString() ) ); diff --git a/src/coreComponents/mesh/SurfaceElementRegion.hpp b/src/coreComponents/mesh/SurfaceElementRegion.hpp index c86e7088082..0d957993916 100644 --- a/src/coreComponents/mesh/SurfaceElementRegion.hpp +++ b/src/coreComponents/mesh/SurfaceElementRegion.hpp @@ -210,7 +210,7 @@ class SurfaceElementRegion : public ElementRegionBase { subRegionNames.push_back( sr.getName() ); } ); - GEOS_ERROR_CTX_IF( subRegionNames.size() != 1, + GEOS_ERROR_IF( subRegionNames.size() != 1, "Surface region \"" << getDataContext() << "\" should have one unique sub region (" << subRegionNames.size() << " found).", getDataContext() ); diff --git a/src/coreComponents/mesh/WellElementSubRegion.cpp b/src/coreComponents/mesh/WellElementSubRegion.cpp index 916e1c125d1..6646357849d 100644 --- a/src/coreComponents/mesh/WellElementSubRegion.cpp +++ b/src/coreComponents/mesh/WellElementSubRegion.cpp @@ -424,7 +424,7 @@ void WellElementSubRegion::generate( MeshLevel & mesh, // this is enforced in the LineBlockABC that currently merges two perforations // if they belong to the same well element. This is a temporary solution. // TODO: split the well elements that contain multiple perforations, so that no element is shared - GEOS_THROW_CTX_IF( sharedElems.size() > 0, + GEOS_THROW_IF( sharedElems.size() > 0, "Well " << lineBlock.getDataContext() << " contains shared well elements", InputError, lineBlock.getDataContext() ); @@ -573,7 +573,7 @@ void WellElementSubRegion::checkPartitioningValidity( LineBlockABC const & lineB globalIndex const numBranches = prevElemIdsGlobal[iwelemGlobal].size(); globalIndex const prevGlobal = prevElemIdsGlobal[iwelemGlobal][numBranches-1]; - GEOS_THROW_CTX_IF( prevGlobal <= iwelemGlobal || prevGlobal < 0, + GEOS_THROW_IF( prevGlobal <= iwelemGlobal || prevGlobal < 0, "The structure of well " << lineBlock.getDataContext() << " is invalid. " << " The main reason for this error is that there may be no perforation" << " in the bottom well element of the well, which is required to have" << diff --git a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp index 61ee3712d72..b315f63f41e 100644 --- a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp @@ -79,7 +79,7 @@ void ExternalMeshGeneratorBase::postInputInitialization() std::set< string > const tmp{ v.begin(), v.end() }; bool const hasDuplicates = tmp.size() != LvArray::integerConversion< std::size_t >( v.size() ); - GEOS_THROW_CTX_IF( hasDuplicates, + GEOS_THROW_IF( hasDuplicates, getWrapperDataContext( key ) << ": '" << stringutilities::join( v, ", " ) << "' already present in list of fields to import.", InputError, getWrapperDataContext( key ) ); diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp index e453d56c4ac..755021ab905 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp @@ -350,7 +350,7 @@ class InternalMeshGenerator : public MeshGeneratorBase getWrapperDataContext( i == 0 ? viewKeyStruct::xBiasString() : i == 1 ? viewKeyStruct::yBiasString() : viewKeyStruct::zBiasString() ); - GEOS_ERROR_CTX_IF( fabs( m_nElemBias[i][block] ) >= 1, + GEOS_ERROR_IF( fabs( m_nElemBias[i][block] ) >= 1, wrapperContext << ", block index = " << block << " : Mesh bias must between -1 and 1!", wrapperContext ); diff --git a/src/coreComponents/mesh/generators/InternalWellGenerator.cpp b/src/coreComponents/mesh/generators/InternalWellGenerator.cpp index 25384552ceb..f11e5937565 100644 --- a/src/coreComponents/mesh/generators/InternalWellGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalWellGenerator.cpp @@ -40,17 +40,17 @@ InternalWellGenerator::InternalWellGenerator( string const & name, Group * const void InternalWellGenerator::postInputInitialization() { - GEOS_THROW_CTX_IF( m_polyNodeCoords.size( 1 ) != m_nDims, + GEOS_THROW_IF( m_polyNodeCoords.size( 1 ) != m_nDims, "InternalWell " << getWrapperDataContext( viewKeyStruct::polylineNodeCoordsString() ) << ": Invalid number of physical coordinates.", InputError, getWrapperDataContext( viewKeyStruct::polylineNodeCoordsString() ) ); - GEOS_THROW_CTX_IF( m_segmentToPolyNodeMap.size( 1 ) != 2, + GEOS_THROW_IF( m_segmentToPolyNodeMap.size( 1 ) != 2, "InternalWell " << getWrapperDataContext( viewKeyStruct::polylineSegmentConnString() ) << ": Invalid size.", InputError, getWrapperDataContext( viewKeyStruct::polylineSegmentConnString() ) ); - GEOS_THROW_CTX_IF( m_polyNodeCoords.size( 0 )-1 != m_segmentToPolyNodeMap.size( 0 ), + GEOS_THROW_IF( m_polyNodeCoords.size( 0 )-1 != m_segmentToPolyNodeMap.size( 0 ), "Incompatible sizes of " << getWrapperDataContext( viewKeyStruct::polylineNodeCoordsString() ) << " and " << getWrapperDataContext( viewKeyStruct::polylineSegmentConnString() ), InputError, getWrapperDataContext( viewKeyStruct::polylineSegmentConnString() ) ); diff --git a/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp b/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp index ff9afb41cbe..426535b341d 100644 --- a/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp @@ -115,19 +115,19 @@ InternalWellboreGenerator::InternalWellboreGenerator( string const & name, void InternalWellboreGenerator::postInputInitialization() { - GEOS_ERROR_CTX_IF( m_nElems[1].size() > 1, + GEOS_ERROR_IF( m_nElems[1].size() > 1, getWrapperDataContext( viewKeyStruct::yElemsString() ) << ": Only one block in the theta direction is currently supported. ", getWrapperDataContext( viewKeyStruct::yElemsString() ) ); - GEOS_ERROR_CTX_IF( m_nElems[2].size() > 1, + GEOS_ERROR_IF( m_nElems[2].size() > 1, getWrapperDataContext( viewKeyStruct::yElemsString() ) << ": Only one block in the z direction is currently supported. ", getWrapperDataContext( viewKeyStruct::yElemsString() ) ); - GEOS_ERROR_CTX_IF( m_trajectory.size( 0 ) != 2 || m_trajectory.size( 1 ) != 3, + GEOS_ERROR_IF( m_trajectory.size( 0 ) != 2 || m_trajectory.size( 1 ) != 3, getWrapperDataContext( viewKeyStruct::trajectoryString() ) << ": Input for trajectory should be specified in the form of " "{ { xbottom, ybottom, zbottom }, { xtop, ytop, ztop } }.", diff --git a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp index cca823409d0..09150351d32 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp @@ -96,7 +96,7 @@ void VTKMeshGenerator::postInputInitialization() { ExternalMeshGeneratorBase::postInputInitialization(); - GEOS_ERROR_CTX_IF( !this->m_filePath.empty() && !m_dataSourceName.empty(), + GEOS_ERROR_IF( !this->m_filePath.empty() && !m_dataSourceName.empty(), getDataContext() << ": Access to the mesh via file or data source are mutually exclusive. " "You can't set " << viewKeyStruct::dataSourceString() << " or " << viewKeyStruct::meshPathString() << " and " << ExternalMeshGeneratorBase::viewKeyStruct::filePathString(), @@ -108,7 +108,7 @@ void VTKMeshGenerator::postInputInitialization() m_dataSource = externalDataManager.getGroupPointer< VTKHierarchicalDataSource >( m_dataSourceName ); - GEOS_THROW_CTX_IF( m_dataSource == nullptr, + GEOS_THROW_IF( m_dataSource == nullptr, getDataContext() << ": VTK Data Object Source not found: " << m_dataSourceName, InputError, getDataContext() ); diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp index f8b17e08a9b..7f390b4b456 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp @@ -79,7 +79,7 @@ Group * WellGeneratorBase::createChild( string const & childKey, string const & { GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); const auto childTypes = { viewKeyStruct::perforationString() }; - GEOS_ERROR_CTX_IF( childKey != viewKeyStruct::perforationString(), + GEOS_ERROR_IF( childKey != viewKeyStruct::perforationString(), CatalogInterface::unknownTypeError( childKey, getDataContext(), childTypes ), getDataContext() ); diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp b/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp index 311731ac820..0a0b19a3383 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp @@ -79,7 +79,7 @@ void Box::postInputInitialization() m_strikeAngle += 90; // Counterclockwise from x-axis if( std::fabs( m_strikeAngle ) > 1e-20 ) { - GEOS_ERROR_CTX_IF( (m_max[0]-m_min[0]) < (m_max[1]-m_min[1]), + GEOS_ERROR_IF( (m_max[0]-m_min[0]) < (m_max[1]-m_min[1]), getDataContext() << ": When a strike angle is specified, the box is supposed to" << " represent a plane normal to the y direction. This box seems to be too thick.", getDataContext() ); diff --git a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp index 3e6ef49ec1c..c089e4b42b7 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp @@ -50,12 +50,12 @@ ThickPlane::~ThickPlane() void ThickPlane::postInputInitialization() { m_thickness *= 0.5; // actually store the half-thickness - GEOS_ERROR_CTX_IF( m_thickness <= 0, + GEOS_ERROR_IF( m_thickness <= 0, getDataContext() << ": The plane appears to have zero or negative thickness", getDataContext() ); LvArray::tensorOps::normalize< 3 >( m_normal ); - GEOS_ERROR_CTX_IF( std::fabs( LvArray::tensorOps::l2Norm< 3 >( m_normal ) - 1.0 ) > 1e-15, + GEOS_ERROR_IF( std::fabs( LvArray::tensorOps::l2Norm< 3 >( m_normal ) - 1.0 ) > 1e-15, getDataContext() << ": Could not properly normalize input normal.", getDataContext() ); } diff --git a/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp b/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp index 1cb79a4c5e3..ebacb99e905 100644 --- a/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp +++ b/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp @@ -86,7 +86,7 @@ class FieldStatisticsBase : public TaskBase Group & physicsSolverManager = problemManager.getGroup( "Solvers" ); m_solver = physicsSolverManager.getGroupPointer< SOLVER >( m_solverName ); - GEOS_THROW_CTX_IF( m_solver == nullptr, + GEOS_THROW_IF( m_solver == nullptr, GEOS_FMT( "{}: Could not find solver '{}' of type {}", getDataContext(), m_solverName, LvArray::system::demangleType< SOLVER >() ), diff --git a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp index 58295feab49..2a7fc285941 100644 --- a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp @@ -323,27 +323,27 @@ void LinearSolverParametersInput::postInputInitialization() static const std::set< integer > binaryOptions = { 0, 1 }; - GEOS_ERROR_CTX_IF( binaryOptions.count( m_parameters.stopIfError ) == 0, + GEOS_ERROR_IF( binaryOptions.count( m_parameters.stopIfError ) == 0, getWrapperDataContext( viewKeyStruct::stopIfErrorString() ) << ": option can be either 0 (false) or 1 (true)", getWrapperDataContext( viewKeyStruct::stopIfErrorString() ) ); - GEOS_ERROR_CTX_IF( binaryOptions.count( m_parameters.direct.checkResidual ) == 0, + GEOS_ERROR_IF( binaryOptions.count( m_parameters.direct.checkResidual ) == 0, getWrapperDataContext( viewKeyStruct::directCheckResidualString() ) << ": option can be either 0 (false) or 1 (true)", getWrapperDataContext( viewKeyStruct::directCheckResidualString() ) ); - GEOS_ERROR_CTX_IF( binaryOptions.count( m_parameters.direct.equilibrate ) == 0, + GEOS_ERROR_IF( binaryOptions.count( m_parameters.direct.equilibrate ) == 0, getWrapperDataContext( viewKeyStruct::directEquilString() ) << ": option can be either 0 (false) or 1 (true)", getWrapperDataContext( viewKeyStruct::directEquilString() ) ); - GEOS_ERROR_CTX_IF( binaryOptions.count( m_parameters.direct.replaceTinyPivot ) == 0, + GEOS_ERROR_IF( binaryOptions.count( m_parameters.direct.replaceTinyPivot ) == 0, getWrapperDataContext( viewKeyStruct::directReplTinyPivotString() ) << ": option can be either 0 (false) or 1 (true)", getWrapperDataContext( viewKeyStruct::directReplTinyPivotString() ) ); - GEOS_ERROR_CTX_IF( binaryOptions.count( m_parameters.direct.iterativeRefine ) == 0, + GEOS_ERROR_IF( binaryOptions.count( m_parameters.direct.iterativeRefine ) == 0, getWrapperDataContext( viewKeyStruct::directIterRefString() ) << ": option can be either 0 (false) or 1 (true)", getWrapperDataContext( viewKeyStruct::directIterRefString() ) ); - GEOS_ERROR_CTX_IF( binaryOptions.count( m_parameters.direct.parallel ) == 0, + GEOS_ERROR_IF( binaryOptions.count( m_parameters.direct.parallel ) == 0, getWrapperDataContext( viewKeyStruct::directParallelString() ) << ": option can be either 0 (false) or 1 (true)", getWrapperDataContext( viewKeyStruct::directParallelString() ) ); diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp b/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp index 30c352dd7cf..2b102bd7777 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp @@ -136,7 +136,7 @@ void PhysicsSolverBase::generateMeshTargetsFromTargetRegions( Group const & mesh if( targetTokens.size()==1 ) // no MeshBody or MeshLevel specified { - GEOS_ERROR_CTX_IF( meshBodies.numSubGroups() != 1, + GEOS_ERROR_IF( meshBodies.numSubGroups() != 1, getDataContext() << ": No MeshBody information is specified in" << " PhysicsSolverBase::meshTargets, but there are multiple MeshBody objects", getDataContext() ); @@ -152,7 +152,7 @@ void PhysicsSolverBase::generateMeshTargetsFromTargetRegions( Group const & mesh else if( targetTokens.size()==2 ) { string const meshBodyName = targetTokens[0]; - GEOS_ERROR_CTX_IF( !meshBodies.hasGroup( meshBodyName ), + GEOS_ERROR_IF( !meshBodies.hasGroup( meshBodyName ), getWrapperDataContext( viewKeyStruct::targetRegionsString() ) << ": MeshBody (" << meshBodyName << ") is specified in targetRegions, but does not exist.", getWrapperDataContext( viewKeyStruct::targetRegionsString() ) ); @@ -211,7 +211,7 @@ PhysicsSolverBase::CatalogInterface::CatalogType & PhysicsSolverBase::getCatalog localIndex PhysicsSolverBase::targetRegionIndex( string const & regionName ) const { auto const pos = std::find( m_targetRegionNames.begin(), m_targetRegionNames.end(), regionName ); - GEOS_ERROR_CTX_IF( pos == m_targetRegionNames.end(), + GEOS_ERROR_IF( pos == m_targetRegionNames.end(), GEOS_FMT( "{}: Region {} is not a target of the solver.", getDataContext(), regionName ), getDataContext() ); return std::distance( m_targetRegionNames.begin(), pos ); @@ -337,7 +337,7 @@ bool PhysicsSolverBase::execute( real64 const time_n, getName(), subStep, dtAccepted, nextDt, dtRemaining ) ); } } - GEOS_ERROR_CTX_IF( dtRemaining > 0.0, + GEOS_ERROR_IF( dtRemaining > 0.0, getDataContext() << ": Maximum allowed number of sub-steps" " reached. Consider increasing maxSubSteps.", getDataContext() ); @@ -1374,13 +1374,13 @@ void PhysicsSolverBase::solveLinearSystem( DofManager const & dofManager, if( params.stopIfError ) { - GEOS_ERROR_CTX_IF( m_linearSolverResult.breakdown(), + GEOS_ERROR_IF( m_linearSolverResult.breakdown(), getDataContext() << ": Linear solution breakdown -> simulation STOP", getDataContext() ); } else { - GEOS_WARNING_CTX_IF( !m_linearSolverResult.success(), + GEOS_WARNING_IF( !m_linearSolverResult.success(), getDataContext() << ": Linear solution failed", getDataContext() ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index d391d6cafef..92e8ddaa33a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -611,11 +611,11 @@ void CompositionalMultiphaseBase::validateConstitutiveModels( DomainPartition co compareMulticomponentModels( fluid, referenceFluid ); bool const isFluidModelThermal = fluid.isThermal(); - GEOS_THROW_CTX_IF( m_isThermal && !isFluidModelThermal, + GEOS_THROW_IF( m_isThermal && !isFluidModelThermal, GEOS_FMT( "CompositionalMultiphaseBase {}: the thermal option is enabled in the solver, but the fluid model {} is incompatible with the thermal option", getDataContext(), fluid.getDataContext() ), InputError, getDataContext(), fluid.getDataContext() ); - GEOS_THROW_CTX_IF( !m_isThermal && isFluidModelThermal, + GEOS_THROW_IF( !m_isThermal && isFluidModelThermal, GEOS_FMT( "CompositionalMultiphaseBase {}: the thermal option is enabled in fluid model {}, but the solver options are incompatible with the thermal option", getDataContext(), fluid.getDataContext() ), InputError, getDataContext(), fluid.getDataContext() ); @@ -1103,7 +1103,7 @@ void CompositionalMultiphaseBase::computeHydrostaticEquilibrium( DomainPartition equilCounter++; // check that the gravity vector is aligned with the z-axis - GEOS_THROW_CTX_IF( !isZero( gravVector[0] ) || !isZero( gravVector[1] ), + GEOS_THROW_IF( !isZero( gravVector[0] ) || !isZero( gravVector[1] ), getCatalogName() << " " << getDataContext() << ": the gravity vector specified in this simulation (" << gravVector[0] << " " << gravVector[1] << " " << gravVector[2] << ") is not aligned with the z-axis. \n" @@ -1221,13 +1221,13 @@ void CompositionalMultiphaseBase::computeHydrostaticEquilibrium( DomainPartition MultiFluidBase & fluid = getConstitutiveModel< MultiFluidBase >( subRegion, fluidName ); string_array const & componentNames = fs.getComponentNames(); - GEOS_THROW_CTX_IF( fluid.componentNames().size() != componentNames.size(), + GEOS_THROW_IF( fluid.componentNames().size() != componentNames.size(), "Mismatch in number of components between constitutive model " << fluid.getDataContext() << " and the Equilibrium initial condition " << fs.getDataContext(), InputError, fluid.getDataContext(), fs.getDataContext() ); for( integer ic = 0; ic < fluid.numFluidComponents(); ++ic ) { - GEOS_THROW_CTX_IF( fluid.componentNames()[ic] != componentNames[ic], + GEOS_THROW_IF( fluid.componentNames()[ic] != componentNames[ic], "Mismatch in component names between constitutive model " << fluid.getDataContext() << " and the Equilibrium initial condition " << fs.getDataContext(), InputError, fluid.getDataContext(), fs.getDataContext() ); @@ -1236,7 +1236,7 @@ void CompositionalMultiphaseBase::computeHydrostaticEquilibrium( DomainPartition // Note: for now, we assume that the reservoir is in a single-phase state at initialization string_array const & phaseNames = fluid.phaseNames(); auto const itPhaseNames = std::find( std::begin( phaseNames ), std::end( phaseNames ), initPhaseName ); - GEOS_THROW_CTX_IF( itPhaseNames == std::end( phaseNames ), + GEOS_THROW_IF( itPhaseNames == std::end( phaseNames ), getCatalogName() << " " << getDataContext() << ": phase name " << initPhaseName << " not found in the phases of " << fluid.getDataContext(), InputError, getDataContext(), fluid.getDataContext() ); @@ -1270,7 +1270,7 @@ void CompositionalMultiphaseBase::computeHydrostaticEquilibrium( DomainPartition elevationValues.toNestedView(), pressureValues.toView() ); - GEOS_THROW_CTX_IF( returnValue == isothermalCompositionalMultiphaseBaseKernels::HydrostaticPressureKernel::ReturnType::FAILED_TO_CONVERGE, + GEOS_THROW_IF( returnValue == isothermalCompositionalMultiphaseBaseKernels::HydrostaticPressureKernel::ReturnType::FAILED_TO_CONVERGE, getCatalogName() << " " << getDataContext() << ": hydrostatic pressure initialization failed to converge in region " << region.getName() << "! \n" << "Try to loosen the equilibration tolerance, or increase the number of equilibration iterations. \n" << @@ -1333,7 +1333,7 @@ void CompositionalMultiphaseBase::computeHydrostaticEquilibrium( DomainPartition } } ); - GEOS_ERROR_CTX_IF( minPressure.get() < 0.0, + GEOS_ERROR_IF( minPressure.get() < 0.0, GEOS_FMT( "{}: A negative pressure of {} Pa was found during hydrostatic initialization in region/subRegion {}/{}", getDataContext(), minPressure.get(), region.getName(), subRegion.getName() ), getDataContext() ); @@ -1848,7 +1848,7 @@ void CompositionalMultiphaseBase::applyDirichletBC( real64 const time_n, if( m_nonlinearSolverParameters.m_numNewtonIterations == 0 ) { bool const bcConsistent = validateDirichletBC( domain, time_n + dt ); - GEOS_ERROR_CTX_IF( !bcConsistent, + GEOS_ERROR_IF( !bcConsistent, GEOS_FMT( "CompositionalMultiphaseBase {}: inconsistent boundary conditions", getDataContext() ), getDataContext() ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 61c5ea422f1..0b0584a74c2 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -204,7 +204,7 @@ void CompositionalMultiphaseFVM::initializePreSubGroups() NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager(); FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); FluxApproximationBase const & fluxApprox = fvManager.getFluxApproximation( m_discretizationName ); - GEOS_ERROR_CTX_IF( fluxApprox.upwindingParams().upwindingScheme == UpwindingScheme::HU2PH && m_numPhases != 2, + GEOS_ERROR_IF( fluxApprox.upwindingParams().upwindingScheme == UpwindingScheme::HU2PH && m_numPhases != 2, GEOS_FMT( "{}: upwinding scheme {} only supports 2-phase flow", getDataContext(), EnumStrings< UpwindingScheme >::toString( UpwindingScheme::HU2PH )), @@ -1260,7 +1260,7 @@ void CompositionalMultiphaseFVM::applyFaceDirichletBC( real64 const time_n, if( m_nonlinearSolverParameters.m_numNewtonIterations == 0 ) { bool const bcConsistent = validateFaceDirichletBC( domain, time_n + dt ); - GEOS_ERROR_CTX_IF( !bcConsistent, + GEOS_ERROR_IF( !bcConsistent, GEOS_FMT( "{}: inconsistent boundary conditions", getDataContext() ), getDataContext() ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp index a6d344a6266..c10f9f01a71 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp @@ -86,12 +86,12 @@ void CompositionalMultiphaseHybridFVM::initializePreSubGroups() NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager(); FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); - GEOS_THROW_CTX_IF( !fvManager.hasGroup< HybridMimeticDiscretization >( m_discretizationName ), + GEOS_THROW_IF( !fvManager.hasGroup< HybridMimeticDiscretization >( m_discretizationName ), getCatalogName() << " " << getDataContext() << ": the HybridMimeticDiscretization must be selected with CompositionalMultiphaseHybridFVM", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( m_hasCapPressure, + GEOS_THROW_IF( m_hasCapPressure, getCatalogName() << " " << getDataContext() << ": capillary pressure is not yet supported by CompositionalMultiphaseHybridFVM", InputError, getDataContext() ); @@ -144,7 +144,7 @@ void CompositionalMultiphaseHybridFVM::initializePostInitialConditionsPreSubGrou minVal.min( transMultiplier[iface] ); } ); - GEOS_THROW_CTX_IF( minVal.get() <= 0.0, + GEOS_THROW_IF( minVal.get() <= 0.0, getCatalogName() << " " << getDataContext() << ": the transmissibility multipliers used in SinglePhaseHybridFVM must strictly larger than 0.0", std::runtime_error, getDataContext() ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp index f962e86af91..139139be6e8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp @@ -1066,7 +1066,7 @@ void ReactiveCompositionalMultiphaseOBL::applyDirichletBC( real64 const time, if( m_nonlinearSolverParameters.m_numNewtonIterations == 0 ) { bool const bcConsistent = validateDirichletBC( domain, time + dt ); - GEOS_ERROR_CTX_IF( !bcConsistent, + GEOS_ERROR_IF( !bcConsistent, GEOS_FMT( "CompositionalMultiphaseBase {}: inconsistent boundary conditions", getDataContext() ), getDataContext() ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 9f3e48153e7..11c6e1f6c29 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -161,11 +161,11 @@ void SinglePhaseBase::validateConstitutiveModels( DomainPartition & domain ) con constitutiveUpdatePassThru( fluid, [&] ( auto & castedFluid ) { string const fluidModelName = castedFluid.getCatalogName(); - GEOS_THROW_CTX_IF( m_isThermal && (fluidModelName != "ThermalCompressibleSinglePhaseFluid"), + GEOS_THROW_IF( m_isThermal && (fluidModelName != "ThermalCompressibleSinglePhaseFluid"), GEOS_FMT( "SingleFluidBase {}: the thermal option is enabled in the solver, but the fluid model {} is not for thermal fluid", getDataContext(), fluid.getDataContext() ), InputError, getDataContext(), fluid.getDataContext() ); - GEOS_THROW_CTX_IF( !m_isThermal && (fluidModelName == "ThermalCompressibleSinglePhaseFluid"), + GEOS_THROW_IF( !m_isThermal && (fluidModelName == "ThermalCompressibleSinglePhaseFluid"), GEOS_FMT( "SingleFluidBase {}: the fluid model is for thermal fluid {}, but the solver option is incompatible with the fluid model", getDataContext(), fluid.getDataContext() ), InputError, getDataContext(), fluid.getDataContext() ); @@ -412,7 +412,7 @@ void SinglePhaseBase::computeHydrostaticEquilibrium( DomainPartition & domain ) equilCounter++; // check that the gravity vector is aligned with the z-axis - GEOS_THROW_CTX_IF( !isZero( gravVector[0] ) || !isZero( gravVector[1] ), + GEOS_THROW_IF( !isZero( gravVector[0] ) || !isZero( gravVector[1] ), getCatalogName() << " " << getDataContext() << ": the gravity vector specified in this simulation (" << gravVector[0] << " " << gravVector[1] << " " << gravVector[2] << ") is not aligned with the z-axis. \n" @@ -531,7 +531,7 @@ void SinglePhaseBase::computeHydrostaticEquilibrium( DomainPartition & domain ) elevationValues.toNestedView(), pressureValues.toView() ); - GEOS_THROW_CTX_IF( !equilHasConverged, + GEOS_THROW_IF( !equilHasConverged, getCatalogName() << " " << getDataContext() << ": hydrostatic pressure initialization failed to converge in region " << region.getName() << "!", std::runtime_error, getDataContext() ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index eba3b505743..a55796d3119 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -90,7 +90,7 @@ void SinglePhaseHybridFVM::initializePreSubGroups() { SinglePhaseBase::initializePreSubGroups(); - GEOS_THROW_CTX_IF( m_isThermal, + GEOS_THROW_IF( m_isThermal, GEOS_FMT( "{} {}: The thermal option is not supported by SinglePhaseHybridFVM", getCatalogName(), getDataContext().toString() ), InputError, getDataContext() ); @@ -99,7 +99,7 @@ void SinglePhaseHybridFVM::initializePreSubGroups() NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager(); FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); - GEOS_THROW_CTX_IF( !fvManager.hasGroup< HybridMimeticDiscretization >( m_discretizationName ), + GEOS_THROW_IF( !fvManager.hasGroup< HybridMimeticDiscretization >( m_discretizationName ), getCatalogName() << " " << getDataContext() << ": the HybridMimeticDiscretization must be selected with SinglePhaseHybridFVM", InputError, getDataContext() ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp index a5d9ba038ac..03cddb53c00 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp @@ -57,7 +57,7 @@ void SourceFluxStatsAggregator::postInputInitialization() { m_fluxNames.emplace_back( string( sourceFlux.getName() ) ); } ); - GEOS_WARNING_CTX_IF( m_fluxNames.empty(), + GEOS_WARNING_IF( m_fluxNames.empty(), GEOS_FMT( "{}: No {} was found in {}.", getDataContext(), SourceFluxBoundaryCondition::catalogName(), fsManager.getDataContext() ), @@ -67,7 +67,7 @@ void SourceFluxStatsAggregator::postInputInitialization() { for( string const & fluxName : m_fluxNames ) { - GEOS_ERROR_CTX_IF( !fsManager.hasGroup< SourceFluxBoundaryCondition >( fluxName ), + GEOS_ERROR_IF( !fsManager.hasGroup< SourceFluxBoundaryCondition >( fluxName ), GEOS_FMT( "{}: No {} named {} was found in {}.", getDataContext(), SourceFluxBoundaryCondition::catalogName(), fluxName, fsManager.getDataContext() ), getDataContext() ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp b/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp index 7cd80fa3b32..9a4143a4515 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp @@ -68,7 +68,7 @@ void StencilDataCollection::postInputInitialization() Group & physicsSolverManager = problemManager.getGroup( "Solvers" ); m_solver = physicsSolverManager.getGroupPointer< FlowSolverBase >( m_solverName ); - GEOS_THROW_CTX_IF( m_solver == nullptr, + GEOS_THROW_IF( m_solver == nullptr, GEOS_FMT( "{}: Could not find flow solver named '{}'.", getDataContext(), m_solverName ), @@ -113,10 +113,10 @@ void StencilDataCollection::initializePostInitialConditionsPostSubGroups() getName(), connCount, m_discretization->getName() ) ); ++supportedStencilCount; } ); - GEOS_ERROR_CTX_IF( supportedStencilCount == 0, + GEOS_ERROR_IF( supportedStencilCount == 0, GEOS_FMT( "{}: No compatible discretization was found.", getDataContext() ), getDataContext() ); - GEOS_ERROR_CTX_IF( supportedStencilCount > 1, + GEOS_ERROR_IF( supportedStencilCount > 1, GEOS_FMT( "{}: Multiple discretization was found.", getDataContext() ), getDataContext() ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp index b593eedc39c..7e1617daee3 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp @@ -700,7 +700,7 @@ void ProppantTransport::applyBoundaryConditions( real64 const time_n, { string const & subRegionName = subRegion.getName(); - GEOS_ERROR_CTX_IF( bcStatusMap[subRegionName].count( setName ) > 0, + GEOS_ERROR_IF( bcStatusMap[subRegionName].count( setName ) > 0, getDataContext() << ": Conflicting proppant boundary conditions on set " << setName, getDataContext() ); bcStatusMap[subRegionName][setName].resize( m_numComponents ); @@ -721,10 +721,10 @@ void ProppantTransport::applyBoundaryConditions( real64 const time_n, string const & subRegionName = subRegion.getName(); localIndex const comp = fs.getComponent(); - GEOS_ERROR_CTX_IF( bcStatusMap[subRegionName].count( setName ) == 0, + GEOS_ERROR_IF( bcStatusMap[subRegionName].count( setName ) == 0, getDataContext() << ": Proppant boundary condition not prescribed on set '" << setName << "'", getDataContext() ); - GEOS_ERROR_CTX_IF( bcStatusMap[subRegionName][setName][comp], + GEOS_ERROR_IF( bcStatusMap[subRegionName][setName][comp], getDataContext() << ": Conflicting composition[" << comp << "] boundary conditions on set '" << setName << "'", getDataContext() ); bcStatusMap[subRegionName][setName][comp] = true; @@ -744,7 +744,7 @@ void ProppantTransport::applyBoundaryConditions( real64 const time_n, for( localIndex ic = 0; ic < m_numComponents; ++ic ) { bcConsistent &= bcStatusEntryInner.second[ic]; - GEOS_WARNING_CTX_IF( !bcConsistent, + GEOS_WARNING_IF( !bcConsistent, getDataContext() << ": Composition boundary condition not applied to component " << ic << " on region '" << bcStatusEntryOuter.first << "'," << " set '" << bcStatusEntryInner.first << "'", getDataContext() ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 193340cdf5e..37993465a20 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -413,13 +413,13 @@ void CompositionalMultiphaseWell::validateInjectionStreams( WellElementSubRegion for( integer ic = 0; ic < m_numComponents; ++ic ) { real64 const compFrac = injectionStream[ic]; - GEOS_THROW_CTX_IF( ( compFrac < 0.0 ) || ( compFrac > 1.0 ), + GEOS_THROW_IF( ( compFrac < 0.0 ) || ( compFrac > 1.0 ), "WellControls " << wellControls.getDataContext() << ": Invalid injection stream for well " << subRegion.getName(), InputError, wellControls.getDataContext() ); compFracSum += compFrac; } - GEOS_THROW_CTX_IF( ( compFracSum < 1.0 - std::numeric_limits< real64 >::epsilon() ) || + GEOS_THROW_IF( ( compFracSum < 1.0 - std::numeric_limits< real64 >::epsilon() ) || ( compFracSum > 1.0 + std::numeric_limits< real64 >::epsilon() ), "WellControls " << wellControls.getDataContext() << ": Invalid injection stream for well " << subRegion.getName(), @@ -441,42 +441,42 @@ void CompositionalMultiphaseWell::validateWellConstraints( real64 const & time_n real64 const & targetPhaseRate = wellControls.getTargetPhaseRate( time_n ); real64 const & targetMassRate = wellControls.getTargetMassRate( time_n ); - GEOS_THROW_CTX_IF( wellControls.isInjector() && currentControl == WellControls::Control::PHASEVOLRATE, + GEOS_THROW_IF( wellControls.isInjector() && currentControl == WellControls::Control::PHASEVOLRATE, "WellControls " << wellControls.getDataContext() << ": Phase rate control is not available for injectors", InputError, wellControls.getDataContext() ); - GEOS_THROW_CTX_IF( wellControls.isProducer() && currentControl == WellControls::Control::TOTALVOLRATE, + GEOS_THROW_IF( wellControls.isProducer() && currentControl == WellControls::Control::TOTALVOLRATE, "WellControls " << wellControls.getDataContext() << ": Total rate control is not available for producers", InputError, wellControls.getDataContext() ); - GEOS_THROW_CTX_IF( wellControls.isInjector() && targetTotalRate < 0.0, + GEOS_THROW_IF( wellControls.isInjector() && targetTotalRate < 0.0, "WellControls " << wellControls.getDataContext() << ": Target total rate cannot be negative for injectors", InputError, wellControls.getDataContext() ); - GEOS_THROW_CTX_IF( wellControls.isInjector() && !isZero( targetPhaseRate ), + GEOS_THROW_IF( wellControls.isInjector() && !isZero( targetPhaseRate ), "WellControls " << wellControls.getDataContext() << ": Target phase rate cannot be used for injectors", InputError, wellControls.getDataContext() ); - GEOS_THROW_CTX_IF( wellControls.isProducer() && !isZero( targetTotalRate ), + GEOS_THROW_IF( wellControls.isProducer() && !isZero( targetTotalRate ), "WellControls " << wellControls.getDataContext() << ": Target total rate cannot be used for producers", InputError, wellControls.getDataContext() ); - GEOS_THROW_CTX_IF( wellControls.isProducer() && !isZero( targetMassRate ), + GEOS_THROW_IF( wellControls.isProducer() && !isZero( targetMassRate ), "WellControls " << wellControls.getDataContext() << ": Target mass rate cannot be used for producers", InputError, wellControls.getDataContext() ); - GEOS_THROW_CTX_IF( !m_useMass && !isZero( targetMassRate ), + GEOS_THROW_IF( !m_useMass && !isZero( targetMassRate ), "WellControls " << wellControls.getDataContext() << ": Target mass rate cannot with useMass=0", InputError, wellControls.getDataContext() ); // The user always provides positive rates, but these rates are later multiplied by -1 internally for producers - GEOS_THROW_CTX_IF( wellControls.isProducer() && targetPhaseRate > 0.0, + GEOS_THROW_IF( wellControls.isProducer() && targetPhaseRate > 0.0, "WellControls " << wellControls.getDataContext() << ": Target phase rate cannot be negative for producers", InputError, wellControls.getDataContext() ); - GEOS_THROW_CTX_IF( wellControls.isProducer() && !isZero( targetTotalRate ), + GEOS_THROW_IF( wellControls.isProducer() && !isZero( targetTotalRate ), "WellControls " << wellControls.getDataContext() << ": Target total rate cannot be used for producers", InputError, wellControls.getDataContext() ); @@ -489,7 +489,7 @@ void CompositionalMultiphaseWell::validateWellConstraints( real64 const & time_n m_targetPhaseIndex = ip; } } - GEOS_THROW_CTX_IF( wellControls.isProducer() && m_targetPhaseIndex == -1, + GEOS_THROW_IF( wellControls.isProducer() && m_targetPhaseIndex == -1, "WellControls " << wellControls.getDataContext() << ": Phase " << wellControls.getTargetPhaseName() << " not found for well control " << wellControls.getName(), InputError, wellControls.getDataContext() ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp index 707d657e211..4a009a5dc7d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp @@ -145,17 +145,17 @@ void SinglePhaseWell::validateWellConstraints( real64 const & time_n, WellControls::Control const currentControl = wellControls.getControl(); real64 const targetTotalRate = wellControls.getTargetTotalRate( time_n ); real64 const targetPhaseRate = wellControls.getTargetPhaseRate( time_n ); - GEOS_THROW_CTX_IF( currentControl == WellControls::Control::PHASEVOLRATE, + GEOS_THROW_IF( currentControl == WellControls::Control::PHASEVOLRATE, "WellControls " << wellControls.getDataContext() << ": Phase rate control is not available for SinglePhaseWell", InputError, wellControls.getDataContext() ); // The user always provides positive rates, but these rates are later multiplied by -1 internally for producers - GEOS_THROW_CTX_IF( ( ( wellControls.isInjector() && targetTotalRate < 0.0 ) || + GEOS_THROW_IF( ( ( wellControls.isInjector() && targetTotalRate < 0.0 ) || ( wellControls.isProducer() && targetTotalRate > 0.0) ), "WellControls " << wellControls.getDataContext() << ": Target total rate cannot be negative", InputError, wellControls.getDataContext() ); - GEOS_THROW_CTX_IF( !isZero( targetPhaseRate ), + GEOS_THROW_IF( !isZero( targetPhaseRate ), "WellControls " << wellControls.getDataContext() << ": Target phase rate cannot be used for SinglePhaseWell", InputError, wellControls.getDataContext() ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp index 9c813814d78..fbc65568fa1 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp @@ -228,7 +228,7 @@ void WellControls::postInputInitialization() // 0) Assign the value of the current well control // When the simulation starts from a restart file, we don't want to use the inputControl, // because the control may have switched in the simulation that generated the restart - GEOS_THROW_CTX_IF( m_inputControl == Control::UNINITIALIZED, + GEOS_THROW_IF( m_inputControl == Control::UNINITIALIZED, getWrapperDataContext( viewKeyStruct::inputControlString() ) << ": Input well control cannot be uninitialized", InputError, getWrapperDataContext( viewKeyStruct::inputControlString() ) ); @@ -239,25 +239,25 @@ void WellControls::postInputInitialization() } // 1.a) check target BHP - GEOS_THROW_CTX_IF( m_targetBHP < 0, + GEOS_THROW_IF( m_targetBHP < 0, getWrapperDataContext( viewKeyStruct::targetBHPString() ) << ": Target bottom-hole pressure is negative", InputError, getWrapperDataContext( viewKeyStruct::targetBHPString() ) ); // 1.b) check target rates - GEOS_THROW_CTX_IF( m_targetTotalRate < 0, + GEOS_THROW_IF( m_targetTotalRate < 0, getWrapperDataContext( viewKeyStruct::targetTotalRateString() ) << ": Target rate is negative", InputError, getWrapperDataContext( viewKeyStruct::targetTotalRateString() ) ); - GEOS_THROW_CTX_IF( m_targetPhaseRate < 0, + GEOS_THROW_IF( m_targetPhaseRate < 0, getWrapperDataContext( viewKeyStruct::targetPhaseRateString() ) << ": Target oil rate is negative", InputError, getWrapperDataContext( viewKeyStruct::targetPhaseRateString() ) ); - GEOS_THROW_CTX_IF( m_targetMassRate < 0, + GEOS_THROW_IF( m_targetMassRate < 0, getWrapperDataContext( viewKeyStruct::targetMassRateString() ) << ": Target mass rate is negative", InputError, getWrapperDataContext( viewKeyStruct::targetMassRateString() ) ); - GEOS_THROW_CTX_IF( (m_injectionStream.empty() && m_injectionTemperature >= 0) || + GEOS_THROW_IF( (m_injectionStream.empty() && m_injectionTemperature >= 0) || (!m_injectionStream.empty() && m_injectionTemperature < 0), "WellControls " << getDataContext() << ": Both " << viewKeyStruct::injectionStreamString() << " and " << viewKeyStruct::injectionTemperatureString() @@ -280,23 +280,23 @@ void WellControls::postInputInitialization() real64 sum = 0.0; for( localIndex ic = 0; ic < m_injectionStream.size(); ++ic ) { - GEOS_ERROR_CTX_IF( m_injectionStream[ic] < 0.0 || m_injectionStream[ic] > 1.0, + GEOS_ERROR_IF( m_injectionStream[ic] < 0.0 || m_injectionStream[ic] > 1.0, getWrapperDataContext( viewKeyStruct::injectionStreamString() ) << ": Invalid injection stream", getWrapperDataContext( viewKeyStruct::injectionStreamString() ) ); sum += m_injectionStream[ic]; } - GEOS_THROW_CTX_IF( LvArray::math::abs( 1.0 - sum ) > std::numeric_limits< real64 >::epsilon(), + GEOS_THROW_IF( LvArray::math::abs( 1.0 - sum ) > std::numeric_limits< real64 >::epsilon(), getWrapperDataContext( viewKeyStruct::injectionStreamString() ) << ": Invalid injection stream", InputError, getWrapperDataContext( viewKeyStruct::injectionStreamString() ) ); } // 3) check the flag for surface / reservoir conditions - GEOS_THROW_CTX_IF( m_useSurfaceConditions != 0 && m_useSurfaceConditions != 1, + GEOS_THROW_IF( m_useSurfaceConditions != 0 && m_useSurfaceConditions != 1, getWrapperDataContext( viewKeyStruct::useSurfaceConditionsString() ) << ": The flag to select surface/reservoir conditions must be equal to 0 or 1", InputError, getWrapperDataContext( viewKeyStruct::useSurfaceConditionsString() ) ); // 4) check that at least one rate constraint has been defined - GEOS_THROW_CTX_IF( ((m_targetPhaseRate <= 0.0 && m_targetPhaseRateTableName.empty()) && + GEOS_THROW_IF( ((m_targetPhaseRate <= 0.0 && m_targetPhaseRateTableName.empty()) && (m_targetMassRate <= 0.0 && m_targetMassRateTableName.empty()) && (m_targetTotalRate <= 0.0 && m_targetTotalRateTableName.empty())), "WellControls " << getDataContext() << ": You need to specify a phase, mass, or total rate constraint. \n" << @@ -312,27 +312,27 @@ void WellControls::postInputInitialization() InputError, getDataContext() ); // 5) check whether redundant information has been provided - GEOS_THROW_CTX_IF( ((m_targetPhaseRate > 0.0 && !m_targetPhaseRateTableName.empty())), + GEOS_THROW_IF( ((m_targetPhaseRate > 0.0 && !m_targetPhaseRateTableName.empty())), "WellControls " << getDataContext() << ": You have provided redundant information for well phase rate." << " The keywords " << viewKeyStruct::targetPhaseRateString() << " and " << viewKeyStruct::targetPhaseRateTableNameString() << " cannot be specified together", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( ((m_targetTotalRate > 0.0 && !m_targetTotalRateTableName.empty())), + GEOS_THROW_IF( ((m_targetTotalRate > 0.0 && !m_targetTotalRateTableName.empty())), "WellControls " << getDataContext() << ": You have provided redundant information for well total rate." << " The keywords " << viewKeyStruct::targetTotalRateString() << " and " << viewKeyStruct::targetTotalRateTableNameString() << " cannot be specified together", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( ((m_targetBHP > 0.0 && !m_targetBHPTableName.empty())), + GEOS_THROW_IF( ((m_targetBHP > 0.0 && !m_targetBHPTableName.empty())), "WellControls " << getDataContext() << ": You have provided redundant information for well BHP." << " The keywords " << viewKeyStruct::targetBHPString() << " and " << viewKeyStruct::targetBHPTableNameString() << " cannot be specified together", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( ((m_targetMassRate > 0.0 && !m_targetMassRateTableName.empty())), + GEOS_THROW_IF( ((m_targetMassRate > 0.0 && !m_targetMassRateTableName.empty())), "WellControls " << getDataContext() << ": You have provided redundant information for well mass rate." << " The keywords " << viewKeyStruct::targetMassRateString() << " and " << viewKeyStruct::targetMassRateTableNameString() << " cannot be specified together", InputError, getDataContext() ); - GEOS_THROW_CTX_IF( ((m_targetMassRate > 0.0 && m_useSurfaceConditions==0)), + GEOS_THROW_IF( ((m_targetMassRate > 0.0 && m_useSurfaceConditions==0)), "WellControls " << getDataContext() << ": Option only valid if useSurfaceConditions set to 1", InputError, getDataContext() ); @@ -340,7 +340,7 @@ void WellControls::postInputInitialization() // Otherwise the BHP will be set to a default value. if( m_currentControl == Control::BHP ) { - GEOS_THROW_CTX_IF( ((m_targetBHP <= 0.0 && m_targetBHPTableName.empty())), + GEOS_THROW_IF( ((m_targetBHP <= 0.0 && m_targetBHPTableName.empty())), "WellControls " << getDataContext() << ": You have to provide well BHP by specifying either " << viewKeyStruct::targetBHPString() << " or " << viewKeyStruct::targetBHPTableNameString(), InputError, getDataContext() ); @@ -355,25 +355,25 @@ void WellControls::postInputInitialization() // 6.2) Check incoherent information // An injector must be controlled by TotalVolRate - GEOS_THROW_CTX_IF( (isInjector() && (m_inputControl == Control::PHASEVOLRATE)), + GEOS_THROW_IF( (isInjector() && (m_inputControl == Control::PHASEVOLRATE)), "WellControls " << getDataContext() << ": You have to control an injector with " << EnumStrings< Control >::toString( Control::TOTALVOLRATE ), InputError, getDataContext() ); // An injector must be controlled by TotalVolRate - GEOS_THROW_CTX_IF( (isProducer() && (m_inputControl == Control::MASSRATE)), + GEOS_THROW_IF( (isProducer() && (m_inputControl == Control::MASSRATE)), "WellControls " << getDataContext() << ": You have to control an injector with " << EnumStrings< Control >::toString( Control::MASSRATE ), InputError, getDataContext() ); // 7) Make sure that the flag disabling crossflow is not used for producers - GEOS_THROW_CTX_IF( isProducer() && m_isCrossflowEnabled == 0, + GEOS_THROW_IF( isProducer() && m_isCrossflowEnabled == 0, getWrapperDataContext( viewKeyStruct::enableCrossflowString() ) << ": This option cannot be set to '0' for producers", InputError, getWrapperDataContext( viewKeyStruct::enableCrossflowString() ) ); // 8) Make sure that the initial pressure coefficient is positive - GEOS_THROW_CTX_IF( m_initialPressureCoefficient < 0, + GEOS_THROW_IF( m_initialPressureCoefficient < 0, getWrapperDataContext( viewKeyStruct::initialPressureCoefficientString() ) << ": This tuning coefficient is negative", InputError, getWrapperDataContext( viewKeyStruct::initialPressureCoefficientString() ) ); @@ -390,7 +390,7 @@ void WellControls::postInputInitialization() FunctionManager & functionManager = FunctionManager::getInstance(); m_targetBHPTable = &(functionManager.getGroup< TableFunction const >( m_targetBHPTableName )); - GEOS_THROW_CTX_IF( m_targetBHPTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, + GEOS_THROW_IF( m_targetBHPTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, "WellControls " << getDataContext() << ": The interpolation method for the time-dependent BHP table " << m_targetBHPTable->getName() << " should be TableFunction::InterpolationType::Lower", InputError, getDataContext() ); @@ -407,7 +407,7 @@ void WellControls::postInputInitialization() FunctionManager & functionManager = FunctionManager::getInstance(); m_targetTotalRateTable = &(functionManager.getGroup< TableFunction const >( m_targetTotalRateTableName )); - GEOS_THROW_CTX_IF( m_targetTotalRateTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, + GEOS_THROW_IF( m_targetTotalRateTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, "WellControls " << getDataContext() << ": The interpolation method for the time-dependent total rate table " << m_targetTotalRateTable->getName() << " should be TableFunction::InterpolationType::Lower", InputError, getDataContext() ); @@ -424,7 +424,7 @@ void WellControls::postInputInitialization() FunctionManager & functionManager = FunctionManager::getInstance(); m_targetPhaseRateTable = &(functionManager.getGroup< TableFunction const >( m_targetPhaseRateTableName )); - GEOS_THROW_CTX_IF( m_targetPhaseRateTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, + GEOS_THROW_IF( m_targetPhaseRateTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, "WellControls " << getDataContext() << ": The interpolation method for the time-dependent phase rate table " << m_targetPhaseRateTable->getName() << " should be TableFunction::InterpolationType::Lower", InputError, getDataContext() ); @@ -440,7 +440,7 @@ void WellControls::postInputInitialization() FunctionManager & functionManager = FunctionManager::getInstance(); m_targetMassRateTable = &(functionManager.getGroup< TableFunction const >( m_targetMassRateTableName )); - GEOS_THROW_CTX_IF( m_targetMassRateTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, + GEOS_THROW_IF( m_targetMassRateTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, "WellControls " << getDataContext() << ": The interpolation method for the time-dependent mass rate table " << m_targetMassRateTable->getName() << " should be TableFunction::InterpolationType::Lower", InputError, getDataContext() ); @@ -462,7 +462,7 @@ void WellControls::postInputInitialization() FunctionManager & functionManager = FunctionManager::getInstance(); m_statusTable = &(functionManager.getGroup< TableFunction const >( m_statusTableName )); - GEOS_THROW_CTX_IF( m_statusTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, + GEOS_THROW_IF( m_statusTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, "WellControls " << getDataContext() << ": The interpolation method for the time-dependent status table " << m_statusTable->getName() << " should be TableFunction::InterpolationType::Lower", InputError, getDataContext() ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp index cd0d3921c53..0c29efdc37a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp @@ -73,7 +73,7 @@ Group * WellSolverBase::createChild( string const & childKey, string const & chi PhysicsSolverBase::groupKeyStruct::linearSolverParametersString(), PhysicsSolverBase::groupKeyStruct::nonlinearSolverParametersString(), }; - GEOS_ERROR_CTX_IF( childTypes.count( childKey ) == 0, + GEOS_ERROR_IF( childTypes.count( childKey ) == 0, CatalogInterface::unknownTypeError( childKey, getDataContext(), childTypes ) , getDataContext() ); if( childKey == keys::wellControls ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp index b3de5b007f3..0d45b439562 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp @@ -663,13 +663,13 @@ PresTempCompFracInitializationKernel:: } ); - GEOS_THROW_CTX_IF( foundNegativePres.get() == 1, + GEOS_THROW_IF( foundNegativePres.get() == 1, wellControls.getDataContext() << "Invalid well initialization, negative pressure was found.", InputError, wellControls.getDataContext() ); - GEOS_THROW_CTX_IF( foundNegativeTemp.get() == 1, + GEOS_THROW_IF( foundNegativeTemp.get() == 1, wellControls.getDataContext() << "Invalid well initialization, negative temperature was found.", InputError, wellControls.getDataContext() ); - GEOS_THROW_CTX_IF( foundInconsistentCompFrac.get() == 1, + GEOS_THROW_IF( foundInconsistentCompFrac.get() == 1, wellControls.getDataContext() << "Invalid well initialization, inconsistent component fractions were found.", InputError, wellControls.getDataContext() ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp index c6098a68a33..f173e6242f0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp @@ -578,12 +578,12 @@ PresTempInitializationKernel:: } } ); - GEOS_THROW_CTX_IF( foundNegativePressure.get() == 1, + GEOS_THROW_IF( foundNegativePressure.get() == 1, wellControls.getDataContext() << ": Invalid well initialization, negative pressure was found.", InputError, wellControls.getDataContext() ); if( isThermal ) // tjb change temp in isothermal cases shouldnt be an issue (also what if temp in fluid prop calcs like compo) { - GEOS_THROW_CTX_IF( foundNegativeTemp.get() == 1, + GEOS_THROW_IF( foundNegativeTemp.get() == 1, wellControls.getDataContext() << "Invalid well initialization, negative temperature was found.", InputError, wellControls.getDataContext() ); } diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SpringSlider.cpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SpringSlider.cpp index c2a006a0eb6..f233fd7049d 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SpringSlider.cpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SpringSlider.cpp @@ -89,7 +89,7 @@ void SpringSlider< RSSOLVER_TYPE >::registerDataOnMesh( Group & meshBodies ) string & frictionLawName = subRegion.getReference< string >( viewKeyStruct::frictionLawNameString() ); frictionLawName = PhysicsSolverBase::getConstitutiveName< FrictionBase >( subRegion ); - GEOS_ERROR_CTX_IF( frictionLawName.empty(), + GEOS_ERROR_IF( frictionLawName.empty(), GEOS_FMT( "{}: FrictionBase model not found on subregion {}", this->getDataContext(), subRegion.getDataContext() ), this->getDataContext() ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp index 71779b60465..d8531e2b5db 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp @@ -150,7 +150,7 @@ initializePreSubGroups() bool const useMassFlow = flowSolver->getReference< integer >( CompositionalMultiphaseBase::viewKeyStruct::useMassFlagString() ); bool const useMassWell = Base::wellSolver()->template getReference< integer >( CompositionalMultiphaseWell::viewKeyStruct::useMassFlagString() ); - GEOS_THROW_CTX_IF( useMassFlow != useMassWell, + GEOS_THROW_IF( useMassFlow != useMassWell, GEOS_FMT( "{}: the input flag {} must be the same in the flow and well solvers, respectively '{}' and '{}'", this->getDataContext(), CompositionalMultiphaseBase::viewKeyStruct::useMassFlagString(), Base::reservoirSolver()->getDataContext(), Base::wellSolver()->getDataContext() ), @@ -158,7 +158,7 @@ initializePreSubGroups() bool const isThermalFlow = flowSolver->getReference< integer >( CompositionalMultiphaseBase::viewKeyStruct::isThermalString() ); bool const isThermalWell = Base::wellSolver()->template getReference< integer >( CompositionalMultiphaseWell::viewKeyStruct::isThermalString() ); - GEOS_THROW_CTX_IF( isThermalFlow != isThermalWell, + GEOS_THROW_IF( isThermalFlow != isThermalWell, GEOS_FMT( "{}: the input flag {} must be the same in the flow and well solvers, respectively '{}' and '{}'", this->getDataContext(), CompositionalMultiphaseBase::viewKeyStruct::isThermalString(), Base::reservoirSolver()->getDataContext(), Base::wellSolver()->getDataContext() ), diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp index 93b28ea1f07..b775d322d31 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp @@ -152,7 +152,7 @@ bool validateWellPerforations( PhysicsSolverBase const * const reservoirSolver, localIndex const hasBadPerforations = MpiWrapper::max( badPerforation.first.empty() ? 0 : 1 ); - GEOS_THROW_CTX_IF( !badPerforation.first.empty(), + GEOS_THROW_IF( !badPerforation.first.empty(), GEOS_FMT( "{}: The well {} has a connection to the region {} which is not targeted by the flow solver", wellSolver->getDataContext(), badPerforation.first, badPerforation.second ), std::runtime_error, wellSolver->getDataContext() ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp index d686a2e5843..8fc7bb29b3b 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp @@ -86,7 +86,7 @@ class CoupledSolver : public PhysicsSolverBase auto const & solverName = m_names[idx()]; auto const & solverType = LvArray::system::demangleType< SolverType >(); solver = this->getParent().template getGroupPointer< SolverType >( solverName ); - GEOS_THROW_CTX_IF( solver == nullptr, + GEOS_THROW_IF( solver == nullptr, GEOS_FMT( "{}: Could not find solver '{}' of type {}", getDataContext(), solverName, solverType ), @@ -673,7 +673,7 @@ class CoupledSolver : public PhysicsSolverBase bool const isSequential = getNonlinearSolverParameters().couplingType() == NonlinearSolverParameters::CouplingType::Sequential; bool const usesLineSearch = getNonlinearSolverParameters().m_lineSearchAction != NonlinearSolverParameters::LineSearchAction::None; - GEOS_THROW_CTX_IF( isSequential && usesLineSearch, + GEOS_THROW_IF( isSequential && usesLineSearch, GEOS_FMT( "{}: line search is not supported by the coupled solver when {} is set to `{}`. Please set {} to `{}` to remove this error", getNonlinearSolverParameters().getWrapperDataContext( NonlinearSolverParameters::viewKeysStruct::couplingTypeString() ), NonlinearSolverParameters::viewKeysStruct::couplingTypeString(), diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index 2167ee6605e..6bde5704239 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -268,14 +268,14 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::initializePostIni this->flowSolver()->template getReference< string_array >( PhysicsSolverBase::viewKeyStruct::targetRegionsString() ); for( size_t i = 0; i < poromechanicsTargetRegionNames.size(); ++i ) { - GEOS_THROW_CTX_IF( std::find( solidMechanicsTargetRegionNames.begin(), solidMechanicsTargetRegionNames.end(), + GEOS_THROW_IF( std::find( solidMechanicsTargetRegionNames.begin(), solidMechanicsTargetRegionNames.end(), poromechanicsTargetRegionNames[i] ) == solidMechanicsTargetRegionNames.end(), GEOS_FMT( "{} {}: region {} must be a target region of {}", getCatalogName(), this->getDataContext(), poromechanicsTargetRegionNames[i], this->solidMechanicsSolver()->getDataContext() ), InputError, this->getDataContext(), this->solidMechanicsSolver()->getDataContext() ); - GEOS_THROW_CTX_IF( std::find( flowTargetRegionNames.begin(), flowTargetRegionNames.end(), poromechanicsTargetRegionNames[i] ) + GEOS_THROW_IF( std::find( flowTargetRegionNames.begin(), flowTargetRegionNames.end(), poromechanicsTargetRegionNames[i] ) == flowTargetRegionNames.end(), GEOS_FMT( "{} {}: region `{}` must be a target region of `{}`", getCatalogName(), this->getDataContext(), poromechanicsTargetRegionNames[i], this->flowSolver()->getDataContext() ), diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp index a8c54e149cc..601f37f7af2 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp @@ -71,7 +71,7 @@ postInputInitialization() Group & problemManager = this->getGroupByPath( "/Problem" ); Group & physicsSolverManager = problemManager.getGroup( "Solvers" ); - GEOS_THROW_CTX_IF( !physicsSolverManager.hasGroup( m_poromechanicsSolverName ), + GEOS_THROW_IF( !physicsSolverManager.hasGroup( m_poromechanicsSolverName ), GEOS_FMT( "{}: {} solver named {} not found", getWrapperDataContext( viewKeyStruct::poromechanicsSolverNameString() ), POROMECHANICS_SOLVER::catalogName(), @@ -84,7 +84,7 @@ postInputInitialization() { TasksManager & tasksManager = problemManager.getGroup< TasksManager >( "Tasks" ); - GEOS_THROW_CTX_IF( !tasksManager.hasGroup( m_solidMechanicsStatisticsName ), + GEOS_THROW_IF( !tasksManager.hasGroup( m_solidMechanicsStatisticsName ), GEOS_FMT( "{}: {} task named {} not found", getWrapperDataContext( viewKeyStruct::solidMechanicsStatisticsNameString() ), SolidMechanicsStatistics::catalogName(), diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index 5563e32eda9..cb024a60957 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -145,7 +145,7 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER { Base::initializePreSubGroups(); - GEOS_THROW_CTX_IF( m_stabilizationType == stabilization::StabilizationType::Local, + GEOS_THROW_IF( m_stabilizationType == stabilization::StabilizationType::Local, this->getWrapperDataContext( viewKeyStruct::stabilizationTypeString() ) << ": Local stabilization has been temporarily disabled", InputError, this->getWrapperDataContext( viewKeyStruct::stabilizationTypeString() ) ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index 82f924d663f..558380226f2 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -114,7 +114,7 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::initializePostIn this->flowSolver()->template getReference< string_array >( PhysicsSolverBase::viewKeyStruct::targetRegionsString() ); for( size_t i = 0; i < poromechanicsTargetRegionNames.size(); ++i ) { - GEOS_THROW_CTX_IF( std::find( flowTargetRegionNames.begin(), flowTargetRegionNames.end(), poromechanicsTargetRegionNames[i] ) + GEOS_THROW_IF( std::find( flowTargetRegionNames.begin(), flowTargetRegionNames.end(), poromechanicsTargetRegionNames[i] ) == flowTargetRegionNames.end(), GEOS_FMT( "{} {}: region `{}` must be a target region of `{}`", getCatalogName(), this->getDataContext(), poromechanicsTargetRegionNames[i], this->flowSolver()->getDataContext() ), diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index be71206d23f..5561040a804 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -708,13 +708,13 @@ void SolidMechanicsLagrangianFEM::applyDisplacementBCImplicit( real64 const time "\nWarning!" "\n{} {}: There is no displacement boundary condition applied to this problem in the {} direction. \n" "The problem may be ill-posed.\n"; - GEOS_WARNING_CTX_IF( isDisplacementBCAppliedGlobal[0] == 0, // target set is empty + GEOS_WARNING_IF( isDisplacementBCAppliedGlobal[0] == 0, // target set is empty GEOS_FMT( bcLogMessage, getCatalogName(), getDataContext(), 'x' ), getDataContext() ); - GEOS_WARNING_CTX_IF( isDisplacementBCAppliedGlobal[1] == 0, // target set is empty + GEOS_WARNING_IF( isDisplacementBCAppliedGlobal[1] == 0, // target set is empty GEOS_FMT( bcLogMessage, getCatalogName(), getDataContext(), 'y' ), getDataContext() ); - GEOS_WARNING_CTX_IF( isDisplacementBCAppliedGlobal[2] == 0, // target set is empty + GEOS_WARNING_IF( isDisplacementBCAppliedGlobal[2] == 0, // target set is empty GEOS_FMT( bcLogMessage, getCatalogName(), getDataContext(), 'z' ), getDataContext() ); } diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp index 15a5e2acfa0..aa9be5a9130 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp @@ -64,7 +64,7 @@ void SolidMechanicsStateReset::postInputInitialization() Group & problemManager = this->getGroupByPath( "/Problem" ); Group & physicsSolverManager = problemManager.getGroup( "Solvers" ); - GEOS_THROW_CTX_IF( !physicsSolverManager.hasGroup( m_solidSolverName ), + GEOS_THROW_IF( !physicsSolverManager.hasGroup( m_solidSolverName ), GEOS_FMT( "Task {}: physics solver named {} not found", getDataContext(), m_solidSolverName ), InputError, getDataContext() ); diff --git a/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp index f85c398f6d1..f72b70f59b7 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp @@ -1811,7 +1811,7 @@ void SolidMechanicsLagrangeContact::assembleStabilization( MeshLevel const & mes realNodes++; } } - GEOS_ERROR_CTX_IF( realNodes != 2, + GEOS_ERROR_IF( realNodes != 2, getDataContext() << ": An edge shared by two fracture elements must have 2 nodes.", getDataContext() ); edge.resize( realNodes ); diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp index a5b53c0c741..9861aed8a19 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp @@ -191,17 +191,17 @@ void SurfaceGenerator::postInputInitialization() { static const std::set< integer > binaryOptions = { 0, 1 }; - GEOS_ERROR_CTX_IF( binaryOptions.count( m_isPoroelastic ) == 0, + GEOS_ERROR_IF( binaryOptions.count( m_isPoroelastic ) == 0, getWrapperDataContext( viewKeyStruct::isPoroelasticString() ) << ": option can be either 0 (false) or 1 (true)", getWrapperDataContext( viewKeyStruct::isPoroelasticString() ) ); - GEOS_ERROR_CTX_IF( binaryOptions.count( m_nodeBasedSIF ) == 0, + GEOS_ERROR_IF( binaryOptions.count( m_nodeBasedSIF ) == 0, getWrapperDataContext( viewKeyStruct::nodeBasedSIFString() ) << ": option can be either 0 (false) or 1 (true)", getWrapperDataContext( viewKeyStruct::nodeBasedSIFString() ) ); - GEOS_ERROR_CTX_IF( binaryOptions.count( m_mpiCommOrder ) == 0, + GEOS_ERROR_IF( binaryOptions.count( m_mpiCommOrder ) == 0, getWrapperDataContext( viewKeyStruct::mpiCommOrderString() ) << ": option can be either 0 (false) or 1 (true)", getWrapperDataContext( viewKeyStruct::mpiCommOrderString() ) ); @@ -774,7 +774,7 @@ void SurfaceGenerator::synchronizeTipSets ( FaceManager & faceManager, { localIndex const parentNodeIndex = parentNodeIndices[nodeIndex]; - GEOS_ERROR_CTX_IF( parentNodeIndex == -1, + GEOS_ERROR_IF( parentNodeIndex == -1, getDataContext() << ": parentNodeIndex should not be -1", getDataContext() ); @@ -801,7 +801,7 @@ void SurfaceGenerator::synchronizeTipSets ( FaceManager & faceManager, { localIndex const parentEdgeIndex = parentEdgeIndices[edgeIndex]; - GEOS_ERROR_CTX_IF( parentEdgeIndex == -1, + GEOS_ERROR_IF( parentEdgeIndex == -1, getDataContext() << ": parentEdgeIndex should not be -1", getDataContext() ); @@ -836,7 +836,7 @@ void SurfaceGenerator::synchronizeTipSets ( FaceManager & faceManager, for( localIndex const faceIndex : receivedObjects.newFaces ) { localIndex const parentFaceIndex = parentFaceIndices[faceIndex]; - GEOS_ERROR_CTX_IF( parentFaceIndex == -1, + GEOS_ERROR_IF( parentFaceIndex == -1, getDataContext() << ": parentFaceIndex should not be -1", getDataContext() ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp index 96aa133b4ce..b3ceed0b431 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp @@ -211,7 +211,7 @@ void AcousticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLev ElementRegionBase &, CellElementSubRegion & elementSubRegion ) { - GEOS_THROW_CTX_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, + GEOS_THROW_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, getDataContext() << ": Invalid type of element, the acoustic solver is designed for hexahedral meshes only (C3D8) ", InputError, getDataContext() ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index c426de3650d..4f86e318846 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -220,7 +220,7 @@ void AcousticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseM ElementRegionBase &, CellElementSubRegion & elementSubRegion ) { - GEOS_THROW_CTX_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, + GEOS_THROW_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, getDataContext() << ": Invalid type of element, the acoustic solver is designed for hexahedral meshes only (C3D8), using the SEM formulation", InputError, getDataContext() ); @@ -291,7 +291,7 @@ void AcousticWaveEquationSEM::addSourceToRightHandSide( integer const & cycleNum arrayView1d< localIndex const > const sourceIsAccessible = m_sourceIsAccessible.toViewConst(); arrayView2d< real32 const > const sourceValue = m_sourceValue.toViewConst(); - GEOS_THROW_CTX_IF( cycleNumber > sourceValue.size( 0 ), + GEOS_THROW_IF( cycleNumber > sourceValue.size( 0 ), getDataContext() << ": Too many steps compared to array size", std::runtime_error, getDataContext() ); forAll< EXEC_POLICY >( sourceConstants.size( 0 ), [=] GEOS_HOST_DEVICE ( localIndex const isrc ) @@ -1038,12 +1038,12 @@ real64 AcousticWaveEquationSEM::explicitStepForward( real64 const & time_n, } std::ofstream wf( fileName, std::ios::out | std::ios::binary ); - GEOS_THROW_CTX_IF( !wf, + GEOS_THROW_IF( !wf, getDataContext() << ": Could not open file "<< fileName << " for writing", InputError, getDataContext() ); wf.write( (char *)&p_n[0], p_n.size()*sizeof( real32 ) ); wf.close( ); - GEOS_THROW_CTX_IF( !wf.good(), + GEOS_THROW_IF( !wf.good(), getDataContext() << ": An error occured while writing "<< fileName, InputError, getDataContext() ); } @@ -1106,7 +1106,7 @@ real64 AcousticWaveEquationSEM::explicitStepBackward( real64 const & time_n, int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); std::string fileName = GEOS_FMT( "lifo/rank_{:05}/pressure_forward_{:06}_{:08}.dat", rank, m_shotIndex, cycleNumber ); std::ifstream wf( fileName, std::ios::in | std::ios::binary ); - GEOS_THROW_CTX_IF( !wf, + GEOS_THROW_IF( !wf, getDataContext() << ": Could not open file "<< fileName << " for reading", InputError, getDataContext() ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp index 86fa7bad4a6..1b5a873c5f2 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp @@ -261,7 +261,7 @@ void ElasticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLeve CellElementSubRegion & elementSubRegion ) { - GEOS_THROW_CTX_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, + GEOS_THROW_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, getDataContext() << ": Invalid type of element, the elastic solver is designed for hexahedral meshes only (C3D8) ", InputError, getDataContext(), elementSubRegion.getDataContext().getContextInfo().setPriority( -1 ) ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index 49032c44ddd..516283c1413 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -296,7 +296,7 @@ void ElasticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseMe CellElementSubRegion & elementSubRegion ) { - GEOS_THROW_CTX_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, + GEOS_THROW_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, getDataContext() << ": Invalid type of element, the elastic solver is designed for hexahedral meshes only (C3D8) ", InputError, getDataContext(), elementSubRegion.getDataContext().getContextInfo().setPriority( -1 ) ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp index 07840fc3de5..3f0cb0b2a28 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp @@ -336,7 +336,7 @@ void WaveSolverBase::postInputInitialization() { counter++; } ); - GEOS_THROW_CTX_IF( counter > 1, + GEOS_THROW_IF( counter > 1, getDataContext() << ": One single PML field specification is allowed", InputError, getDataContext() ); @@ -460,7 +460,7 @@ localIndex WaveSolverBase::getNumNodesPerElem() FiniteElementDiscretization const * const feDiscretization = feDiscretizationManager.getGroupPointer< FiniteElementDiscretization >( m_discretizationName ); - GEOS_THROW_CTX_IF( feDiscretization == nullptr, + GEOS_THROW_IF( feDiscretization == nullptr, getDataContext() << ": FE discretization not found: " << m_discretizationName, InputError, getDataContext() ); diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index b3eca882c18..d8bd7905e64 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -779,6 +779,10 @@ + + + + @@ -1033,7 +1037,7 @@ + - Informations on events and subevents execution--> @@ -1061,7 +1065,7 @@ Information output from lower logLevels is added with the desired log level + - Informations on events and subevents execution--> @@ -1095,7 +1099,7 @@ Information output from lower logLevels is added with the desired log level + - Informations on events and subevents execution--> @@ -1135,7 +1139,7 @@ Information output from lower logLevels is added with the desired log level + - Informations on events and subevents execution--> @@ -1188,11 +1192,11 @@ Information output from lower logLevels is added with the desired log level - @@ -1231,13 +1235,6 @@ This keyword is ignored for single-phase flow simulations--> - - @@ -1265,13 +1262,6 @@ Information output from lower logLevels is added with the desired log level - - @@ -1298,13 +1288,6 @@ Information output from lower logLevels is added with the desired log level - - @@ -1339,13 +1322,6 @@ Information output from lower logLevels is added with the desired log level - - @@ -1370,13 +1346,6 @@ Information output from lower logLevels is added with the desired log level - - @@ -1415,13 +1384,6 @@ Information output from lower logLevels is added with the desired log level - - @@ -1446,13 +1408,6 @@ Information output from lower logLevels is added with the desired log level - - @@ -1528,7 +1483,7 @@ stress - traction is applied to the faces as specified by the inner product of i + - Output PVT table to log--> @@ -1680,6 +1635,11 @@ Information output from lower logLevels is added with the desired log level + + @@ -1733,8 +1693,7 @@ Information output from lower logLevels is added with the desired log level + - Well generation information: internal well table, perforation table--> @@ -1784,10 +1743,9 @@ Information output from lower logLevels is added with the desired log level + - VTK mesh generator steps--> @@ -1902,7 +1860,7 @@ Information output from lower logLevels is added with the desired log level + - VTK mesh generator steps--> @@ -2056,8 +2014,7 @@ the relative residual norm satisfies: + - Linear solver information--> @@ -2150,14 +2107,14 @@ Information output from lower logLevels is added with the desired log level * FullyImplicit * Sequential--> - - @@ -2400,8 +2357,6 @@ Information output from lower logLevels is added with the desired log level Information output from lower logLevels is added with the desired log level 1 - Output timing information -2 - - Information on output events (VTK/ChomboIO/HDF5) 3 - Information on Time history Initialization - Information on buffered data in an HDF5 file --> @@ -2556,9 +2511,10 @@ Information output from lower logLevels is added with the desired log level + + @@ -2585,16 +2543,20 @@ Information output from lower logLevels is added with the desired log level + + - + + + @@ -2630,9 +2592,10 @@ Information output from lower logLevels is added with the desired log level - - - - - - - - - - @@ -2775,9 +2729,10 @@ Information output from lower logLevels is added with the desired log level @@ -3058,13 +3015,13 @@ Information output from lower logLevels is added with the desired log level @@ -3135,14 +3092,14 @@ Information output from lower logLevels is added with the desired log level @@ -3173,13 +3130,13 @@ Information output from lower logLevels is added with the desired log level @@ -3192,8 +3149,8 @@ Information output from lower logLevels is added with the desired log level @@ -3229,18 +3186,15 @@ Local- Add jump stabilization on interior of macro elements--> + - The summary of declared fields and coupling--> @@ -3277,12 +3231,12 @@ Information output from lower logLevels is added with the desired log level * massRate * uninitialized--> - - @@ -3296,7 +3250,7 @@ Information output from lower logLevels is added with the desired log level - @@ -3375,9 +3329,10 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> @@ -3714,8 +3674,8 @@ Information output from lower logLevels is added with the desired log level @@ -3758,9 +3718,10 @@ Local- Add jump stabilization on interior of macro elements--> @@ -3948,8 +3912,8 @@ Information output from lower logLevels is added with the desired log level @@ -3979,13 +3943,13 @@ Local- Add jump stabilization on interior of macro elements--> @@ -3996,8 +3960,8 @@ Information output from lower logLevels is added with the desired log level @@ -4023,14 +3987,14 @@ Local- Add jump stabilization on interior of macro elements--> @@ -4063,9 +4027,10 @@ Information output from lower logLevels is added with the desired log level @@ -4296,9 +4264,10 @@ Information output from lower logLevels is added with the desired log level @@ -4446,13 +4417,13 @@ For the energy balance equation, the mass flux is multiplied by the enthalpy in @@ -4493,13 +4464,13 @@ Information output from lower logLevels is added with the desired log level @@ -4510,8 +4481,8 @@ Information output from lower logLevels is added with the desired log level @@ -4543,13 +4514,13 @@ Local- Add jump stabilization on interior of macro elements--> @@ -4560,8 +4531,8 @@ Information output from lower logLevels is added with the desired log level @@ -4587,13 +4558,13 @@ Local- Add jump stabilization on interior of macro elements--> @@ -4630,13 +4601,13 @@ Information output from lower logLevels is added with the desired log level @@ -4647,8 +4618,8 @@ Information output from lower logLevels is added with the desired log level @@ -4674,13 +4645,13 @@ Local- Add jump stabilization on interior of macro elements--> @@ -4721,12 +4692,13 @@ For the energy balance equation, the mass flux is multiplied by the enthalpy in @@ -4763,13 +4735,13 @@ Information output from lower logLevels is added with the desired log level @@ -4802,13 +4774,13 @@ Information output from lower logLevels is added with the desired log level @@ -4821,8 +4793,8 @@ Information output from lower logLevels is added with the desired log level @@ -4852,13 +4824,13 @@ Local- Add jump stabilization on interior of macro elements--> @@ -4871,8 +4843,8 @@ Information output from lower logLevels is added with the desired log level @@ -4903,17 +4875,15 @@ Local- Add jump stabilization on interior of macro elements--> + - The summary of declared fields and coupling--> @@ -4950,15 +4920,16 @@ Information output from lower logLevels is added with the desired log level + - Output tolerance computed the given fracture element--> @@ -4973,7 +4944,7 @@ Information output from lower logLevels is added with the desired log level @@ -5023,14 +4994,16 @@ Information output from lower logLevels is added with the desired log level + - The summary of declared fields and coupling + - Output tolerance computed the given fracture element--> @@ -5043,7 +5016,7 @@ Information output from lower logLevels is added with the desired log level @@ -5080,15 +5053,16 @@ Information output from lower logLevels is added with the desired log level + - Output tolerance computed the given fracture element--> @@ -5105,7 +5079,7 @@ Information output from lower logLevels is added with the desired log level @@ -5140,13 +5114,16 @@ Information output from lower logLevels is added with the desired log level + - The summary of declared fields and coupling + - Output tolerance computed the given fracture element--> @@ -5159,7 +5136,7 @@ Information output from lower logLevels is added with the desired log level @@ -5196,9 +5173,10 @@ Information output from lower logLevels is added with the desired log level @@ -5268,9 +5246,10 @@ Information output from lower logLevels is added with the desired log level + - Information on stencil initialization--> @@ -5408,7 +5388,7 @@ Information output from lower logLevels is added with the desired log level + - Information on solver initialization--> @@ -5441,7 +5421,7 @@ Information output from lower logLevels is added with the desired log level + - Information on solver initialization--> @@ -5454,7 +5434,7 @@ Information output from lower logLevels is added with the desired log level + - Information on solver initialization--> @@ -5467,7 +5447,7 @@ Information output from lower logLevels is added with the desired log level + - Information on solver initialization--> @@ -5486,8 +5466,7 @@ Information output from lower logLevels is added with the desired log level + - Enable log output--> @@ -5532,8 +5511,7 @@ Information output from lower logLevels is added with the desired log level + - Enable log output--> @@ -5552,8 +5530,7 @@ Information output from lower logLevels is added with the desired log level + - Enable log output--> @@ -5568,7 +5545,7 @@ Information output from lower logLevels is added with the desired log level + - Information on solver initialization--> @@ -5581,7 +5558,7 @@ Information output from lower logLevels is added with the desired log level + - Information on solver initialization--> @@ -5594,7 +5571,7 @@ Information output from lower logLevels is added with the desired log level + - Information on solver initialization--> @@ -5607,7 +5584,7 @@ Information output from lower logLevels is added with the desired log level + - Information on solver initialization--> @@ -5620,7 +5597,7 @@ Information output from lower logLevels is added with the desired log level + - Information on solver initialization--> @@ -5701,8 +5678,7 @@ Information output from lower logLevels is added with the desired log level + - Enable log output--> @@ -5768,6 +5744,7 @@ Information output from lower logLevels is added with the desired log level + @@ -5844,12 +5821,12 @@ Information output from lower logLevels is added with the desired log level - - @@ -5949,7 +5926,7 @@ The expected format is "{ waterMax, oilMax }", in that order--> + - Output PVT table to log--> @@ -5976,7 +5953,7 @@ Information output from lower logLevels is added with the desired log level + - Output PVT table to log--> @@ -6003,7 +5980,7 @@ Information output from lower logLevels is added with the desired log level + - Output PVT table to log--> @@ -6030,7 +6007,7 @@ Information output from lower logLevels is added with the desired log level + - Output PVT table to log--> @@ -6564,12 +6541,12 @@ Information output from lower logLevels is added with the desired log level - - @@ -6793,6 +6770,22 @@ For instance, if "oil" is before "gas" in "phaseNames", the table order should b + + + + + + + + + + + + + + + + + - Output PVT table to log--> @@ -7253,7 +7246,7 @@ Information output from lower logLevels is added with the desired log level + - Output PVT table to log--> @@ -7322,7 +7315,7 @@ If you want to do a two-phase simulation, please use instead wettingNonWettingRe - @@ -7374,7 +7367,7 @@ To neglect hysteresis on this phase, just use the same table name for the draina - @@ -7423,14 +7416,14 @@ To neglect hysteresis on this phase, just use the same table name for the draina - - @@ -7590,8 +7583,6 @@ The expected format is "{ waterMax, oilMax }", in that order--> - - diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 3a3351e4fa0..b8590be4d19 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -1544,6 +1544,7 @@ + @@ -2579,6 +2580,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2981,24 +3028,14 @@ - - - - - - - - - - - - + + @@ -3017,6 +3054,8 @@ + + From 2c5c5f552f9d34666d5a462d6ed3c0673b45c817 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Tue, 23 Sep 2025 09:11:28 +0200 Subject: [PATCH 104/173] =?UTF-8?q?=F0=9F=8E=A8=20UNCRUSTIFY?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/logger/ErrorHandling.cpp | 4 +- src/coreComponents/common/logger/Logger.hpp | 2 +- .../common/unitTests/testMacros.cpp | 6 +- .../constitutive/ConstitutiveManager.cpp | 10 +- .../JFunctionCapillaryPressure.cpp | 74 ++++---- .../TableCapillaryPressure.cpp | 44 ++--- .../constitutive/contact/CoulombFriction.cpp | 4 +- .../contact/HydraulicApertureTable.cpp | 24 +-- .../diffusion/ConstantDiffusion.cpp | 16 +- .../constitutive/diffusion/DiffusionBase.cpp | 6 +- .../dispersion/LinearIsotropicDispersion.cpp | 6 +- .../multifluid/CO2Brine/CO2BrineFluid.cpp | 52 +++--- .../multifluid/blackOil/BlackOilFluid.cpp | 32 ++-- .../multifluid/blackOil/BlackOilFluidBase.cpp | 14 +- .../multifluid/blackOil/DeadOilFluid.cpp | 20 +-- .../PressureTemperatureCoordinates.cpp | 12 +- .../reactive/ReactiveBrineFluid.cpp | 18 +- .../fluid/singlefluid/ParticleFluid.cpp | 36 ++-- .../ThermalCompressibleSinglePhaseFluid.cpp | 4 +- .../permeability/PressurePermeability.cpp | 4 +- .../BrooksCoreyBakerRelativePermeability.cpp | 4 +- .../BrooksCoreyStone2RelativePermeability.cpp | 4 +- .../TableRelativePermeability.cpp | 80 ++++----- .../TableRelativePermeabilityHelpers.cpp | 18 +- .../TableRelativePermeabilityHysteresis.cpp | 150 ++++++++-------- .../VanGenuchtenBakerRelativePermeability.cpp | 4 +- ...VanGenuchtenStone2RelativePermeability.cpp | 4 +- .../constitutive/solid/Damage.cpp | 24 +-- .../constitutive/solid/DelftEgg.cpp | 16 +- .../constitutive/solid/DruckerPrager.cpp | 16 +- .../solid/DruckerPragerExtended.cpp | 24 +-- .../ElasticIsotropicPressureDependent.cpp | 8 +- .../constitutive/solid/ModifiedCamClay.cpp | 12 +- .../MultiPhaseConstantThermalConductivity.cpp | 10 +- ...PhaseVolumeWeightedThermalConductivity.cpp | 16 +- .../SinglePhaseThermalConductivity.cpp | 10 +- .../fluid/multiFluid/PVTDriver.cpp | 34 ++-- .../solid/TriaxialDriver.cpp | 8 +- src/coreComponents/dataRepository/Group.cpp | 16 +- src/coreComponents/dataRepository/Group.hpp | 44 ++--- src/coreComponents/events/PeriodicEvent.cpp | 24 +-- .../AquiferBoundaryCondition.cpp | 16 +- .../EquilibriumInitialCondition.cpp | 90 +++++----- .../FieldSpecificationBase.hpp | 2 +- .../PerfectlyMatchedLayer.cpp | 18 +- .../TractionBoundaryCondition.cpp | 14 +- .../fileIO/Outputs/SiloOutput.cpp | 8 +- .../fileIO/Outputs/VTKOutput.cpp | 14 +- .../FiniteElementDiscretization.cpp | 28 +-- .../functions/MultivariableTableFunction.cpp | 12 +- .../functions/TableFunction.cpp | 30 ++-- src/coreComponents/mesh/CellElementRegion.cpp | 12 +- .../mesh/CellElementRegionSelector.cpp | 30 ++-- .../mesh/ElementRegionManager.cpp | 22 +-- .../mesh/ElementRegionManager.hpp | 12 +- src/coreComponents/mesh/MeshObjectPath.cpp | 16 +- src/coreComponents/mesh/Perforation.cpp | 6 +- .../mesh/SurfaceElementRegion.hpp | 6 +- .../mesh/WellElementSubRegion.cpp | 14 +- .../mesh/generators/InternalMeshGenerator.hpp | 6 +- .../mesh/generators/InternalWellGenerator.cpp | 18 +- .../generators/InternalWellboreGenerator.cpp | 20 +-- .../mesh/generators/VTKMeshGenerator.cpp | 12 +- .../mesh/generators/WellGeneratorBase.cpp | 4 +- .../mesh/simpleGeometricObjects/Box.cpp | 6 +- .../simpleGeometricObjects/ThickPlane.cpp | 8 +- .../physicsSolvers/FieldStatisticsBase.hpp | 8 +- .../physicsSolvers/LinearSolverParameters.cpp | 36 ++-- .../physicsSolvers/PhysicsSolverBase.cpp | 30 ++-- .../fluidFlow/CompositionalMultiphaseBase.cpp | 66 ++++---- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 12 +- .../CompositionalMultiphaseHybridFVM.cpp | 18 +- .../ReactiveCompositionalMultiphaseOBL.cpp | 4 +- .../fluidFlow/SinglePhaseBase.cpp | 34 ++-- .../fluidFlow/SinglePhaseHybridFVM.cpp | 12 +- .../fluidFlow/SourceFluxStatistics.cpp | 14 +- .../fluidFlow/StencilDataCollection.cpp | 16 +- .../proppantTransport/ProppantTransport.cpp | 18 +- .../wells/CompositionalMultiphaseWell.cpp | 74 ++++---- .../fluidFlow/wells/SinglePhaseWell.cpp | 20 +-- .../fluidFlow/wells/WellControls.cpp | 160 +++++++++--------- .../fluidFlow/wells/WellSolverBase.cpp | 4 +- .../CompositionalMultiphaseWellKernels.cpp | 12 +- .../wells/kernels/SinglePhaseWellKernels.cpp | 8 +- .../inducedSeismicity/SpringSlider.cpp | 6 +- ...mpositionalMultiphaseReservoirAndWells.cpp | 16 +- .../CoupledReservoirAndWellsBase.cpp | 6 +- .../multiphysics/CoupledSolver.hpp | 22 +-- .../multiphysics/MultiphasePoromechanics.cpp | 20 +-- .../PoromechanicsInitialization.cpp | 20 +-- .../multiphysics/PoromechanicsSolver.hpp | 6 +- .../multiphysics/SinglePhasePoromechanics.cpp | 8 +- .../SolidMechanicsLagrangianFEM.cpp | 12 +- .../SolidMechanicsStateReset.cpp | 6 +- .../contact/SolidMechanicsLagrangeContact.cpp | 4 +- .../surfaceGeneration/SurfaceGenerator.cpp | 30 ++-- .../AcousticFirstOrderWaveEquationSEM.cpp | 4 +- .../isotropic/AcousticWaveEquationSEM.cpp | 20 +-- .../ElasticFirstOrderWaveEquationSEM.cpp | 6 +- .../isotropic/ElasticWaveEquationSEM.cpp | 6 +- .../wavePropagation/shared/WaveSolverBase.cpp | 8 +- 101 files changed, 1042 insertions(+), 1042 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 25c68426ee5..9fbed7081fc 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -241,8 +241,8 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) for( size_t i = 0; i < errorMsg.m_sourceCallStack.size(); i++ ) { yamlFile << ( errorMsg.isValidStackTrace() ? - GEOS_FMT( "{}frame{}: {}\n", g_level3Start, i, errorMsg.m_sourceCallStack[i] ) : - GEOS_FMT( "{}{}\n", g_level3Start, errorMsg.m_sourceCallStack[i] ) ); + GEOS_FMT( "{}frame{}: {}\n", g_level3Start, i, errorMsg.m_sourceCallStack[i] ) : + GEOS_FMT( "{}{}\n", g_level3Start, errorMsg.m_sourceCallStack[i] ) ); } } diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 8dcb8fa90a1..77e482d170e 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -454,7 +454,7 @@ */ #define GEOS_WARNING_IF_OP_MSG( lhs, OP, NOP, rhs, ... ) \ GEOS_WARNING_IF_CAUSE( lhs OP rhs, \ - "Expected: " #lhs " " #NOP " " #rhs "\n* " #lhs " = " << lhs << "\n* " #rhs " = " << rhs << "\n", \ + "Expected: " #lhs " " #NOP " " #rhs "\n* " #lhs " = " << lhs << "\n* " #rhs " = " << rhs << "\n", \ __VA_ARGS__ ) /** diff --git a/src/coreComponents/common/unitTests/testMacros.cpp b/src/coreComponents/common/unitTests/testMacros.cpp index 961f5cead15..1059c7d5877 100644 --- a/src/coreComponents/common/unitTests/testMacros.cpp +++ b/src/coreComponents/common/unitTests/testMacros.cpp @@ -34,9 +34,9 @@ TEST( testMacros, testArgumentCount ) // Expected out of bound (>16 params): wrongly cast the last '!' to integer type EXPECT_EQ( 33, int( GEOS_DETAIL_MORE_THAN_ONE_ARG( 'a', 'b', 'c', 'd', - 'e', 'f', 'g', 'h', - 'i', 'j', 'k', 'l', - 'w', 'x', 'y', 'z', '!' ) ) ); + 'e', 'f', 'g', 'h', + 'i', 'j', 'k', 'l', + 'w', 'x', 'y', 'z', '!' ) ) ); } diff --git a/src/coreComponents/constitutive/ConstitutiveManager.cpp b/src/coreComponents/constitutive/ConstitutiveManager.cpp index 97199f10000..b1f22721eb7 100644 --- a/src/coreComponents/constitutive/ConstitutiveManager.cpp +++ b/src/coreComponents/constitutive/ConstitutiveManager.cpp @@ -75,11 +75,11 @@ ConstitutiveManager::hangConstitutiveRelation( string const & constitutiveRelati // 1. Allocate constitutive relation // we only register the constitutive relation if it has not been registered yet. GEOS_ERROR_IF( constitutiveGroup->hasGroup( constitutiveRelationInstanceName ), - GEOS_FMT( "Error! The constitutive relation {} has already been registered on the subRegion {}. " - "Make sure that the same constitutive model is not listed as a material on a" - " region both as a stand-alone one and as part of a compound constitutive model.", - constitutiveRelationInstanceName, parent->getDataContext().toString() ), - parent->getDataContext() ); + GEOS_FMT( "Error! The constitutive relation {} has already been registered on the subRegion {}. " + "Make sure that the same constitutive model is not listed as a material on a" + " region both as a stand-alone one and as part of a compound constitutive model.", + constitutiveRelationInstanceName, parent->getDataContext().toString() ), + parent->getDataContext() ); ConstitutiveBase const & constitutiveRelation = getConstitutiveRelation( constitutiveRelationInstanceName ); diff --git a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp index 077e46c88bc..bc9297d6ce8 100644 --- a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp @@ -128,41 +128,41 @@ void JFunctionCapillaryPressure::postInputInitialization() integer const numPhases = m_phaseNames.size(); GEOS_THROW_IF( numPhases != 2 && numPhases != 3, - GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", - getFullName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", + getFullName() ), + InputError, getDataContext() ); if( numPhases == 2 ) { GEOS_THROW_IF( m_wettingNonWettingJFuncTableName.empty(), - GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the J-function table for the pair (wetting phase, non-wetting phase)", - getFullName(), - viewKeyStruct::wettingNonWettingJFuncTableNameString() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the J-function table for the pair (wetting phase, non-wetting phase)", + getFullName(), + viewKeyStruct::wettingNonWettingJFuncTableNameString() ), + InputError, getDataContext() ); GEOS_THROW_IF( m_wettingNonWettingSurfaceTension <= 0, - GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the surface tension for the pair (wetting phase, non-wetting phase)", - getFullName(), - viewKeyStruct::wettingNonWettingSurfaceTensionString() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the surface tension for the pair (wetting phase, non-wetting phase)", + getFullName(), + viewKeyStruct::wettingNonWettingSurfaceTensionString() ), + InputError, getDataContext() ); } else if( numPhases == 3 ) { GEOS_THROW_IF( m_wettingIntermediateJFuncTableName.empty() || m_nonWettingIntermediateJFuncTableName.empty(), - GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify the J-function table" - "for the pair (wetting phase, intermediate phase), " - "and {} to specify the J-function table for the pair (non-wetting phase, intermediate phase)", - getFullName(), - viewKeyStruct::wettingIntermediateJFuncTableNameString(), - viewKeyStruct::nonWettingIntermediateJFuncTableNameString() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify the J-function table" + "for the pair (wetting phase, intermediate phase), " + "and {} to specify the J-function table for the pair (non-wetting phase, intermediate phase)", + getFullName(), + viewKeyStruct::wettingIntermediateJFuncTableNameString(), + viewKeyStruct::nonWettingIntermediateJFuncTableNameString() ), + InputError, getDataContext() ); GEOS_THROW_IF( m_wettingIntermediateSurfaceTension <= 0 || m_nonWettingIntermediateSurfaceTension <= 0, - GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify the surface tension" - "for the pair (wetting phase, intermediate phase), " - "and {} to specify the J-function table for the pair (non-wetting phase, intermediate phase)", - getFullName(), - viewKeyStruct::wettingIntermediateSurfaceTensionString(), - viewKeyStruct::nonWettingIntermediateSurfaceTensionString() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify the surface tension" + "for the pair (wetting phase, intermediate phase), " + "and {} to specify the J-function table for the pair (non-wetting phase, intermediate phase)", + getFullName(), + viewKeyStruct::wettingIntermediateSurfaceTensionString(), + viewKeyStruct::nonWettingIntermediateSurfaceTensionString() ), + InputError, getDataContext() ); } } @@ -176,10 +176,10 @@ void JFunctionCapillaryPressure::initializePreSubGroups() if( numPhases == 2 ) { GEOS_THROW_IF( !functionManager.hasGroup( m_wettingNonWettingJFuncTableName ), - GEOS_FMT( "{}: the table function named {} could not be found", - getFullName(), - m_wettingNonWettingJFuncTableName ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the table function named {} could not be found", + getFullName(), + m_wettingNonWettingJFuncTableName ), + InputError, getDataContext() ); TableFunction const & jFuncTable = functionManager.getGroup< TableFunction >( m_wettingNonWettingJFuncTableName ); bool const jFuncMustBeIncreasing = ( m_phaseOrder[PhaseType::WATER] < 0 ) ? true // pc on the gas phase, function must be increasing @@ -189,18 +189,18 @@ void JFunctionCapillaryPressure::initializePreSubGroups() else if( numPhases == 3 ) { GEOS_THROW_IF( !functionManager.hasGroup( m_wettingIntermediateJFuncTableName ), - GEOS_FMT( "{}: the table function named {} could not be found", - getFullName(), - m_wettingIntermediateJFuncTableName ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the table function named {} could not be found", + getFullName(), + m_wettingIntermediateJFuncTableName ), + InputError, getDataContext() ); TableFunction const & jFuncTableWI = functionManager.getGroup< TableFunction >( m_wettingIntermediateJFuncTableName ); TableCapillaryPressureHelpers::validateCapillaryPressureTable( jFuncTableWI, getFullName(), false ); GEOS_THROW_IF( !functionManager.hasGroup( m_nonWettingIntermediateJFuncTableName ), - GEOS_FMT( "{}: the table function named {} could not be found", - getFullName(), - m_nonWettingIntermediateJFuncTableName ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the table function named {} could not be found", + getFullName(), + m_nonWettingIntermediateJFuncTableName ), + InputError, getDataContext() ); TableFunction const & jFuncTableNWI = functionManager.getGroup< TableFunction >( m_nonWettingIntermediateJFuncTableName ); TableCapillaryPressureHelpers::validateCapillaryPressureTable( jFuncTableNWI, getFullName(), true ); } diff --git a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp index 7de0e51ddb4..4f8ab264e05 100644 --- a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp @@ -74,28 +74,28 @@ void TableCapillaryPressure::postInputInitialization() integer const numPhases = m_phaseNames.size(); GEOS_THROW_IF( numPhases != 2 && numPhases != 3, - GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", - getFullName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", + getFullName() ), + InputError, getDataContext() ); if( numPhases == 2 ) { GEOS_THROW_IF( m_wettingNonWettingCapPresTableName.empty(), - GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the capillary pressure table for the pair (wetting phase, non-wetting phase)", - getFullName(), - viewKeyStruct::wettingNonWettingCapPresTableNameString() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the capillary pressure table for the pair (wetting phase, non-wetting phase)", + getFullName(), + viewKeyStruct::wettingNonWettingCapPresTableNameString() ), + InputError, getDataContext() ); } else if( numPhases == 3 ) { GEOS_THROW_IF( m_wettingIntermediateCapPresTableName.empty() || m_nonWettingIntermediateCapPresTableName.empty(), - GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify the capillary pressure table " - "for the pair (wetting phase, intermediate phase), and {} to specify the capillary pressure table " - "for the pair (non-wetting phase, intermediate phase)", - getFullName(), - viewKeyStruct::wettingIntermediateCapPresTableNameString(), - viewKeyStruct::nonWettingIntermediateCapPresTableNameString() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify the capillary pressure table " + "for the pair (wetting phase, intermediate phase), and {} to specify the capillary pressure table " + "for the pair (non-wetting phase, intermediate phase)", + getFullName(), + viewKeyStruct::wettingIntermediateCapPresTableNameString(), + viewKeyStruct::nonWettingIntermediateCapPresTableNameString() ), + InputError, getDataContext() ); } } @@ -122,18 +122,18 @@ void TableCapillaryPressure::initializePreSubGroups() else if( numPhases == 3 ) { GEOS_THROW_IF( !functionManager.hasGroup( m_wettingIntermediateCapPresTableName ), - GEOS_FMT( "{}: the table function named {} could not be found", - getFullName(), - m_wettingIntermediateCapPresTableName ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the table function named {} could not be found", + getFullName(), + m_wettingIntermediateCapPresTableName ), + InputError, getDataContext() ); TableFunction const & capPresTableWI = functionManager.getGroup< TableFunction >( m_wettingIntermediateCapPresTableName ); TableCapillaryPressureHelpers::validateCapillaryPressureTable( capPresTableWI, getFullName(), false ); GEOS_THROW_IF( !functionManager.hasGroup( m_nonWettingIntermediateCapPresTableName ), - GEOS_FMT( "{}: the table function named {} could not be found", - getFullName(), - m_nonWettingIntermediateCapPresTableName ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the table function named {} could not be found", + getFullName(), + m_nonWettingIntermediateCapPresTableName ), + InputError, getDataContext() ); TableFunction const & capPresTableNWI = functionManager.getGroup< TableFunction >( m_nonWettingIntermediateCapPresTableName ); TableCapillaryPressureHelpers::validateCapillaryPressureTable( capPresTableNWI, getFullName(), true ); } diff --git a/src/coreComponents/constitutive/contact/CoulombFriction.cpp b/src/coreComponents/constitutive/contact/CoulombFriction.cpp index 24d1be395ff..59c2640ddc4 100644 --- a/src/coreComponents/constitutive/contact/CoulombFriction.cpp +++ b/src/coreComponents/constitutive/contact/CoulombFriction.cpp @@ -58,8 +58,8 @@ CoulombFriction::~CoulombFriction() void CoulombFriction::postInputInitialization() { GEOS_THROW_IF( m_frictionCoefficient < 0.0, - getFullName() << ": The provided friction coefficient is less than zero. Value: " << m_frictionCoefficient, - InputError, getDataContext() ); + getFullName() << ": The provided friction coefficient is less than zero. Value: " << m_frictionCoefficient, + InputError, getDataContext() ); } diff --git a/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp b/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp index a97017fe30e..c37d998d2e5 100644 --- a/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp +++ b/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp @@ -58,8 +58,8 @@ HydraulicApertureTable::~HydraulicApertureTable() void HydraulicApertureTable::postInputInitialization() { GEOS_THROW_IF( m_apertureTableName.empty(), - getFullName() << ": the aperture table name " << m_apertureTableName << " is empty", - InputError, getDataContext() ); + getFullName() << ": the aperture table name " << m_apertureTableName << " is empty", + InputError, getDataContext() ); } @@ -72,8 +72,8 @@ void HydraulicApertureTable::allocateConstitutiveData( Group & parent, FunctionManager & functionManager = FunctionManager::getInstance(); GEOS_THROW_IF( !functionManager.hasGroup( m_apertureTableName ), - getFullName() << ": the aperture table named " << m_apertureTableName << " could not be found", - InputError, getDataContext() ); + getFullName() << ": the aperture table named " << m_apertureTableName << " could not be found", + InputError, getDataContext() ); TableFunction & apertureTable = functionManager.getGroup< TableFunction >( m_apertureTableName ); validateApertureTable( apertureTable ); @@ -123,26 +123,26 @@ void HydraulicApertureTable::validateApertureTable( TableFunction const & apertu arrayView1d< real64 const > const & hydraulicApertureValues = apertureTable.getValues(); GEOS_THROW_IF( coords.size() > 1, - getFullName() << ": Aperture limiter table cannot be greater than a 1D table.", - InputError, getDataContext() ); + getFullName() << ": Aperture limiter table cannot be greater than a 1D table.", + InputError, getDataContext() ); arraySlice1d< real64 const > apertureValues = coords[0]; localIndex const size = apertureValues.size(); GEOS_THROW_IF( coords( 0, size-1 ) > 0.0 || coords( 0, size-1 ) < 0.0, - getFullName() << ": Invalid aperture limiter table. Last coordinate must be zero!", - InputError, getDataContext() ); + getFullName() << ": Invalid aperture limiter table. Last coordinate must be zero!", + InputError, getDataContext() ); GEOS_THROW_IF( apertureValues.size() < 2, - getFullName() << ": Invalid aperture limiter table. Must have more than two points specified", - InputError, getDataContext() ); + getFullName() << ": Invalid aperture limiter table. Must have more than two points specified", + InputError, getDataContext() ); localIndex const n = apertureValues.size()-1; real64 const slope = ( hydraulicApertureValues[n] - hydraulicApertureValues[n-1] ) / ( apertureValues[n] - apertureValues[n-1] ); GEOS_THROW_IF( slope >= 1.0, - getFullName() << ": Invalid aperture table. The slope of the last two points >= 1 is invalid.", - InputError, getDataContext() ); + getFullName() << ": Invalid aperture table. The slope of the last two points >= 1 is invalid.", + InputError, getDataContext() ); } diff --git a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp index 62b31c7d3b7..5ff1e77771c 100644 --- a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp +++ b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp @@ -63,16 +63,16 @@ void ConstantDiffusion::allocateConstitutiveData( dataRepository::Group & parent void ConstantDiffusion::postInputInitialization() { GEOS_THROW_IF( m_diffusivityComponents.size() != 3, - GEOS_FMT( "{}: the size of the diffusivity must be equal to 3", - getFullName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the size of the diffusivity must be equal to 3", + getFullName() ), + InputError, getDataContext() ); GEOS_THROW_IF( m_diffusivityComponents[0] < 0 || - m_diffusivityComponents[1] < 0 || - m_diffusivityComponents[2] < 0, - GEOS_FMT( "{}: the components of the diffusivity tensor must be non-negative", - getFullName() ), - InputError, getDataContext() ); + m_diffusivityComponents[1] < 0 || + m_diffusivityComponents[2] < 0, + GEOS_FMT( "{}: the components of the diffusivity tensor must be non-negative", + getFullName() ), + InputError, getDataContext() ); } REGISTER_CATALOG_ENTRY( ConstitutiveBase, ConstantDiffusion, string const &, Group * const ) diff --git a/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp b/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp index 031313c25f3..aec08b6ef99 100644 --- a/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp +++ b/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp @@ -58,9 +58,9 @@ void DiffusionBase::postInputInitialization() InputError ); GEOS_THROW_IF( numPhases != m_defaultPhaseDiffusivityMultiplier.size(), - GEOS_FMT( "{}: the arrays in `{}` and `{}` must have the same size", - getFullName(), viewKeyStruct::phaseNamesString(), viewKeyStruct::defaultPhaseDiffusivityMultiplierString() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the arrays in `{}` and `{}` must have the same size", + getFullName(), viewKeyStruct::phaseNamesString(), viewKeyStruct::defaultPhaseDiffusivityMultiplierString() ), + InputError, getDataContext() ); m_diffusivity.resize( 0, 0, 3 ); m_dDiffusivity_dTemperature.resize( 0, 0, 3 ); diff --git a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp index 84281954299..6bafe460f8e 100644 --- a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp +++ b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp @@ -46,9 +46,9 @@ LinearIsotropicDispersion::deliverClone( string const & name, void LinearIsotropicDispersion::postInputInitialization() { GEOS_THROW_IF( m_longitudinalDispersivity < 0, - GEOS_FMT( "{}: longitudinal dispersivity must be positive", - getFullName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: longitudinal dispersivity must be positive", + getFullName() ), + InputError, getDataContext() ); } void LinearIsotropicDispersion::initializeVelocityState( arrayView2d< real64 const > const & initialVelocity ) const diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp index 1f3f115c4f3..1666678840f 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp @@ -238,10 +238,10 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::postInputInitialization() bool const hasParamFile = !m_flashModelParaFile.empty(); bool const hasTables = !m_solubilityTables.empty(); GEOS_THROW_IF( hasParamFile == hasTables, - GEOS_FMT( "{}: One and only one of {} or {} should be specified", getFullName(), - viewKeyStruct::flashModelParaFileString(), - viewKeyStruct::solubilityTablesString() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: One and only one of {} or {} should be specified", getFullName(), + viewKeyStruct::flashModelParaFileString(), + viewKeyStruct::solubilityTablesString() ), + InputError, getDataContext() ); // NOTE: for now, the names of the phases are still hardcoded here // Later, we could read them from the XML file and we would then have a general class here @@ -276,8 +276,8 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() if( !strs.empty() ) { GEOS_THROW_IF( strs.size() < 2, - GEOS_FMT( "{}: missing PVT model in line '{}'", getFullName(), str ), - InputError, getDataContext() ); + GEOS_FMT( "{}: missing PVT model in line '{}'", getFullName(), str ), + InputError, getDataContext() ); if( strs[0] == "DensityFun" ) { @@ -323,27 +323,27 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() // at this point, we have read the file and we check the consistency of non-thermal models GEOS_THROW_IF( phase1InputParams[PHASE1::InputParamOrder::DENSITY].empty(), - GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE1::Density::catalogName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE1::Density::catalogName() ), + InputError, getDataContext() ); GEOS_THROW_IF( phase2InputParams[PHASE2::InputParamOrder::DENSITY].empty(), - GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE2::Density::catalogName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE2::Density::catalogName() ), + InputError, getDataContext() ); GEOS_THROW_IF( phase1InputParams[PHASE1::InputParamOrder::VISCOSITY].empty(), - GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE1::Viscosity::catalogName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE1::Viscosity::catalogName() ), + InputError, getDataContext() ); GEOS_THROW_IF( phase2InputParams[PHASE2::InputParamOrder::VISCOSITY].empty(), - GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE2::Viscosity::catalogName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE2::Viscosity::catalogName() ), + InputError, getDataContext() ); // we also detect any inconsistency arising in the enthalpy models GEOS_THROW_IF( phase1InputParams[PHASE1::InputParamOrder::ENTHALPY].empty() && - ( PHASE1::Enthalpy::catalogName() != PVTProps::NoOpPVTFunction::catalogName() ), - GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE1::Enthalpy::catalogName() ), - InputError, getDataContext() ); + ( PHASE1::Enthalpy::catalogName() != PVTProps::NoOpPVTFunction::catalogName() ), + GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE1::Enthalpy::catalogName() ), + InputError, getDataContext() ); GEOS_THROW_IF( phase2InputParams[PHASE2::InputParamOrder::ENTHALPY].empty() && - ( PHASE2::Enthalpy::catalogName() != PVTProps::NoOpPVTFunction::catalogName() ), - GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE2::Enthalpy::catalogName() ), - InputError, getDataContext() ); + ( PHASE2::Enthalpy::catalogName() != PVTProps::NoOpPVTFunction::catalogName() ), + GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE2::Enthalpy::catalogName() ), + InputError, getDataContext() ); // then, we are ready to instantiate the phase models bool const isClone = this->isClone(); @@ -376,8 +376,8 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() if( !strs.empty() ) { GEOS_THROW_IF( strs.size() < 2, - GEOS_FMT( "{}: missing flash model in line '{}'", getFullName(), str ), - InputError, getDataContext() ); + GEOS_FMT( "{}: missing flash model in line '{}'", getFullName(), str ), + InputError, getDataContext() ); if( strs[0] == "FlashModel" ) { @@ -403,8 +403,8 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() { // The user must provide 1 or 2 tables. GEOS_THROW_IF( m_solubilityTables.size() != 1 && m_solubilityTables.size() != 2, - GEOS_FMT( "{}: The number of table names in {} must be 1 or 2", getFullName(), viewKeyStruct::solubilityTablesString() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: The number of table names in {} must be 1 or 2", getFullName(), viewKeyStruct::solubilityTablesString() ), + InputError, getDataContext() ); // If 1 table is provided, it is the CO2 solubility table and water vapourisation is zero // If 2 tables are provided, they are the CO2 solubility and water vapourisation tables depending @@ -434,8 +434,8 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() } GEOS_THROW_IF( m_flash == nullptr, - GEOS_FMT( "{}: flash model {} not found in input files", getFullName(), FLASH::catalogName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: flash model {} not found in input files", getFullName(), FLASH::catalogName() ), + InputError, getDataContext() ); } template< typename PHASE1, typename PHASE2, typename FLASH > diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp index 788b4e4edf5..d99026ededc 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp @@ -56,8 +56,8 @@ void BlackOilFluid::readInputDataFromTableFunctions() void BlackOilFluid::readInputDataFromPVTFiles() { GEOS_THROW_IF( m_formationVolFactorTableNames.size() > 0.0 || m_viscosityTableNames.size() > 0.0, - GEOS_FMT( "{}: input is redundant (both TableFunction names and pvt files)", getFullName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: input is redundant (both TableFunction names and pvt files)", getFullName() ), + InputError, getDataContext() ); using PT = BlackOilFluid::PhaseType; @@ -440,25 +440,25 @@ void BlackOilFluid::checkTableConsistency() const // check for the presence of one bubble point GEOS_THROW_IF( m_PVTO.undersaturatedPressure[m_PVTO.numSaturatedPoints - 1].size() <= 1, - GEOS_FMT( "{}: at least one bubble pressure is required in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), - InputError, getDataContext() ); + GEOS_FMT( "{}: at least one bubble pressure is required in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), + InputError, getDataContext() ); // check for saturated region for( integer i = 0; i < m_PVTO.numSaturatedPoints - 1; ++i ) { // Rs must increase with Pb GEOS_THROW_IF( ( m_PVTO.Rs[i + 1] - m_PVTO.Rs[i] ) <= 0, - GEOS_FMT( "{}: Rs must increase with Pb in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), - InputError, getDataContext() ); + GEOS_FMT( "{}: Rs must increase with Pb in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), + InputError, getDataContext() ); // Bo must increase with Pb GEOS_THROW_IF( ( m_PVTO.saturatedBo[i + 1] - m_PVTO.saturatedBo[i] ) <= 0, - GEOS_FMT( "{}: Bo must increase with Pb in saturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), - InputError, getDataContext() ); + GEOS_FMT( "{}: Bo must increase with Pb in saturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), + InputError, getDataContext() ); // Viscosity must decrease with Pb GEOS_THROW_IF( ( m_PVTO.saturatedViscosity[i + 1] - m_PVTO.saturatedViscosity[i] ) >= 0, - GEOS_FMT( "{}: Viscosity must decrease with Pb in saturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), - InputError, getDataContext() ); + GEOS_FMT( "{}: Viscosity must decrease with Pb in saturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), + InputError, getDataContext() ); } // check for under-saturated branches @@ -468,16 +468,16 @@ void BlackOilFluid::checkTableConsistency() const { // Pressure GEOS_THROW_IF( ( m_PVTO.undersaturatedPressure[i][j + 1] - m_PVTO.undersaturatedPressure[i][j] ) <= 0, - GEOS_FMT( "{}: P must decrease in undersaturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), - InputError, getDataContext() ); + GEOS_FMT( "{}: P must decrease in undersaturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), + InputError, getDataContext() ); // Bo must decrease with P GEOS_THROW_IF( ( m_PVTO.undersaturatedBo[i][j + 1] - m_PVTO.undersaturatedBo[i][j] ) >= 0, - GEOS_FMT( "{}: Bo must decrease with P in undersaturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), - InputError, getDataContext() ); + GEOS_FMT( "{}: Bo must decrease with P in undersaturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), + InputError, getDataContext() ); // Viscosity must increase with Pb GEOS_THROW_IF( ( m_PVTO.undersaturatedViscosity[i][j + 1] - m_PVTO.undersaturatedViscosity[i][j] ) < -1e-10, - GEOS_FMT( "{}: viscosity must increase with P in undersaturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), - InputError, getDataContext() ); + GEOS_FMT( "{}: viscosity must increase with P in undersaturated region in {}", getFullName(), m_tableFiles[m_phaseOrder[PT::OIL]] ), + InputError, getDataContext() ); } } } diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp index ebb05bc6d85..2e32e07377c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp @@ -103,9 +103,9 @@ void BlackOilFluidBase::fillWaterData( array1d< array1d< real64 > > const & tabl InputError ); GEOS_THROW_IF( m_waterParams.referencePressure > 0.0 || m_waterParams.formationVolFactor > 0.0 || - m_waterParams.compressibility > 0.0 || m_waterParams.viscosity > 0.0, - getFullName() << ": input is redundant (user provided both water data and a water pvt file)", - InputError, getDataContext() ); + m_waterParams.compressibility > 0.0 || m_waterParams.viscosity > 0.0, + getFullName() << ": input is redundant (user provided both water data and a water pvt file)", + InputError, getDataContext() ); m_waterParams.referencePressure = tableValues[0][0]; m_waterParams.formationVolFactor = tableValues[0][1]; @@ -281,8 +281,8 @@ void BlackOilFluidBase::checkTablesParameters( real64 const pressure, void BlackOilFluidBase::createAllKernelWrappers() { GEOS_THROW_IF( m_hydrocarbonPhaseOrder.size() != 1 && m_hydrocarbonPhaseOrder.size() != 2, - GEOS_FMT( "{}: the number of hydrocarbon phases must be 1 (oil) or 2 (oil+gas)", getFullName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the number of hydrocarbon phases must be 1 (oil) or 2 (oil+gas)", getFullName() ), + InputError, getDataContext() ); if( m_formationVolFactorTableKernels.empty() && m_viscosityTableKernels.empty() ) { @@ -312,8 +312,8 @@ void BlackOilFluidBase::validateTable( TableFunction const & table, for( localIndex i = 3; i < property.size(); ++i ) { GEOS_THROW_IF( (property[i] - property[i-1]) * (property[i-1] - property[i-2]) < 0, - GEOS_FMT( "{}: in table '{}', viscosity values must be monotone", getFullName(), table.getName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: in table '{}', viscosity values must be monotone", getFullName(), table.getName() ), + InputError, getDataContext() ); } // we don't check the first value, as it may be used to specify surface conditions diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp index b9fb28a6496..eb2db5ee9b2 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp @@ -39,8 +39,8 @@ void DeadOilFluid::postInputInitialization() integer const numComps = numFluidComponents(); GEOS_THROW_IF( numComps != 2 && numComps != 3, - GEOS_FMT( "{}: this model only supports 2 or 3 components", getFullName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: this model only supports 2 or 3 components", getFullName() ), + InputError, getDataContext() ); } void DeadOilFluid::readInputDataFromPVTFiles() @@ -49,8 +49,8 @@ void DeadOilFluid::readInputDataFromPVTFiles() GEOS_FMT( "{}: the number of table files must be equal to the number of phases", getFullName() ), InputError ); GEOS_THROW_IF( m_formationVolFactorTableNames.size() > 0.0 || m_viscosityTableNames.size() > 0.0, - GEOS_FMT( "{}: input is redundant (both TableFunction names and pvt files)", getFullName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: input is redundant (both TableFunction names and pvt files)", getFullName() ), + InputError, getDataContext() ); array1d< array1d< real64 > > tableValues; for( integer ip = 0; ip < numFluidPhases(); ++ip ) @@ -72,8 +72,8 @@ void DeadOilFluid::readInputDataFromPVTFiles() void DeadOilFluid::readInputDataFromTableFunctions() { GEOS_THROW_IF( !m_tableFiles.empty(), - GEOS_FMT( "{}: input is redundant (both TableFunction names and pvt files)", getFullName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: input is redundant (both TableFunction names and pvt files)", getFullName() ), + InputError, getDataContext() ); integer const ipWater = m_phaseOrder[PhaseType::WATER]; integer const ipGas = m_phaseOrder[PhaseType::GAS]; @@ -115,11 +115,11 @@ void DeadOilFluid::readInputDataFromTableFunctions() for( integer iph = 0; iph < m_hydrocarbonPhaseOrder.size(); ++iph ) { GEOS_THROW_IF( !functionManager.hasGroup( m_formationVolFactorTableNames[iph] ), - GEOS_FMT( "{}: formation volume factor table '{}' not found", getFullName(), m_formationVolFactorTableNames[iph] ), - InputError, getDataContext() ); + GEOS_FMT( "{}: formation volume factor table '{}' not found", getFullName(), m_formationVolFactorTableNames[iph] ), + InputError, getDataContext() ); GEOS_THROW_IF( !functionManager.hasGroup( m_viscosityTableNames[iph] ), - GEOS_FMT( "{}: viscosity table '{}' not found", getFullName(), m_viscosityTableNames[iph] ), - InputError, getDataContext() ); + GEOS_FMT( "{}: viscosity table '{}' not found", getFullName(), m_viscosityTableNames[iph] ), + InputError, getDataContext() ); } } diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/parameters/PressureTemperatureCoordinates.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/parameters/PressureTemperatureCoordinates.cpp index fe91694eafc..feed413b275 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/parameters/PressureTemperatureCoordinates.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/parameters/PressureTemperatureCoordinates.cpp @@ -71,9 +71,9 @@ void PressureTemperatureCoordinates::postInputInitializationImpl( MultiFluidBase // Values must be strictly increasing GEOS_THROW_IF( !isStrictlyIncreasing( m_pressureCoordinates.toSliceConst()), - GEOS_FMT( "{}: invalid values of pressure coordinates provided in {}. " - "Values must be strictly increasing.", fluid->getFullName(), viewKeyStruct::pressureCoordinatesString() ), - InputError, fluid->getDataContext() ); + GEOS_FMT( "{}: invalid values of pressure coordinates provided in {}. " + "Values must be strictly increasing.", fluid->getFullName(), viewKeyStruct::pressureCoordinatesString() ), + InputError, fluid->getDataContext() ); } if( !m_temperatureCoordinates.empty()) @@ -86,9 +86,9 @@ void PressureTemperatureCoordinates::postInputInitializationImpl( MultiFluidBase // Values must be strictly increasing GEOS_THROW_IF( !isStrictlyIncreasing( m_temperatureCoordinates.toSliceConst()), - GEOS_FMT( "{}: invalid values of temperature coordinates provided in {}. " - "Values must be strictly increasing.", fluid->getFullName(), viewKeyStruct::temperatureCoordinatesString() ), - InputError, fluid->getDataContext() ); + GEOS_FMT( "{}: invalid values of temperature coordinates provided in {}. " + "Values must be strictly increasing.", fluid->getFullName(), viewKeyStruct::temperatureCoordinatesString() ), + InputError, fluid->getDataContext() ); } } diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp index a9906bf8525..5700e5f32a8 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp @@ -157,8 +157,8 @@ void ReactiveBrineFluid< PHASE > ::createPVTModels() if( !strs.empty() ) { GEOS_THROW_IF( strs.size() < 2, - GEOS_FMT( "{}: missing PVT model in line '{}'", getFullName(), str ), - InputError, getDataContext() ); + GEOS_FMT( "{}: missing PVT model in line '{}'", getFullName(), str ), + InputError, getDataContext() ); if( strs[0] == "DensityFun" ) { @@ -192,16 +192,16 @@ void ReactiveBrineFluid< PHASE > ::createPVTModels() // at this point, we have read the file and we check the consistency of non-thermal models GEOS_THROW_IF( phase1InputParams[PHASE::InputParamOrder::DENSITY].empty(), - GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE::Density::catalogName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE::Density::catalogName() ), + InputError, getDataContext() ); GEOS_THROW_IF( phase1InputParams[PHASE::InputParamOrder::VISCOSITY].empty(), - GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE::Viscosity::catalogName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE::Viscosity::catalogName() ), + InputError, getDataContext() ); // we also detect any inconsistency arising in the enthalpy models GEOS_THROW_IF( phase1InputParams[PHASE::InputParamOrder::ENTHALPY].empty() && - ( PHASE::Enthalpy::catalogName() != PVTProps::NoOpPVTFunction::catalogName() ), - GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE::Enthalpy::catalogName() ), - InputError, getDataContext() ); + ( PHASE::Enthalpy::catalogName() != PVTProps::NoOpPVTFunction::catalogName() ), + GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE::Enthalpy::catalogName() ), + InputError, getDataContext() ); bool const isClone = this->isClone(); TableFunction::OutputOptions const pvtOutputOpts = { diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp index 4bd5777b862..db68b1e95d3 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp @@ -85,34 +85,34 @@ void ParticleFluid::postInputInitialization() ParticleFluidBase::postInputInitialization(); GEOS_ERROR_IF( m_proppantDensity < 500.0, - "Invalid proppantDensity in ParticleFluid " - << getDataContext() << ", which must >= 500.0 ", - getDataContext() ); + "Invalid proppantDensity in ParticleFluid " + << getDataContext() << ", which must >= 500.0 ", + getDataContext() ); GEOS_ERROR_IF( m_proppantDiameter < 10e-6, - "Invalid proppantDiameter in ParticleFluid " - << getDataContext() << ", which must >= 10e-6 ", - getDataContext() ); + "Invalid proppantDiameter in ParticleFluid " + << getDataContext() << ", which must >= 10e-6 ", + getDataContext() ); GEOS_ERROR_IF( m_hinderedSettlingCoefficient< 0.0 || m_hinderedSettlingCoefficient > 10.0, - "Invalid hinderedSettlingCoefficient in ParticleFluid " - << getDataContext() << ", which must between 0 and 10 ", - getDataContext() ); + "Invalid hinderedSettlingCoefficient in ParticleFluid " + << getDataContext() << ", which must between 0 and 10 ", + getDataContext() ); GEOS_ERROR_IF( m_collisionAlpha < 1.0, - "Invalid collisionAlpha in ParticleFluid " - << getDataContext() << ", which must >= 1 ", - getDataContext() ); + "Invalid collisionAlpha in ParticleFluid " + << getDataContext() << ", which must >= 1 ", + getDataContext() ); GEOS_ERROR_IF( m_collisionBeta < 0.0, - "Invalid collisionBeta in ParticleFluid " - << getDataContext() << ", which must >= 0", - getDataContext() ); + "Invalid collisionBeta in ParticleFluid " + << getDataContext() << ", which must >= 0", + getDataContext() ); GEOS_ERROR_IF( m_slipConcentration > 0.3, - "Invalid slipConcentration in ParticleFluid " - << getDataContext() << ", which must <= 0.3", - getDataContext() ); + "Invalid slipConcentration in ParticleFluid " + << getDataContext() << ", which must <= 0.3", + getDataContext() ); m_packPermeabilityCoef = pow( m_sphericity * m_proppantDiameter, 2.0 ) / 180.0; } diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp index 55907aa8821..9d409297eea 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp @@ -91,8 +91,8 @@ void ThermalCompressibleSinglePhaseFluid::postInputInitialization() auto const checkModelType = [&]( ExponentApproximationType const value, auto const & attribute ) { GEOS_THROW_IF( value != ExponentApproximationType::Linear && value != ExponentApproximationType::Full, - GEOS_FMT( "{}: invalid model type in attribute '{}' (only linear or fully exponential currently supported)", getFullName(), attribute ), - InputError, getDataContext() ); + GEOS_FMT( "{}: invalid model type in attribute '{}' (only linear or fully exponential currently supported)", getFullName(), attribute ), + InputError, getDataContext() ); }; checkModelType( m_internalEnergyModelType, viewKeyStruct::internalEnergyModelTypeString() ); } diff --git a/src/coreComponents/constitutive/permeability/PressurePermeability.cpp b/src/coreComponents/constitutive/permeability/PressurePermeability.cpp index 8bb8552564b..aa2ee9ac706 100644 --- a/src/coreComponents/constitutive/permeability/PressurePermeability.cpp +++ b/src/coreComponents/constitutive/permeability/PressurePermeability.cpp @@ -72,8 +72,8 @@ void PressurePermeability::postInputInitialization() for( localIndex i=0; i < 3; i++ ) { GEOS_ERROR_IF( fabs( m_pressureDependenceConstants[i] ) < 1e-15 && m_presModelType == PressureModelType::Hyperbolic, - getDataContext() << ": the pressure dependent constant at component " << i << " is too close to zero, which is not allowed for the hyperbolic model.", - getDataContext() ); + getDataContext() << ": the pressure dependent constant at component " << i << " is too close to zero, which is not allowed for the hyperbolic model.", + getDataContext() ); } } diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp index 680d0a83673..5893bc00d61 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp @@ -71,8 +71,8 @@ void BrooksCoreyBakerRelativePermeability::postInputInitialization() RelativePermeabilityBase::postInputInitialization(); GEOS_THROW_IF( m_phaseOrder[PhaseType::OIL] < 0, - GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), + InputError, getDataContext() ); auto const checkInputSize = [&]( auto const & array, localIndex const expected, auto const & attribute ) { diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp index 59a3b8811c6..564b3df38f1 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp @@ -71,8 +71,8 @@ void BrooksCoreyStone2RelativePermeability::postInputInitialization() RelativePermeabilityBase::postInputInitialization(); GEOS_THROW_IF( m_phaseOrder[PhaseType::OIL] < 0, - GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), + InputError, getDataContext() ); auto const checkInputSize = [&]( auto const & array, localIndex const expected, auto const & attribute ) { diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp index 3849dde9fad..ae8a530ab31 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp @@ -91,49 +91,49 @@ void TableRelativePermeability::postInputInitialization() integer const numPhases = m_phaseNames.size(); GEOS_THROW_IF( numPhases != 2 && numPhases != 3, - GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", - getFullName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", + getFullName() ), + InputError, getDataContext() ); if( numPhases == 2 ) { GEOS_THROW_IF( m_wettingNonWettingRelPermTableNames.empty(), - GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the relative permeability tables for the pair (wetting phase, non-wetting phase)", - getFullName(), - viewKeyStruct::wettingNonWettingRelPermTableNamesString() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the relative permeability tables for the pair (wetting phase, non-wetting phase)", + getFullName(), + viewKeyStruct::wettingNonWettingRelPermTableNamesString() ), + InputError, getDataContext() ); GEOS_THROW_IF( m_wettingNonWettingRelPermTableNames.size() != 2, - GEOS_FMT( - "{}: for a two-phase flow simulation, we must use {} to specify exactly two names: first the name of the wetting phase relperm table, second the name on the non-wetting phase relperm table", - getFullName(), - viewKeyStruct::wettingNonWettingRelPermTableNamesString() ), - InputError, getDataContext() ); + GEOS_FMT( + "{}: for a two-phase flow simulation, we must use {} to specify exactly two names: first the name of the wetting phase relperm table, second the name on the non-wetting phase relperm table", + getFullName(), + viewKeyStruct::wettingNonWettingRelPermTableNamesString() ), + InputError, getDataContext() ); } else if( numPhases == 3 ) { GEOS_THROW_IF( m_wettingIntermediateRelPermTableNames.empty() || m_nonWettingIntermediateRelPermTableNames.empty(), - GEOS_FMT( - "{}: for a three-phase flow simulation, we must use {} to specify the relative permeability tables for the pair (wetting phase, intermediate phase), and {} to specify the relative permeability tables for the pair (non-wetting phase, intermediate phase)", - getFullName(), - viewKeyStruct::wettingIntermediateRelPermTableNamesString(), - viewKeyStruct::nonWettingIntermediateRelPermTableNamesString() ), - InputError, getDataContext() ); + GEOS_FMT( + "{}: for a three-phase flow simulation, we must use {} to specify the relative permeability tables for the pair (wetting phase, intermediate phase), and {} to specify the relative permeability tables for the pair (non-wetting phase, intermediate phase)", + getFullName(), + viewKeyStruct::wettingIntermediateRelPermTableNamesString(), + viewKeyStruct::nonWettingIntermediateRelPermTableNamesString() ), + InputError, getDataContext() ); GEOS_THROW_IF( m_wettingIntermediateRelPermTableNames.size() != 2, - GEOS_FMT( - "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: first the name of the wetting phase relperm table, second the name on the intermediate phase relperm table", - getFullName(), - viewKeyStruct::wettingIntermediateRelPermTableNamesString() ), - InputError, getDataContext() ); + GEOS_FMT( + "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: first the name of the wetting phase relperm table, second the name on the intermediate phase relperm table", + getFullName(), + viewKeyStruct::wettingIntermediateRelPermTableNamesString() ), + InputError, getDataContext() ); GEOS_THROW_IF( m_nonWettingIntermediateRelPermTableNames.size() != 2, - GEOS_FMT( - "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: first the name of the non-wetting phase relperm table, second the name on the intermediate phase relperm table", - getFullName(), - viewKeyStruct::nonWettingIntermediateRelPermTableNamesString() ), - InputError, getDataContext() ); + GEOS_FMT( + "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: first the name of the non-wetting phase relperm table, second the name on the intermediate phase relperm table", + getFullName(), + viewKeyStruct::nonWettingIntermediateRelPermTableNamesString() ), + InputError, getDataContext() ); } } @@ -161,10 +161,10 @@ void TableRelativePermeability::initializePreSubGroups() for( size_t ip = 0; ip < m_wettingNonWettingRelPermTableNames.size(); ++ip ) { GEOS_THROW_IF( !functionManager.hasGroup( m_wettingNonWettingRelPermTableNames[ip] ), - GEOS_FMT( "{}: the table function named {} could not be found", - getFullName(), - m_wettingNonWettingRelPermTableNames[ip] ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the table function named {} could not be found", + getFullName(), + m_wettingNonWettingRelPermTableNames[ip] ), + InputError, getDataContext() ); TableFunction const & relPermTable = functionManager.getGroup< TableFunction >( m_wettingNonWettingRelPermTableNames[ip] ); TableRelativePermeabilityHelpers:: validateRelativePermeabilityTable( relPermTable, // input @@ -190,10 +190,10 @@ void TableRelativePermeability::initializePreSubGroups() for( size_t ip = 0; ip < m_wettingIntermediateRelPermTableNames.size(); ++ip ) { GEOS_THROW_IF( !functionManager.hasGroup( m_wettingIntermediateRelPermTableNames[ip] ), - GEOS_FMT( "{}: the table function named {} could not be found", - getFullName(), - m_wettingIntermediateRelPermTableNames[ip] ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the table function named {} could not be found", + getFullName(), + m_wettingIntermediateRelPermTableNames[ip] ), + InputError, getDataContext() ); TableFunction const & relPermTable = functionManager.getGroup< TableFunction >( m_wettingIntermediateRelPermTableNames[ip] ); TableRelativePermeabilityHelpers:: validateRelativePermeabilityTable( relPermTable, // input @@ -218,10 +218,10 @@ void TableRelativePermeability::initializePreSubGroups() for( size_t ip = 0; ip < m_nonWettingIntermediateRelPermTableNames.size(); ++ip ) { GEOS_THROW_IF( !functionManager.hasGroup( m_nonWettingIntermediateRelPermTableNames[ip] ), - GEOS_FMT( "{}: the table function named {} could not be found", - getFullName(), - m_nonWettingIntermediateRelPermTableNames[ip] ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the table function named {} could not be found", + getFullName(), + m_nonWettingIntermediateRelPermTableNames[ip] ), + InputError, getDataContext() ); TableFunction const & relPermTable = functionManager.getGroup< TableFunction >( m_nonWettingIntermediateRelPermTableNames[ip] ); TableRelativePermeabilityHelpers:: validateRelativePermeabilityTable( relPermTable, // input diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp index 2b7caf2e115..965c9278fc1 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp @@ -59,24 +59,24 @@ TableRelativePermeabilityHelpers::validateRelativePermeabilityTable( TableFuncti // note that the TableFunction class has already checked that coords.sizeOfArray( 0 ) == relPerm.size() GEOS_THROW_IF( !isZero( relPerm[0] ), - GEOS_FMT( "{}: TableFunction '{}' first value must be equal to 0", - fullConstitutiveName, relPermTable.getDataContext() ), - InputError, relPermTable.getDataContext() ); + GEOS_FMT( "{}: TableFunction '{}' first value must be equal to 0", + fullConstitutiveName, relPermTable.getDataContext() ), + InputError, relPermTable.getDataContext() ); for( localIndex i = 1; i < coords.sizeOfArray( 0 ); ++i ) { // check phase volume fraction GEOS_THROW_IF( phaseVolFrac[i] < 0 || phaseVolFrac[i] > 1, - GEOS_FMT( "{}: TableFunction '{}' values must be between 0 and 1", - fullConstitutiveName, relPermTable.getDataContext() ), - InputError, relPermTable.getDataContext() ); + GEOS_FMT( "{}: TableFunction '{}' values must be between 0 and 1", + fullConstitutiveName, relPermTable.getDataContext() ), + InputError, relPermTable.getDataContext() ); // note that the TableFunction class has already checked that the coordinates are monotone // check phase relative permeability GEOS_THROW_IF( !isZero( relPerm[i] ) && (relPerm[i] - relPerm[i-1]) < 1e-15, - GEOS_FMT( "{}: TableFunction '{}' values must be strictly increasing (|Delta kr| > 1e-15 between two non-zero values)", - fullConstitutiveName, relPermTable.getDataContext() ), - InputError, relPermTable.getDataContext() ); + GEOS_FMT( "{}: TableFunction '{}' values must be strictly increasing (|Delta kr| > 1e-15 between two non-zero values)", + fullConstitutiveName, relPermTable.getDataContext() ), + InputError, relPermTable.getDataContext() ); if( isZero( relPerm[i-1] ) && !isZero( relPerm[i] ) ) { diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp index ef26eb97358..923e1f39994 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp @@ -163,9 +163,9 @@ void TableRelativePermeabilityHysteresis::postInputInitialization() integer const numPhases = m_phaseNames.size(); GEOS_THROW_IF( numPhases != 2 && numPhases != 3, - GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", - getFullName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the expected number of fluid phases is either two, or three", + getFullName() ), + InputError, getDataContext() ); m_phaseHasHysteresis.resize( 2 ); @@ -176,18 +176,18 @@ void TableRelativePermeabilityHysteresis::postInputInitialization() if( numPhases == 2 ) { GEOS_THROW_IF( m_drainageWettingNonWettingRelPermTableNames.empty(), - GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the relative permeability tables " - "for the pair (wetting phase, non-wetting phase)", - getFullName(), - viewKeyStruct::drainageWettingNonWettingRelPermTableNamesString() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify the relative permeability tables " + "for the pair (wetting phase, non-wetting phase)", + getFullName(), + viewKeyStruct::drainageWettingNonWettingRelPermTableNamesString() ), + InputError, getDataContext() ); GEOS_THROW_IF( m_drainageWettingNonWettingRelPermTableNames.size() != 2, - GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify exactly two names: " - "first the name of the wetting phase relperm table, second the name on the non-wetting phase relperm table", - getFullName(), - viewKeyStruct::drainageWettingNonWettingRelPermTableNamesString() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: for a two-phase flow simulation, we must use {} to specify exactly two names: " + "first the name of the wetting phase relperm table, second the name on the non-wetting phase relperm table", + getFullName(), + viewKeyStruct::drainageWettingNonWettingRelPermTableNamesString() ), + InputError, getDataContext() ); m_phaseHasHysteresis[IPT::WETTING] = ( m_imbibitionWettingRelPermTableName.empty() || m_imbibitionWettingRelPermTableName == m_drainageWettingNonWettingRelPermTableNames[0] ) @@ -199,27 +199,27 @@ void TableRelativePermeabilityHysteresis::postInputInitialization() else if( numPhases == 3 ) { GEOS_THROW_IF( m_drainageWettingIntermediateRelPermTableNames.empty() || m_drainageNonWettingIntermediateRelPermTableNames.empty(), - GEOS_FMT( "{}: for a three-phase flow simulation, " - "we must use {} to specify the relative permeability tables for the pair (wetting phase, intermediate phase), " - "and {} to specify the relative permeability tables for the pair (non-wetting phase, intermediate phase)", - getFullName(), - viewKeyStruct::drainageWettingIntermediateRelPermTableNamesString(), - viewKeyStruct::drainageNonWettingIntermediateRelPermTableNamesString() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: for a three-phase flow simulation, " + "we must use {} to specify the relative permeability tables for the pair (wetting phase, intermediate phase), " + "and {} to specify the relative permeability tables for the pair (non-wetting phase, intermediate phase)", + getFullName(), + viewKeyStruct::drainageWettingIntermediateRelPermTableNamesString(), + viewKeyStruct::drainageNonWettingIntermediateRelPermTableNamesString() ), + InputError, getDataContext() ); GEOS_THROW_IF( m_drainageWettingIntermediateRelPermTableNames.size() != 2, - GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: " - "first the name of the wetting phase relperm table, second the name on the intermediate phase relperm table", - getFullName(), - viewKeyStruct::drainageWettingIntermediateRelPermTableNamesString() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: " + "first the name of the wetting phase relperm table, second the name on the intermediate phase relperm table", + getFullName(), + viewKeyStruct::drainageWettingIntermediateRelPermTableNamesString() ), + InputError, getDataContext() ); GEOS_THROW_IF( m_drainageNonWettingIntermediateRelPermTableNames.size() != 2, - GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: " - "first the name of the non-wetting phase relperm table, second the name on the intermediate phase relperm table", - getFullName(), - viewKeyStruct::drainageNonWettingIntermediateRelPermTableNamesString() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: for a three-phase flow simulation, we must use {} to specify exactly two names: " + "first the name of the non-wetting phase relperm table, second the name on the intermediate phase relperm table", + getFullName(), + viewKeyStruct::drainageNonWettingIntermediateRelPermTableNamesString() ), + InputError, getDataContext() ); m_phaseHasHysteresis[IPT::WETTING] = ( m_imbibitionWettingRelPermTableName.empty() || m_imbibitionWettingRelPermTableName == m_drainageWettingIntermediateRelPermTableNames[0] ) @@ -230,11 +230,11 @@ void TableRelativePermeabilityHysteresis::postInputInitialization() } GEOS_THROW_IF( m_phaseHasHysteresis[IPT::WETTING] == 0 && m_phaseHasHysteresis[IPT::NONWETTING] == 0, - GEOS_FMT( "{}: we must use {} or {} to specify at least one imbibition relative permeability table", - getFullName(), - viewKeyStruct::imbibitionWettingRelPermTableNameString(), - viewKeyStruct::imbibitionNonWettingRelPermTableNameString() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: we must use {} or {} to specify at least one imbibition relative permeability table", + getFullName(), + viewKeyStruct::imbibitionWettingRelPermTableNameString(), + viewKeyStruct::imbibitionNonWettingRelPermTableNameString() ), + InputError, getDataContext() ); //Killough section KilloughHysteresis::postProcessInput( m_jerauldParam_a, m_jerauldParam_b, m_killoughCurvatureParamRelPerm ); @@ -295,28 +295,28 @@ void TableRelativePermeabilityHysteresis::checkExistenceAndValidateWettingRelPer imbibitionPhaseRelPermMaxEndPoint ); GEOS_THROW_IF( !isZero( imbibitionPhaseMinVolFraction - drainagePhaseMinVolFraction ), - GEOS_FMT( "{}: the critical wetting-phase volume fraction (saturation) must be the same in drainage and imbibition.\n" - "However, we found that the drainage critical wetting-phase volume fraction is {}, " - "whereas the imbibition critical wetting-phase volume fraction is {}", - getFullName(), - drainagePhaseMinVolFraction, imbibitionPhaseMinVolFraction ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the critical wetting-phase volume fraction (saturation) must be the same in drainage and imbibition.\n" + "However, we found that the drainage critical wetting-phase volume fraction is {}, " + "whereas the imbibition critical wetting-phase volume fraction is {}", + getFullName(), + drainagePhaseMinVolFraction, imbibitionPhaseMinVolFraction ), + InputError, getDataContext() ); GEOS_THROW_IF( imbibitionPhaseMaxVolFraction > drainagePhaseMaxVolFraction, - GEOS_FMT( "{}: the maximum wetting-phase volume fraction (saturation) must be smaller in imbibition (compared to the drainage value).\n" - "However, we found that the drainage maximum wetting-phase volume fraction is {}, " - "whereas the imbibition maximum wetting-phase volume fraction is {}", - getFullName(), - drainagePhaseMaxVolFraction, imbibitionPhaseMaxVolFraction ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the maximum wetting-phase volume fraction (saturation) must be smaller in imbibition (compared to the drainage value).\n" + "However, we found that the drainage maximum wetting-phase volume fraction is {}, " + "whereas the imbibition maximum wetting-phase volume fraction is {}", + getFullName(), + drainagePhaseMaxVolFraction, imbibitionPhaseMaxVolFraction ), + InputError, getDataContext() ); GEOS_THROW_IF( imbibitionPhaseRelPermMaxEndPoint > drainagePhaseRelPermMaxEndPoint, - GEOS_FMT( "{}: the maximum wetting-phase relperm must be smaller in imbibition (compared to the drainage value).\n" - "However, we found that the drainage maximum wetting-phase relperm is {}, " - "whereas the imbibition maximum wetting-phase relperm is {}", - getFullName(), - drainagePhaseRelPermMaxEndPoint, imbibitionPhaseRelPermMaxEndPoint ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the maximum wetting-phase relperm must be smaller in imbibition (compared to the drainage value).\n" + "However, we found that the drainage maximum wetting-phase relperm is {}, " + "whereas the imbibition maximum wetting-phase relperm is {}", + getFullName(), + drainagePhaseRelPermMaxEndPoint, imbibitionPhaseRelPermMaxEndPoint ), + InputError, getDataContext() ); } @@ -372,28 +372,28 @@ void TableRelativePermeabilityHysteresis::checkExistenceAndValidateNonWettingRel imbibitionPhaseRelPermMaxEndPoint ); GEOS_THROW_IF( !isZero ( imbibitionPhaseMaxVolFraction - drainagePhaseMaxVolFraction ), - GEOS_FMT( string( "{}: the maximum non-wetting-phase volume fraction (saturation) must be the same in drainage and imbibition.\n" ) - + string( "However, we found that the drainage maximum wetting-phase volume fraction is {}, " ) - + string( "whereas the imbibition maximum wetting-phase volume fraction is {}" ), - getFullName(), - drainagePhaseMaxVolFraction, imbibitionPhaseMaxVolFraction ), - InputError, getDataContext() ); + GEOS_FMT( string( "{}: the maximum non-wetting-phase volume fraction (saturation) must be the same in drainage and imbibition.\n" ) + + string( "However, we found that the drainage maximum wetting-phase volume fraction is {}, " ) + + string( "whereas the imbibition maximum wetting-phase volume fraction is {}" ), + getFullName(), + drainagePhaseMaxVolFraction, imbibitionPhaseMaxVolFraction ), + InputError, getDataContext() ); GEOS_THROW_IF( !isZero ( imbibitionPhaseRelPermMaxEndPoint - drainagePhaseRelPermMaxEndPoint ), - GEOS_FMT( string( "{}: the non-wetting-phase relperm endpoint must be the same in drainage and imbibition.\n" ) - + string( "However, we found that the drainage endpoint wetting-phase relperm is {}, " ) - + string( "whereas the imbibition endpoint wetting-phase relperm is {}" ), - getFullName(), - drainagePhaseRelPermMaxEndPoint, imbibitionPhaseRelPermMaxEndPoint ), - InputError, getDataContext() ); + GEOS_FMT( string( "{}: the non-wetting-phase relperm endpoint must be the same in drainage and imbibition.\n" ) + + string( "However, we found that the drainage endpoint wetting-phase relperm is {}, " ) + + string( "whereas the imbibition endpoint wetting-phase relperm is {}" ), + getFullName(), + drainagePhaseRelPermMaxEndPoint, imbibitionPhaseRelPermMaxEndPoint ), + InputError, getDataContext() ); GEOS_THROW_IF( imbibitionPhaseMinVolFraction < drainagePhaseMinVolFraction, - GEOS_FMT( string( "{}: the critical wetting-phase volume fraction (saturation) must be larger in imbibition (compared to the drainage value).\n" ) - + string( "However, we found that the drainage critical wetting-phase volume fraction is {}, " ) - + string( "whereas the imbibition critical wetting-phase volume fraction is {}" ), - getFullName(), - drainagePhaseMinVolFraction, imbibitionPhaseMinVolFraction ), - InputError, getDataContext() ); + GEOS_FMT( string( "{}: the critical wetting-phase volume fraction (saturation) must be larger in imbibition (compared to the drainage value).\n" ) + + string( "However, we found that the drainage critical wetting-phase volume fraction is {}, " ) + + string( "whereas the imbibition critical wetting-phase volume fraction is {}" ), + getFullName(), + drainagePhaseMinVolFraction, imbibitionPhaseMinVolFraction ), + InputError, getDataContext() ); } @@ -448,10 +448,10 @@ void TableRelativePermeabilityHysteresis::checkExistenceAndValidateRelPermTable( // check if the table actually exists GEOS_THROW_IF( !functionManager.hasGroup( relPermTableName ), - GEOS_FMT( "{}: the table function named {} could not be found", - getFullName(), - relPermTableName ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the table function named {} could not be found", + getFullName(), + relPermTableName ), + InputError, getDataContext() ); TableFunction const & relPermTable = functionManager.getGroup< TableFunction >( relPermTableName ); // read the table, check monotonicity, and return the min/max saturation and the endpoint diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp index 547adb80d27..065e1b4ebc8 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp @@ -73,8 +73,8 @@ void VanGenuchtenBakerRelativePermeability::postInputInitialization() RelativePermeabilityBase::postInputInitialization(); GEOS_THROW_IF( m_phaseOrder[PhaseType::OIL] < 0, - GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), + InputError, getDataContext() ); auto const checkInputSize = [&]( auto const & array, localIndex const expected, auto const & attribute ) { diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp index 32227864753..f4e6a083775 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp @@ -73,8 +73,8 @@ void VanGenuchtenStone2RelativePermeability::postInputInitialization() RelativePermeabilityBase::postInputInitialization(); GEOS_THROW_IF( m_phaseOrder[PhaseType::OIL] < 0, - GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), + InputError, getDataContext() ); auto const checkInputSize = [&]( auto const & array, localIndex const expected, auto const & attribute ) { diff --git a/src/coreComponents/constitutive/solid/Damage.cpp b/src/coreComponents/constitutive/solid/Damage.cpp index 05f36662fed..eff9098bd38 100644 --- a/src/coreComponents/constitutive/solid/Damage.cpp +++ b/src/coreComponents/constitutive/solid/Damage.cpp @@ -149,21 +149,21 @@ void Damage< BASE >::postInputInitialization() BASE::postInputInitialization(); GEOS_ERROR_IF( m_extDrivingForceFlag != 0 && m_extDrivingForceFlag!= 1, - BASE::getDataContext() << ": invalid external driving force flag option - must" - " be 0 or 1", - BASE::getDataContext() ); + BASE::getDataContext() << ": invalid external driving force flag option - must" + " be 0 or 1", + BASE::getDataContext() ); GEOS_ERROR_IF( m_extDrivingForceFlag == 1 && m_defaultTensileStrength <= 0.0, - BASE::getDataContext() << ": tensile strength must be input and positive when the" - " external driving force flag is turned on", - BASE::getDataContext() ); + BASE::getDataContext() << ": tensile strength must be input and positive when the" + " external driving force flag is turned on", + BASE::getDataContext() ); GEOS_ERROR_IF( m_extDrivingForceFlag == 1 && m_defaultCompressStrength <= 0.0, - BASE::getDataContext() << ": compressive strength must be input and positive when the" - " external driving force flag is turned on", - BASE::getDataContext() ); + BASE::getDataContext() << ": compressive strength must be input and positive when the" + " external driving force flag is turned on", + BASE::getDataContext() ); GEOS_ERROR_IF( m_extDrivingForceFlag == 1 && m_defaultDeltaCoefficient < 0.0, - BASE::getDataContext() << ": delta coefficient must be input and non-negative when the" - " external driving force flag is turned on", - BASE::getDataContext() ); + BASE::getDataContext() << ": delta coefficient must be input and non-negative when the" + " external driving force flag is turned on", + BASE::getDataContext() ); // set results as array default values this->template getWrapper< array1d< real64 > >( viewKeyStruct::criticalFractureEnergyString() ). diff --git a/src/coreComponents/constitutive/solid/DelftEgg.cpp b/src/coreComponents/constitutive/solid/DelftEgg.cpp index cf509f26fe5..cf740743ee4 100644 --- a/src/coreComponents/constitutive/solid/DelftEgg.cpp +++ b/src/coreComponents/constitutive/solid/DelftEgg.cpp @@ -114,17 +114,17 @@ void DelftEgg::postInputInitialization() ElasticIsotropic::postInputInitialization(); GEOS_THROW_IF( m_defaultCslSlope <= 0, - getFullName() << ": Non-positive slope of critical state line detected", - InputError, getDataContext() ); + getFullName() << ": Non-positive slope of critical state line detected", + InputError, getDataContext() ); GEOS_THROW_IF( m_defaultShapeParameter < 1., - getFullName() << ": Shape parameter for yield surface must be greater than or equal to one", - InputError, getDataContext() ); + getFullName() << ": Shape parameter for yield surface must be greater than or equal to one", + InputError, getDataContext() ); GEOS_THROW_IF( m_defaultVirginCompressionIndex <= 0, - getFullName() << ": Non-positive virgin compression index detected", - InputError, getDataContext() ); + getFullName() << ": Non-positive virgin compression index detected", + InputError, getDataContext() ); GEOS_THROW_IF( m_defaultVirginCompressionIndex <= m_defaultRecompressionIndex, - getFullName() << ": Recompression index should exceed virgin recompression index", - InputError, getDataContext() ); + getFullName() << ": Recompression index should exceed virgin recompression index", + InputError, getDataContext() ); // set results as array default values diff --git a/src/coreComponents/constitutive/solid/DruckerPrager.cpp b/src/coreComponents/constitutive/solid/DruckerPrager.cpp index 9cce2aaeb63..89957f4b51c 100644 --- a/src/coreComponents/constitutive/solid/DruckerPrager.cpp +++ b/src/coreComponents/constitutive/solid/DruckerPrager.cpp @@ -103,17 +103,17 @@ void DruckerPrager::postInputInitialization() ElasticIsotropic::postInputInitialization(); GEOS_THROW_IF( m_defaultCohesion < 0, - getFullName() << ": Negative cohesion value detected", - InputError, getDataContext() ); + getFullName() << ": Negative cohesion value detected", + InputError, getDataContext() ); GEOS_THROW_IF( m_defaultFrictionAngle < 0, - getFullName() << ": Negative friction angle detected", - InputError, getDataContext() ); + getFullName() << ": Negative friction angle detected", + InputError, getDataContext() ); GEOS_THROW_IF( m_defaultDilationAngle < 0, - getFullName() << ": Negative dilation angle detected", - InputError, getDataContext() ); + getFullName() << ": Negative dilation angle detected", + InputError, getDataContext() ); GEOS_THROW_IF( m_defaultFrictionAngle < m_defaultDilationAngle, - getFullName() << ": Dilation angle should not exceed friction angle", - InputError, getDataContext() ); + getFullName() << ": Dilation angle should not exceed friction angle", + InputError, getDataContext() ); // convert from Mohr-Coulomb constants to Drucker-Prager constants, assuming DP // passes through the triaxial compression corners of the MC surface. diff --git a/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp b/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp index bbf756dc2ea..1247679ddb6 100644 --- a/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp +++ b/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp @@ -119,23 +119,23 @@ void DruckerPragerExtended::postInputInitialization() ElasticIsotropic::postInputInitialization(); GEOS_THROW_IF( m_defaultCohesion < 0, - getFullName() << ": Negative cohesion value detected", - InputError, getDataContext() ); + getFullName() << ": Negative cohesion value detected", + InputError, getDataContext() ); GEOS_THROW_IF( m_defaultInitialFrictionAngle < 0, - getFullName() << ": Negative initial friction angle detected", - InputError, getDataContext() ); + getFullName() << ": Negative initial friction angle detected", + InputError, getDataContext() ); GEOS_THROW_IF( m_defaultResidualFrictionAngle < 0, - getFullName() << ": Negative residual friction angle detected", - InputError, getDataContext() ); + getFullName() << ": Negative residual friction angle detected", + InputError, getDataContext() ); GEOS_THROW_IF( m_defaultDilationRatio < 0, - getFullName() << ": Dilation ratio out of [0,1] range detected", - InputError, getDataContext() ); + getFullName() << ": Dilation ratio out of [0,1] range detected", + InputError, getDataContext() ); GEOS_THROW_IF( m_defaultDilationRatio > 1, - getFullName() << ": Dilation ratio out of [0,1] range detected", - InputError, getDataContext() ); + getFullName() << ": Dilation ratio out of [0,1] range detected", + InputError, getDataContext() ); GEOS_THROW_IF( m_defaultHardening < 0, - getFullName() << ": Negative hardening parameter detected", - InputError, getDataContext() ); + getFullName() << ": Negative hardening parameter detected", + InputError, getDataContext() ); // convert from Mohr-Coulomb constants to Drucker-Prager constants, assuming DP // passes through the triaxial tension corners of the MC surface. diff --git a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp index f11c4f7559d..4f8e29b2227 100644 --- a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp +++ b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp @@ -105,12 +105,12 @@ void ElasticIsotropicPressureDependent::postInputInitialization() GEOS_ERROR_IF( numConstantsSpecified != 2, getFullName() << ": A specific pair of elastic constants is required: (Cr, G). " ); GEOS_THROW_IF( m_defaultRecompressionIndex <= 0, - getFullName() << ": Non-positive recompression index detected " << m_defaultRecompressionIndex, - InputError, getDataContext() ); + getFullName() << ": Non-positive recompression index detected " << m_defaultRecompressionIndex, + InputError, getDataContext() ); real64 poisson = conversions::bulkModAndShearMod::toPoissonRatio( -1 * m_defaultRefPressure / m_defaultRecompressionIndex, m_defaultShearModulus ); GEOS_THROW_IF( poisson < 0, - getFullName() << ": Elastic parameters lead to negative Poisson ratio at reference pressure ", - InputError, getDataContext() ); + getFullName() << ": Elastic parameters lead to negative Poisson ratio at reference pressure ", + InputError, getDataContext() ); // set results as array default values diff --git a/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp b/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp index c220d161b37..6720663ed56 100644 --- a/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp +++ b/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp @@ -92,14 +92,14 @@ void ModifiedCamClay::postInputInitialization() ElasticIsotropicPressureDependent::postInputInitialization(); GEOS_THROW_IF( m_defaultCslSlope <= 0, - getFullName() << ": Non-positive slope of critical state line detected", - InputError, getDataContext() ); + getFullName() << ": Non-positive slope of critical state line detected", + InputError, getDataContext() ); GEOS_THROW_IF( m_defaultVirginCompressionIndex <= 0, - getFullName() << ": Non-positive virgin compression index detected", - InputError, getDataContext() ); + getFullName() << ": Non-positive virgin compression index detected", + InputError, getDataContext() ); GEOS_THROW_IF( m_defaultVirginCompressionIndex <= m_defaultRecompressionIndex, - getFullName() << ": Recompression index should exceed virgin recompression index", - InputError, getDataContext() ); + getFullName() << ": Recompression index should exceed virgin recompression index", + InputError, getDataContext() ); // set results as array default values diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp index 76aab05e9d0..a1d612e62dd 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp @@ -63,11 +63,11 @@ void MultiPhaseConstantThermalConductivity::allocateConstitutiveData( dataReposi void MultiPhaseConstantThermalConductivity::postInputInitialization() { GEOS_THROW_IF( m_thermalConductivityComponents[0] < 0 || - m_thermalConductivityComponents[1] < 0 || - m_thermalConductivityComponents[2] < 0, - GEOS_FMT( "{}: the components of the thermal conductivity tensor must be non-negative", - getFullName() ), - InputError, getDataContext() ); + m_thermalConductivityComponents[1] < 0 || + m_thermalConductivityComponents[2] < 0, + GEOS_FMT( "{}: the components of the thermal conductivity tensor must be non-negative", + getFullName() ), + InputError, getDataContext() ); } REGISTER_CATALOG_ENTRY( ConstitutiveBase, MultiPhaseConstantThermalConductivity, string const &, Group * const ) diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp index 16ac004ff9e..b0c97363172 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp @@ -75,18 +75,18 @@ void MultiPhaseVolumeWeightedThermalConductivity::allocateConstitutiveData( data void MultiPhaseVolumeWeightedThermalConductivity::postInputInitialization() { GEOS_THROW_IF( m_rockThermalConductivityComponents[0] <= 0 || - m_rockThermalConductivityComponents[1] <= 0 || - m_rockThermalConductivityComponents[2] <= 0, - GEOS_FMT( "{}: the components of the rock thermal conductivity tensor must be strictly positive", - getFullName() ), - InputError, getDataContext() ); + m_rockThermalConductivityComponents[1] <= 0 || + m_rockThermalConductivityComponents[2] <= 0, + GEOS_FMT( "{}: the components of the rock thermal conductivity tensor must be strictly positive", + getFullName() ), + InputError, getDataContext() ); for( integer ip = 0; ip < numFluidPhases(); ++ip ) { GEOS_THROW_IF( m_phaseThermalConductivity[ip] <= 0, - GEOS_FMT( "{}: the phase thermal conductivity for phase {} must be strictly positive", - getFullName(), ip ), - InputError, getDataContext() ); + GEOS_FMT( "{}: the phase thermal conductivity for phase {} must be strictly positive", + getFullName(), ip ), + InputError, getDataContext() ); } } diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp index 87da90a3383..08672e86fb4 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp @@ -119,11 +119,11 @@ void SinglePhaseThermalConductivity::allocateConstitutiveData( dataRepository::G void SinglePhaseThermalConductivity::postInputInitialization() { GEOS_THROW_IF( m_defaultThermalConductivityComponents[0] <= 0 || - m_defaultThermalConductivityComponents[1] <= 0 || - m_defaultThermalConductivityComponents[2] <= 0, - GEOS_FMT( "{}: the components of the default thermal conductivity tensor must be strictly positive", - getFullName() ), - InputError, getDataContext() ); + m_defaultThermalConductivityComponents[1] <= 0 || + m_defaultThermalConductivityComponents[2] <= 0, + GEOS_FMT( "{}: the components of the default thermal conductivity tensor must be strictly positive", + getFullName() ), + InputError, getDataContext() ); } diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp index 4fd652465ce..db232e5c37d 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp @@ -103,31 +103,31 @@ void PVTDriver::postInputInitialization() { // Validate some inputs GEOS_ERROR_IF( m_outputMassDensity != 0 && m_outputMassDensity != 1, - getWrapperDataContext( viewKeyStruct::outputMassDensityString() ) << - ": option can be either 0 (false) or 1 (true)", - getWrapperDataContext( viewKeyStruct::outputMassDensityString() ) ); + getWrapperDataContext( viewKeyStruct::outputMassDensityString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::outputMassDensityString() ) ); GEOS_ERROR_IF( m_outputCompressibility != 0 && m_outputCompressibility != 1, - getWrapperDataContext( viewKeyStruct::outputCompressibilityString() ) << - ": option can be either 0 (false) or 1 (true)", - getWrapperDataContext( viewKeyStruct::outputCompressibilityString() ) ); + getWrapperDataContext( viewKeyStruct::outputCompressibilityString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::outputCompressibilityString() ) ); GEOS_ERROR_IF( m_outputPhaseComposition != 0 && m_outputPhaseComposition != 1, - getWrapperDataContext( viewKeyStruct::outputPhaseCompositionString() ) << - ": option can be either 0 (false) or 1 (true)", - getWrapperDataContext( viewKeyStruct::outputPhaseCompositionString() ) ); + getWrapperDataContext( viewKeyStruct::outputPhaseCompositionString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::outputPhaseCompositionString() ) ); GEOS_WARNING_IF( m_precision < minPrecision, - GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", - getWrapperDataContext( viewKeyStruct::precisionString() ), - minPrecision, maxPrecision, minPrecision ), - getWrapperDataContext( viewKeyStruct::precisionString() )); + GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", + getWrapperDataContext( viewKeyStruct::precisionString() ), + minPrecision, maxPrecision, minPrecision ), + getWrapperDataContext( viewKeyStruct::precisionString() )); GEOS_WARNING_IF( maxPrecision < m_precision, - GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", - getWrapperDataContext( viewKeyStruct::precisionString() ), - minPrecision, maxPrecision, maxPrecision ), - getWrapperDataContext( viewKeyStruct::precisionString() ) ); + GEOS_FMT( "{}: option should be between {} and {}. A value of {} will be used.", + getWrapperDataContext( viewKeyStruct::precisionString() ), + minPrecision, maxPrecision, maxPrecision ), + getWrapperDataContext( viewKeyStruct::precisionString() ) ); // get number of phases and components diff --git a/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp b/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp index 6a5670faeba..73bea40106f 100644 --- a/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp @@ -151,12 +151,12 @@ void TriaxialDriver::postInputInitialization() // may overwrite it. GEOS_THROW_IF( !isEqual( m_initialStress, m_table( 0, SIG0 ), 1e-6 ), - getDataContext() << ": Initial stress values indicated by initialStress and axialFunction(time=0) appear inconsistent", - InputError, getDataContext() ); + getDataContext() << ": Initial stress values indicated by initialStress and axialFunction(time=0) appear inconsistent", + InputError, getDataContext() ); GEOS_THROW_IF( !isEqual( m_initialStress, m_table( 0, SIG1 ), 1e-6 ), - getDataContext() << ": Initial stress values indicated by initialStress and radialFunction(time=0) appear inconsistent", - InputError, getDataContext() ); + getDataContext() << ": Initial stress values indicated by initialStress and radialFunction(time=0) appear inconsistent", + InputError, getDataContext() ); } diff --git a/src/coreComponents/dataRepository/Group.cpp b/src/coreComponents/dataRepository/Group.cpp index 8af7997698a..2ae81bff09b 100644 --- a/src/coreComponents/dataRepository/Group.cpp +++ b/src/coreComponents/dataRepository/Group.cpp @@ -77,8 +77,8 @@ WrapperBase & Group::registerWrapper( std::unique_ptr< WrapperBase > wrapper ) void Group::deregisterWrapper( string const & name ) { GEOS_ERROR_IF( !hasWrapper( name ), - "Wrapper " << name << " doesn't exist in Group" << getDataContext() << '.', - getDataContext() ); + "Wrapper " << name << " doesn't exist in Group" << getDataContext() << '.', + getDataContext() ); m_wrappers.erase( name ); m_conduitNode.remove( name ); } @@ -247,12 +247,12 @@ void Group::processInputFile( xmlWrapper::xmlNode const & targetNode, if( !xmlWrapper::isFileMetadataAttribute( attributeName ) ) { GEOS_THROW_IF( processedAttributes.count( attributeName ) == 0, - GEOS_FMT( "Error in {}: XML Node at '{}' contains unused attribute '{}'.\n" - "Valid attributes are:\n{}\nFor more details, please refer to documentation at:\n" - "http://geosx-geosx.readthedocs-hosted.com/en/latest/docs/sphinx/userGuide/Index.html", - getDataContext(), targetNode.path(), attributeName, - dumpInputOptions() ), - InputError, getDataContext() ); + GEOS_FMT( "Error in {}: XML Node at '{}' contains unused attribute '{}'.\n" + "Valid attributes are:\n{}\nFor more details, please refer to documentation at:\n" + "http://geosx-geosx.readthedocs-hosted.com/en/latest/docs/sphinx/userGuide/Index.html", + getDataContext(), targetNode.path(), attributeName, + dumpInputOptions() ), + InputError, getDataContext() ); } } } diff --git a/src/coreComponents/dataRepository/Group.hpp b/src/coreComponents/dataRepository/Group.hpp index b9b17a6de40..bf185a656ef 100644 --- a/src/coreComponents/dataRepository/Group.hpp +++ b/src/coreComponents/dataRepository/Group.hpp @@ -319,14 +319,14 @@ class Group { Group * const child = m_subGroups[ key ]; GEOS_THROW_IF( child == nullptr, - "Group " << getDataContext() << " has no child named " << key << std::endl - << dumpSubGroupsNames(), - std::domain_error, getDataContext() ); + "Group " << getDataContext() << " has no child named " << key << std::endl + << dumpSubGroupsNames(), + std::domain_error, getDataContext() ); T * const castedChild = dynamicCast< T * >( child ); GEOS_THROW_IF( castedChild == nullptr, - GEOS_FMT( "{} was expected to be a '{}'.", - child->getDataContext(), LvArray::system::demangleType< T >() ), - BadTypeError, child->getDataContext() ); + GEOS_FMT( "{} was expected to be a '{}'.", + child->getDataContext(), LvArray::system::demangleType< T >() ), + BadTypeError, child->getDataContext() ); return *castedChild; } @@ -338,14 +338,14 @@ class Group { Group const * const child = m_subGroups[ key ]; GEOS_THROW_IF( child == nullptr, - "Group " << getDataContext() << " has no child named " << key << std::endl - << dumpSubGroupsNames(), - std::domain_error, getDataContext() ); + "Group " << getDataContext() << " has no child named " << key << std::endl + << dumpSubGroupsNames(), + std::domain_error, getDataContext() ); T const * const castedChild = dynamicCast< T const * >( child ); GEOS_THROW_IF( castedChild == nullptr, - GEOS_FMT( "{} was expected to be a '{}'.", - child->getDataContext(), LvArray::system::demangleType< T >() ), - BadTypeError, child->getDataContext() ); + GEOS_FMT( "{} was expected to be a '{}'.", + child->getDataContext(), LvArray::system::demangleType< T >() ), + BadTypeError, child->getDataContext() ); return *castedChild; } @@ -1124,9 +1124,9 @@ class Group { WrapperBase const * const wrapper = m_wrappers[ key ]; GEOS_THROW_IF( wrapper == nullptr, - "Group " << getDataContext() << " has no wrapper named " << key << std::endl - << dumpWrappersNames(), - std::domain_error, getDataContext() ); + "Group " << getDataContext() << " has no wrapper named " << key << std::endl + << dumpWrappersNames(), + std::domain_error, getDataContext() ); return *wrapper; } @@ -1139,9 +1139,9 @@ class Group { WrapperBase * const wrapper = m_wrappers[ key ]; GEOS_THROW_IF( wrapper == nullptr, - "Group " << getDataContext() << " has no wrapper named " << key << std::endl - << dumpWrappersNames(), - std::domain_error, getDataContext() ); + "Group " << getDataContext() << " has no wrapper named " << key << std::endl + << dumpWrappersNames(), + std::domain_error, getDataContext() ); return *wrapper; } @@ -1364,8 +1364,8 @@ class Group Group & getParent() { GEOS_THROW_IF( m_parent == nullptr, - "Group at " << getDataContext() << " does not have a parent.", - std::domain_error, getDataContext() ); + "Group at " << getDataContext() << " does not have a parent.", + std::domain_error, getDataContext() ); return *m_parent; } @@ -1375,8 +1375,8 @@ class Group Group const & getParent() const { GEOS_THROW_IF( m_parent == nullptr, - "Group at " << getDataContext() << " does not have a parent.", - std::domain_error, getDataContext() ); + "Group at " << getDataContext() << " does not have a parent.", + std::domain_error, getDataContext() ); return *m_parent; } diff --git a/src/coreComponents/events/PeriodicEvent.cpp b/src/coreComponents/events/PeriodicEvent.cpp index 1b3b454750d..4a5a1c64db5 100644 --- a/src/coreComponents/events/PeriodicEvent.cpp +++ b/src/coreComponents/events/PeriodicEvent.cpp @@ -270,19 +270,19 @@ void PeriodicEvent::validate() const constexpr auto determinesTimeStepSize = ExecutableGroup::TimesteppingBehavior::DeterminesTimeStepSize; GEOS_THROW_IF( m_timeFrequency > 0 && target->getTimesteppingBehavior() == determinesTimeStepSize, - GEOS_FMT( "`{}`: This event targets an object that automatically selects the time " - "step size. Therefore, `{}` cannot be used here. However, forcing a " - "constant time step size can still be achived with `{}`.", - getDataContext(), viewKeyStruct::timeFrequencyString(), - EventBase::viewKeyStruct::forceDtString() ), - InputError, getDataContext() ); + GEOS_FMT( "`{}`: This event targets an object that automatically selects the time " + "step size. Therefore, `{}` cannot be used here. However, forcing a " + "constant time step size can still be achived with `{}`.", + getDataContext(), viewKeyStruct::timeFrequencyString(), + EventBase::viewKeyStruct::forceDtString() ), + InputError, getDataContext() ); GEOS_THROW_IF( m_cycleFrequency != 1 && target->getTimesteppingBehavior() == determinesTimeStepSize, - GEOS_FMT( "`{}`: This event targets an object that automatically selects the time " - "step size. Therefore, `{}` cannot be used here. However, forcing a " - "constant time step size can still be achived with `{}`.", - getDataContext(), viewKeyStruct::cycleFrequencyString(), - EventBase::viewKeyStruct::forceDtString() ), - InputError, getDataContext() ); + GEOS_FMT( "`{}`: This event targets an object that automatically selects the time " + "step size. Therefore, `{}` cannot be used here. However, forcing a " + "constant time step size can still be achived with `{}`.", + getDataContext(), viewKeyStruct::cycleFrequencyString(), + EventBase::viewKeyStruct::forceDtString() ), + InputError, getDataContext() ); } REGISTER_CATALOG_ENTRY( EventBase, PeriodicEvent, string const &, Group * const ) diff --git a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp index 3fd96e3294f..667e2ecc682 100644 --- a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp @@ -127,17 +127,17 @@ void AquiferBoundaryCondition::postInputInitialization() { FunctionManager const & functionManager = FunctionManager::getInstance(); GEOS_THROW_IF( !functionManager.hasGroup( m_pressureInfluenceFunctionName ), - getCatalogName() << " " << getDataContext() << - ": the pressure influence table " << m_pressureInfluenceFunctionName << " could not be found", - InputError, getDataContext() ); + getCatalogName() << " " << getDataContext() << + ": the pressure influence table " << m_pressureInfluenceFunctionName << " could not be found", + InputError, getDataContext() ); TableFunction const & pressureInfluenceFunction = functionManager.getGroup< TableFunction >( m_pressureInfluenceFunctionName ); GEOS_THROW_IF( pressureInfluenceFunction.getInterpolationMethod() != TableFunction::InterpolationType::Linear, - getCatalogName() << " " << getDataContext() << - ": The interpolation method for the pressure influence function table " << - pressureInfluenceFunction.getDataContext() << - " should be TableFunction::InterpolationType::Linear", - InputError, getDataContext() ); + getCatalogName() << " " << getDataContext() << + ": The interpolation method for the pressure influence function table " << + pressureInfluenceFunction.getDataContext() << + " should be TableFunction::InterpolationType::Linear", + InputError, getDataContext() ); } computeTimeConstant(); diff --git a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp index 23ba631b8f1..48d5c262a42 100644 --- a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp +++ b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp @@ -94,49 +94,49 @@ void EquilibriumInitialCondition::postInputInitialization() { GEOS_THROW_IF( ( m_temperatureVsElevationTableName.empty() != m_componentFractionVsElevationTableNames.empty() ), - getCatalogName() << " " << getDataContext() << ": both " << - viewKeyStruct::componentFractionVsElevationTableNamesString() << " and " << - viewKeyStruct::temperatureVsElevationTableNameString() << " must be provided for a multiphase simulation", - InputError, getDataContext() ); + getCatalogName() << " " << getDataContext() << ": both " << + viewKeyStruct::componentFractionVsElevationTableNamesString() << " and " << + viewKeyStruct::temperatureVsElevationTableNameString() << " must be provided for a multiphase simulation", + InputError, getDataContext() ); FunctionManager const & functionManager = FunctionManager::getInstance(); if( !m_componentFractionVsElevationTableNames.empty() ) { GEOS_THROW_IF( m_componentFractionVsElevationTableNames.size() <= 1, - getCatalogName() << " " << getDataContext() << - ": at least two component names must be specified in " << viewKeyStruct::componentNamesString(), - InputError, getDataContext() ); + getCatalogName() << " " << getDataContext() << + ": at least two component names must be specified in " << viewKeyStruct::componentNamesString(), + InputError, getDataContext() ); GEOS_THROW_IF( m_componentFractionVsElevationTableNames.size() != m_componentNames.size(), - getCatalogName() << " " << getDataContext() << ": mismatch between the size of " << - viewKeyStruct::componentNamesString() << - " and " << viewKeyStruct::componentFractionVsElevationTableNamesString(), - InputError, getDataContext() ); + getCatalogName() << " " << getDataContext() << ": mismatch between the size of " << + viewKeyStruct::componentNamesString() << + " and " << viewKeyStruct::componentFractionVsElevationTableNamesString(), + InputError, getDataContext() ); GEOS_THROW_IF( m_componentNames.size() >= 2 && m_initPhaseName.empty(), - getCatalogName() << " " << getDataContext() << ": for now, the keyword: " << - viewKeyStruct::initPhaseNameString() << " must be filled for a multiphase simulation", - InputError, getDataContext() ); + getCatalogName() << " " << getDataContext() << ": for now, the keyword: " << + viewKeyStruct::initPhaseNameString() << " must be filled for a multiphase simulation", + InputError, getDataContext() ); array1d< localIndex > tableSizes( m_componentNames.size() ); for( size_t ic = 0; ic < m_componentNames.size(); ++ic ) { GEOS_THROW_IF( m_componentFractionVsElevationTableNames[ic].empty(), - getCatalogName() << " " << getDataContext() << - ": the component fraction vs elevation table name is missing for component " << ic, - InputError, getDataContext() ); + getCatalogName() << " " << getDataContext() << + ": the component fraction vs elevation table name is missing for component " << ic, + InputError, getDataContext() ); GEOS_THROW_IF( !m_componentFractionVsElevationTableNames[ic].empty() && - !functionManager.hasGroup( m_componentFractionVsElevationTableNames[ic] ), - getCatalogName() << " " << getDataContext() << ": the component fraction vs elevation table " << - m_componentFractionVsElevationTableNames[ic] << " could not be found" << " for component " << ic, - InputError, getDataContext() ); + !functionManager.hasGroup( m_componentFractionVsElevationTableNames[ic] ), + getCatalogName() << " " << getDataContext() << ": the component fraction vs elevation table " << + m_componentFractionVsElevationTableNames[ic] << " could not be found" << " for component " << ic, + InputError, getDataContext() ); TableFunction const & compFracTable = functionManager.getGroup< TableFunction >( m_componentFractionVsElevationTableNames[ic] ); GEOS_THROW_IF( compFracTable.getInterpolationMethod() != TableFunction::InterpolationType::Linear, - getCatalogName() << " " << getDataContext() << - ": the interpolation method for the component fraction vs elevation table " << - compFracTable.getName() << " should be TableFunction::InterpolationType::Linear", - InputError, getDataContext() ); + getCatalogName() << " " << getDataContext() << + ": the interpolation method for the component fraction vs elevation table " << + compFracTable.getName() << " should be TableFunction::InterpolationType::Linear", + InputError, getDataContext() ); } } @@ -145,16 +145,16 @@ void EquilibriumInitialCondition::postInputInitialization() { GEOS_THROW_IF( !functionManager.hasGroup( m_temperatureVsElevationTableName ), - getCatalogName() << " " << getDataContext() << ": the temperature vs elevation table " << - m_temperatureVsElevationTableName << " could not be found", - InputError, getDataContext() ); + getCatalogName() << " " << getDataContext() << ": the temperature vs elevation table " << + m_temperatureVsElevationTableName << " could not be found", + InputError, getDataContext() ); TableFunction const & tempTable = functionManager.getGroup< TableFunction >( m_temperatureVsElevationTableName ); GEOS_THROW_IF( tempTable.getInterpolationMethod() != TableFunction::InterpolationType::Linear, - getCatalogName() << " " << getDataContext() << - ": The interpolation method for the temperature vs elevation table " << tempTable.getName() << - " should be TableFunction::InterpolationType::Linear", - InputError, getDataContext() ); + getCatalogName() << " " << getDataContext() << + ": The interpolation method for the temperature vs elevation table " << tempTable.getName() << + " should be TableFunction::InterpolationType::Linear", + InputError, getDataContext() ); } } @@ -172,18 +172,18 @@ void EquilibriumInitialCondition::initializePreSubGroups() TableFunction const & compFracTable = functionManager.getGroup< TableFunction >( m_componentFractionVsElevationTableNames[ic] ); arrayView1d< real64 const > compFracValues = compFracTable.getValues(); GEOS_THROW_IF( compFracValues.size() <= 1, - getCatalogName() << " " << getDataContext() << - ": the component fraction vs elevation table " << compFracTable.getName() << - " must contain at least two values", - InputError, getDataContext() ); + getCatalogName() << " " << getDataContext() << + ": the component fraction vs elevation table " << compFracTable.getName() << + " must contain at least two values", + InputError, getDataContext() ); tableSizes[ic] = compFracValues.size(); if( ic >= 1 ) { GEOS_THROW_IF( tableSizes[ic] != tableSizes[ic-1], - getCatalogName() << " " << getDataContext() << - ": all the component fraction vs elevation tables must contain the same number of values", - InputError, getDataContext() ); + getCatalogName() << " " << getDataContext() << + ": all the component fraction vs elevation tables must contain the same number of values", + InputError, getDataContext() ); } } @@ -203,17 +203,17 @@ void EquilibriumInitialCondition::initializePreSubGroups() if( ic >= 1 ) { GEOS_THROW_IF( !isZero( elevation[ic][i] - elevation[ic-1][i] ), - getCatalogName() << " " << getDataContext() << - ": the elevation values must be the same in all the component vs elevation tables", - InputError, getDataContext() ); + getCatalogName() << " " << getDataContext() << + ": the elevation values must be the same in all the component vs elevation tables", + InputError, getDataContext() ); } if( ic == m_componentNames.size() - 1 ) { GEOS_THROW_IF( !isZero( sumCompFrac[i] - 1 ), - getCatalogName() << " " << getDataContext() << - ": at a given elevation, the component fraction sum must be equal to one", - InputError, getDataContext() ); + getCatalogName() << " " << getDataContext() << + ": at a given elevation, the component fraction sum must be equal to one", + InputError, getDataContext() ); } } } diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp index 1682563191d..913a995ce66 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp @@ -1,4 +1,4 @@ -/* +F/* * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * diff --git a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp index 7d85dc89dd0..11f1b683b04 100644 --- a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp +++ b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp @@ -79,17 +79,17 @@ PerfectlyMatchedLayer::PerfectlyMatchedLayer( string const & name, Group * const void PerfectlyMatchedLayer::postInputInitialization() { GEOS_THROW_IF( (m_xMax[0]1), - getCatalogName() << " " << getDataContext() << " " - << viewKeyStruct::reflectivityString() - << " must satisfy 0 < reflectivity <= 1", - InputError, getDataContext() ); + getCatalogName() << " " << getDataContext() << " " + << viewKeyStruct::reflectivityString() + << " must satisfy 0 < reflectivity <= 1", + InputError, getDataContext() ); GEOS_LOG_RANK_0_IF( (m_xMin[0]( getDirection() ) < 1e-20, - getDataContext() << ": " << viewKeyStruct::directionString() << " is required for " << - viewKeyStruct::tractionTypeString() << " = " << TractionType::vector << - ", but appears to be unspecified", - getDataContext() ); + getDataContext() << ": " << viewKeyStruct::directionString() << " is required for " << + viewKeyStruct::tractionTypeString() << " = " << TractionType::vector << + ", but appears to be unspecified", + getDataContext() ); } else { @@ -99,9 +99,9 @@ void TractionBoundaryCondition::postInputInitialization() ", so value of " << viewKeyStruct::inputStressString() << " is unused." ); GEOS_ERROR_IF( !inputStressRead && m_tractionType == TractionType::stress, - getDataContext() << ": " << viewKeyStruct::tractionTypeString() << " = " << TractionType::stress << - ", but " << viewKeyStruct::inputStressString() << " is not specified.", - getDataContext() ); + getDataContext() << ": " << viewKeyStruct::tractionTypeString() << " = " << TractionType::stress << + ", but " << viewKeyStruct::inputStressString() << " is not specified.", + getDataContext() ); // localIndex const numStressFunctionsNames = m_stressFunctionNames.size(); diff --git a/src/coreComponents/fileIO/Outputs/SiloOutput.cpp b/src/coreComponents/fileIO/Outputs/SiloOutput.cpp index 99f25618374..7d93495048f 100644 --- a/src/coreComponents/fileIO/Outputs/SiloOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/SiloOutput.cpp @@ -97,10 +97,10 @@ void SiloOutput::postInputInitialization() string const onlyPlotSpecifiedFieldNamesString = viewKeysStruct::onlyPlotSpecifiedFieldNames; GEOS_THROW_IF( ( m_onlyPlotSpecifiedFieldNames != 0 ) && m_fieldNames.empty(), - GEOS_FMT( "{} `{}`: the flag `{}` is different from zero, but `{}` is empty, which is inconsistent", - catalogName(), getDataContext(), - onlyPlotSpecifiedFieldNamesString, fieldNamesString ), - InputError, getDataContext() ); + GEOS_FMT( "{} `{}`: the flag `{}` is different from zero, but `{}` is empty, which is inconsistent", + catalogName(), getDataContext(), + onlyPlotSpecifiedFieldNamesString, fieldNamesString ), + InputError, getDataContext() ); GEOS_LOG_RANK_0_IF( !m_fieldNames.empty() && ( m_onlyPlotSpecifiedFieldNames != 0 ), GEOS_FMT( diff --git a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp index 75fcf6ed2d6..5f617298ad5 100644 --- a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp @@ -120,10 +120,10 @@ void VTKOutput::postInputInitialization() string const onlyPlotSpecifiedFieldNamesString = viewKeysStruct::onlyPlotSpecifiedFieldNames; GEOS_THROW_IF( ( m_onlyPlotSpecifiedFieldNames != 0 ) && m_fieldNames.empty(), - GEOS_FMT( "{} `{}`: the flag `{}` is different from zero, but `{}` is empty, which is inconsistent", - catalogName(), getDataContext(), - onlyPlotSpecifiedFieldNamesString, fieldNamesString ), - InputError, getDataContext() ); + GEOS_FMT( "{} `{}`: the flag `{}` is different from zero, but `{}` is empty, which is inconsistent", + catalogName(), getDataContext(), + onlyPlotSpecifiedFieldNamesString, fieldNamesString ), + InputError, getDataContext() ); GEOS_LOG_RANK_0_IF( !m_fieldNames.empty() && ( m_onlyPlotSpecifiedFieldNames != 0 ), GEOS_FMT( @@ -138,9 +138,9 @@ void VTKOutput::postInputInitialization() std::to_string( m_fieldNames.size() ), fieldNamesString, m_plotLevel ) ); GEOS_ERROR_IF( m_writeFaceElementsAs3D, - GEOS_FMT( "{} `{}`: 3D vtk plot of faceElements is not yet supported.", - catalogName(), getDataContext() ), - getDataContext() ); + GEOS_FMT( "{} `{}`: 3D vtk plot of faceElements is not yet supported.", + catalogName(), getDataContext() ), + getDataContext() ); } diff --git a/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp b/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp index 2044d529edb..be6a5716b43 100644 --- a/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp +++ b/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp @@ -63,8 +63,8 @@ FiniteElementDiscretization::~FiniteElementDiscretization() void FiniteElementDiscretization::postInputInitialization() { GEOS_ERROR_IF( m_useVem < 0 || m_useVem > 1, - getDataContext() << ": The flag useVirtualElements can be either 0 or 1", - getDataContext() ); + getDataContext() << ": The flag useVirtualElements can be either 0 or 1", + getDataContext() ); } std::unique_ptr< FiniteElementBase > @@ -206,9 +206,9 @@ FiniteElementDiscretization::factory( ElementType const parentElementShape ) con #if !defined( GEOS_USE_HIP ) case ElementType::Hexahedron: GEOS_ERROR_IF( m_formulation != Formulation::SEM, - getDataContext() << ": Element type Hexahedron with order 2 available" << - " only when using the Spectral Element Method", - getDataContext() ); + getDataContext() << ": Element type Hexahedron with order 2 available" << + " only when using the Spectral Element Method", + getDataContext() ); return std::make_unique< Q2_Hexahedron_Lagrange_GaussLobatto >(); #else GEOS_ERROR( "Cannot compile this with HIP active." ); @@ -234,9 +234,9 @@ FiniteElementDiscretization::factory( ElementType const parentElementShape ) con #if !defined( GEOS_USE_HIP ) case ElementType::Hexahedron: GEOS_ERROR_IF( m_formulation != Formulation::SEM, - getDataContext() << ": Element type Hexahedron with order 3 available" << - " only when using the Spectral Element Method", - getDataContext() ); + getDataContext() << ": Element type Hexahedron with order 3 available" << + " only when using the Spectral Element Method", + getDataContext() ); return std::make_unique< Q3_Hexahedron_Lagrange_GaussLobatto >(); #else GEOS_ERROR( "Cannot compile this with HIP active." ); @@ -262,9 +262,9 @@ FiniteElementDiscretization::factory( ElementType const parentElementShape ) con #if !defined( GEOS_USE_HIP ) case ElementType::Hexahedron: GEOS_ERROR_IF( m_formulation != Formulation::SEM, - getDataContext() << ": Element type Hexahedron with order 4 available only" << - " when using the Spectral Element Method", - getDataContext() ); + getDataContext() << ": Element type Hexahedron with order 4 available only" << + " when using the Spectral Element Method", + getDataContext() ); return std::make_unique< Q4_Hexahedron_Lagrange_GaussLobatto >(); #else GEOS_ERROR( "Cannot compile this with HIP active." ); @@ -290,9 +290,9 @@ FiniteElementDiscretization::factory( ElementType const parentElementShape ) con #if !defined( GEOS_USE_HIP ) case ElementType::Hexahedron: GEOS_ERROR_IF( m_formulation != Formulation::SEM, - getDataContext() << ": Element type Hexahedron with order 5 available only" << - " when using the Spectral Element Method", - getDataContext() ); + getDataContext() << ": Element type Hexahedron with order 5 available only" << + " when using the Spectral Element Method", + getDataContext() ); return std::make_unique< Q5_Hexahedron_Lagrange_GaussLobatto >(); #else GEOS_ERROR( "Cannot compile this with HIP active." ); diff --git a/src/coreComponents/functions/MultivariableTableFunction.cpp b/src/coreComponents/functions/MultivariableTableFunction.cpp index 1df8eb50d9f..cd7eca72b66 100644 --- a/src/coreComponents/functions/MultivariableTableFunction.cpp +++ b/src/coreComponents/functions/MultivariableTableFunction.cpp @@ -36,7 +36,7 @@ void MultivariableTableFunction::initializeFunctionFromFile( string const & file { std::ifstream file( filename.c_str() ); GEOS_THROW_IF( !file, catalogName() << " " << getDataContext() << ": could not read input file " << filename, - InputError, getDataContext() ); + InputError, getDataContext() ); integer numDims, numOps; globalIndex numPointsTotal = 1; @@ -69,14 +69,14 @@ void MultivariableTableFunction::initializeFunctionFromFile( string const & file { file >> axisPoints[i]; GEOS_THROW_IF( !file, catalogName() << " " << getDataContext() << ": can`t read the number of points for axis " + std::to_string( i ), - InputError, getDataContext() ); + InputError, getDataContext() ); GEOS_THROW_IF_LE_MSG( axisPoints[i], 1, catalogName() << " " << getDataContext() << ": minimum 2 discretization point per axis are expected", InputError ); file >> axisMinimums[i]; GEOS_THROW_IF( !file, catalogName() << " " << getDataContext() << ": can`t read minimum value for axis " + std::to_string( i ), - InputError, getDataContext() ); + InputError, getDataContext() ); file >> axisMaximums[i]; GEOS_THROW_IF( !file, catalogName() << " " << getDataContext() << ": can`t read maximum value for axis " + std::to_string( i ), - InputError, getDataContext() ); + InputError, getDataContext() ); GEOS_THROW_IF_LT_MSG( axisMaximums[i], axisMinimums[i], catalogName() << " " << getDataContext() << ": maximum axis value is expected to be larger than minimum", InputError ); numPointsTotal *= axisPoints[i]; @@ -100,14 +100,14 @@ void MultivariableTableFunction::initializeFunctionFromFile( string const & file { file >> m_pointData[i * numOps + j]; GEOS_THROW_IF( !file, catalogName() << " " << getDataContext() << ": table file is shorter than expected", - InputError, getDataContext() ); + InputError, getDataContext() ); } } real64 value; file >> value; GEOS_THROW_IF( file, catalogName() << " " << getDataContext() << ": table file is longer than expected", - InputError, getDataContext() ); + InputError, getDataContext() ); file.close(); diff --git a/src/coreComponents/functions/TableFunction.cpp b/src/coreComponents/functions/TableFunction.cpp index caae1662332..ed8841604c0 100644 --- a/src/coreComponents/functions/TableFunction.cpp +++ b/src/coreComponents/functions/TableFunction.cpp @@ -102,9 +102,9 @@ void TableFunction::setTableCoordinates( array1d< real64_array > const & coordin for( localIndex j = 1; j < coordinates[i].size(); ++j ) { GEOS_THROW_IF( coordinates[i][j] - coordinates[i][j-1] <= 0, - GEOS_FMT( "{} {}: coordinates must be strictly increasing, but axis {} is not", - catalogName(), getDataContext(), i ), - InputError, getDataContext() ); + GEOS_FMT( "{} {}: coordinates must be strictly increasing, but axis {} is not", + catalogName(), getDataContext(), i ), + InputError, getDataContext() ); } m_coordinates.appendArray( coordinates[i].begin(), coordinates[i].end() ); } @@ -164,9 +164,9 @@ void TableFunction::reInitializeFunction() for( localIndex j = 1; j < m_coordinates[ii].size(); ++j ) { GEOS_THROW_IF( m_coordinates[ii][j] - m_coordinates[ii][j-1] <= 0, - GEOS_FMT( "{} {}: coordinates must be strictly increasing, but axis {} is not", - catalogName(), getDataContext(), ii ), - InputError, getDataContext() ); + GEOS_FMT( "{} {}: coordinates must be strictly increasing, but axis {} is not", + catalogName(), getDataContext(), ii ), + InputError, getDataContext() ); } } if( m_coordinates.size() > 0 && !m_values.empty() ) // coordinates and values have been set @@ -184,18 +184,18 @@ void TableFunction::reInitializeFunction() void TableFunction::checkCoord( real64 const coord, localIndex const dim ) const { GEOS_THROW_IF( dim >= m_coordinates.size() || dim < 0, - GEOS_FMT( "{}: The {} dimension ( no. {} ) doesn't exist in the table.", - getDataContext(), units::getDescription( getDimUnit( dim ) ), dim ), - SimulationError, getDataContext() ); + GEOS_FMT( "{}: The {} dimension ( no. {} ) doesn't exist in the table.", + getDataContext(), units::getDescription( getDimUnit( dim ) ), dim ), + SimulationError, getDataContext() ); real64 const lowerBound = m_coordinates[dim][0]; real64 const upperBound = m_coordinates[dim][m_coordinates.sizeOfArray( dim ) - 1]; GEOS_THROW_IF( coord > upperBound || coord < lowerBound, - GEOS_FMT( "{}: Requested {} is out of the table bounds ( lower bound: {} -> upper bound: {} ).", - getDataContext(), - units::formatValue( coord, getDimUnit( dim ) ), - units::formatValue( lowerBound, getDimUnit( dim ) ), - units::formatValue( upperBound, getDimUnit( dim ) ) ), - SimulationError, getDataContext() ); + GEOS_FMT( "{}: Requested {} is out of the table bounds ( lower bound: {} -> upper bound: {} ).", + getDataContext(), + units::formatValue( coord, getDimUnit( dim ) ), + units::formatValue( lowerBound, getDimUnit( dim ) ), + units::formatValue( upperBound, getDimUnit( dim ) ) ), + SimulationError, getDataContext() ); } TableFunction::KernelWrapper TableFunction::createKernelWrapper() const diff --git a/src/coreComponents/mesh/CellElementRegion.cpp b/src/coreComponents/mesh/CellElementRegion.cpp index aa01b10c058..fe669ed1864 100644 --- a/src/coreComponents/mesh/CellElementRegion.cpp +++ b/src/coreComponents/mesh/CellElementRegion.cpp @@ -50,17 +50,17 @@ CellElementRegion::~CellElementRegion() void CellElementRegion::generateMesh( Group const & cellBlocks ) { GEOS_THROW_IF( m_cellBlockNames.empty(), - GEOS_FMT( "{}: No cellBlock selected in this region.", - getDataContext() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: No cellBlock selected in this region.", + getDataContext() ), + InputError, getDataContext() ); Group & subRegions = this->getGroup( viewKeyStruct::elementSubRegions() ); for( string const & cbName : m_cellBlockNames ) { CellBlockABC const * cellBlock = cellBlocks.getGroupPointer< CellBlockABC >( cbName ); GEOS_THROW_IF( cellBlock == nullptr, - GEOS_FMT( "{}: No cellBlock named '{}' found.\nAvailable cellBlock list: {{ {} }}\nNo CellElementRegionSelector has been used to verify the cellBlock selection.", - getDataContext(), cbName, stringutilities::join( m_cellBlockNames, ", " ) ), - InputError, getDataContext() ); + GEOS_FMT( "{}: No cellBlock named '{}' found.\nAvailable cellBlock list: {{ {} }}\nNo CellElementRegionSelector has been used to verify the cellBlock selection.", + getDataContext(), cbName, stringutilities::join( m_cellBlockNames, ", " ) ), + InputError, getDataContext() ); // subRegion name must be the same as the cell-block (so we can match them and reference them in errors). CellElementSubRegion & subRegion = subRegions.registerGroup< CellElementSubRegion >( cbName ); diff --git a/src/coreComponents/mesh/CellElementRegionSelector.cpp b/src/coreComponents/mesh/CellElementRegionSelector.cpp index 9af01f63da9..76ce97d8182 100644 --- a/src/coreComponents/mesh/CellElementRegionSelector.cpp +++ b/src/coreComponents/mesh/CellElementRegionSelector.cpp @@ -63,15 +63,15 @@ CellElementRegionSelector::getMatchingCellblocks( CellElementRegion const & regi } GEOS_THROW_IF( !matching, - GEOS_FMT( "{}: No cellBlock name is satisfying the qualifier '{}'.\n" - "Available cellBlock list: {{ {} }}\nAvailable region attribute list: {{ {} }}", - region.getWrapperDataContext( ViewKeys::sourceCellBlockNamesString() ), - matchPattern, - stringutilities::joinLambda( m_regionAttributesOwners, ", ", - []( auto pair ) { return pair->first; } ), - stringutilities::joinLambda( m_cellBlocksOwners, ", ", - []( auto pair ) { return pair->first; } ) ), - InputError, region.getWrapperDataContext( ViewKeys::sourceCellBlockNamesString() ) ); + GEOS_FMT( "{}: No cellBlock name is satisfying the qualifier '{}'.\n" + "Available cellBlock list: {{ {} }}\nAvailable region attribute list: {{ {} }}", + region.getWrapperDataContext( ViewKeys::sourceCellBlockNamesString() ), + matchPattern, + stringutilities::joinLambda( m_regionAttributesOwners, ", ", + []( auto pair ) { return pair->first; } ), + stringutilities::joinLambda( m_cellBlocksOwners, ", ", + []( auto pair ) { return pair->first; } ) ), + InputError, region.getWrapperDataContext( ViewKeys::sourceCellBlockNamesString() ) ); return matchedCellBlocks; } @@ -83,12 +83,12 @@ CellElementRegionSelector::verifyRequestedCellBlocks( CellElementRegion const & { // if cell block does not exist in the mesh GEOS_THROW_IF( m_cellBlocksOwners.count( requestedCellBlockName ) == 0, - GEOS_FMT( "{}: No cellBlock named '{}'.\nAvailable cellBlock list: {{ {} }}", - region.getWrapperDataContext( ViewKeys::sourceCellBlockNamesString() ), - requestedCellBlockName, - stringutilities::joinLambda( m_cellBlocksOwners, ", ", - []( auto pair ) { return pair->first; } ) ), - InputError, region.getWrapperDataContext( ViewKeys::sourceCellBlockNamesString() ) ); + GEOS_FMT( "{}: No cellBlock named '{}'.\nAvailable cellBlock list: {{ {} }}", + region.getWrapperDataContext( ViewKeys::sourceCellBlockNamesString() ), + requestedCellBlockName, + stringutilities::joinLambda( m_cellBlocksOwners, ", ", + []( auto pair ) { return pair->first; } ) ), + InputError, region.getWrapperDataContext( ViewKeys::sourceCellBlockNamesString() ) ); } } diff --git a/src/coreComponents/mesh/ElementRegionManager.cpp b/src/coreComponents/mesh/ElementRegionManager.cpp index 0222072022a..f8ba22c178b 100644 --- a/src/coreComponents/mesh/ElementRegionManager.cpp +++ b/src/coreComponents/mesh/ElementRegionManager.cpp @@ -81,8 +81,8 @@ Group * ElementRegionManager::createChild( string const & childKey, string const { GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); GEOS_ERROR_IF( getUserAvailableKeys().count( childKey ) == 0, - CatalogInterface::unknownTypeError( childKey, getDataContext(), getUserAvailableKeys() ), - getDataContext() ); + CatalogInterface::unknownTypeError( childKey, getDataContext(), getUserAvailableKeys() ), + getDataContext() ); Group & elementRegions = this->getGroup( ElementRegionManager::groupKeyStruct::elementRegionsGroup() ); return &elementRegions.registerGroup( childName, CatalogInterface::factory( childKey, getDataContext(), @@ -218,9 +218,9 @@ void ElementRegionManager::generateWells( CellBlockManagerABC const & cellBlockM globalIndex const numWellElemsGlobal = MpiWrapper::sum( subRegion.size() ); GEOS_ERROR_IF( numWellElemsGlobal != lineBlock.numElements(), - "Invalid partitioning in well " << lineBlock.getDataContext() << - ", subregion " << subRegion.getDataContext(), - getDataContext() ); + "Invalid partitioning in well " << lineBlock.getDataContext() << + ", subregion " << subRegion.getDataContext(), + getDataContext() ); } ); @@ -780,13 +780,13 @@ ElementRegionManager::getCellBlockToSubRegionMap( CellBlockManagerABC const & ce GEOS_UNUSED_VAR( region ); // unused if geos_error_if is nulld localIndex const blockIndex = cellBlocks.getIndex( subRegion.getName() ); GEOS_ERROR_IF( blockIndex == Group::subGroupMap::KeyIndex::invalid_index, - GEOS_FMT( "{}, subregion {}: Cell block not found at index {}.", - region.getDataContext().toString(), subRegion.getName(), blockIndex ), - region.getDataContext() ); + GEOS_FMT( "{}, subregion {}: Cell block not found at index {}.", + region.getDataContext().toString(), subRegion.getName(), blockIndex ), + region.getDataContext() ); GEOS_ERROR_IF( blockMap( blockIndex, 1 ) != -1, - GEOS_FMT( "{}, subregion {}: Cell block at index {} is mapped to more than one subregion.", - region.getDataContext().toString(), subRegion.getName(), blockIndex ), - region.getDataContext() ); + GEOS_FMT( "{}, subregion {}: Cell block at index {} is mapped to more than one subregion.", + region.getDataContext().toString(), subRegion.getName(), blockIndex ), + region.getDataContext() ); blockMap( blockIndex, 0 ) = er; blockMap( blockIndex, 1 ) = esr; diff --git a/src/coreComponents/mesh/ElementRegionManager.hpp b/src/coreComponents/mesh/ElementRegionManager.hpp index 3da858ba538..0058e862f63 100644 --- a/src/coreComponents/mesh/ElementRegionManager.hpp +++ b/src/coreComponents/mesh/ElementRegionManager.hpp @@ -1511,10 +1511,10 @@ ElementRegionManager::constructMaterialViewAccessor( string const & viewName, else { GEOS_ERROR_IF( !allowMissingViews, - subRegion.getDataContext() << - ": Material " << constitutiveRelation.getDataContext() << - " does not contain " << viewName, - subRegion.getDataContext(), constitutiveRelation.getDataContext() ); + subRegion.getDataContext() << + ": Material " << constitutiveRelation.getDataContext() << + " does not contain " << viewName, + subRegion.getDataContext(), constitutiveRelation.getDataContext() ); } } ); } @@ -1562,8 +1562,8 @@ ElementRegionManager::constructMaterialViewAccessor( string const & viewName, else { GEOS_ERROR_IF( !allowMissingViews, region.getDataContext() << ": Material " << materialName - << " does not contain " << viewName, - region.getDataContext(), subRegion.getDataContext() ); + << " does not contain " << viewName, + region.getDataContext(), subRegion.getDataContext() ); } } ); } diff --git a/src/coreComponents/mesh/MeshObjectPath.cpp b/src/coreComponents/mesh/MeshObjectPath.cpp index 76568f1aef9..63a24ef4486 100644 --- a/src/coreComponents/mesh/MeshObjectPath.cpp +++ b/src/coreComponents/mesh/MeshObjectPath.cpp @@ -212,8 +212,8 @@ void processTokenRecursive( dataRepository::Group const & parentGroup, } ); GEOS_THROW_IF( namesInRepository.empty(), - GEOS_FMT( "{0} has no children.", parentGroup.getDataContext().toString()), - InputError, parentGroup.getDataContext() ); + GEOS_FMT( "{0} has no children.", parentGroup.getDataContext().toString()), + InputError, parentGroup.getDataContext() ); for( string const & inputEntry : stringutilities::tokenize( pathToken, " " ) ) { @@ -233,12 +233,12 @@ void processTokenRecursive( dataRepository::Group const & parentGroup, } } GEOS_THROW_IF( !foundMatch, - GEOS_FMT( "{0} has no child named {1}.\n" - "{0} has the following children: {{ {2} }}", - parentGroup.getDataContext().toString(), - inputEntry, - stringutilities::join( namesInRepository, ", " ) ), - InputError, parentGroup.getDataContext() ); + GEOS_FMT( "{0} has no child named {1}.\n" + "{0} has the following children: {{ {2} }}", + parentGroup.getDataContext().toString(), + inputEntry, + stringutilities::join( namesInRepository, ", " ) ), + InputError, parentGroup.getDataContext() ); } } diff --git a/src/coreComponents/mesh/Perforation.cpp b/src/coreComponents/mesh/Perforation.cpp index 18e1f4b5ce1..2565e905b18 100644 --- a/src/coreComponents/mesh/Perforation.cpp +++ b/src/coreComponents/mesh/Perforation.cpp @@ -57,9 +57,9 @@ Perforation::Perforation( string const & name, Group * const parent ) void Perforation::postInputInitialization() { GEOS_ERROR_IF( m_distanceFromHead <= 0, - getWrapperDataContext( viewKeyStruct::distanceFromHeadString() ) << - ": distance from well head to perforation cannot be negative.", - getWrapperDataContext( viewKeyStruct::distanceFromHeadString() ) ); + getWrapperDataContext( viewKeyStruct::distanceFromHeadString() ) << + ": distance from well head to perforation cannot be negative.", + getWrapperDataContext( viewKeyStruct::distanceFromHeadString() ) ); } diff --git a/src/coreComponents/mesh/SurfaceElementRegion.hpp b/src/coreComponents/mesh/SurfaceElementRegion.hpp index 0d957993916..313c983dc7d 100644 --- a/src/coreComponents/mesh/SurfaceElementRegion.hpp +++ b/src/coreComponents/mesh/SurfaceElementRegion.hpp @@ -211,9 +211,9 @@ class SurfaceElementRegion : public ElementRegionBase subRegionNames.push_back( sr.getName() ); } ); GEOS_ERROR_IF( subRegionNames.size() != 1, - "Surface region \"" << getDataContext() << - "\" should have one unique sub region (" << subRegionNames.size() << " found).", - getDataContext() ); + "Surface region \"" << getDataContext() << + "\" should have one unique sub region (" << subRegionNames.size() << " found).", + getDataContext() ); return subRegionNames.front(); } diff --git a/src/coreComponents/mesh/WellElementSubRegion.cpp b/src/coreComponents/mesh/WellElementSubRegion.cpp index 6646357849d..c6ccba62a69 100644 --- a/src/coreComponents/mesh/WellElementSubRegion.cpp +++ b/src/coreComponents/mesh/WellElementSubRegion.cpp @@ -425,8 +425,8 @@ void WellElementSubRegion::generate( MeshLevel & mesh, // if they belong to the same well element. This is a temporary solution. // TODO: split the well elements that contain multiple perforations, so that no element is shared GEOS_THROW_IF( sharedElems.size() > 0, - "Well " << lineBlock.getDataContext() << " contains shared well elements", - InputError, lineBlock.getDataContext() ); + "Well " << lineBlock.getDataContext() << " contains shared well elements", + InputError, lineBlock.getDataContext() ); // In Steps 1 and 2 we determine the local objects on this rank (elems and nodes) // Once this is done, in Steps 3, 4, and 5, we update the nodeManager and wellElementSubRegion (size, maps) @@ -574,11 +574,11 @@ void WellElementSubRegion::checkPartitioningValidity( LineBlockABC const & lineB globalIndex const prevGlobal = prevElemIdsGlobal[iwelemGlobal][numBranches-1]; GEOS_THROW_IF( prevGlobal <= iwelemGlobal || prevGlobal < 0, - "The structure of well " << lineBlock.getDataContext() << " is invalid. " << - " The main reason for this error is that there may be no perforation" << - " in the bottom well element of the well, which is required to have" << - " a well-posed problem.", - InputError, lineBlock.getDataContext() ); + "The structure of well " << lineBlock.getDataContext() << " is invalid. " << + " The main reason for this error is that there may be no perforation" << + " in the bottom well element of the well, which is required to have" << + " a well-posed problem.", + InputError, lineBlock.getDataContext() ); if( elemStatusGlobal[prevGlobal] == WellElemStatus::LOCAL ) { diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp index 755021ab905..0a71dd17bd5 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp @@ -351,9 +351,9 @@ class InternalMeshGenerator : public MeshGeneratorBase i == 1 ? viewKeyStruct::yBiasString() : viewKeyStruct::zBiasString() ); GEOS_ERROR_IF( fabs( m_nElemBias[i][block] ) >= 1, - wrapperContext << - ", block index = " << block << " : Mesh bias must between -1 and 1!", - wrapperContext ); + wrapperContext << + ", block index = " << block << " : Mesh bias must between -1 and 1!", + wrapperContext ); real64 len = max - min; real64 xmean = len / m_nElems[i][block]; diff --git a/src/coreComponents/mesh/generators/InternalWellGenerator.cpp b/src/coreComponents/mesh/generators/InternalWellGenerator.cpp index f11e5937565..f219d359e9a 100644 --- a/src/coreComponents/mesh/generators/InternalWellGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalWellGenerator.cpp @@ -41,19 +41,19 @@ InternalWellGenerator::InternalWellGenerator( string const & name, Group * const void InternalWellGenerator::postInputInitialization() { GEOS_THROW_IF( m_polyNodeCoords.size( 1 ) != m_nDims, - "InternalWell " << getWrapperDataContext( viewKeyStruct::polylineNodeCoordsString() ) << - ": Invalid number of physical coordinates.", - InputError, getWrapperDataContext( viewKeyStruct::polylineNodeCoordsString() ) ); + "InternalWell " << getWrapperDataContext( viewKeyStruct::polylineNodeCoordsString() ) << + ": Invalid number of physical coordinates.", + InputError, getWrapperDataContext( viewKeyStruct::polylineNodeCoordsString() ) ); GEOS_THROW_IF( m_segmentToPolyNodeMap.size( 1 ) != 2, - "InternalWell " << getWrapperDataContext( viewKeyStruct::polylineSegmentConnString() ) << - ": Invalid size.", - InputError, getWrapperDataContext( viewKeyStruct::polylineSegmentConnString() ) ); + "InternalWell " << getWrapperDataContext( viewKeyStruct::polylineSegmentConnString() ) << + ": Invalid size.", + InputError, getWrapperDataContext( viewKeyStruct::polylineSegmentConnString() ) ); GEOS_THROW_IF( m_polyNodeCoords.size( 0 )-1 != m_segmentToPolyNodeMap.size( 0 ), - "Incompatible sizes of " << getWrapperDataContext( viewKeyStruct::polylineNodeCoordsString() ) << - " and " << getWrapperDataContext( viewKeyStruct::polylineSegmentConnString() ), - InputError, getWrapperDataContext( viewKeyStruct::polylineSegmentConnString() ) ); + "Incompatible sizes of " << getWrapperDataContext( viewKeyStruct::polylineNodeCoordsString() ) << + " and " << getWrapperDataContext( viewKeyStruct::polylineSegmentConnString() ), + InputError, getWrapperDataContext( viewKeyStruct::polylineSegmentConnString() ) ); // TODO: add more checks here // TODO: check that the connectivity of the well is valid diff --git a/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp b/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp index 426535b341d..6dfb4d885b1 100644 --- a/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp @@ -116,22 +116,22 @@ void InternalWellboreGenerator::postInputInitialization() { GEOS_ERROR_IF( m_nElems[1].size() > 1, - getWrapperDataContext( viewKeyStruct::yElemsString() ) << - ": Only one block in the theta direction is currently supported. ", - getWrapperDataContext( viewKeyStruct::yElemsString() ) ); + getWrapperDataContext( viewKeyStruct::yElemsString() ) << + ": Only one block in the theta direction is currently supported. ", + getWrapperDataContext( viewKeyStruct::yElemsString() ) ); GEOS_ERROR_IF( m_nElems[2].size() > 1, - getWrapperDataContext( viewKeyStruct::yElemsString() ) << - ": Only one block in the z direction is currently supported. ", - getWrapperDataContext( viewKeyStruct::yElemsString() ) ); + getWrapperDataContext( viewKeyStruct::yElemsString() ) << + ": Only one block in the z direction is currently supported. ", + getWrapperDataContext( viewKeyStruct::yElemsString() ) ); GEOS_ERROR_IF( m_trajectory.size( 0 ) != 2 || m_trajectory.size( 1 ) != 3, - getWrapperDataContext( viewKeyStruct::trajectoryString() ) << - ": Input for trajectory should be specified in the form of " - "{ { xbottom, ybottom, zbottom }, { xtop, ytop, ztop } }.", - getWrapperDataContext( viewKeyStruct::trajectoryString() ) ); + getWrapperDataContext( viewKeyStruct::trajectoryString() ) << + ": Input for trajectory should be specified in the form of " + "{ { xbottom, ybottom, zbottom }, { xtop, ytop, ztop } }.", + getWrapperDataContext( viewKeyStruct::trajectoryString() ) ); // Project trajectory to bottom and top of the wellbore real64 trajectoryVector[3] = {0}; diff --git a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp index 09150351d32..03f0d4ec271 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp @@ -97,10 +97,10 @@ void VTKMeshGenerator::postInputInitialization() ExternalMeshGeneratorBase::postInputInitialization(); GEOS_ERROR_IF( !this->m_filePath.empty() && !m_dataSourceName.empty(), - getDataContext() << ": Access to the mesh via file or data source are mutually exclusive. " - "You can't set " << viewKeyStruct::dataSourceString() << " or " << viewKeyStruct::meshPathString() << " and " << - ExternalMeshGeneratorBase::viewKeyStruct::filePathString(), - getDataContext() ); + getDataContext() << ": Access to the mesh via file or data source are mutually exclusive. " + "You can't set " << viewKeyStruct::dataSourceString() << " or " << viewKeyStruct::meshPathString() << " and " << + ExternalMeshGeneratorBase::viewKeyStruct::filePathString(), + getDataContext() ); if( !m_dataSourceName.empty()) { @@ -109,8 +109,8 @@ void VTKMeshGenerator::postInputInitialization() m_dataSource = externalDataManager.getGroupPointer< VTKHierarchicalDataSource >( m_dataSourceName ); GEOS_THROW_IF( m_dataSource == nullptr, - getDataContext() << ": VTK Data Object Source not found: " << m_dataSourceName, - InputError, getDataContext() ); + getDataContext() << ": VTK Data Object Source not found: " << m_dataSourceName, + InputError, getDataContext() ); m_dataSource->open(); } diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp index 7f390b4b456..a2a4d3b4b6c 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp @@ -80,8 +80,8 @@ Group * WellGeneratorBase::createChild( string const & childKey, string const & GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); const auto childTypes = { viewKeyStruct::perforationString() }; GEOS_ERROR_IF( childKey != viewKeyStruct::perforationString(), - CatalogInterface::unknownTypeError( childKey, getDataContext(), childTypes ), - getDataContext() ); + CatalogInterface::unknownTypeError( childKey, getDataContext(), childTypes ), + getDataContext() ); ++m_numPerforations; m_perforationList.emplace_back( childName ); diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp b/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp index 0a0b19a3383..f16d3426253 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp @@ -80,9 +80,9 @@ void Box::postInputInitialization() if( std::fabs( m_strikeAngle ) > 1e-20 ) { GEOS_ERROR_IF( (m_max[0]-m_min[0]) < (m_max[1]-m_min[1]), - getDataContext() << ": When a strike angle is specified, the box is supposed to" << - " represent a plane normal to the y direction. This box seems to be too thick.", - getDataContext() ); + getDataContext() << ": When a strike angle is specified, the box is supposed to" << + " represent a plane normal to the y direction. This box seems to be too thick.", + getDataContext() ); m_cosStrike = std::cos( m_strikeAngle / 180 *M_PI ); m_sinStrike = std::sin( m_strikeAngle / 180 *M_PI ); diff --git a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp index c089e4b42b7..ed17d16b59f 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp @@ -51,13 +51,13 @@ void ThickPlane::postInputInitialization() { m_thickness *= 0.5; // actually store the half-thickness GEOS_ERROR_IF( m_thickness <= 0, - getDataContext() << ": The plane appears to have zero or negative thickness", - getDataContext() ); + getDataContext() << ": The plane appears to have zero or negative thickness", + getDataContext() ); LvArray::tensorOps::normalize< 3 >( m_normal ); GEOS_ERROR_IF( std::fabs( LvArray::tensorOps::l2Norm< 3 >( m_normal ) - 1.0 ) > 1e-15, - getDataContext() << ": Could not properly normalize input normal.", - getDataContext() ); + getDataContext() << ": Could not properly normalize input normal.", + getDataContext() ); } diff --git a/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp b/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp index ebacb99e905..af9efb7fefa 100644 --- a/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp +++ b/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp @@ -87,10 +87,10 @@ class FieldStatisticsBase : public TaskBase m_solver = physicsSolverManager.getGroupPointer< SOLVER >( m_solverName ); GEOS_THROW_IF( m_solver == nullptr, - GEOS_FMT( "{}: Could not find solver '{}' of type {}", - getDataContext(), - m_solverName, LvArray::system::demangleType< SOLVER >() ), - InputError, getDataContext() ); + GEOS_FMT( "{}: Could not find solver '{}' of type {}", + getDataContext(), + m_solverName, LvArray::system::demangleType< SOLVER >() ), + InputError, getDataContext() ); // create dir for output if( m_writeCSV > 0 ) diff --git a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp index 2a7fc285941..a879e1a9ead 100644 --- a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp @@ -324,29 +324,29 @@ void LinearSolverParametersInput::postInputInitialization() static const std::set< integer > binaryOptions = { 0, 1 }; GEOS_ERROR_IF( binaryOptions.count( m_parameters.stopIfError ) == 0, - getWrapperDataContext( viewKeyStruct::stopIfErrorString() ) << - ": option can be either 0 (false) or 1 (true)", - getWrapperDataContext( viewKeyStruct::stopIfErrorString() ) ); + getWrapperDataContext( viewKeyStruct::stopIfErrorString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::stopIfErrorString() ) ); GEOS_ERROR_IF( binaryOptions.count( m_parameters.direct.checkResidual ) == 0, - getWrapperDataContext( viewKeyStruct::directCheckResidualString() ) << - ": option can be either 0 (false) or 1 (true)", - getWrapperDataContext( viewKeyStruct::directCheckResidualString() ) ); + getWrapperDataContext( viewKeyStruct::directCheckResidualString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::directCheckResidualString() ) ); GEOS_ERROR_IF( binaryOptions.count( m_parameters.direct.equilibrate ) == 0, - getWrapperDataContext( viewKeyStruct::directEquilString() ) << - ": option can be either 0 (false) or 1 (true)", - getWrapperDataContext( viewKeyStruct::directEquilString() ) ); + getWrapperDataContext( viewKeyStruct::directEquilString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::directEquilString() ) ); GEOS_ERROR_IF( binaryOptions.count( m_parameters.direct.replaceTinyPivot ) == 0, - getWrapperDataContext( viewKeyStruct::directReplTinyPivotString() ) << - ": option can be either 0 (false) or 1 (true)", - getWrapperDataContext( viewKeyStruct::directReplTinyPivotString() ) ); + getWrapperDataContext( viewKeyStruct::directReplTinyPivotString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::directReplTinyPivotString() ) ); GEOS_ERROR_IF( binaryOptions.count( m_parameters.direct.iterativeRefine ) == 0, - getWrapperDataContext( viewKeyStruct::directIterRefString() ) << - ": option can be either 0 (false) or 1 (true)", - getWrapperDataContext( viewKeyStruct::directIterRefString() ) ); + getWrapperDataContext( viewKeyStruct::directIterRefString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::directIterRefString() ) ); GEOS_ERROR_IF( binaryOptions.count( m_parameters.direct.parallel ) == 0, - getWrapperDataContext( viewKeyStruct::directParallelString() ) << - ": option can be either 0 (false) or 1 (true)", - getWrapperDataContext( viewKeyStruct::directParallelString() ) ); + getWrapperDataContext( viewKeyStruct::directParallelString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::directParallelString() ) ); GEOS_ERROR_IF_LT_MSG( m_parameters.krylov.maxIterations, 0, getWrapperDataContext( viewKeyStruct::krylovMaxIterString() ) << diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp b/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp index 2b102bd7777..f4d3a913578 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp @@ -137,9 +137,9 @@ void PhysicsSolverBase::generateMeshTargetsFromTargetRegions( Group const & mesh if( targetTokens.size()==1 ) // no MeshBody or MeshLevel specified { GEOS_ERROR_IF( meshBodies.numSubGroups() != 1, - getDataContext() << ": No MeshBody information is specified in" << - " PhysicsSolverBase::meshTargets, but there are multiple MeshBody objects", - getDataContext() ); + getDataContext() << ": No MeshBody information is specified in" << + " PhysicsSolverBase::meshTargets, but there are multiple MeshBody objects", + getDataContext() ); MeshBody const & meshBody = meshBodies.getGroup< MeshBody >( 0 ); string const meshBodyName = meshBody.getName(); @@ -153,9 +153,9 @@ void PhysicsSolverBase::generateMeshTargetsFromTargetRegions( Group const & mesh { string const meshBodyName = targetTokens[0]; GEOS_ERROR_IF( !meshBodies.hasGroup( meshBodyName ), - getWrapperDataContext( viewKeyStruct::targetRegionsString() ) << ": MeshBody (" << - meshBodyName << ") is specified in targetRegions, but does not exist.", - getWrapperDataContext( viewKeyStruct::targetRegionsString() ) ); + getWrapperDataContext( viewKeyStruct::targetRegionsString() ) << ": MeshBody (" << + meshBodyName << ") is specified in targetRegions, but does not exist.", + getWrapperDataContext( viewKeyStruct::targetRegionsString() ) ); string const meshLevelName = m_discretizationName; @@ -212,8 +212,8 @@ localIndex PhysicsSolverBase::targetRegionIndex( string const & regionName ) con { auto const pos = std::find( m_targetRegionNames.begin(), m_targetRegionNames.end(), regionName ); GEOS_ERROR_IF( pos == m_targetRegionNames.end(), - GEOS_FMT( "{}: Region {} is not a target of the solver.", - getDataContext(), regionName ), getDataContext() ); + GEOS_FMT( "{}: Region {} is not a target of the solver.", + getDataContext(), regionName ), getDataContext() ); return std::distance( m_targetRegionNames.begin(), pos ); } @@ -338,9 +338,9 @@ bool PhysicsSolverBase::execute( real64 const time_n, } } GEOS_ERROR_IF( dtRemaining > 0.0, - getDataContext() << ": Maximum allowed number of sub-steps" - " reached. Consider increasing maxSubSteps.", - getDataContext() ); + getDataContext() << ": Maximum allowed number of sub-steps" + " reached. Consider increasing maxSubSteps.", + getDataContext() ); // Decide what to do with the next Dt for the event running the solver. m_nextDt = setNextDt( time_n + dt, nextDt, domain ); @@ -1375,14 +1375,14 @@ void PhysicsSolverBase::solveLinearSystem( DofManager const & dofManager, if( params.stopIfError ) { GEOS_ERROR_IF( m_linearSolverResult.breakdown(), - getDataContext() << ": Linear solution breakdown -> simulation STOP", - getDataContext() ); + getDataContext() << ": Linear solution breakdown -> simulation STOP", + getDataContext() ); } else { GEOS_WARNING_IF( !m_linearSolverResult.success(), - getDataContext() << ": Linear solution failed", - getDataContext() ); + getDataContext() << ": Linear solution failed", + getDataContext() ); } // Unscale the solution vector if physics-based scaling was applied diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 92e8ddaa33a..5806d4291d3 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -612,13 +612,13 @@ void CompositionalMultiphaseBase::validateConstitutiveModels( DomainPartition co bool const isFluidModelThermal = fluid.isThermal(); GEOS_THROW_IF( m_isThermal && !isFluidModelThermal, - GEOS_FMT( "CompositionalMultiphaseBase {}: the thermal option is enabled in the solver, but the fluid model {} is incompatible with the thermal option", - getDataContext(), fluid.getDataContext() ), - InputError, getDataContext(), fluid.getDataContext() ); + GEOS_FMT( "CompositionalMultiphaseBase {}: the thermal option is enabled in the solver, but the fluid model {} is incompatible with the thermal option", + getDataContext(), fluid.getDataContext() ), + InputError, getDataContext(), fluid.getDataContext() ); GEOS_THROW_IF( !m_isThermal && isFluidModelThermal, - GEOS_FMT( "CompositionalMultiphaseBase {}: the thermal option is enabled in fluid model {}, but the solver options are incompatible with the thermal option", - getDataContext(), fluid.getDataContext() ), - InputError, getDataContext(), fluid.getDataContext() ); + GEOS_FMT( "CompositionalMultiphaseBase {}: the thermal option is enabled in fluid model {}, but the solver options are incompatible with the thermal option", + getDataContext(), fluid.getDataContext() ), + InputError, getDataContext(), fluid.getDataContext() ); string const & relpermName = subRegion.getReference< string >( viewKeyStruct::relPermNamesString() ); RelativePermeabilityBase const & relPerm = getConstitutiveModel< RelativePermeabilityBase >( subRegion, relpermName ); @@ -1104,14 +1104,14 @@ void CompositionalMultiphaseBase::computeHydrostaticEquilibrium( DomainPartition // check that the gravity vector is aligned with the z-axis GEOS_THROW_IF( !isZero( gravVector[0] ) || !isZero( gravVector[1] ), - getCatalogName() << " " << getDataContext() << - ": the gravity vector specified in this simulation (" << gravVector[0] << " " << gravVector[1] << " " << gravVector[2] << - ") is not aligned with the z-axis. \n" - "This is incompatible with the " << bc.getCatalogName() << " " << bc.getDataContext() << - "used in this simulation. To proceed, you can either: \n" << - " - Use a gravityVector aligned with the z-axis, such as (0.0,0.0,-9.81)\n" << - " - Remove the hydrostatic equilibrium initial condition from the XML file", - InputError, getDataContext(), bc.getDataContext() ); + getCatalogName() << " " << getDataContext() << + ": the gravity vector specified in this simulation (" << gravVector[0] << " " << gravVector[1] << " " << gravVector[2] << + ") is not aligned with the z-axis. \n" + "This is incompatible with the " << bc.getCatalogName() << " " << bc.getDataContext() << + "used in this simulation. To proceed, you can either: \n" << + " - Use a gravityVector aligned with the z-axis, such as (0.0,0.0,-9.81)\n" << + " - Remove the hydrostatic equilibrium initial condition from the XML file", + InputError, getDataContext(), bc.getDataContext() ); // ensure that the temperature and composition tables are defined GEOS_THROW_IF( bc.getTemperatureVsElevationTableName().empty(), @@ -1222,24 +1222,24 @@ void CompositionalMultiphaseBase::computeHydrostaticEquilibrium( DomainPartition string_array const & componentNames = fs.getComponentNames(); GEOS_THROW_IF( fluid.componentNames().size() != componentNames.size(), - "Mismatch in number of components between constitutive model " - << fluid.getDataContext() << " and the Equilibrium initial condition " << fs.getDataContext(), - InputError, fluid.getDataContext(), fs.getDataContext() ); + "Mismatch in number of components between constitutive model " + << fluid.getDataContext() << " and the Equilibrium initial condition " << fs.getDataContext(), + InputError, fluid.getDataContext(), fs.getDataContext() ); for( integer ic = 0; ic < fluid.numFluidComponents(); ++ic ) { GEOS_THROW_IF( fluid.componentNames()[ic] != componentNames[ic], - "Mismatch in component names between constitutive model " - << fluid.getDataContext() << " and the Equilibrium initial condition " << fs.getDataContext(), - InputError, fluid.getDataContext(), fs.getDataContext() ); + "Mismatch in component names between constitutive model " + << fluid.getDataContext() << " and the Equilibrium initial condition " << fs.getDataContext(), + InputError, fluid.getDataContext(), fs.getDataContext() ); } // Note: for now, we assume that the reservoir is in a single-phase state at initialization string_array const & phaseNames = fluid.phaseNames(); auto const itPhaseNames = std::find( std::begin( phaseNames ), std::end( phaseNames ), initPhaseName ); GEOS_THROW_IF( itPhaseNames == std::end( phaseNames ), - getCatalogName() << " " << getDataContext() << ": phase name " << - initPhaseName << " not found in the phases of " << fluid.getDataContext(), - InputError, getDataContext(), fluid.getDataContext() ); + getCatalogName() << " " << getDataContext() << ": phase name " << + initPhaseName << " not found in the phases of " << fluid.getDataContext(), + InputError, getDataContext(), fluid.getDataContext() ); integer const ipInit = std::distance( std::begin( phaseNames ), itPhaseNames ); // Step 3.4: compute the hydrostatic pressure values @@ -1271,11 +1271,11 @@ void CompositionalMultiphaseBase::computeHydrostaticEquilibrium( DomainPartition pressureValues.toView() ); GEOS_THROW_IF( returnValue == isothermalCompositionalMultiphaseBaseKernels::HydrostaticPressureKernel::ReturnType::FAILED_TO_CONVERGE, - getCatalogName() << " " << getDataContext() << - ": hydrostatic pressure initialization failed to converge in region " << region.getName() << "! \n" << - "Try to loosen the equilibration tolerance, or increase the number of equilibration iterations. \n" << - "If nothing works, something may be wrong in the fluid model, see ", - std::runtime_error, getDataContext() ); + getCatalogName() << " " << getDataContext() << + ": hydrostatic pressure initialization failed to converge in region " << region.getName() << "! \n" << + "Try to loosen the equilibration tolerance, or increase the number of equilibration iterations. \n" << + "If nothing works, something may be wrong in the fluid model, see ", + std::runtime_error, getDataContext() ); GEOS_LOG_RANK_0_IF( returnValue == isothermalCompositionalMultiphaseBaseKernels::HydrostaticPressureKernel::ReturnType::DETECTED_MULTIPHASE_FLOW, getCatalogName() << " " << getDataContext() << @@ -1334,9 +1334,9 @@ void CompositionalMultiphaseBase::computeHydrostaticEquilibrium( DomainPartition } ); GEOS_ERROR_IF( minPressure.get() < 0.0, - GEOS_FMT( "{}: A negative pressure of {} Pa was found during hydrostatic initialization in region/subRegion {}/{}", - getDataContext(), minPressure.get(), region.getName(), subRegion.getName() ), - getDataContext() ); + GEOS_FMT( "{}: A negative pressure of {} Pa was found during hydrostatic initialization in region/subRegion {}/{}", + getDataContext(), minPressure.get(), region.getName(), subRegion.getName() ), + getDataContext() ); } ); } ); } @@ -1849,8 +1849,8 @@ void CompositionalMultiphaseBase::applyDirichletBC( real64 const time_n, { bool const bcConsistent = validateDirichletBC( domain, time_n + dt ); GEOS_ERROR_IF( !bcConsistent, - GEOS_FMT( "CompositionalMultiphaseBase {}: inconsistent boundary conditions", getDataContext() ), - getDataContext() ); + GEOS_FMT( "CompositionalMultiphaseBase {}: inconsistent boundary conditions", getDataContext() ), + getDataContext() ); } FieldSpecificationManager & fsManager = FieldSpecificationManager::getInstance(); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 0b0584a74c2..8e2fa6a5c00 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -205,10 +205,10 @@ void CompositionalMultiphaseFVM::initializePreSubGroups() FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); FluxApproximationBase const & fluxApprox = fvManager.getFluxApproximation( m_discretizationName ); GEOS_ERROR_IF( fluxApprox.upwindingParams().upwindingScheme == UpwindingScheme::HU2PH && m_numPhases != 2, - GEOS_FMT( "{}: upwinding scheme {} only supports 2-phase flow", - getDataContext(), - EnumStrings< UpwindingScheme >::toString( UpwindingScheme::HU2PH )), - getDataContext() ); + GEOS_FMT( "{}: upwinding scheme {} only supports 2-phase flow", + getDataContext(), + EnumStrings< UpwindingScheme >::toString( UpwindingScheme::HU2PH )), + getDataContext() ); } void CompositionalMultiphaseFVM::setupDofs( DomainPartition const & domain, @@ -1261,8 +1261,8 @@ void CompositionalMultiphaseFVM::applyFaceDirichletBC( real64 const time_n, { bool const bcConsistent = validateFaceDirichletBC( domain, time_n + dt ); GEOS_ERROR_IF( !bcConsistent, - GEOS_FMT( "{}: inconsistent boundary conditions", getDataContext() ), - getDataContext() ); + GEOS_FMT( "{}: inconsistent boundary conditions", getDataContext() ), + getDataContext() ); } using namespace isothermalCompositionalMultiphaseFVMKernels; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp index c10f9f01a71..da11e64fb2d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp @@ -87,14 +87,14 @@ void CompositionalMultiphaseHybridFVM::initializePreSubGroups() FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); GEOS_THROW_IF( !fvManager.hasGroup< HybridMimeticDiscretization >( m_discretizationName ), - getCatalogName() << " " << getDataContext() << - ": the HybridMimeticDiscretization must be selected with CompositionalMultiphaseHybridFVM", - InputError, getDataContext() ); + getCatalogName() << " " << getDataContext() << + ": the HybridMimeticDiscretization must be selected with CompositionalMultiphaseHybridFVM", + InputError, getDataContext() ); GEOS_THROW_IF( m_hasCapPressure, - getCatalogName() << " " << getDataContext() << - ": capillary pressure is not yet supported by CompositionalMultiphaseHybridFVM", - InputError, getDataContext() ); + getCatalogName() << " " << getDataContext() << + ": capillary pressure is not yet supported by CompositionalMultiphaseHybridFVM", + InputError, getDataContext() ); } void CompositionalMultiphaseHybridFVM::initializePostInitialConditionsPreSubGroups() @@ -145,9 +145,9 @@ void CompositionalMultiphaseHybridFVM::initializePostInitialConditionsPreSubGrou } ); GEOS_THROW_IF( minVal.get() <= 0.0, - getCatalogName() << " " << getDataContext() << - ": the transmissibility multipliers used in SinglePhaseHybridFVM must strictly larger than 0.0", - std::runtime_error, getDataContext() ); + getCatalogName() << " " << getDataContext() << + ": the transmissibility multipliers used in SinglePhaseHybridFVM must strictly larger than 0.0", + std::runtime_error, getDataContext() ); FieldSpecificationManager & fsManager = FieldSpecificationManager::getInstance(); fsManager.forSubGroups< AquiferBoundaryCondition >( [&] ( AquiferBoundaryCondition const & bc ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp index 139139be6e8..ac72f64379f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp @@ -1067,8 +1067,8 @@ void ReactiveCompositionalMultiphaseOBL::applyDirichletBC( real64 const time, { bool const bcConsistent = validateDirichletBC( domain, time + dt ); GEOS_ERROR_IF( !bcConsistent, - GEOS_FMT( "CompositionalMultiphaseBase {}: inconsistent boundary conditions", getDataContext() ), - getDataContext() ); + GEOS_FMT( "CompositionalMultiphaseBase {}: inconsistent boundary conditions", getDataContext() ), + getDataContext() ); } FieldSpecificationManager & fsManager = FieldSpecificationManager::getInstance(); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 11c6e1f6c29..e11de9db2c0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -162,13 +162,13 @@ void SinglePhaseBase::validateConstitutiveModels( DomainPartition & domain ) con { string const fluidModelName = castedFluid.getCatalogName(); GEOS_THROW_IF( m_isThermal && (fluidModelName != "ThermalCompressibleSinglePhaseFluid"), - GEOS_FMT( "SingleFluidBase {}: the thermal option is enabled in the solver, but the fluid model {} is not for thermal fluid", - getDataContext(), fluid.getDataContext() ), - InputError, getDataContext(), fluid.getDataContext() ); + GEOS_FMT( "SingleFluidBase {}: the thermal option is enabled in the solver, but the fluid model {} is not for thermal fluid", + getDataContext(), fluid.getDataContext() ), + InputError, getDataContext(), fluid.getDataContext() ); GEOS_THROW_IF( !m_isThermal && (fluidModelName == "ThermalCompressibleSinglePhaseFluid"), - GEOS_FMT( "SingleFluidBase {}: the fluid model is for thermal fluid {}, but the solver option is incompatible with the fluid model", - getDataContext(), fluid.getDataContext() ), - InputError, getDataContext(), fluid.getDataContext() ); + GEOS_FMT( "SingleFluidBase {}: the fluid model is for thermal fluid {}, but the solver option is incompatible with the fluid model", + getDataContext(), fluid.getDataContext() ), + InputError, getDataContext(), fluid.getDataContext() ); } ); } ); } ); @@ -413,14 +413,14 @@ void SinglePhaseBase::computeHydrostaticEquilibrium( DomainPartition & domain ) // check that the gravity vector is aligned with the z-axis GEOS_THROW_IF( !isZero( gravVector[0] ) || !isZero( gravVector[1] ), - getCatalogName() << " " << getDataContext() << - ": the gravity vector specified in this simulation (" << gravVector[0] << " " << gravVector[1] << " " << gravVector[2] << - ") is not aligned with the z-axis. \n" - "This is incompatible with the " << bc.getCatalogName() << " " << bc.getDataContext() << - "used in this simulation. To proceed, you can either: \n" << - " - Use a gravityVector aligned with the z-axis, such as (0.0,0.0,-9.81)\n" << - " - Remove the hydrostatic equilibrium initial condition from the XML file", - InputError, getDataContext(), bc.getDataContext() ); + getCatalogName() << " " << getDataContext() << + ": the gravity vector specified in this simulation (" << gravVector[0] << " " << gravVector[1] << " " << gravVector[2] << + ") is not aligned with the z-axis. \n" + "This is incompatible with the " << bc.getCatalogName() << " " << bc.getDataContext() << + "used in this simulation. To proceed, you can either: \n" << + " - Use a gravityVector aligned with the z-axis, such as (0.0,0.0,-9.81)\n" << + " - Remove the hydrostatic equilibrium initial condition from the XML file", + InputError, getDataContext(), bc.getDataContext() ); } ); if( equilCounter == 0 ) @@ -532,9 +532,9 @@ void SinglePhaseBase::computeHydrostaticEquilibrium( DomainPartition & domain ) pressureValues.toView() ); GEOS_THROW_IF( !equilHasConverged, - getCatalogName() << " " << getDataContext() << - ": hydrostatic pressure initialization failed to converge in region " << region.getName() << "!", - std::runtime_error, getDataContext() ); + getCatalogName() << " " << getDataContext() << + ": hydrostatic pressure initialization failed to converge in region " << region.getName() << "!", + std::runtime_error, getDataContext() ); } ); // Step 3.4: create hydrostatic pressure table diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index a55796d3119..6878143ff3a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -91,18 +91,18 @@ void SinglePhaseHybridFVM::initializePreSubGroups() SinglePhaseBase::initializePreSubGroups(); GEOS_THROW_IF( m_isThermal, - GEOS_FMT( "{} {}: The thermal option is not supported by SinglePhaseHybridFVM", - getCatalogName(), getDataContext().toString() ), - InputError, getDataContext() ); + GEOS_FMT( "{} {}: The thermal option is not supported by SinglePhaseHybridFVM", + getCatalogName(), getDataContext().toString() ), + InputError, getDataContext() ); DomainPartition & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" ); NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager(); FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); GEOS_THROW_IF( !fvManager.hasGroup< HybridMimeticDiscretization >( m_discretizationName ), - getCatalogName() << " " << getDataContext() << - ": the HybridMimeticDiscretization must be selected with SinglePhaseHybridFVM", - InputError, getDataContext() ); + getCatalogName() << " " << getDataContext() << + ": the HybridMimeticDiscretization must be selected with SinglePhaseHybridFVM", + InputError, getDataContext() ); } void SinglePhaseHybridFVM::initializePostInitialConditionsPreSubGroups() diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp index 03cddb53c00..bea53722bdf 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp @@ -58,19 +58,19 @@ void SourceFluxStatsAggregator::postInputInitialization() m_fluxNames.emplace_back( string( sourceFlux.getName() ) ); } ); GEOS_WARNING_IF( m_fluxNames.empty(), - GEOS_FMT( "{}: No {} was found in {}.", - getDataContext(), SourceFluxBoundaryCondition::catalogName(), - fsManager.getDataContext() ), - getDataContext(), fsManager.getDataContext() ); + GEOS_FMT( "{}: No {} was found in {}.", + getDataContext(), SourceFluxBoundaryCondition::catalogName(), + fsManager.getDataContext() ), + getDataContext(), fsManager.getDataContext() ); } else { for( string const & fluxName : m_fluxNames ) { GEOS_ERROR_IF( !fsManager.hasGroup< SourceFluxBoundaryCondition >( fluxName ), - GEOS_FMT( "{}: No {} named {} was found in {}.", - getDataContext(), SourceFluxBoundaryCondition::catalogName(), - fluxName, fsManager.getDataContext() ), getDataContext() ); + GEOS_FMT( "{}: No {} named {} was found in {}.", + getDataContext(), SourceFluxBoundaryCondition::catalogName(), + fluxName, fsManager.getDataContext() ), getDataContext() ); } } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp b/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp index 9a4143a4515..5accd9a0def 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp @@ -69,10 +69,10 @@ void StencilDataCollection::postInputInitialization() m_solver = physicsSolverManager.getGroupPointer< FlowSolverBase >( m_solverName ); GEOS_THROW_IF( m_solver == nullptr, - GEOS_FMT( "{}: Could not find flow solver named '{}'.", - getDataContext(), - m_solverName ), - InputError, getDataContext() ); + GEOS_FMT( "{}: Could not find flow solver named '{}'.", + getDataContext(), + m_solverName ), + InputError, getDataContext() ); } { // find mesh & discretization @@ -114,11 +114,11 @@ void StencilDataCollection::initializePostInitialConditionsPostSubGroups() ++supportedStencilCount; } ); GEOS_ERROR_IF( supportedStencilCount == 0, - GEOS_FMT( "{}: No compatible discretization was found.", getDataContext() ), - getDataContext() ); + GEOS_FMT( "{}: No compatible discretization was found.", getDataContext() ), + getDataContext() ); GEOS_ERROR_IF( supportedStencilCount > 1, - GEOS_FMT( "{}: Multiple discretization was found.", getDataContext() ), - getDataContext() ); + GEOS_FMT( "{}: Multiple discretization was found.", getDataContext() ), + getDataContext() ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp index 7e1617daee3..a2bf5b3d7c7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp @@ -701,8 +701,8 @@ void ProppantTransport::applyBoundaryConditions( real64 const time_n, string const & subRegionName = subRegion.getName(); GEOS_ERROR_IF( bcStatusMap[subRegionName].count( setName ) > 0, - getDataContext() << ": Conflicting proppant boundary conditions on set " << setName, - getDataContext() ); + getDataContext() << ": Conflicting proppant boundary conditions on set " << setName, + getDataContext() ); bcStatusMap[subRegionName][setName].resize( m_numComponents ); bcStatusMap[subRegionName][setName].setValues< serialPolicy >( false ); @@ -722,11 +722,11 @@ void ProppantTransport::applyBoundaryConditions( real64 const time_n, localIndex const comp = fs.getComponent(); GEOS_ERROR_IF( bcStatusMap[subRegionName].count( setName ) == 0, - getDataContext() << ": Proppant boundary condition not prescribed on set '" << setName << "'", - getDataContext() ); + getDataContext() << ": Proppant boundary condition not prescribed on set '" << setName << "'", + getDataContext() ); GEOS_ERROR_IF( bcStatusMap[subRegionName][setName][comp], - getDataContext() << ": Conflicting composition[" << comp << "] boundary conditions on set '" << setName << "'", - getDataContext() ); + getDataContext() << ": Conflicting composition[" << comp << "] boundary conditions on set '" << setName << "'", + getDataContext() ); bcStatusMap[subRegionName][setName][comp] = true; fs.applyFieldValue< FieldSpecificationEqual >( targetSet, @@ -745,9 +745,9 @@ void ProppantTransport::applyBoundaryConditions( real64 const time_n, { bcConsistent &= bcStatusEntryInner.second[ic]; GEOS_WARNING_IF( !bcConsistent, - getDataContext() << ": Composition boundary condition not applied to component " << - ic << " on region '" << bcStatusEntryOuter.first << "'," << - " set '" << bcStatusEntryInner.first << "'", getDataContext() ); + getDataContext() << ": Composition boundary condition not applied to component " << + ic << " on region '" << bcStatusEntryOuter.first << "'," << + " set '" << bcStatusEntryInner.first << "'", getDataContext() ); } } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 37993465a20..4ee991ccae2 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -414,16 +414,16 @@ void CompositionalMultiphaseWell::validateInjectionStreams( WellElementSubRegion { real64 const compFrac = injectionStream[ic]; GEOS_THROW_IF( ( compFrac < 0.0 ) || ( compFrac > 1.0 ), - "WellControls " << wellControls.getDataContext() << - ": Invalid injection stream for well " << subRegion.getName(), - InputError, wellControls.getDataContext() ); + "WellControls " << wellControls.getDataContext() << + ": Invalid injection stream for well " << subRegion.getName(), + InputError, wellControls.getDataContext() ); compFracSum += compFrac; } GEOS_THROW_IF( ( compFracSum < 1.0 - std::numeric_limits< real64 >::epsilon() ) || - ( compFracSum > 1.0 + std::numeric_limits< real64 >::epsilon() ), - "WellControls " << wellControls.getDataContext() << - ": Invalid injection stream for well " << subRegion.getName(), - InputError, wellControls.getDataContext() ); + ( compFracSum > 1.0 + std::numeric_limits< real64 >::epsilon() ), + "WellControls " << wellControls.getDataContext() << + ": Invalid injection stream for well " << subRegion.getName(), + InputError, wellControls.getDataContext() ); } } @@ -442,44 +442,44 @@ void CompositionalMultiphaseWell::validateWellConstraints( real64 const & time_n real64 const & targetMassRate = wellControls.getTargetMassRate( time_n ); GEOS_THROW_IF( wellControls.isInjector() && currentControl == WellControls::Control::PHASEVOLRATE, - "WellControls " << wellControls.getDataContext() << - ": Phase rate control is not available for injectors", - InputError, wellControls.getDataContext() ); + "WellControls " << wellControls.getDataContext() << + ": Phase rate control is not available for injectors", + InputError, wellControls.getDataContext() ); GEOS_THROW_IF( wellControls.isProducer() && currentControl == WellControls::Control::TOTALVOLRATE, - "WellControls " << wellControls.getDataContext() << - ": Total rate control is not available for producers", - InputError, wellControls.getDataContext() ); + "WellControls " << wellControls.getDataContext() << + ": Total rate control is not available for producers", + InputError, wellControls.getDataContext() ); GEOS_THROW_IF( wellControls.isInjector() && targetTotalRate < 0.0, - "WellControls " << wellControls.getDataContext() << - ": Target total rate cannot be negative for injectors", - InputError, wellControls.getDataContext() ); + "WellControls " << wellControls.getDataContext() << + ": Target total rate cannot be negative for injectors", + InputError, wellControls.getDataContext() ); GEOS_THROW_IF( wellControls.isInjector() && !isZero( targetPhaseRate ), - "WellControls " << wellControls.getDataContext() << - ": Target phase rate cannot be used for injectors", - InputError, wellControls.getDataContext() ); + "WellControls " << wellControls.getDataContext() << + ": Target phase rate cannot be used for injectors", + InputError, wellControls.getDataContext() ); GEOS_THROW_IF( wellControls.isProducer() && !isZero( targetTotalRate ), - "WellControls " << wellControls.getDataContext() << - ": Target total rate cannot be used for producers", - InputError, wellControls.getDataContext() ); + "WellControls " << wellControls.getDataContext() << + ": Target total rate cannot be used for producers", + InputError, wellControls.getDataContext() ); GEOS_THROW_IF( wellControls.isProducer() && !isZero( targetMassRate ), - "WellControls " << wellControls.getDataContext() << - ": Target mass rate cannot be used for producers", - InputError, wellControls.getDataContext() ); + "WellControls " << wellControls.getDataContext() << + ": Target mass rate cannot be used for producers", + InputError, wellControls.getDataContext() ); GEOS_THROW_IF( !m_useMass && !isZero( targetMassRate ), - "WellControls " << wellControls.getDataContext() << - ": Target mass rate cannot with useMass=0", - InputError, wellControls.getDataContext() ); + "WellControls " << wellControls.getDataContext() << + ": Target mass rate cannot with useMass=0", + InputError, wellControls.getDataContext() ); // The user always provides positive rates, but these rates are later multiplied by -1 internally for producers GEOS_THROW_IF( wellControls.isProducer() && targetPhaseRate > 0.0, - "WellControls " << wellControls.getDataContext() << - ": Target phase rate cannot be negative for producers", - InputError, wellControls.getDataContext() ); + "WellControls " << wellControls.getDataContext() << + ": Target phase rate cannot be negative for producers", + InputError, wellControls.getDataContext() ); GEOS_THROW_IF( wellControls.isProducer() && !isZero( targetTotalRate ), - "WellControls " << wellControls.getDataContext() << - ": Target total rate cannot be used for producers", - InputError, wellControls.getDataContext() ); + "WellControls " << wellControls.getDataContext() << + ": Target total rate cannot be used for producers", + InputError, wellControls.getDataContext() ); // Find target phase index for phase rate constraint for( integer ip = 0; ip < fluid.numFluidPhases(); ++ip ) @@ -490,9 +490,9 @@ void CompositionalMultiphaseWell::validateWellConstraints( real64 const & time_n } } GEOS_THROW_IF( wellControls.isProducer() && m_targetPhaseIndex == -1, - "WellControls " << wellControls.getDataContext() << - ": Phase " << wellControls.getTargetPhaseName() << " not found for well control " << wellControls.getName(), - InputError, wellControls.getDataContext() ); + "WellControls " << wellControls.getDataContext() << + ": Phase " << wellControls.getTargetPhaseName() << " not found for well control " << wellControls.getName(), + InputError, wellControls.getDataContext() ); } void CompositionalMultiphaseWell::initializePostSubGroups() diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp index 4a009a5dc7d..b7c92ad519c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp @@ -146,19 +146,19 @@ void SinglePhaseWell::validateWellConstraints( real64 const & time_n, real64 const targetTotalRate = wellControls.getTargetTotalRate( time_n ); real64 const targetPhaseRate = wellControls.getTargetPhaseRate( time_n ); GEOS_THROW_IF( currentControl == WellControls::Control::PHASEVOLRATE, - "WellControls " << wellControls.getDataContext() << - ": Phase rate control is not available for SinglePhaseWell", - InputError, wellControls.getDataContext() ); + "WellControls " << wellControls.getDataContext() << + ": Phase rate control is not available for SinglePhaseWell", + InputError, wellControls.getDataContext() ); // The user always provides positive rates, but these rates are later multiplied by -1 internally for producers GEOS_THROW_IF( ( ( wellControls.isInjector() && targetTotalRate < 0.0 ) || - ( wellControls.isProducer() && targetTotalRate > 0.0) ), - "WellControls " << wellControls.getDataContext() << - ": Target total rate cannot be negative", - InputError, wellControls.getDataContext() ); + ( wellControls.isProducer() && targetTotalRate > 0.0) ), + "WellControls " << wellControls.getDataContext() << + ": Target total rate cannot be negative", + InputError, wellControls.getDataContext() ); GEOS_THROW_IF( !isZero( targetPhaseRate ), - "WellControls " << wellControls.getDataContext() << - ": Target phase rate cannot be used for SinglePhaseWell", - InputError, wellControls.getDataContext() ); + "WellControls " << wellControls.getDataContext() << + ": Target phase rate cannot be used for SinglePhaseWell", + InputError, wellControls.getDataContext() ); } void SinglePhaseWell::updateBHPForConstraint( WellElementSubRegion & subRegion ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp index fbc65568fa1..a2d8215608c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp @@ -229,9 +229,9 @@ void WellControls::postInputInitialization() // When the simulation starts from a restart file, we don't want to use the inputControl, // because the control may have switched in the simulation that generated the restart GEOS_THROW_IF( m_inputControl == Control::UNINITIALIZED, - getWrapperDataContext( viewKeyStruct::inputControlString() ) << - ": Input well control cannot be uninitialized", - InputError, getWrapperDataContext( viewKeyStruct::inputControlString() ) ); + getWrapperDataContext( viewKeyStruct::inputControlString() ) << + ": Input well control cannot be uninitialized", + InputError, getWrapperDataContext( viewKeyStruct::inputControlString() ) ); if( m_currentControl == Control::UNINITIALIZED ) { @@ -240,29 +240,29 @@ void WellControls::postInputInitialization() // 1.a) check target BHP GEOS_THROW_IF( m_targetBHP < 0, - getWrapperDataContext( viewKeyStruct::targetBHPString() ) << - ": Target bottom-hole pressure is negative", - InputError, getWrapperDataContext( viewKeyStruct::targetBHPString() ) ); + getWrapperDataContext( viewKeyStruct::targetBHPString() ) << + ": Target bottom-hole pressure is negative", + InputError, getWrapperDataContext( viewKeyStruct::targetBHPString() ) ); // 1.b) check target rates GEOS_THROW_IF( m_targetTotalRate < 0, - getWrapperDataContext( viewKeyStruct::targetTotalRateString() ) << ": Target rate is negative", - InputError, getWrapperDataContext( viewKeyStruct::targetTotalRateString() ) ); + getWrapperDataContext( viewKeyStruct::targetTotalRateString() ) << ": Target rate is negative", + InputError, getWrapperDataContext( viewKeyStruct::targetTotalRateString() ) ); GEOS_THROW_IF( m_targetPhaseRate < 0, - getWrapperDataContext( viewKeyStruct::targetPhaseRateString() ) << ": Target oil rate is negative", - InputError, getWrapperDataContext( viewKeyStruct::targetPhaseRateString() ) ); + getWrapperDataContext( viewKeyStruct::targetPhaseRateString() ) << ": Target oil rate is negative", + InputError, getWrapperDataContext( viewKeyStruct::targetPhaseRateString() ) ); GEOS_THROW_IF( m_targetMassRate < 0, - getWrapperDataContext( viewKeyStruct::targetMassRateString() ) << ": Target mass rate is negative", - InputError, getWrapperDataContext( viewKeyStruct::targetMassRateString() ) ); + getWrapperDataContext( viewKeyStruct::targetMassRateString() ) << ": Target mass rate is negative", + InputError, getWrapperDataContext( viewKeyStruct::targetMassRateString() ) ); GEOS_THROW_IF( (m_injectionStream.empty() && m_injectionTemperature >= 0) || - (!m_injectionStream.empty() && m_injectionTemperature < 0), - "WellControls " << getDataContext() << ": Both " - << viewKeyStruct::injectionStreamString() << " and " << viewKeyStruct::injectionTemperatureString() - << " must be specified for multiphase simulations", - InputError, getDataContext() ); + (!m_injectionStream.empty() && m_injectionTemperature < 0), + "WellControls " << getDataContext() << ": Both " + << viewKeyStruct::injectionStreamString() << " and " << viewKeyStruct::injectionTemperatureString() + << " must be specified for multiphase simulations", + InputError, getDataContext() ); // 1.c) Set the multiplier for the rates if( isProducer() ) @@ -281,69 +281,69 @@ void WellControls::postInputInitialization() for( localIndex ic = 0; ic < m_injectionStream.size(); ++ic ) { GEOS_ERROR_IF( m_injectionStream[ic] < 0.0 || m_injectionStream[ic] > 1.0, - getWrapperDataContext( viewKeyStruct::injectionStreamString() ) << ": Invalid injection stream", - getWrapperDataContext( viewKeyStruct::injectionStreamString() ) ); + getWrapperDataContext( viewKeyStruct::injectionStreamString() ) << ": Invalid injection stream", + getWrapperDataContext( viewKeyStruct::injectionStreamString() ) ); sum += m_injectionStream[ic]; } GEOS_THROW_IF( LvArray::math::abs( 1.0 - sum ) > std::numeric_limits< real64 >::epsilon(), - getWrapperDataContext( viewKeyStruct::injectionStreamString() ) << ": Invalid injection stream", - InputError, getWrapperDataContext( viewKeyStruct::injectionStreamString() ) ); + getWrapperDataContext( viewKeyStruct::injectionStreamString() ) << ": Invalid injection stream", + InputError, getWrapperDataContext( viewKeyStruct::injectionStreamString() ) ); } // 3) check the flag for surface / reservoir conditions GEOS_THROW_IF( m_useSurfaceConditions != 0 && m_useSurfaceConditions != 1, - getWrapperDataContext( viewKeyStruct::useSurfaceConditionsString() ) << ": The flag to select surface/reservoir conditions must be equal to 0 or 1", - InputError, getWrapperDataContext( viewKeyStruct::useSurfaceConditionsString() ) ); + getWrapperDataContext( viewKeyStruct::useSurfaceConditionsString() ) << ": The flag to select surface/reservoir conditions must be equal to 0 or 1", + InputError, getWrapperDataContext( viewKeyStruct::useSurfaceConditionsString() ) ); // 4) check that at least one rate constraint has been defined GEOS_THROW_IF( ((m_targetPhaseRate <= 0.0 && m_targetPhaseRateTableName.empty()) && - (m_targetMassRate <= 0.0 && m_targetMassRateTableName.empty()) && - (m_targetTotalRate <= 0.0 && m_targetTotalRateTableName.empty())), - "WellControls " << getDataContext() << ": You need to specify a phase, mass, or total rate constraint. \n" << - "The phase rate constraint can be specified using " << - "either " << viewKeyStruct::targetPhaseRateString() << - " or " << viewKeyStruct::targetPhaseRateTableNameString() << ".\n" << - "The total rate constraint can be specified using " << - "either " << viewKeyStruct::targetTotalRateString() << - " or " << viewKeyStruct::targetTotalRateTableNameString()<< - "The mass rate constraint can be specified using " << - "either " << viewKeyStruct::targetMassRateString() << - " or " << viewKeyStruct::targetMassRateTableNameString(), - InputError, getDataContext() ); + (m_targetMassRate <= 0.0 && m_targetMassRateTableName.empty()) && + (m_targetTotalRate <= 0.0 && m_targetTotalRateTableName.empty())), + "WellControls " << getDataContext() << ": You need to specify a phase, mass, or total rate constraint. \n" << + "The phase rate constraint can be specified using " << + "either " << viewKeyStruct::targetPhaseRateString() << + " or " << viewKeyStruct::targetPhaseRateTableNameString() << ".\n" << + "The total rate constraint can be specified using " << + "either " << viewKeyStruct::targetTotalRateString() << + " or " << viewKeyStruct::targetTotalRateTableNameString()<< + "The mass rate constraint can be specified using " << + "either " << viewKeyStruct::targetMassRateString() << + " or " << viewKeyStruct::targetMassRateTableNameString(), + InputError, getDataContext() ); // 5) check whether redundant information has been provided GEOS_THROW_IF( ((m_targetPhaseRate > 0.0 && !m_targetPhaseRateTableName.empty())), - "WellControls " << getDataContext() << ": You have provided redundant information for well phase rate." << - " The keywords " << viewKeyStruct::targetPhaseRateString() << " and " << viewKeyStruct::targetPhaseRateTableNameString() << " cannot be specified together", - InputError, getDataContext() ); + "WellControls " << getDataContext() << ": You have provided redundant information for well phase rate." << + " The keywords " << viewKeyStruct::targetPhaseRateString() << " and " << viewKeyStruct::targetPhaseRateTableNameString() << " cannot be specified together", + InputError, getDataContext() ); GEOS_THROW_IF( ((m_targetTotalRate > 0.0 && !m_targetTotalRateTableName.empty())), - "WellControls " << getDataContext() << ": You have provided redundant information for well total rate." << - " The keywords " << viewKeyStruct::targetTotalRateString() << " and " << viewKeyStruct::targetTotalRateTableNameString() << " cannot be specified together", - InputError, getDataContext() ); + "WellControls " << getDataContext() << ": You have provided redundant information for well total rate." << + " The keywords " << viewKeyStruct::targetTotalRateString() << " and " << viewKeyStruct::targetTotalRateTableNameString() << " cannot be specified together", + InputError, getDataContext() ); GEOS_THROW_IF( ((m_targetBHP > 0.0 && !m_targetBHPTableName.empty())), - "WellControls " << getDataContext() << ": You have provided redundant information for well BHP." << - " The keywords " << viewKeyStruct::targetBHPString() << " and " << viewKeyStruct::targetBHPTableNameString() << " cannot be specified together", - InputError, getDataContext() ); + "WellControls " << getDataContext() << ": You have provided redundant information for well BHP." << + " The keywords " << viewKeyStruct::targetBHPString() << " and " << viewKeyStruct::targetBHPTableNameString() << " cannot be specified together", + InputError, getDataContext() ); GEOS_THROW_IF( ((m_targetMassRate > 0.0 && !m_targetMassRateTableName.empty())), - "WellControls " << getDataContext() << ": You have provided redundant information for well mass rate." << - " The keywords " << viewKeyStruct::targetMassRateString() << " and " << viewKeyStruct::targetMassRateTableNameString() << " cannot be specified together", - InputError, getDataContext() ); + "WellControls " << getDataContext() << ": You have provided redundant information for well mass rate." << + " The keywords " << viewKeyStruct::targetMassRateString() << " and " << viewKeyStruct::targetMassRateTableNameString() << " cannot be specified together", + InputError, getDataContext() ); GEOS_THROW_IF( ((m_targetMassRate > 0.0 && m_useSurfaceConditions==0)), - "WellControls " << getDataContext() << ": Option only valid if useSurfaceConditions set to 1", - InputError, getDataContext() ); + "WellControls " << getDataContext() << ": Option only valid if useSurfaceConditions set to 1", + InputError, getDataContext() ); // 6.1) If the well is under BHP control then the BHP must be specified. // Otherwise the BHP will be set to a default value. if( m_currentControl == Control::BHP ) { GEOS_THROW_IF( ((m_targetBHP <= 0.0 && m_targetBHPTableName.empty())), - "WellControls " << getDataContext() << ": You have to provide well BHP by specifying either " - << viewKeyStruct::targetBHPString() << " or " << viewKeyStruct::targetBHPTableNameString(), - InputError, getDataContext() ); + "WellControls " << getDataContext() << ": You have to provide well BHP by specifying either " + << viewKeyStruct::targetBHPString() << " or " << viewKeyStruct::targetBHPTableNameString(), + InputError, getDataContext() ); } else if( m_targetBHP <= 0.0 && m_targetBHPTableName.empty() ) { @@ -356,27 +356,27 @@ void WellControls::postInputInitialization() // An injector must be controlled by TotalVolRate GEOS_THROW_IF( (isInjector() && (m_inputControl == Control::PHASEVOLRATE)), - "WellControls " << getDataContext() << ": You have to control an injector with " - << EnumStrings< Control >::toString( Control::TOTALVOLRATE ), - InputError, getDataContext() ); + "WellControls " << getDataContext() << ": You have to control an injector with " + << EnumStrings< Control >::toString( Control::TOTALVOLRATE ), + InputError, getDataContext() ); // An injector must be controlled by TotalVolRate GEOS_THROW_IF( (isProducer() && (m_inputControl == Control::MASSRATE)), - "WellControls " << getDataContext() << ": You have to control an injector with " - << EnumStrings< Control >::toString( Control::MASSRATE ), - InputError, getDataContext() ); + "WellControls " << getDataContext() << ": You have to control an injector with " + << EnumStrings< Control >::toString( Control::MASSRATE ), + InputError, getDataContext() ); // 7) Make sure that the flag disabling crossflow is not used for producers GEOS_THROW_IF( isProducer() && m_isCrossflowEnabled == 0, - getWrapperDataContext( viewKeyStruct::enableCrossflowString() ) << - ": This option cannot be set to '0' for producers", - InputError, getWrapperDataContext( viewKeyStruct::enableCrossflowString() ) ); + getWrapperDataContext( viewKeyStruct::enableCrossflowString() ) << + ": This option cannot be set to '0' for producers", + InputError, getWrapperDataContext( viewKeyStruct::enableCrossflowString() ) ); // 8) Make sure that the initial pressure coefficient is positive GEOS_THROW_IF( m_initialPressureCoefficient < 0, - getWrapperDataContext( viewKeyStruct::initialPressureCoefficientString() ) << - ": This tuning coefficient is negative", - InputError, getWrapperDataContext( viewKeyStruct::initialPressureCoefficientString() ) ); + getWrapperDataContext( viewKeyStruct::initialPressureCoefficientString() ) << + ": This tuning coefficient is negative", + InputError, getWrapperDataContext( viewKeyStruct::initialPressureCoefficientString() ) ); // 9) Create time-dependent BHP table @@ -391,9 +391,9 @@ void WellControls::postInputInitialization() m_targetBHPTable = &(functionManager.getGroup< TableFunction const >( m_targetBHPTableName )); GEOS_THROW_IF( m_targetBHPTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, - "WellControls " << getDataContext() << ": The interpolation method for the time-dependent BHP table " - << m_targetBHPTable->getName() << " should be TableFunction::InterpolationType::Lower", - InputError, getDataContext() ); + "WellControls " << getDataContext() << ": The interpolation method for the time-dependent BHP table " + << m_targetBHPTable->getName() << " should be TableFunction::InterpolationType::Lower", + InputError, getDataContext() ); } // 10) Create time-dependent total rate table @@ -408,9 +408,9 @@ void WellControls::postInputInitialization() m_targetTotalRateTable = &(functionManager.getGroup< TableFunction const >( m_targetTotalRateTableName )); GEOS_THROW_IF( m_targetTotalRateTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, - "WellControls " << getDataContext() << ": The interpolation method for the time-dependent total rate table " - << m_targetTotalRateTable->getName() << " should be TableFunction::InterpolationType::Lower", - InputError, getDataContext() ); + "WellControls " << getDataContext() << ": The interpolation method for the time-dependent total rate table " + << m_targetTotalRateTable->getName() << " should be TableFunction::InterpolationType::Lower", + InputError, getDataContext() ); } // 11) Create time-dependent phase rate table @@ -425,9 +425,9 @@ void WellControls::postInputInitialization() m_targetPhaseRateTable = &(functionManager.getGroup< TableFunction const >( m_targetPhaseRateTableName )); GEOS_THROW_IF( m_targetPhaseRateTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, - "WellControls " << getDataContext() << ": The interpolation method for the time-dependent phase rate table " - << m_targetPhaseRateTable->getName() << " should be TableFunction::InterpolationType::Lower", - InputError, getDataContext() ); + "WellControls " << getDataContext() << ": The interpolation method for the time-dependent phase rate table " + << m_targetPhaseRateTable->getName() << " should be TableFunction::InterpolationType::Lower", + InputError, getDataContext() ); } // Create time-dependent mass rate table if( m_targetMassRateTableName.empty() ) @@ -441,9 +441,9 @@ void WellControls::postInputInitialization() m_targetMassRateTable = &(functionManager.getGroup< TableFunction const >( m_targetMassRateTableName )); GEOS_THROW_IF( m_targetMassRateTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, - "WellControls " << getDataContext() << ": The interpolation method for the time-dependent mass rate table " - << m_targetMassRateTable->getName() << " should be TableFunction::InterpolationType::Lower", - InputError, getDataContext() ); + "WellControls " << getDataContext() << ": The interpolation method for the time-dependent mass rate table " + << m_targetMassRateTable->getName() << " should be TableFunction::InterpolationType::Lower", + InputError, getDataContext() ); } // 12) Create the time-dependent well status table if( m_statusTableName.empty()) @@ -463,9 +463,9 @@ void WellControls::postInputInitialization() m_statusTable = &(functionManager.getGroup< TableFunction const >( m_statusTableName )); GEOS_THROW_IF( m_statusTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, - "WellControls " << getDataContext() << ": The interpolation method for the time-dependent status table " - << m_statusTable->getName() << " should be TableFunction::InterpolationType::Lower", - InputError, getDataContext() ); + "WellControls " << getDataContext() << ": The interpolation method for the time-dependent status table " + << m_statusTable->getName() << " should be TableFunction::InterpolationType::Lower", + InputError, getDataContext() ); } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp index 0c29efdc37a..097c77e66ea 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp @@ -74,8 +74,8 @@ Group * WellSolverBase::createChild( string const & childKey, string const & chi PhysicsSolverBase::groupKeyStruct::nonlinearSolverParametersString(), }; GEOS_ERROR_IF( childTypes.count( childKey ) == 0, - CatalogInterface::unknownTypeError( childKey, getDataContext(), childTypes ) , - getDataContext() ); + CatalogInterface::unknownTypeError( childKey, getDataContext(), childTypes ), + getDataContext() ); if( childKey == keys::wellControls ) { return ®isterGroup< WellControls >( childName ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp index 0d45b439562..f9476ed6513 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp @@ -664,14 +664,14 @@ PresTempCompFracInitializationKernel:: GEOS_THROW_IF( foundNegativePres.get() == 1, - wellControls.getDataContext() << "Invalid well initialization, negative pressure was found.", - InputError, wellControls.getDataContext() ); + wellControls.getDataContext() << "Invalid well initialization, negative pressure was found.", + InputError, wellControls.getDataContext() ); GEOS_THROW_IF( foundNegativeTemp.get() == 1, - wellControls.getDataContext() << "Invalid well initialization, negative temperature was found.", - InputError, wellControls.getDataContext() ); + wellControls.getDataContext() << "Invalid well initialization, negative temperature was found.", + InputError, wellControls.getDataContext() ); GEOS_THROW_IF( foundInconsistentCompFrac.get() == 1, - wellControls.getDataContext() << "Invalid well initialization, inconsistent component fractions were found.", - InputError, wellControls.getDataContext() ); + wellControls.getDataContext() << "Invalid well initialization, inconsistent component fractions were found.", + InputError, wellControls.getDataContext() ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp index f173e6242f0..ddd707cf9b1 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp @@ -579,13 +579,13 @@ PresTempInitializationKernel:: } ); GEOS_THROW_IF( foundNegativePressure.get() == 1, - wellControls.getDataContext() << ": Invalid well initialization, negative pressure was found.", - InputError, wellControls.getDataContext() ); + wellControls.getDataContext() << ": Invalid well initialization, negative pressure was found.", + InputError, wellControls.getDataContext() ); if( isThermal ) // tjb change temp in isothermal cases shouldnt be an issue (also what if temp in fluid prop calcs like compo) { GEOS_THROW_IF( foundNegativeTemp.get() == 1, - wellControls.getDataContext() << "Invalid well initialization, negative temperature was found.", - InputError, wellControls.getDataContext() ); + wellControls.getDataContext() << "Invalid well initialization, negative temperature was found.", + InputError, wellControls.getDataContext() ); } } diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SpringSlider.cpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SpringSlider.cpp index f233fd7049d..345a118ed74 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SpringSlider.cpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SpringSlider.cpp @@ -90,9 +90,9 @@ void SpringSlider< RSSOLVER_TYPE >::registerDataOnMesh( Group & meshBodies ) string & frictionLawName = subRegion.getReference< string >( viewKeyStruct::frictionLawNameString() ); frictionLawName = PhysicsSolverBase::getConstitutiveName< FrictionBase >( subRegion ); GEOS_ERROR_IF( frictionLawName.empty(), - GEOS_FMT( "{}: FrictionBase model not found on subregion {}", - this->getDataContext(), subRegion.getDataContext() ), - this->getDataContext() ); + GEOS_FMT( "{}: FrictionBase model not found on subregion {}", + this->getDataContext(), subRegion.getDataContext() ), + this->getDataContext() ); } ); } ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp index d8531e2b5db..f4d61c62d7f 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp @@ -151,18 +151,18 @@ initializePreSubGroups() bool const useMassFlow = flowSolver->getReference< integer >( CompositionalMultiphaseBase::viewKeyStruct::useMassFlagString() ); bool const useMassWell = Base::wellSolver()->template getReference< integer >( CompositionalMultiphaseWell::viewKeyStruct::useMassFlagString() ); GEOS_THROW_IF( useMassFlow != useMassWell, - GEOS_FMT( "{}: the input flag {} must be the same in the flow and well solvers, respectively '{}' and '{}'", - this->getDataContext(), CompositionalMultiphaseBase::viewKeyStruct::useMassFlagString(), - Base::reservoirSolver()->getDataContext(), Base::wellSolver()->getDataContext() ), - InputError, this->getDataContext(), Base::reservoirSolver()->getDataContext(), Base::wellSolver()->getDataContext() ); + GEOS_FMT( "{}: the input flag {} must be the same in the flow and well solvers, respectively '{}' and '{}'", + this->getDataContext(), CompositionalMultiphaseBase::viewKeyStruct::useMassFlagString(), + Base::reservoirSolver()->getDataContext(), Base::wellSolver()->getDataContext() ), + InputError, this->getDataContext(), Base::reservoirSolver()->getDataContext(), Base::wellSolver()->getDataContext() ); bool const isThermalFlow = flowSolver->getReference< integer >( CompositionalMultiphaseBase::viewKeyStruct::isThermalString() ); bool const isThermalWell = Base::wellSolver()->template getReference< integer >( CompositionalMultiphaseWell::viewKeyStruct::isThermalString() ); GEOS_THROW_IF( isThermalFlow != isThermalWell, - GEOS_FMT( "{}: the input flag {} must be the same in the flow and well solvers, respectively '{}' and '{}'", - this->getDataContext(), CompositionalMultiphaseBase::viewKeyStruct::isThermalString(), - Base::reservoirSolver()->getDataContext(), Base::wellSolver()->getDataContext() ), - InputError, this->getDataContext(), Base::reservoirSolver()->getDataContext(), Base::wellSolver()->getDataContext() ); + GEOS_FMT( "{}: the input flag {} must be the same in the flow and well solvers, respectively '{}' and '{}'", + this->getDataContext(), CompositionalMultiphaseBase::viewKeyStruct::isThermalString(), + Base::reservoirSolver()->getDataContext(), Base::wellSolver()->getDataContext() ), + InputError, this->getDataContext(), Base::reservoirSolver()->getDataContext(), Base::wellSolver()->getDataContext() ); } template< typename RESERVOIR_SOLVER > diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp index b775d322d31..67a40064f6c 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp @@ -153,9 +153,9 @@ bool validateWellPerforations( PhysicsSolverBase const * const reservoirSolver, localIndex const hasBadPerforations = MpiWrapper::max( badPerforation.first.empty() ? 0 : 1 ); GEOS_THROW_IF( !badPerforation.first.empty(), - GEOS_FMT( "{}: The well {} has a connection to the region {} which is not targeted by the flow solver", - wellSolver->getDataContext(), badPerforation.first, badPerforation.second ), - std::runtime_error, wellSolver->getDataContext() ); + GEOS_FMT( "{}: The well {} has a connection to the region {} which is not targeted by the flow solver", + wellSolver->getDataContext(), badPerforation.first, badPerforation.second ), + std::runtime_error, wellSolver->getDataContext() ); return hasBadPerforations == 0; } diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp index 8fc7bb29b3b..54f68cfe144 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp @@ -87,10 +87,10 @@ class CoupledSolver : public PhysicsSolverBase auto const & solverType = LvArray::system::demangleType< SolverType >(); solver = this->getParent().template getGroupPointer< SolverType >( solverName ); GEOS_THROW_IF( solver == nullptr, - GEOS_FMT( "{}: Could not find solver '{}' of type {}", - getDataContext(), - solverName, solverType ), - InputError, getDataContext() ); + GEOS_FMT( "{}: Could not find solver '{}' of type {}", + getDataContext(), + solverName, solverType ), + InputError, getDataContext() ); GEOS_LOG_LEVEL_RANK_0( logInfo::Coupling, GEOS_FMT( "{}: found {} solver named {}", getName(), solver->getCatalogName(), solverName ) ); @@ -674,13 +674,13 @@ class CoupledSolver : public PhysicsSolverBase bool const isSequential = getNonlinearSolverParameters().couplingType() == NonlinearSolverParameters::CouplingType::Sequential; bool const usesLineSearch = getNonlinearSolverParameters().m_lineSearchAction != NonlinearSolverParameters::LineSearchAction::None; GEOS_THROW_IF( isSequential && usesLineSearch, - GEOS_FMT( "{}: line search is not supported by the coupled solver when {} is set to `{}`. Please set {} to `{}` to remove this error", - getNonlinearSolverParameters().getWrapperDataContext( NonlinearSolverParameters::viewKeysStruct::couplingTypeString() ), - NonlinearSolverParameters::viewKeysStruct::couplingTypeString(), - EnumStrings< NonlinearSolverParameters::CouplingType >::toString( NonlinearSolverParameters::CouplingType::Sequential ), - NonlinearSolverParameters::viewKeysStruct::lineSearchActionString(), - EnumStrings< NonlinearSolverParameters::LineSearchAction >::toString( NonlinearSolverParameters::LineSearchAction::None ) ), - InputError, getNonlinearSolverParameters().getWrapperDataContext( NonlinearSolverParameters::viewKeysStruct::couplingTypeString() ) ); + GEOS_FMT( "{}: line search is not supported by the coupled solver when {} is set to `{}`. Please set {} to `{}` to remove this error", + getNonlinearSolverParameters().getWrapperDataContext( NonlinearSolverParameters::viewKeysStruct::couplingTypeString() ), + NonlinearSolverParameters::viewKeysStruct::couplingTypeString(), + EnumStrings< NonlinearSolverParameters::CouplingType >::toString( NonlinearSolverParameters::CouplingType::Sequential ), + NonlinearSolverParameters::viewKeysStruct::lineSearchActionString(), + EnumStrings< NonlinearSolverParameters::LineSearchAction >::toString( NonlinearSolverParameters::LineSearchAction::None ) ), + InputError, getNonlinearSolverParameters().getWrapperDataContext( NonlinearSolverParameters::viewKeysStruct::couplingTypeString() ) ); if( !isSequential ) { diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index 6bde5704239..5c51a39d6b8 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -269,17 +269,17 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::initializePostIni for( size_t i = 0; i < poromechanicsTargetRegionNames.size(); ++i ) { GEOS_THROW_IF( std::find( solidMechanicsTargetRegionNames.begin(), solidMechanicsTargetRegionNames.end(), - poromechanicsTargetRegionNames[i] ) - == solidMechanicsTargetRegionNames.end(), - GEOS_FMT( "{} {}: region {} must be a target region of {}", - getCatalogName(), this->getDataContext(), poromechanicsTargetRegionNames[i], - this->solidMechanicsSolver()->getDataContext() ), - InputError, this->getDataContext(), this->solidMechanicsSolver()->getDataContext() ); + poromechanicsTargetRegionNames[i] ) + == solidMechanicsTargetRegionNames.end(), + GEOS_FMT( "{} {}: region {} must be a target region of {}", + getCatalogName(), this->getDataContext(), poromechanicsTargetRegionNames[i], + this->solidMechanicsSolver()->getDataContext() ), + InputError, this->getDataContext(), this->solidMechanicsSolver()->getDataContext() ); GEOS_THROW_IF( std::find( flowTargetRegionNames.begin(), flowTargetRegionNames.end(), poromechanicsTargetRegionNames[i] ) - == flowTargetRegionNames.end(), - GEOS_FMT( "{} {}: region `{}` must be a target region of `{}`", - getCatalogName(), this->getDataContext(), poromechanicsTargetRegionNames[i], this->flowSolver()->getDataContext() ), - InputError, this->getDataContext(), this->flowSolver()->getDataContext() ); + == flowTargetRegionNames.end(), + GEOS_FMT( "{} {}: region `{}` must be a target region of `{}`", + getCatalogName(), this->getDataContext(), poromechanicsTargetRegionNames[i], this->flowSolver()->getDataContext() ), + InputError, this->getDataContext(), this->flowSolver()->getDataContext() ); } } diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp index 601f37f7af2..e9185c96a28 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp @@ -72,11 +72,11 @@ postInputInitialization() Group & physicsSolverManager = problemManager.getGroup( "Solvers" ); GEOS_THROW_IF( !physicsSolverManager.hasGroup( m_poromechanicsSolverName ), - GEOS_FMT( "{}: {} solver named {} not found", - getWrapperDataContext( viewKeyStruct::poromechanicsSolverNameString() ), - POROMECHANICS_SOLVER::catalogName(), - m_poromechanicsSolverName ), - InputError, getWrapperDataContext( viewKeyStruct::poromechanicsSolverNameString() ) ); + GEOS_FMT( "{}: {} solver named {} not found", + getWrapperDataContext( viewKeyStruct::poromechanicsSolverNameString() ), + POROMECHANICS_SOLVER::catalogName(), + m_poromechanicsSolverName ), + InputError, getWrapperDataContext( viewKeyStruct::poromechanicsSolverNameString() ) ); m_poromechanicsSolver = &physicsSolverManager.getGroup< POROMECHANICS_SOLVER >( m_poromechanicsSolverName ); @@ -85,11 +85,11 @@ postInputInitialization() TasksManager & tasksManager = problemManager.getGroup< TasksManager >( "Tasks" ); GEOS_THROW_IF( !tasksManager.hasGroup( m_solidMechanicsStatisticsName ), - GEOS_FMT( "{}: {} task named {} not found", - getWrapperDataContext( viewKeyStruct::solidMechanicsStatisticsNameString() ), - SolidMechanicsStatistics::catalogName(), - m_solidMechanicsStatisticsName ), - InputError, getWrapperDataContext( viewKeyStruct::solidMechanicsStatisticsNameString() ) ); + GEOS_FMT( "{}: {} task named {} not found", + getWrapperDataContext( viewKeyStruct::solidMechanicsStatisticsNameString() ), + SolidMechanicsStatistics::catalogName(), + m_solidMechanicsStatisticsName ), + InputError, getWrapperDataContext( viewKeyStruct::solidMechanicsStatisticsNameString() ) ); m_solidMechanicsStatistics = &tasksManager.getGroup< SolidMechanicsStatistics >( m_solidMechanicsStatisticsName ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index cb024a60957..09cea681609 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -146,9 +146,9 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER Base::initializePreSubGroups(); GEOS_THROW_IF( m_stabilizationType == stabilization::StabilizationType::Local, - this->getWrapperDataContext( viewKeyStruct::stabilizationTypeString() ) << - ": Local stabilization has been temporarily disabled", - InputError, this->getWrapperDataContext( viewKeyStruct::stabilizationTypeString() ) ); + this->getWrapperDataContext( viewKeyStruct::stabilizationTypeString() ) << + ": Local stabilization has been temporarily disabled", + InputError, this->getWrapperDataContext( viewKeyStruct::stabilizationTypeString() ) ); DomainPartition & domain = this->template getGroupByPath< DomainPartition >( "/Problem/domain" ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index 558380226f2..3893978c659 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -115,10 +115,10 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::initializePostIn for( size_t i = 0; i < poromechanicsTargetRegionNames.size(); ++i ) { GEOS_THROW_IF( std::find( flowTargetRegionNames.begin(), flowTargetRegionNames.end(), poromechanicsTargetRegionNames[i] ) - == flowTargetRegionNames.end(), - GEOS_FMT( "{} {}: region `{}` must be a target region of `{}`", - getCatalogName(), this->getDataContext(), poromechanicsTargetRegionNames[i], this->flowSolver()->getDataContext() ), - InputError, this->getDataContext(), this->flowSolver()->getDataContext() ); + == flowTargetRegionNames.end(), + GEOS_FMT( "{} {}: region `{}` must be a target region of `{}`", + getCatalogName(), this->getDataContext(), poromechanicsTargetRegionNames[i], this->flowSolver()->getDataContext() ), + InputError, this->getDataContext(), this->flowSolver()->getDataContext() ); } // Populate sub-block solver parameters for block preconditioner diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index 5561040a804..c6b1a290415 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -709,14 +709,14 @@ void SolidMechanicsLagrangianFEM::applyDisplacementBCImplicit( real64 const time "\n{} {}: There is no displacement boundary condition applied to this problem in the {} direction. \n" "The problem may be ill-posed.\n"; GEOS_WARNING_IF( isDisplacementBCAppliedGlobal[0] == 0, // target set is empty - GEOS_FMT( bcLogMessage, - getCatalogName(), getDataContext(), 'x' ), getDataContext() ); + GEOS_FMT( bcLogMessage, + getCatalogName(), getDataContext(), 'x' ), getDataContext() ); GEOS_WARNING_IF( isDisplacementBCAppliedGlobal[1] == 0, // target set is empty - GEOS_FMT( bcLogMessage, - getCatalogName(), getDataContext(), 'y' ), getDataContext() ); + GEOS_FMT( bcLogMessage, + getCatalogName(), getDataContext(), 'y' ), getDataContext() ); GEOS_WARNING_IF( isDisplacementBCAppliedGlobal[2] == 0, // target set is empty - GEOS_FMT( bcLogMessage, - getCatalogName(), getDataContext(), 'z' ), getDataContext() ); + GEOS_FMT( bcLogMessage, + getCatalogName(), getDataContext(), 'z' ), getDataContext() ); } } diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp index aa9be5a9130..34be1645a3d 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp @@ -65,9 +65,9 @@ void SolidMechanicsStateReset::postInputInitialization() Group & physicsSolverManager = problemManager.getGroup( "Solvers" ); GEOS_THROW_IF( !physicsSolverManager.hasGroup( m_solidSolverName ), - GEOS_FMT( "Task {}: physics solver named {} not found", - getDataContext(), m_solidSolverName ), - InputError, getDataContext() ); + GEOS_FMT( "Task {}: physics solver named {} not found", + getDataContext(), m_solidSolverName ), + InputError, getDataContext() ); m_solidSolver = &physicsSolverManager.getGroup< SolidMechanicsLagrangianFEM >( m_solidSolverName ); } diff --git a/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp index f72b70f59b7..81585304676 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/contact/SolidMechanicsLagrangeContact.cpp @@ -1812,8 +1812,8 @@ void SolidMechanicsLagrangeContact::assembleStabilization( MeshLevel const & mes } } GEOS_ERROR_IF( realNodes != 2, - getDataContext() << ": An edge shared by two fracture elements must have 2 nodes.", - getDataContext() ); + getDataContext() << ": An edge shared by two fracture elements must have 2 nodes.", + getDataContext() ); edge.resize( realNodes ); // Compute nodal area factor diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp index 9861aed8a19..6425e1a06b1 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp @@ -192,19 +192,19 @@ void SurfaceGenerator::postInputInitialization() static const std::set< integer > binaryOptions = { 0, 1 }; GEOS_ERROR_IF( binaryOptions.count( m_isPoroelastic ) == 0, - getWrapperDataContext( viewKeyStruct::isPoroelasticString() ) << - ": option can be either 0 (false) or 1 (true)", - getWrapperDataContext( viewKeyStruct::isPoroelasticString() ) ); + getWrapperDataContext( viewKeyStruct::isPoroelasticString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::isPoroelasticString() ) ); GEOS_ERROR_IF( binaryOptions.count( m_nodeBasedSIF ) == 0, - getWrapperDataContext( viewKeyStruct::nodeBasedSIFString() ) << - ": option can be either 0 (false) or 1 (true)", - getWrapperDataContext( viewKeyStruct::nodeBasedSIFString() ) ); + getWrapperDataContext( viewKeyStruct::nodeBasedSIFString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::nodeBasedSIFString() ) ); GEOS_ERROR_IF( binaryOptions.count( m_mpiCommOrder ) == 0, - getWrapperDataContext( viewKeyStruct::mpiCommOrderString() ) << - ": option can be either 0 (false) or 1 (true)", - getWrapperDataContext( viewKeyStruct::mpiCommOrderString() ) ); + getWrapperDataContext( viewKeyStruct::mpiCommOrderString() ) << + ": option can be either 0 (false) or 1 (true)", + getWrapperDataContext( viewKeyStruct::mpiCommOrderString() ) ); } SurfaceGenerator::~SurfaceGenerator() @@ -775,8 +775,8 @@ void SurfaceGenerator::synchronizeTipSets ( FaceManager & faceManager, localIndex const parentNodeIndex = parentNodeIndices[nodeIndex]; GEOS_ERROR_IF( parentNodeIndex == -1, - getDataContext() << ": parentNodeIndex should not be -1", - getDataContext() ); + getDataContext() << ": parentNodeIndex should not be -1", + getDataContext() ); m_tipNodes.remove( parentNodeIndex ); } @@ -802,8 +802,8 @@ void SurfaceGenerator::synchronizeTipSets ( FaceManager & faceManager, localIndex const parentEdgeIndex = parentEdgeIndices[edgeIndex]; GEOS_ERROR_IF( parentEdgeIndex == -1, - getDataContext() << ": parentEdgeIndex should not be -1", - getDataContext() ); + getDataContext() << ": parentEdgeIndex should not be -1", + getDataContext() ); m_tipEdges.remove( parentEdgeIndex ); for( localIndex const faceIndex : edgeToFaceMap[ parentEdgeIndex ] ) @@ -837,8 +837,8 @@ void SurfaceGenerator::synchronizeTipSets ( FaceManager & faceManager, { localIndex const parentFaceIndex = parentFaceIndices[faceIndex]; GEOS_ERROR_IF( parentFaceIndex == -1, - getDataContext() << ": parentFaceIndex should not be -1", - getDataContext() ); + getDataContext() << ": parentFaceIndex should not be -1", + getDataContext() ); m_trailingFaces.insert( parentFaceIndex ); m_tipFaces.remove( parentFaceIndex ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp index b3ceed0b431..c8d333a8203 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp @@ -212,8 +212,8 @@ void AcousticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLev CellElementSubRegion & elementSubRegion ) { GEOS_THROW_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, - getDataContext() << ": Invalid type of element, the acoustic solver is designed for hexahedral meshes only (C3D8) ", - InputError, getDataContext() ); + getDataContext() << ": Invalid type of element, the acoustic solver is designed for hexahedral meshes only (C3D8) ", + InputError, getDataContext() ); arrayView2d< localIndex const > const elemsToFaces = elementSubRegion.faceList(); arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes = elementSubRegion.nodeList(); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index 4f86e318846..363514a7ced 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -221,8 +221,8 @@ void AcousticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseM CellElementSubRegion & elementSubRegion ) { GEOS_THROW_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, - getDataContext() << ": Invalid type of element, the acoustic solver is designed for hexahedral meshes only (C3D8), using the SEM formulation", - InputError, getDataContext() ); + getDataContext() << ": Invalid type of element, the acoustic solver is designed for hexahedral meshes only (C3D8), using the SEM formulation", + InputError, getDataContext() ); arrayView2d< localIndex const > const elemsToFaces = elementSubRegion.faceList(); arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes = elementSubRegion.nodeList(); @@ -292,8 +292,8 @@ void AcousticWaveEquationSEM::addSourceToRightHandSide( integer const & cycleNum arrayView2d< real32 const > const sourceValue = m_sourceValue.toViewConst(); GEOS_THROW_IF( cycleNumber > sourceValue.size( 0 ), - getDataContext() << ": Too many steps compared to array size", - std::runtime_error, getDataContext() ); + getDataContext() << ": Too many steps compared to array size", + std::runtime_error, getDataContext() ); forAll< EXEC_POLICY >( sourceConstants.size( 0 ), [=] GEOS_HOST_DEVICE ( localIndex const isrc ) { if( sourceIsAccessible[isrc] == 1 ) @@ -1039,13 +1039,13 @@ real64 AcousticWaveEquationSEM::explicitStepForward( real64 const & time_n, std::ofstream wf( fileName, std::ios::out | std::ios::binary ); GEOS_THROW_IF( !wf, - getDataContext() << ": Could not open file "<< fileName << " for writing", - InputError, getDataContext() ); + getDataContext() << ": Could not open file "<< fileName << " for writing", + InputError, getDataContext() ); wf.write( (char *)&p_n[0], p_n.size()*sizeof( real32 ) ); wf.close( ); GEOS_THROW_IF( !wf.good(), - getDataContext() << ": An error occured while writing "<< fileName, - InputError, getDataContext() ); + getDataContext() << ": An error occured while writing "<< fileName, + InputError, getDataContext() ); } } @@ -1107,8 +1107,8 @@ real64 AcousticWaveEquationSEM::explicitStepBackward( real64 const & time_n, std::string fileName = GEOS_FMT( "lifo/rank_{:05}/pressure_forward_{:06}_{:08}.dat", rank, m_shotIndex, cycleNumber ); std::ifstream wf( fileName, std::ios::in | std::ios::binary ); GEOS_THROW_IF( !wf, - getDataContext() << ": Could not open file "<< fileName << " for reading", - InputError, getDataContext() ); + getDataContext() << ": Could not open file "<< fileName << " for reading", + InputError, getDataContext() ); p_forward.move( LvArray::MemorySpace::host, true ); wf.read( (char *)&p_forward[0], p_forward.size()*sizeof( real32 ) ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp index 1b5a873c5f2..8b5ef68478b 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp @@ -262,9 +262,9 @@ void ElasticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLeve { GEOS_THROW_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, - getDataContext() << ": Invalid type of element, the elastic solver is designed for hexahedral meshes only (C3D8) ", - InputError, getDataContext(), - elementSubRegion.getDataContext().getContextInfo().setPriority( -1 ) ); + getDataContext() << ": Invalid type of element, the elastic solver is designed for hexahedral meshes only (C3D8) ", + InputError, getDataContext(), + elementSubRegion.getDataContext().getContextInfo().setPriority( -1 ) ); arrayView2d< localIndex const > const elemsToFaces = elementSubRegion.faceList(); arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes = elementSubRegion.nodeList(); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index 516283c1413..2c16780151b 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -297,9 +297,9 @@ void ElasticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseMe { GEOS_THROW_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, - getDataContext() << ": Invalid type of element, the elastic solver is designed for hexahedral meshes only (C3D8) ", - InputError, getDataContext(), - elementSubRegion.getDataContext().getContextInfo().setPriority( -1 ) ); + getDataContext() << ": Invalid type of element, the elastic solver is designed for hexahedral meshes only (C3D8) ", + InputError, getDataContext(), + elementSubRegion.getDataContext().getContextInfo().setPriority( -1 ) ); arrayView2d< localIndex const > const elemsToFaces = elementSubRegion.faceList(); arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes = elementSubRegion.nodeList(); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp index 3f0cb0b2a28..bd0561bc9b5 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp @@ -337,8 +337,8 @@ void WaveSolverBase::postInputInitialization() counter++; } ); GEOS_THROW_IF( counter > 1, - getDataContext() << ": One single PML field specification is allowed", - InputError, getDataContext() ); + getDataContext() << ": One single PML field specification is allowed", + InputError, getDataContext() ); m_usePML = counter; @@ -461,8 +461,8 @@ localIndex WaveSolverBase::getNumNodesPerElem() FiniteElementDiscretization const * const feDiscretization = feDiscretizationManager.getGroupPointer< FiniteElementDiscretization >( m_discretizationName ); GEOS_THROW_IF( feDiscretization == nullptr, - getDataContext() << ": FE discretization not found: " << m_discretizationName, - InputError, getDataContext() ); + getDataContext() << ": FE discretization not found: " << m_discretizationName, + InputError, getDataContext() ); localIndex numNodesPerElem = 0; forDiscretizationOnMeshTargets( domain.getMeshBodies(), From 5781a78c2de2a04190eb22ffd8440344ea662dc5 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Tue, 23 Sep 2025 17:15:00 +0200 Subject: [PATCH 105/173] =?UTF-8?q?=E2=9C=A8=20allowing=20to=20re-throw=20?= =?UTF-8?q?with=20GEOS=5FTHROW*=20macros?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/Logger.hpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 77e482d170e..ba80adb4b43 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -223,13 +223,17 @@ __oss << stackHistory; \ if( g_errorLogger.isOutputFileEnabled() ) \ { \ + if( g_errorLogger.currentErrorMsg().m_type == ErrorLogger::MsgType::Undefined ) \ + { /* first throw site, we initialize the error message completly */ \ + g_errorLogger.currentErrorMsg() \ + .setType( ErrorLogger::MsgType::Exception ) \ + .setCodeLocation( __FILE__, __LINE__ ) \ + .setCause( cause ) \ + .setRank( ::geos::logger::internal::rank ) \ + .addCallStackInfo( stackHistory ); \ + } \ g_errorLogger.currentErrorMsg() \ - .setType( ErrorLogger::MsgType::Exception ) \ - .setCodeLocation( __FILE__, __LINE__ ) \ .addToMsg( message ) \ - .setCause( cause ) \ - .setRank( ::geos::logger::internal::rank ) \ - .addCallStackInfo( stackHistory ) \ .addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ } \ throw GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ )( __oss.str() ); \ From db75e45ac9c6d4be48f218dd196683d56cac631c Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Tue, 23 Sep 2025 17:15:23 +0200 Subject: [PATCH 106/173] =?UTF-8?q?=F0=9F=93=A6=20shema?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/schema/schema.xsd | 6 - src/coreComponents/schema/schema.xsd.other | 368 +++++++++++---------- 2 files changed, 187 insertions(+), 187 deletions(-) diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 950934b8c50..a779561026f 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -6626,8 +6626,6 @@ Even if `writeCSV ="0"`, if the table is too large for the log, a csv file will - - @@ -6668,8 +6666,6 @@ Even if `writeCSV ="0"`, if the table is too large for the log, a csv file will - - @@ -6702,8 +6698,6 @@ Even if `writeCSV ="0"`, if the table is too large for the log, a csv file will - - diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 7807d81206f..c4843bd68d8 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -1917,23 +1917,23 @@ - + - + - + - + - + - + - + - + - + @@ -2230,38 +2230,40 @@ - + + + - + - + + + - + - + - + - - - + - + - + - + - + - + - + - - + + @@ -2270,72 +2272,76 @@ - + + + - + - + + + - + - + - + - - - + - + - + - + - + - + - + - - + + - + + + - + - + + + - + - + - + - - - + - + - + - + - + - + - + - - + + @@ -2394,133 +2400,133 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2534,31 +2540,31 @@ - + - + - - - + + + - + - - - + + + - + - + - + - - - + + + - + @@ -2626,27 +2632,27 @@ - + - + - + - + - + - + - + - + @@ -2691,19 +2697,19 @@ - + - + - + - + - + - + - + @@ -2971,8 +2977,8 @@ - - + + @@ -3117,79 +3123,79 @@ - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - - - + + + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + From e07ab7278cee579f20bf6ee8a561d48d7742867d Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Tue, 23 Sep 2025 17:16:13 +0200 Subject: [PATCH 107/173] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20removing=20uninten?= =?UTF-8?q?ded=20BASE::?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/constitutive/solid/Damage.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/coreComponents/constitutive/solid/Damage.cpp b/src/coreComponents/constitutive/solid/Damage.cpp index 2ccf2e3fd6e..5272581c2ea 100644 --- a/src/coreComponents/constitutive/solid/Damage.cpp +++ b/src/coreComponents/constitutive/solid/Damage.cpp @@ -100,21 +100,21 @@ void Damage< BASE >::postInputInitialization() BASE::postInputInitialization(); GEOS_ERROR_IF( m_extDrivingForceFlag != 0 && m_extDrivingForceFlag!= 1, - BASE::getDataContext() << ": invalid external driving force flag option - must" + this->getDataContext() << ": invalid external driving force flag option - must" " be 0 or 1", - BASE::getDataContext() ); + this->getDataContext() ); GEOS_ERROR_IF( m_extDrivingForceFlag == 1 && m_defaultTensileStrength <= 0.0, - BASE::getDataContext() << ": tensile strength must be input and positive when the" + this->getDataContext() << ": tensile strength must be input and positive when the" " external driving force flag is turned on", - BASE::getDataContext() ); + this->getDataContext() ); GEOS_ERROR_IF( m_extDrivingForceFlag == 1 && m_defaultCompressiveStrength <= 0.0, - BASE::getDataContext() << ": compressive strength must be input and positive when the" + this->getDataContext() << ": compressive strength must be input and positive when the" " external driving force flag is turned on", - BASE::getDataContext() ); + this->getDataContext() ); GEOS_ERROR_IF( m_extDrivingForceFlag == 1 && m_defaultDeltaCoefficient < 0.0, - BASE::getDataContext() << ": delta coefficient must be input and non-negative when the" + this->getDataContext() << ": delta coefficient must be input and non-negative when the" " external driving force flag is turned on", - BASE::getDataContext() ); + this->getDataContext() ); // set results as array default values this->template getField< fields::solid::criticalFractureEnergy >(). From 83d0c0ff0803e90b890b521c7ce59f59f7a46c94 Mon Sep 17 00:00:00 2001 From: arng40 Date: Wed, 24 Sep 2025 16:47:45 +0200 Subject: [PATCH 108/173] xsd --- src/coreComponents/schema/schema.xsd | 136 ++++---- src/coreComponents/schema/schema.xsd.other | 372 +++++++++++---------- 2 files changed, 266 insertions(+), 242 deletions(-) diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 64de5523946..a779561026f 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -1512,6 +1512,8 @@ Even if `writeCSV ="0"`, if the table is too large for the log, a csv file will + + @@ -1526,6 +1528,8 @@ Even if `writeCSV ="0"`, if the table is too large for the log, a csv file will + + @@ -1538,6 +1542,8 @@ Even if `writeCSV ="0"`, if the table is too large for the log, a csv file will + + @@ -1552,6 +1558,8 @@ Even if `writeCSV ="0"`, if the table is too large for the log, a csv file will + + @@ -1568,6 +1576,8 @@ Even if `writeCSV ="0"`, if the table is too large for the log, a csv file will + + @@ -1582,6 +1592,8 @@ Even if `writeCSV ="0"`, if the table is too large for the log, a csv file will + + @@ -2164,6 +2176,16 @@ Information output from lower logLevels is added with the desired log level + + + + + + + + + + +When set to 2 also output convergence information to a csv--> @@ -2623,7 +2645,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -2711,7 +2733,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -2800,7 +2822,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -2888,7 +2910,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -2996,7 +3018,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -3104,7 +3126,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -3145,7 +3167,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -3196,7 +3218,7 @@ Local- Add jump stabilization on interior of macro elements--> +When set to 2 also output convergence information to a csv--> @@ -3260,7 +3282,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -3425,7 +3447,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -3521,7 +3543,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -3564,7 +3586,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -3606,7 +3628,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -3646,7 +3668,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -3686,7 +3708,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -3754,7 +3776,7 @@ Local- Add jump stabilization on interior of macro elements--> +When set to 2 also output convergence information to a csv--> @@ -3818,7 +3840,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -3862,7 +3884,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -3904,7 +3926,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -3947,7 +3969,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -4003,7 +4025,7 @@ Local- Add jump stabilization on interior of macro elements--> +When set to 2 also output convergence information to a csv--> @@ -4054,7 +4076,7 @@ Local- Add jump stabilization on interior of macro elements--> +When set to 2 also output convergence information to a csv--> @@ -4095,7 +4117,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -4135,7 +4157,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -4184,7 +4206,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -4234,7 +4256,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -4274,7 +4296,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -4335,7 +4357,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -4402,7 +4424,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -4447,7 +4469,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -4501,7 +4523,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -4555,7 +4577,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -4608,7 +4630,7 @@ Local- Add jump stabilization on interior of macro elements--> +When set to 2 also output convergence information to a csv--> @@ -4661,7 +4683,7 @@ Local- Add jump stabilization on interior of macro elements--> +When set to 2 also output convergence information to a csv--> @@ -4701,7 +4723,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -4754,7 +4776,7 @@ Local- Add jump stabilization on interior of macro elements--> +When set to 2 also output convergence information to a csv--> @@ -4794,7 +4816,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -4848,7 +4870,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -4888,7 +4910,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -4941,7 +4963,7 @@ Local- Add jump stabilization on interior of macro elements--> +When set to 2 also output convergence information to a csv--> @@ -4994,7 +5016,7 @@ Local- Add jump stabilization on interior of macro elements--> +When set to 2 also output convergence information to a csv--> @@ -5039,7 +5061,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -5115,7 +5137,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -5182,7 +5204,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -5202,6 +5224,8 @@ When set to 2 output convergence information to a csv--> + + + + +When set to 2 also output convergence information to a csv--> @@ -5306,7 +5332,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -5368,7 +5394,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -5450,7 +5476,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -5508,7 +5534,7 @@ Information output from lower logLevels is added with the desired log level +When set to 2 also output convergence information to a csv--> @@ -5794,7 +5820,7 @@ Information output from lower logLevels is added with the desired log level 1 - Information on solver execution 2 - - More precise information on solver execution--> + - More precise information on solver execution, including iterations statistics after every cycle--> @@ -6600,8 +6626,6 @@ Even if `writeCSV ="0"`, if the table is too large for the log, a csv file will - - @@ -6636,14 +6660,12 @@ Even if `writeCSV ="0"`, if the table is too large for the log, a csv file will - + - - @@ -6676,8 +6698,6 @@ Even if `writeCSV ="0"`, if the table is too large for the log, a csv file will - - diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index e3d4e22da8a..c4843bd68d8 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -1587,7 +1587,7 @@ - + @@ -1917,23 +1917,23 @@ - + - + - + - + - + - + - + - + - + @@ -2230,38 +2230,40 @@ - + + + - + - + + + - + - + - + - - - + - + - + - + - + - + - + - - + + @@ -2270,72 +2272,76 @@ - + + + - + - + + + - + - + - + - - - + - + - + - + - + - + - + - - + + - + + + - + - + + + - + - + - + - - - + - + - + - + - + - + - + - - + + @@ -2394,133 +2400,133 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -2534,31 +2540,31 @@ - + - + - - - + + + - + - - - + + + - + - + - + - - - + + + - + @@ -2614,8 +2620,6 @@ - - @@ -2628,27 +2632,27 @@ - + - + - + - + - + - + - + - + @@ -2693,19 +2697,19 @@ - + - + - + - + - + - + - + @@ -2973,8 +2977,8 @@ - - + + @@ -3119,79 +3123,79 @@ - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - - - + + + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + From 191305908e348c545288c8a4cd05bec9b22e09ea Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Thu, 25 Sep 2025 11:18:47 +0200 Subject: [PATCH 109/173] =?UTF-8?q?=F0=9F=8E=A8=20uncrustify?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mesh/generators/ExternalMeshGeneratorBase.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp index b315f63f41e..c43c8656211 100644 --- a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp @@ -80,9 +80,9 @@ void ExternalMeshGeneratorBase::postInputInitialization() bool const hasDuplicates = tmp.size() != LvArray::integerConversion< std::size_t >( v.size() ); GEOS_THROW_IF( hasDuplicates, - getWrapperDataContext( key ) << ": '" << stringutilities::join( v, ", " ) << - "' already present in list of fields to import.", - InputError, getWrapperDataContext( key ) ); + getWrapperDataContext( key ) << ": '" << stringutilities::join( v, ", " ) << + "' already present in list of fields to import.", + InputError, getWrapperDataContext( key ) ); }; checkDuplicates( m_volumicFieldsInGEOS, viewKeyStruct::volumicFieldsInGEOSString() ); checkDuplicates( m_surfacicFieldsInGEOS, viewKeyStruct::surfacicFieldsInGEOSString() ); From 6692dd23422d7548dbbfd88f6829bb3437145128 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Thu, 25 Sep 2025 11:32:49 +0200 Subject: [PATCH 110/173] =?UTF-8?q?=F0=9F=90=9B=20fix=20stream=20reset?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/Logger.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index ba80adb4b43..db3da20760c 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -149,7 +149,7 @@ std::ostringstream __msgoss; \ __msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ std::string message = __msgoss.str(); \ - __msgoss.clear(); \ + __msgoss = std::ostringstream(); \ __msgoss << CAUSE_MESSAGE; \ std::string cause = __msgoss.str(); \ std::ostringstream __oss; \ @@ -211,7 +211,7 @@ std::ostringstream __msgoss; \ __msgoss << MSG; \ std::string message = __msgoss.str(); \ - __msgoss.clear(); \ + __msgoss = std::ostringstream(); \ __msgoss << CAUSE_MESSAGE; \ std::string cause = __msgoss.str(); \ std::ostringstream __oss; \ @@ -276,7 +276,7 @@ std::ostringstream __msgoss; \ __msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ std::string message = __msgoss.str(); \ - __msgoss.clear(); \ + __msgoss = std::ostringstream(); \ __msgoss << CAUSE_MESSAGE; \ std::string cause = __msgoss.str(); \ std::ostringstream __oss; \ From 29f6fbee4bafd6fe6d8416fff6e0422a38d05dc4 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Thu, 25 Sep 2025 11:35:25 +0200 Subject: [PATCH 111/173] =?UTF-8?q?=E2=9A=B0=EF=B8=8F=20=20unused=20variab?= =?UTF-8?q?le?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/ErrorHandling.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 9fbed7081fc..b5b7040d54c 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -28,7 +28,7 @@ namespace geos { static constexpr std::string_view g_level1Start = " - "; static constexpr std::string_view g_level1Next = " "; -static constexpr std::string_view g_level2Start = " - "; +// static constexpr std::string_view g_level2Start = " - "; // unused for now static constexpr std::string_view g_level2Next = " "; static constexpr std::string_view g_level3Start = " - "; static constexpr std::string_view g_level3Next = " "; From d17972f1b2fa20c529e9c890b36322963a26d1e7 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Thu, 25 Sep 2025 11:43:59 +0200 Subject: [PATCH 112/173] =?UTF-8?q?=E2=9C=A8=20removing=20last=20LVARRAY?= =?UTF-8?q?=5F*=20error=20logging=20macros?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/Logger.cpp | 2 +- src/coreComponents/common/unitTests/testLifoStorage.cpp | 6 +++--- src/main/main.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.cpp b/src/coreComponents/common/logger/Logger.cpp index 0ea4c47a7cb..a6c35844497 100644 --- a/src/coreComponents/common/logger/Logger.cpp +++ b/src/coreComponents/common/logger/Logger.cpp @@ -27,7 +27,7 @@ namespace geos /** * @brief Insert an exception message in another one. - * @param originalMsg original exception message (i.e. thrown from LVARRAY_THROW or GEOS_THROW) + * @param originalMsg original exception message (i.e. thrown from GEOS_THROW) * @param msgToInsert message to insert at the top of the originalMsg */ std::string insertExMsg( std::string const & originalMsg, std::string const & msgToInsert ) diff --git a/src/coreComponents/common/unitTests/testLifoStorage.cpp b/src/coreComponents/common/unitTests/testLifoStorage.cpp index 54c5a864bc3..0a6ea4b410a 100644 --- a/src/coreComponents/common/unitTests/testLifoStorage.cpp +++ b/src/coreComponents/common/unitTests/testLifoStorage.cpp @@ -29,9 +29,9 @@ #define PORTABLE_EXPECT_NEAR( L, R, EPSILON ) EXPECT_LE( math::abs( ( L ) -( R ) ), EPSILON ) << \ STRINGIZE( L ) " = " << ( L ) << "\n" << STRINGIZE( R ) " = " << ( R ); #else -#define PORTABLE_EXPECT_EQ( L, R ) LVARRAY_ERROR_IF_NE( L, R ) -#define PORTABLE_EXPECT_NEAR( L, R, EPSILON ) LVARRAY_ERROR_IF_GE_MSG( math::abs( ( L ) -( R ) ), EPSILON, \ - STRINGIZE( L ) " = " << ( L ) << "\n" << STRINGIZE( R ) " = " << ( R ) ); +#define PORTABLE_EXPECT_EQ( L, R ) GEOS_ERROR_IF_NE( L, R ) +#define PORTABLE_EXPECT_NEAR( L, R, EPSILON ) GEOS_ERROR_IF_GE_MSG( math::abs( ( L ) -( R ) ), EPSILON, \ + STRINGIZE( L ) " = " << ( L ) << "\n" << STRINGIZE( R ) " = " << ( R ) ); #endif namespace geos diff --git a/src/main/main.cpp b/src/main/main.cpp index d9e9b8849fe..b5857d99013 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -49,7 +49,7 @@ int main( int argc, char *argv[] ) { state.applyInitialConditions(); state.run(); - LVARRAY_WARNING_IF( state.getState() != State::COMPLETED, "Simulation exited early." ); + GEOS_WARNING_IF( state.getState() != State::COMPLETED, "Simulation exited early." ); } initTime = state.getInitTime(); From 1b755b577014b18b5e91a493e0e5b0c9a429db19 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Thu, 25 Sep 2025 17:31:49 +0200 Subject: [PATCH 113/173] =?UTF-8?q?=E2=9C=A8=20removing=20last=20LVARRAY?= =?UTF-8?q?=5F*=20error=20logging=20macros?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/denseLinearAlgebra/unitTests/testUtils.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/coreComponents/denseLinearAlgebra/unitTests/testUtils.hpp b/src/coreComponents/denseLinearAlgebra/unitTests/testUtils.hpp index 17f093a569b..44c83edc9f1 100644 --- a/src/coreComponents/denseLinearAlgebra/unitTests/testUtils.hpp +++ b/src/coreComponents/denseLinearAlgebra/unitTests/testUtils.hpp @@ -15,8 +15,8 @@ namespace testing #if defined(GEOS_DEVICE_COMPILE) #define PORTABLE_EXPECT_EQ( L, R ) GEOS_ERROR_IF_NE( L, R ) -#define PORTABLE_EXPECT_NEAR( L, R, EPSILON ) LVARRAY_ERROR_IF_GE_MSG( LvArray::math::abs( ( L ) -( R ) ), EPSILON, \ - STRINGIZE( L ) " = " << ( L ) << "\n" << STRINGIZE( R ) " = " << ( R ) ); +#define PORTABLE_EXPECT_NEAR( L, R, EPSILON ) GEOS_ERROR_IF_GE_MSG( LvArray::math::abs( ( L ) -( R ) ), EPSILON, \ + STRINGIZE( L ) " = " << ( L ) << "\n" << STRINGIZE( R ) " = " << ( R ) ); #define PORTABLE_EXPECT_TRUE( value ) GEOS_ERROR_IF( !value, "should be true" ) #define PORTABLE_EXPECT_FALSE( value ) GEOS_ERROR_IF( value, "should be false" ) #else From 3786db46038eefa13ce09936163b304a8b7c9e12 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Thu, 25 Sep 2025 17:40:01 +0200 Subject: [PATCH 114/173] =?UTF-8?q?=E2=9C=85=20adapting=20test=20with=20er?= =?UTF-8?q?ror=20cause=20addition?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataRepository/unitTests/testErrorHandling.cpp | 2 ++ .../integrationTests/dataRepositoryTests/testGroupPath.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index 6e227419809..d41aeea42d8 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -202,6 +202,8 @@ TEST( ErrorHandling, testYamlFileExceptionOutput ) - priority: 0 inputFile: /path/to/file.xml inputLine: 32 + cause: >- + Error cause: testValue == 5 sourceLocation: file: {} line: {} diff --git a/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp b/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp index 0872e7087d3..3927a3812b4 100644 --- a/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp +++ b/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp @@ -106,7 +106,7 @@ TEST( testGroupPath, testGlobalPaths ) } catch( const std::domain_error & e ) { - static constexpr auto expectedMsg = "***** Controlling expression (should be false): child == nullptr\n" + static constexpr auto expectedMsg = "***** Error cause: child == nullptr\n" "***** Rank 0: Group Mesh (CodeIncludedXML0, l.10) has no child named mesh2\n" "The children of Mesh are: { mesh1 }"; // checks if the exception contains the expected message From efa89d804316378f882f5dddd80439e13671b939 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Thu, 25 Sep 2025 17:54:38 +0200 Subject: [PATCH 115/173] =?UTF-8?q?=F0=9F=90=9B=20GPU=20Macros=20Support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/Logger.hpp | 54 +++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index db3da20760c..15fa09f6886 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -141,6 +141,7 @@ * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ +#if !defined(GEOS_DEVICE_COMPILE) #define GEOS_ERROR_IF_CAUSE( COND, CAUSE_MESSAGE, ... ) \ do \ { \ @@ -175,6 +176,23 @@ LvArray::system::callErrorHandler(); \ } \ } while( false ) +#elif __CUDA_ARCH__ +#define GEOS_ERROR_IF_CAUSE( COND, CAUSE_MESSAGE, ... ) \ + do \ + { \ + if( COND ) \ + { \ + static constexpr string_view formatString = + "***** WARNING\n" \ + "***** LOCATION" LOCATION "\n" \ + "***** BLOCK: [%u, %u, %u]\n" \ + "***** THREAD: [%u, %u, %u]\n" \ + "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \ + "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n" \ + asm( "trap;" ); \ + } \ + } while( false ) +#endif /** * @brief Conditionally raise a hard error and terminate the program. @@ -203,6 +221,7 @@ * - Mandatory first parameter, the type of the exception to throw * - Optional following parameters, context information on the current error (DataContext) */ +#if !defined(GEOS_DEVICE_COMPILE) #define GEOS_THROW_IF_CAUSE( COND, CAUSE_MESSAGE, MSG, ... ) \ do \ { \ @@ -239,6 +258,23 @@ throw GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ )( __oss.str() ); \ } \ } while( false ) +#elif __CUDA_ARCH__ +#define GEOS_THROW_IF_CAUSE( COND, CAUSE_MESSAGE, MSG, ... ) \ + do \ + { \ + if( COND ) \ + { \ + static constexpr string_view formatString = + "***** WARNING\n" \ + "***** LOCATION" LOCATION "\n" \ + "***** BLOCK: [%u, %u, %u]\n" \ + "***** THREAD: [%u, %u, %u]\n" \ + "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \ + "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n" \ + asm( "trap;" ); \ + } \ + } while( false ) +#endif /** * @brief Conditionally raise a hard error and terminate the program. @@ -268,6 +304,7 @@ * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ +#if !defined(GEOS_DEVICE_COMPILE) #define GEOS_WARNING_IF_CAUSE( COND, CAUSE_MESSAGE, ... ) \ do \ { \ @@ -298,6 +335,23 @@ } \ } \ } while( false ) +#elif __CUDA_ARCH__ +#define GEOS_WARNING_IF_CAUSE( COND, CAUSE_MESSAGE, ... ) \ + do \ + { \ + if( COND ) \ + { \ + static constexpr string_view formatString = + "***** WARNING\n" \ + "***** LOCATION" LOCATION "\n" \ + "***** BLOCK: [%u, %u, %u]\n" \ + "***** THREAD: [%u, %u, %u]\n" \ + "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \ + "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n" \ + asm( "trap;" ); \ + } \ + } while( false ) +#endif /** * @brief Conditionally report a warning. From 7915205bdd807deb416459e0ae553e0ea61a42e3 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Fri, 26 Sep 2025 09:31:42 +0200 Subject: [PATCH 116/173] =?UTF-8?q?=F0=9F=8E=A8=20uncrustify?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/Logger.hpp | 51 ++++++++++----------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 15fa09f6886..1546babbcc3 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -182,16 +182,15 @@ { \ if( COND ) \ { \ - static constexpr string_view formatString = - "***** WARNING\n" \ - "***** LOCATION" LOCATION "\n" \ - "***** BLOCK: [%u, %u, %u]\n" \ - "***** THREAD: [%u, %u, %u]\n" \ - "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \ - "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n" \ - asm( "trap;" ); \ + static constexpr string_view formatString = "***** WARNING\n" \ + "***** LOCATION" LOCATION "\n" \ + "***** BLOCK: [%u, %u, %u]\n" \ + "***** THREAD: [%u, %u, %u]\n" \ + "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \ + "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n"; \ + asm ( "trap;" ); \ } \ - } while( false ) + }while( false ) #endif /** @@ -264,16 +263,15 @@ { \ if( COND ) \ { \ - static constexpr string_view formatString = - "***** WARNING\n" \ - "***** LOCATION" LOCATION "\n" \ - "***** BLOCK: [%u, %u, %u]\n" \ - "***** THREAD: [%u, %u, %u]\n" \ - "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \ - "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n" \ - asm( "trap;" ); \ + static constexpr string_view formatString = "***** WARNING\n" \ + "***** LOCATION" LOCATION "\n" \ + "***** BLOCK: [%u, %u, %u]\n" \ + "***** THREAD: [%u, %u, %u]\n" \ + "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \ + "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n"; \ + asm ( "trap;" ); \ } \ - } while( false ) + }while( false ) #endif /** @@ -341,16 +339,15 @@ { \ if( COND ) \ { \ - static constexpr string_view formatString = - "***** WARNING\n" \ - "***** LOCATION" LOCATION "\n" \ - "***** BLOCK: [%u, %u, %u]\n" \ - "***** THREAD: [%u, %u, %u]\n" \ - "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \ - "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n" \ - asm( "trap;" ); \ + static constexpr string_view formatString = "***** WARNING\n" \ + "***** LOCATION" LOCATION "\n" \ + "***** BLOCK: [%u, %u, %u]\n" \ + "***** THREAD: [%u, %u, %u]\n" \ + "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \ + "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n"; \ + asm ( "trap;" ); \ } \ - } while( false ) + }while( false ) #endif /** From 500bbfdcc950e1fb89cb889d8104a430fb5d7fbc Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Fri, 26 Sep 2025 13:51:30 +0200 Subject: [PATCH 117/173] =?UTF-8?q?=F0=9F=90=9B=20GPU=20forgotten=20instru?= =?UTF-8?q?ction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/Logger.hpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 1546babbcc3..5d41f79f929 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -188,9 +188,10 @@ "***** THREAD: [%u, %u, %u]\n" \ "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \ "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n"; \ + printf( formatString, blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z ); \ asm ( "trap;" ); \ } \ - }while( false ) + } while( false ) #endif /** @@ -269,9 +270,10 @@ "***** THREAD: [%u, %u, %u]\n" \ "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \ "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n"; \ + printf( formatString, blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z ); \ asm ( "trap;" ); \ } \ - }while( false ) + } while( false ) #endif /** @@ -345,9 +347,10 @@ "***** THREAD: [%u, %u, %u]\n" \ "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \ "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n"; \ + printf( formatString, blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z ); \ asm ( "trap;" ); \ } \ - }while( false ) + } while( false ) #endif /** From fa8fa542bf3636b79f36ce6a3d3abd1610715218 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Fri, 26 Sep 2025 16:25:56 +0200 Subject: [PATCH 118/173] =?UTF-8?q?=F0=9F=90=9B=20added=20pragmas=20to=20m?= =?UTF-8?q?anual=20shadow=20global=20logger=20instance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../unitTests/testErrorHandling.cpp | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index d41aeea42d8..74a4127199f 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -99,7 +99,11 @@ void endLocalLoggerTest( ErrorLogger & errorLogger, TEST( ErrorHandling, testYamlFileWarningOutput ) { - ErrorLogger g_errorLogger; // Local overriding of global 'g_errorLogger' (to contain test macros effects to local scope) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshadow" + ErrorLogger g_errorLogger; // Local overriding of global 'g_errorLogger' (to contain test macros effects to local scope) +#pragma GCC diagnostic pop + beginLocalLoggerTest( g_errorLogger, "warningTestOutput.yaml" ); GET_LINE( line1 ); GEOS_WARNING( "Conflicting pressure boundary conditions" ); @@ -161,7 +165,11 @@ TEST( ErrorHandling, testYamlFileWarningOutput ) TEST( ErrorHandling, testYamlFileExceptionOutput ) { - ErrorLogger g_errorLogger; // Local overriding of global 'g_errorLogger' (to contain test macros effects to local scope) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshadow" + ErrorLogger g_errorLogger; // Local overriding of global 'g_errorLogger' (to contain test macros effects to local scope) +#pragma GCC diagnostic pop + beginLocalLoggerTest( g_errorLogger, "exceptionTestOutput.yaml" ); size_t line1; @@ -217,7 +225,11 @@ TEST( ErrorHandling, testYamlFileExceptionOutput ) TEST( ErrorHandling, testYamlFileErrorOutput ) { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshadow" ErrorLogger g_errorLogger; // Local overriding of global 'g_errorLogger' (to contain test macros effects to local scope) +#pragma GCC diagnostic pop + beginLocalLoggerTest( g_errorLogger, "errorTestOutput.yaml" ); GET_LINE( line1 ); EXPECT_EXIT( GEOS_ERROR_IF_GT_MSG( testValue, testMaxPrecision, @@ -265,7 +277,11 @@ TEST( ErrorHandling, testYamlFileErrorOutput ) #ifdef GEOS_ASSERT_ENABLED TEST( ErrorHandling, testYamlFileAssertOutput ) { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshadow" ErrorLogger g_errorLogger; // Local overriding of global 'g_errorLogger' (to contain test macros effects to local scope) +#pragma GCC diagnostic pop + beginLocalLoggerTest( g_errorLogger, "assertTestOutput.yaml" ); GET_LINE( line1 ); EXPECT_EXIT( GEOS_ASSERT_MSG( testValue > testMinPrecision && testValue < testMaxPrecision, From c501a0f1df5a9ee0695a10bd0d2849af1e5c33f0 Mon Sep 17 00:00:00 2001 From: MelReyCG Date: Mon, 29 Sep 2025 10:38:39 +0200 Subject: [PATCH 119/173] =?UTF-8?q?=F0=9F=90=9B=20wrong=20conversion=20on?= =?UTF-8?q?=20GPU?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coreComponents/common/logger/Logger.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 5d41f79f929..46460d35228 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -182,13 +182,13 @@ { \ if( COND ) \ { \ - static constexpr string_view formatString = "***** WARNING\n" \ + static constexpr string_view formatString = "***** ERROR\n" \ "***** LOCATION" LOCATION "\n" \ "***** BLOCK: [%u, %u, %u]\n" \ "***** THREAD: [%u, %u, %u]\n" \ "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \ "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n"; \ - printf( formatString, blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z ); \ + printf( formatString.data(), blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z ); \ asm ( "trap;" ); \ } \ } while( false ) @@ -264,13 +264,13 @@ { \ if( COND ) \ { \ - static constexpr string_view formatString = "***** WARNING\n" \ + static constexpr string_view formatString = "***** ERROR\n" \ "***** LOCATION" LOCATION "\n" \ "***** BLOCK: [%u, %u, %u]\n" \ "***** THREAD: [%u, %u, %u]\n" \ "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \ "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n"; \ - printf( formatString, blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z ); \ + printf( formatString.data(), blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z ); \ asm ( "trap;" ); \ } \ } while( false ) @@ -347,7 +347,7 @@ "***** THREAD: [%u, %u, %u]\n" \ "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \ "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n"; \ - printf( formatString, blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z ); \ + printf( formatString.data(), blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z ); \ asm ( "trap;" ); \ } \ } while( false ) From cbb53223628ae2eff3fb8aa6cb344587dfc2f2ed Mon Sep 17 00:00:00 2001 From: arng40 Date: Mon, 29 Sep 2025 17:39:34 +0200 Subject: [PATCH 120/173] centralize error output --- .../common/logger/ErrorHandling.cpp | 107 ++++++++------- .../common/logger/ErrorHandling.hpp | 12 ++ src/coreComponents/common/logger/Logger.hpp | 122 ++++++------------ src/main/main.cpp | 7 +- 4 files changed, 115 insertions(+), 133 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 9fbed7081fc..113afcd9ca3 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -127,6 +127,7 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setRank( int rank ) ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addCallStackInfo( std::string_view ossStackTrace ) { std::string str = std::string( ossStackTrace ); + m_stringCallStack = str; std::istringstream iss( str ); std::string stackLine; std::size_t index; @@ -186,76 +187,82 @@ void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstr void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) { - std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); - if( yamlFile.is_open() && isOutputFileEnabled() ) + if( isOutputFileEnabled() ) { - // General errors info (type, rank on which the error occured) - yamlFile << g_level1Start << "type: " << ErrorLogger::toString( errorMsg.m_type ) << "\n"; - yamlFile << g_level1Next << "rank: "; - for( auto const & info: errorMsg.m_ranksInfo ) + std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); + if( yamlFile.is_open() ) { - yamlFile << info; - } - yamlFile << "\n"; + // General errors info (type, rank on which the error occured) + yamlFile << g_level1Start << "type: " << ErrorLogger::toString( errorMsg.m_type ) << "\n"; + yamlFile << g_level1Next << "rank: "; + for( auto const & info: errorMsg.m_ranksInfo ) + { + yamlFile << info; + } + yamlFile << "\n"; - // Error message - yamlFile << g_level1Next << "message: >-\n"; - streamMultilineYamlAttribute( errorMsg.m_msg, yamlFile, g_level2Next ); + // Error message + yamlFile << g_level1Next << "message: >-\n"; + streamMultilineYamlAttribute( errorMsg.m_msg, yamlFile, g_level2Next ); - // context information - if( !errorMsg.m_contextsInfo.empty() ) - { - // Sort contextual information by decreasing priority - std::sort( errorMsg.m_contextsInfo.begin(), errorMsg.m_contextsInfo.end(), - []( const ErrorLogger::ErrorContext & a, const ErrorLogger::ErrorContext & b ) { - return a.m_priority > b.m_priority; - } ); - // Additional informations about the context of the error and priority information of each context - yamlFile << g_level1Next << "contexts:\n"; - for( ErrorContext const & ctxInfo : errorMsg.m_contextsInfo ) + // context information + if( !errorMsg.m_contextsInfo.empty() ) { - yamlFile << g_level3Start << "priority: " << ctxInfo.m_priority << "\n"; - for( auto const & [key, value] : ctxInfo.m_attributes ) + // Sort contextual information by decreasing priority + std::sort( errorMsg.m_contextsInfo.begin(), errorMsg.m_contextsInfo.end(), + []( const ErrorLogger::ErrorContext & a, const ErrorLogger::ErrorContext & b ) { + return a.m_priority > b.m_priority; + } ); + // Additional informations about the context of the error and priority information of each context + yamlFile << g_level1Next << "contexts:\n"; + for( ErrorContext const & ctxInfo : errorMsg.m_contextsInfo ) { - yamlFile << g_level3Next << ErrorContext::attributeToString( key ) << ": " << value << "\n"; + yamlFile << g_level3Start << "priority: " << ctxInfo.m_priority << "\n"; + for( auto const & [key, value] : ctxInfo.m_attributes ) + { + yamlFile << g_level3Next << ErrorContext::attributeToString( key ) << ": " << value << "\n"; + } } } - } - // error cause - if( !errorMsg.m_cause.empty() ) - { - yamlFile << g_level1Next << "cause: >-\n"; - streamMultilineYamlAttribute( errorMsg.m_cause, yamlFile, g_level2Next ); - } + // error cause + if( !errorMsg.m_cause.empty() ) + { + yamlFile << g_level1Next << "cause: >-\n"; + streamMultilineYamlAttribute( errorMsg.m_cause, yamlFile, g_level2Next ); + } - // Location of the error in the code - yamlFile << g_level1Next << "sourceLocation:\n"; - yamlFile << g_level2Next << "file: " << errorMsg.m_file << "\n"; - yamlFile << g_level2Next << "line: " << errorMsg.m_line << "\n"; + // Location of the error in the code + yamlFile << g_level1Next << "sourceLocation:\n"; + yamlFile << g_level2Next << "file: " << errorMsg.m_file << "\n"; + yamlFile << g_level2Next << "line: " << errorMsg.m_line << "\n"; - // Information about the stack trace - if( !errorMsg.m_sourceCallStack.empty() ) - { - yamlFile << g_level1Next << "sourceCallStack:\n"; - for( size_t i = 0; i < errorMsg.m_sourceCallStack.size(); i++ ) + // Information about the stack trace + if( !errorMsg.m_sourceCallStack.empty() ) { - yamlFile << ( errorMsg.isValidStackTrace() ? - GEOS_FMT( "{}frame{}: {}\n", g_level3Start, i, errorMsg.m_sourceCallStack[i] ) : - GEOS_FMT( "{}{}\n", g_level3Start, errorMsg.m_sourceCallStack[i] ) ); + yamlFile << g_level1Next << "sourceCallStack:\n"; + for( size_t i = 0; i < errorMsg.m_sourceCallStack.size(); i++ ) + { + yamlFile << ( errorMsg.isValidStackTrace() ? + GEOS_FMT( "{}frame{}: {}\n", g_level3Start, i, errorMsg.m_sourceCallStack[i] ) : + GEOS_FMT( "{}{}\n", g_level3Start, errorMsg.m_sourceCallStack[i] ) ); + } } } + else + { + GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing.\n- Error file: {}\n- Error file enabled = {}.\n", + m_filename, g_errorLogger.isOutputFileEnabled() ) ); + } yamlFile << "\n"; yamlFile.flush(); errorMsg = ErrorMsg(); GEOS_LOG_RANK( GEOS_FMT( "The error file {} was appended.", m_filename ) ); } - else - { - GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing.\n- Error file: {}\n- Error file enabled = {}.\n", - m_filename, g_errorLogger.isOutputFileEnabled() ) ); - } + + ErrorLogger::formatMsgToAscii( errorMsg, ::geos::logger::internal::rankString, std::cout ); + } } /* namespace geos */ diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 249ca67d56b..d16ab646471 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -111,6 +111,8 @@ class ErrorLogger std::vector< ErrorContext > m_contextsInfo; /// the stack trace std::vector< std::string > m_sourceCallStack; + /// the string stack trace + std::string m_stringCallStack; /** * @brief Construct a default Error Message without field specification @@ -206,6 +208,16 @@ class ErrorLogger bool m_isValidStackTrace = false; }; + static void formatMsgToAscii( ErrorLogger::ErrorMsg const & errMsg, string const & rank, + std::ostream & output ) + { + output << "***** EXCEPTION\n"; + output << "***** LOCATION: " LOCATION "\n"; + output << "***** " << errMsg.m_cause << "\n"; + output << "***** Rank " << rank << ": " << errMsg.m_msg << "\n"; + output << errMsg.m_stringCallStack; + } + /** * @return true if the YAML file output is enabled */ diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index ba80adb4b43..9a6634ccb4e 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -146,35 +146,22 @@ { \ if( COND ) \ { \ - std::ostringstream __msgoss; \ - __msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ - std::string message = __msgoss.str(); \ - __msgoss.clear(); \ - __msgoss << CAUSE_MESSAGE; \ - std::string cause = __msgoss.str(); \ - std::ostringstream __oss; \ - __oss << "***** ERROR\n"; \ - __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** " << cause << "\n"; \ - __oss << "***** Rank " << ::geos::logger::internal::rankString << ": " << message << "\n"; \ - std::string stackHistory = LvArray::system::stackTrace( true ); \ - __oss << stackHistory; \ - std::cout << __oss.str() << std::endl; \ - if( g_errorLogger.isOutputFileEnabled() ) \ - { \ - ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ - message, \ - __FILE__, \ - __LINE__ ); \ - msgStruct.setRank( ::geos::logger::internal::rank ); \ - msgStruct.setCause( cause ); \ - msgStruct.addCallStackInfo( stackHistory ); \ - msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - g_errorLogger.flushErrorMsg( msgStruct ); \ - } \ + std::ostringstream msgoss; \ + std::ostringstream causemsgsoss; \ + msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ + causemsgsoss << CAUSE_MESSAGE; \ + ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ + msgoss.str(), \ + __FILE__, \ + __LINE__ ); \ + msgStruct.setRank( ::geos::logger::internal::rank ); \ + msgStruct.setCause( causemsgsoss.str() ); \ + msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ + msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ + g_errorLogger.flushErrorMsg( msgStruct ); \ LvArray::system::callErrorHandler(); \ } \ - } while( false ) + }while( false ) /** * @brief Conditionally raise a hard error and terminate the program. @@ -208,35 +195,23 @@ { \ if( COND ) \ { \ - std::ostringstream __msgoss; \ - __msgoss << MSG; \ - std::string message = __msgoss.str(); \ - __msgoss.clear(); \ - __msgoss << CAUSE_MESSAGE; \ - std::string cause = __msgoss.str(); \ - std::ostringstream __oss; \ - __oss << "***** EXCEPTION\n"; \ - __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** " << cause << "\n"; \ - __oss << "***** Rank " << ::geos::logger::internal::rankString << ": " << message << "\n"; \ - std::string stackHistory = LvArray::system::stackTrace( true ); \ - __oss << stackHistory; \ - if( g_errorLogger.isOutputFileEnabled() ) \ - { \ - if( g_errorLogger.currentErrorMsg().m_type == ErrorLogger::MsgType::Undefined ) \ - { /* first throw site, we initialize the error message completly */ \ - g_errorLogger.currentErrorMsg() \ - .setType( ErrorLogger::MsgType::Exception ) \ - .setCodeLocation( __FILE__, __LINE__ ) \ - .setCause( cause ) \ - .setRank( ::geos::logger::internal::rank ) \ - .addCallStackInfo( stackHistory ); \ - } \ + std::ostringstream msgoss; \ + std::ostringstream causemsgsoss; \ + msgoss << MSG; \ + causemsgsoss << CAUSE_MESSAGE; \ + if( g_errorLogger.currentErrorMsg().m_type == ErrorLogger::MsgType::Undefined ) \ + { /* first throw site, we initialize the error message completly */ \ g_errorLogger.currentErrorMsg() \ - .addToMsg( message ) \ - .addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ + .setType( ErrorLogger::MsgType::Exception ) \ + .setCodeLocation( __FILE__, __LINE__ ) \ + .setCause( causemsgsoss.str() ) \ + .setRank( ::geos::logger::internal::rank ) \ + .addCallStackInfo( LvArray::system::stackTrace( true ) ); \ } \ - throw GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ )( __oss.str() ); \ + g_errorLogger.currentErrorMsg() \ + .addToMsg( msgoss.str() ) \ + .addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ + throw GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ )(msgoss.str()); \ } \ } while( false ) @@ -273,31 +248,20 @@ { \ if( COND ) \ { \ - std::ostringstream __msgoss; \ - __msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ - std::string message = __msgoss.str(); \ - __msgoss.clear(); \ - __msgoss << CAUSE_MESSAGE; \ - std::string cause = __msgoss.str(); \ - std::ostringstream __oss; \ - __oss << "***** WARNING\n"; \ - __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** " << cause << "\n"; \ - __oss << "***** Rank " << ::geos::logger::internal::rankString << ": " << message << "\n"; \ - std::cout << __oss.str() << std::endl; \ - if( g_errorLogger.isOutputFileEnabled() ) \ - { \ - ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ - message, \ - __FILE__, \ - __LINE__ ); \ - msgStruct.setRank( ::geos::logger::internal::rank ); \ - msgStruct.setCause( cause ); \ - msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - g_errorLogger.flushErrorMsg( msgStruct ); \ - } \ + std::ostringstream msgoss; \ + std::ostringstream causemsgsoss; \ + msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ + causemsgsoss << CAUSE_MESSAGE; \ + ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ + msgoss.str(), \ + __FILE__, \ + __LINE__ ); \ + msgStruct.setRank( ::geos::logger::internal::rank ); \ + msgStruct.setCause( causemsgsoss.str() ); \ + msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ + g_errorLogger.flushErrorMsg( msgStruct ); \ } \ - } while( false ) + }while( false ) /** * @brief Conditionally report a warning. @@ -980,6 +944,6 @@ void FinalizeLogger(); } // namespace logger -} // namespace geos +} // namespace geos #endif /* GEOS_COMMON_LOGGER_HPP */ diff --git a/src/main/main.cpp b/src/main/main.cpp index d9e9b8849fe..b723c63fd5a 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -77,10 +77,9 @@ int main( int argc, char *argv[] ) catch( std::exception const & e ) { GEOS_LOG( e.what() ); - if( g_errorLogger.isOutputFileEnabled() ) - { - g_errorLogger.flushErrorMsg( g_errorLogger.currentErrorMsg() ); - } + + g_errorLogger.flushErrorMsg( g_errorLogger.currentErrorMsg() ); + LvArray::system::callErrorHandler(); basicCleanup(); std::abort(); From c743e15404da2781dc40778e4e5605a46ae76ee8 Mon Sep 17 00:00:00 2001 From: arng40 Date: Tue, 30 Sep 2025 15:12:58 +0200 Subject: [PATCH 121/173] remvove deplucated log --- src/main/main.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index b723c63fd5a..164b3870cbf 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -76,8 +76,6 @@ int main( int argc, char *argv[] ) } catch( std::exception const & e ) { - GEOS_LOG( e.what() ); - g_errorLogger.flushErrorMsg( g_errorLogger.currentErrorMsg() ); LvArray::system::callErrorHandler(); From 355e765d74bce8c9d06ae77649a2215c56d52fd3 Mon Sep 17 00:00:00 2001 From: arng40 Date: Tue, 7 Oct 2025 10:54:47 +0200 Subject: [PATCH 122/173] remove rank from arg --- src/coreComponents/common/logger/ErrorHandling.cpp | 2 +- src/coreComponents/common/logger/ErrorHandling.hpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index ccf024a0ef5..37c6194e91c 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -261,7 +261,7 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) GEOS_LOG_RANK( GEOS_FMT( "The error file {} was appended.", m_filename ) ); } - ErrorLogger::formatMsgToAscii( errorMsg, ::geos::logger::internal::rankString, std::cout ); + ErrorLogger::formatMsgToAscii( errorMsg, std::cout ); } diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index d16ab646471..57b286b5cef 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -21,6 +21,7 @@ #define INITIALIZATION_ERROR_LOGGER_HPP #include "common/DataTypes.hpp" +#include "common/format/StringUtilities.hpp" namespace geos { @@ -208,13 +209,12 @@ class ErrorLogger bool m_isValidStackTrace = false; }; - static void formatMsgToAscii( ErrorLogger::ErrorMsg const & errMsg, string const & rank, - std::ostream & output ) + static void formatMsgToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostream & output ) { output << "***** EXCEPTION\n"; output << "***** LOCATION: " LOCATION "\n"; output << "***** " << errMsg.m_cause << "\n"; - output << "***** Rank " << rank << ": " << errMsg.m_msg << "\n"; + output << "***** Rank " < Date: Wed, 5 Nov 2025 10:47:20 +0100 Subject: [PATCH 123/173] fix after merge --- .../common/logger/ErrorHandling.cpp | 100 ++++++++++-------- .../common/logger/ErrorHandling.hpp | 13 +++ src/coreComponents/common/logger/Logger.hpp | 94 +++++++++++----- 3 files changed, 131 insertions(+), 76 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index ef526f2b7bf..011c59f5d88 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -131,6 +131,7 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addRank( int rank ) ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addCallStackInfo( std::string_view ossStackTrace ) { std::string str = std::string( ossStackTrace ); + m_stringCallStack = str; std::istringstream iss( str ); std::string stackLine; std::size_t index; @@ -190,72 +191,77 @@ void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstr void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) { - std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); - if( yamlFile.is_open() && isOutputFileEnabled() ) + if( isOutputFileEnabled() ) { - // General errors info (type, rank on which the error occured) - yamlFile << g_level1Start << "type: " << ErrorLogger::toString( errorMsg.m_type ) << "\n"; - yamlFile << g_level1Next << "rank: " << stringutilities::join( errorMsg.m_ranksInfo, "," ); - yamlFile << "\n"; + std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); + if( yamlFile.is_open() && isOutputFileEnabled() ) + { + // General errors info (type, rank on which the error occured) + yamlFile << g_level1Start << "type: " << ErrorLogger::toString( errorMsg.m_type ) << "\n"; + yamlFile << g_level1Next << "rank: " << stringutilities::join( errorMsg.m_ranksInfo, "," ); + yamlFile << "\n"; - // Error message - yamlFile << g_level1Next << "message: >-\n"; - streamMultilineYamlAttribute( errorMsg.m_msg, yamlFile, g_level2Next ); + // Error message + yamlFile << g_level1Next << "message: >-\n"; + streamMultilineYamlAttribute( errorMsg.m_msg, yamlFile, g_level2Next ); - // context information - if( !errorMsg.m_contextsInfo.empty() ) - { - // Sort contextual information by decreasing priority - std::sort( errorMsg.m_contextsInfo.begin(), errorMsg.m_contextsInfo.end(), - []( const ErrorLogger::ErrorContext & a, const ErrorLogger::ErrorContext & b ) { - return a.m_priority > b.m_priority; - } ); - // Additional informations about the context of the error and priority information of each context - yamlFile << g_level1Next << "contexts:\n"; - for( ErrorContext const & ctxInfo : errorMsg.m_contextsInfo ) + // context information + if( !errorMsg.m_contextsInfo.empty() ) { - yamlFile << g_level3Start << "priority: " << ctxInfo.m_priority << "\n"; - for( auto const & [key, value] : ctxInfo.m_attributes ) + // Sort contextual information by decreasing priority + std::sort( errorMsg.m_contextsInfo.begin(), errorMsg.m_contextsInfo.end(), + []( const ErrorLogger::ErrorContext & a, const ErrorLogger::ErrorContext & b ) { + return a.m_priority > b.m_priority; + } ); + // Additional informations about the context of the error and priority information of each context + yamlFile << g_level1Next << "contexts:\n"; + for( ErrorContext const & ctxInfo : errorMsg.m_contextsInfo ) { - yamlFile << g_level3Next << ErrorContext::attributeToString( key ) << ": " << value << "\n"; + yamlFile << g_level3Start << "priority: " << ctxInfo.m_priority << "\n"; + for( auto const & [key, value] : ctxInfo.m_attributes ) + { + yamlFile << g_level3Next << ErrorContext::attributeToString( key ) << ": " << value << "\n"; + } } } - } - // error cause - if( !errorMsg.m_cause.empty() ) - { - yamlFile << g_level1Next << "cause: >-\n"; - streamMultilineYamlAttribute( errorMsg.m_cause, yamlFile, g_level2Next ); - } + // error cause + if( !errorMsg.m_cause.empty() ) + { + yamlFile << g_level1Next << "cause: >-\n"; + streamMultilineYamlAttribute( errorMsg.m_cause, yamlFile, g_level2Next ); + } - // Location of the error in the code - yamlFile << g_level1Next << "sourceLocation:\n"; - yamlFile << g_level2Next << "file: " << errorMsg.m_file << "\n"; - yamlFile << g_level2Next << "line: " << errorMsg.m_line << "\n"; + // Location of the error in the code + yamlFile << g_level1Next << "sourceLocation:\n"; + yamlFile << g_level2Next << "file: " << errorMsg.m_file << "\n"; + yamlFile << g_level2Next << "line: " << errorMsg.m_line << "\n"; - // Information about the stack trace - if( !errorMsg.m_sourceCallStack.empty() ) - { - yamlFile << g_level1Next << "sourceCallStack:\n"; - for( size_t i = 0; i < errorMsg.m_sourceCallStack.size(); i++ ) + // Information about the stack trace + if( !errorMsg.m_sourceCallStack.empty() ) { - yamlFile << ( errorMsg.isValidStackTrace() ? - GEOS_FMT( "{}frame{}: {}\n", g_level3Start, i, errorMsg.m_sourceCallStack[i] ) : - GEOS_FMT( "{}{}\n", g_level3Start, errorMsg.m_sourceCallStack[i] ) ); + yamlFile << g_level1Next << "sourceCallStack:\n"; + for( size_t i = 0; i < errorMsg.m_sourceCallStack.size(); i++ ) + { + yamlFile << ( errorMsg.isValidStackTrace() ? + GEOS_FMT( "{}frame{}: {}\n", g_level3Start, i, errorMsg.m_sourceCallStack[i] ) : + GEOS_FMT( "{}{}\n", g_level3Start, errorMsg.m_sourceCallStack[i] ) ); + } } } + else + { + GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing.\n- Error file: {}\n- Error file enabled = {}.\n", + m_filename, g_errorLogger.isOutputFileEnabled() ) ); + } + yamlFile << "\n"; yamlFile.flush(); errorMsg = ErrorMsg(); GEOS_LOG_RANK( GEOS_FMT( "The error file {} was appended.", m_filename ) ); } - else - { - GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing.\n- Error file: {}\n- Error file enabled = {}.\n", - m_filename, isOutputFileEnabled() ) ); - } + ErrorLogger::formatMsgToAscii( errorMsg, ::geos::logger::internal::g_rankString, std::cout ); } } /* namespace geos */ diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index a1275433a14..65a1cf73632 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -117,6 +117,9 @@ class ErrorLogger std::vector< ErrorContext > m_contextsInfo; /// the stack trace std::vector< std::string > m_sourceCallStack; + /// the string stack trace + std::string m_stringCallStack; + /** * @brief Construct a default Error Message @@ -218,6 +221,16 @@ class ErrorLogger bool m_isValidStackTrace = false; }; + static void formatMsgToAscii( ErrorLogger::ErrorMsg const & errMsg, string const & rank, + std::ostream & output ) + { + output << "***** EXCEPTION\n"; + output << "***** LOCATION: " LOCATION "\n"; + output << "***** " << errMsg.m_cause << "\n"; + output << "***** Rank " << rank << ": " << errMsg.m_msg << "\n"; + output << errMsg.m_stringCallStack; + } + /** * @return Global instance of the ErrorLogger class used for error/warning reporting. * @details This global instance is used across the codebase to log errors, warnings, and exceptions, diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 18b6d369234..e22695cb17b 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -151,6 +151,7 @@ * - Mandatory first parameter, the message to log (must be streamable) * - Optional following parameters, context information on the current error (DataContext) */ +#if !defined(GEOS_DEVICE_COMPILE) #define GEOS_ERROR_IF_CAUSE( COND, CAUSE_MESSAGE, ... ) \ do \ { \ @@ -162,16 +163,33 @@ causemsgsoss << CAUSE_MESSAGE; \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ msgoss.str(), \ + ::geos::logger::internal::g_rank, \ __FILE__, \ __LINE__ ); \ - msgStruct.setRank( ::geos::logger::internal::rank ); \ msgStruct.setCause( causemsgsoss.str() ); \ msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - g_errorLogger.flushErrorMsg( msgStruct ); \ + GEOS_ERROR_LOGGER_INSTANCE.flushErrorMsg( msgStruct ); \ LvArray::system::callErrorHandler(); \ } \ }while( false ) + #elif __CUDA_ARCH__ +#define GEOS_ERROR_IF_CAUSE( COND, CAUSE_MESSAGE, ... ) \ + do \ + { \ + if( COND ) \ + { \ + constexpr char const * formatString = "***** ERROR\n" \ + "***** LOCATION" LOCATION "\n" \ + "***** BLOCK: [%u, %u, %u]\n" \ + "***** THREAD: [%u, %u, %u]\n" \ + "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \ + "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n"; \ + printf( formatString, blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z ); \ + asm ( "trap;" ); \ + } \ + } while( false ) +#endif /** * @brief Conditionally raise a hard error and terminate the program. @@ -200,6 +218,7 @@ * - Mandatory first parameter, the type of the exception to throw * - Optional following parameters, context information on the current error (DataContext) */ + #if !defined(GEOS_DEVICE_COMPILE) #define GEOS_THROW_IF_CAUSE( COND, CAUSE_MESSAGE, MSG, ... ) \ do \ { \ @@ -209,21 +228,49 @@ std::ostringstream causemsgsoss; \ msgoss << MSG; \ causemsgsoss << CAUSE_MESSAGE; \ - if( g_errorLogger.currentErrorMsg().m_type == ErrorLogger::MsgType::Undefined ) \ + if( GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg().m_type == ErrorLogger::MsgType::Undefined ) \ { /* first throw site, we initialize the error message completly */ \ - g_errorLogger.currentErrorMsg() \ + GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg() \ .setType( ErrorLogger::MsgType::Exception ) \ .setCodeLocation( __FILE__, __LINE__ ) \ .setCause( causemsgsoss.str() ) \ - .setRank( ::geos::logger::internal::rank ) \ + .addRank( ::geos::logger::internal::g_rank ) \ .addCallStackInfo( LvArray::system::stackTrace( true ) ); \ } \ - g_errorLogger.currentErrorMsg() \ + GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg() \ .addToMsg( msgoss.str() ) \ .addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ throw GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ )(msgoss.str()); \ } \ } while( false ) + #elif __CUDA_ARCH__ +#define GEOS_THROW_IF_CAUSE( COND, CAUSE_MESSAGE, MSG, ... ) \ + do \ + { \ + if( COND ) \ + { \ + static char const formatString[] = "***** ERROR\n" \ + "***** LOCATION" LOCATION "\n" \ + "***** BLOCK: [%u, %u, %u]\n" \ + "***** THREAD: [%u, %u, %u]\n" \ + "***** " STRINGIZE( CAUSE_MESSAGE ) "\n" \ + "***** " STRINGIZE( GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ) ) "\n\n"; \ + printf( formatString, blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z ); \ + asm ( "trap;" ); \ + } \ + } while( false ) +#endif + +/** + * @brief Conditionally raise a hard error and terminate the program. + * @param COND A condition that causes the error if true. + * @param MSG a message to log (any expression that can be stream inserted) + * @param ... Variable arguments with the following structure: + * - Mandatory first parameter, the type of the exception to throw + * - Optional following parameters, context information on the current error (DataContext) + */ +#define GEOS_THROW_IF( COND, MSG, ... ) \ + GEOS_THROW_IF_CAUSE( COND, "Error cause: " STRINGIZE( COND ), MSG, __VA_ARGS__ ) /** * @brief Conditionally raise a hard error and terminate the program. @@ -249,29 +296,18 @@ { \ if( COND ) \ { \ - std::ostringstream __msgoss; \ - __msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ - std::string __message = __msgoss.str(); \ - __msgoss = std::ostringstream(); \ - __msgoss << CAUSE_MESSAGE; \ - std::string __cause = __msgoss.str(); \ - std::ostringstream __oss; \ - __oss << "***** WARNING\n"; \ - __oss << "***** LOCATION: " LOCATION "\n"; \ - __oss << "***** " << __cause << "\n"; \ - __oss << "***** Rank " << ::geos::logger::internal::g_rankString << ": " << __message << "\n"; \ - std::cout << __oss.str() << std::endl; \ - if( GEOS_ERROR_LOGGER_INSTANCE.isOutputFileEnabled() ) \ - { \ - ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ - __message, \ - ::geos::logger::internal::g_rank, \ - __FILE__, \ - __LINE__ ); \ - msgStruct.setCause( __cause ); \ - msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - GEOS_ERROR_LOGGER_INSTANCE.flushErrorMsg( msgStruct ); \ - } \ + std::ostringstream msgoss; \ + std::ostringstream causemsgsoss; \ + msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ + causemsgsoss << CAUSE_MESSAGE; \ + ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ + msgoss.str(), \ + ::geos::logger::internal::g_rank, \ + __FILE__, \ + __LINE__ ); \ + msgStruct.setCause( causemsgsoss.str() ); \ + msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ + GEOS_ERROR_LOGGER_INSTANCE.flushErrorMsg( msgStruct ); \ } \ } while( false ) #elif __CUDA_ARCH__ From cf0afc5cbdd91d41c59ecd9b41219bcf6df185bf Mon Sep 17 00:00:00 2001 From: arng40 Date: Wed, 5 Nov 2025 11:26:05 +0100 Subject: [PATCH 124/173] doc & fix --- src/coreComponents/common/logger/ErrorHandling.cpp | 11 +++++------ src/coreComponents/common/logger/ErrorHandling.hpp | 8 +++++++- src/coreComponents/common/logger/Logger.hpp | 4 +--- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 011c59f5d88..4a917ecc089 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -248,18 +248,17 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) GEOS_FMT( "{}{}\n", g_level3Start, errorMsg.m_sourceCallStack[i] ) ); } } + + yamlFile << "\n"; + yamlFile.flush(); + errorMsg = ErrorMsg(); + GEOS_LOG_RANK( GEOS_FMT( "The error file {} was appended.", m_filename ) ); } else { GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing.\n- Error file: {}\n- Error file enabled = {}.\n", m_filename, g_errorLogger.isOutputFileEnabled() ) ); } - - - yamlFile << "\n"; - yamlFile.flush(); - errorMsg = ErrorMsg(); - GEOS_LOG_RANK( GEOS_FMT( "The error file {} was appended.", m_filename ) ); } ErrorLogger::formatMsgToAscii( errorMsg, ::geos::logger::internal::g_rankString, std::cout ); } diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 65a1cf73632..64303c0bb42 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -221,8 +221,14 @@ class ErrorLogger bool m_isValidStackTrace = false; }; + /** + * @brief Retrieve all informations from the ErrorLogger and format into an ascii message + * @param errMsg Class containing all the error/warning information + * @param rank The rank where the error/warning happened + * @param output The output stream. By default std::cout + */ static void formatMsgToAscii( ErrorLogger::ErrorMsg const & errMsg, string const & rank, - std::ostream & output ) + std::ostream & output = std::cout ) { output << "***** EXCEPTION\n"; output << "***** LOCATION: " LOCATION "\n"; diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index e22695cb17b..1d5bf6fb889 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -26,7 +26,6 @@ #include "common/format/Format.hpp" #include "LvArray/src/Macros.hpp" #include "common/logger/ErrorHandling.hpp" -#include "common/logger/ErrorHandling.hpp" // System includes #include @@ -274,7 +273,6 @@ /** * @brief Conditionally raise a hard error and terminate the program. - * @param COND A condition that causes the error if true. * @param MSG a message to log (any expression that can be stream inserted) * @param ... Variable arguments with the following structure: * - Mandatory first parameter, the type of the exception to throw @@ -1033,6 +1031,6 @@ void FinalizeLogger(); } // namespace logger -} // namespace geos +} // namespace geos #endif /* GEOS_COMMON_LOGGER_HPP */ From efcc52d74e24e3c41d0a69238c83e1898815147d Mon Sep 17 00:00:00 2001 From: arng40 Date: Fri, 7 Nov 2025 15:30:55 +0100 Subject: [PATCH 125/173] fix test --- .../common/logger/ErrorHandling.cpp | 4 +-- .../common/logger/ErrorHandling.hpp | 20 ++++++++------- src/coreComponents/common/logger/Logger.hpp | 24 +++++++++++------- .../unitTests/testErrorHandling.cpp | 25 +++++++++++-------- src/main/main.cpp | 4 +-- 5 files changed, 44 insertions(+), 33 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 4a917ecc089..3c7e797389d 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -189,7 +189,7 @@ void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstr } } -void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) +void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg, std::ostringstream & msgoss ) { if( isOutputFileEnabled() ) { @@ -260,7 +260,7 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) m_filename, g_errorLogger.isOutputFileEnabled() ) ); } } - ErrorLogger::formatMsgToAscii( errorMsg, ::geos::logger::internal::g_rankString, std::cout ); + ErrorLogger::formatMsgToAscii( errorMsg, ::geos::logger::internal::g_rankString, msgoss ); } } /* namespace geos */ diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 64303c0bb42..e2cf0ae3f5c 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -22,6 +22,7 @@ #include "common/DataTypes.hpp" + namespace geos { @@ -37,7 +38,7 @@ class ErrorLogger * @enum MsgType * Enum listing the different types of possible errors */ - enum class MsgType + enum class MsgType : integer { Error, Warning, @@ -225,16 +226,17 @@ class ErrorLogger * @brief Retrieve all informations from the ErrorLogger and format into an ascii message * @param errMsg Class containing all the error/warning information * @param rank The rank where the error/warning happened - * @param output The output stream. By default std::cout + * @param msgoss The output stream. By default std::cout */ static void formatMsgToAscii( ErrorLogger::ErrorMsg const & errMsg, string const & rank, - std::ostream & output = std::cout ) + std::ostringstream & msgoss ) { - output << "***** EXCEPTION\n"; - output << "***** LOCATION: " LOCATION "\n"; - output << "***** " << errMsg.m_cause << "\n"; - output << "***** Rank " << rank << ": " << errMsg.m_msg << "\n"; - output << errMsg.m_stringCallStack; + + msgoss << "***** " << ErrorLogger::toString( errMsg.m_type ) << "\n"; + msgoss << "***** LOCATION: " << errMsg.m_file<< "\n"; + msgoss << "***** " << errMsg.m_cause << "\n"; + msgoss << "***** Rank " << rank << ": " << errMsg.m_msg << "\n"; + msgoss << errMsg.m_stringCallStack; } /** @@ -300,7 +302,7 @@ class ErrorLogger * and reset the errorMsg instance to its initial state * @param errorMsg a constant reference to the error */ - void flushErrorMsg( ErrorMsg & errorMsg ); + void flushErrorMsg( ErrorMsg & errorMsg, std::ostringstream & oss ); private: /// The error constructed via exceptions diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 1d5bf6fb889..1116a1bf434 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -156,9 +156,10 @@ { \ if( COND ) \ { \ + std::ostringstream flushoss; \ std::ostringstream msgoss; \ - std::ostringstream causemsgsoss; \ msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ + std::ostringstream causemsgsoss; \ causemsgsoss << CAUSE_MESSAGE; \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ msgoss.str(), \ @@ -168,7 +169,7 @@ msgStruct.setCause( causemsgsoss.str() ); \ msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - GEOS_ERROR_LOGGER_INSTANCE.flushErrorMsg( msgStruct ); \ + GEOS_ERROR_LOGGER_INSTANCE.flushErrorMsg( msgStruct, flushoss ); \ LvArray::system::callErrorHandler(); \ } \ }while( false ) @@ -223,9 +224,10 @@ { \ if( COND ) \ { \ + std::ostringstream flushoss; \ std::ostringstream msgoss; \ - std::ostringstream causemsgsoss; \ msgoss << MSG; \ + std::ostringstream causemsgsoss; \ causemsgsoss << CAUSE_MESSAGE; \ if( GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg().m_type == ErrorLogger::MsgType::Undefined ) \ { /* first throw site, we initialize the error message completly */ \ @@ -239,7 +241,9 @@ GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg() \ .addToMsg( msgoss.str() ) \ .addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - throw GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ )(msgoss.str()); \ + ErrorLogger::formatMsgToAscii( GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg(), \ + ::geos::logger::internal::g_rankString, flushoss ); \ + throw GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ )( flushoss.str()); \ } \ } while( false ) #elif __CUDA_ARCH__ @@ -294,9 +298,10 @@ { \ if( COND ) \ { \ + std::ostringstream flushoss; \ std::ostringstream msgoss; \ - std::ostringstream causemsgsoss; \ msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ + std::ostringstream causemsgsoss; \ causemsgsoss << CAUSE_MESSAGE; \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ msgoss.str(), \ @@ -305,7 +310,7 @@ __LINE__ ); \ msgStruct.setCause( causemsgsoss.str() ); \ msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - GEOS_ERROR_LOGGER_INSTANCE.flushErrorMsg( msgStruct ); \ + GEOS_ERROR_LOGGER_INSTANCE.flushErrorMsg( msgStruct, flushoss ); \ } \ } while( false ) #elif __CUDA_ARCH__ @@ -1007,7 +1012,7 @@ extern std::string g_rankString; extern std::ostream * g_rankStream; -} // namespace internal +} // namespace internal #if defined(GEOS_USE_MPI) /** @@ -1029,8 +1034,9 @@ void InitializeLogger( const std::string & rank_output_dir="" ); */ void FinalizeLogger(); -} // namespace logger +} // namespace logger + -} // namespace geos +} // namespace geos #endif /* GEOS_COMMON_LOGGER_HPP */ diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index 39103cc5580..ae65e5ae4fb 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -14,6 +14,7 @@ */ // forcefully enable asserts macros for this unit test +#include #define GEOS_ASSERT_ENABLED #include "common/logger/ErrorHandling.hpp" @@ -182,14 +183,15 @@ TEST( ErrorHandling, testYamlFileExceptionOutput ) .addToMsg( errorMsg ) .addContextInfo( additionalContext.getContextInfo() ) .addContextInfo( importantAdditionalContext.getContextInfo().setPriority( 2 ) ); - } - testErrorLogger.flushErrorMsg( testErrorLogger.currentErrorMsg() ); - endLocalLoggerTest( testErrorLogger, { - R"(errors:)", - GEOS_FMT( - R"(- type: Exception + std::ostringstream flushoss; + testErrorLogger.flushErrorMsg( testErrorLogger.currentErrorMsg(), flushoss ); + endLocalLoggerTest( testErrorLogger, { + R"(errors:)", + + GEOS_FMT( + R"(- type: Exception rank: 0 message: >- Table input error. @@ -210,11 +212,12 @@ TEST( ErrorHandling, testYamlFileExceptionOutput ) file: {} line: {} sourceCallStack:)", - __FILE__, line1 ), - "- frame0: ", - "- frame1: ", - "- frame2: " - } ); + __FILE__, line1 ), + "- frame0: ", + "- frame1: ", + "- frame2: " + } ); + } } TEST( ErrorHandling, testYamlFileErrorOutput ) diff --git a/src/main/main.cpp b/src/main/main.cpp index fd575a17ab9..0ffe5941574 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -76,8 +76,8 @@ int main( int argc, char *argv[] ) } catch( std::exception const & e ) { - - ErrorLogger::global().flushErrorMsg( ErrorLogger::global().currentErrorMsg() ); + std::ostringstream flushoss; + ErrorLogger::global().flushErrorMsg( ErrorLogger::global().currentErrorMsg(), flushoss ); LvArray::system::callErrorHandler(); basicCleanup(); From 79b97918cc3c8e196cb630f0c744961017f7c7a4 Mon Sep 17 00:00:00 2001 From: arng40 Date: Wed, 12 Nov 2025 11:03:26 +0100 Subject: [PATCH 126/173] test error --- src/coreComponents/common/Units.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/coreComponents/common/Units.cpp b/src/coreComponents/common/Units.cpp index e249441f3ff..dbcf194e948 100644 --- a/src/coreComponents/common/Units.cpp +++ b/src/coreComponents/common/Units.cpp @@ -18,6 +18,7 @@ */ #include "Units.hpp" +#include "common/logger/Logger.hpp" namespace geos { @@ -75,6 +76,14 @@ std::ostream & operator<<( std::ostream & os, TimeFormatInfo const & info ) TimeFormatInfo TimeFormatInfo::fromSeconds( double const seconds ) { + if( std::isnan( seconds ) || std::isinf( seconds ) ) + { + // Handle error appropriately + GEOS_ERROR( GEOS_FMT( "Invalid time value: {} ", seconds ) ); + return TimeFormatInfo( 0.0, 0, 0, 0, 0, 0 ); + } + std::cout << seconds << std::endl; + double remainingSeconds = seconds < 0.0 ? -seconds : seconds; int const totalYears = int( remainingSeconds / YearSeconds ); remainingSeconds -= totalYears * YearSeconds; From d951a16dc48103f1bd8bc965a47163f1cdb2d7f4 Mon Sep 17 00:00:00 2001 From: arng40 Date: Wed, 12 Nov 2025 11:19:16 +0100 Subject: [PATCH 127/173] initialize m_time --- src/coreComponents/common/Units.cpp | 7 ------- src/coreComponents/events/EventManager.hpp | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/coreComponents/common/Units.cpp b/src/coreComponents/common/Units.cpp index dbcf194e948..c2514df77de 100644 --- a/src/coreComponents/common/Units.cpp +++ b/src/coreComponents/common/Units.cpp @@ -76,13 +76,6 @@ std::ostream & operator<<( std::ostream & os, TimeFormatInfo const & info ) TimeFormatInfo TimeFormatInfo::fromSeconds( double const seconds ) { - if( std::isnan( seconds ) || std::isinf( seconds ) ) - { - // Handle error appropriately - GEOS_ERROR( GEOS_FMT( "Invalid time value: {} ", seconds ) ); - return TimeFormatInfo( 0.0, 0, 0, 0, 0, 0 ); - } - std::cout << seconds << std::endl; double remainingSeconds = seconds < 0.0 ? -seconds : seconds; int const totalYears = int( remainingSeconds / YearSeconds ); diff --git a/src/coreComponents/events/EventManager.hpp b/src/coreComponents/events/EventManager.hpp index 0e5024fb07c..09a2b73a45c 100644 --- a/src/coreComponents/events/EventManager.hpp +++ b/src/coreComponents/events/EventManager.hpp @@ -159,7 +159,7 @@ class EventManager : public dataRepository::Group integer m_maxCycle; /// Simulation timestamp at the beginning of the cycle - real64 m_time; + real64 m_time = 0.0; /// Current timestep request real64 m_dt; From 29dec2683f6e92b0843cd27af5fb078bcf123bbc Mon Sep 17 00:00:00 2001 From: arng40 Date: Wed, 12 Nov 2025 11:38:16 +0100 Subject: [PATCH 128/173] add main for testUnits --- src/coreComponents/common/unitTests/testUnits.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/coreComponents/common/unitTests/testUnits.cpp b/src/coreComponents/common/unitTests/testUnits.cpp index 9dc1685632d..2fdd6823f83 100644 --- a/src/coreComponents/common/unitTests/testUnits.cpp +++ b/src/coreComponents/common/unitTests/testUnits.cpp @@ -155,3 +155,11 @@ TEST( Units, SystemDurationFormatTest ) } } } + + +int main( int ac, char * av[] ) +{ + ::testing::InitGoogleTest( &ac, av ); + int const result = RUN_ALL_TESTS(); + return result; +} From 6be688ccf9ba7299579a2b9f9d8cc54d4a0c05db Mon Sep 17 00:00:00 2001 From: arng40 Date: Thu, 13 Nov 2025 11:14:46 +0100 Subject: [PATCH 129/173] missing std::cout --- src/coreComponents/common/logger/ErrorHandling.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index e2cf0ae3f5c..f25f67d0c20 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -237,6 +237,7 @@ class ErrorLogger msgoss << "***** " << errMsg.m_cause << "\n"; msgoss << "***** Rank " << rank << ": " << errMsg.m_msg << "\n"; msgoss << errMsg.m_stringCallStack; + std::cout << msgoss.str() < Date: Fri, 21 Nov 2025 10:39:12 +0100 Subject: [PATCH 130/173] uncrust --- .../common/initializeEnvironment.cpp | 4 +- .../common/logger/ErrorHandling.cpp | 32 ++-- src/coreComponents/schema/schema.xsd | 154 ++++++++++++++++++ src/coreComponents/schema/schema.xsd.other | 50 +++++- 4 files changed, 220 insertions(+), 20 deletions(-) diff --git a/src/coreComponents/common/initializeEnvironment.cpp b/src/coreComponents/common/initializeEnvironment.cpp index 46a81ec21a1..5c53f7fa34d 100644 --- a/src/coreComponents/common/initializeEnvironment.cpp +++ b/src/coreComponents/common/initializeEnvironment.cpp @@ -106,7 +106,7 @@ void setupLogger() error.addContextInfo( ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( detectionLocation ) } } } ); std::ostringstream flushoss; - ErrorLogger::global().flushErrorMsg( error,flushoss ); + ErrorLogger::global().flushErrorMsg( error, flushoss ); } // we do not terminate the program as 1. the error could be non-fatal, 2. there may be more messages to output. @@ -142,7 +142,7 @@ void setupLogger() ErrorContext{ { { ErrorContext::Attribute::Signal, std::to_string( signal ) } }, 1 }, ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( "signal handler" ) } }, 0 } ); std::ostringstream flushoss; - ErrorLogger::global().flushErrorMsg( error,flushoss ); + ErrorLogger::global().flushErrorMsg( error, flushoss ); } // call program termination diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 79fd39b70cf..b4128f100eb 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -272,24 +272,24 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg, std::ostrings streamMultilineYamlAttribute( errorMsg.m_cause, yamlFile, g_level2Next ); } - // Location of the error in the code - if( !errorMsg.m_file.empty() ) - { - yamlFile << g_level1Next << "sourceLocation:\n"; - yamlFile << g_level2Next << "file: " << errorMsg.m_file << "\n"; - yamlFile << g_level2Next << "line: " << errorMsg.m_line << "\n"; - } - // Information about the stack trace - if( !errorMsg.m_sourceCallStack.empty() ) - { - yamlFile << g_level1Next << "sourceCallStack:\n"; - for( size_t i = 0; i < errorMsg.m_sourceCallStack.size(); i++ ) + // Location of the error in the code + if( !errorMsg.m_file.empty() ) { - yamlFile << ( errorMsg.isValidStackTrace() ? - GEOS_FMT( "{}frame{}: {}\n", g_level3Start, i, errorMsg.m_sourceCallStack[i] ) : - GEOS_FMT( "{}{}\n", g_level3Start, errorMsg.m_sourceCallStack[i] ) ); + yamlFile << g_level1Next << "sourceLocation:\n"; + yamlFile << g_level2Next << "file: " << errorMsg.m_file << "\n"; + yamlFile << g_level2Next << "line: " << errorMsg.m_line << "\n"; + } + // Information about the stack trace + if( !errorMsg.m_sourceCallStack.empty() ) + { + yamlFile << g_level1Next << "sourceCallStack:\n"; + for( size_t i = 0; i < errorMsg.m_sourceCallStack.size(); i++ ) + { + yamlFile << ( errorMsg.isValidStackTrace() ? + GEOS_FMT( "{}frame{}: {}\n", g_level3Start, i, errorMsg.m_sourceCallStack[i] ) : + GEOS_FMT( "{}{}\n", g_level3Start, errorMsg.m_sourceCallStack[i] ) ); + } } - } yamlFile << "\n"; yamlFile.flush(); diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index e29fdc5fd0b..8c982f16f26 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -463,6 +463,10 @@ + + + + @@ -491,6 +495,10 @@ + + + + @@ -569,6 +577,10 @@ + + + + @@ -581,6 +593,10 @@ + + + + @@ -2721,6 +2737,7 @@ Information output from lower logLevels is added with the desired log level + @@ -2728,6 +2745,7 @@ Information output from lower logLevels is added with the desired log level + @@ -5009,6 +5027,60 @@ Local- Add jump stabilization on interior of macro elements--> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5349,6 +5421,60 @@ Local- Add jump stabilization on interior of macro elements--> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5893,9 +6019,11 @@ When set to `all` output both convergence & iteration information to a csv.--> + + @@ -6089,6 +6217,19 @@ Information output from lower logLevels is added with the desired log level + + + + + + + + + + + + + + + + + + + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 33a2ec00f2c..4d940908f6c 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -516,7 +516,7 @@ - + @@ -585,6 +585,7 @@ + @@ -592,6 +593,7 @@ + @@ -1199,6 +1201,17 @@ + + + + + + + + + + + @@ -1274,6 +1287,17 @@ + + + + + + + + + + + @@ -1442,9 +1466,11 @@ + + @@ -1474,9 +1500,11 @@ + + @@ -1516,7 +1544,7 @@ - + @@ -3549,6 +3577,12 @@ + + + + + + @@ -3563,14 +3597,26 @@ + + + + + + + + + + + + From df926d5561c08fb807ff82989a5811baefa981ac Mon Sep 17 00:00:00 2001 From: arng40 Date: Fri, 21 Nov 2025 15:24:13 +0100 Subject: [PATCH 131/173] remove unecessary var --- .../common/initializeEnvironment.cpp | 6 ++--- .../common/logger/ErrorHandling.cpp | 4 +-- .../common/logger/ErrorHandling.hpp | 25 ++++++++++--------- src/coreComponents/common/logger/Logger.hpp | 16 ++++++------ .../unitTests/testErrorHandling.cpp | 4 +-- src/main/main.cpp | 4 +-- 6 files changed, 28 insertions(+), 31 deletions(-) diff --git a/src/coreComponents/common/initializeEnvironment.cpp b/src/coreComponents/common/initializeEnvironment.cpp index 5c53f7fa34d..7dcdc4ba974 100644 --- a/src/coreComponents/common/initializeEnvironment.cpp +++ b/src/coreComponents/common/initializeEnvironment.cpp @@ -105,8 +105,7 @@ void setupLogger() error.addCallStackInfo( stackHistory ); error.addContextInfo( ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( detectionLocation ) } } } ); - std::ostringstream flushoss; - ErrorLogger::global().flushErrorMsg( error, flushoss ); + ErrorLogger::global().flushErrorMsg( error ); } // we do not terminate the program as 1. the error could be non-fatal, 2. there may be more messages to output. @@ -141,8 +140,7 @@ void setupLogger() error.addContextInfo( ErrorContext{ { { ErrorContext::Attribute::Signal, std::to_string( signal ) } }, 1 }, ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( "signal handler" ) } }, 0 } ); - std::ostringstream flushoss; - ErrorLogger::global().flushErrorMsg( error, flushoss ); + ErrorLogger::global().flushErrorMsg( error ); } // call program termination diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index b4128f100eb..f4c7cadba53 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -229,7 +229,7 @@ void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstr } } -void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg, std::ostringstream & msgoss ) +void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) { if( isOutputFileEnabled() ) { @@ -302,7 +302,7 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg, std::ostrings m_filename, g_errorLogger.isOutputFileEnabled() ) ); } } - ErrorLogger::formatMsgToAscii( errorMsg, ::geos::logger::internal::g_rankString, msgoss ); + ErrorLogger::formatMsgToAscii( errorMsg, ::geos::logger::internal::g_rankString ); } } /* namespace geos */ diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 6ecff9001de..2eeb2e50f83 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -21,6 +21,7 @@ #define INITIALIZATION_ERROR_LOGGER_HPP #include "common/DataTypes.hpp" +#include namespace geos @@ -234,22 +235,21 @@ class ErrorLogger bool m_isValidStackTrace = false; }; - /** + /** /// The final error message displayed to standard output * @brief Retrieve all informations from the ErrorLogger and format into an ascii message * @param errMsg Class containing all the error/warning information * @param rank The rank where the error/warning happened - * @param msgoss The output stream. By default std::cout */ - static void formatMsgToAscii( ErrorLogger::ErrorMsg const & errMsg, string const & rank, - std::ostringstream & msgoss ) + static string formatMsgToAscii( ErrorLogger::ErrorMsg const & errMsg, string const & rank ) { - - msgoss << "***** " << ErrorLogger::toString( errMsg.m_type ) << "\n"; - msgoss << "***** LOCATION: " << errMsg.m_file<< "\n"; - msgoss << "***** " << errMsg.m_cause << "\n"; - msgoss << "***** Rank " << rank << ": " << errMsg.m_msg << "\n"; - msgoss << errMsg.m_stringCallStack; - std::cout << msgoss.str() < Date: Fri, 21 Nov 2025 15:27:26 +0100 Subject: [PATCH 132/173] doxygen --- src/coreComponents/common/logger/ErrorHandling.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 2eeb2e50f83..553d2f27ad3 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -235,10 +235,11 @@ class ErrorLogger bool m_isValidStackTrace = false; }; - /** /// The final error message displayed to standard output + /** * @brief Retrieve all informations from the ErrorLogger and format into an ascii message * @param errMsg Class containing all the error/warning information * @param rank The rank where the error/warning happened + * @return The error message displayed to the standard output */ static string formatMsgToAscii( ErrorLogger::ErrorMsg const & errMsg, string const & rank ) { From 2fee6bf4f3159c87b494ad4e0f58636e7592c52a Mon Sep 17 00:00:00 2001 From: arng40 Date: Fri, 21 Nov 2025 15:54:17 +0100 Subject: [PATCH 133/173] clean --- src/coreComponents/common/Units.cpp | 2 -- src/coreComponents/common/initializeEnvironment.cpp | 2 ++ src/coreComponents/common/logger/ErrorHandling.hpp | 3 +-- src/coreComponents/common/logger/Logger.hpp | 5 ++--- src/coreComponents/events/EventManager.hpp | 2 +- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/coreComponents/common/Units.cpp b/src/coreComponents/common/Units.cpp index c2514df77de..e249441f3ff 100644 --- a/src/coreComponents/common/Units.cpp +++ b/src/coreComponents/common/Units.cpp @@ -18,7 +18,6 @@ */ #include "Units.hpp" -#include "common/logger/Logger.hpp" namespace geos { @@ -76,7 +75,6 @@ std::ostream & operator<<( std::ostream & os, TimeFormatInfo const & info ) TimeFormatInfo TimeFormatInfo::fromSeconds( double const seconds ) { - double remainingSeconds = seconds < 0.0 ? -seconds : seconds; int const totalYears = int( remainingSeconds / YearSeconds ); remainingSeconds -= totalYears * YearSeconds; diff --git a/src/coreComponents/common/initializeEnvironment.cpp b/src/coreComponents/common/initializeEnvironment.cpp index 7dcdc4ba974..86c313e53d1 100644 --- a/src/coreComponents/common/initializeEnvironment.cpp +++ b/src/coreComponents/common/initializeEnvironment.cpp @@ -105,6 +105,7 @@ void setupLogger() error.addCallStackInfo( stackHistory ); error.addContextInfo( ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( detectionLocation ) } } } ); + ErrorLogger::global().flushErrorMsg( error ); } @@ -140,6 +141,7 @@ void setupLogger() error.addContextInfo( ErrorContext{ { { ErrorContext::Attribute::Signal, std::to_string( signal ) } }, 1 }, ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( "signal handler" ) } }, 0 } ); + ErrorLogger::global().flushErrorMsg( error ); } diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 553d2f27ad3..8c3a543f995 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -235,7 +235,7 @@ class ErrorLogger bool m_isValidStackTrace = false; }; - /** + /** * @brief Retrieve all informations from the ErrorLogger and format into an ascii message * @param errMsg Class containing all the error/warning information * @param rank The rank where the error/warning happened @@ -321,7 +321,6 @@ class ErrorLogger private: /// The error constructed via exceptions ErrorMsg m_currentErrorMsg; - /// Indicate whether the write to YAML command line option is enabled bool m_writeYaml = false; /// YAML file name diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 249b8d27ee5..bca5f435083 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -1032,9 +1032,8 @@ void InitializeLogger( const std::string & rank_output_dir="" ); */ void FinalizeLogger(); -} // namespace logger +} // namespace logger - -} // namespace geos +} // namespace geos #endif /* GEOS_COMMON_LOGGER_HPP */ diff --git a/src/coreComponents/events/EventManager.hpp b/src/coreComponents/events/EventManager.hpp index 09a2b73a45c..0e5024fb07c 100644 --- a/src/coreComponents/events/EventManager.hpp +++ b/src/coreComponents/events/EventManager.hpp @@ -159,7 +159,7 @@ class EventManager : public dataRepository::Group integer m_maxCycle; /// Simulation timestamp at the beginning of the cycle - real64 m_time = 0.0; + real64 m_time; /// Current timestep request real64 m_dt; From 93594af5b8bec9e1a3cca92c9b9c1b1cad2c7cd8 Mon Sep 17 00:00:00 2001 From: arng40 Date: Mon, 24 Nov 2025 10:59:56 +0100 Subject: [PATCH 134/173] output only once --- .../common/logger/ErrorHandling.cpp | 1 - .../common/logger/ErrorHandling.hpp | 10 +++++----- src/coreComponents/common/logger/Logger.hpp | 15 ++++++++++----- src/main/main.cpp | 2 +- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index f4c7cadba53..041fcc5cca6 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -302,7 +302,6 @@ void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) m_filename, g_errorLogger.isOutputFileEnabled() ) ); } } - ErrorLogger::formatMsgToAscii( errorMsg, ::geos::logger::internal::g_rankString ); } } /* namespace geos */ diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 8c3a543f995..6ecf359cdbd 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -21,6 +21,7 @@ #define INITIALIZATION_ERROR_LOGGER_HPP #include "common/DataTypes.hpp" +#include "common/format/StringUtilities.hpp" #include @@ -241,16 +242,15 @@ class ErrorLogger * @param rank The rank where the error/warning happened * @return The error message displayed to the standard output */ - static string formatMsgToAscii( ErrorLogger::ErrorMsg const & errMsg, string const & rank ) + static void formatMsgToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostringstream & oss ) { - std::ostringstream oss; oss << "***** " << ErrorLogger::toString( errMsg.m_type ) << "\n"; oss << "***** LOCATION: " << errMsg.m_file<< "\n"; oss << "***** " << errMsg.m_cause << "\n"; - oss << "***** Rank " << rank << ": " << errMsg.m_msg << "\n"; + oss << "***** Rank " + << stringutilities::join( errMsg.m_ranksInfo, ", " ) + << ": " << errMsg.m_msg << "\n"; oss << errMsg.m_stringCallStack; - std::cout << oss.str() < Date: Mon, 24 Nov 2025 11:01:18 +0100 Subject: [PATCH 135/173] add "__" prefix --- src/coreComponents/common/logger/Logger.hpp | 54 ++++++++++----------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 2cbf925c2bf..2231dc0f73b 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -156,22 +156,22 @@ { \ if( COND ) \ { \ - std::ostringstream msgoss; \ - msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ - std::ostringstream causemsgsoss; \ - causemsgsoss << CAUSE_MESSAGE; \ + std::ostringstream __msgoss; \ + __msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ + std::ostringstream __causemsgsoss; \ + __causemsgsoss << CAUSE_MESSAGE; \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ - msgoss.str(), \ + __msgoss.str(), \ ::geos::logger::internal::g_rank, \ __FILE__, \ __LINE__ ); \ - msgStruct.setCause( causemsgsoss.str() ); \ + msgStruct.setCause( __causemsgsoss.str() ); \ msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ GEOS_ERROR_LOGGER_INSTANCE.flushErrorMsg( msgStruct ); \ - std::ostringstream asciiErrormSG; \ - ErrorLogger::formatMsgToAscii( GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg(), asciiErrormSG ); \ - std::cout << asciiErrormSG.str(); \ + std::ostringstream __asciiErrormSG; \ + ErrorLogger::formatMsgToAscii( GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg(), __asciiErrormSG ); \ + std::cout << __asciiErrormSG.str(); \ LvArray::system::callErrorHandler(); \ } \ }while( false ) @@ -226,25 +226,25 @@ { \ if( COND ) \ { \ - std::ostringstream msgoss; \ - msgoss << MSG; \ - std::ostringstream causemsgsoss; \ - causemsgsoss << CAUSE_MESSAGE; \ + std::ostringstream __msgoss; \ + __msgoss << MSG; \ + std::ostringstream __causemsgsoss; \ + __causemsgsoss << CAUSE_MESSAGE; \ if( GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg().m_type == ErrorLogger::MsgType::Undefined ) \ { /* first throw site, we initialize the error message completly */ \ GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg() \ .setType( ErrorLogger::MsgType::Exception ) \ .setCodeLocation( __FILE__, __LINE__ ) \ - .setCause( causemsgsoss.str() ) \ + .setCause( __causemsgsoss.str() ) \ .addRank( ::geos::logger::internal::g_rank ) \ .addCallStackInfo( LvArray::system::stackTrace( true ) ); \ } \ GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg() \ - .addToMsg( msgoss.str() ) \ + .addToMsg( __msgoss.str() ) \ .addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - std::ostringstream asciiErrormSG; \ - ErrorLogger::formatMsgToAscii( GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg(), asciiErrormSG ); \ - throw GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ )( asciiErrormSG.str() ); \ + std::ostringstream __asciiErrormSG; \ + ErrorLogger::formatMsgToAscii( GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg(), __asciiErrormSG ); \ + throw GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ )( __asciiErrormSG.str() ); \ } \ }while( false ) #elif __CUDA_ARCH__ @@ -299,21 +299,21 @@ { \ if( COND ) \ { \ - std::ostringstream msgoss; \ - msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ - std::ostringstream causemsgsoss; \ - causemsgsoss << CAUSE_MESSAGE; \ + std::ostringstream __msgoss; \ + __msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ + std::ostringstream __causemsgsoss; \ + __causemsgsoss << CAUSE_MESSAGE; \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ - msgoss.str(), \ + __msgoss.str(), \ ::geos::logger::internal::g_rank, \ __FILE__, \ __LINE__ ); \ - msgStruct.setCause( causemsgsoss.str() ); \ + msgStruct.setCause( __causemsgsoss.str() ); \ msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ GEOS_ERROR_LOGGER_INSTANCE.flushErrorMsg( msgStruct ); \ - std::ostringstream asciiErrormSG; \ - ErrorLogger::formatMsgToAscii( GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg(), asciiErrormSG ); \ - std::cout << asciiErrormSG.str(); \ + std::ostringstream __asciiErrormSG; \ + ErrorLogger::formatMsgToAscii( GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg(), __asciiErrormSG ); \ + std::cout << __asciiErrormSG.str(); \ } \ } while( false ) #elif __CUDA_ARCH__ From d5408c974cd28377f0dca79cae563fff289cae02 Mon Sep 17 00:00:00 2001 From: arng40 Date: Mon, 24 Nov 2025 11:02:51 +0100 Subject: [PATCH 136/173] doxygen --- src/coreComponents/common/logger/ErrorHandling.hpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 6ecf359cdbd..2813b3ce7e2 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -237,10 +237,9 @@ class ErrorLogger }; /** - * @brief Retrieve all informations from the ErrorLogger and format into an ascii message + * @brief Retrieve all informations from the ErrorLogger and format into a stream * @param errMsg Class containing all the error/warning information - * @param rank The rank where the error/warning happened - * @return The error message displayed to the standard output + * @param oss The stream to write the content to. */ static void formatMsgToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostringstream & oss ) { From 17a394a723baddd8daebdb9c419bc258a56d547a Mon Sep 17 00:00:00 2001 From: arng40 Date: Mon, 24 Nov 2025 11:13:01 +0100 Subject: [PATCH 137/173] remove var duplication --- src/coreComponents/common/logger/ErrorHandling.cpp | 1 - src/coreComponents/common/logger/ErrorHandling.hpp | 8 +++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 041fcc5cca6..5d5461f2051 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -171,7 +171,6 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addRank( int rank ) ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addCallStackInfo( std::string_view ossStackTrace ) { std::string str = std::string( ossStackTrace ); - m_stringCallStack = str; std::istringstream iss( str ); std::string stackLine; std::size_t index; diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 2813b3ce7e2..196a99862be 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -21,6 +21,7 @@ #define INITIALIZATION_ERROR_LOGGER_HPP #include "common/DataTypes.hpp" +#include "common/format/Format.hpp" #include "common/format/StringUtilities.hpp" #include @@ -122,8 +123,6 @@ class ErrorLogger std::vector< ErrorContext > m_contextsInfo; /// the stack trace std::vector< std::string > m_sourceCallStack; - /// the string stack trace - std::string m_stringCallStack; /** @@ -249,7 +248,10 @@ class ErrorLogger oss << "***** Rank " << stringutilities::join( errMsg.m_ranksInfo, ", " ) << ": " << errMsg.m_msg << "\n"; - oss << errMsg.m_stringCallStack; + for( size_t i = 0; i < errMsg.m_sourceCallStack.size(); i++ ) + { + oss << GEOS_FMT( " - frame{}: {}\n", i, errMsg.m_sourceCallStack[i] ); + } } /** From 061f5025cda6e64ec84da18126d727bc493c9177 Mon Sep 17 00:00:00 2001 From: arng40 Date: Mon, 24 Nov 2025 14:02:34 +0100 Subject: [PATCH 138/173] fix format --- src/coreComponents/common/logger/ErrorHandling.hpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 196a99862be..501c6182b5a 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -20,6 +20,7 @@ #ifndef INITIALIZATION_ERROR_LOGGER_HPP #define INITIALIZATION_ERROR_LOGGER_HPP +#include "LvArray/src/system.hpp" #include "common/DataTypes.hpp" #include "common/format/Format.hpp" #include "common/format/StringUtilities.hpp" @@ -247,11 +248,13 @@ class ErrorLogger oss << "***** " << errMsg.m_cause << "\n"; oss << "***** Rank " << stringutilities::join( errMsg.m_ranksInfo, ", " ) - << ": " << errMsg.m_msg << "\n"; + << ": " << errMsg.m_msg << "\n\n"; + oss << "** StackTrace of "<< errMsg.m_sourceCallStack.size() << " frames **\n"; for( size_t i = 0; i < errMsg.m_sourceCallStack.size(); i++ ) { - oss << GEOS_FMT( " - frame{}: {}\n", i, errMsg.m_sourceCallStack[i] ); + oss << GEOS_FMT( "Frame {}: {}\n", i, errMsg.m_sourceCallStack[i] ); } + oss << "====="; } /** From 450c3b04bcff94050420ee3d560902a23229f808 Mon Sep 17 00:00:00 2001 From: arng40 Date: Mon, 24 Nov 2025 15:03:39 +0100 Subject: [PATCH 139/173] add line number --- src/coreComponents/common/logger/ErrorHandling.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 501c6182b5a..ff87ac5d29b 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -245,7 +245,7 @@ class ErrorLogger { oss << "***** " << ErrorLogger::toString( errMsg.m_type ) << "\n"; oss << "***** LOCATION: " << errMsg.m_file<< "\n"; - oss << "***** " << errMsg.m_cause << "\n"; + oss << "***** " << errMsg.m_cause << " l." << errMsg.m_line << "\n"; oss << "***** Rank " << stringutilities::join( errMsg.m_ranksInfo, ", " ) << ": " << errMsg.m_msg << "\n\n"; From d0ff49db4e2193f32ec07d1206b773ee1c049482 Mon Sep 17 00:00:00 2001 From: arng40 Date: Tue, 25 Nov 2025 15:00:16 +0100 Subject: [PATCH 140/173] add stream to errorlogger + rename macro in logger --- .../common/logger/ErrorHandling.hpp | 20 ++++++++++--- src/coreComponents/common/logger/Logger.hpp | 28 +++++++++---------- src/main/main.cpp | 3 +- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index ff87ac5d29b..1d41fd71f0d 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -241,7 +241,7 @@ class ErrorLogger * @param errMsg Class containing all the error/warning information * @param oss The stream to write the content to. */ - static void formatMsgToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostringstream & oss ) + static void formatMsgToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostream & oss ) { oss << "***** " << ErrorLogger::toString( errMsg.m_type ) << "\n"; oss << "***** LOCATION: " << errMsg.m_file<< "\n"; @@ -295,9 +295,8 @@ class ErrorLogger /** * @brief Gives acces to the error message that is currently being constructed, - * potencially at various application layers - * Use flushErrorMsg() when the message is fully constructed and you want it to be output - * @return Reference to the current instance for method chaining. + * potencially at various application layers (Typically for exceptions) + * @return Reference to the current error message instance; */ ErrorMsg & currentErrorMsg() { return m_currentErrorMsg; } @@ -321,6 +320,17 @@ class ErrorLogger * @param errorMsg a constant reference to the error */ void flushErrorMsg( ErrorMsg & errorMsg ); + /** + * @return Return the const general log stream + */ + std::ostream const & getErrorStream() const + { return m_stream; } + + /** + * @return Return the reference general log stream + */ + std::ostream & getErrorStream() + { return m_stream; } private: /// The error constructed via exceptions @@ -329,6 +339,8 @@ class ErrorLogger bool m_writeYaml = false; /// YAML file name std::string_view m_filename = "errors.yaml"; + /// The stream used for the log output. By default used std::cout + std::ostream& m_stream = std::cout; /** * @brief Write the error message in the YAML file regarding indentation and line break diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 2231dc0f73b..f2f959590d7 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -137,8 +137,8 @@ * @note - Currently not available on GPU. * - Possible to pre-define it in any source file (e.g. for unit tests) */ -#if !defined(GEOS_DEVICE_COMPILE) && !defined(GEOS_ERROR_LOGGER_INSTANCE) -#define GEOS_ERROR_LOGGER_INSTANCE ErrorLogger::global() +#if !defined(GEOS_DEVICE_COMPILE) && !defined(GEOS_GLOBAL_LOGGER) +#define GEOS_GLOBAL_LOGGER ErrorLogger::global() #endif /** @@ -160,6 +160,7 @@ __msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ std::ostringstream __causemsgsoss; \ __causemsgsoss << CAUSE_MESSAGE; \ + std::cout << "TEST GEOS_ERROR_IF" << std::endl; \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ __msgoss.str(), \ ::geos::logger::internal::g_rank, \ @@ -168,10 +169,8 @@ msgStruct.setCause( __causemsgsoss.str() ); \ msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - GEOS_ERROR_LOGGER_INSTANCE.flushErrorMsg( msgStruct ); \ - std::ostringstream __asciiErrormSG; \ - ErrorLogger::formatMsgToAscii( GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg(), __asciiErrormSG ); \ - std::cout << __asciiErrormSG.str(); \ + ErrorLogger::formatMsgToAscii( msgStruct, GEOS_GLOBAL_LOGGER.getErrorStream() ); \ + GEOS_GLOBAL_LOGGER.flushErrorMsg( msgStruct ); \ LvArray::system::callErrorHandler(); \ } \ }while( false ) @@ -230,20 +229,21 @@ __msgoss << MSG; \ std::ostringstream __causemsgsoss; \ __causemsgsoss << CAUSE_MESSAGE; \ - if( GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg().m_type == ErrorLogger::MsgType::Undefined ) \ + if( GEOS_GLOBAL_LOGGER.currentErrorMsg().m_type == ErrorLogger::MsgType::Undefined ) \ { /* first throw site, we initialize the error message completly */ \ - GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg() \ + GEOS_GLOBAL_LOGGER.currentErrorMsg() \ .setType( ErrorLogger::MsgType::Exception ) \ .setCodeLocation( __FILE__, __LINE__ ) \ .setCause( __causemsgsoss.str() ) \ .addRank( ::geos::logger::internal::g_rank ) \ .addCallStackInfo( LvArray::system::stackTrace( true ) ); \ } \ - GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg() \ + GEOS_GLOBAL_LOGGER.currentErrorMsg() \ .addToMsg( __msgoss.str() ) \ .addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ std::ostringstream __asciiErrormSG; \ - ErrorLogger::formatMsgToAscii( GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg(), __asciiErrormSG ); \ + ErrorLogger::formatMsgToAscii( GEOS_GLOBAL_LOGGER.currentErrorMsg(), \ + __asciiErrormSG ); \ throw GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ )( __asciiErrormSG.str() ); \ } \ }while( false ) @@ -310,10 +310,8 @@ __LINE__ ); \ msgStruct.setCause( __causemsgsoss.str() ); \ msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - GEOS_ERROR_LOGGER_INSTANCE.flushErrorMsg( msgStruct ); \ - std::ostringstream __asciiErrormSG; \ - ErrorLogger::formatMsgToAscii( GEOS_ERROR_LOGGER_INSTANCE.currentErrorMsg(), __asciiErrormSG ); \ - std::cout << __asciiErrormSG.str(); \ + ErrorLogger::formatMsgToAscii( msgStruct, GEOS_GLOBAL_LOGGER.getErrorStream() ); \ + GEOS_GLOBAL_LOGGER.flushErrorMsg( msgStruct ); \ } \ } while( false ) #elif __CUDA_ARCH__ @@ -1037,7 +1035,7 @@ void InitializeLogger( const std::string & rank_output_dir="" ); */ void FinalizeLogger(); -} // namespace logger +} // namespace logger } // namespace geos diff --git a/src/main/main.cpp b/src/main/main.cpp index e0d536856b5..d74307e8cbf 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -66,7 +66,6 @@ int main( int argc, char *argv[] ) GEOS_LOG_RANK_0( GEOS_FMT( "total time {}", units::TimeFormatInfo::fromDuration( totalTime ) ) ); GEOS_LOG_RANK_0( GEOS_FMT( "initialization time {}", units::TimeFormatInfo::fromDuration( initTime ) ) ); GEOS_LOG_RANK_0( GEOS_FMT( "run time {}", units::TimeFormatInfo::fromDuration( runTime ) ) ); - return 0; } // A NotAnError is thrown if "-h" or "--help" option is used. @@ -77,8 +76,8 @@ int main( int argc, char *argv[] ) } catch( std::exception const & e ) { + ErrorLogger::global().getErrorStream() << e.what(); ErrorLogger::global().flushErrorMsg( ErrorLogger::global().currentErrorMsg() ); - GEOS_LOG( e.what()); LvArray::system::callErrorHandler(); basicCleanup(); std::abort(); From 628e49c908fd9a02b370d0dd566ab894e5afbc54 Mon Sep 17 00:00:00 2001 From: arng40 Date: Tue, 25 Nov 2025 15:02:16 +0100 Subject: [PATCH 141/173] reove debug log --- src/coreComponents/common/logger/Logger.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index f2f959590d7..82806b75041 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -160,7 +160,6 @@ __msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ std::ostringstream __causemsgsoss; \ __causemsgsoss << CAUSE_MESSAGE; \ - std::cout << "TEST GEOS_ERROR_IF" << std::endl; \ ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ __msgoss.str(), \ ::geos::logger::internal::g_rank, \ From f09d45fafd50986afd26915aa1ecd8d0b7c2d387 Mon Sep 17 00:00:00 2001 From: arng40 Date: Tue, 25 Nov 2025 17:34:20 +0100 Subject: [PATCH 142/173] fix test & cleanup --- .../common/logger/ErrorHandling.hpp | 16 +++++++++------- src/coreComponents/common/logger/Logger.hpp | 2 +- .../unitTests/testErrorHandling.cpp | 19 +++++++++---------- src/main/main.cpp | 1 - 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 1d41fd71f0d..48e7fe9c456 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -42,7 +42,7 @@ class ErrorLogger * @enum MsgType * Enum listing the different types of possible errors */ - enum class MsgType : integer + enum class MsgType { Error, Warning, @@ -125,7 +125,6 @@ class ErrorLogger /// the stack trace std::vector< std::string > m_sourceCallStack; - /** * @brief Construct a default Error Message */ @@ -249,12 +248,15 @@ class ErrorLogger oss << "***** Rank " << stringutilities::join( errMsg.m_ranksInfo, ", " ) << ": " << errMsg.m_msg << "\n\n"; - oss << "** StackTrace of "<< errMsg.m_sourceCallStack.size() << " frames **\n"; - for( size_t i = 0; i < errMsg.m_sourceCallStack.size(); i++ ) + if( errMsg.m_sourceCallStack.size() > 0 ) { - oss << GEOS_FMT( "Frame {}: {}\n", i, errMsg.m_sourceCallStack[i] ); + oss << "** StackTrace of "<< errMsg.m_sourceCallStack.size() << " frames **\n"; + for( size_t i = 0; i < errMsg.m_sourceCallStack.size(); i++ ) + { + oss << GEOS_FMT( "Frame {}: {}\n", i, errMsg.m_sourceCallStack[i] ); + } + oss << "=====\n"; } - oss << "====="; } /** @@ -340,7 +342,7 @@ class ErrorLogger /// YAML file name std::string_view m_filename = "errors.yaml"; /// The stream used for the log output. By default used std::cout - std::ostream& m_stream = std::cout; + std::ostream & m_stream = std::cout; /** * @brief Write the error message in the YAML file regarding indentation and line break diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 82806b75041..3c0d987aabe 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -309,7 +309,7 @@ __LINE__ ); \ msgStruct.setCause( __causemsgsoss.str() ); \ msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - ErrorLogger::formatMsgToAscii( msgStruct, GEOS_GLOBAL_LOGGER.getErrorStream() ); \ + ErrorLogger::formatMsgToAscii( msgStruct, GEOS_GLOBAL_LOGGER.getErrorStream() ); \ GEOS_GLOBAL_LOGGER.flushErrorMsg( msgStruct ); \ } \ } while( false ) diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index 920c78e53eb..43cc6fffc60 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -30,9 +30,9 @@ using namespace dataRepository; namespace fs = std::filesystem; -// redeging logger instance to test macros with a local instance (to prevent any side effect) -#undef GEOS_ERROR_LOGGER_INSTANCE -#define GEOS_ERROR_LOGGER_INSTANCE testErrorLogger +// redeging logger instance to test macros with a local instance (to prevent any side effect) +#undef GEOS_GLOBAL_LOGGER +#define GEOS_GLOBAL_LOGGER testErrorLogger // declare a constant which value is the source file line (to predict the error file output). #define GET_LINE( lineVar ) static size_t constexpr lineVar = __LINE__ @@ -183,15 +183,14 @@ TEST( ErrorHandling, testYamlFileExceptionOutput ) .addToMsg( errorMsg ) .addContextInfo( additionalContext.getContextInfo() ) .addContextInfo( importantAdditionalContext.getContextInfo().setPriority( 2 ) ); + } + testErrorLogger.flushErrorMsg( testErrorLogger.currentErrorMsg() ); + endLocalLoggerTest( testErrorLogger, { + R"(errors:)", - - testErrorLogger.flushErrorMsg( testErrorLogger.currentErrorMsg() ); - endLocalLoggerTest( testErrorLogger, { - R"(errors:)", - - GEOS_FMT( - R"(- type: Exception + GEOS_FMT( + R"(- type: Exception rank: 0 message: >- Table input error. diff --git a/src/main/main.cpp b/src/main/main.cpp index d74307e8cbf..accd0e57296 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -18,7 +18,6 @@ #include "common/format/Format.hpp" #include "common/TimingMacros.hpp" #include "common/Units.hpp" -#include "common/logger/ErrorHandling.hpp" #include "mainInterface/initialization.hpp" #include "mainInterface/ProblemManager.hpp" #include "mainInterface/GeosxState.hpp" From ec1feab3ee747a40d5d7a6b0cd7e9013078afa64 Mon Sep 17 00:00:00 2001 From: arng40 Date: Tue, 25 Nov 2025 17:40:13 +0100 Subject: [PATCH 143/173] remove unecassery dep --- src/coreComponents/common/logger/ErrorHandling.hpp | 3 --- .../dataRepository/unitTests/testErrorHandling.cpp | 1 - 2 files changed, 4 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 48e7fe9c456..0ed32f8f065 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -20,12 +20,9 @@ #ifndef INITIALIZATION_ERROR_LOGGER_HPP #define INITIALIZATION_ERROR_LOGGER_HPP -#include "LvArray/src/system.hpp" #include "common/DataTypes.hpp" #include "common/format/Format.hpp" #include "common/format/StringUtilities.hpp" -#include - namespace geos { diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index 43cc6fffc60..c1e9eef26c1 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -14,7 +14,6 @@ */ // forcefully enable asserts macros for this unit test -#include #define GEOS_ASSERT_ENABLED #include "common/logger/ErrorHandling.hpp" From 9d5db85cee43992513c5f765fe27a958b2642873 Mon Sep 17 00:00:00 2001 From: arng40 Date: Thu, 27 Nov 2025 10:00:05 +0100 Subject: [PATCH 144/173] fix test --- .../dataRepository/unitTests/testErrorHandling.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index c1e9eef26c1..f99c5789f14 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -210,12 +210,11 @@ TEST( ErrorHandling, testYamlFileExceptionOutput ) file: {} line: {} sourceCallStack:)", - __FILE__, line1 ), - "- frame0: ", - "- frame1: ", - "- frame2: " - } ); - } + __FILE__, line1 ), + "- frame0: ", + "- frame1: ", + "- frame2: " + } ); } TEST( ErrorHandling, testYamlFileErrorOutput ) From 8708f2d6250a82612a7a1953f34c3d958dc24e28 Mon Sep 17 00:00:00 2001 From: arng40 Date: Fri, 28 Nov 2025 11:29:55 +0100 Subject: [PATCH 145/173] add geos::exception + refacto flushErrorMsg --- .../common/initializeEnvironment.cpp | 16 +-- .../common/logger/ErrorHandling.cpp | 124 +++++++++--------- .../common/logger/ErrorHandling.hpp | 45 ++++++- src/coreComponents/common/logger/Logger.cpp | 5 +- src/coreComponents/common/logger/Logger.hpp | 80 ++++++++--- src/main/main.cpp | 17 ++- 6 files changed, 186 insertions(+), 101 deletions(-) diff --git a/src/coreComponents/common/initializeEnvironment.cpp b/src/coreComponents/common/initializeEnvironment.cpp index 86c313e53d1..588e47513eb 100644 --- a/src/coreComponents/common/initializeEnvironment.cpp +++ b/src/coreComponents/common/initializeEnvironment.cpp @@ -92,10 +92,6 @@ void setupLogger() { std::string const stackHistory = LvArray::system::stackTrace( true ); - GEOS_LOG( GEOS_FMT( "***** ERROR\n" - "***** LOCATION: (external error, detected {})\n" - "{}\n{}", - detectionLocation, errorMsg, stackHistory ) ); if( ErrorLogger::global().isOutputFileEnabled() ) { ErrorLogger::ErrorMsg error; @@ -106,7 +102,7 @@ void setupLogger() error.addContextInfo( ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( detectionLocation ) } } } ); - ErrorLogger::global().flushErrorMsg( error ); + ErrorLogger::global().flushErrorMsgTo( error ); } // we do not terminate the program as 1. the error could be non-fatal, 2. there may be more messages to output. @@ -124,15 +120,9 @@ void setupLogger() // error message output std::string const stackHistory = LvArray::system::stackTrace( true ); + ErrorLogger::ErrorMsg error; error.addSignalToMsg( signal ); - - GEOS_LOG( GEOS_FMT( "***** ERROR\n" - "***** SIGNAL: {}\n" - "***** LOCATION: (external error, captured by signal handler)\n" - "{}\n{}", - signal, error.m_msg, stackHistory ) ); - if( ErrorLogger::global().isOutputFileEnabled() ) { error.setType( ErrorLogger::MsgType::Error ); @@ -142,7 +132,7 @@ void setupLogger() ErrorContext{ { { ErrorContext::Attribute::Signal, std::to_string( signal ) } }, 1 }, ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( "signal handler" ) } }, 0 } ); - ErrorLogger::global().flushErrorMsg( error ); + ErrorLogger::global().flushErrorMsgTo( error ); } // call program termination diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 5d5461f2051..d858181e311 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -228,78 +228,84 @@ void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstr } } -void ErrorLogger::flushErrorMsg( ErrorLogger::ErrorMsg & errorMsg ) +void ErrorLogger::writeToYaml( ErrorMsg & errorMsg ) { - if( isOutputFileEnabled() ) + std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); + if( yamlFile.is_open() ) { - std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); - if( yamlFile.is_open() && isOutputFileEnabled() ) - { - // General errors info (type, rank on which the error occured) - yamlFile << g_level1Start << "type: " << ErrorLogger::toString( errorMsg.m_type ) << "\n"; - yamlFile << g_level1Next << "rank: " << stringutilities::join( errorMsg.m_ranksInfo, "," ); - yamlFile << "\n"; + // General errors info (type, rank on which the error occured) + yamlFile << g_level1Start << "type: " << ErrorLogger::toString( errorMsg.m_type ) << "\n"; + yamlFile << g_level1Next << "rank: " << stringutilities::join( errorMsg.m_ranksInfo, "," ); + yamlFile << "\n"; - // Error message - yamlFile << g_level1Next << "message: >-\n"; - streamMultilineYamlAttribute( errorMsg.m_msg, yamlFile, g_level2Next ); + // Error message + yamlFile << g_level1Next << "message: >-\n"; + streamMultilineYamlAttribute( errorMsg.m_msg, yamlFile, g_level2Next ); - // context information - if( !errorMsg.m_contextsInfo.empty() ) + // context information + if( !errorMsg.m_contextsInfo.empty() ) + { + // Sort contextual information by decreasing priority + std::sort( errorMsg.m_contextsInfo.begin(), errorMsg.m_contextsInfo.end(), + []( const ErrorLogger::ErrorContext & a, const ErrorLogger::ErrorContext & b ) { + return a.m_priority > b.m_priority; + } ); + // Additional informations about the context of the error and priority information of each context + yamlFile << g_level1Next << "contexts:\n"; + for( ErrorContext const & ctxInfo : errorMsg.m_contextsInfo ) { - // Sort contextual information by decreasing priority - std::sort( errorMsg.m_contextsInfo.begin(), errorMsg.m_contextsInfo.end(), - []( const ErrorLogger::ErrorContext & a, const ErrorLogger::ErrorContext & b ) { - return a.m_priority > b.m_priority; - } ); - // Additional informations about the context of the error and priority information of each context - yamlFile << g_level1Next << "contexts:\n"; - for( ErrorContext const & ctxInfo : errorMsg.m_contextsInfo ) + yamlFile << g_level3Start << "priority: " << ctxInfo.m_priority << "\n"; + for( auto const & [key, value] : ctxInfo.m_attributes ) { - yamlFile << g_level3Start << "priority: " << ctxInfo.m_priority << "\n"; - for( auto const & [key, value] : ctxInfo.m_attributes ) - { - yamlFile << g_level3Next << ErrorContext::attributeToString( key ) << ": " << value << "\n"; - } + yamlFile << g_level3Next << ErrorContext::attributeToString( key ) << ": " << value << "\n"; } } + } - // error cause - if( !errorMsg.m_cause.empty() ) - { - yamlFile << g_level1Next << "cause: >-\n"; - streamMultilineYamlAttribute( errorMsg.m_cause, yamlFile, g_level2Next ); - } - - // Location of the error in the code - if( !errorMsg.m_file.empty() ) - { - yamlFile << g_level1Next << "sourceLocation:\n"; - yamlFile << g_level2Next << "file: " << errorMsg.m_file << "\n"; - yamlFile << g_level2Next << "line: " << errorMsg.m_line << "\n"; - } - // Information about the stack trace - if( !errorMsg.m_sourceCallStack.empty() ) - { - yamlFile << g_level1Next << "sourceCallStack:\n"; - for( size_t i = 0; i < errorMsg.m_sourceCallStack.size(); i++ ) - { - yamlFile << ( errorMsg.isValidStackTrace() ? - GEOS_FMT( "{}frame{}: {}\n", g_level3Start, i, errorMsg.m_sourceCallStack[i] ) : - GEOS_FMT( "{}{}\n", g_level3Start, errorMsg.m_sourceCallStack[i] ) ); - } - } + // error cause + if( !errorMsg.m_cause.empty() ) + { + yamlFile << g_level1Next << "cause: >-\n"; + streamMultilineYamlAttribute( errorMsg.m_cause, yamlFile, g_level2Next ); + } - yamlFile << "\n"; - yamlFile.flush(); - errorMsg = ErrorMsg(); - GEOS_LOG_RANK( GEOS_FMT( "The error file {} has been appended.", m_filename ) ); + // Location of the error in the code + if( !errorMsg.m_file.empty() ) + { + yamlFile << g_level1Next << "sourceLocation:\n"; + yamlFile << g_level2Next << "file: " << errorMsg.m_file << "\n"; + yamlFile << g_level2Next << "line: " << errorMsg.m_line << "\n"; } - else + // Information about the stack trace + if( !errorMsg.m_sourceCallStack.empty() ) { - GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing.\n- Error file: {}\n- Error file enabled = {}.\n", - m_filename, g_errorLogger.isOutputFileEnabled() ) ); + yamlFile << g_level1Next << "sourceCallStack:\n"; + for( size_t i = 0; i < errorMsg.m_sourceCallStack.size(); i++ ) + { + yamlFile << ( errorMsg.isValidStackTrace() ? + GEOS_FMT( "{}frame{}: {}\n", g_level3Start, i, errorMsg.m_sourceCallStack[i] ) : + GEOS_FMT( "{}{}\n", g_level3Start, errorMsg.m_sourceCallStack[i] ) ); + } } + + yamlFile << "\n"; + yamlFile.flush(); + errorMsg = ErrorMsg(); + GEOS_LOG_RANK( GEOS_FMT( "The error file {} has been appended.", m_filename ) ); + } + else + { + GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing.\n- Error file: {}\n- Error file enabled = {}.\n", + m_filename, g_errorLogger.isOutputFileEnabled() ) ); + } +} + +void ErrorLogger::flushErrorMsgTo( ErrorMsg & errorMsg ) +{ + writeToAscii( errorMsg, getErrorStream() ); + if( isOutputFileEnabled() ) + { + writeToYaml( errorMsg ); } } diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 0ed32f8f065..e1949dd6dc1 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -23,6 +23,7 @@ #include "common/DataTypes.hpp" #include "common/format/Format.hpp" #include "common/format/StringUtilities.hpp" +#include namespace geos { @@ -35,6 +36,7 @@ class ErrorLogger { public: + /** * @enum MsgType * Enum listing the different types of possible errors @@ -42,6 +44,7 @@ class ErrorLogger enum class MsgType { Error, + ExternalError, Warning, Exception, Undefined @@ -107,6 +110,8 @@ class ErrorLogger { /// the error type (Warning, Error or Exception) MsgType m_type = ErrorLogger::MsgType::Undefined; + /// The signal received and formatted + std::string m_signal; /// the error message that can be completed std::string m_msg; /// the cause of the error (erroneous condition, failed assertion...) if identified (optional) @@ -233,18 +238,24 @@ class ErrorLogger }; /** - * @brief Retrieve all informations from the ErrorLogger and format into a stream + * @brief Retrieve all informations from the Msg and format and write into a stream * @param errMsg Class containing all the error/warning information * @param oss The stream to write the content to. */ - static void formatMsgToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostream & oss ) + static void writeToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostream & oss ) { oss << "***** " << ErrorLogger::toString( errMsg.m_type ) << "\n"; - oss << "***** LOCATION: " << errMsg.m_file<< "\n"; - oss << "***** " << errMsg.m_cause << " l." << errMsg.m_line << "\n"; + if( !errMsg.m_signal.empty()) + { + oss<< "***** SIGNAL: "<< errMsg.m_signal <<"\n"; + } + + oss << "***** LOCATION: " << errMsg.m_file<< " l." << errMsg.m_line << "\n"; + oss << "***** " << errMsg.m_cause << "\n"; oss << "***** Rank " << stringutilities::join( errMsg.m_ranksInfo, ", " ) << ": " << errMsg.m_msg << "\n\n"; + if( errMsg.m_sourceCallStack.size() > 0 ) { oss << "** StackTrace of "<< errMsg.m_sourceCallStack.size() << " frames **\n"; @@ -318,7 +329,14 @@ class ErrorLogger * and reset the errorMsg instance to its initial state * @param errorMsg a constant reference to the error */ - void flushErrorMsg( ErrorMsg & errorMsg ); + void writeToYaml( ErrorMsg & errorMsg ); + + /** + * @brief Write all the information retrieved about the error/warning message into the targeted output + * @param errorMsg a constant reference to the ErrorMsg + */ + void flushErrorMsgTo( ErrorMsg & errorMsg ); + /** * @return Return the const general log stream */ @@ -361,6 +379,23 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addContextInfo( Args && ... args /// @endcond +struct Exception : public std::exception +{ +public: + Exception( std::string const & what ): + std::exception( ) + { + errorMsg.addToMsg( what ); + } + Exception(): std::exception( ){} + + ErrorLogger::ErrorMsg & getErrorMsg() + { return errorMsg; } + +private: + ErrorLogger::ErrorMsg errorMsg; +}; + } /* namespace geos */ #endif diff --git a/src/coreComponents/common/logger/Logger.cpp b/src/coreComponents/common/logger/Logger.cpp index ade2834cbb2..1cf59cbd099 100644 --- a/src/coreComponents/common/logger/Logger.cpp +++ b/src/coreComponents/common/logger/Logger.cpp @@ -21,6 +21,7 @@ #include "Logger.hpp" #include "common/Path.hpp" #include "common/format/StringUtilities.hpp" +#include "common/logger/ErrorHandling.hpp" namespace geos { @@ -56,11 +57,11 @@ std::string insertExMsg( std::string const & originalMsg, std::string const & ms } InputError::InputError( std::exception const & subException, std::string const & msgToInsert ): - std::runtime_error( insertExMsg( subException.what(), msgToInsert ) ) + geos::Exception( insertExMsg( subException.what(), msgToInsert ) ) {} SimulationError::SimulationError( std::exception const & subException, std::string const & msgToInsert ): - std::runtime_error( insertExMsg( subException.what(), msgToInsert ) ) + geos::Exception( insertExMsg( subException.what(), msgToInsert ) ) {} namespace logger diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 3c0d987aabe..94e83c6de3c 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -168,8 +168,7 @@ msgStruct.setCause( __causemsgsoss.str() ); \ msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - ErrorLogger::formatMsgToAscii( msgStruct, GEOS_GLOBAL_LOGGER.getErrorStream() ); \ - GEOS_GLOBAL_LOGGER.flushErrorMsg( msgStruct ); \ + GEOS_GLOBAL_LOGGER.flushErrorMsgTo( msgStruct ); \ LvArray::system::callErrorHandler(); \ } \ }while( false ) @@ -240,10 +239,7 @@ GEOS_GLOBAL_LOGGER.currentErrorMsg() \ .addToMsg( __msgoss.str() ) \ .addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - std::ostringstream __asciiErrormSG; \ - ErrorLogger::formatMsgToAscii( GEOS_GLOBAL_LOGGER.currentErrorMsg(), \ - __asciiErrormSG ); \ - throw GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ )( __asciiErrormSG.str() ); \ + throw GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ )(); \ } \ }while( false ) #elif __CUDA_ARCH__ @@ -307,10 +303,9 @@ ::geos::logger::internal::g_rank, \ __FILE__, \ __LINE__ ); \ - msgStruct.setCause( __causemsgsoss.str() ); \ + msgStruct.setCause( __causemsgsoss.str() ); \ msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - ErrorLogger::formatMsgToAscii( msgStruct, GEOS_GLOBAL_LOGGER.getErrorStream() ); \ - GEOS_GLOBAL_LOGGER.flushErrorMsg( msgStruct ); \ + GEOS_GLOBAL_LOGGER.flushErrorMsgTo( msgStruct ); \ } \ } while( false ) #elif __CUDA_ARCH__ @@ -921,22 +916,67 @@ namespace geos /** * @brief Exception class used to report errors in user input. */ -struct InputError : public std::runtime_error +struct RuntimeError : public geos::Exception +{ + /** + * @brief Constructor + * @param what the error message + */ + RuntimeError( std::string const & what ): + geos::Exception( what ) + {} + + RuntimeError(): geos::Exception(){} +}; +struct LogicError : public geos::Exception +{ + /** + * @brief Constructor + * @param what the error message + */ + LogicError( std::string const & what ): + geos::Exception( what ) + {} + + LogicError(): geos::Exception(){} +}; + +/** + * @brief Exception class used to report errors in user input. + */ +struct DomainError : public geos::Exception +{ + /** + * @brief Constructor + * @param what the error message + */ + DomainError( std::string const & what ): + geos::Exception( what ) + {} + + DomainError(): geos::Exception(){} +}; +/** + * @brief Exception class used to report errors in user input. + */ +struct InputError : public geos::Exception { /** * @brief Constructor * @param what the error message */ InputError( std::string const & what ): - std::runtime_error( what ) + geos::Exception( what ) {} + InputError(): geos::Exception(){} + /** * @brief Constructor * @param what the error message */ InputError( char const * const what ): - std::runtime_error( what ) + geos::Exception( what ) {} /** @@ -950,22 +990,24 @@ struct InputError : public std::runtime_error /** * @brief Exception class used to report errors in user input. */ -struct SimulationError : public std::runtime_error +struct SimulationError : public geos::Exception { /** * @brief Constructor * @param what the error message */ SimulationError( std::string const & what ): - std::runtime_error( what ) + geos::Exception( what ) {} + SimulationError(): geos::Exception(){} + /** * @brief Constructor * @param what the error message */ SimulationError( char const * const what ): - std::runtime_error( what ) + geos::Exception( what ) {} /** @@ -983,21 +1025,23 @@ struct SimulationError : public std::runtime_error * expected & encountered typeid for this one (in order to manage the exception output more precisely). * We could also manage this by having: BadTypeErrorABC <|--- BadTypeError< T > /!\ compilation time */ -struct BadTypeError : public std::runtime_error +struct BadTypeError : public geos::Exception { /** * @brief Constructor * @param what the error message */ BadTypeError( std::string const & what ): - std::runtime_error( what ) + geos::Exception( what ) {} + + BadTypeError(): geos::Exception(){} }; /** * @brief Exception class used for special control flow. */ -class NotAnError : public std::exception +class NotAnError : public geos::Exception {}; namespace logger diff --git a/src/main/main.cpp b/src/main/main.cpp index accd0e57296..a98724a250f 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -18,6 +18,7 @@ #include "common/format/Format.hpp" #include "common/TimingMacros.hpp" #include "common/Units.hpp" +#include "common/logger/ErrorHandling.hpp" #include "mainInterface/initialization.hpp" #include "mainInterface/ProblemManager.hpp" #include "mainInterface/GeosxState.hpp" @@ -73,10 +74,18 @@ int main( int argc, char *argv[] ) basicCleanup(); return 0; } - catch( std::exception const & e ) - { - ErrorLogger::global().getErrorStream() << e.what(); - ErrorLogger::global().flushErrorMsg( ErrorLogger::global().currentErrorMsg() ); + catch( geos::Exception & e) + { // GEOS generated exceptions management + ErrorLogger::global().flushErrorMsgTo( e.getErrorMsg() ); + LvArray::system::callErrorHandler(); + basicCleanup(); + std::abort(); + } + catch( std::exception const & e) + { // native exceptions management + ErrorLogger::ErrorMsg & errMsg = GEOS_GLOBAL_LOGGER.currentErrorMsg(); + //TODO + ErrorLogger::global().flushErrorMsgTo( errMsg ); LvArray::system::callErrorHandler(); basicCleanup(); std::abort(); From 3842caa4ce96659f758f7ba219f30ec60a0b55ca Mon Sep 17 00:00:00 2001 From: arng40 Date: Fri, 28 Nov 2025 11:30:37 +0100 Subject: [PATCH 146/173] update exception inGEOS_THROW to geos::Exception --- .../codingUtilities/Parsing.hpp | 6 ++--- .../codingUtilities/tests/testParsing.cpp | 2 +- src/coreComponents/common/Path.cpp | 2 +- .../fluid/multiFluid/PVTDriver.cpp | 8 +++--- .../reactive/ReactiveFluidDriver.cpp | 8 +++--- .../relativePermeability/RelpermDriver.cpp | 8 +++--- .../solid/TriaxialDriver.cpp | 8 +++--- src/coreComponents/dataRepository/Group.cpp | 2 +- src/coreComponents/dataRepository/Group.hpp | 26 +++++++++---------- .../dataRepository/python/PyGroup.cpp | 8 +++--- .../unitTests/testErrorHandling.cpp | 6 ++--- .../timeHistory/HistoryCollectionBase.cpp | 8 +++--- .../functions/TableFunction.cpp | 2 +- .../dataRepositoryTests/testGroupPath.cpp | 11 +++++--- .../mesh/coarsening/MetisInterface.cpp | 2 +- .../mesh/coarsening/PartitionerBase.cpp | 2 +- .../mainInterface/GeosxState.cpp | 6 ++--- src/coreComponents/mesh/FaceManager.cpp | 2 +- .../mesh/generators/VTKUtilities.cpp | 2 +- .../physicsSolvers/PhysicsSolverBase.cpp | 2 +- .../fluidFlow/CompositionalMultiphaseBase.cpp | 2 +- .../CompositionalMultiphaseHybridFVM.cpp | 2 +- .../fluidFlow/SinglePhaseBase.cpp | 2 +- .../fluidFlow/SinglePhaseHybridFVM.cpp | 2 +- .../wells/CompositionalMultiphaseWell.cpp | 2 +- .../fluidFlow/wells/SinglePhaseWell.cpp | 2 +- ...mpositionalMultiphaseReservoirAndWells.cpp | 2 +- .../CoupledReservoirAndWellsBase.cpp | 2 +- .../SinglePhaseReservoirAndWells.cpp | 2 +- .../isotropic/AcousticWaveEquationSEM.cpp | 4 +-- .../AcousticElasticWaveEquationSEM.cpp | 2 +- .../isotropic/ElasticWaveEquationSEM.cpp | 2 +- src/pygeosx/pygeosx.cpp | 2 +- 33 files changed, 77 insertions(+), 72 deletions(-) diff --git a/src/coreComponents/codingUtilities/Parsing.hpp b/src/coreComponents/codingUtilities/Parsing.hpp index 3badd24f056..7acd766cfb5 100644 --- a/src/coreComponents/codingUtilities/Parsing.hpp +++ b/src/coreComponents/codingUtilities/Parsing.hpp @@ -91,7 +91,7 @@ char const * parseBuffer( char const * first, * @param issep function that returns true if given character is a value separator * @return @p last if the entire buffer has been processed, or pointer to * the start of the unprocessed part if a parsing error occurred - * @throws std::runtime_error if file IO or parsing error occurred + * @throws geos::RuntimeError if file IO or parsing error occurred */ template< typename CONTAINER, typename SEPFUNC > void parseFile( string const & filename, @@ -134,13 +134,13 @@ void parseFile( string const & filename, GEOS_THROW( GEOS_FMT( "Unable to parse value in file {} at position {}: {}...", filename, static_cast< std::streamoff >( inputStream.tellg() ) - left, string( ptr, std::min( left, std::ptrdiff_t{32} ) ) ), - std::runtime_error ); + geos::RuntimeError ); } } GEOS_THROW_IF( inputStream.fail() && !inputStream.eof(), GEOS_FMT( "Error while reading file {}: {}", filename, std::strerror( errno ) ), - std::runtime_error ); + geos::RuntimeError ); } } // namespace geos diff --git a/src/coreComponents/codingUtilities/tests/testParsing.cpp b/src/coreComponents/codingUtilities/tests/testParsing.cpp index 6d9e7b3ae04..e045979730a 100644 --- a/src/coreComponents/codingUtilities/tests/testParsing.cpp +++ b/src/coreComponents/codingUtilities/tests/testParsing.cpp @@ -140,7 +140,7 @@ class ParsingTest : public ::testing::TestWithParam< T > geos::stdVector< T > vec; auto const issep_invalid = []( char const c ){ return c == '|'; }; - EXPECT_THROW( geos::parseFile( fname, vec, issep_invalid ), std::runtime_error ); + EXPECT_THROW( geos::parseFile( fname, vec, issep_invalid ), geos::RuntimeError ); std::remove( fname.c_str() ); } diff --git a/src/coreComponents/common/Path.cpp b/src/coreComponents/common/Path.cpp index b376b1580b2..11ac6e3d679 100644 --- a/src/coreComponents/common/Path.cpp +++ b/src/coreComponents/common/Path.cpp @@ -140,7 +140,7 @@ void makeDirectory( std::string const & path ) { constexpr mode_t mode = 0770; // user and group rwx permissions int const err = mkdir( path.c_str(), mode ); - GEOS_THROW_IF( err && ( errno != EEXIST ), "Failed to create directory: " << path, std::runtime_error ); + GEOS_THROW_IF( err && ( errno != EEXIST ), "Failed to create directory: " << path, geos::RuntimeError ); } void makeDirsForPath( std::string const & path ) diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp index db232e5c37d..d6469615055 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp @@ -207,7 +207,7 @@ bool PVTDriver::execute( real64 const GEOS_UNUSED_PARAM( time_n ), { // this code only makes sense in serial - GEOS_THROW_IF( MpiWrapper::commRank() > 0, "PVTDriver should only be run in serial", std::runtime_error ); + GEOS_THROW_IF( MpiWrapper::commRank() > 0, "PVTDriver should only be run in serial", geos::RuntimeError ); // get the fluid out of the constitutive manager. // for the moment it is of type MultiFluidBase. @@ -372,21 +372,21 @@ void PVTDriver::compareWithBaseline() { for( integer col=0; col < m_table.size( 1 ); ++col ) { - GEOS_THROW_IF( file.eof(), "Baseline file appears shorter than internal results", std::runtime_error ); + GEOS_THROW_IF( file.eof(), "Baseline file appears shorter than internal results", geos::RuntimeError ); file >> value; real64 const error = fabs( m_table[row][col]-value ) / ( fabs( value )+1 ); GEOS_THROW_IF( error > MultiFluidConstants::baselineTolerance, GEOS_FMT( "Results do not match baseline ({} vs {}) at data row {} (row {} with header) and column {}", m_table[row][col], value, row+1, row+headerRows, col+1 ), - std::runtime_error ); + geos::RuntimeError ); } } // check we actually reached the end of the baseline file file >> value; - GEOS_THROW_IF( !file.eof(), "Baseline file appears longer than internal results", std::runtime_error ); + GEOS_THROW_IF( !file.eof(), "Baseline file appears longer than internal results", geos::RuntimeError ); // success diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.cpp index 8bf8db3077d..24afcd65d15 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.cpp @@ -127,7 +127,7 @@ bool ReactiveFluidDriver::execute( real64 const GEOS_UNUSED_PARAM( time_n ), { // this code only makes sense in serial - GEOS_THROW_IF( MpiWrapper::commRank() > 0, "ReactiveFluidDriver should only be run in serial", std::runtime_error ); + GEOS_THROW_IF( MpiWrapper::commRank() > 0, "ReactiveFluidDriver should only be run in serial", geos::RuntimeError ); // get the fluid out of the constitutive manager. // for the moment it is of type MultiFluidBase. @@ -324,20 +324,20 @@ void ReactiveFluidDriver::compareWithBaseline() { for( integer col=0; col < m_table.size( 1 ); ++col ) { - GEOS_THROW_IF( file.eof(), "Baseline file appears shorter than internal results", std::runtime_error ); + GEOS_THROW_IF( file.eof(), "Baseline file appears shorter than internal results", geos::RuntimeError ); file >> value; error = fabs( m_table[row][col]-value ) / ( fabs( value )+1 ); GEOS_THROW_IF( error > m_baselineTol, "Results do not match baseline at data row " << row+1 << " (row " << row+m_numColumns << " with header)" - << " and column " << col+1, std::runtime_error ); + << " and column " << col+1, geos::RuntimeError ); } } // check we actually reached the end of the baseline file file >> value; - GEOS_THROW_IF( !file.eof(), "Baseline file appears longer than internal results", std::runtime_error ); + GEOS_THROW_IF( !file.eof(), "Baseline file appears longer than internal results", geos::RuntimeError ); // success diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.cpp index 49dca10b482..a46e6927baa 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.cpp @@ -110,7 +110,7 @@ bool RelpermDriver::execute( const geos::real64 GEOS_UNUSED_PARAM( time_n ), { // this code only makes sense in serial - GEOS_THROW_IF( MpiWrapper::commRank() > 0, "RelpermDriver should only be run in serial", std::runtime_error ); + GEOS_THROW_IF( MpiWrapper::commRank() > 0, "RelpermDriver should only be run in serial", geos::RuntimeError ); ConstitutiveManager @@ -301,7 +301,7 @@ void RelpermDriver::compareWithBaseline() { for( integer col = 0; col < m_table.size( 1 ); ++col ) { - GEOS_THROW_IF( file.eof(), "Baseline file appears shorter than internal results", std::runtime_error ); + GEOS_THROW_IF( file.eof(), "Baseline file appears shorter than internal results", geos::RuntimeError ); file >> value; real64 const error = fabs( m_table[row][col] - value ) / ( fabs( value ) + 1 ); @@ -310,14 +310,14 @@ void RelpermDriver::compareWithBaseline() << row + m_numColumns << " with header)" << " and column " << col + 1, - std::runtime_error ); + geos::RuntimeError ); } } // check we actually reached the end of the baseline file file >> value; - GEOS_THROW_IF( !file.eof(), "Baseline file appears longer than internal results", std::runtime_error ); + GEOS_THROW_IF( !file.eof(), "Baseline file appears longer than internal results", geos::RuntimeError ); // success diff --git a/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp b/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp index 73bea40106f..0dd8ad22c75 100644 --- a/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp @@ -394,7 +394,7 @@ bool TriaxialDriver::execute( real64 const GEOS_UNUSED_PARAM( time_n ), { // this code only makes sense in serial - GEOS_THROW_IF( MpiWrapper::commRank() > 0, "Triaxial Driver should only be run in serial", std::runtime_error ); + GEOS_THROW_IF( MpiWrapper::commRank() > 0, "Triaxial Driver should only be run in serial", geos::RuntimeError ); // get the solid out of the constitutive manager. // for the moment it is of type SolidBase. @@ -560,7 +560,7 @@ void TriaxialDriver::compareWithBaseline() { for( integer col=0; col < m_table.size( 1 ); ++col ) { - GEOS_THROW_IF( file.eof(), "Baseline file appears shorter than internal results", std::runtime_error ); + GEOS_THROW_IF( file.eof(), "Baseline file appears shorter than internal results", geos::RuntimeError ); file >> value; if( col < ITER ) // only compare "real" data columns @@ -568,7 +568,7 @@ void TriaxialDriver::compareWithBaseline() error = fabs( m_table[row][col]-value ) / ( fabs( value )+1 ); GEOS_THROW_IF( error > m_baselineTol, "Results do not match baseline at data row " << row+1 << " (row " << row+10 << " with header)" - << " and column " << col+1, std::runtime_error ); + << " and column " << col+1, geos::RuntimeError ); } } } @@ -576,7 +576,7 @@ void TriaxialDriver::compareWithBaseline() // check we actually reached the end of the baseline file file >> value; - GEOS_THROW_IF( !file.eof(), "Baseline file appears longer than internal results", std::runtime_error ); + GEOS_THROW_IF( !file.eof(), "Baseline file appears longer than internal results", geos::RuntimeError ); // success diff --git a/src/coreComponents/dataRepository/Group.cpp b/src/coreComponents/dataRepository/Group.cpp index 409fff42c61..9afde2c482b 100644 --- a/src/coreComponents/dataRepository/Group.cpp +++ b/src/coreComponents/dataRepository/Group.cpp @@ -695,7 +695,7 @@ Group const & Group::getBaseGroupByPath( string const & path ) const GEOS_THROW_IF( !foundTarget, "Could not find the specified path start.\n"<< "Specified path is " << path, - std::domain_error ); + DomainError ); } string::size_type currentPosition; diff --git a/src/coreComponents/dataRepository/Group.hpp b/src/coreComponents/dataRepository/Group.hpp index bf185a656ef..bcb5eb4c626 100644 --- a/src/coreComponents/dataRepository/Group.hpp +++ b/src/coreComponents/dataRepository/Group.hpp @@ -312,7 +312,7 @@ class Group * @tparam KEY The type of the lookup. * @param key The key used to perform the lookup. * @return A reference to @p T that refers to the sub-group. - * @throw std::domain_error If the Group does not exist is thrown. + * @throw DomainError If the Group does not exist is thrown. */ template< typename T = Group, typename KEY = void > T & getGroup( KEY const & key ) @@ -321,7 +321,7 @@ class Group GEOS_THROW_IF( child == nullptr, "Group " << getDataContext() << " has no child named " << key << std::endl << dumpSubGroupsNames(), - std::domain_error, getDataContext() ); + DomainError, getDataContext() ); T * const castedChild = dynamicCast< T * >( child ); GEOS_THROW_IF( castedChild == nullptr, GEOS_FMT( "{} was expected to be a '{}'.", @@ -340,7 +340,7 @@ class Group GEOS_THROW_IF( child == nullptr, "Group " << getDataContext() << " has no child named " << key << std::endl << dumpSubGroupsNames(), - std::domain_error, getDataContext() ); + DomainError, getDataContext() ); T const * const castedChild = dynamicCast< T const * >( child ); GEOS_THROW_IF( castedChild == nullptr, GEOS_FMT( "{} was expected to be a '{}'.", @@ -356,7 +356,7 @@ class Group * to lookup the Group to return. Absolute paths search * from the tree root, while relative - from current group. * @return A reference to @p T that refers to the sub-group. - * @throw std::domain_error If the Group doesn't exist. + * @throw DomainError If the Group doesn't exist. */ template< typename T = Group > T & getGroupByPath( string const & path ) @@ -1117,7 +1117,7 @@ class Group * @tparam KEY The lookup type. * @param key The value used to lookup the wrapper. * @return A reference to the WrapperBase that resulted from the lookup. - * @throw std::domain_error if the wrapper doesn't exist. + * @throw DomainError if the wrapper doesn't exist. */ template< typename KEY > WrapperBase const & getWrapperBase( KEY const & key ) const @@ -1126,7 +1126,7 @@ class Group GEOS_THROW_IF( wrapper == nullptr, "Group " << getDataContext() << " has no wrapper named " << key << std::endl << dumpWrappersNames(), - std::domain_error, getDataContext() ); + DomainError, getDataContext() ); return *wrapper; } @@ -1141,7 +1141,7 @@ class Group GEOS_THROW_IF( wrapper == nullptr, "Group " << getDataContext() << " has no wrapper named " << key << std::endl << dumpWrappersNames(), - std::domain_error, getDataContext() ); + DomainError, getDataContext() ); return *wrapper; } @@ -1210,7 +1210,7 @@ class Group * @tparam LOOKUP_TYPE the type of key used to perform the lookup * @param[in] index a lookup value used to search the collection of wrappers * @return A reference to the Wrapper that resulted from the lookup. - * @throw std::domain_error if the Wrapper doesn't exist. + * @throw DomainError if the Wrapper doesn't exist. */ template< typename T, typename LOOKUP_TYPE > Wrapper< T > const & getWrapper( LOOKUP_TYPE const & index ) const @@ -1268,7 +1268,7 @@ class Group * @tparam LOOKUP_TYPE type of value used for wrapper lookup * @param lookup value for wrapper lookup * @return reference to @p T - * @throw A std::domain_error if the Wrapper does not exist. + * @throw A DomainError if the Wrapper does not exist. */ template< typename T, typename LOOKUP_TYPE > GEOS_DECLTYPE_AUTO_RETURN @@ -1350,7 +1350,7 @@ class Group * this group that can be used in output messages. * @tparam KEY The lookup type. * @param key The value used to lookup the wrapper. - * @throw std::domain_error if the wrapper doesn't exist. + * @throw DomainError if the wrapper doesn't exist. */ template< typename KEY > DataContext const & getWrapperDataContext( KEY key ) const @@ -1359,13 +1359,13 @@ class Group /** * @brief Access the group's parent. * @return reference to parent Group - * @throw std::domain_error if the Group doesn't have a parent. + * @throw DomainError if the Group doesn't have a parent. */ Group & getParent() { GEOS_THROW_IF( m_parent == nullptr, "Group at " << getDataContext() << " does not have a parent.", - std::domain_error, getDataContext() ); + DomainError, getDataContext() ); return *m_parent; } @@ -1376,7 +1376,7 @@ class Group { GEOS_THROW_IF( m_parent == nullptr, "Group at " << getDataContext() << " does not have a parent.", - std::domain_error, getDataContext() ); + DomainError, getDataContext() ); return *m_parent; } diff --git a/src/coreComponents/dataRepository/python/PyGroup.cpp b/src/coreComponents/dataRepository/python/PyGroup.cpp index 9fa25b2db3c..e0d7763bdf1 100644 --- a/src/coreComponents/dataRepository/python/PyGroup.cpp +++ b/src/coreComponents/dataRepository/python/PyGroup.cpp @@ -194,8 +194,8 @@ static PyObject * PyGroup_getGroup( PyGroup * const self, PyObject * const args { return createNewPyGroup( self->group->getGroupByPath( path ) ); } - // If the path isn't valid then getGroupByPath will throw a std::domain_error - catch( std::domain_error const & e ) + // If the path isn't valid then getGroupByPath will throw a DomainError + catch( DomainError const & e ) { // If no default return value was specified then this results in a Python exception. if( defaultReturnValue == nullptr ) @@ -259,8 +259,8 @@ static PyObject * PyGroup_getWrapper( PyGroup * const self, PyObject * const arg dataRepository::WrapperBase & wrapper = group.getWrapperBase( wrapperName ); return createNewPyWrapper( wrapper ); } - // If the path isn't valid then either getGroupByPath or getWrapperBase will throw a std::domain_error - catch( std::domain_error const & e ) + // If the path isn't valid then either getGroupByPath or getWrapperBase will throw a DomainError + catch( DomainError const & e ) { // If no default return value was specified then this results in a Python exception. if( defaultReturnValue == nullptr ) diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index f99c5789f14..180f810ba66 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -173,9 +173,9 @@ TEST( ErrorHandling, testYamlFileExceptionOutput ) // Stacked exception test (contexts must appear sorted by priority) try { - line1 = __LINE__; GEOS_THROW_IF( testValue == 5, "Empty Group: " << context.toString(), std::domain_error, context ); + line1 = __LINE__; GEOS_THROW_IF( testValue == 5, "Empty Group: " << context.toString(), DomainError, context ); } - catch( std::domain_error const & ex ) + catch( DomainError const & ex ) { string const errorMsg = "Table input error.\n"; testErrorLogger.currentErrorMsg() @@ -183,7 +183,7 @@ TEST( ErrorHandling, testYamlFileExceptionOutput ) .addContextInfo( additionalContext.getContextInfo() ) .addContextInfo( importantAdditionalContext.getContextInfo().setPriority( 2 ) ); } - testErrorLogger.flushErrorMsg( testErrorLogger.currentErrorMsg() ); + testErrorLogger.flushErrorMsgTo( testErrorLogger.currentErrorMsg() ); endLocalLoggerTest( testErrorLogger, { R"(errors:)", diff --git a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp index dc17c782fe3..15c1f4160ad 100644 --- a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp +++ b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp @@ -128,7 +128,7 @@ dataRepository::Group const * HistoryCollectionBase::getTargetObject( DomainPart GEOS_THROW_IF( !bodyFound, GEOS_FMT( "MeshBody ({}) is specified, but not found.", targetTokens[0] ), - std::domain_error ); + DomainError ); } string const meshBodyName = targetTokens[0]; @@ -158,7 +158,7 @@ dataRepository::Group const * HistoryCollectionBase::getTargetObject( DomainPart GEOS_THROW_IF( !levelFound, GEOS_FMT( "MeshLevel ({}) is specified, but not found.", targetTokens[1] ), - std::domain_error ); + DomainError ); } } else if( !meshBody.getMeshLevels().hasGroup< MeshLevel >( targetTokens[1] ) ) @@ -179,7 +179,7 @@ dataRepository::Group const * HistoryCollectionBase::getTargetObject( DomainPart GEOS_THROW_IF( targetTokens.size() <= 4, GEOS_FMT( " Object Path '{}' does not target any element sub region", objectPath ), - std::runtime_error ); + geos::RuntimeError ); ElementRegionManager const & elemRegionManager = meshLevel.getElemManager(); string const elemRegionName = targetTokens[3]; ElementRegionBase const & elemRegion = elemRegionManager.getRegion( elemRegionName ); @@ -200,7 +200,7 @@ dataRepository::Group const * HistoryCollectionBase::getTargetObject( DomainPart { GEOS_THROW( targetTokens[pathLevel] << " not found in path " << objectPath << std::endl << targetGroup->dumpSubGroupsNames(), - std::domain_error ); + DomainError ); } } } diff --git a/src/coreComponents/functions/TableFunction.cpp b/src/coreComponents/functions/TableFunction.cpp index 7ee6c4a3490..4446d2be72b 100644 --- a/src/coreComponents/functions/TableFunction.cpp +++ b/src/coreComponents/functions/TableFunction.cpp @@ -81,7 +81,7 @@ void TableFunction::readFile( string const & filename, array1d< real64 > & targe { parseFile( filename, target, skipped ); } - catch( std::runtime_error const & e ) + catch( geos::RuntimeError const & e ) { GEOS_THROW( GEOS_FMT( "{} {}: {}", catalogName(), getDataContext(), e.what() ), InputError ); } diff --git a/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp b/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp index 3927a3812b4..eb62e095999 100644 --- a/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp +++ b/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp @@ -14,6 +14,7 @@ */ // Source includes +#include "common/logger/ErrorHandling.hpp" #include "mainInterface/ProblemManager.hpp" #include "mainInterface/initialization.hpp" #include "mainInterface/GeosxState.hpp" @@ -21,6 +22,7 @@ // TPL includes #include #include +#include // Tests the Group::getGroup() and getPath() methods TEST( testGroupPath, testGlobalPaths ) @@ -91,7 +93,6 @@ TEST( testGroupPath, testGlobalPaths ) ProblemManager & problem = getGlobalState().getProblemManager(); problem.parseInputString( xmlInput ); - for( string const & path : groupPaths ) { Group const & group = problem.getGroupByPath( path ); @@ -104,13 +105,17 @@ TEST( testGroupPath, testGlobalPaths ) { problem.getGroupByPath( "/Mesh/mesh2" ); } - catch( const std::domain_error & e ) + catch( geos::Exception & e ) { static constexpr auto expectedMsg = "***** Error cause: child == nullptr\n" "***** Rank 0: Group Mesh (CodeIncludedXML0, l.10) has no child named mesh2\n" "The children of Mesh are: { mesh1 }"; // checks if the exception contains the expected message - GEOS_ERROR_IF_EQ_MSG( string( e.what() ).find( expectedMsg ), string::npos, + std::ostringstream stream; + geos::ErrorLogger::writeToAscii( ErrorLogger::global().currentErrorMsg(), stream ); + std::cout << "TEST2\n "<< stream.str() << std::endl; + + GEOS_ERROR_IF_EQ_MSG( string( stream.str() ).find( expectedMsg ), string::npos, "The error message was not containing the expected sequence.\n" << " Error message :\n" << e.what() << " expected sequence :\n" << expectedMsg ); diff --git a/src/coreComponents/linearAlgebra/multiscale/mesh/coarsening/MetisInterface.cpp b/src/coreComponents/linearAlgebra/multiscale/mesh/coarsening/MetisInterface.cpp index 7fdfcb333b4..df30b457b45 100644 --- a/src/coreComponents/linearAlgebra/multiscale/mesh/coarsening/MetisInterface.cpp +++ b/src/coreComponents/linearAlgebra/multiscale/mesh/coarsening/MetisInterface.cpp @@ -87,7 +87,7 @@ void partition( CRSMatrixView< int64_t const, int64_t const, int64_t const > con options, // options &objval, // edgecut partition.data() ); // part - GEOS_THROW_IF_NE_MSG( result, METIS_OK, "METIS call failed", std::runtime_error ); + GEOS_THROW_IF_NE_MSG( result, METIS_OK, "METIS call failed", geos::RuntimeError ); } } // namespace metis diff --git a/src/coreComponents/linearAlgebra/multiscale/mesh/coarsening/PartitionerBase.cpp b/src/coreComponents/linearAlgebra/multiscale/mesh/coarsening/PartitionerBase.cpp index ea0d251b4c7..14a1d37d325 100644 --- a/src/coreComponents/linearAlgebra/multiscale/mesh/coarsening/PartitionerBase.cpp +++ b/src/coreComponents/linearAlgebra/multiscale/mesh/coarsening/PartitionerBase.cpp @@ -38,7 +38,7 @@ PartitionerBase::create( LinearSolverParameters::Multiscale::Coarsening params ) case PartitionType::semistructured: return std::make_unique< SemistructuredPartitioner >( std::move( params ) ); default: { - GEOS_THROW( "Multiscale partitioning not supported yet: " << params.partitionType, std::runtime_error ); + GEOS_THROW( "Multiscale partitioning not supported yet: " << params.partitionType, geos::RuntimeError ); } } } diff --git a/src/coreComponents/mainInterface/GeosxState.cpp b/src/coreComponents/mainInterface/GeosxState.cpp index 5929b2c99d3..42ec604d228 100644 --- a/src/coreComponents/mainInterface/GeosxState.cpp +++ b/src/coreComponents/mainInterface/GeosxState.cpp @@ -126,7 +126,7 @@ bool GeosxState::initializeDataRepository() GEOS_MARK_FUNCTION; Timer timer( m_initTime ); - GEOS_THROW_IF_NE( m_state, State::UNINITIALIZED, std::logic_error ); + GEOS_THROW_IF_NE( m_state, State::UNINITIALIZED, geos::LogicError ); getProblemManager().parseCommandLineInput(); @@ -156,7 +156,7 @@ void GeosxState::applyInitialConditions() GEOS_MARK_FUNCTION; Timer timer( m_initTime ); - GEOS_THROW_IF_NE( m_state, State::INITIALIZED, std::logic_error ); + GEOS_THROW_IF_NE( m_state, State::INITIALIZED, geos::LogicError ); getProblemManager().applyInitialConditions(); @@ -175,7 +175,7 @@ void GeosxState::run() GEOS_MARK_FUNCTION; Timer timer( m_runTime ); - GEOS_THROW_IF_NE( m_state, State::READY_TO_RUN, std::logic_error ); + GEOS_THROW_IF_NE( m_state, State::READY_TO_RUN, geos::LogicError ); if( getCommandLineOptions().onlyValidateInput ) { diff --git a/src/coreComponents/mesh/FaceManager.cpp b/src/coreComponents/mesh/FaceManager.cpp index 1cf388d34f4..04571d66e8d 100644 --- a/src/coreComponents/mesh/FaceManager.cpp +++ b/src/coreComponents/mesh/FaceManager.cpp @@ -314,7 +314,7 @@ void FaceManager::sortFaceNodes( arrayView2d< real64 const, nodes::REFERENCE_POS GEOS_THROW_IF_GT_MSG( numFaceNodes, MAX_FACE_NODES, GEOS_FMT( "The number of maximum nodes allocated per cell face has been reached " "at position {}.", elementCenter ), - std::runtime_error ); + geos::RuntimeError ); localIndex const firstNodeIndex = faceNodes[0]; diff --git a/src/coreComponents/mesh/generators/VTKUtilities.cpp b/src/coreComponents/mesh/generators/VTKUtilities.cpp index 1f21a300d52..bdda87aff30 100644 --- a/src/coreComponents/mesh/generators/VTKUtilities.cpp +++ b/src/coreComponents/mesh/generators/VTKUtilities.cpp @@ -1170,7 +1170,7 @@ ensureNoEmptyRank( vtkSmartPointer< vtkDataSet > mesh, localIndex const lastRecipientPosition = firstRecipientPosition + numElems - 1; GEOS_THROW_IF( isLastDonor && ( lastRecipientPosition < recipientRanks.size() ), "The current implementation is unable to guarantee that all ranks have at least one element", - std::runtime_error ); + geos::RuntimeError ); for( localIndex iElem = 1; iElem < numElems; ++iElem ) // I only keep my first element { diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp b/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp index 8d301476cc5..2c40697121a 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp @@ -1174,7 +1174,7 @@ real64 PhysicsSolverBase::explicitStep( real64 const & GEOS_UNUSED_PARAM( time_n integer const GEOS_UNUSED_PARAM( cycleNumber ), DomainPartition & GEOS_UNUSED_PARAM( domain ) ) { - GEOS_THROW( "PhysicsSolverBase::ExplicitStep called!. Should be overridden.", std::runtime_error ); + GEOS_THROW( "PhysicsSolverBase::ExplicitStep called!. Should be overridden.", geos::RuntimeError ); return 0; } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 290fbed04ab..37403ceca63 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -1275,7 +1275,7 @@ void CompositionalMultiphaseBase::computeHydrostaticEquilibrium( DomainPartition ": hydrostatic pressure initialization failed to converge in region " << region.getName() << "! \n" << "Try to loosen the equilibration tolerance, or increase the number of equilibration iterations. \n" << "If nothing works, something may be wrong in the fluid model, see ", - std::runtime_error, getDataContext() ); + geos::RuntimeError, getDataContext() ); GEOS_LOG_RANK_0_IF( returnValue == isothermalCompositionalMultiphaseBaseKernels::HydrostaticPressureKernel::ReturnType::DETECTED_MULTIPHASE_FLOW, getCatalogName() << " " << getDataContext() << diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp index 7f1998b66a1..2a624108899 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp @@ -182,7 +182,7 @@ void CompositionalMultiphaseHybridFVM::initializePostInitialConditionsPreSubGrou GEOS_THROW_IF( minVal.get() <= 0.0, getCatalogName() << " " << getDataContext() << ": the transmissibility multipliers used in SinglePhaseHybridFVM must be strictly larger than 0.0", - std::runtime_error ); + geos::RuntimeError ); // Initialize face-based constitutive property arrays to zero to prevent uninitialized memory usage on GPU arrayView2d< real64, compflow::USD_PHASE > facePhaseMob = faceManager.getField< flow::facePhaseMobility >(); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 6fca54281ae..5dc05b9fc56 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -579,7 +579,7 @@ void SinglePhaseBase::computeHydrostaticEquilibrium( DomainPartition & domain ) GEOS_THROW_IF( !equilHasConverged, getCatalogName() << " " << getDataContext() << ": hydrostatic pressure initialization failed to converge in region " << region.getName() << "!", - std::runtime_error, getDataContext() ); + geos::RuntimeError, getDataContext() ); } ); // Step 3.4: create hydrostatic pressure table diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index 5ae213a31b2..b31b42dcb35 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -141,7 +141,7 @@ void SinglePhaseHybridFVM::initializePostInitialConditionsPreSubGroups() GEOS_THROW_IF_LE_MSG( minVal.get(), 0.0, getCatalogName() << " " << getDataContext() << "The transmissibility multipliers used in SinglePhaseHybridFVM must strictly larger than 0.0", - std::runtime_error ); + geos::RuntimeError ); FieldSpecificationManager & fsManager = FieldSpecificationManager::getInstance(); fsManager.forSubGroups< AquiferBoundaryCondition >( [&] ( AquiferBoundaryCondition const & bc ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 35a4e16e8ce..bf0c6f1dd5f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -459,7 +459,7 @@ void CompositionalMultiphaseWell::validateWellConstraints( real64 const & time_n ElementRegionBase const & region = elemManager.getRegion( wellControls.referenceReservoirRegion()); // Check if regions statistics are being computed - GEOS_ERROR_IF( !region.hasWrapper( CompositionalMultiphaseStatistics::catalogName()), + GEOS_ERROR_IF( !region.hasWrapper( CompositionalMultiphaseStatistics::regionStatisticsName()), GEOS_FMT( "{}: No region average quantities computed. WellControl {} referenceReservoirRegion field requires CompositionalMultiphaseStatistics to be configured for region {} ", getDataContext(), wellControls.getName(), regionName )); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp index ce588ad3d5c..8cef43b3570 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp @@ -167,7 +167,7 @@ void SinglePhaseWell::validateWellConstraints( real64 const & time_n, ElementRegionBase const & region = elemManager.getRegion( wellControls.referenceReservoirRegion() ); // Check if regions statistics are being computed - GEOS_ERROR_IF( !region.hasWrapper( SinglePhaseStatistics::catalogName()), + GEOS_ERROR_IF( !region.hasWrapper( SinglePhaseStatistics::regionStatisticsName()), GEOS_FMT( "{}: No region average quantities computed. WellControl {} referenceReservoirRegion field requires SinglePhaseStatistics to be configured for region {} ", getDataContext(), wellControls.getName(), regionName )); diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp index 425bccfa72c..00e98cfcdcd 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp @@ -291,7 +291,7 @@ assembleCouplingTerms( real64 const time_n, GEOS_THROW_IF( !Base::m_isWellTransmissibilityComputed, GEOS_FMT( "{} {}: The well transmissibility has not been computed yet", this->getCatalogName(), this->getName() ), - std::runtime_error ); + geos::RuntimeError ); BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > kernelFlags; if( Base::wellSolver()->useTotalMassEquation() ) diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp index fbb8e7fb935..26355f4b610 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp @@ -157,7 +157,7 @@ bool validateWellPerforations( PhysicsSolverBase const * const reservoirSolver, GEOS_THROW_IF( !badPerforation.first.empty(), GEOS_FMT( "{}: The well {} has a connection to the region {} which is not targeted by the flow solver", wellSolver->getDataContext(), badPerforation.first, badPerforation.second ), - std::runtime_error, wellSolver->getDataContext() ); + geos::RuntimeError, wellSolver->getDataContext() ); return hasBadPerforations == 0; } diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp index 46cf3257088..acdc445d705 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp @@ -249,7 +249,7 @@ assembleCouplingTerms( real64 const time_n, GEOS_THROW_IF( !Base::m_isWellTransmissibilityComputed, GEOS_FMT( "{} {}: The well transmissibility has not been computed yet", this->getCatalogName(), this->getName() ), - std::runtime_error ); + geos::RuntimeError ); this->template forDiscretizationOnMeshTargets<>( domain.getMeshBodies(), [&] ( string const &, MeshLevel const & mesh, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index 6190586dded..95cd1f636f0 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -293,7 +293,7 @@ void AcousticWaveEquationSEM::addSourceToRightHandSide( integer const cycleNumbe GEOS_THROW_IF( cycleNumber > sourceValue.size( 0 ), getDataContext() << ": Too many steps compared to array size", - std::runtime_error, getDataContext() ); + geos::RuntimeError, getDataContext() ); forAll< EXEC_POLICY >( sourceConstants.size( 0 ), [=] GEOS_HOST_DEVICE ( localIndex const isrc ) { if( sourceIsAccessible[isrc] == 1 ) @@ -555,7 +555,7 @@ real64 AcousticWaveEquationSEM::computeTimeStep( real64 & dtOut ) } while (counter < 10 && numberIter < nIterMax); - GEOS_THROW_IF( numberIter> nIterMax, "Power Iteration algorithm does not converge", std::runtime_error ); + GEOS_THROW_IF( numberIter> nIterMax, "Power Iteration algorithm does not converge", geos::RuntimeError ); // We use 1.99 instead of 2 to have a 5% margin error real64 dt = 1.99/sqrt( LvArray::math::abs( lambdaNew )); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp index 9059a3f8a27..b543c6643d5 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp @@ -61,7 +61,7 @@ void AcousticElasticWaveEquationSEM::initializePostInitialConditionsPreSubGroups m_interfaceNodesSet.insert( val ); } localIndex const numInterfaceNodes = MpiWrapper::sum( m_interfaceNodesSet.size() ); - GEOS_THROW_IF( numInterfaceNodes == 0, "Failed to compute interface: check xml input (solver order)", std::runtime_error ); + GEOS_THROW_IF( numInterfaceNodes == 0, "Failed to compute interface: check xml input (solver order)", geos::RuntimeError ); m_acousRegions = &(acousSolver->getReference< string_array >( PhysicsSolverBase::viewKeyStruct::targetRegionsString() )); m_elasRegions = &(elasSolver->getReference< string_array >( PhysicsSolverBase::viewKeyStruct::targetRegionsString() )); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index 2c16780151b..2b5e34323c7 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -680,7 +680,7 @@ real64 ElasticWaveEquationSEM::computeTimeStep( real64 & dtOut ) } while (counter < 10 && numberIter < nIterMax); - GEOS_THROW_IF( numberIter> nIterMax, "Power Iteration algorithm does not converge", std::runtime_error ); + GEOS_THROW_IF( numberIter> nIterMax, "Power Iteration algorithm does not converge", geos::RuntimeError ); //We use 1.99 instead of 2 to have a 5% margin error real64 dt = 1.99/sqrt( LvArray::math::abs( lambdaNew )); diff --git a/src/pygeosx/pygeosx.cpp b/src/pygeosx/pygeosx.cpp index fff9d7aea9c..3941c74668a 100644 --- a/src/pygeosx/pygeosx.cpp +++ b/src/pygeosx/pygeosx.cpp @@ -119,7 +119,7 @@ static constexpr char const * initializeDocString = "--\n\n" "Initialize GEOSX, this must be the first module call.\n\n" "Should only be called once. All calls after the first will\n" - "raise a `RuntimeError`. To reinitialize GEOSX for a new problem,\n" + "raise a `geos::RuntimeError`. To reinitialize GEOSX for a new problem,\n" "use the `reinit` function.\n" "\n" "Parameters\n" From ae0b73c6169f7ce948a86fd74b74e358610114ac Mon Sep 17 00:00:00 2001 From: arng40 Date: Fri, 28 Nov 2025 16:06:38 +0100 Subject: [PATCH 147/173] update what() method --- .../common/logger/ErrorHandling.hpp | 33 +++++++++++++++++-- src/coreComponents/common/logger/Logger.hpp | 6 +++- .../ElasticVTIWaveEquationSEMKernel.hpp | 3 +- src/main/main.cpp | 12 +++++-- 4 files changed, 47 insertions(+), 7 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index e1949dd6dc1..19b3baef57c 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -24,6 +24,7 @@ #include "common/format/Format.hpp" #include "common/format/StringUtilities.hpp" #include +#include namespace geos { @@ -382,17 +383,45 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addContextInfo( Args && ... args struct Exception : public std::exception { public: + Exception() = default; Exception( std::string const & what ): std::exception( ) { errorMsg.addToMsg( what ); } - Exception(): std::exception( ){} - ErrorLogger::ErrorMsg & getErrorMsg() { return errorMsg; } + virtual char const * what() const noexcept override + { + return m_cachedWhat.c_str(); + } + + void prepareWhat( std::string const & msg, + std::string const & cause, + char const * file, + int line, + int rank, + string_view stackTrace ) noexcept + { + try + { + std::ostringstream oss; + oss << "***** GEOS Exception\n"; + oss << "***** LOCATION: " << file << " l." << line << "\n"; + oss << "***** " << cause << "\n"; + oss << "***** Rank " << rank << ": "<< msg <<"\n\n"; + oss << stackTrace; + m_cachedWhat = oss.str(); + } catch( ... ) + { + m_cachedWhat = "GEOS Exception (formatting failed)"; + } + + } + private: + string m_cachedWhat; ErrorLogger::ErrorMsg errorMsg; }; diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 94e83c6de3c..633c4b632cf 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -239,7 +239,11 @@ GEOS_GLOBAL_LOGGER.currentErrorMsg() \ .addToMsg( __msgoss.str() ) \ .addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - throw GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ )(); \ + auto ex = GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ )(); \ + ex.prepareWhat( __msgoss.str(), __causemsgsoss.str(), \ + __FILE__, __LINE__, \ + ::geos::logger::internal::g_rank,LvArray::system::stackTrace( true ) ); \ + throw ex; \ } \ }while( false ) #elif __CUDA_ARCH__ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp index dce27fada16..600711cf5af 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp @@ -20,6 +20,7 @@ #ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ElasticVTIWaveEquationSEMKERNEL_HPP_ #define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ElasticVTIWaveEquationSEMKERNEL_HPP_ +#include "common/logger/Logger.hpp" #include "finiteElement/kernelInterface/KernelBase.hpp" #include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" #include "physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp" @@ -308,7 +309,7 @@ struct ComputeTimeStep } while (counter < 10 && numberIter < nIterMax); - GEOS_THROW_IF( numberIter> nIterMax, "Power Iteration algorithm does not converge", std::runtime_error ); + GEOS_THROW_IF( numberIter> nIterMax, "Power Iteration algorithm does not converge", RuntimeError ); real64 dt = 1.99/sqrt( LvArray::math::abs( lambdaNew )); diff --git a/src/main/main.cpp b/src/main/main.cpp index a98724a250f..debb7d2ed79 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -74,14 +74,20 @@ int main( int argc, char *argv[] ) basicCleanup(); return 0; } - catch( geos::Exception & e) + catch( geos::Exception & e ) { // GEOS generated exceptions management - ErrorLogger::global().flushErrorMsgTo( e.getErrorMsg() ); + try + { + ErrorLogger::global().flushErrorMsgTo( e.getErrorMsg() ); + } catch( ... ) + { + std::cout << e.what(); + } LvArray::system::callErrorHandler(); basicCleanup(); std::abort(); } - catch( std::exception const & e) + catch( std::exception const & e ) { // native exceptions management ErrorLogger::ErrorMsg & errMsg = GEOS_GLOBAL_LOGGER.currentErrorMsg(); //TODO From 96bab37cc79ee6a135857712cc3278ce5a8e473f Mon Sep 17 00:00:00 2001 From: arng40 Date: Mon, 1 Dec 2025 09:49:46 +0100 Subject: [PATCH 148/173] remove unecessary cond --- .../common/initializeEnvironment.cpp | 41 ++++++++----------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/src/coreComponents/common/initializeEnvironment.cpp b/src/coreComponents/common/initializeEnvironment.cpp index 588e47513eb..210d4169aea 100644 --- a/src/coreComponents/common/initializeEnvironment.cpp +++ b/src/coreComponents/common/initializeEnvironment.cpp @@ -92,18 +92,15 @@ void setupLogger() { std::string const stackHistory = LvArray::system::stackTrace( true ); - if( ErrorLogger::global().isOutputFileEnabled() ) - { - ErrorLogger::ErrorMsg error; - error.setType( ErrorLogger::MsgType::Error ); - error.addToMsg( errorMsg ); - error.addRank( ::geos::logger::internal::g_rank ); - error.addCallStackInfo( stackHistory ); - error.addContextInfo( - ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( detectionLocation ) } } } ); - - ErrorLogger::global().flushErrorMsgTo( error ); - } + ErrorLogger::ErrorMsg error; + error.setType( ErrorLogger::MsgType::Error ); + error.addToMsg( errorMsg ); + error.addRank( ::geos::logger::internal::g_rank ); + error.addCallStackInfo( stackHistory ); + error.addContextInfo( + ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( detectionLocation ) } } } ); + + ErrorLogger::global().flushErrorMsg( error ); // we do not terminate the program as 1. the error could be non-fatal, 2. there may be more messages to output. } ); @@ -123,17 +120,15 @@ void setupLogger() ErrorLogger::ErrorMsg error; error.addSignalToMsg( signal ); - if( ErrorLogger::global().isOutputFileEnabled() ) - { - error.setType( ErrorLogger::MsgType::Error ); - error.addRank( ::geos::logger::internal::g_rank ); - error.addCallStackInfo( stackHistory ); - error.addContextInfo( - ErrorContext{ { { ErrorContext::Attribute::Signal, std::to_string( signal ) } }, 1 }, - ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( "signal handler" ) } }, 0 } ); - - ErrorLogger::global().flushErrorMsgTo( error ); - } + error.setType( ErrorLogger::MsgType::Error ); + error.addRank( ::geos::logger::internal::g_rank ); + error.addCallStackInfo( stackHistory ); + error.addContextInfo( + ErrorContext{ { { ErrorContext::Attribute::Signal, std::to_string( signal ) } }, 1 }, + ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( "signal handler" ) } }, 0 } ); + + ErrorLogger::global().flushErrorMsg( error ); + // call program termination LvArray::system::callErrorHandler(); From f47e62e189eac4f1936c0aa565c21eac79e636f6 Mon Sep 17 00:00:00 2001 From: arng40 Date: Mon, 1 Dec 2025 09:50:48 +0100 Subject: [PATCH 149/173] renaming and remove try catch from main --- .../common/format/table/TableLayout.hpp | 1 - .../common/logger/ErrorHandling.cpp | 2 +- .../common/logger/ErrorHandling.hpp | 20 ++++++++++++------- src/coreComponents/common/logger/Logger.hpp | 4 ++-- .../unitTests/testErrorHandling.cpp | 2 +- src/main/main.cpp | 19 ++++++------------ 6 files changed, 23 insertions(+), 25 deletions(-) diff --git a/src/coreComponents/common/format/table/TableLayout.hpp b/src/coreComponents/common/format/table/TableLayout.hpp index b166f65b198..ad4b434f2de 100644 --- a/src/coreComponents/common/format/table/TableLayout.hpp +++ b/src/coreComponents/common/format/table/TableLayout.hpp @@ -23,7 +23,6 @@ #include "common/DataTypes.hpp" #include "TableTypes.hpp" #include -#include "common/logger/Logger.hpp" namespace geos diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index d858181e311..b63b01698d5 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -300,7 +300,7 @@ void ErrorLogger::writeToYaml( ErrorMsg & errorMsg ) } } -void ErrorLogger::flushErrorMsgTo( ErrorMsg & errorMsg ) +void ErrorLogger::flushErrorMsg( ErrorMsg & errorMsg ) { writeToAscii( errorMsg, getErrorStream() ); if( isOutputFileEnabled() ) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 19b3baef57c..b0a4a3aca40 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -277,12 +277,6 @@ class ErrorLogger */ GEOS_HOST static ErrorLogger & global(); - /** - * @return true if the YAML file output is enabled - */ - bool isOutputFileEnabled() const - { return m_writeYaml; } - /** * @brief Enable the YAML file output, which is false by default * @param value A value of true enable the file writing @@ -336,7 +330,7 @@ class ErrorLogger * @brief Write all the information retrieved about the error/warning message into the targeted output * @param errorMsg a constant reference to the ErrorMsg */ - void flushErrorMsgTo( ErrorMsg & errorMsg ); + void flushErrorMsg( ErrorMsg & errorMsg ); /** * @return Return the const general log stream @@ -360,6 +354,13 @@ class ErrorLogger /// The stream used for the log output. By default used std::cout std::ostream & m_stream = std::cout; + + /** + * @return true if the YAML file output is enabled + */ + bool isOutputFileEnabled() const + { return m_writeYaml; } + /** * @brief Write the error message in the YAML file regarding indentation and line break * @param msg the message to write in the YAML @@ -392,6 +393,11 @@ struct Exception : public std::exception ErrorLogger::ErrorMsg & getErrorMsg() { return errorMsg; } + /** + * @brief system fallback to get description content if error system does not achieve to output the ErrorMsg + can also provide exception information to debuggers + * @return returns an explanatory string + */ virtual char const * what() const noexcept override { return m_cachedWhat.c_str(); diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 633c4b632cf..9c5485a70dd 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -168,7 +168,7 @@ msgStruct.setCause( __causemsgsoss.str() ); \ msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - GEOS_GLOBAL_LOGGER.flushErrorMsgTo( msgStruct ); \ + GEOS_GLOBAL_LOGGER.flushErrorMsg( msgStruct ); \ LvArray::system::callErrorHandler(); \ } \ }while( false ) @@ -309,7 +309,7 @@ __LINE__ ); \ msgStruct.setCause( __causemsgsoss.str() ); \ msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - GEOS_GLOBAL_LOGGER.flushErrorMsgTo( msgStruct ); \ + GEOS_GLOBAL_LOGGER.flushErrorMsg( msgStruct ); \ } \ } while( false ) #elif __CUDA_ARCH__ diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index 180f810ba66..737aadb64a9 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -183,7 +183,7 @@ TEST( ErrorHandling, testYamlFileExceptionOutput ) .addContextInfo( additionalContext.getContextInfo() ) .addContextInfo( importantAdditionalContext.getContextInfo().setPriority( 2 ) ); } - testErrorLogger.flushErrorMsgTo( testErrorLogger.currentErrorMsg() ); + testErrorLogger.flushErrorMsg( testErrorLogger.currentErrorMsg() ); endLocalLoggerTest( testErrorLogger, { R"(errors:)", diff --git a/src/main/main.cpp b/src/main/main.cpp index debb7d2ed79..7f426232b69 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -76,25 +76,18 @@ int main( int argc, char *argv[] ) } catch( geos::Exception & e ) { // GEOS generated exceptions management - try - { - ErrorLogger::global().flushErrorMsgTo( e.getErrorMsg() ); - } catch( ... ) - { - std::cout << e.what(); - } - LvArray::system::callErrorHandler(); + ErrorLogger::global().flushErrorMsg( e.getErrorMsg() ); basicCleanup(); - std::abort(); + // lvarray error handler is just program termination + LvArray::system::callErrorHandler(); } catch( std::exception const & e ) { // native exceptions management ErrorLogger::ErrorMsg & errMsg = GEOS_GLOBAL_LOGGER.currentErrorMsg(); - //TODO - ErrorLogger::global().flushErrorMsgTo( errMsg ); - LvArray::system::callErrorHandler(); + ErrorLogger::global().flushErrorMsg( errMsg ); basicCleanup(); - std::abort(); + // lvarray error handler is just program termination + LvArray::system::callErrorHandler(); } return 0; } From 9289b8259899698f401736c3cc237ab30e47af50 Mon Sep 17 00:00:00 2001 From: arng40 Date: Mon, 1 Dec 2025 11:45:10 +0100 Subject: [PATCH 150/173] add GeosExceptions --- src/coreComponents/common/CMakeLists.txt | 1 + .../common/logger/ErrorHandling.hpp | 52 ----- .../common/logger/GeosExceptions.hpp | 208 ++++++++++++++++++ src/coreComponents/common/logger/Logger.hpp | 133 +---------- 4 files changed, 210 insertions(+), 184 deletions(-) create mode 100644 src/coreComponents/common/logger/GeosExceptions.hpp diff --git a/src/coreComponents/common/CMakeLists.txt b/src/coreComponents/common/CMakeLists.txt index 2b094d68ad2..38d684c29bd 100644 --- a/src/coreComponents/common/CMakeLists.txt +++ b/src/coreComponents/common/CMakeLists.txt @@ -38,6 +38,7 @@ set( common_headers GEOS_RAJA_Interface.hpp GeosxMacros.hpp MemoryInfos.hpp + logger/GeosExceptions.hpp logger/Logger.hpp logger/ErrorHandling.hpp logger/ExternalErrorHandler.hpp diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index b0a4a3aca40..c09fbcc77ac 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -23,8 +23,6 @@ #include "common/DataTypes.hpp" #include "common/format/Format.hpp" #include "common/format/StringUtilities.hpp" -#include -#include namespace geos { @@ -381,56 +379,6 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addContextInfo( Args && ... args /// @endcond -struct Exception : public std::exception -{ -public: - Exception() = default; - Exception( std::string const & what ): - std::exception( ) - { - errorMsg.addToMsg( what ); - } - ErrorLogger::ErrorMsg & getErrorMsg() - { return errorMsg; } - - /** - * @brief system fallback to get description content if error system does not achieve to output the ErrorMsg - can also provide exception information to debuggers - * @return returns an explanatory string - */ - virtual char const * what() const noexcept override - { - return m_cachedWhat.c_str(); - } - - void prepareWhat( std::string const & msg, - std::string const & cause, - char const * file, - int line, - int rank, - string_view stackTrace ) noexcept - { - try - { - std::ostringstream oss; - oss << "***** GEOS Exception\n"; - oss << "***** LOCATION: " << file << " l." << line << "\n"; - oss << "***** " << cause << "\n"; - oss << "***** Rank " << rank << ": "<< msg <<"\n\n"; - oss << stackTrace; - m_cachedWhat = oss.str(); - } catch( ... ) - { - m_cachedWhat = "GEOS Exception (formatting failed)"; - } - - } - -private: - string m_cachedWhat; - ErrorLogger::ErrorMsg errorMsg; -}; - } /* namespace geos */ #endif diff --git a/src/coreComponents/common/logger/GeosExceptions.hpp b/src/coreComponents/common/logger/GeosExceptions.hpp new file mode 100644 index 00000000000..644adb00408 --- /dev/null +++ b/src/coreComponents/common/logger/GeosExceptions.hpp @@ -0,0 +1,208 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 TotalEnergies + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2023-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file Logger.hpp + */ + + +#include "common/logger/ErrorHandling.hpp" + +namespace geos +{ + +struct Exception : public std::exception +{ +public: + Exception() = default; + Exception( std::string const & what ): + std::exception( ) + { + errorMsg.addToMsg( what ); + } + ErrorLogger::ErrorMsg & getErrorMsg() + { return errorMsg; } + + /** + * @brief System fallback to get description content if error system does not achieve to output the ErrorMsg + can also provide exception information to debuggers + * @return Returns The exception message + * @note We does not allow to override what(), it's the GEOS_THROW responsability to give the exception message + */ + virtual char const * what() const noexcept override final + { + return m_cachedWhat.c_str(); + } + + void prepareWhat( std::string const & msg, + std::string const & cause, + char const * file, + int line, + int rank, + string_view stackTrace ) noexcept + { + try + { + std::ostringstream oss; + oss << "***** GEOS Exception\n"; + oss << "***** LOCATION: " << file << " l." << line << "\n"; + oss << "***** " << cause << "\n"; + oss << "***** Rank " << rank << ": "<< msg <<"\n\n"; + oss << stackTrace; + m_cachedWhat = oss.str(); + } catch( ... ) + { + m_cachedWhat = "GEOS Exception (formatting failed)"; + } + + } + +private: + string m_cachedWhat; + ErrorLogger::ErrorMsg errorMsg; +}; + +/** + * @brief Exception class used to report errors in user input. + */ +struct RuntimeError : public geos::Exception +{ + /** + * @brief Constructor + * @param what the error message + */ + RuntimeError( std::string const & what ): + geos::Exception( what ) + {} + + RuntimeError(): geos::Exception(){} +}; +struct LogicError : public geos::Exception +{ + /** + * @brief Constructor + * @param what the error message + */ + LogicError( std::string const & what ): + geos::Exception( what ) + {} + + LogicError(): geos::Exception(){} +}; + +/** + * @brief Exception class used to report errors in user input. + */ +struct DomainError : public geos::Exception +{ + /** + * @brief Constructor + * @param what the error message + */ + DomainError( std::string const & what ): + geos::Exception( what ) + {} + + DomainError(): geos::Exception(){} +}; +/** + * @brief Exception class used to report errors in user input. + */ +struct InputError : public geos::Exception +{ + /** + * @brief Constructor + * @param what the error message + */ + InputError( std::string const & what ): + geos::Exception( what ) + {} + + InputError(): geos::Exception(){} + + /** + * @brief Constructor + * @param what the error message + */ + InputError( char const * const what ): + geos::Exception( what ) + {} + + /** + * @brief Constructs an InputError from an underlying exception. + * @param subException The exception on which the created one is based. + * @param msgToInsert The error message that will be inserted in the subException error message. + */ + InputError( std::exception const & subException, std::string const & msgToInsert ); +}; + +/** + * @brief Exception class used to report errors in user input. + */ +struct SimulationError : public geos::Exception +{ + /** + * @brief Constructor + * @param what the error message + */ + SimulationError( std::string const & what ): + geos::Exception( what ) + {} + + SimulationError(): geos::Exception(){} + + /** + * @brief Constructor + * @param what the error message + */ + SimulationError( char const * const what ): + geos::Exception( what ) + {} + + /** + * @brief Construct a SimulationError from an underlying exception. + * @param subException An exception to base this new one on. + * @param msgToInsert The error message. + * It will be inserted before the error message inside of subException. + */ + SimulationError( std::exception const & subException, std::string const & msgToInsert ); +}; + +/** + * @brief Exception class used to report errors from type conversion + * @todo (ErrorManager EPIC #2940) Consider adding a way to precise custom exception parameters, to add + * expected & encountered typeid for this one (in order to manage the exception output more precisely). + * We could also manage this by having: BadTypeErrorABC <|--- BadTypeError< T > /!\ compilation time + */ +struct BadTypeError : public geos::Exception +{ + /** + * @brief Constructor + * @param what the error message + */ + BadTypeError( std::string const & what ): + geos::Exception( what ) + {} + + BadTypeError(): geos::Exception(){} +}; + +/** + * @brief Exception class used for special control flow. + */ +class NotAnError : public geos::Exception +{}; + +} diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 9c5485a70dd..c530a05d0f4 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -25,7 +25,7 @@ #include "common/GeosxMacros.hpp" #include "common/format/Format.hpp" #include "LvArray/src/Macros.hpp" -#include "common/logger/ErrorHandling.hpp" +#include "common/logger/GeosExceptions.hpp" // System includes #include @@ -917,137 +917,6 @@ namespace geos { -/** - * @brief Exception class used to report errors in user input. - */ -struct RuntimeError : public geos::Exception -{ - /** - * @brief Constructor - * @param what the error message - */ - RuntimeError( std::string const & what ): - geos::Exception( what ) - {} - - RuntimeError(): geos::Exception(){} -}; -struct LogicError : public geos::Exception -{ - /** - * @brief Constructor - * @param what the error message - */ - LogicError( std::string const & what ): - geos::Exception( what ) - {} - - LogicError(): geos::Exception(){} -}; - -/** - * @brief Exception class used to report errors in user input. - */ -struct DomainError : public geos::Exception -{ - /** - * @brief Constructor - * @param what the error message - */ - DomainError( std::string const & what ): - geos::Exception( what ) - {} - - DomainError(): geos::Exception(){} -}; -/** - * @brief Exception class used to report errors in user input. - */ -struct InputError : public geos::Exception -{ - /** - * @brief Constructor - * @param what the error message - */ - InputError( std::string const & what ): - geos::Exception( what ) - {} - - InputError(): geos::Exception(){} - - /** - * @brief Constructor - * @param what the error message - */ - InputError( char const * const what ): - geos::Exception( what ) - {} - - /** - * @brief Constructs an InputError from an underlying exception. - * @param subException The exception on which the created one is based. - * @param msgToInsert The error message that will be inserted in the subException error message. - */ - InputError( std::exception const & subException, std::string const & msgToInsert ); -}; - -/** - * @brief Exception class used to report errors in user input. - */ -struct SimulationError : public geos::Exception -{ - /** - * @brief Constructor - * @param what the error message - */ - SimulationError( std::string const & what ): - geos::Exception( what ) - {} - - SimulationError(): geos::Exception(){} - - /** - * @brief Constructor - * @param what the error message - */ - SimulationError( char const * const what ): - geos::Exception( what ) - {} - - /** - * @brief Construct a SimulationError from an underlying exception. - * @param subException An exception to base this new one on. - * @param msgToInsert The error message. - * It will be inserted before the error message inside of subException. - */ - SimulationError( std::exception const & subException, std::string const & msgToInsert ); -}; - -/** - * @brief Exception class used to report errors from type conversion - * @todo (ErrorManager EPIC #2940) Consider adding a way to precise custom exception parameters, to add - * expected & encountered typeid for this one (in order to manage the exception output more precisely). - * We could also manage this by having: BadTypeErrorABC <|--- BadTypeError< T > /!\ compilation time - */ -struct BadTypeError : public geos::Exception -{ - /** - * @brief Constructor - * @param what the error message - */ - BadTypeError( std::string const & what ): - geos::Exception( what ) - {} - - BadTypeError(): geos::Exception(){} -}; - -/** - * @brief Exception class used for special control flow. - */ -class NotAnError : public geos::Exception -{}; - namespace logger { From 694e64ea5f45da9d550668800ae5562b6d5bf30f Mon Sep 17 00:00:00 2001 From: arng40 Date: Mon, 1 Dec 2025 15:10:40 +0100 Subject: [PATCH 151/173] clean up --- src/coreComponents/common/logger/Logger.hpp | 3 +-- .../common/unitTests/testDataTypes.cpp | 2 -- .../dataRepository/unitTests/testErrorHandling.cpp | 13 ++++++++++++- .../dataRepositoryTests/testGroupPath.cpp | 10 +++++----- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index c530a05d0f4..fb01ea0454f 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -23,7 +23,6 @@ // Source incldes #include "common/GeosxConfig.hpp" #include "common/GeosxMacros.hpp" -#include "common/format/Format.hpp" #include "LvArray/src/Macros.hpp" #include "common/logger/GeosExceptions.hpp" @@ -242,7 +241,7 @@ auto ex = GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ )(); \ ex.prepareWhat( __msgoss.str(), __causemsgsoss.str(), \ __FILE__, __LINE__, \ - ::geos::logger::internal::g_rank,LvArray::system::stackTrace( true ) ); \ + ::geos::logger::internal::g_rank, LvArray::system::stackTrace( true ) ); \ throw ex; \ } \ }while( false ) diff --git a/src/coreComponents/common/unitTests/testDataTypes.cpp b/src/coreComponents/common/unitTests/testDataTypes.cpp index 5c2daf1655a..58ebc681cae 100644 --- a/src/coreComponents/common/unitTests/testDataTypes.cpp +++ b/src/coreComponents/common/unitTests/testDataTypes.cpp @@ -58,8 +58,6 @@ TEST( testDataTypes, testBoundChecking ) } }, std::out_of_range ); - // std::cout <<" sdsfs "<< mapBoundsChecking.get_inserted(0)<< std::endl; - // std::cout << mapBoundsChecking.get_inserted(1); internal::StdMapWrapper< std::unordered_map< integer, integer >, true > unorderedMapBoundsChecking{{0, 1}}; EXPECT_THROW( { diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index 737aadb64a9..f581a01704f 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -29,7 +29,7 @@ using namespace dataRepository; namespace fs = std::filesystem; -// redeging logger instance to test macros with a local instance (to prevent any side effect) +// redeging logger instance to test macros with a local instance (to prevent any side effect) #undef GEOS_GLOBAL_LOGGER #define GEOS_GLOBAL_LOGGER testErrorLogger @@ -182,6 +182,17 @@ TEST( ErrorHandling, testYamlFileExceptionOutput ) .addToMsg( errorMsg ) .addContextInfo( additionalContext.getContextInfo() ) .addContextInfo( importantAdditionalContext.getContextInfo().setPriority( 2 ) ); + + string const whatExpected = GEOS_FMT( "***** GEOS Exception\n" + "***** LOCATION: {} l.{}\n" + "***** Error cause: testValue == 5\n" + "***** Rank 0: Empty Group: Base Test Class (file.xml, l.23)", + testErrorLogger.currentErrorMsg().m_file, line1 ); + + GEOS_ERROR_IF_EQ_MSG( string( ex.what() ).find( whatExpected ), string::npos, + "The error message was not containing the expected sequence.\n" << + " Error message :\n" << ex.what() << + " expected sequence :\n" << whatExpected ); } testErrorLogger.flushErrorMsg( testErrorLogger.currentErrorMsg() ); diff --git a/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp b/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp index eb62e095999..1fed569a1ed 100644 --- a/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp +++ b/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp @@ -105,16 +105,16 @@ TEST( testGroupPath, testGlobalPaths ) { problem.getGroupByPath( "/Mesh/mesh2" ); } - catch( geos::Exception & e ) + catch( geos::Exception & e ) { static constexpr auto expectedMsg = "***** Error cause: child == nullptr\n" "***** Rank 0: Group Mesh (CodeIncludedXML0, l.10) has no child named mesh2\n" "The children of Mesh are: { mesh1 }"; // checks if the exception contains the expected message - std::ostringstream stream; - geos::ErrorLogger::writeToAscii( ErrorLogger::global().currentErrorMsg(), stream ); - std::cout << "TEST2\n "<< stream.str() << std::endl; - + std::ostringstream stream; + geos::ErrorLogger::writeToAscii( ErrorLogger::global().currentErrorMsg(), stream ); + std::cout << "TEST2\n "<< stream.str() << std::endl; + GEOS_ERROR_IF_EQ_MSG( string( stream.str() ).find( expectedMsg ), string::npos, "The error message was not containing the expected sequence.\n" << " Error message :\n" << e.what() << From b0838537036e03bef6f541255d15ef67734f1e52 Mon Sep 17 00:00:00 2001 From: arng40 Date: Mon, 1 Dec 2025 15:26:09 +0100 Subject: [PATCH 152/173] remove unecessary include + some doc --- src/coreComponents/common/logger/ErrorHandling.cpp | 3 +-- src/coreComponents/common/logger/ErrorHandling.hpp | 4 ++-- src/coreComponents/common/logger/GeosExceptions.hpp | 3 +++ src/coreComponents/common/logger/Logger.cpp | 2 -- src/coreComponents/common/logger/Logger.hpp | 6 +++--- src/main/main.cpp | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index b63b01698d5..1ca0e0a816c 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -295,8 +295,7 @@ void ErrorLogger::writeToYaml( ErrorMsg & errorMsg ) } else { - GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing.\n- Error file: {}\n- Error file enabled = {}.\n", - m_filename, g_errorLogger.isOutputFileEnabled() ) ); + GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing.\n- Error file: {}\n", m_filename ) ); } } diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index c09fbcc77ac..0b12a14c20a 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -237,9 +237,9 @@ class ErrorLogger }; /** - * @brief Retrieve all informations from the Msg and format and write into a stream + * @brief Retrieve all informations from the ErrorMsg and format and write into a stream. * @param errMsg Class containing all the error/warning information - * @param oss The stream to write the content to. + * @param oss The output stream to write the content to. */ static void writeToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostream & oss ) { diff --git a/src/coreComponents/common/logger/GeosExceptions.hpp b/src/coreComponents/common/logger/GeosExceptions.hpp index 644adb00408..89fee43a234 100644 --- a/src/coreComponents/common/logger/GeosExceptions.hpp +++ b/src/coreComponents/common/logger/GeosExceptions.hpp @@ -23,6 +23,9 @@ namespace geos { +/** + * @brief Geos Exception used in GEOS_THROW + */ struct Exception : public std::exception { public: diff --git a/src/coreComponents/common/logger/Logger.cpp b/src/coreComponents/common/logger/Logger.cpp index 1cf59cbd099..ba1877eb4c9 100644 --- a/src/coreComponents/common/logger/Logger.cpp +++ b/src/coreComponents/common/logger/Logger.cpp @@ -20,8 +20,6 @@ // Source includes #include "Logger.hpp" #include "common/Path.hpp" -#include "common/format/StringUtilities.hpp" -#include "common/logger/ErrorHandling.hpp" namespace geos { diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index fb01ea0454f..3a690605ea1 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -928,7 +928,7 @@ extern std::string g_rankString; extern std::ostream * g_rankStream; -} // namespace internal +} // namespace internal #if defined(GEOS_USE_MPI) /** @@ -950,8 +950,8 @@ void InitializeLogger( const std::string & rank_output_dir="" ); */ void FinalizeLogger(); -} // namespace logger +} // namespace logger -} // namespace geos +} // namespace geos #endif /* GEOS_COMMON_LOGGER_HPP */ diff --git a/src/main/main.cpp b/src/main/main.cpp index 7f426232b69..a6322753d5b 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -18,7 +18,6 @@ #include "common/format/Format.hpp" #include "common/TimingMacros.hpp" #include "common/Units.hpp" -#include "common/logger/ErrorHandling.hpp" #include "mainInterface/initialization.hpp" #include "mainInterface/ProblemManager.hpp" #include "mainInterface/GeosxState.hpp" @@ -66,6 +65,7 @@ int main( int argc, char *argv[] ) GEOS_LOG_RANK_0( GEOS_FMT( "total time {}", units::TimeFormatInfo::fromDuration( totalTime ) ) ); GEOS_LOG_RANK_0( GEOS_FMT( "initialization time {}", units::TimeFormatInfo::fromDuration( initTime ) ) ); GEOS_LOG_RANK_0( GEOS_FMT( "run time {}", units::TimeFormatInfo::fromDuration( runTime ) ) ); + return 0; } // A NotAnError is thrown if "-h" or "--help" option is used. From e1b45f49bf4ec02fcc7459380d08ed39e0db6162 Mon Sep 17 00:00:00 2001 From: arng40 Date: Mon, 1 Dec 2025 15:36:23 +0100 Subject: [PATCH 153/173] missong doc for GeosException --- .../common/logger/GeosExceptions.hpp | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/coreComponents/common/logger/GeosExceptions.hpp b/src/coreComponents/common/logger/GeosExceptions.hpp index 89fee43a234..2fad95fd2f8 100644 --- a/src/coreComponents/common/logger/GeosExceptions.hpp +++ b/src/coreComponents/common/logger/GeosExceptions.hpp @@ -30,11 +30,20 @@ struct Exception : public std::exception { public: Exception() = default; + + /** + * @brief Constructor + * @param what The error message describing the exception + */ Exception( std::string const & what ): std::exception( ) { errorMsg.addToMsg( what ); } + + /** + * @return Reference to the ErrorMsg object + */ ErrorLogger::ErrorMsg & getErrorMsg() { return errorMsg; } @@ -49,6 +58,15 @@ struct Exception : public std::exception return m_cachedWhat.c_str(); } + /** + * @brief Prepare and cache the formatted exception message + * @param msg The main error message + * @param cause The cause of the exception + * @param file The source file where the exception occurred + * @param line The line number where the exception occurred + * @param rank The MPI rank + * @param stackTrace The stack trace at the point of exception + */ void prepareWhat( std::string const & msg, std::string const & cause, char const * file, @@ -73,7 +91,9 @@ struct Exception : public std::exception } private: + /// Formatted exception message for what() method string m_cachedWhat; + /// Error message logger for structured error reporting ErrorLogger::ErrorMsg errorMsg; }; @@ -102,6 +122,9 @@ struct LogicError : public geos::Exception geos::Exception( what ) {} + /** + * @brief Default constructor + */ LogicError(): geos::Exception(){} }; @@ -118,6 +141,9 @@ struct DomainError : public geos::Exception geos::Exception( what ) {} + /** + * @brief Default constructor + */ DomainError(): geos::Exception(){} }; /** @@ -133,6 +159,9 @@ struct InputError : public geos::Exception geos::Exception( what ) {} + /** + * @brief Default constructor + */ InputError(): geos::Exception(){} /** @@ -164,6 +193,9 @@ struct SimulationError : public geos::Exception geos::Exception( what ) {} + /** + * @brief Default constructor + */ SimulationError(): geos::Exception(){} /** @@ -199,6 +231,9 @@ struct BadTypeError : public geos::Exception geos::Exception( what ) {} + /** + * @brief Default constructor + */ BadTypeError(): geos::Exception(){} }; From 976aab54e44874ad7d2cfdc3530d8c6baf7edef9 Mon Sep 17 00:00:00 2001 From: arng40 Date: Thu, 4 Dec 2025 17:05:43 +0100 Subject: [PATCH 154/173] include error --- src/coreComponents/common/format/table/TableLayout.hpp | 1 - src/coreComponents/common/format/table/TableTypes.hpp | 2 ++ src/main/main.cpp | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/coreComponents/common/format/table/TableLayout.hpp b/src/coreComponents/common/format/table/TableLayout.hpp index ad4b434f2de..4ef156ad760 100644 --- a/src/coreComponents/common/format/table/TableLayout.hpp +++ b/src/coreComponents/common/format/table/TableLayout.hpp @@ -20,7 +20,6 @@ #ifndef GEOS_COMMON_FORMAT_TABLE_TABLELAYOUT_HPP #define GEOS_COMMON_FORMAT_TABLE_TABLELAYOUT_HPP -#include "common/DataTypes.hpp" #include "TableTypes.hpp" #include diff --git a/src/coreComponents/common/format/table/TableTypes.hpp b/src/coreComponents/common/format/table/TableTypes.hpp index 4565ad92ff8..59826ddde6a 100644 --- a/src/coreComponents/common/format/table/TableTypes.hpp +++ b/src/coreComponents/common/format/table/TableTypes.hpp @@ -23,6 +23,8 @@ #ifndef GEOS_COMMON_FORMAT_TABLETYPES_HPP #define GEOS_COMMON_FORMAT_TABLETYPES_HPP +#include "common/DataTypes.hpp" + namespace geos { diff --git a/src/main/main.cpp b/src/main/main.cpp index a6322753d5b..09cd7e4a512 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -14,7 +14,7 @@ */ // Source includes -#include "common/DataTypes.hpp" +#include "common/logger/Logger.hpp" #include "common/format/Format.hpp" #include "common/TimingMacros.hpp" #include "common/Units.hpp" From 42c53b970f427e7d024926730cf3565bdf7a6995 Mon Sep 17 00:00:00 2001 From: arng40 Date: Thu, 4 Dec 2025 17:19:52 +0100 Subject: [PATCH 155/173] doxygen --- src/coreComponents/common/logger/GeosExceptions.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/coreComponents/common/logger/GeosExceptions.hpp b/src/coreComponents/common/logger/GeosExceptions.hpp index 2fad95fd2f8..ae09fefe3ba 100644 --- a/src/coreComponents/common/logger/GeosExceptions.hpp +++ b/src/coreComponents/common/logger/GeosExceptions.hpp @@ -112,6 +112,10 @@ struct RuntimeError : public geos::Exception RuntimeError(): geos::Exception(){} }; + +/** + * @brief Exception class used to report bad GEOS state + */ struct LogicError : public geos::Exception { /** From 16c9e77d84f86bad8c266f5d6c3eb1b262c3d846 Mon Sep 17 00:00:00 2001 From: arng40 Date: Thu, 4 Dec 2025 17:22:25 +0100 Subject: [PATCH 156/173] update doxy --- src/coreComponents/common/logger/GeosExceptions.hpp | 2 +- src/coreComponents/schema/schema.xsd | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/coreComponents/common/logger/GeosExceptions.hpp b/src/coreComponents/common/logger/GeosExceptions.hpp index ae09fefe3ba..1adf819077d 100644 --- a/src/coreComponents/common/logger/GeosExceptions.hpp +++ b/src/coreComponents/common/logger/GeosExceptions.hpp @@ -51,7 +51,7 @@ struct Exception : public std::exception * @brief System fallback to get description content if error system does not achieve to output the ErrorMsg can also provide exception information to debuggers * @return Returns The exception message - * @note We does not allow to override what(), it's the GEOS_THROW responsability to give the exception message + * @note We does not allow to override what(), it's the GEOS_THROW responsability to write-in the exception message */ virtual char const * what() const noexcept override final { diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 524c0e52517..6f03bb9ca76 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -3653,8 +3653,9 @@ Information output from lower logLevels is added with the desired log level +Frequency of pressure update is set in SinglePhase/CompositionalMultiphaseStatistics definition. +Setting cycleFrequency='1' will update the pressure every timestep, note that is a lagged property in constraint propertiesNote the event associated with the statists task must be entered before the solver event. +--> From 30baf23f91ee541057fb394e49b2a31bda6f84be Mon Sep 17 00:00:00 2001 From: arng40 Date: Fri, 5 Dec 2025 14:04:22 +0100 Subject: [PATCH 157/173] remove include, + some clean --- .../common/logger/ErrorHandling.hpp | 3 ++- src/coreComponents/common/logger/Logger.hpp | 4 +-- src/coreComponents/dataRepository/Group.cpp | 2 +- src/coreComponents/dataRepository/Group.hpp | 26 +++++++++---------- .../dataRepository/python/PyGroup.cpp | 8 +++--- .../unitTests/testErrorHandling.cpp | 4 +-- .../timeHistory/HistoryCollectionBase.cpp | 6 ++--- .../dataRepositoryTests/testGroupPath.cpp | 3 +-- .../ElasticVTIWaveEquationSEMKernel.hpp | 1 - src/main/main.cpp | 1 - 10 files changed, 27 insertions(+), 31 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 0b12a14c20a..93ab75d8d89 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -325,7 +325,8 @@ class ErrorLogger void writeToYaml( ErrorMsg & errorMsg ); /** - * @brief Write all the information retrieved about the error/warning message into the targeted output + * @brief Write all the information retrieved about the error/warning message into the output stream specified and + * optionnaly into a yaml file * @param errorMsg a constant reference to the ErrorMsg */ void flushErrorMsg( ErrorMsg & errorMsg ); diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 3a690605ea1..0cd2772fb50 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -20,9 +20,7 @@ #ifndef GEOS_COMMON_LOGGER_HPP #define GEOS_COMMON_LOGGER_HPP -// Source incldes -#include "common/GeosxConfig.hpp" -#include "common/GeosxMacros.hpp" +// Source includes #include "LvArray/src/Macros.hpp" #include "common/logger/GeosExceptions.hpp" diff --git a/src/coreComponents/dataRepository/Group.cpp b/src/coreComponents/dataRepository/Group.cpp index 9afde2c482b..b9ece9eb301 100644 --- a/src/coreComponents/dataRepository/Group.cpp +++ b/src/coreComponents/dataRepository/Group.cpp @@ -695,7 +695,7 @@ Group const & Group::getBaseGroupByPath( string const & path ) const GEOS_THROW_IF( !foundTarget, "Could not find the specified path start.\n"<< "Specified path is " << path, - DomainError ); + geos::DomainError ); } string::size_type currentPosition; diff --git a/src/coreComponents/dataRepository/Group.hpp b/src/coreComponents/dataRepository/Group.hpp index bcb5eb4c626..86ff2215e42 100644 --- a/src/coreComponents/dataRepository/Group.hpp +++ b/src/coreComponents/dataRepository/Group.hpp @@ -312,7 +312,7 @@ class Group * @tparam KEY The type of the lookup. * @param key The key used to perform the lookup. * @return A reference to @p T that refers to the sub-group. - * @throw DomainError If the Group does not exist is thrown. + * @throw geos::DomainError If the Group does not exist is thrown. */ template< typename T = Group, typename KEY = void > T & getGroup( KEY const & key ) @@ -321,7 +321,7 @@ class Group GEOS_THROW_IF( child == nullptr, "Group " << getDataContext() << " has no child named " << key << std::endl << dumpSubGroupsNames(), - DomainError, getDataContext() ); + geos::DomainError, getDataContext() ); T * const castedChild = dynamicCast< T * >( child ); GEOS_THROW_IF( castedChild == nullptr, GEOS_FMT( "{} was expected to be a '{}'.", @@ -340,7 +340,7 @@ class Group GEOS_THROW_IF( child == nullptr, "Group " << getDataContext() << " has no child named " << key << std::endl << dumpSubGroupsNames(), - DomainError, getDataContext() ); + geos::DomainError, getDataContext() ); T const * const castedChild = dynamicCast< T const * >( child ); GEOS_THROW_IF( castedChild == nullptr, GEOS_FMT( "{} was expected to be a '{}'.", @@ -356,7 +356,7 @@ class Group * to lookup the Group to return. Absolute paths search * from the tree root, while relative - from current group. * @return A reference to @p T that refers to the sub-group. - * @throw DomainError If the Group doesn't exist. + * @throw geos::DomainError If the Group doesn't exist. */ template< typename T = Group > T & getGroupByPath( string const & path ) @@ -1117,7 +1117,7 @@ class Group * @tparam KEY The lookup type. * @param key The value used to lookup the wrapper. * @return A reference to the WrapperBase that resulted from the lookup. - * @throw DomainError if the wrapper doesn't exist. + * @throw geos::DomainError if the wrapper doesn't exist. */ template< typename KEY > WrapperBase const & getWrapperBase( KEY const & key ) const @@ -1126,7 +1126,7 @@ class Group GEOS_THROW_IF( wrapper == nullptr, "Group " << getDataContext() << " has no wrapper named " << key << std::endl << dumpWrappersNames(), - DomainError, getDataContext() ); + geos::DomainError, getDataContext() ); return *wrapper; } @@ -1141,7 +1141,7 @@ class Group GEOS_THROW_IF( wrapper == nullptr, "Group " << getDataContext() << " has no wrapper named " << key << std::endl << dumpWrappersNames(), - DomainError, getDataContext() ); + geos::DomainError, getDataContext() ); return *wrapper; } @@ -1210,7 +1210,7 @@ class Group * @tparam LOOKUP_TYPE the type of key used to perform the lookup * @param[in] index a lookup value used to search the collection of wrappers * @return A reference to the Wrapper that resulted from the lookup. - * @throw DomainError if the Wrapper doesn't exist. + * @throw geos::DomainError if the Wrapper doesn't exist. */ template< typename T, typename LOOKUP_TYPE > Wrapper< T > const & getWrapper( LOOKUP_TYPE const & index ) const @@ -1268,7 +1268,7 @@ class Group * @tparam LOOKUP_TYPE type of value used for wrapper lookup * @param lookup value for wrapper lookup * @return reference to @p T - * @throw A DomainError if the Wrapper does not exist. + * @throw A geos::DomainError if the Wrapper does not exist. */ template< typename T, typename LOOKUP_TYPE > GEOS_DECLTYPE_AUTO_RETURN @@ -1350,7 +1350,7 @@ class Group * this group that can be used in output messages. * @tparam KEY The lookup type. * @param key The value used to lookup the wrapper. - * @throw DomainError if the wrapper doesn't exist. + * @throw geos::DomainError if the wrapper doesn't exist. */ template< typename KEY > DataContext const & getWrapperDataContext( KEY key ) const @@ -1359,13 +1359,13 @@ class Group /** * @brief Access the group's parent. * @return reference to parent Group - * @throw DomainError if the Group doesn't have a parent. + * @throw geos::DomainError if the Group doesn't have a parent. */ Group & getParent() { GEOS_THROW_IF( m_parent == nullptr, "Group at " << getDataContext() << " does not have a parent.", - DomainError, getDataContext() ); + geos::DomainError, getDataContext() ); return *m_parent; } @@ -1376,7 +1376,7 @@ class Group { GEOS_THROW_IF( m_parent == nullptr, "Group at " << getDataContext() << " does not have a parent.", - DomainError, getDataContext() ); + geos::DomainError, getDataContext() ); return *m_parent; } diff --git a/src/coreComponents/dataRepository/python/PyGroup.cpp b/src/coreComponents/dataRepository/python/PyGroup.cpp index e0d7763bdf1..db16370b826 100644 --- a/src/coreComponents/dataRepository/python/PyGroup.cpp +++ b/src/coreComponents/dataRepository/python/PyGroup.cpp @@ -194,8 +194,8 @@ static PyObject * PyGroup_getGroup( PyGroup * const self, PyObject * const args { return createNewPyGroup( self->group->getGroupByPath( path ) ); } - // If the path isn't valid then getGroupByPath will throw a DomainError - catch( DomainError const & e ) + // If the path isn't valid then getGroupByPath will throw a geos::DomainError + catch( geos::DomainError const & e ) { // If no default return value was specified then this results in a Python exception. if( defaultReturnValue == nullptr ) @@ -259,8 +259,8 @@ static PyObject * PyGroup_getWrapper( PyGroup * const self, PyObject * const arg dataRepository::WrapperBase & wrapper = group.getWrapperBase( wrapperName ); return createNewPyWrapper( wrapper ); } - // If the path isn't valid then either getGroupByPath or getWrapperBase will throw a DomainError - catch( DomainError const & e ) + // If the path isn't valid then either getGroupByPath or getWrapperBase will throw a geos::DomainError + catch( geos::DomainError const & e ) { // If no default return value was specified then this results in a Python exception. if( defaultReturnValue == nullptr ) diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index f581a01704f..9e7e798edad 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -173,9 +173,9 @@ TEST( ErrorHandling, testYamlFileExceptionOutput ) // Stacked exception test (contexts must appear sorted by priority) try { - line1 = __LINE__; GEOS_THROW_IF( testValue == 5, "Empty Group: " << context.toString(), DomainError, context ); + line1 = __LINE__; GEOS_THROW_IF( testValue == 5, "Empty Group: " << context.toString(), geos::DomainError, context ); } - catch( DomainError const & ex ) + catch( geos::DomainError const & ex ) { string const errorMsg = "Table input error.\n"; testErrorLogger.currentErrorMsg() diff --git a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp index 15c1f4160ad..3f308376653 100644 --- a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp +++ b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp @@ -128,7 +128,7 @@ dataRepository::Group const * HistoryCollectionBase::getTargetObject( DomainPart GEOS_THROW_IF( !bodyFound, GEOS_FMT( "MeshBody ({}) is specified, but not found.", targetTokens[0] ), - DomainError ); + geos::DomainError ); } string const meshBodyName = targetTokens[0]; @@ -158,7 +158,7 @@ dataRepository::Group const * HistoryCollectionBase::getTargetObject( DomainPart GEOS_THROW_IF( !levelFound, GEOS_FMT( "MeshLevel ({}) is specified, but not found.", targetTokens[1] ), - DomainError ); + geos::DomainError ); } } else if( !meshBody.getMeshLevels().hasGroup< MeshLevel >( targetTokens[1] ) ) @@ -200,7 +200,7 @@ dataRepository::Group const * HistoryCollectionBase::getTargetObject( DomainPart { GEOS_THROW( targetTokens[pathLevel] << " not found in path " << objectPath << std::endl << targetGroup->dumpSubGroupsNames(), - DomainError ); + geos::DomainError ); } } } diff --git a/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp b/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp index 1fed569a1ed..c8e2630e625 100644 --- a/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp +++ b/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp @@ -22,7 +22,6 @@ // TPL includes #include #include -#include // Tests the Group::getGroup() and getPath() methods TEST( testGroupPath, testGlobalPaths ) @@ -93,6 +92,7 @@ TEST( testGroupPath, testGlobalPaths ) ProblemManager & problem = getGlobalState().getProblemManager(); problem.parseInputString( xmlInput ); + for( string const & path : groupPaths ) { Group const & group = problem.getGroupByPath( path ); @@ -113,7 +113,6 @@ TEST( testGroupPath, testGlobalPaths ) // checks if the exception contains the expected message std::ostringstream stream; geos::ErrorLogger::writeToAscii( ErrorLogger::global().currentErrorMsg(), stream ); - std::cout << "TEST2\n "<< stream.str() << std::endl; GEOS_ERROR_IF_EQ_MSG( string( stream.str() ).find( expectedMsg ), string::npos, "The error message was not containing the expected sequence.\n" << diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp index 600711cf5af..3b70241a7ec 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp @@ -20,7 +20,6 @@ #ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ElasticVTIWaveEquationSEMKERNEL_HPP_ #define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ElasticVTIWaveEquationSEMKERNEL_HPP_ -#include "common/logger/Logger.hpp" #include "finiteElement/kernelInterface/KernelBase.hpp" #include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" #include "physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp" diff --git a/src/main/main.cpp b/src/main/main.cpp index 09cd7e4a512..61dc2981b62 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -15,7 +15,6 @@ // Source includes #include "common/logger/Logger.hpp" -#include "common/format/Format.hpp" #include "common/TimingMacros.hpp" #include "common/Units.hpp" #include "mainInterface/initialization.hpp" From 0aeddcfbd62b3bb0ba676d6c2b218b6a2c45086a Mon Sep 17 00:00:00 2001 From: arng40 Date: Mon, 8 Dec 2025 16:02:22 +0100 Subject: [PATCH 158/173] fix cuda compil --- src/main/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index 61dc2981b62..0b38c438ea1 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -82,7 +82,7 @@ int main( int argc, char *argv[] ) } catch( std::exception const & e ) { // native exceptions management - ErrorLogger::ErrorMsg & errMsg = GEOS_GLOBAL_LOGGER.currentErrorMsg(); + ErrorLogger::ErrorMsg & errMsg = ErrorLogger::global().currentErrorMsg(); ErrorLogger::global().flushErrorMsg( errMsg ); basicCleanup(); // lvarray error handler is just program termination From ae60c25cd188d821fc2e090f3190ca5ffc5041d4 Mon Sep 17 00:00:00 2001 From: arng40 Date: Mon, 8 Dec 2025 16:44:18 +0100 Subject: [PATCH 159/173] move writeToAscii to cpp --- .../common/logger/ErrorHandling.cpp | 37 +++++++++++++++++++ .../common/logger/ErrorHandling.hpp | 30 +-------------- 2 files changed, 38 insertions(+), 29 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 1ca0e0a816c..6838d2749a5 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -41,6 +41,43 @@ static constexpr std::string_view g_level3Next = " "; ErrorLogger g_errorLogger{}; +/** + * @brief Retrieve all informations from the ErrorMsg and format and write into a stream. + * @param errMsg Class containing all the error/warning information + * @param oss The output stream to write the content to. + */ +void ErrorLogger::writeToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostream & oss ) +{ + oss << "***** " << ErrorLogger::toString( errMsg.m_type ) << "\n"; + if( !errMsg.m_signal.empty()) + { + oss<< "***** SIGNAL: "<< errMsg.m_signal <<"\n"; + } + + oss << "***** LOCATION: " << errMsg.m_file<< " l." << errMsg.m_line << "\n"; + oss << "***** " << errMsg.m_cause << "\n"; + oss << "***** Rank " << stringutilities::join( errMsg.m_ranksInfo, ", " ) << "\n"; + + for( ErrorLogger::ErrorContext const & ctxInfo : errMsg.m_contextsInfo ) + { + for( auto const & [key, value] : ctxInfo.m_attributes ) + { + oss << ErrorLogger::ErrorContext::attributeToString( key ) << ": " << value << "\n"; + } + } + oss << errMsg.m_msg << "\n\n"; + + if( errMsg.m_sourceCallStack.size() > 0 ) + { + oss << "** StackTrace of "<< errMsg.m_sourceCallStack.size() << " frames **\n"; + for( size_t i = 0; i < errMsg.m_sourceCallStack.size(); i++ ) + { + oss << GEOS_FMT( "Frame {}: {}\n", i, errMsg.m_sourceCallStack[i] ); + } + oss << "=====\n"; + } +} + ErrorLogger & ErrorLogger::global() { return g_errorLogger; } diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 93ab75d8d89..e619170aa3a 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -236,35 +236,7 @@ class ErrorLogger bool m_isValidStackTrace = false; }; - /** - * @brief Retrieve all informations from the ErrorMsg and format and write into a stream. - * @param errMsg Class containing all the error/warning information - * @param oss The output stream to write the content to. - */ - static void writeToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostream & oss ) - { - oss << "***** " << ErrorLogger::toString( errMsg.m_type ) << "\n"; - if( !errMsg.m_signal.empty()) - { - oss<< "***** SIGNAL: "<< errMsg.m_signal <<"\n"; - } - - oss << "***** LOCATION: " << errMsg.m_file<< " l." << errMsg.m_line << "\n"; - oss << "***** " << errMsg.m_cause << "\n"; - oss << "***** Rank " - << stringutilities::join( errMsg.m_ranksInfo, ", " ) - << ": " << errMsg.m_msg << "\n\n"; - - if( errMsg.m_sourceCallStack.size() > 0 ) - { - oss << "** StackTrace of "<< errMsg.m_sourceCallStack.size() << " frames **\n"; - for( size_t i = 0; i < errMsg.m_sourceCallStack.size(); i++ ) - { - oss << GEOS_FMT( "Frame {}: {}\n", i, errMsg.m_sourceCallStack[i] ); - } - oss << "=====\n"; - } - } + static void writeToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostream & oss ); /** * @return Global instance of the ErrorLogger class used for error/warning reporting. From 5a52a75754c48303a0bdbda5228f73fd8956edef Mon Sep 17 00:00:00 2001 From: arng40 Date: Mon, 8 Dec 2025 16:53:54 +0100 Subject: [PATCH 160/173] doxygen --- src/coreComponents/common/logger/ErrorHandling.hpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index e619170aa3a..0996bbf74a8 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -236,6 +236,11 @@ class ErrorLogger bool m_isValidStackTrace = false; }; + /** + * @brief Format all information in ErrorMsg and write it to the specified output stream + * @param errMsg The struct containing the error/warning object + * @param oss The output stream + */ static void writeToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostream & oss ); /** From c48c52da7467ace6e107a13e76924c3f7b9649f8 Mon Sep 17 00:00:00 2001 From: arng40 Date: Wed, 10 Dec 2025 17:47:03 +0100 Subject: [PATCH 161/173] add log test --- .../unitTests/testErrorHandling.cpp | 52 +++++++++++++++++-- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index 9e7e798edad..d1907bcce3e 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -173,7 +173,7 @@ TEST( ErrorHandling, testYamlFileExceptionOutput ) // Stacked exception test (contexts must appear sorted by priority) try { - line1 = __LINE__; GEOS_THROW_IF( testValue == 5, "Empty Group: " << context.toString(), geos::DomainError, context ); + line1 = __LINE__; GEOS_THROW_IF( testValue == 5, "Empty Group", geos::DomainError, context ); } catch( geos::DomainError const & ex ) { @@ -186,7 +186,7 @@ TEST( ErrorHandling, testYamlFileExceptionOutput ) string const whatExpected = GEOS_FMT( "***** GEOS Exception\n" "***** LOCATION: {} l.{}\n" "***** Error cause: testValue == 5\n" - "***** Rank 0: Empty Group: Base Test Class (file.xml, l.23)", + "***** Rank 0: Empty Group", testErrorLogger.currentErrorMsg().m_file, line1 ); GEOS_ERROR_IF_EQ_MSG( string( ex.what() ).find( whatExpected ), string::npos, @@ -204,7 +204,7 @@ TEST( ErrorHandling, testYamlFileExceptionOutput ) rank: 0 message: >- Table input error. - Empty Group: Base Test Class (file.xml, l.23) + Empty Group contexts: - priority: 2 inputFile: /path/to/file.xml @@ -275,6 +275,52 @@ TEST( ErrorHandling, testYamlFileErrorOutput ) } ); } + +TEST( ErrorHandling, testLogFileExceptionOutput ) +{ + ErrorLogger testErrorLogger; + + size_t line1; + + try + { + line1 = __LINE__; GEOS_THROW_IF( testValue == 5, "Empty Group", geos::DomainError, context ); + } + catch( geos::DomainError const & ex ) + { + string const errorMsg = "Table input error.\n"; + ErrorLogger::ErrorMsg currErrorMsg = testErrorLogger.currentErrorMsg(); + currErrorMsg + .addToMsg( errorMsg ) + .addContextInfo( additionalContext.getContextInfo() ) + .addContextInfo( importantAdditionalContext.getContextInfo().setPriority( 2 ) ); + + string const streamExpected = GEOS_FMT( + "***** Exception\n" + "***** LOCATION: {} l.{}\n" + "***** {}\n" + "***** Rank 0\n" + "***** Message from {}:\n" + "{}\n" + "***** Additional contexts:\n" + "***** - {}\n" + "***** - {}\n", + currErrorMsg.m_file, line1, + currErrorMsg.m_cause, + context.toString(), + currErrorMsg.m_msg, + additionalContext.toString(), + importantAdditionalContext.toString(), currErrorMsg.m_sourceCallStack ); + std::ostringstream oss; + ErrorLogger::writeToAscii( currErrorMsg, oss ); + GEOS_ERROR_IF_EQ_MSG( oss.str().find( streamExpected ), string::npos, + "The error message was not containing the expected sequence.\n" << + "The error message was not containing the expected sequence.\n" << + " Error message :\n" < Date: Wed, 10 Dec 2025 17:47:42 +0100 Subject: [PATCH 162/173] fix log wrong formatting --- src/main/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index 0b38c438ea1..5e623c907dc 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -75,7 +75,7 @@ int main( int argc, char *argv[] ) } catch( geos::Exception & e ) { // GEOS generated exceptions management - ErrorLogger::global().flushErrorMsg( e.getErrorMsg() ); + ErrorLogger::global().flushErrorMsg( ErrorLogger::global().currentErrorMsg() ); basicCleanup(); // lvarray error handler is just program termination LvArray::system::callErrorHandler(); From 855cf80455049e275e097b98eb782ef4af494974 Mon Sep 17 00:00:00 2001 From: arng40 Date: Wed, 10 Dec 2025 17:48:02 +0100 Subject: [PATCH 163/173] update log formatting & output --- .../common/initializeEnvironment.cpp | 7 ++-- .../common/logger/ErrorHandling.cpp | 32 +++++++++++++++---- .../common/logger/ErrorHandling.hpp | 3 ++ .../dataRepository/DataContext.cpp | 3 +- .../dataRepository/GroupContext.cpp | 3 +- .../dataRepository/WrapperContext.cpp | 3 +- 6 files changed, 38 insertions(+), 13 deletions(-) diff --git a/src/coreComponents/common/initializeEnvironment.cpp b/src/coreComponents/common/initializeEnvironment.cpp index 210d4169aea..efbc09d90b3 100644 --- a/src/coreComponents/common/initializeEnvironment.cpp +++ b/src/coreComponents/common/initializeEnvironment.cpp @@ -98,7 +98,8 @@ void setupLogger() error.addRank( ::geos::logger::internal::g_rank ); error.addCallStackInfo( stackHistory ); error.addContextInfo( - ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( detectionLocation ) } } } ); + ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( detectionLocation ) } }, + string( detectionLocation ) } ); ErrorLogger::global().flushErrorMsg( error ); @@ -124,8 +125,8 @@ void setupLogger() error.addRank( ::geos::logger::internal::g_rank ); error.addCallStackInfo( stackHistory ); error.addContextInfo( - ErrorContext{ { { ErrorContext::Attribute::Signal, std::to_string( signal ) } }, 1 }, - ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( "signal handler" ) } }, 0 } ); + ErrorContext{ { { ErrorContext::Attribute::Signal, std::to_string( signal ) } }, "", 1 }, + ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( "signal handler" ) } }, "", 0 } ); ErrorLogger::global().flushErrorMsg( error ); diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 6838d2749a5..9ff3fb9d275 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -48,28 +48,46 @@ ErrorLogger g_errorLogger{}; */ void ErrorLogger::writeToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostream & oss ) { + /// HEADER oss << "***** " << ErrorLogger::toString( errMsg.m_type ) << "\n"; if( !errMsg.m_signal.empty()) { oss<< "***** SIGNAL: "<< errMsg.m_signal <<"\n"; } - oss << "***** LOCATION: " << errMsg.m_file<< " l." << errMsg.m_line << "\n"; oss << "***** " << errMsg.m_cause << "\n"; oss << "***** Rank " << stringutilities::join( errMsg.m_ranksInfo, ", " ) << "\n"; - for( ErrorLogger::ErrorContext const & ctxInfo : errMsg.m_contextsInfo ) + std::vector< ErrorLogger::ErrorContext > const contextsInfo = errMsg.m_contextsInfo; + /// ERROR CONTEXT + if( contextsInfo.empty()) + { + oss << "***** Message :\n"; + oss << errMsg.m_msg << "\n"; + } + else { - for( auto const & [key, value] : ctxInfo.m_attributes ) + if( contextsInfo.size() >= 1 ) { - oss << ErrorLogger::ErrorContext::attributeToString( key ) << ": " << value << "\n"; + + oss << "***** Message from " << contextsInfo.front().m_dataDisplayString<< ":\n"; + oss << errMsg.m_msg << "\n"; } - } - oss << errMsg.m_msg << "\n\n"; + if( contextsInfo.size() > 1 ) + { + oss << "***** Additional contexts:\n"; + for( size_t i = 1; i< contextsInfo.size(); i++ ) + { + oss << "***** - " << contextsInfo[i].m_dataDisplayString << "\n"; + } + } + + } + ///STACKTRACE if( errMsg.m_sourceCallStack.size() > 0 ) { - oss << "** StackTrace of "<< errMsg.m_sourceCallStack.size() << " frames **\n"; + oss << "\n** StackTrace of "<< errMsg.m_sourceCallStack.size() << " frames **\n"; for( size_t i = 0; i < errMsg.m_sourceCallStack.size(); i++ ) { oss << GEOS_FMT( "Frame {}: {}\n", i, errMsg.m_sourceCallStack[i] ); diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 0996bbf74a8..b327ddc0525 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -79,6 +79,9 @@ class ErrorLogger /// The key is a field of the Attribute enumeration and is converted to a string for writing in the YAML map< Attribute, std::string > m_attributes; + /// String containing the target object name followed by the the file and line declaring it. + string m_dataDisplayString; + /** * @brief Priority level assigned to an error context. * @details Used to prioritize contextes (higher values = more relevant). Default is 0. diff --git a/src/coreComponents/dataRepository/DataContext.cpp b/src/coreComponents/dataRepository/DataContext.cpp index 8e01140759f..4dcb820c716 100644 --- a/src/coreComponents/dataRepository/DataContext.cpp +++ b/src/coreComponents/dataRepository/DataContext.cpp @@ -112,7 +112,8 @@ ErrorLogger::ErrorContext DataFileContext::getContextInfo() const { ErrorLogger::ErrorContext ctxInfo{ { { ErrorLogger::ErrorContext::Attribute::InputFile, m_filePath }, - { ErrorLogger::ErrorContext::Attribute::InputLine, std::to_string( m_line )} } // m_attributes + { ErrorLogger::ErrorContext::Attribute::InputLine, std::to_string( m_line )} }, + toString() }; return ctxInfo; } diff --git a/src/coreComponents/dataRepository/GroupContext.cpp b/src/coreComponents/dataRepository/GroupContext.cpp index f5085f51663..ec37336f2ab 100644 --- a/src/coreComponents/dataRepository/GroupContext.cpp +++ b/src/coreComponents/dataRepository/GroupContext.cpp @@ -57,7 +57,8 @@ string GroupContext::toString() const ErrorLogger::ErrorContext GroupContext::getContextInfo() const { ErrorLogger::ErrorContext ctxInfo{ - { { ErrorLogger::ErrorContext::Attribute::DataPath, toString() } } // m_attributes + { { ErrorLogger::ErrorContext::Attribute::DataPath, GEOS_FMT( "{}/{}", m_group.getPath(), m_targetName )} }, + toString() }; return ctxInfo; } diff --git a/src/coreComponents/dataRepository/WrapperContext.cpp b/src/coreComponents/dataRepository/WrapperContext.cpp index 50a37277e32..d2a5194020f 100644 --- a/src/coreComponents/dataRepository/WrapperContext.cpp +++ b/src/coreComponents/dataRepository/WrapperContext.cpp @@ -41,7 +41,8 @@ string WrapperContext::toString() const ErrorLogger::ErrorContext WrapperContext::getContextInfo() const { ErrorLogger::ErrorContext ctxInfo{ - { { ErrorLogger::ErrorContext::Attribute::DataPath, toString() } } // m_attributes + { { ErrorLogger::ErrorContext::Attribute::DataPath, GEOS_FMT( "{}/{}", m_group.getPath(), m_typeName ) } }, + toString() }; return ctxInfo; } From daec00634d64d98e6b7632f883ac30db930d9a1f Mon Sep 17 00:00:00 2001 From: arng40 Date: Wed, 10 Dec 2025 17:56:45 +0100 Subject: [PATCH 164/173] fix test --- .../integrationTests/dataRepositoryTests/testGroupPath.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp b/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp index c8e2630e625..8174481d720 100644 --- a/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp +++ b/src/coreComponents/integrationTests/dataRepositoryTests/testGroupPath.cpp @@ -108,12 +108,13 @@ TEST( testGroupPath, testGlobalPaths ) catch( geos::Exception & e ) { static constexpr auto expectedMsg = "***** Error cause: child == nullptr\n" - "***** Rank 0: Group Mesh (CodeIncludedXML0, l.10) has no child named mesh2\n" + "***** Rank 0\n" + "***** Message from Mesh (CodeIncludedXML0, l.10):\n" + "Group Mesh (CodeIncludedXML0, l.10) has no child named mesh2\n" "The children of Mesh are: { mesh1 }"; // checks if the exception contains the expected message std::ostringstream stream; geos::ErrorLogger::writeToAscii( ErrorLogger::global().currentErrorMsg(), stream ); - GEOS_ERROR_IF_EQ_MSG( string( stream.str() ).find( expectedMsg ), string::npos, "The error message was not containing the expected sequence.\n" << " Error message :\n" << e.what() << From ab9895b6f039bad0f857dc78535c8a84df3433de Mon Sep 17 00:00:00 2001 From: arng40 Date: Wed, 10 Dec 2025 17:57:20 +0100 Subject: [PATCH 165/173] Uncrustify --- .../dataRepository/unitTests/testErrorHandling.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index d1907bcce3e..3541b851475 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -315,7 +315,7 @@ TEST( ErrorHandling, testLogFileExceptionOutput ) ErrorLogger::writeToAscii( currErrorMsg, oss ); GEOS_ERROR_IF_EQ_MSG( oss.str().find( streamExpected ), string::npos, "The error message was not containing the expected sequence.\n" << - "The error message was not containing the expected sequence.\n" << + "The error message was not containing the expected sequence.\n" << " Error message :\n" < Date: Fri, 19 Dec 2025 15:42:58 +0100 Subject: [PATCH 166/173] reorder function + add constructor to ErrorContext --- .../common/initializeEnvironment.cpp | 9 +- .../common/logger/ErrorHandling.cpp | 182 +++++++++--------- .../common/logger/ErrorHandling.hpp | 59 +++--- .../dataRepository/DataContext.cpp | 4 +- .../dataRepository/GroupContext.cpp | 4 +- .../dataRepository/WrapperContext.cpp | 4 +- 6 files changed, 139 insertions(+), 123 deletions(-) diff --git a/src/coreComponents/common/initializeEnvironment.cpp b/src/coreComponents/common/initializeEnvironment.cpp index 32dec35252b..6589f6a5371 100644 --- a/src/coreComponents/common/initializeEnvironment.cpp +++ b/src/coreComponents/common/initializeEnvironment.cpp @@ -108,8 +108,9 @@ void setupLogger() error.addRank( ::geos::logger::internal::g_rank ); error.addCallStackInfo( stackHistory ); error.addContextInfo( - ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( detectionLocation ) } }, - string( detectionLocation ) } ); + ErrorContext{ string( detectionLocation ), + { { ErrorContext::Attribute::DetectionLoc, string( detectionLocation ) } }, + } ); ErrorLogger::global().flushErrorMsg( error ); @@ -135,8 +136,8 @@ void setupLogger() error.addRank( ::geos::logger::internal::g_rank ); error.addCallStackInfo( stackHistory ); error.addContextInfo( - ErrorContext{ { { ErrorContext::Attribute::Signal, std::to_string( signal ) } }, "", 1 }, - ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( "signal handler" ) } }, "", 0 } ); + ErrorContext{ { { ErrorContext::Attribute::Signal, std::to_string( signal ) } }, 1 }, + ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( "signal handler" ) } }, 0 } ); ErrorLogger::global().flushErrorMsg( error ); diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 9ff3fb9d275..1cc19133842 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -41,85 +41,9 @@ static constexpr std::string_view g_level3Next = " "; ErrorLogger g_errorLogger{}; -/** - * @brief Retrieve all informations from the ErrorMsg and format and write into a stream. - * @param errMsg Class containing all the error/warning information - * @param oss The output stream to write the content to. - */ -void ErrorLogger::writeToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostream & oss ) -{ - /// HEADER - oss << "***** " << ErrorLogger::toString( errMsg.m_type ) << "\n"; - if( !errMsg.m_signal.empty()) - { - oss<< "***** SIGNAL: "<< errMsg.m_signal <<"\n"; - } - oss << "***** LOCATION: " << errMsg.m_file<< " l." << errMsg.m_line << "\n"; - oss << "***** " << errMsg.m_cause << "\n"; - oss << "***** Rank " << stringutilities::join( errMsg.m_ranksInfo, ", " ) << "\n"; - - std::vector< ErrorLogger::ErrorContext > const contextsInfo = errMsg.m_contextsInfo; - /// ERROR CONTEXT - if( contextsInfo.empty()) - { - oss << "***** Message :\n"; - oss << errMsg.m_msg << "\n"; - } - else - { - if( contextsInfo.size() >= 1 ) - { - - oss << "***** Message from " << contextsInfo.front().m_dataDisplayString<< ":\n"; - oss << errMsg.m_msg << "\n"; - } - - if( contextsInfo.size() > 1 ) - { - oss << "***** Additional contexts:\n"; - for( size_t i = 1; i< contextsInfo.size(); i++ ) - { - oss << "***** - " << contextsInfo[i].m_dataDisplayString << "\n"; - } - } - - } - ///STACKTRACE - if( errMsg.m_sourceCallStack.size() > 0 ) - { - oss << "\n** StackTrace of "<< errMsg.m_sourceCallStack.size() << " frames **\n"; - for( size_t i = 0; i < errMsg.m_sourceCallStack.size(); i++ ) - { - oss << GEOS_FMT( "Frame {}: {}\n", i, errMsg.m_sourceCallStack[i] ); - } - oss << "=====\n"; - } -} - ErrorLogger & ErrorLogger::global() { return g_errorLogger; } -void ErrorLogger::createFile() -{ - if( stringutilities::endsWith( m_filename, ".yaml" ) ) - { - std::ofstream yamlFile( std::string( m_filename ), std::ios::out ); - if( yamlFile.is_open() ) - { - yamlFile << "errors: \n\n"; - yamlFile.close(); - } - else - { - GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); - } - } - else - { - enableFileOutput( false ); - GEOS_LOG_RANK( GEOS_FMT( "{} is a bad file name argument. The file must be in yaml format.", m_filename ) ); - } -} std::string ErrorLogger::ErrorContext::attributeToString( ErrorLogger::ErrorContext::Attribute attribute ) { @@ -250,17 +174,6 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addCallStackInfo( std::string_vie return *this; } -std::string ErrorLogger::toString( ErrorLogger::MsgType type ) -{ - switch( type ) - { - case ErrorLogger::MsgType::Error: return "Error"; - case ErrorLogger::MsgType::Warning: return "Warning"; - case ErrorLogger::MsgType::Exception: return "Exception"; - default: return "Unknown"; - } -} - void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstream & yamlFile, std::string_view indent ) { @@ -283,6 +196,101 @@ void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstr } } +void ErrorLogger::createFile() +{ + if( stringutilities::endsWith( m_filename, ".yaml" ) ) + { + std::ofstream yamlFile( std::string( m_filename ), std::ios::out ); + if( yamlFile.is_open() ) + { + yamlFile << "errors: \n\n"; + yamlFile.close(); + } + else + { + GEOS_LOG_RANK( GEOS_FMT( "Unable to open error file for writing: {}", m_filename ) ); + } + } + else + { + enableFileOutput( false ); + GEOS_LOG_RANK( GEOS_FMT( "{} is a bad file name argument. The file must be in yaml format.", m_filename ) ); + } +} + +std::string ErrorLogger::toString( ErrorLogger::MsgType type ) +{ + switch( type ) + { + case ErrorLogger::MsgType::Error: return "Error"; + case ErrorLogger::MsgType::Warning: return "Warning"; + case ErrorLogger::MsgType::Exception: return "Exception"; + default: return "Unknown"; + } +} + +/** + * @brief Retrieve all informations from the ErrorMsg and format and write into a stream. + * @param errMsg Class containing all the error/warning information + * @param oss The output stream to write the content to. + */ +void ErrorLogger::writeToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostream & oss ) +{ + /// HEADER + oss << "***** " << ErrorLogger::toString( errMsg.m_type ) << "\n"; + if( !errMsg.m_file.empty()) + { + oss << "***** LOCATION: " << errMsg.m_file; + if( errMsg.m_line > 0 ) + { + oss << " l." << errMsg.m_line; + } + oss << "\n"; + } + if( !errMsg.m_cause.empty()) + { + oss << "***** " << errMsg.m_cause << "\n"; + } + oss << "***** Rank " << stringutilities::join( errMsg.m_ranksInfo, ", " ) << "\n"; + + std::vector< ErrorLogger::ErrorContext > const contextsInfo = errMsg.m_contextsInfo; + /// ERROR CONTEXT + if( contextsInfo.empty()) + { + oss << "***** Message :\n"; + oss << errMsg.m_msg << "\n"; + } + else + { + if( contextsInfo.size() >= 1 ) + { + + oss << "***** Message from " << contextsInfo.front().m_dataDisplayString<< ":\n"; + oss << errMsg.m_msg << "\n"; + } + + if( contextsInfo.size() > 1 ) + { + oss << "***** Additional contexts:\n"; + for( size_t i = 1; i< contextsInfo.size(); i++ ) + { + oss << "***** - " << contextsInfo[i].m_dataDisplayString << "\n"; + } + } + + } + ///STACKTRACE + if( errMsg.m_sourceCallStack.size() > 0 ) + { + oss << "\n** StackTrace of "<< errMsg.m_sourceCallStack.size() << " frames **\n"; + for( size_t i = 0; i < errMsg.m_sourceCallStack.size(); i++ ) + { + oss << GEOS_FMT( "Frame {}: {}\n", i, errMsg.m_sourceCallStack[i] ); + } + oss << "=====\n"; + } +} + void ErrorLogger::writeToYaml( ErrorMsg & errorMsg ) { std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index b327ddc0525..c1dbbca4696 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -70,24 +70,14 @@ class ErrorLogger Signal, }; - /// The map contains contextual information about the error - /// It could be something like - /// "file" = "/path/to/file.xml" - /// "line" = "24" - /// or something like - /// "dataPath" = "/Functions/co2brine_philipsDensityTable - /// The key is a field of the Attribute enumeration and is converted to a string for writing in the YAML - map< Attribute, std::string > m_attributes; + ErrorContext( string dataDisplayString, map< Attribute, std::string > attributes ): + m_dataDisplayString( dataDisplayString ), + m_attributes( attributes ) {}; - /// String containing the target object name followed by the the file and line declaring it. - string m_dataDisplayString; - - /** - * @brief Priority level assigned to an error context. - * @details Used to prioritize contextes (higher values = more relevant). Default is 0. - * - */ - integer m_priority = 0; + ErrorContext( map< Attribute, std::string > attributes, integer priority ): + m_dataDisplayString( "" ), + m_attributes( attributes ), + m_priority( priority ) {}; /** * @brief Set the priority value of the current error context information @@ -103,6 +93,25 @@ class ErrorLogger * @return a string representation of the enumeration value */ static std::string attributeToString( Attribute attribute ); + + /// String containing the target object name followed by the the file and line declaring it. + string m_dataDisplayString; + + /// The map contains contextual information about the error + /// It could be something like + /// "file" = "/path/to/file.xml" + /// "line" = "24" + /// or something like + /// "dataPath" = "/Functions/co2brine_philipsDensityTable + /// The key is a field of the Attribute enumeration and is converted to a string for writing in the YAML + map< Attribute, std::string > m_attributes; + + /** + * @brief Priority level assigned to an error context. + * @details Used to prioritize contextes (higher values = more relevant). Default is 0. + * + */ + integer m_priority = 0; }; /** @@ -112,8 +121,6 @@ class ErrorLogger { /// the error type (Warning, Error or Exception) MsgType m_type = ErrorLogger::MsgType::Undefined; - /// The signal received and formatted - std::string m_signal; /// the error message that can be completed std::string m_msg; /// the cause of the error (erroneous condition, failed assertion...) if identified (optional) @@ -239,13 +246,6 @@ class ErrorLogger bool m_isValidStackTrace = false; }; - /** - * @brief Format all information in ErrorMsg and write it to the specified output stream - * @param errMsg The struct containing the error/warning object - * @param oss The output stream - */ - static void writeToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostream & oss ); - /** * @return Global instance of the ErrorLogger class used for error/warning reporting. * @details This global instance is used across the codebase to log errors, warnings, and exceptions, @@ -297,6 +297,13 @@ class ErrorLogger */ static std::string toString( MsgType type ); + /** + * @brief Format all information in ErrorMsg and write it to the specified output stream + * @param errMsg The struct containing the error/warning object + * @param oss The output stream + */ + static void writeToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostream & oss ); + /** * @brief Write all the information retrieved about the error/warning message into the YAML file * and reset the errorMsg instance to its initial state diff --git a/src/coreComponents/dataRepository/DataContext.cpp b/src/coreComponents/dataRepository/DataContext.cpp index 4dcb820c716..02e5b098d97 100644 --- a/src/coreComponents/dataRepository/DataContext.cpp +++ b/src/coreComponents/dataRepository/DataContext.cpp @@ -111,9 +111,9 @@ string DataFileContext::toString() const ErrorLogger::ErrorContext DataFileContext::getContextInfo() const { ErrorLogger::ErrorContext ctxInfo{ + toString(), { { ErrorLogger::ErrorContext::Attribute::InputFile, m_filePath }, - { ErrorLogger::ErrorContext::Attribute::InputLine, std::to_string( m_line )} }, - toString() + { ErrorLogger::ErrorContext::Attribute::InputLine, std::to_string( m_line )} } }; return ctxInfo; } diff --git a/src/coreComponents/dataRepository/GroupContext.cpp b/src/coreComponents/dataRepository/GroupContext.cpp index ec37336f2ab..6384c4f43cd 100644 --- a/src/coreComponents/dataRepository/GroupContext.cpp +++ b/src/coreComponents/dataRepository/GroupContext.cpp @@ -57,8 +57,8 @@ string GroupContext::toString() const ErrorLogger::ErrorContext GroupContext::getContextInfo() const { ErrorLogger::ErrorContext ctxInfo{ - { { ErrorLogger::ErrorContext::Attribute::DataPath, GEOS_FMT( "{}/{}", m_group.getPath(), m_targetName )} }, - toString() + toString(), + { { ErrorLogger::ErrorContext::Attribute::DataPath, GEOS_FMT( "{}/{}", m_group.getPath(), m_targetName )} } }; return ctxInfo; } diff --git a/src/coreComponents/dataRepository/WrapperContext.cpp b/src/coreComponents/dataRepository/WrapperContext.cpp index d2a5194020f..f5220e3fdee 100644 --- a/src/coreComponents/dataRepository/WrapperContext.cpp +++ b/src/coreComponents/dataRepository/WrapperContext.cpp @@ -41,8 +41,8 @@ string WrapperContext::toString() const ErrorLogger::ErrorContext WrapperContext::getContextInfo() const { ErrorLogger::ErrorContext ctxInfo{ - { { ErrorLogger::ErrorContext::Attribute::DataPath, GEOS_FMT( "{}/{}", m_group.getPath(), m_typeName ) } }, - toString() + toString(), + {{ ErrorLogger::ErrorContext::Attribute::DataPath, GEOS_FMT( "{}/{}", m_group.getPath(), m_typeName ) } }, }; return ctxInfo; } From cee0059eb4ae4fe640f67fcd4af556423ebe5214 Mon Sep 17 00:00:00 2001 From: arng40 Date: Fri, 19 Dec 2025 16:20:41 +0100 Subject: [PATCH 167/173] uncrustify & doxygen --- src/coreComponents/common/logger/ErrorHandling.hpp | 10 ++++++++++ src/main/main.cpp | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index c1dbbca4696..e9bcf00abe4 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -70,10 +70,20 @@ class ErrorLogger Signal, }; + /** + * @brief Construct to initialize ErrorContext given a string containing the context and his attribute + * @param dataDisplayString String containing the target object name followed by the the file and line declaring it. + * @param attributes Map containing contextual information about the error + */ ErrorContext( string dataDisplayString, map< Attribute, std::string > attributes ): m_dataDisplayString( dataDisplayString ), m_attributes( attributes ) {}; + /** + * @brief Construct to initialize ErrorContext given a string containing the context and his priority + * @param attributes Map containing contextual information about the error + * @param priority Priority level assigned to an error context. + */ ErrorContext( map< Attribute, std::string > attributes, integer priority ): m_dataDisplayString( "" ), m_attributes( attributes ), diff --git a/src/main/main.cpp b/src/main/main.cpp index 5e623c907dc..cc0ca161d12 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -75,7 +75,7 @@ int main( int argc, char *argv[] ) } catch( geos::Exception & e ) { // GEOS generated exceptions management - ErrorLogger::global().flushErrorMsg( ErrorLogger::global().currentErrorMsg() ); + ErrorLogger::global().flushErrorMsg( ErrorLogger::global().currentErrorMsg() ); basicCleanup(); // lvarray error handler is just program termination LvArray::system::callErrorHandler(); From d4db78b7916b6eadea2a80d353e940c17052ca2d Mon Sep 17 00:00:00 2001 From: arng40 Date: Mon, 22 Dec 2025 10:50:34 +0100 Subject: [PATCH 168/173] improve writeToAscii --- .../common/logger/ErrorHandling.cpp | 46 ++++++++----------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 1cc19133842..5d34540bd01 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -236,11 +236,12 @@ std::string ErrorLogger::toString( ErrorLogger::MsgType type ) */ void ErrorLogger::writeToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostream & oss ) { - /// HEADER - oss << "***** " << ErrorLogger::toString( errMsg.m_type ) << "\n"; + static constexpr string_view PREFIX = "***** "; + // --- HEADER --- + oss << PREFIX << ErrorLogger::toString( errMsg.m_type ) << "\n"; if( !errMsg.m_file.empty()) { - oss << "***** LOCATION: " << errMsg.m_file; + oss << PREFIX<< "LOCATION: " << errMsg.m_file; if( errMsg.m_line > 0 ) { oss << " l." << errMsg.m_line; @@ -249,38 +250,31 @@ void ErrorLogger::writeToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostre } if( !errMsg.m_cause.empty()) { - oss << "***** " << errMsg.m_cause << "\n"; + oss << PREFIX << errMsg.m_cause << "\n"; } - oss << "***** Rank " << stringutilities::join( errMsg.m_ranksInfo, ", " ) << "\n"; - - std::vector< ErrorLogger::ErrorContext > const contextsInfo = errMsg.m_contextsInfo; - /// ERROR CONTEXT - if( contextsInfo.empty()) + oss << PREFIX << "Rank " << stringutilities::join( errMsg.m_ranksInfo, ", " ) << "\n"; + // --- ERROR CONTEXT & MESSAGE --- + std::vector< ErrorLogger::ErrorContext > const & contexts = errMsg.m_contextsInfo; + if( contexts.empty()) { - oss << "***** Message :\n"; - oss << errMsg.m_msg << "\n"; + oss << PREFIX << "Message :\n"; } else { - if( contextsInfo.size() >= 1 ) - { - - oss << "***** Message from " << contextsInfo.front().m_dataDisplayString<< ":\n"; - oss << errMsg.m_msg << "\n"; - } + oss << PREFIX << "Message from " << contexts.front().m_dataDisplayString << ":\n"; + } + oss << errMsg.m_msg << "\n"; - if( contextsInfo.size() > 1 ) + if( contexts.size() > 1 ) + { + oss << PREFIX << "Additional contexts:\n"; + for( size_t i = 1; i < contexts.size(); ++i ) { - oss << "***** Additional contexts:\n"; - for( size_t i = 1; i< contextsInfo.size(); i++ ) - { - oss << "***** - " << contextsInfo[i].m_dataDisplayString << "\n"; - } + oss << PREFIX << "- " << contexts[i].m_dataDisplayString << "\n"; } - } - ///STACKTRACE - if( errMsg.m_sourceCallStack.size() > 0 ) + // --- STACKTRACE --- + if( !errMsg.m_sourceCallStack.empty() ) { oss << "\n** StackTrace of "<< errMsg.m_sourceCallStack.size() << " frames **\n"; for( size_t i = 0; i < errMsg.m_sourceCallStack.size(); i++ ) From 7df78fffd314ed07ad2419a530fb7a9c451112c3 Mon Sep 17 00:00:00 2001 From: arng40 Date: Mon, 22 Dec 2025 10:52:37 +0100 Subject: [PATCH 169/173] add context to std::exception --- .../unitTests/testErrorHandling.cpp | 33 +++++++++++++++++++ src/coreComponents/schema/schema.xsd | 2 +- src/main/main.cpp | 5 +++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index 3541b851475..edb2080a932 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -321,6 +321,39 @@ TEST( ErrorHandling, testLogFileExceptionOutput ) } } +TEST( ErrorHandling, testStdException ) +{ + ErrorLogger testErrorLogger; + + try + { + + throw std::invalid_argument( "received negative value" ); + } + catch( std::exception & e ) + { + ErrorLogger::ErrorMsg currErrorMsg = testErrorLogger.currentErrorMsg(); + currErrorMsg.setType( ErrorLogger::MsgType::Exception ) + .addToMsg( e.what() ) + .addRank( ::geos::logger::internal::g_rank ) + .addCallStackInfo( LvArray::system::stackTrace( true ) ); + + std::ostringstream oss; + ErrorLogger::writeToAscii( currErrorMsg, oss ); + string const streamExpected = GEOS_FMT( + "***** Exception\n" + "***** Rank 0\n" + "***** Message :\n" + "{}\n", + currErrorMsg.m_msg); + GEOS_ERROR_IF_EQ_MSG( oss.str().find( streamExpected ), string::npos, + "The error message was not containing the expected sequence.\n" << + "The error message was not containing the expected sequence.\n" << + " Error message :\n" << oss.str() << + " expected sequence :\n" << streamExpected ); + } +} + TEST( ErrorHandling, testYamlFileAssertOutput ) { ErrorLogger testErrorLogger; diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index c55fa2462d8..80750753fcd 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -8404,7 +8404,7 @@ The expected format is "{ waterMax, oilMax }", in that order--> - + diff --git a/src/main/main.cpp b/src/main/main.cpp index cc0ca161d12..7f5de502023 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -83,6 +83,11 @@ int main( int argc, char *argv[] ) catch( std::exception const & e ) { // native exceptions management ErrorLogger::ErrorMsg & errMsg = ErrorLogger::global().currentErrorMsg(); + errMsg \ + .setType( ErrorLogger::MsgType::Exception ) \ + .addToMsg( e.what() ) \ + .addRank( ::geos::logger::internal::g_rank ) \ + .addCallStackInfo( LvArray::system::stackTrace( true ) ); \ ErrorLogger::global().flushErrorMsg( errMsg ); basicCleanup(); // lvarray error handler is just program termination From abc6d2a4cdc3b070417aba9403d74888f9d6a604 Mon Sep 17 00:00:00 2001 From: arng40 Date: Wed, 24 Dec 2025 15:33:35 +0100 Subject: [PATCH 170/173] fix encapsulation in ErrorLogger by adding BuilderPattern + improve clarity --- .../common/initializeEnvironment.cpp | 35 +++--- .../common/logger/ErrorHandling.cpp | 106 ++++++++++++---- .../common/logger/ErrorHandling.hpp | 116 +++++++++++++++--- src/coreComponents/common/logger/Logger.hpp | 53 ++++---- .../multifluid/CO2Brine/CO2BrineFluid.cpp | 15 ++- .../multifluid/blackOil/BlackOilFluidBase.cpp | 10 +- .../reactive/ReactiveBrineFluid.cpp | 5 +- .../unitTests/testErrorHandling.cpp | 25 ++-- src/coreComponents/events/EventBase.cpp | 5 +- .../FieldSpecificationBase.cpp | 5 +- .../FieldSpecificationBase.hpp | 5 +- .../fileIO/Outputs/TimeHistoryOutput.cpp | 5 +- .../timeHistory/HistoryCollectionBase.cpp | 5 +- .../fileIO/timeHistory/PackCollection.cpp | 5 +- .../mainInterface/ProblemManager.cpp | 5 +- src/coreComponents/mesh/FaceManager.cpp | 5 +- .../mesh/generators/InternalMeshGenerator.cpp | 5 +- .../wells/CompositionalMultiphaseWell.cpp | 5 +- src/main/main.cpp | 15 ++- 19 files changed, 291 insertions(+), 139 deletions(-) diff --git a/src/coreComponents/common/initializeEnvironment.cpp b/src/coreComponents/common/initializeEnvironment.cpp index 6589f6a5371..915a3352f36 100644 --- a/src/coreComponents/common/initializeEnvironment.cpp +++ b/src/coreComponents/common/initializeEnvironment.cpp @@ -102,17 +102,16 @@ void setupLogger() std::string const stackHistory = LvArray::system::stackTrace( true ); - ErrorLogger::ErrorMsg error; - error.setType( ErrorLogger::MsgType::Error ); - error.addToMsg( errorMsg ); - error.addRank( ::geos::logger::internal::g_rank ); - error.addCallStackInfo( stackHistory ); - error.addContextInfo( + ErrorLogger::global().beginLogger() + .setType( ErrorLogger::MsgType::Error ) + .addToMsg( errorMsg ) + .addRank( ::geos::logger::internal::g_rank ) + .addCallStackInfo( stackHistory ) + .addContextInfo( ErrorContext{ string( detectionLocation ), { { ErrorContext::Attribute::DetectionLoc, string( detectionLocation ) } }, - } ); - - ErrorLogger::global().flushErrorMsg( error ); + } ) + .flush(); // we do not terminate the program as 1. the error could be non-fatal, 2. there may be more messages to output. } ); @@ -130,17 +129,15 @@ void setupLogger() // error message output std::string const stackHistory = LvArray::system::stackTrace( true ); - ErrorLogger::ErrorMsg error; - error.addSignalToMsg( signal ); - error.setType( ErrorLogger::MsgType::Error ); - error.addRank( ::geos::logger::internal::g_rank ); - error.addCallStackInfo( stackHistory ); - error.addContextInfo( + ErrorLogger::global().beginLogger() + .addSignalToMsg( signal ) + .setType( ErrorLogger::MsgType::Error ) + .addRank( ::geos::logger::internal::g_rank ) + .addCallStackInfo( stackHistory ) + .addContextInfo( ErrorContext{ { { ErrorContext::Attribute::Signal, std::to_string( signal ) } }, 1 }, - ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( "signal handler" ) } }, 0 } ); - - ErrorLogger::global().flushErrorMsg( error ); - + ErrorContext{ { { ErrorContext::Attribute::DetectionLoc, string( "signal handler" ) } }, 0 } ) + .flush(); // call program termination LvArray::system::callErrorHandler(); diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 5d34540bd01..30b7b3c39be 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -174,6 +174,69 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addCallStackInfo( std::string_vie return *this; } +ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::addToMsg( std::exception const & e, bool toEnd ) +{ + m_errorContext.m_currentErrorMsg.addToMsg( e, toEnd ); + return *this; +} +ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::addToMsg( std::string_view msg, bool toEnd ) +{ + m_errorContext.m_currentErrorMsg.addToMsg( msg, toEnd ); + return *this; +} + +ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::addSignalToMsg( int sig, bool toEnd ) +{ + m_errorContext.m_currentErrorMsg.addSignalToMsg( sig, toEnd ); + return *this; +} + +ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::setCodeLocation( std::string_view msgFile, integer msgLine ) +{ + if( !m_errorContext.m_currentErrorMsg.isCommited() ) + { + m_errorContext.m_currentErrorMsg.setCodeLocation( msgFile, msgLine ); + } + return *this; +} + +ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::setType( ErrorLogger::MsgType msgType ) +{ + if( !m_errorContext.m_currentErrorMsg.isCommited() ) + { + m_errorContext.m_currentErrorMsg.setType( msgType ); + } + return *this; +} + +ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::setCause( std::string_view cause ) +{ + if( !m_errorContext.m_currentErrorMsg.isCommited() ) + { + m_errorContext.m_currentErrorMsg.setCause( cause ); + } + return *this; +} + +ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::addRank( int rank ) +{ + if( !m_errorContext.m_currentErrorMsg.isCommited() ) + { + m_errorContext.m_currentErrorMsg.addRank( rank ); + } + return *this; +} + +ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::addCallStackInfo( std::string_view ossStackTrace ) +{ + if( !m_errorContext.m_currentErrorMsg.isCommited() ) + { + m_errorContext.m_currentErrorMsg.addCallStackInfo( ossStackTrace ); + } + return *this; +} + + void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstream & yamlFile, std::string_view indent ) { @@ -285,31 +348,32 @@ void ErrorLogger::writeToAscii( ErrorLogger::ErrorMsg const & errMsg, std::ostre } } -void ErrorLogger::writeToYaml( ErrorMsg & errorMsg ) +void ErrorLogger::writeToYaml() { std::ofstream yamlFile( std::string( m_filename ), std::ios::app ); if( yamlFile.is_open() ) { // General errors info (type, rank on which the error occured) - yamlFile << g_level1Start << "type: " << ErrorLogger::toString( errorMsg.m_type ) << "\n"; - yamlFile << g_level1Next << "rank: " << stringutilities::join( errorMsg.m_ranksInfo, "," ); + yamlFile << g_level1Start << "type: " << ErrorLogger::toString( m_currentErrorMsg.m_type ) << "\n"; + yamlFile << g_level1Next << "rank: " << stringutilities::join( m_currentErrorMsg.m_ranksInfo, "," ); yamlFile << "\n"; // Error message yamlFile << g_level1Next << "message: >-\n"; - streamMultilineYamlAttribute( errorMsg.m_msg, yamlFile, g_level2Next ); + streamMultilineYamlAttribute( m_currentErrorMsg.m_msg, yamlFile, g_level2Next ); // context information - if( !errorMsg.m_contextsInfo.empty() ) + if( !m_currentErrorMsg.m_contextsInfo.empty() ) { + std::vector< ErrorContext > contextInfo = m_currentErrorMsg.m_contextsInfo; // Sort contextual information by decreasing priority - std::sort( errorMsg.m_contextsInfo.begin(), errorMsg.m_contextsInfo.end(), + std::sort( contextInfo.begin(), contextInfo.end(), []( const ErrorLogger::ErrorContext & a, const ErrorLogger::ErrorContext & b ) { return a.m_priority > b.m_priority; } ); // Additional informations about the context of the error and priority information of each context yamlFile << g_level1Next << "contexts:\n"; - for( ErrorContext const & ctxInfo : errorMsg.m_contextsInfo ) + for( ErrorContext const & ctxInfo : contextInfo ) { yamlFile << g_level3Start << "priority: " << ctxInfo.m_priority << "\n"; for( auto const & [key, value] : ctxInfo.m_attributes ) @@ -320,34 +384,34 @@ void ErrorLogger::writeToYaml( ErrorMsg & errorMsg ) } // error cause - if( !errorMsg.m_cause.empty() ) + if( !m_currentErrorMsg.m_cause.empty() ) { yamlFile << g_level1Next << "cause: >-\n"; - streamMultilineYamlAttribute( errorMsg.m_cause, yamlFile, g_level2Next ); + streamMultilineYamlAttribute( m_currentErrorMsg.m_cause, yamlFile, g_level2Next ); } // Location of the error in the code - if( !errorMsg.m_file.empty() ) + if( !m_currentErrorMsg.m_file.empty() ) { yamlFile << g_level1Next << "sourceLocation:\n"; - yamlFile << g_level2Next << "file: " << errorMsg.m_file << "\n"; - yamlFile << g_level2Next << "line: " << errorMsg.m_line << "\n"; + yamlFile << g_level2Next << "file: " << m_currentErrorMsg.m_file << "\n"; + yamlFile << g_level2Next << "line: " << m_currentErrorMsg.m_line << "\n"; } // Information about the stack trace - if( !errorMsg.m_sourceCallStack.empty() ) + if( !m_currentErrorMsg.m_sourceCallStack.empty() ) { yamlFile << g_level1Next << "sourceCallStack:\n"; - for( size_t i = 0; i < errorMsg.m_sourceCallStack.size(); i++ ) + for( size_t i = 0; i < m_currentErrorMsg.m_sourceCallStack.size(); i++ ) { - yamlFile << ( errorMsg.isValidStackTrace() ? - GEOS_FMT( "{}frame{}: {}\n", g_level3Start, i, errorMsg.m_sourceCallStack[i] ) : - GEOS_FMT( "{}{}\n", g_level3Start, errorMsg.m_sourceCallStack[i] ) ); + yamlFile << ( m_currentErrorMsg.isValidStackTrace() ? + GEOS_FMT( "{}frame{}: {}\n", g_level3Start, i, m_currentErrorMsg.m_sourceCallStack[i] ) : + GEOS_FMT( "{}{}\n", g_level3Start, m_currentErrorMsg.m_sourceCallStack[i] ) ); } } yamlFile << "\n"; yamlFile.flush(); - errorMsg = ErrorMsg(); + m_currentErrorMsg = ErrorMsg(); GEOS_LOG_RANK( GEOS_FMT( "The error file {} has been appended.", m_filename ) ); } else @@ -356,12 +420,12 @@ void ErrorLogger::writeToYaml( ErrorMsg & errorMsg ) } } -void ErrorLogger::flushErrorMsg( ErrorMsg & errorMsg ) +void ErrorLogger::flushErrorMsg() { - writeToAscii( errorMsg, getErrorStream() ); + writeToAscii( m_currentErrorMsg, m_stream ); if( isOutputFileEnabled() ) { - writeToYaml( errorMsg ); + writeToYaml(); } } diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index e9bcf00abe4..a12762e7bd6 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -165,7 +165,7 @@ class ErrorLogger integer rank, std::string_view msgFile, integer msgLine ) - : m_type( msgType ), m_msg( msgContent ), m_ranksInfo( {rank} ), m_file( msgFile ), m_line( msgLine ) {} + : m_type( msgType ), m_msg( msgContent ), m_ranksInfo( {rank} ), m_file( msgFile ), m_line( msgLine ), m_commit( false ) {} /** * @brief Add text to the current error msg @@ -246,15 +246,102 @@ class ErrorLogger bool isValidStackTrace() const { return m_isValidStackTrace; } + /** + * @return whether the error message has been finalized and committed. + */ + bool isCommited() const + { return m_commit; } + + /** + * @brief Marks the error message as committed (finalized). + */ + void commitErrorMsg() + { m_commit = true; } + private: /** * @brief Add contextual information about the error/warning * @param ctxInfo rvalue of the ErrorContext class */ void addContextInfoImpl( ErrorContext && ctxInfo ); - + /// Indicates whether the stored call stack trace is valid and usable. bool m_isValidStackTrace = false; + /// Indicates whether the error message has been fully constructed and finalized. + bool m_commit = false; + }; + + /** + * @brief Builder class for constructing ErrorMsg objects + */ + class ErrorMsgBuilder + { +public: + ErrorMsgBuilder( ErrorLogger & errorContext ): m_errorContext( errorContext ){}; + /** + * @copydoc ErrorLogger:ErrorMsg::addToMsg( std::exception const & e, bool toEnd = false ) + */ + ErrorMsgBuilder & addToMsg( std::exception const & e, bool toEnd = false ); + /** + * @copydoc ErrorLogger:ErrorMsg::addToMsg( std::string_view msg, bool toEnd = false ) + */ + ErrorMsgBuilder & addToMsg( std::string_view msg, bool toEnd = false ); + /** + * @copydoc ErrorLogger:ErrorMsg::addContextInfo( Args && ... args ) + */ + template< typename ... Args > + ErrorMsgBuilder & addContextInfo( Args && ... args ) + { + ( m_errorContext.m_currentErrorMsg.addContextInfo( ErrorContext( args ) ), ... ); + return *this; + } + /** + * @copydoc ErrorLogger:ErrorMsg::addSignalToMsg( int sig, bool toEnd = false ); + */ + ErrorMsgBuilder & addSignalToMsg( int sig, bool toEnd = false ); + /** + * @copydoc ErrorLogger:ErrorMsg::setCodeLocation( std::string_view msgFile, integer msgLine ) + */ + ErrorMsgBuilder & setCodeLocation( std::string_view msgFile, integer msgLine ); + /** + * @copydoc ErrorLogger:ErrorMsg::setType( ErrorLogger::MsgType msgType ) + */ + ErrorMsgBuilder & setType( ErrorLogger::MsgType msgType ); + /** + * @copydoc ErrorLogger:ErrorMsg::setCause( std::string_view cause ) + */ + ErrorMsgBuilder & setCause( std::string_view cause ); + /** + * @copydoc ErrorLogger:ErrorMsg::addRank( int rank ); + */ + ErrorMsgBuilder & addRank( int rank ); + /** + * @copydoc ErrorLogger:ErrorMsg::addCallStackInfo( std::string_view ossStackTrace ) + */ + ErrorMsgBuilder & addCallStackInfo( std::string_view ossStackTrace ); + /** + * @brief Finalizes the error message construction + * @note Calling commit() does not flush/output the error; + */ + void commit() + { m_errorContext.m_currentErrorMsg.commitErrorMsg(); } + /** + * @copydoc ErrorLogger::flushErrorMsg() + */ + void flush() + { m_errorContext.flushErrorMsg(); } + +private: + ///@copydoc ErrorLogger::m_errorContext + ErrorLogger & m_errorContext; }; + /** + * @brief Creates and returns a new ErrorMsgBuilder to begin constructing an error message. + * @return A new ErrorMsgBuilder instance + */ + ErrorMsgBuilder beginLogger() + { + return ErrorMsgBuilder( *this ); + } /** * @return Global instance of the ErrorLogger class used for error/warning reporting. @@ -272,6 +359,12 @@ class ErrorLogger void enableFileOutput( bool value ) { m_writeYaml = value; } + /** + * @return true if the YAML file output is enabled + */ + bool isOutputFileEnabled() const + { return m_writeYaml; } + /** * @brief Set the name of the YAML file if specified by user * default is "errors.yaml" @@ -291,7 +384,7 @@ class ErrorLogger * potencially at various application layers (Typically for exceptions) * @return Reference to the current error message instance; */ - ErrorMsg & currentErrorMsg() + ErrorMsg const & currentErrorMsg() const { return m_currentErrorMsg; } /** @@ -319,14 +412,14 @@ class ErrorLogger * and reset the errorMsg instance to its initial state * @param errorMsg a constant reference to the error */ - void writeToYaml( ErrorMsg & errorMsg ); + void writeToYaml(); /** * @brief Write all the information retrieved about the error/warning message into the output stream specified and * optionnaly into a yaml file * @param errorMsg a constant reference to the ErrorMsg */ - void flushErrorMsg( ErrorMsg & errorMsg ); + void flushErrorMsg(); /** * @return Return the const general log stream @@ -334,12 +427,6 @@ class ErrorLogger std::ostream const & getErrorStream() const { return m_stream; } - /** - * @return Return the reference general log stream - */ - std::ostream & getErrorStream() - { return m_stream; } - private: /// The error constructed via exceptions ErrorMsg m_currentErrorMsg; @@ -350,13 +437,6 @@ class ErrorLogger /// The stream used for the log output. By default used std::cout std::ostream & m_stream = std::cout; - - /** - * @return true if the YAML file output is enabled - */ - bool isOutputFileEnabled() const - { return m_writeYaml; } - /** * @brief Write the error message in the YAML file regarding indentation and line break * @param msg the message to write in the YAML diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 0cd2772fb50..261fd5faced 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -157,15 +157,15 @@ __msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ std::ostringstream __causemsgsoss; \ __causemsgsoss << CAUSE_MESSAGE; \ - ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Error, \ - __msgoss.str(), \ - ::geos::logger::internal::g_rank, \ - __FILE__, \ - __LINE__ ); \ - msgStruct.setCause( __causemsgsoss.str() ); \ - msgStruct.addCallStackInfo( LvArray::system::stackTrace( true ) ); \ - msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - GEOS_GLOBAL_LOGGER.flushErrorMsg( msgStruct ); \ + GEOS_GLOBAL_LOGGER.beginLogger() \ + .setType( ErrorLogger::MsgType::Error ) \ + .setCodeLocation( __FILE__, __LINE__ ) \ + .setCause( __causemsgsoss.str() ) \ + .addRank( ::geos::logger::internal::g_rank ) \ + .addToMsg( __msgoss.str() ) \ + .addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ) \ + .addCallStackInfo( LvArray::system::stackTrace( true ) ) \ + .flush(); \ LvArray::system::callErrorHandler(); \ } \ }while( false ) @@ -224,18 +224,15 @@ __msgoss << MSG; \ std::ostringstream __causemsgsoss; \ __causemsgsoss << CAUSE_MESSAGE; \ - if( GEOS_GLOBAL_LOGGER.currentErrorMsg().m_type == ErrorLogger::MsgType::Undefined ) \ - { /* first throw site, we initialize the error message completly */ \ - GEOS_GLOBAL_LOGGER.currentErrorMsg() \ - .setType( ErrorLogger::MsgType::Exception ) \ - .setCodeLocation( __FILE__, __LINE__ ) \ - .setCause( __causemsgsoss.str() ) \ - .addRank( ::geos::logger::internal::g_rank ) \ - .addCallStackInfo( LvArray::system::stackTrace( true ) ); \ - } \ - GEOS_GLOBAL_LOGGER.currentErrorMsg() \ + GEOS_GLOBAL_LOGGER.beginLogger() \ + .setType( ErrorLogger::MsgType::Exception ) \ + .setCodeLocation( __FILE__, __LINE__ ) \ + .setCause( __causemsgsoss.str() ) \ + .addRank( ::geos::logger::internal::g_rank ) \ + .addCallStackInfo( LvArray::system::stackTrace( true ) ) \ .addToMsg( __msgoss.str() ) \ - .addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ + .addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ) \ + .commit(); \ auto ex = GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ )(); \ ex.prepareWhat( __msgoss.str(), __causemsgsoss.str(), \ __FILE__, __LINE__, \ @@ -299,14 +296,14 @@ __msgoss << GEOS_DETAIL_FIRST_ARG( __VA_ARGS__ ); \ std::ostringstream __causemsgsoss; \ __causemsgsoss << CAUSE_MESSAGE; \ - ErrorLogger::ErrorMsg msgStruct( ErrorLogger::MsgType::Warning, \ - __msgoss.str(), \ - ::geos::logger::internal::g_rank, \ - __FILE__, \ - __LINE__ ); \ - msgStruct.setCause( __causemsgsoss.str() ); \ - msgStruct.addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ); \ - GEOS_GLOBAL_LOGGER.flushErrorMsg( msgStruct ); \ + GEOS_GLOBAL_LOGGER.beginLogger() \ + .setType( ErrorLogger::MsgType::Warning ) \ + .setCodeLocation( __FILE__, __LINE__ ) \ + .setCause( __causemsgsoss.str() ) \ + .addRank( ::geos::logger::internal::g_rank ) \ + .addToMsg( __msgoss.str() ) \ + .addContextInfo( GEOS_DETAIL_REST_ARGS( __VA_ARGS__ ) ) \ + .flush(); \ } \ } while( false ) #elif __CUDA_ARCH__ diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp index 470cc72f920..635f6a9348a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp @@ -172,9 +172,10 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const { string const errorMsg = GEOS_FMT( "Table input error for {} phase (in table from \"{}\").\n", m_phaseNames[m_p1Index], m_phasePVTParaFiles[m_p1Index] ); - ErrorLogger::global().currentErrorMsg() + ErrorLogger::global().beginLogger() .addToMsg( errorMsg ) - .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); + .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ) + .commit(); throw SimulationError( ex, errorMsg ); } @@ -187,9 +188,10 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const { string const errorMsg = GEOS_FMT( "Table input error for {} phase (in table from \"{}\").\n", m_phaseNames[m_p2Index], m_phasePVTParaFiles[m_p2Index] ); - ErrorLogger::global().currentErrorMsg() + ErrorLogger::global().beginLogger() .addToMsg( errorMsg ) - .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); + .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ) + .commit(); throw SimulationError( ex, errorMsg ); } @@ -200,9 +202,10 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const { string const errorMsg = GEOS_FMT( "Table input error for flash phase (in table from \"{}\").\n", m_flashModelParaFile ); - ErrorLogger::global().currentErrorMsg() + ErrorLogger::global().beginLogger() .addToMsg( errorMsg ) - .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); + .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ) + .commit(); throw SimulationError( ex, errorMsg ); } } diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp index ecf77b94f40..b87019f6fa6 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp @@ -258,9 +258,10 @@ void BlackOilFluidBase::checkTablesParameters( real64 const pressure, { string const msg = GEOS_FMT( errorMsg, getCatalogName(), getDataContext(), "formation volume factor", iph ); - ErrorLogger::global().currentErrorMsg() + ErrorLogger::global().beginLogger() .addToMsg( msg ) - .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); + .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ) + .commit(); throw SimulationError( ex, msg ); } @@ -271,9 +272,10 @@ void BlackOilFluidBase::checkTablesParameters( real64 const pressure, { string const msg = GEOS_FMT( errorMsg, getCatalogName(), getDataContext(), "viscosity", iph ); - ErrorLogger::global().currentErrorMsg() + ErrorLogger::global().beginLogger() .addToMsg( msg ) - .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); + .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ) + .commit(); throw SimulationError( ex, msg ); } } diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp index 7371e60d080..ece03e2c60b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp @@ -235,9 +235,10 @@ void ReactiveBrineFluid< PHASE >::checkTablesParameters( real64 const pressure, { string const errorMsg = GEOS_FMT( "Table input error (in table from {}).\n", stringutilities::join( m_phasePVTParaFiles ) ); - ErrorLogger::global().currentErrorMsg() + ErrorLogger::global().beginLogger() .addToMsg( errorMsg ) - .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); + .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ) + .commit(); throw SimulationError( ex, errorMsg ); } } diff --git a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp index edb2080a932..f6fbc0be8e1 100644 --- a/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp +++ b/src/coreComponents/dataRepository/unitTests/testErrorHandling.cpp @@ -178,7 +178,7 @@ TEST( ErrorHandling, testYamlFileExceptionOutput ) catch( geos::DomainError const & ex ) { string const errorMsg = "Table input error.\n"; - testErrorLogger.currentErrorMsg() + testErrorLogger.beginLogger() .addToMsg( errorMsg ) .addContextInfo( additionalContext.getContextInfo() ) .addContextInfo( importantAdditionalContext.getContextInfo().setPriority( 2 ) ); @@ -194,7 +194,7 @@ TEST( ErrorHandling, testYamlFileExceptionOutput ) " Error message :\n" << ex.what() << " expected sequence :\n" << whatExpected ); } - testErrorLogger.flushErrorMsg( testErrorLogger.currentErrorMsg() ); + testErrorLogger.flushErrorMsg(); endLocalLoggerTest( testErrorLogger, { R"(errors:)", @@ -289,8 +289,7 @@ TEST( ErrorHandling, testLogFileExceptionOutput ) catch( geos::DomainError const & ex ) { string const errorMsg = "Table input error.\n"; - ErrorLogger::ErrorMsg currErrorMsg = testErrorLogger.currentErrorMsg(); - currErrorMsg + testErrorLogger.beginLogger() .addToMsg( errorMsg ) .addContextInfo( additionalContext.getContextInfo() ) .addContextInfo( importantAdditionalContext.getContextInfo().setPriority( 2 ) ); @@ -305,14 +304,14 @@ TEST( ErrorHandling, testLogFileExceptionOutput ) "***** Additional contexts:\n" "***** - {}\n" "***** - {}\n", - currErrorMsg.m_file, line1, - currErrorMsg.m_cause, + testErrorLogger.currentErrorMsg().m_file, line1, + testErrorLogger.currentErrorMsg().m_cause, context.toString(), - currErrorMsg.m_msg, + testErrorLogger.currentErrorMsg().m_msg, additionalContext.toString(), - importantAdditionalContext.toString(), currErrorMsg.m_sourceCallStack ); + importantAdditionalContext.toString(), testErrorLogger.currentErrorMsg().m_sourceCallStack ); std::ostringstream oss; - ErrorLogger::writeToAscii( currErrorMsg, oss ); + ErrorLogger::writeToAscii( testErrorLogger.currentErrorMsg(), oss ); GEOS_ERROR_IF_EQ_MSG( oss.str().find( streamExpected ), string::npos, "The error message was not containing the expected sequence.\n" << "The error message was not containing the expected sequence.\n" << @@ -332,20 +331,20 @@ TEST( ErrorHandling, testStdException ) } catch( std::exception & e ) { - ErrorLogger::ErrorMsg currErrorMsg = testErrorLogger.currentErrorMsg(); - currErrorMsg.setType( ErrorLogger::MsgType::Exception ) + testErrorLogger.beginLogger() + .setType( ErrorLogger::MsgType::Exception ) .addToMsg( e.what() ) .addRank( ::geos::logger::internal::g_rank ) .addCallStackInfo( LvArray::system::stackTrace( true ) ); std::ostringstream oss; - ErrorLogger::writeToAscii( currErrorMsg, oss ); + ErrorLogger::writeToAscii( testErrorLogger.currentErrorMsg(), oss ); string const streamExpected = GEOS_FMT( "***** Exception\n" "***** Rank 0\n" "***** Message :\n" "{}\n", - currErrorMsg.m_msg); + testErrorLogger.currentErrorMsg().m_msg ); GEOS_ERROR_IF_EQ_MSG( oss.str().find( streamExpected ), string::npos, "The error message was not containing the expected sequence.\n" << "The error message was not containing the expected sequence.\n" << diff --git a/src/coreComponents/events/EventBase.cpp b/src/coreComponents/events/EventBase.cpp index 1984ec59fbc..e0851b50f1a 100644 --- a/src/coreComponents/events/EventBase.cpp +++ b/src/coreComponents/events/EventBase.cpp @@ -153,10 +153,11 @@ void EventBase::getTargetReferences() { string const errorMsg = GEOS_FMT( "Error while reading {}:\n", getWrapperDataContext( viewKeyStruct::eventTargetString() ) ); - ErrorLogger::global().currentErrorMsg() + ErrorLogger::global().beginLogger() .addToMsg( errorMsg ) .addContextInfo( getWrapperDataContext( viewKeyStruct::eventTargetString() ).getContextInfo() - .setPriority( 1 ) ); + .setPriority( 1 ) ) + .commit(); throw InputError( e, errorMsg ); } } diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp b/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp index 47209289471..29a8821b3ea 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp @@ -119,11 +119,12 @@ void FieldSpecificationBase::setMeshObjectPath( Group const & meshBodies ) } catch( std::exception const & e ) { - ErrorLogger::global().currentErrorMsg() + ErrorLogger::global().beginLogger() .addToMsg( getWrapperDataContext( viewKeyStruct::objectPathString() ).toString() + " is a wrong objectPath: " + m_objectPath + "\n" ) .addContextInfo( getWrapperDataContext( viewKeyStruct::objectPathString() ).getContextInfo() - .setPriority( 2 ) ); + .setPriority( 2 ) ) + .commit(); throw InputError( e, getWrapperDataContext( viewKeyStruct::objectPathString() ).toString() + " is a wrong objectPath: " + m_objectPath + "\n" ); } diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp index 2880b4811a6..ba7104306e8 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp @@ -638,10 +638,11 @@ void FieldSpecificationBase::applyFieldValueKernel( ArrayView< T, N, USD > const { string const errorMsg = GEOS_FMT( "Error while reading {}:\n", getWrapperDataContext( viewKeyStruct::functionNameString() ) ); - ErrorLogger::global().currentErrorMsg() + ErrorLogger::global().beginLogger() .addToMsg( errorMsg ) .addContextInfo( getWrapperDataContext( viewKeyStruct::functionNameString() ).getContextInfo() - .setPriority( 1 ) ); + .setPriority( 1 ) ) + .commit(); throw InputError( e, errorMsg ); } }(); diff --git a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp index ed84a72833b..4a84a2888d7 100644 --- a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp @@ -145,10 +145,11 @@ void TimeHistoryOutput::initializePostInitialConditionsPostSubGroups() { string const errorMsg = GEOS_FMT( "Error while reading {}:\n", getWrapperDataContext( viewKeys::timeHistoryOutputTargetString() ) ); - ErrorLogger::global().currentErrorMsg() + ErrorLogger::global().beginLogger() .addToMsg( errorMsg ) .addContextInfo( getWrapperDataContext( viewKeys::timeHistoryOutputTargetString() ).getContextInfo() - .setPriority( 1 ) ); + .setPriority( 1 ) ) + .commit(); throw InputError( e, errorMsg ); } } diff --git a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp index 3f308376653..48715ad68dd 100644 --- a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp +++ b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp @@ -209,9 +209,10 @@ dataRepository::Group const * HistoryCollectionBase::getTargetObject( DomainPart } catch( std::exception const & e ) { - ErrorLogger::global().currentErrorMsg() + ErrorLogger::global().beginLogger() .addToMsg( getDataContext().toString() + " has a wrong objectPath: " + objectPath + "\n" ) - .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ); + .addContextInfo( getDataContext().getContextInfo().setPriority( 2 ) ) + .commit(); throw InputError( e, getDataContext().toString() + " has a wrong objectPath: " + objectPath + "\n" ); } } diff --git a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp index ff9b229cec1..72b1d331bc1 100644 --- a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp +++ b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp @@ -153,11 +153,12 @@ void PackCollection::updateSetsIndices( DomainPartition const & domain ) } catch( std::exception const & e ) { - ErrorLogger::global().currentErrorMsg() + ErrorLogger::global().beginLogger() .addToMsg( getWrapperDataContext( viewKeysStruct::fieldNameString() ).toString() + ": Target not found !\n" ) .addContextInfo( getWrapperDataContext( viewKeysStruct::fieldNameString() ).getContextInfo() - .setPriority( 1 ) ); + .setPriority( 1 ) ) + .commit(); throw InputError( e, getWrapperDataContext( viewKeysStruct::fieldNameString() ).toString() + ": Target not found !\n" ); } diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index ed85797f2c2..a55a22d10ea 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -500,9 +500,10 @@ void ProblemManager::parseXMLDocument( xmlWrapper::xmlDocument & xmlDocument ) { string const errorMsg = GEOS_FMT( "Error while parsing region {} ({}):\n", regionName, regionNodePos.toString() ); - ErrorLogger::global().currentErrorMsg() + ErrorLogger::global().beginLogger() .addToMsg( errorMsg ) - .addContextInfo( getDataContext().getContextInfo().setPriority( -1 ) ); + .addContextInfo( getDataContext().getContextInfo().setPriority( -1 ) ) + .commit(); throw InputError( e, errorMsg ); } } diff --git a/src/coreComponents/mesh/FaceManager.cpp b/src/coreComponents/mesh/FaceManager.cpp index 04571d66e8d..ae9c3cee3df 100644 --- a/src/coreComponents/mesh/FaceManager.cpp +++ b/src/coreComponents/mesh/FaceManager.cpp @@ -298,9 +298,10 @@ void FaceManager::sortAllFaceNodes( NodeManager const & nodeManager, sortFaceNodes( X, elemCenter[er][esr][ei], facesToNodes[faceIndex] ); } catch( std::runtime_error const & e ) { - ErrorLogger::global().currentErrorMsg() + ErrorLogger::global().beginLogger() .addToMsg( getDataContext().toString() + ": " + e.what() ) - .addContextInfo( getDataContext().getContextInfo().setPriority( 1 ) ); + .addContextInfo( getDataContext().getContextInfo().setPriority( 1 ) ) + .commit(); throw std::runtime_error( getDataContext().toString() + ": " + e.what() ); } } ); diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp index 0eac2831c21..4fc02dc879e 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp @@ -185,9 +185,10 @@ void InternalMeshGenerator::postInputInitialization() WrapperBase const & wrapper = getWrapperBase( viewKeyStruct::elementTypesString() ); std::string const msg = GEOS_FMT( "InternalMesh {}, element index = {}: ", wrapper.getDataContext().toString(), std::to_string( i ) ); - ErrorLogger::global().currentErrorMsg() + ErrorLogger::global().beginLogger() .addToMsg( msg ) - .addContextInfo( wrapper.getDataContext().getContextInfo().setPriority( 2 ) ); + .addContextInfo( wrapper.getDataContext().getContextInfo().setPriority( 2 ) ) + .commit(); throw InputError( e, msg ); } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 28def34e770..5bac5cc9d95 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -353,9 +353,10 @@ void CompositionalMultiphaseWell::validateWellControlsForFluid( WellControls con } catch( SimulationError const & ex ) { string const errorMsg = GEOS_FMT( "{}: wrong surface pressure / temperature.\n", getDataContext() ); - ErrorLogger::global().currentErrorMsg() + ErrorLogger::global().beginLogger() .addToMsg( errorMsg ) - .addContextInfo( getDataContext().getContextInfo().setPriority( 1 ) ); + .addContextInfo( getDataContext().getContextInfo().setPriority( 1 ) ) + .commit(); throw SimulationError( ex, errorMsg ); } } diff --git a/src/main/main.cpp b/src/main/main.cpp index 7f5de502023..bfd4cae325e 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -75,20 +75,19 @@ int main( int argc, char *argv[] ) } catch( geos::Exception & e ) { // GEOS generated exceptions management - ErrorLogger::global().flushErrorMsg( ErrorLogger::global().currentErrorMsg() ); + ErrorLogger::global().flushErrorMsg(); basicCleanup(); // lvarray error handler is just program termination LvArray::system::callErrorHandler(); } catch( std::exception const & e ) { // native exceptions management - ErrorLogger::ErrorMsg & errMsg = ErrorLogger::global().currentErrorMsg(); - errMsg \ - .setType( ErrorLogger::MsgType::Exception ) \ - .addToMsg( e.what() ) \ - .addRank( ::geos::logger::internal::g_rank ) \ - .addCallStackInfo( LvArray::system::stackTrace( true ) ); \ - ErrorLogger::global().flushErrorMsg( errMsg ); + ErrorLogger::global().beginLogger() + .setType( ErrorLogger::MsgType::Exception ) + .addToMsg( e.what() ) + .addRank( ::geos::logger::internal::g_rank ) + .addCallStackInfo( LvArray::system::stackTrace( true ) ) + .flush(); basicCleanup(); // lvarray error handler is just program termination LvArray::system::callErrorHandler(); From ec7ddc1f1060aff0aee44ff5cb47ca57056f6b3e Mon Sep 17 00:00:00 2001 From: arng40 Date: Wed, 24 Dec 2025 15:43:02 +0100 Subject: [PATCH 171/173] uncrustify --- src/coreComponents/common/logger/ErrorHandling.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index a12762e7bd6..8372efa7de8 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -251,7 +251,7 @@ class ErrorLogger */ bool isCommited() const { return m_commit; } - + /** * @brief Marks the error message as committed (finalized). */ From 4a5b4feef01850ee195eea3e16251ce8c5504eeb Mon Sep 17 00:00:00 2001 From: arng40 Date: Wed, 24 Dec 2025 16:24:47 +0100 Subject: [PATCH 172/173] remove redundant lmsg in case of multiple rank --- src/coreComponents/common/logger/ErrorHandling.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index 30b7b3c39be..d3f625c8295 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -412,7 +412,6 @@ void ErrorLogger::writeToYaml() yamlFile << "\n"; yamlFile.flush(); m_currentErrorMsg = ErrorMsg(); - GEOS_LOG_RANK( GEOS_FMT( "The error file {} has been appended.", m_filename ) ); } else { From 35d8707f1bd274bfb2558934381f981dd406ba13 Mon Sep 17 00:00:00 2001 From: arng40 Date: Wed, 24 Dec 2025 16:52:50 +0100 Subject: [PATCH 173/173] missing const --- .../common/logger/ErrorHandling.cpp | 20 +++++------ .../common/logger/ErrorHandling.hpp | 35 +++++++++++-------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/src/coreComponents/common/logger/ErrorHandling.cpp b/src/coreComponents/common/logger/ErrorHandling.cpp index d3f625c8295..28cf51b3c8f 100644 --- a/src/coreComponents/common/logger/ErrorHandling.cpp +++ b/src/coreComponents/common/logger/ErrorHandling.cpp @@ -117,14 +117,14 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addSignalToMsg( int sig, bool toE } } -ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setCodeLocation( std::string_view msgFile, integer msgLine ) +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setCodeLocation( std::string_view msgFile, integer const msgLine ) { m_file = msgFile; m_line = msgLine; return *this; } -ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setType( ErrorLogger::MsgType msgType ) +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::setType( ErrorLogger::MsgType const msgType ) { m_type = msgType; return *this; @@ -141,7 +141,7 @@ void ErrorLogger::ErrorMsg::addContextInfoImpl( ErrorLogger::ErrorContext && ctx m_contextsInfo.emplace_back( std::move( ctxInfo ) ); } -ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addRank( int rank ) +ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addRank( integer const rank ) { m_ranksInfo.emplace( rank ); return *this; @@ -174,7 +174,7 @@ ErrorLogger::ErrorMsg & ErrorLogger::ErrorMsg::addCallStackInfo( std::string_vie return *this; } -ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::addToMsg( std::exception const & e, bool toEnd ) +ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::addToMsg( std::exception const & e, bool const toEnd ) { m_errorContext.m_currentErrorMsg.addToMsg( e, toEnd ); return *this; @@ -185,13 +185,14 @@ ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::addToMsg( std::stri return *this; } -ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::addSignalToMsg( int sig, bool toEnd ) +ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::addSignalToMsg( integer const sig, bool const toEnd ) { m_errorContext.m_currentErrorMsg.addSignalToMsg( sig, toEnd ); return *this; } -ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::setCodeLocation( std::string_view msgFile, integer msgLine ) +ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::setCodeLocation( std::string_view msgFile, + integer const msgLine ) { if( !m_errorContext.m_currentErrorMsg.isCommited() ) { @@ -200,7 +201,7 @@ ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::setCodeLocation( st return *this; } -ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::setType( ErrorLogger::MsgType msgType ) +ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::setType( ErrorLogger::MsgType const msgType ) { if( !m_errorContext.m_currentErrorMsg.isCommited() ) { @@ -218,7 +219,7 @@ ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::setCause( std::stri return *this; } -ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::addRank( int rank ) +ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::addRank( integer const rank ) { if( !m_errorContext.m_currentErrorMsg.isCommited() ) { @@ -236,7 +237,6 @@ ErrorLogger::ErrorMsgBuilder & ErrorLogger::ErrorMsgBuilder::addCallStackInfo( s return *this; } - void ErrorLogger::streamMultilineYamlAttribute( std::string_view msg, std::ofstream & yamlFile, std::string_view indent ) { @@ -281,7 +281,7 @@ void ErrorLogger::createFile() } } -std::string ErrorLogger::toString( ErrorLogger::MsgType type ) +std::string ErrorLogger::toString( ErrorLogger::MsgType const type ) { switch( type ) { diff --git a/src/coreComponents/common/logger/ErrorHandling.hpp b/src/coreComponents/common/logger/ErrorHandling.hpp index 8372efa7de8..cf8fbf2613f 100644 --- a/src/coreComponents/common/logger/ErrorHandling.hpp +++ b/src/coreComponents/common/logger/ErrorHandling.hpp @@ -35,7 +35,6 @@ class ErrorLogger { public: - /** * @enum MsgType * Enum listing the different types of possible errors @@ -165,7 +164,13 @@ class ErrorLogger integer rank, std::string_view msgFile, integer msgLine ) - : m_type( msgType ), m_msg( msgContent ), m_ranksInfo( {rank} ), m_file( msgFile ), m_line( msgLine ), m_commit( false ) {} + : + m_type( msgType ), + m_msg( msgContent ), + m_ranksInfo( {rank} ), + m_file( msgFile ), + m_line( msgLine ), + m_commit( false ) {} /** * @brief Add text to the current error msg @@ -174,7 +179,7 @@ class ErrorLogger * default is false * @return Reference to the current instance for method chaining. */ - ErrorMsg & addToMsg( std::exception const & e, bool toEnd = false ); + ErrorMsg & addToMsg( std::exception const & e, bool const toEnd = false ); /** * @brief Add text to the current error msg @@ -183,7 +188,7 @@ class ErrorLogger * default is false * @return Reference to the current instance for method chaining. */ - ErrorMsg & addToMsg( std::string_view msg, bool toEnd = false ); + ErrorMsg & addToMsg( std::string_view msg, bool const toEnd = false ); /** * @brief Add text to the error msg that occured according to the specified signal. @@ -193,7 +198,7 @@ class ErrorLogger * @param toEnd adds the message to the end if true, at the start otherwise. * @return The instance, for builder pattern. */ - ErrorMsg & addSignalToMsg( int signal, bool toEnd = false ); + ErrorMsg & addSignalToMsg( integer const signal, bool const toEnd = false ); /** * @brief Set the source code location values (file and line where the error is detected) @@ -201,14 +206,14 @@ class ErrorLogger * @param msgLine Line of the source file location to add * @return Reference to the current instance for method chaining. */ - ErrorMsg & setCodeLocation( std::string_view msgFile, integer msgLine ); + ErrorMsg & setCodeLocation( std::string_view msgFile, integer const msgLine ); /** * @brief Set the type of the error * @param msgType The type can be error, warning or exception * @return Reference to the current instance for method chaining. */ - ErrorMsg & setType( MsgType msgType ); + ErrorMsg & setType( MsgType const msgType ); /** * @brief Set the cause of the error @@ -222,7 +227,7 @@ class ErrorLogger * @param rank The value to add * @return Reference to the current instance for method chaining. */ - ErrorMsg & addRank( int rank ); + ErrorMsg & addRank( integer const rank ); /** * @brief Add stack trace information about the error @@ -247,13 +252,13 @@ class ErrorLogger { return m_isValidStackTrace; } /** - * @return whether the error message has been finalized and committed. + * @return Whether the error message has been finalized and committed. */ bool isCommited() const { return m_commit; } /** - * @brief Marks the error message as committed (finalized). + * @brief Marks the error message as committed (finalized). */ void commitErrorMsg() { m_commit = true; } @@ -284,7 +289,7 @@ class ErrorLogger /** * @copydoc ErrorLogger:ErrorMsg::addToMsg( std::string_view msg, bool toEnd = false ) */ - ErrorMsgBuilder & addToMsg( std::string_view msg, bool toEnd = false ); + ErrorMsgBuilder & addToMsg( std::string_view msg, bool const toEnd = false ); /** * @copydoc ErrorLogger:ErrorMsg::addContextInfo( Args && ... args ) */ @@ -297,15 +302,15 @@ class ErrorLogger /** * @copydoc ErrorLogger:ErrorMsg::addSignalToMsg( int sig, bool toEnd = false ); */ - ErrorMsgBuilder & addSignalToMsg( int sig, bool toEnd = false ); + ErrorMsgBuilder & addSignalToMsg( integer const sig, bool toEnd = false ); /** * @copydoc ErrorLogger:ErrorMsg::setCodeLocation( std::string_view msgFile, integer msgLine ) */ - ErrorMsgBuilder & setCodeLocation( std::string_view msgFile, integer msgLine ); + ErrorMsgBuilder & setCodeLocation( std::string_view msgFile, integer const msgLine ); /** * @copydoc ErrorLogger:ErrorMsg::setType( ErrorLogger::MsgType msgType ) */ - ErrorMsgBuilder & setType( ErrorLogger::MsgType msgType ); + ErrorMsgBuilder & setType( ErrorLogger::MsgType const msgType ); /** * @copydoc ErrorLogger:ErrorMsg::setCause( std::string_view cause ) */ @@ -313,7 +318,7 @@ class ErrorLogger /** * @copydoc ErrorLogger:ErrorMsg::addRank( int rank ); */ - ErrorMsgBuilder & addRank( int rank ); + ErrorMsgBuilder & addRank( integer const rank ); /** * @copydoc ErrorLogger:ErrorMsg::addCallStackInfo( std::string_view ossStackTrace ) */