From 137741e5720a8aca916b6bcabf2ff27af571702c Mon Sep 17 00:00:00 2001 From: Arne Morten Kvarving Date: Sat, 17 Feb 2024 18:13:46 +0100 Subject: [PATCH] WellFilterCake: template Scalar type --- .../wells/BlackoilWellModelGeneric.hpp | 2 +- opm/simulators/wells/WellFilterCake.cpp | 36 ++++++++++--------- opm/simulators/wells/WellFilterCake.hpp | 13 +++---- 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/opm/simulators/wells/BlackoilWellModelGeneric.hpp b/opm/simulators/wells/BlackoilWellModelGeneric.hpp index 94958e044..a9a4e7cf0 100644 --- a/opm/simulators/wells/BlackoilWellModelGeneric.hpp +++ b/opm/simulators/wells/BlackoilWellModelGeneric.hpp @@ -567,7 +567,7 @@ protected: std::unordered_map> prev_inj_multipliers_; // Handling for filter cake injection multipliers - std::unordered_map filter_cake_; + std::unordered_map> filter_cake_; /* The various wellState members should be accessed and modified diff --git a/opm/simulators/wells/WellFilterCake.cpp b/opm/simulators/wells/WellFilterCake.cpp index fdc63c081..c1d8dff9a 100644 --- a/opm/simulators/wells/WellFilterCake.cpp +++ b/opm/simulators/wells/WellFilterCake.cpp @@ -34,12 +34,13 @@ namespace Opm { -void WellFilterCake:: +template +void WellFilterCake:: updateFiltrationParticleVolume(const WellInterfaceGeneric& well, const double dt, - const double conc, + const Scalar conc, const std::size_t water_index, - WellState& well_state) + WellState& well_state) { if (!well.isInjector()) { return; @@ -67,17 +68,18 @@ updateFiltrationParticleVolume(const WellInterfaceGeneric& well, const std::size_t np = well_state.numPhases(); for (int perf = 0; perf < well.numPerfs(); ++perf) { // not considering the production water - const double water_rates = std::max(0., connection_rates[perf * np + water_index]); - const double filtrate_rate = water_rates * conc; + const Scalar water_rates = std::max(0., connection_rates[perf * np + water_index]); + const Scalar filtrate_rate = water_rates * conc; filtration_particle_volume_[perf] += filtrate_rate * dt; ws.perf_data.filtrate_data.rates[perf] = filtrate_rate; ws.perf_data.filtrate_data.total[perf] = filtration_particle_volume_[perf]; } } -void WellFilterCake:: +template +void WellFilterCake:: updateInjFCMult(const WellInterfaceGeneric& well, - WellState& well_state, + WellState& well_state, DeferredLogger& deferred_logger) { if (inj_fc_multiplier_.empty()) { @@ -92,14 +94,14 @@ updateInjFCMult(const WellInterfaceGeneric& well, const auto& connection = connections[perf_ecl_index]; if (well.isInjector() && connection.filterCakeActive()) { const auto& filter_cake = connection.getFilterCake(); - const double area = connection.getFilterCakeArea(); - const double poro = filter_cake.poro; - const double perm = filter_cake.perm; - const double rw = connection.getFilterCakeRadius(); - const double K = connection.Kh() / connection.connectionLength(); - const double factor = filter_cake.sf_multiplier; + const Scalar area = connection.getFilterCakeArea(); + const Scalar poro = filter_cake.poro; + const Scalar perm = filter_cake.perm; + const Scalar rw = connection.getFilterCakeRadius(); + const Scalar K = connection.Kh() / connection.connectionLength(); + const Scalar factor = filter_cake.sf_multiplier; // the thickness of the filtration cake - const double thickness = filtration_particle_volume_[perf] / (area * (1. - poro)); + const Scalar thickness = filtration_particle_volume_[perf] / (area * (1. - poro)); auto& filtrate_data = perf_data.filtrate_data; filtrate_data.thickness[perf] = thickness; filtrate_data.poro[perf] = poro; @@ -107,14 +109,14 @@ updateInjFCMult(const WellInterfaceGeneric& well, filtrate_data.radius[perf] = connection.getFilterCakeRadius(); filtrate_data.area_of_flow[perf] = connection.getFilterCakeArea(); - double skin_factor = 0.; + Scalar skin_factor = 0.; switch (filter_cake.geometry) { case FilterCake::FilterCakeGeometry::LINEAR: { skin_factor = thickness / rw * K / perm * factor; break; } case FilterCake::FilterCakeGeometry::RADIAL: { - const double rc = std::sqrt(rw * rw + 2. * rw * thickness); + const Scalar rc = std::sqrt(rw * rw + 2. * rw * thickness); skin_factor = K / perm * std::log(rc / rw) * factor; break; } @@ -137,4 +139,6 @@ updateInjFCMult(const WellInterfaceGeneric& well, } } +template class WellFilterCake; + } // namespace Opm diff --git a/opm/simulators/wells/WellFilterCake.hpp b/opm/simulators/wells/WellFilterCake.hpp index 16df86bef..863fc7b7f 100644 --- a/opm/simulators/wells/WellFilterCake.hpp +++ b/opm/simulators/wells/WellFilterCake.hpp @@ -30,30 +30,31 @@ class WellInterfaceGeneric; template class WellState; //! \brief Class for well calculations related to filter cakes. +template class WellFilterCake { public: //! \brief Update the water injection volume. //! \details Used for calculation related to cake filtration due to injection activity. void updateFiltrationParticleVolume(const WellInterfaceGeneric& well, const double dt, - const double conc, + const Scalar conc, const std::size_t water_index, - WellState& well_state); + WellState& well_state); //! \brief Update the multiplier for well transmissbility due to cake filtration. void updateInjFCMult(const WellInterfaceGeneric& well, - WellState& well_state, + WellState& well_state, DeferredLogger& deferred_logger); //! \brief Returns a const-ref to multipliers. - const std::vector& multipliers() const + const std::vector& multipliers() const { return inj_fc_multiplier_; } private: - std::vector filtration_particle_volume_; //! inj_fc_multiplier_; //!< Multiplier due to injection filtration cake + std::vector filtration_particle_volume_; //! inj_fc_multiplier_; //!< Multiplier due to injection filtration cake }; }