mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
moving computeSegmentPressuresDelta to MultisegmentWells
This commit is contained in:
@@ -224,9 +224,6 @@ namespace Opm {
|
||||
std::vector<ADB>& vars,
|
||||
SolutionState& state) const;
|
||||
|
||||
void
|
||||
computeSegmentPressuresDelta(const SolutionState& state);
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
@@ -485,7 +485,10 @@ namespace Opm {
|
||||
|
||||
// asImpl().computeSegmentFluidProperties(state);
|
||||
msWells().computeSegmentFluidProperties(state, phaseCondition(), active_, fluid_, numPhases());
|
||||
asImpl().computeSegmentPressuresDelta(state);
|
||||
|
||||
// asImpl().computeSegmentPressuresDelta(state);
|
||||
const double gravity = detail::getGravity(geo_.gravity(), UgGridHelpers::dimensions(grid_));
|
||||
msWells().computeSegmentPressuresDelta(gravity);
|
||||
|
||||
std::vector<ADB> mob_perfcells;
|
||||
std::vector<ADB> b_perfcells;
|
||||
@@ -923,46 +926,6 @@ namespace Opm {
|
||||
|
||||
|
||||
|
||||
template <class Grid>
|
||||
void
|
||||
BlackoilMultiSegmentModel<Grid>::computeSegmentPressuresDelta(const SolutionState& state)
|
||||
{
|
||||
const int nw = wellsMultiSegment().size();
|
||||
const int nseg_total = state.segp.size();
|
||||
|
||||
if ( !msWellOps().has_multisegment_wells ) {
|
||||
msWells().wellSegmentPressureDelta() = ADB::constant(V::Zero(nseg_total));
|
||||
msWells().wellSegmentPerforationPressureDiffs() = msWellOps().s2p * msWells().wellSegmentPressureDelta();
|
||||
return;
|
||||
}
|
||||
|
||||
// calculate the depth difference of the segments
|
||||
// TODO: we need to store the following values somewhere to avoid recomputation.
|
||||
V segment_depth_delta = V::Zero(nseg_total);
|
||||
int start_segment = 0;
|
||||
for (int w = 0; w < nw; ++w) {
|
||||
WellMultiSegmentConstPtr well = wellsMultiSegment()[w];
|
||||
const int nseg = well->numberOfSegments();
|
||||
for (int s = 1; s < nseg; ++s) {
|
||||
const int s_outlet = well->outletSegment()[s];
|
||||
assert(s_outlet >= 0 && s_outlet < nseg);
|
||||
segment_depth_delta[s + start_segment] = well->segmentDepth()[s_outlet] - well->segmentDepth()[s];
|
||||
}
|
||||
start_segment += nseg;
|
||||
}
|
||||
assert(start_segment == nseg_total);
|
||||
|
||||
const double grav = detail::getGravity(geo_.gravity(), UgGridHelpers::dimensions(grid_));
|
||||
const ADB grav_adb = ADB::constant(V::Constant(nseg_total, grav));
|
||||
msWells().wellSegmentPressureDelta() = segment_depth_delta * grav_adb * msWells().wellSegmentDensities();
|
||||
|
||||
ADB well_segment_perforation_densities = msWellOps().s2p * msWells().wellSegmentDensities();
|
||||
msWells().wellSegmentPerforationPressureDiffs() = grav * msWells().wellSegmentPerforationDepthDiffs() * well_segment_perforation_densities;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// added to fixing the flow_multisegment running
|
||||
template <class Grid>
|
||||
bool
|
||||
|
@@ -185,6 +185,46 @@ namespace Opm {
|
||||
return wops_ms_;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void
|
||||
MultisegmentWells::
|
||||
computeSegmentPressuresDelta(const double grav)
|
||||
{
|
||||
const int nw = wells().size();
|
||||
const int nseg_total = nseg_total_;
|
||||
|
||||
if ( !wellOps().has_multisegment_wells ) {
|
||||
wellSegmentPressureDelta() = ADB::constant(Vector::Zero(nseg_total));
|
||||
wellSegmentPerforationPressureDiffs() = wellOps().s2p * wellSegmentPressureDelta();
|
||||
return;
|
||||
}
|
||||
|
||||
// calculate the depth difference of the segments
|
||||
// TODO: we need to store the following values somewhere to avoid recomputation.
|
||||
Vector segment_depth_delta = Vector::Zero(nseg_total);
|
||||
int start_segment = 0;
|
||||
for (int w = 0; w < nw; ++w) {
|
||||
WellMultiSegmentConstPtr well = wells()[w];
|
||||
const int nseg = well->numberOfSegments();
|
||||
for (int s = 1; s < nseg; ++s) {
|
||||
const int s_outlet = well->outletSegment()[s];
|
||||
assert(s_outlet >= 0 && s_outlet < nseg);
|
||||
segment_depth_delta[s + start_segment] = well->segmentDepth()[s_outlet] - well->segmentDepth()[s];
|
||||
}
|
||||
start_segment += nseg;
|
||||
}
|
||||
assert(start_segment == nseg_total);
|
||||
|
||||
const ADB grav_adb = ADB::constant(Vector::Constant(nseg_total, grav));
|
||||
wellSegmentPressureDelta() = segment_depth_delta * grav_adb * wellSegmentDensities();
|
||||
|
||||
ADB well_segment_perforation_densities = wellOps().s2p * wellSegmentDensities();
|
||||
wellSegmentPerforationPressureDiffs() = grav * wellSegmentPerforationDepthDiffs() * well_segment_perforation_densities;
|
||||
}
|
||||
|
||||
} // end of namespace Opm
|
||||
|
||||
|
||||
|
@@ -157,6 +157,9 @@ namespace Opm {
|
||||
const BlackoilPropsAdInterface& fluid,
|
||||
const int np);
|
||||
|
||||
void
|
||||
computeSegmentPressuresDelta(const double grav);
|
||||
|
||||
|
||||
protected:
|
||||
// TODO: probably a wells_active_ will be required here.
|
||||
|
@@ -515,5 +515,6 @@ namespace Opm
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
#endif // OPM_MULTISEGMENTWELLS_IMPL_HEADER_INCLUDED
|
||||
|
Reference in New Issue
Block a user