diff --git a/opm/simulators/wells/StandardWell_impl.hpp b/opm/simulators/wells/StandardWell_impl.hpp index 325ae276c..436667419 100644 --- a/opm/simulators/wells/StandardWell_impl.hpp +++ b/opm/simulators/wells/StandardWell_impl.hpp @@ -629,7 +629,7 @@ namespace Opm // Store the perforation phase flux for later usage. if (has_solvent && componentIdx == contiSolventEqIdx) { - auto * perf_rate_solvent = &well_state.perfRateSolvent()[first_perf_]; + auto * perf_rate_solvent = well_state.perfRateSolvent(this->index_of_well_); perf_rate_solvent[perf] = cq_s[componentIdx].value(); } else { perf_rates[perf*np + ebosCompIdxToFlowCompIdx(componentIdx)] = cq_s[componentIdx].value(); @@ -828,7 +828,7 @@ namespace Opm const double dis_gas_frac = perf_dis_gas_rate / cq_s_zfrac_effective.value(); cq_s_zfrac_effective *= extendEval(dis_gas_frac*intQuants.xVolume() + (1.0-dis_gas_frac)*intQuants.yVolume()); } - auto * perf_rate_solvent = &well_state.perfRateSolvent()[first_perf_]; + auto * perf_rate_solvent = well_state.perfRateSolvent(this->index_of_well_); perf_rate_solvent[perf] = cq_s_zfrac_effective.value(); cq_s_zfrac_effective *= well_efficiency_factor_; @@ -2114,7 +2114,7 @@ namespace Opm } if constexpr (has_solvent) { - const auto * solvent_perf_rates_state = &well_state.perfRateSolvent()[this->first_perf_]; + const auto * solvent_perf_rates_state = well_state.perfRateSolvent(this->index_of_well_); for (int perf = 0; perf < nperf; ++perf) { perfRates[perf * num_components_ + contiSolventEqIdx] = solvent_perf_rates_state[perf]; } diff --git a/opm/simulators/wells/WellState.cpp b/opm/simulators/wells/WellState.cpp index a21858150..2e2e5fc35 100644 --- a/opm/simulators/wells/WellState.cpp +++ b/opm/simulators/wells/WellState.cpp @@ -464,10 +464,11 @@ void WellState::init(const std::vector& cellPressures, if (pu.has_solvent) { if (global_num_perf_same) { - int oldPerf_idx = oldPerf_idx_beg; - for (int perf = connpos; perf < connpos + num_perf_this_well; ++perf, ++oldPerf_idx ) + auto * solvent_target = this->perfRateSolvent(newIndex); + const auto * solvent_src = prevState->perfRateSolvent(oldIndex); + for (int perf = 0; perf < num_perf_this_well; ++perf) { - perfRateSolvent()[ perf ] = prevState->perfRateSolvent()[ oldPerf_idx ]; + solvent_target[perf] = solvent_src[perf]; } } } @@ -786,7 +787,7 @@ void WellState::reportConnections(data::Well& well, comp.rates.set( rt::brine, perf_brine_rate[local_comp_index]); } if ( pu.has_solvent ) { - const auto * perf_solvent_rate = &this->perfRateSolvent()[wt.second[1]]; + const auto * perf_solvent_rate = this->perfRateSolvent(well_index); comp.rates.set( rt::solvent, perf_solvent_rate[local_comp_index] ); } @@ -955,7 +956,7 @@ WellState::calculateSegmentRates(const std::vector>& segment_in double WellState::solventWellRate(const int w) const { - const auto * perf_rates_solvent = &perfRateSolvent_[first_perf_index_[w]]; + const auto * perf_rates_solvent = this->perfRateSolvent(w); return parallel_well_info_[w]->sumPerfValues(perf_rates_solvent, perf_rates_solvent + this->numPerf(w)); } diff --git a/opm/simulators/wells/WellState.hpp b/opm/simulators/wells/WellState.hpp index d043ae8ac..a071992ed 100644 --- a/opm/simulators/wells/WellState.hpp +++ b/opm/simulators/wells/WellState.hpp @@ -153,8 +153,13 @@ public: } /// One rate pr well connection. - std::vector& perfRateSolvent() { return perfRateSolvent_; } - const std::vector& perfRateSolvent() const { return perfRateSolvent_; } + double * perfRateSolvent(std::size_t well_index) { + return &perfRateSolvent_[this->first_perf_index_[well_index]]; + } + + const double * perfRateSolvent(std::size_t well_index) const { + return &perfRateSolvent_[this->first_perf_index_[well_index]]; + } /// One rate pr well double solventWellRate(const int w) const;