diff --git a/opm/simulators/wells/MultisegmentWellGeneric.cpp b/opm/simulators/wells/MultisegmentWellGeneric.cpp index 532317144..2a1497a84 100644 --- a/opm/simulators/wells/MultisegmentWellGeneric.cpp +++ b/opm/simulators/wells/MultisegmentWellGeneric.cpp @@ -182,6 +182,27 @@ accelerationalPressureLossConsidered() const return (segmentSet().compPressureDrop() == WellSegments::CompPressureDrop::HFA); } + +template +double +MultisegmentWellGeneric::getSegmentDp(const int seg, + const double density, + const std::vector& seg_dp) const +{ + const double segment_depth = this->segmentSet()[seg].depth(); + const int outlet_segment_index = this->segmentNumberToIndex(this->segmentSet()[seg].outletSegment()); + const double segment_depth_outlet = seg == 0 ? baseif_.refDepth() : this->segmentSet()[outlet_segment_index].depth(); + double dp = wellhelpers::computeHydrostaticCorrection(segment_depth_outlet, segment_depth, + density, baseif_.gravity()); + // we add the hydrostatic correction from the outlet segment + // in order to get the correction all the way to the bhp ref depth. + if (seg > 0) { + dp += seg_dp[outlet_segment_index]; + } + + return dp; +} + template class MultisegmentWellGeneric; } // namespace Opm diff --git a/opm/simulators/wells/MultisegmentWellGeneric.hpp b/opm/simulators/wells/MultisegmentWellGeneric.hpp index 39c31a480..68f449a76 100644 --- a/opm/simulators/wells/MultisegmentWellGeneric.hpp +++ b/opm/simulators/wells/MultisegmentWellGeneric.hpp @@ -72,6 +72,10 @@ protected: bool accelerationalPressureLossConsidered() const; bool frictionalPressureLossConsidered() const; + double getSegmentDp(const int seg, + const double density, + const std::vector& seg_dp) const; + const WellInterfaceGeneric& baseif_; }; diff --git a/opm/simulators/wells/MultisegmentWell_impl.hpp b/opm/simulators/wells/MultisegmentWell_impl.hpp index c5226d487..6c63ed729 100644 --- a/opm/simulators/wells/MultisegmentWell_impl.hpp +++ b/opm/simulators/wells/MultisegmentWell_impl.hpp @@ -1246,20 +1246,12 @@ namespace Opm std::fill(this->ipr_b_.begin(), this->ipr_b_.end(), 0.); const int nseg = this->numberOfSegments(); - const double ref_depth = this->ref_depth_; std::vector seg_dp(nseg, 0.0); for (int seg = 0; seg < nseg; ++seg) { // calculating the perforation rate for each perforation that belongs to this segment - const double segment_depth = this->segmentSet()[seg].depth(); - const int outlet_segment_index = this->segmentNumberToIndex(this->segmentSet()[seg].outletSegment()); - const double segment_depth_outlet = seg == 0? ref_depth : this->segmentSet()[outlet_segment_index].depth(); - double dp = wellhelpers::computeHydrostaticCorrection(segment_depth_outlet, segment_depth, - this->segments_.density(seg).value(), this->gravity_); - // we add the hydrostatic correction from the outlet segment - // in order to get the correction all the way to the bhp ref depth. - if (seg > 0) { - dp += seg_dp[outlet_segment_index]; - } + const double dp = this->getSegmentDp(seg, + this->segments_.density(seg).value(), + seg_dp); seg_dp[seg] = dp; for (const int perf : this->segments_.perforations()[seg]) { std::vector mob(this->num_components_, 0.0);