75 GetPropType<TypeTag, Properties::Indices>>
84 using IndexTraits =
typename FluidSystem::IndexTraitsType;
91 using GLiftEclWells =
typename GasLiftGroupInfo<Scalar, IndexTraits>::GLiftEclWells;
93 using VectorBlockType = Dune::FieldVector<Scalar, Indices::numEq>;
94 using MatrixBlockType = Dune::FieldMatrix<Scalar, Indices::numEq, Indices::numEq>;
95 using Eval =
typename Base::Eval;
96 using BVector = Dune::BlockVector<VectorBlockType>;
97 using PressureMatrix = Dune::BCRSMatrix<Opm::MatrixBlock<Scalar, 1, 1>>;
102 using RateConverterType =
109 using ModelParameters =
typename Base::ModelParameters;
124 static constexpr bool has_micp = Indices::enableMICP;
131 Indices::compositionSwitchIdx >= 0,
136 Indices::numPhases >;
141 const ModelParameters& param,
143 const int pvtRegionIdx,
145 const int num_phases,
152 virtual void init(
const std::vector<Scalar>&
depth_arg,
154 const std::vector<Scalar>&
B_avg,
159 const std::vector<Scalar>&
B_avg,
163 virtual void solveEqAndUpdateWellState(
const Simulator& simulator,
167 void assembleWellEq(
const Simulator& simulator,
173 void assembleWellEqWithoutIteration(
const Simulator& simulator,
180 void prepareWellBeforeAssembling(
const Simulator& simulator,
186 virtual void computeWellRatesWithBhp(
const Simulator&
ebosSimulator,
191 virtual std::optional<Scalar>
206 virtual void apply(
const BVector& x, BVector&
Ax)
const = 0;
209 virtual void apply(BVector&
r)
const = 0;
212 virtual void computeWellPotentials(
const Simulator& simulator,
214 std::vector<Scalar>& well_potentials,
217 virtual void updateWellStateWithTarget(
const Simulator& simulator,
222 virtual void scaleSegmentRatesAndPressure(
WellStateType& well_state)
const;
224 virtual void computeWellRatesWithBhpIterations(
const Simulator& simulator,
229 bool wellUnderZeroRateTarget(
const Simulator& simulator,
233 bool wellUnderZeroGroupRateTarget(
const Simulator& simulator,
238 bool stoppedOrZeroRateTarget(
const Simulator& simulator,
242 bool updateWellStateWithTHPTargetProd(
const Simulator& simulator,
246 enum class IndividualOrGroup { Individual, Group, Both };
247 bool updateWellControl(
const Simulator& simulator,
248 const IndividualOrGroup
iog,
249 WellStateType& well_state,
253 bool updateWellControlAndStatusLocalIteration(
const Simulator& simulator,
254 WellStateType& well_state,
258 const Scalar WQTotal,
263 virtual void updatePrimaryVariables(
const Simulator& simulator,
264 const WellStateType& well_state,
267 virtual void calculateExplicitQuantities(
const Simulator& simulator,
268 const WellStateType& well_state,
271 virtual void updateProductivityIndex(
const Simulator& simulator,
273 WellStateType& well_state,
277 virtual void addWellContributions(SparseMatrixAdapter&)
const = 0;
279 virtual void addWellPressureEquations(PressureMatrix& mat,
281 const int pressureVarIndex,
283 const WellStateType& well_state)
const = 0;
285 void addCellRates(RateVector& rates,
int cellIdx)
const;
287 Scalar volumetricSurfaceRateForConnection(
int cellIdx,
int phaseIdx)
const;
291 void wellTesting(
const Simulator& simulator,
293 WellStateType& well_state,
300 void checkWellOperability(
const Simulator& simulator,
301 const WellStateType& well_state,
304 void gliftBeginTimeStepWellTestUpdateALQ(
const Simulator& simulator,
305 WellStateType& well_state,
312 void updateWellOperability(
const Simulator& simulator,
313 const WellStateType& well_state,
316 bool updateWellOperabilityFromWellEq(
const Simulator& simulator,
317 const WellStateType& well_state,
321 virtual void updateWaterThroughput(
const double dt,
322 WellStateType& well_state)
const = 0;
326 virtual std::vector<Scalar>
337 void solveWellEquation(
const Simulator& simulator,
342 const std::vector<RateVector>& connectionRates()
const
344 return connectionRates_;
347 std::vector<Scalar> wellIndex(
const int perf,
348 const IntensiveQuantities& intQuants,
350 const SingleWellStateType&
ws)
const;
352 void updateConnectionDFactor(
const Simulator& simulator,
353 SingleWellStateType&
ws)
const;
355 void updateConnectionTransmissibilityFactor(
const Simulator& simulator,
356 SingleWellStateType&
ws)
const;
358 virtual bool iterateWellEqWithSwitching(
const Simulator& simulator,
362 WellStateType& well_state,
369 std::vector<RateVector> connectionRates_;
370 std::vector<Scalar> B_avg_;
371 bool changed_to_stopped_this_step_ =
false;
372 bool thp_update_iterations =
false;
373 int number_of_well_reopenings_{0};
375 Scalar wpolymer()
const;
376 Scalar wfoam()
const;
377 Scalar wsalt()
const;
378 Scalar wmicrobes()
const;
379 Scalar woxygen()
const;
380 Scalar wurea()
const;
382 virtual Scalar getRefDensity()
const = 0;
386 const WellStateType& well_state)
const;
389 virtual void checkOperabilityUnderBHPLimit(
const WellStateType& well_state,
390 const Simulator& simulator,
394 virtual void checkOperabilityUnderTHPLimit(
const Simulator& simulator,
395 const WellStateType& well_state,
398 virtual void updateIPR(
const Simulator& simulator,
401 virtual void assembleWellEqWithoutIteration(
const Simulator& simulator,
405 WellStateType& well_state,
410 virtual bool iterateWellEqWithControl(
const Simulator& simulator,
414 WellStateType& well_state,
418 virtual void updateIPRImplicit(
const Simulator& simulator,
419 WellStateType& well_state,
422 bool iterateWellEquations(
const Simulator& simulator,
424 WellStateType& well_state,
428 bool solveWellWithOperabilityCheck(
const Simulator& simulator,
432 WellStateType& well_state,
436 std::optional<Scalar>
439 WellStateType& well_state,
443 bool solveWellWithBhp(
const Simulator& simulator,
446 WellStateType& well_state,
449 bool solveWellWithZeroRate(
const Simulator& simulator,
451 WellStateType& well_state,
454 bool solveWellForTesting(
const Simulator& simulator,
455 WellStateType& well_state,
460 template<
class GasLiftSingleWell>
461 std::unique_ptr<GasLiftSingleWell> initializeGliftWellTest_(
const Simulator& simulator,
462 WellStateType& well_state,
467 Eval getPerfCellPressure(
const FluidState& fs)
const;
470 template<
class Value,
class Callback>
471 void getMobility(
const Simulator& simulator,
473 std::vector<Value>&
mob,
477 void computeConnLevelProdInd(
const FluidState& fs,
478 const std::function<Scalar(
const Scalar)>&
connPICalc,
479 const std::vector<Scalar>& mobility,
482 void computeConnLevelInjInd(
const FluidState& fs,
484 const std::function<Scalar(
const Scalar)>&
connIICalc,
485 const std::vector<Scalar>& mobility,
489 Scalar computeConnectionDFactor(
const int perf,
490 const IntensiveQuantities& intQuants,
491 const SingleWellStateType&
ws)
const;