moving computeSegmentPressuresDelta to MultisegmentWells

This commit is contained in:
Kai Bao
2016-04-27 13:11:36 +02:00
parent 580ac7df6b
commit 89117c0294
5 changed files with 48 additions and 44 deletions

View File

@@ -224,9 +224,6 @@ namespace Opm {
std::vector<ADB>& vars,
SolutionState& state) const;
void
computeSegmentPressuresDelta(const SolutionState& state);
};

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View File

@@ -515,5 +515,6 @@ namespace Opm
}
}
}
#endif // OPM_MULTISEGMENTWELLS_IMPL_HEADER_INCLUDED