Add missing reverse flow derivatives for valve/icd/aicd

This commit is contained in:
Stein Krogstad
2023-10-04 08:18:27 +02:00
parent b60eb25285
commit dd6d195a6b
3 changed files with 129 additions and 42 deletions

View File

@@ -283,19 +283,31 @@ assembleICDPressureEq(const int seg,
// the pressure equation is something like
// p_seg - deltaP - p_outlet = 0.
// the major part is how to calculate the deltaP
const int seg_upwind = segments_.upwinding_segment(seg);
const bool reverseFlow = seg != seg_upwind; // special treatment for reverse flow
EvalWell pressure_equation = primary_variables_.getSegmentPressure(seg);
EvalWell icd_pressure_drop;
EvalWell extra_derivatives;
switch(this->segmentSet()[seg].segmentType()) {
case Segment::SegmentType::SICD :
icd_pressure_drop = segments_.pressureDropSpiralICD(seg);
icd_pressure_drop = segments_.pressureDropSpiralICD(seg, /*extra derivatives*/false);
if (reverseFlow){
extra_derivatives = -segments_.pressureDropSpiralICD(seg, /*extra derivatives*/true);
}
break;
case Segment::SegmentType::AICD :
icd_pressure_drop = segments_.pressureDropAutoICD(seg, unit_system);
icd_pressure_drop = segments_.pressureDropAutoICD(seg, unit_system, /*extra derivatives*/false);
if (reverseFlow){
extra_derivatives = -segments_.pressureDropAutoICD(seg, unit_system, /*extra derivatives*/true);
}
break;
case Segment::SegmentType::VALVE :
icd_pressure_drop = segments_.pressureDropValve(seg);
icd_pressure_drop = segments_.pressureDropValve(seg, /*extra derivatives*/false);
if (reverseFlow){
extra_derivatives = -segments_.pressureDropValve(seg, /*extra derivatives*/true);
}
break;
default: {
OPM_DEFLOG_THROW(std::runtime_error,
@@ -305,6 +317,12 @@ assembleICDPressureEq(const int seg,
deferred_logger);
}
}
if (reverseFlow){
MultisegmentWellAssemble<FluidSystem,Indices,Scalar>(baseif_).
assemblePressureEqExtraDerivatives(seg, seg_upwind, extra_derivatives, linSys_);
}
pressure_equation = pressure_equation - icd_pressure_drop;
auto& ws = well_state.well(baseif_.indexOfWell());
ws.segments.pressure_drop_friction[seg] = icd_pressure_drop.value();
@@ -313,7 +331,6 @@ assembleICDPressureEq(const int seg,
const int outlet_segment_index = this->segmentNumberToIndex(this->segmentSet()[seg].outletSegment());
const EvalWell outlet_pressure = primary_variables_.getSegmentPressure(outlet_segment_index);
const int seg_upwind = segments_.upwinding_segment(seg);
MultisegmentWellAssemble<FluidSystem,Indices,Scalar>(baseif_).
assemblePressureEq(seg, seg_upwind, outlet_segment_index,
pressure_equation, outlet_pressure,