From 305512cc21847c9ff895379366015de748a0e4ce Mon Sep 17 00:00:00 2001 From: osae Date: Tue, 18 Feb 2014 14:50:29 +0100 Subject: [PATCH] Hysteresis. SimulatorFullyImplicitBlackoil reports saturation values at each completed time-step, allowing detection of hysteris behavior. --- opm/autodiff/BlackoilPropsAdFromDeck.cpp | 9 +++++++++ opm/autodiff/BlackoilPropsAdFromDeck.hpp | 5 +++++ opm/autodiff/BlackoilPropsAdInterface.hpp | 6 ++++++ opm/autodiff/SimulatorFullyImplicitBlackoil.cpp | 11 +++++++---- opm/autodiff/SimulatorFullyImplicitBlackoil.hpp | 2 +- 5 files changed, 28 insertions(+), 5 deletions(-) diff --git a/opm/autodiff/BlackoilPropsAdFromDeck.cpp b/opm/autodiff/BlackoilPropsAdFromDeck.cpp index d4b17c1bf..5426c22f1 100644 --- a/opm/autodiff/BlackoilPropsAdFromDeck.cpp +++ b/opm/autodiff/BlackoilPropsAdFromDeck.cpp @@ -905,6 +905,15 @@ namespace Opm } return adbCapPressures; } + + /// Saturation update for hysteresis behavior. + /// \param[in] cells Array of n cell indices to be associated with the saturation values. + void BlackoilPropsAdFromDeck::updateSatHyst(const std::vector& saturation, + const std::vector& cells) + { + const int n = cells.size(); + satprops_->updateSatHyst(n, cells.data(), saturation.data()); + } } // namespace Opm diff --git a/opm/autodiff/BlackoilPropsAdFromDeck.hpp b/opm/autodiff/BlackoilPropsAdFromDeck.hpp index 81dc0d601..34177d2f6 100644 --- a/opm/autodiff/BlackoilPropsAdFromDeck.hpp +++ b/opm/autodiff/BlackoilPropsAdFromDeck.hpp @@ -314,6 +314,11 @@ namespace Opm const ADB& so, const ADB& sg, const Cells& cells) const; + + /// Saturation update for hysteresis behavior. + /// \param[in] cells Array of n cell indices to be associated with the saturation values. + void updateSatHyst(const std::vector& saturation, + const std::vector& cells); private: RockFromDeck rock_; diff --git a/opm/autodiff/BlackoilPropsAdInterface.hpp b/opm/autodiff/BlackoilPropsAdInterface.hpp index e9ad205d2..74845ba47 100644 --- a/opm/autodiff/BlackoilPropsAdInterface.hpp +++ b/opm/autodiff/BlackoilPropsAdInterface.hpp @@ -315,6 +315,12 @@ namespace Opm const ADB& so, const ADB& sg, const Cells& cells) const = 0; + + /// Saturation update for hysteresis behavior. + /// \param[in] cells Array of n cell indices to be associated with the saturation values. + virtual + void updateSatHyst(const std::vector& saturation, + const std::vector& cells) {assert(false); } // Please implement me ... }; } // namespace Opm diff --git a/opm/autodiff/SimulatorFullyImplicitBlackoil.cpp b/opm/autodiff/SimulatorFullyImplicitBlackoil.cpp index bb792173b..045fe11d2 100644 --- a/opm/autodiff/SimulatorFullyImplicitBlackoil.cpp +++ b/opm/autodiff/SimulatorFullyImplicitBlackoil.cpp @@ -68,7 +68,7 @@ namespace Opm public: Impl(const parameter::ParameterGroup& param, const UnstructuredGrid& grid, - const BlackoilPropsAdInterface& props, + BlackoilPropsAdInterface& props, const RockCompressibility* rock_comp_props, WellsManager& wells_manager, LinearSolverInterface& linsolver, @@ -92,7 +92,7 @@ namespace Opm int max_well_control_iterations_; // Observed objects. const UnstructuredGrid& grid_; - const BlackoilPropsAdInterface& props_; + BlackoilPropsAdInterface& props_; const RockCompressibility* rock_comp_props_; WellsManager& wells_manager_; const Wells* wells_; @@ -110,7 +110,7 @@ namespace Opm SimulatorFullyImplicitBlackoil::SimulatorFullyImplicitBlackoil(const parameter::ParameterGroup& param, const UnstructuredGrid& grid, - const BlackoilPropsAdInterface& props, + BlackoilPropsAdInterface& props, const RockCompressibility* rock_comp_props, WellsManager& wells_manager, LinearSolverInterface& linsolver, @@ -258,7 +258,7 @@ namespace Opm // \TODO: Treat bcs. SimulatorFullyImplicitBlackoil::Impl::Impl(const parameter::ParameterGroup& param, const UnstructuredGrid& grid, - const BlackoilPropsAdInterface& props, + BlackoilPropsAdInterface& props, const RockCompressibility* rock_comp_props, WellsManager& wells_manager, LinearSolverInterface& linsolver, @@ -408,6 +408,9 @@ namespace Opm computePorevolume(grid_, props_.porosity(), *rock_comp_props_, state.pressure(), porevol); } + // Hysteresis + props_.updateSatHyst(state.saturation(), allcells_); + sreport.total_time = step_timer.secsSinceStart(); if (output_) { sreport.reportParam(tstep_os); diff --git a/opm/autodiff/SimulatorFullyImplicitBlackoil.hpp b/opm/autodiff/SimulatorFullyImplicitBlackoil.hpp index f7c0a1b92..2bb62de41 100644 --- a/opm/autodiff/SimulatorFullyImplicitBlackoil.hpp +++ b/opm/autodiff/SimulatorFullyImplicitBlackoil.hpp @@ -68,7 +68,7 @@ namespace Opm /// \param[in] gravity if non-null, gravity vector SimulatorFullyImplicitBlackoil(const parameter::ParameterGroup& param, const UnstructuredGrid& grid, - const BlackoilPropsAdInterface& props, + BlackoilPropsAdInterface& props, const RockCompressibility* rock_comp_props, WellsManager& wells_manager, LinearSolverInterface& linsolver,