added: MultisegmentWellAssemble::assemblePressureEq

extracted from MultisegmentWellEval::assembleDefaultPressureEq
This commit is contained in:
Arne Morten Kvarving
2022-11-18 12:09:43 +01:00
parent d64508f3b8
commit 05a4ca85a7
3 changed files with 42 additions and 15 deletions

View File

@@ -172,6 +172,34 @@ assemblePressureLoss(const int seg,
} }
} }
template<class FluidSystem, class Indices, class Scalar>
void MultisegmentWellAssemble<FluidSystem,Indices,Scalar>::
assemblePressureEq(const int seg,
const int seg_upwind,
const int outlet_segment_index,
const EvalWell& pressure_equation,
const EvalWell& outlet_pressure,
Equations& eqns,
bool wfrac,
bool gfrac) const
{
eqns.resWell_[seg][SPres] = pressure_equation.value();
eqns.duneD_[seg][seg][SPres][SPres] += pressure_equation.derivative(SPres + Indices::numEq);
eqns.duneD_[seg][seg][SPres][WQTotal] += pressure_equation.derivative(WQTotal + Indices::numEq);
if (wfrac) {
eqns.duneD_[seg][seg_upwind][SPres][WFrac] += pressure_equation.derivative(WFrac + Indices::numEq);
}
if (gfrac) {
eqns.duneD_[seg][seg_upwind][SPres][GFrac] += pressure_equation.derivative(GFrac + Indices::numEq);
}
// contribution from the outlet segment
eqns.resWell_[seg][SPres] -= outlet_pressure.value();
for (int pv_idx = 0; pv_idx < numWellEq; ++pv_idx) {
eqns.duneD_[seg][outlet_segment_index][SPres][pv_idx] = -outlet_pressure.derivative(pv_idx + Indices::numEq);
}
}
#define INSTANCE(...) \ #define INSTANCE(...) \
template class MultisegmentWellAssemble<BlackOilFluidSystem<double,BlackOilDefaultIndexTraits>,__VA_ARGS__,double>; template class MultisegmentWellAssemble<BlackOilFluidSystem<double,BlackOilDefaultIndexTraits>,__VA_ARGS__,double>;

View File

@@ -88,6 +88,16 @@ public:
const EvalWell& accelerationPressureLoss, const EvalWell& accelerationPressureLoss,
Equations& eqns) const; Equations& eqns) const;
//! \brief Assemble pressure terms.
void assemblePressureEq(const int seg,
const int seg_upwind,
const int outlet_segment_index,
const EvalWell& pressure_equation,
const EvalWell& outlet_pressure,
Equations& eqns,
bool wfrac = has_wfrac_variable,
bool gfrac = has_gfrac_variable) const;
private: private:
const WellInterfaceIndices<FluidSystem,Indices,Scalar>& well_; //!< Reference to well const WellInterfaceIndices<FluidSystem,Indices,Scalar>& well_; //!< Reference to well
}; };

View File

@@ -1180,25 +1180,14 @@ assembleDefaultPressureEq(const int seg,
segments.pressure_drop_friction[seg] = friction_pressure_drop.value(); segments.pressure_drop_friction[seg] = friction_pressure_drop.value();
} }
linSys_.resWell_[seg][SPres] = pressure_equation.value();
const int seg_upwind = upwinding_segments_[seg];
linSys_.duneD_[seg][seg][SPres][SPres] += pressure_equation.derivative(SPres + Indices::numEq);
linSys_.duneD_[seg][seg][SPres][WQTotal] += pressure_equation.derivative(WQTotal + Indices::numEq);
if (has_wfrac_variable) {
linSys_.duneD_[seg][seg_upwind][SPres][WFrac] += pressure_equation.derivative(WFrac + Indices::numEq);
}
if (has_gfrac_variable) {
linSys_.duneD_[seg][seg_upwind][SPres][GFrac] += pressure_equation.derivative(GFrac + Indices::numEq);
}
// contribution from the outlet segment // contribution from the outlet segment
const int outlet_segment_index = this->segmentNumberToIndex(this->segmentSet()[seg].outletSegment()); const int outlet_segment_index = this->segmentNumberToIndex(this->segmentSet()[seg].outletSegment());
const EvalWell outlet_pressure = getSegmentPressure(outlet_segment_index); const EvalWell outlet_pressure = getSegmentPressure(outlet_segment_index);
linSys_.resWell_[seg][SPres] -= outlet_pressure.value(); const int seg_upwind = upwinding_segments_[seg];
for (int pv_idx = 0; pv_idx < numWellEq; ++pv_idx) { MultisegmentWellAssemble<FluidSystem,Indices,Scalar>(baseif_).
linSys_.duneD_[seg][outlet_segment_index][SPres][pv_idx] = -outlet_pressure.derivative(pv_idx + Indices::numEq); assemblePressureEq(seg, seg_upwind, outlet_segment_index,
} pressure_equation, outlet_pressure, linSys_);
if (this->accelerationalPressureLossConsidered()) { if (this->accelerationalPressureLossConsidered()) {
handleAccelerationPressureLoss(seg, well_state); handleAccelerationPressureLoss(seg, well_state);