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; 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/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/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/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/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 2a65803c6..5385938bf 100644 --- a/tests/test_RestartSerialization.cpp +++ b/tests/test_RestartSerialization.cpp @@ -134,6 +134,64 @@ 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); + +#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"); \ +} + +TEST_FOR_AQUIFER(AquiferCarterTracy) +TEST_FOR_AQUIFER(AquiferFetkovich) + +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); + 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 AquiferNumerical"); + BOOST_CHECK_MESSAGE(data_out == data_in, "Deserialized AquiferNumerical differ"); +} + bool init_unit_test_func() { return true;