From 00ca6dc4923c35b3a53aaf1f74b4f290933d17d8 Mon Sep 17 00:00:00 2001 From: Kai Bao Date: Fri, 8 Jan 2021 15:27:43 +0100 Subject: [PATCH] putting all the pressure assmeble function to one function assemblePressureEq for MSW --- opm/simulators/wells/MultisegmentWell.hpp | 9 ++-- .../wells/MultisegmentWell_impl.hpp | 43 ++++++++++++------- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/opm/simulators/wells/MultisegmentWell.hpp b/opm/simulators/wells/MultisegmentWell.hpp index 9fa4d5d3f..e20965d4b 100644 --- a/opm/simulators/wells/MultisegmentWell.hpp +++ b/opm/simulators/wells/MultisegmentWell.hpp @@ -422,7 +422,10 @@ namespace Opm const Well::ProductionControls& prod_controls, Opm::DeferredLogger& deferred_logger); - void assemblePressureEq(const int seg, WellState& well_state) const; + void assemblePressureEq(const int seg, const UnitSystem& unit_system, + WellState& well_state, DeferredLogger& deferred_logger) const; + + void assembleDefaultPressureEq(const int seg, WellState& well_state) const; // hytrostatic pressure loss EvalWell getHydroPressureLoss(const int seg) const; @@ -511,8 +514,8 @@ namespace Opm EvalWell pressureDropValve(const int seg) const; // assemble pressure equation for ICD segments - void assembleICDPressureEq(const int seg, WellState& well_state, - const UnitSystem& unit_system, DeferredLogger& deferred_logger) const; + void assembleICDPressureEq(const int seg, const UnitSystem& unit_system, + WellState& well_state, DeferredLogger& deferred_logger) const; // check whether the well is operable under BHP limit with current reservoir condition virtual void checkOperabilityUnderBHPLimitProducer(const WellState& well_state, const Simulator& ebos_simulator, Opm::DeferredLogger& deferred_logger) override; diff --git a/opm/simulators/wells/MultisegmentWell_impl.hpp b/opm/simulators/wells/MultisegmentWell_impl.hpp index b9f9205e7..b634d4056 100644 --- a/opm/simulators/wells/MultisegmentWell_impl.hpp +++ b/opm/simulators/wells/MultisegmentWell_impl.hpp @@ -2213,7 +2213,7 @@ namespace Opm template void MultisegmentWell:: - assemblePressureEq(const int seg, WellState& well_state) const + assembleDefaultPressureEq(const int seg, WellState& well_state) const { assert(seg != 0); // not top segment @@ -2996,18 +2996,8 @@ namespace Opm const Opm::Schedule& schedule = ebosSimulator.vanguard().schedule(); assembleControlEq(well_state, schedule, summaryState, inj_controls, prod_controls, deferred_logger); } else { - // TODO: maybe the following should go to the function assemblePressureEq() - switch(segmentSet()[seg].segmentType()) { - case Segment::SegmentType::SICD : - case Segment::SegmentType::AICD : - case Segment::SegmentType::VALVE : { - const UnitSystem& unit_system = ebosSimulator.vanguard().eclState().getDeckUnitSystem(); - assembleICDPressureEq(seg, well_state, unit_system, deferred_logger); - break; - } - default : - assemblePressureEq(seg, well_state); - } + const UnitSystem& unit_system = ebosSimulator.vanguard().eclState().getDeckUnitSystem(); + assemblePressureEq(seg, unit_system, well_state, deferred_logger); } well_state.segPressDrop()[seg] = well_state.segPressDropHydroStatic()[seg] + @@ -3018,6 +3008,27 @@ namespace Opm + + template + void + MultisegmentWell:: + assemblePressureEq(const int seg, const UnitSystem& unit_system, + WellState& well_state, DeferredLogger& deferred_logger) const + { + switch(segmentSet()[seg].segmentType()) { + case Segment::SegmentType::SICD : + case Segment::SegmentType::AICD : + case Segment::SegmentType::VALVE : { + assembleICDPressureEq(seg, unit_system, well_state,deferred_logger); + break; + } + default : + assembleDefaultPressureEq(seg, well_state); + } + } + + + template bool MultisegmentWell:: @@ -3511,8 +3522,8 @@ namespace Opm template void MultisegmentWell:: - assembleICDPressureEq(const int seg, WellState& well_state, - const UnitSystem& unit_system, DeferredLogger& deferred_logger) const + assembleICDPressureEq(const int seg, const UnitSystem& unit_system, + WellState& well_state, DeferredLogger& deferred_logger) const { // TODO: upwinding needs to be taken care of // top segment can not be a spiral ICD device @@ -3531,8 +3542,10 @@ namespace Opm break; case Segment::SegmentType::AICD : icd_pressure_drop = pressureDropAutoICD(seg, unit_system); + break; case Segment::SegmentType::VALVE : icd_pressure_drop = pressureDropValve(seg); + break; default: { OPM_DEFLOG_THROW(std::runtime_error, "Segment " + std::to_string(segmentSet()[seg].segmentNumber()) + " for well " + name() + " is not of ICD type", deferred_logger);