From 6dc63b2da859247d2add77045611fb07beab86cb Mon Sep 17 00:00:00 2001 From: Arne Morten Kvarving Date: Thu, 2 Feb 2023 10:27:48 +0100 Subject: [PATCH 1/5] AquiferAnalytical: add serialization of dynamic state --- opm/simulators/aquifers/AquiferAnalytical.hpp | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/opm/simulators/aquifers/AquiferAnalytical.hpp b/opm/simulators/aquifers/AquiferAnalytical.hpp index 3cc9894fa..2175c7144 100644 --- a/opm/simulators/aquifers/AquiferAnalytical.hpp +++ b/opm/simulators/aquifers/AquiferAnalytical.hpp @@ -22,25 +22,29 @@ #ifndef OPM_AQUIFERANALYTICAL_HEADER_INCLUDED #define OPM_AQUIFERANALYTICAL_HEADER_INCLUDED -#include - #include + #include -#include - -#include - #include #include #include #include +#include +#include + +#include + +#include +#include + #include #include #include #include #include +#include #include #include @@ -183,6 +187,25 @@ public: return this->connections_.size(); } + template + void serializeOp(Serializer& serializer) + { + serializer(pressure_previous_); + serializer(pressure_current_); + serializer(Qai_); + serializer(rhow_); + serializer(W_flux_); + } + + bool operator==(const AquiferAnalytical& rhs) const + { + return this->pressure_previous_ == rhs.pressure_previous_ && + this->pressure_current_ == rhs.pressure_current_ && + this->Qai_ == rhs.Qai_ && + this->rhow_ == rhs.rhow_ && + this->W_flux_ == rhs.W_flux_; + } + protected: virtual void assignRestartData(const data::AquiferData& xaq) = 0; virtual void calculateInflowRate(int idx, const Simulator& simulator) = 0; From 51e5e61c395fe4b636b52ab429c0f720accca50c Mon Sep 17 00:00:00 2001 From: Arne Morten Kvarving Date: Thu, 2 Feb 2023 10:27:48 +0100 Subject: [PATCH 2/5] AquiferCarterTracy: add serialization of dynamic state --- .../aquifers/AquiferCarterTracy.hpp | 35 ++++++++++++++++++ opm/simulators/aquifers/AquiferInterface.hpp | 3 ++ tests/test_RestartSerialization.cpp | 36 +++++++++++++++++++ 3 files changed, 74 insertions(+) diff --git a/opm/simulators/aquifers/AquiferCarterTracy.hpp b/opm/simulators/aquifers/AquiferCarterTracy.hpp index 90c65cefa..1d02b0cb5 100644 --- a/opm/simulators/aquifers/AquiferCarterTracy.hpp +++ b/opm/simulators/aquifers/AquiferCarterTracy.hpp @@ -23,6 +23,8 @@ #include +#include + #include #include @@ -57,6 +59,22 @@ public: , aquct_data_(aquct_data) {} + static AquiferCarterTracy serializationTestObject(const Simulator& ebosSimulator) + { + AquiferCarterTracy result({}, ebosSimulator, {}); + + result.pressure_previous_ = {1.0, 2.0, 3.0}; + result.pressure_current_ = {4.0, 5.0}; + result.Qai_ = {{6.0}}; + result.rhow_ = 7.0; + result.W_flux_ = 8.0; + result.fluxValue_ = 9.0; + result.dimensionless_time_ = 10.0; + result.dimensionless_pressure_ = 11.0; + + return result; + } + void endTimeStep() override { for (const auto& q : this->Qai_) { @@ -100,6 +118,23 @@ public: return data; } + template + void serializeOp(Serializer& serializer) + { + serializer(static_cast(*this)); + serializer(fluxValue_); + serializer(dimensionless_time_); + serializer(dimensionless_pressure_); + } + + bool operator==(const AquiferCarterTracy& rhs) const + { + return static_cast&>(*this) == rhs && + this->fluxValue_ == rhs.fluxValue_ && + this->dimensionless_time_ == rhs.dimensionless_time_ && + this->dimensionless_pressure_ == rhs.dimensionless_pressure_; + } + protected: // Variables constants AquiferCT::AQUCT_data aquct_data_; diff --git a/opm/simulators/aquifers/AquiferInterface.hpp b/opm/simulators/aquifers/AquiferInterface.hpp index f2a5b6b8e..69e000b01 100644 --- a/opm/simulators/aquifers/AquiferInterface.hpp +++ b/opm/simulators/aquifers/AquiferInterface.hpp @@ -22,6 +22,9 @@ #ifndef OPM_AQUIFERINTERFACE_HEADER_INCLUDED #define OPM_AQUIFERINTERFACE_HEADER_INCLUDED +#include +#include + #include namespace Opm diff --git a/tests/test_RestartSerialization.cpp b/tests/test_RestartSerialization.cpp index 2a65803c6..c0972bb0e 100644 --- a/tests/test_RestartSerialization.cpp +++ b/tests/test_RestartSerialization.cpp @@ -134,6 +134,42 @@ BOOST_AUTO_TEST_CASE(EclGenericProblem) BOOST_CHECK_MESSAGE(data_out == data_in, "Deserialized EclGenericProblem differ"); } +namespace { + +struct AquiferFixture { + AquiferFixture() { + using TT = Opm::Properties::TTag::EbosTypeTag; + const char* argv[] = { + "test_RestartSerialization", + "--ecl-deck-file-name=GLIFT1.DATA" + }; + Opm::setupParameters_(2, argv, /*registerParams=*/true); + Opm::EclGenericVanguard::setCommunication(std::make_unique()); + } +}; + +} + +BOOST_GLOBAL_FIXTURE(AquiferFixture); + +BOOST_AUTO_TEST_CASE(AquiferCarterTracy) +{ + using TT = Opm::Properties::TTag::EbosTypeTag; + Opm::EclGenericVanguard::readDeck("GLIFT1.DATA"); + using Simulator = Opm::GetPropType; + Simulator sim; + auto data_out = Opm::AquiferCarterTracy::serializationTestObject(sim); + Opm::Serialization::MemPacker packer; + Opm::Serializer ser(packer); + ser.pack(data_out); + size_t pos1 = ser.position(); + decltype(data_out) data_in({}, sim, {}); + ser.unpack(data_in); + size_t pos2 = ser.position(); + BOOST_CHECK_MESSAGE(pos1 == pos2, "Packed size differ from unpack size for AquiferCarterTracy"); + BOOST_CHECK_MESSAGE(data_out == data_in, "Deserialized AquiferCarterTracy differ"); +} + bool init_unit_test_func() { return true; From 03f6309ff778eea04dac24e37e9a5d0f0afd4f9f Mon Sep 17 00:00:00 2001 From: Arne Morten Kvarving Date: Thu, 2 Feb 2023 10:27:48 +0100 Subject: [PATCH 3/5] AquiferFetkovich: add serialization of dynamic state --- opm/simulators/aquifers/AquiferFetkovich.hpp | 29 ++++++++++++++++++++ tests/test_RestartSerialization.cpp | 18 ++++++++++++ 2 files changed, 47 insertions(+) diff --git a/opm/simulators/aquifers/AquiferFetkovich.hpp b/opm/simulators/aquifers/AquiferFetkovich.hpp index 8bd741218..a21a8c5b7 100644 --- a/opm/simulators/aquifers/AquiferFetkovich.hpp +++ b/opm/simulators/aquifers/AquiferFetkovich.hpp @@ -23,6 +23,8 @@ along with OPM. If not, see . #include +#include + #include #include @@ -58,6 +60,20 @@ public: { } + static AquiferFetkovich serializationTestObject(const Simulator& ebosSimulator) + { + AquiferFetkovich result({}, ebosSimulator, {}); + + result.pressure_previous_ = {1.0, 2.0, 3.0}; + result.pressure_current_ = {4.0, 5.0}; + result.Qai_ = {{6.0}}; + result.rhow_ = 7.0; + result.W_flux_ = 8.0; + result.aquifer_pressure_ = 9.0; + + return result; + } + void endTimeStep() override { for (const auto& q : this->Qai_) { @@ -89,6 +105,19 @@ public: return data; } + template + void serializeOp(Serializer& serializer) + { + serializer(static_cast(*this)); + serializer(aquifer_pressure_); + } + + bool operator==(const AquiferFetkovich& rhs) const + { + return static_cast(*this) == rhs && + this->aquifer_pressure_ == rhs.aquifer_pressure_; + } + protected: // Aquifer Fetkovich Specific Variables Aquifetp::AQUFETP_data aqufetp_data_; diff --git a/tests/test_RestartSerialization.cpp b/tests/test_RestartSerialization.cpp index c0972bb0e..041ec275d 100644 --- a/tests/test_RestartSerialization.cpp +++ b/tests/test_RestartSerialization.cpp @@ -170,6 +170,24 @@ BOOST_AUTO_TEST_CASE(AquiferCarterTracy) BOOST_CHECK_MESSAGE(data_out == data_in, "Deserialized AquiferCarterTracy differ"); } +BOOST_AUTO_TEST_CASE(AquiferFetkovich) +{ + using TT = Opm::Properties::TTag::EbosTypeTag; + Opm::EclGenericVanguard::readDeck("GLIFT1.DATA"); + using Simulator = Opm::GetPropType; + Simulator sim; + auto data_out = Opm::AquiferFetkovich::serializationTestObject(sim); + Opm::Serialization::MemPacker packer; + Opm::Serializer ser(packer); + ser.pack(data_out); + size_t pos1 = ser.position(); + decltype(data_out) data_in({}, sim, {}); + ser.unpack(data_in); + size_t pos2 = ser.position(); + BOOST_CHECK_MESSAGE(pos1 == pos2, "Packed size differ from unpack size for AquiferFetkovich"); + BOOST_CHECK_MESSAGE(data_out == data_in, "Deserialized AquiferFetkovich differ"); +} + bool init_unit_test_func() { return true; From a66fd757155c6e2b9342cd9880b94881bbd4b81c Mon Sep 17 00:00:00 2001 From: Arne Morten Kvarving Date: Thu, 2 Feb 2023 10:27:48 +0100 Subject: [PATCH 4/5] AquiferNumerical: add serialization of dynamic state --- opm/simulators/aquifers/AquiferNumerical.hpp | 35 ++++++++++++++++++-- tests/test_RestartSerialization.cpp | 18 ++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/opm/simulators/aquifers/AquiferNumerical.hpp b/opm/simulators/aquifers/AquiferNumerical.hpp index 4aa71f647..3468b825a 100644 --- a/opm/simulators/aquifers/AquiferNumerical.hpp +++ b/opm/simulators/aquifers/AquiferNumerical.hpp @@ -21,10 +21,13 @@ #ifndef OPM_AQUIFERNUMERICAL_HEADER_INCLUDED #define OPM_AQUIFERNUMERICAL_HEADER_INCLUDED -#include - #include +#include +#include + +#include + #include #include @@ -86,6 +89,17 @@ public: } } + static AquiferNumerical serializationTestObject(const Simulator& ebos_simulator) + { + AquiferNumerical result({}, ebos_simulator); + result.flux_rate_ = 1.0; + result.cumulative_flux_ = 2.0; + result.init_pressure_ = {3.0, 4.0}; + result.pressure_ = 5.0; + + return result; + } + void initFromRestart(const data::Aquifers& aquiferSoln) override { auto xaqPos = aquiferSoln.find(this->aquiferID()); @@ -140,6 +154,23 @@ public: this->cumulative_flux_ = 0.; } + template + void serializeOp(Serializer& serializer) + { + serializer(flux_rate_); + serializer(cumulative_flux_); + serializer(init_pressure_); + serializer(pressure_); + } + + bool operator==(const AquiferNumerical& rhs) const + { + return this->flux_rate_ == rhs.flux_rate_ && + this->cumulative_flux_ == rhs.cumulative_flux_ && + this->init_pressure_ == rhs.init_pressure_ && + this->pressure_ == rhs.pressure_; + } + private: void checkConnectsToReservoir() { diff --git a/tests/test_RestartSerialization.cpp b/tests/test_RestartSerialization.cpp index 041ec275d..1752405d3 100644 --- a/tests/test_RestartSerialization.cpp +++ b/tests/test_RestartSerialization.cpp @@ -188,6 +188,24 @@ BOOST_AUTO_TEST_CASE(AquiferFetkovich) BOOST_CHECK_MESSAGE(data_out == data_in, "Deserialized AquiferFetkovich differ"); } +BOOST_AUTO_TEST_CASE(AquiferNumerical) +{ + using TT = Opm::Properties::TTag::EbosTypeTag; + Opm::EclGenericVanguard::readDeck("GLIFT1.DATA"); + using Simulator = Opm::GetPropType; + Simulator sim; + auto data_out = Opm::AquiferNumerical::serializationTestObject(sim); + Opm::Serialization::MemPacker packer; + Opm::Serializer ser(packer); + ser.pack(data_out); + size_t pos1 = ser.position(); + decltype(data_out) data_in({}, sim); + ser.unpack(data_in); + size_t pos2 = ser.position(); + BOOST_CHECK_MESSAGE(pos1 == pos2, "Packed size differ from unpack size for AquiferFetkovich"); + BOOST_CHECK_MESSAGE(data_out == data_in, "Deserialized AquiferFetkovich differ"); +} + bool init_unit_test_func() { return true; From d5f22dbc99ffe408152d1fb434f5defbf2412820 Mon Sep 17 00:00:00 2001 From: Arne Morten Kvarving Date: Thu, 2 Feb 2023 11:52:08 +0100 Subject: [PATCH 5/5] BlackoilAquiferModel: add serialization of dynamic state --- .../aquifers/BlackoilAquiferModel.hpp | 3 + .../aquifers/BlackoilAquiferModel_impl.hpp | 24 ++++++++ tests/test_RestartSerialization.cpp | 60 +++++++------------ 3 files changed, 50 insertions(+), 37 deletions(-) diff --git a/opm/simulators/aquifers/BlackoilAquiferModel.hpp b/opm/simulators/aquifers/BlackoilAquiferModel.hpp index 507cd9477..bca18267e 100644 --- a/opm/simulators/aquifers/BlackoilAquiferModel.hpp +++ b/opm/simulators/aquifers/BlackoilAquiferModel.hpp @@ -112,6 +112,9 @@ public: template void deserialize(Restarter& res); + template + void serializeOp(Serializer& serializer); + protected: // --------- Types --------- using ElementContext = GetPropType; diff --git a/opm/simulators/aquifers/BlackoilAquiferModel_impl.hpp b/opm/simulators/aquifers/BlackoilAquiferModel_impl.hpp index b83813246..31b7fe0e8 100644 --- a/opm/simulators/aquifers/BlackoilAquiferModel_impl.hpp +++ b/opm/simulators/aquifers/BlackoilAquiferModel_impl.hpp @@ -18,6 +18,9 @@ along with OPM. If not, see . */ +#include +#include + namespace Opm { @@ -184,4 +187,25 @@ data::Aquifers BlackoilAquiferModel::aquiferData() const return data; } +template +template +void BlackoilAquiferModel:: +serializeOp(Serializer& serializer) +{ + for (auto& aiPtr : aquifers) { + auto* ct = dynamic_cast*>(aiPtr.get()); + auto* fetp = dynamic_cast*>(aiPtr.get()); + auto* num = dynamic_cast*>(aiPtr.get()); + if (ct) { + serializer(*ct); + } else if (fetp) { + serializer(*fetp); + } else if (num) { + serializer(*num); + } else { + OPM_THROW(std::logic_error, "Error serializing BlackoilAquiferModel: unknown aquifer type"); + } + } +} + } // namespace Opm diff --git a/tests/test_RestartSerialization.cpp b/tests/test_RestartSerialization.cpp index 1752405d3..5385938bf 100644 --- a/tests/test_RestartSerialization.cpp +++ b/tests/test_RestartSerialization.cpp @@ -152,41 +152,27 @@ struct AquiferFixture { BOOST_GLOBAL_FIXTURE(AquiferFixture); -BOOST_AUTO_TEST_CASE(AquiferCarterTracy) -{ - using TT = Opm::Properties::TTag::EbosTypeTag; - Opm::EclGenericVanguard::readDeck("GLIFT1.DATA"); - using Simulator = Opm::GetPropType; - Simulator sim; - auto data_out = Opm::AquiferCarterTracy::serializationTestObject(sim); - Opm::Serialization::MemPacker packer; - Opm::Serializer ser(packer); - ser.pack(data_out); - size_t pos1 = ser.position(); - decltype(data_out) data_in({}, sim, {}); - ser.unpack(data_in); - size_t pos2 = ser.position(); - BOOST_CHECK_MESSAGE(pos1 == pos2, "Packed size differ from unpack size for AquiferCarterTracy"); - BOOST_CHECK_MESSAGE(data_out == data_in, "Deserialized AquiferCarterTracy differ"); +#define TEST_FOR_AQUIFER(TYPE) \ +BOOST_AUTO_TEST_CASE(TYPE) \ +{ \ + using TT = Opm::Properties::TTag::EbosTypeTag; \ + Opm::EclGenericVanguard::readDeck("GLIFT1.DATA"); \ + using Simulator = Opm::GetPropType; \ + Simulator sim; \ + auto data_out = Opm::TYPE::serializationTestObject(sim); \ + Opm::Serialization::MemPacker packer; \ + Opm::Serializer ser(packer); \ + ser.pack(data_out); \ + const size_t pos1 = ser.position(); \ + decltype(data_out) data_in({}, sim, {}); \ + ser.unpack(data_in); \ + const size_t pos2 = ser.position(); \ + BOOST_CHECK_MESSAGE(pos1 == pos2, "Packed size differ from unpack size for " #TYPE); \ + BOOST_CHECK_MESSAGE(data_out == data_in, "Deserialized " #TYPE " differ"); \ } -BOOST_AUTO_TEST_CASE(AquiferFetkovich) -{ - using TT = Opm::Properties::TTag::EbosTypeTag; - Opm::EclGenericVanguard::readDeck("GLIFT1.DATA"); - using Simulator = Opm::GetPropType; - Simulator sim; - auto data_out = Opm::AquiferFetkovich::serializationTestObject(sim); - Opm::Serialization::MemPacker packer; - Opm::Serializer ser(packer); - ser.pack(data_out); - size_t pos1 = ser.position(); - decltype(data_out) data_in({}, sim, {}); - ser.unpack(data_in); - size_t pos2 = ser.position(); - BOOST_CHECK_MESSAGE(pos1 == pos2, "Packed size differ from unpack size for AquiferFetkovich"); - BOOST_CHECK_MESSAGE(data_out == data_in, "Deserialized AquiferFetkovich differ"); -} +TEST_FOR_AQUIFER(AquiferCarterTracy) +TEST_FOR_AQUIFER(AquiferFetkovich) BOOST_AUTO_TEST_CASE(AquiferNumerical) { @@ -198,12 +184,12 @@ BOOST_AUTO_TEST_CASE(AquiferNumerical) Opm::Serialization::MemPacker packer; Opm::Serializer ser(packer); ser.pack(data_out); - size_t pos1 = ser.position(); + const size_t pos1 = ser.position(); decltype(data_out) data_in({}, sim); ser.unpack(data_in); - size_t pos2 = ser.position(); - BOOST_CHECK_MESSAGE(pos1 == pos2, "Packed size differ from unpack size for AquiferFetkovich"); - BOOST_CHECK_MESSAGE(data_out == data_in, "Deserialized AquiferFetkovich differ"); + const size_t pos2 = ser.position(); + BOOST_CHECK_MESSAGE(pos1 == pos2, "Packed size differ from unpack size for AquiferNumerical"); + BOOST_CHECK_MESSAGE(data_out == data_in, "Deserialized AquiferNumerical differ"); } bool init_unit_test_func()