diff --git a/opm/simulators/wells/BlackoilWellModelGeneric.cpp b/opm/simulators/wells/BlackoilWellModelGeneric.cpp index 3caeaa7d6..e5873ec3d 100644 --- a/opm/simulators/wells/BlackoilWellModelGeneric.cpp +++ b/opm/simulators/wells/BlackoilWellModelGeneric.cpp @@ -216,7 +216,7 @@ loadRestartData(const data::Wells& rst_wells, // \Note: eventually we need to handle the situations that some segments are shut assert(0u + segment_set.size() == rst_segments.size()); - auto& segments = well_state.segments(well_index); + auto& segments = ws.segments; auto& segment_pressure = segments.pressure; auto& segment_rates = segments.rates; for (const auto& rst_segment : rst_segments) { diff --git a/opm/simulators/wells/MultisegmentWellEval.cpp b/opm/simulators/wells/MultisegmentWellEval.cpp index 5529fbe42..bec7c2316 100644 --- a/opm/simulators/wells/MultisegmentWellEval.cpp +++ b/opm/simulators/wells/MultisegmentWellEval.cpp @@ -444,7 +444,8 @@ updatePrimaryVariables(const WellState& well_state) const const Well& well = baseif_.wellEcl(); // the index of the top segment in the WellState - const auto& segments = well_state.segments(baseif_.indexOfWell()); + const auto& ws = well_state.well(baseif_.indexOfWell()); + const auto& segments = ws.segments; const auto& segment_rates = segments.rates; const auto& segment_pressure = segments.pressure; const PhaseUsage& pu = baseif_.phaseUsage(); @@ -1537,7 +1538,8 @@ handleAccelerationPressureLoss(const int seg, const double sign = mass_rate < 0. ? 1.0 : - 1.0; accelerationPressureLoss *= sign; - well_state.segments(baseif_.indexOfWell()).pressure_drop_accel[seg] = accelerationPressureLoss.value(); + auto& segments = well_state.well(baseif_.indexOfWell()).segments; + segments.pressure_drop_accel[seg] = accelerationPressureLoss.value(); resWell_[seg][SPres] -= accelerationPressureLoss.value(); duneD_[seg][seg][SPres][SPres] -= accelerationPressureLoss.derivative(SPres + Indices::numEq); @@ -1566,7 +1568,8 @@ assembleDefaultPressureEq(const int seg, // TODO: we might be able to add member variables to store these values, then we update well state // after converged const auto hydro_pressure_drop = getHydroPressureLoss(seg); - auto& segments = well_state.segments(baseif_.indexOfWell()); + auto& ws = well_state.well(baseif_.indexOfWell()); + auto& segments = ws.segments; segments.pressure_drop_hydrostatic[seg] = hydro_pressure_drop.value(); pressure_equation -= hydro_pressure_drop; @@ -1616,8 +1619,8 @@ updateWellStateFromPrimaryVariables(WellState& well_state, assert( FluidSystem::phaseIsActive(FluidSystem::oilPhaseIdx) ); const int oil_pos = pu.phase_pos[Oil]; - auto& well = well_state.well(baseif_.indexOfWell()); - auto& segments = well_state.segments(baseif_.indexOfWell()); + auto& ws = well_state.well(baseif_.indexOfWell()); + auto& segments = ws.segments; auto& segment_rates = segments.rates; auto& segment_pressure = segments.pressure; for (int seg = 0; seg < this->numberOfSegments(); ++seg) { @@ -1661,7 +1664,7 @@ updateWellStateFromPrimaryVariables(WellState& well_state, // update the segment pressure segment_pressure[seg] = primary_variables_[seg][SPres]; if (seg == 0) { // top segment - well.bhp = segment_pressure[seg]; + ws.bhp = segment_pressure[seg]; } } updateThp(well_state, rho, deferred_logger); @@ -1702,7 +1705,8 @@ assembleICDPressureEq(const int seg, } } pressure_equation = pressure_equation - icd_pressure_drop; - well_state.segments(baseif_.indexOfWell()).pressure_drop_friction[seg] = icd_pressure_drop.value(); + auto& ws = well_state.well(baseif_.indexOfWell()); + ws.segments.pressure_drop_friction[seg] = icd_pressure_drop.value(); const int seg_upwind = upwinding_segments_[seg]; resWell_[seg][SPres] = pressure_equation.value(); diff --git a/opm/simulators/wells/MultisegmentWellGeneric.cpp b/opm/simulators/wells/MultisegmentWellGeneric.cpp index 6ccb36638..9d0f1e164 100644 --- a/opm/simulators/wells/MultisegmentWellGeneric.cpp +++ b/opm/simulators/wells/MultisegmentWellGeneric.cpp @@ -100,7 +100,8 @@ void MultisegmentWellGeneric:: scaleSegmentRatesWithWellRates(WellState& well_state) const { - auto& segments = well_state.segments(baseif_.indexOfWell()); + auto& ws = well_state.well(baseif_.indexOfWell()); + auto& segments = ws.segments; auto& segment_rates = segments.rates; for (int phase = 0; phase < baseif_.numPhases(); ++phase) { const double unscaled_top_seg_rate = segment_rates[phase]; @@ -136,10 +137,9 @@ void MultisegmentWellGeneric:: scaleSegmentPressuresWithBhp(WellState& well_state) const { - auto& well = well_state.well(baseif_.indexOfWell()); - auto& segments = well_state.segments(baseif_.indexOfWell()); - const auto bhp = well.bhp; - segments.scale_pressure(bhp); + auto& ws = well_state.well(baseif_.indexOfWell()); + auto& segments = ws.segments; + segments.scale_pressure(ws.bhp); } template diff --git a/opm/simulators/wells/SingleWellState.hpp b/opm/simulators/wells/SingleWellState.hpp index abc1cb9ac..f8c093711 100644 --- a/opm/simulators/wells/SingleWellState.hpp +++ b/opm/simulators/wells/SingleWellState.hpp @@ -22,6 +22,7 @@ #include +#include #include #include @@ -35,11 +36,12 @@ public: bool producer; double bhp{0}; double thp{0}; - double temperature{}; + double temperature{0}; double dissolved_gas_rate{0}; double vaporized_oil_rate{0}; std::vector well_potentials; std::vector productivity_index; + SegmentState segments; Events events; Well::InjectorCMode injection_cmode{Well::InjectorCMode::CMODE_UNDEFINED}; Well::ProducerCMode production_cmode{Well::ProducerCMode::CMODE_UNDEFINED}; diff --git a/opm/simulators/wells/WellContainer.hpp b/opm/simulators/wells/WellContainer.hpp index 2ac62f50b..6a7945481 100644 --- a/opm/simulators/wells/WellContainer.hpp +++ b/opm/simulators/wells/WellContainer.hpp @@ -83,25 +83,6 @@ public: return (index_map.count(name) != 0); } - - void update(const std::string& name, T&& value) { - auto index = this->index_map.at(name); - this->m_data[index] = std::forward(value); - } - - void update(const std::string& name, const T& value) { - auto index = this->index_map.at(name); - this->m_data[index] = value; - } - - void update(std::size_t index, T&& value) { - this->m_data.at(index) = std::forward(value); - } - - void update(std::size_t index, const T& value) { - this->m_data.at(index) = value; - } - /* Will copy the value from other to this - for all wells which are present in both containers. diff --git a/opm/simulators/wells/WellState.cpp b/opm/simulators/wells/WellState.cpp index 1ea3cd821..467f1932b 100644 --- a/opm/simulators/wells/WellState.cpp +++ b/opm/simulators/wells/WellState.cpp @@ -43,7 +43,6 @@ void WellState::base_init(const std::vector& cellPressures, this->perfdata.clear(); this->parallel_well_info_.clear(); this->wellrates_.clear(); - this->segment_state.clear(); this->wells_.clear(); { // const int nw = wells->number_of_wells; @@ -92,7 +91,6 @@ void WellState::initSingleWell(const std::vector& cellPressures, this->parallel_well_info_.add(well.name(), well_info); this->wellrates_.add(well.name(), std::vector(np, 0)); const int num_perf_this_well = well_info->communication().sum(well_perf_data.size()); - this->segment_state.add(well.name(), SegmentState{}); this->perfdata.add(well.name(), PerfData{static_cast(num_perf_this_well), well.isInjector(), this->phase_usage_}); if ( num_perf_this_well == 0 ) @@ -325,7 +323,6 @@ void WellState::init(const std::vector& cellPressures, if (well.getStatus() == Well::Status::SHUT) { continue; } - const auto& wname = well.name(); auto& new_well = this->well(w); auto it = prevState->wellMap().find(well.name()); if (it != end) @@ -651,7 +648,7 @@ void WellState::initWellStateMSWell(const std::vector& wells_ecl, // assuming the order of the perforations in well_ecl is the same with Wells const WellConnections& completion_set = well_ecl.getConnections(); // number of segment for this single well - this->segment_state.update(w, SegmentState{np, segment_set}); + ws.segments = SegmentState{np, segment_set}; const int well_nseg = segment_set.size(); int n_activeperf = 0; @@ -702,8 +699,7 @@ void WellState::initWellStateMSWell(const std::vector& wells_ecl, const auto& perf_rates = perf_data.phase_rates; std::vector perforation_rates(perf_rates.begin(), perf_rates.end()); - auto& segments = this->segments(w); - calculateSegmentRates(segment_inlets, segment_perforations, perforation_rates, np, 0 /* top segment */, segments.rates); + calculateSegmentRates(segment_inlets, segment_perforations, perforation_rates, np, 0 /* top segment */, ws.segments.rates); } // for the segment pressure, the segment pressure is the same with the first perforation belongs to the segment // if there is no perforation associated with this segment, it uses the pressure from the outlet segment @@ -712,7 +708,7 @@ void WellState::initWellStateMSWell(const std::vector& wells_ecl, // improved during the solveWellEq process { // top segment is always the first one, and its pressure is the well bhp - auto& segment_pressure = this->segments(w).pressure; + auto& segment_pressure = ws.segments.pressure; segment_pressure[0] = ws.bhp; const auto& perf_press = perf_data.pressure; for (int seg = 1; seg < well_nseg; ++seg) { @@ -741,7 +737,8 @@ void WellState::initWellStateMSWell(const std::vector& wells_ecl, continue; const auto& wname = well.name(); - if (prev_well_state->segment_state.has(wname)) { + if (prev_well_state->has(wname)) { + auto& ws = this->well(w); const auto& prev_ws = prev_well_state->well(wname); if (prev_ws.status == Well::Status::SHUT) { continue; @@ -750,7 +747,7 @@ void WellState::initWellStateMSWell(const std::vector& wells_ecl, // TODO: the well with same name can change a lot, like they might not have same number of segments // we need to handle that later. // for now, we just copy them. - this->segment_state.copy_welldata(prev_well_state->segment_state, wname); + ws.segments = prev_ws.segments; } } } @@ -917,7 +914,7 @@ WellState::reportSegmentResults(const PhaseUsage& pu, const int seg_ix, const int seg_no) const { - const auto& segments = this->segments(well_id); + const auto& segments = this->well(well_id).segments; if (segments.empty()) return {}; @@ -983,14 +980,14 @@ int WellState::wellIndex(const std::string& wellName) const int WellState::numSegments(const int well_id) const { - const auto& segments = this->segments(well_id); - return segments.size(); + const auto& ws = this->well(well_id); + return ws.segments.size(); } int WellState::segmentNumber(const int well_id, const int seg_id) const { - const auto& segments = this->segment_state[well_id]; - return segments.segment_number()[seg_id]; + const auto& ws = this->well(well_id); + return ws.segments.segment_number()[seg_id]; } void WellState::updateWellsDefaultALQ( const std::vector& wells_ecl ) diff --git a/opm/simulators/wells/WellState.hpp b/opm/simulators/wells/WellState.hpp index 436b19a08..131312420 100644 --- a/opm/simulators/wells/WellState.hpp +++ b/opm/simulators/wells/WellState.hpp @@ -162,22 +162,6 @@ public: } - const SegmentState& segments(const std::size_t well_index) const { - return this->segment_state[well_index]; - } - - SegmentState& segments(const std::size_t well_index) { - return this->segment_state[well_index]; - } - - const SegmentState& segments(const std::string& wname) const { - return this->segment_state[wname]; - } - - SegmentState& segments(const std::string& wname) { - return this->segment_state[wname]; - } - template void communicateGroupRates(const Comm& comm); @@ -313,7 +297,9 @@ public: return this->wells_[well_name]; } - + bool has(const std::string& well_name) const { + return this->wells_.has(well_name); + } private: WellMapType wellMap_; @@ -339,8 +325,6 @@ private: // or voidage phase rates WellContainer> well_reservoir_rates_; - WellContainer segment_state; - data::Segment reportSegmentResults(const PhaseUsage& pu, const int well_id, diff --git a/tests/test_wellstate.cpp b/tests/test_wellstate.cpp index ee27ec07c..31a5c1c2d 100644 --- a/tests/test_wellstate.cpp +++ b/tests/test_wellstate.cpp @@ -175,7 +175,8 @@ namespace { } const auto pressTop = 100.0 * wellID; - auto& segments = wstate.segments(wellID); + auto& ws = wstate.well(wellID); + auto& segments = ws.segments; segments.pressure[0] = pressTop; const auto& segSet = well.getSegments(); @@ -215,7 +216,8 @@ namespace { } const auto rateTop = 1000.0 * wellID; - auto& segments = wstate.segments(wellID); + auto& ws = wstate.well(wellID); + auto& segments = ws.segments; auto& segRates = segments.rates; if (wat) { segRates[iw] = rateTop; } @@ -250,8 +252,9 @@ BOOST_AUTO_TEST_CASE(Linearisation) std::vector pinfos; const auto wstate = buildWellState(setup, tstep, pinfos); + const auto& ws = wstate.well("PROD01"); - BOOST_CHECK_EQUAL(wstate.segments("PROD01").size(), 6); + BOOST_CHECK_EQUAL(ws.segments.size(), 6); const auto& wells = setup.sched.getWellsatEnd(); BOOST_CHECK_EQUAL(wells.size(), 2); @@ -468,9 +471,6 @@ BOOST_AUTO_TEST_CASE(TESTWellContainer) { BOOST_CHECK_EQUAL(wc.size(), 0); - BOOST_CHECK_THROW(wc3.update("NO_SUCH_WELL", -1), std::exception); - BOOST_CHECK_THROW(wc3.update(100, -1), std::exception); - BOOST_CHECK(wc3.has("W2")); BOOST_CHECK(!wc3.has("NO_SUCH_WELL")); @@ -515,9 +515,9 @@ BOOST_AUTO_TEST_CASE(TESTSegmentState2) { std::vector pinfo; const auto wstate = buildWellState(setup, 0, pinfo); const auto& well = setup.sched.getWell("PROD01", 0); + const auto& ws = wstate.well("PROD01"); - BOOST_CHECK_THROW(wstate.segments(100), std::exception); - auto segments = wstate.segments(1); // PROD01 is well 1 + auto segments = ws.segments; BOOST_CHECK_EQUAL(segments.pressure.size(), well.getSegments().size()); segments.pressure_drop_friction[0] = 1;