72 GetPropType<TypeTag, Properties::Indices>,
73 GetPropType<TypeTag, Properties::Scalar>>
90 using GLiftOptWells =
typename BlackoilWellModel<TypeTag>::GLiftOptWells;
91 using GLiftProdWells =
typename BlackoilWellModel<TypeTag>::GLiftProdWells;
92 using GLiftWellStateMap =
93 typename BlackoilWellModel<TypeTag>::GLiftWellStateMap;
94 using GLiftSyncGroups =
typename GasLiftSingleWellGeneric::GLiftSyncGroups;
98 using VectorBlockType = Dune::FieldVector<Scalar, Indices::numEq>;
99 using MatrixBlockType = Dune::FieldMatrix<Scalar, Indices::numEq, Indices::numEq>;
100 using Eval =
typename Base::Eval;
101 using BVector = Dune::BlockVector<VectorBlockType>;
102 using PressureMatrix = Dune::BCRSMatrix<Opm::MatrixBlock<double, 1, 1>>;
104 using RateConverterType =
130 Indices::compositionSwitchIdx >= 0,
135 Indices::numPhases >;
142 const int pvtRegionIdx,
144 const int num_phases,
146 const std::vector<PerforationData>& perf_data);
155 const std::vector< Scalar >&
B_avg,
158 virtual void initPrimaryVariablesEvaluation() = 0;
162 const std::vector<double>&
B_avg,
170 void assembleWellEq(
const Simulator& ebosSimulator,
176 void assembleWellEqWithoutIteration(
const Simulator& ebosSimulator,
183 void prepareWellBeforeAssembling(
const Simulator& ebosSimulator,
190 virtual void computeWellRatesWithBhp(
191 const Simulator& ebosSimulator,
197 virtual std::optional<double> computeBhpAtThpLimitProdWithAlq(
212 virtual void apply(
const BVector& x, BVector&
Ax)
const = 0;
215 virtual void apply(BVector&
r)
const = 0;
218 virtual void computeWellPotentials(
const Simulator& ebosSimulator,
220 std::vector<double>& well_potentials,
223 virtual void updateWellStateWithTarget(
const Simulator&
ebos_simulator,
228 virtual void computeWellRatesWithBhpIterations(
const Simulator& ebosSimulator,
233 bool updateWellStateWithTHPTargetProd(
const Simulator&
ebos_simulator,
237 enum class IndividualOrGroup { Individual, Group, Both };
239 const IndividualOrGroup
iog,
244 bool updateWellControlAndStatusLocalIteration(
const Simulator&
ebos_simulator,
249 const double WQTotal,
256 virtual void calculateExplicitQuantities(
const Simulator& ebosSimulator,
260 virtual void updateProductivityIndex(
const Simulator& ebosSimulator,
275 virtual void addWellContributions(SparseMatrixAdapter&)
const = 0;
277 virtual void addWellPressureEquations(PressureMatrix& mat,
279 const int pressureVarIndex,
283 void addCellRates(RateVector& rates,
int cellIdx)
const;
285 Scalar volumetricSurfaceRateForConnection(
int cellIdx,
int phaseIdx)
const;
289 void wellTesting(
const Simulator&
simulator,
296 bool gliftBeginTimeStepWellTestIterateWellEquations(
303 void gliftBeginTimeStepWellTestUpdateALQ(
const Simulator&
ebos_simulator,
313 bool updateWellOperabilityFromWellEq(
const Simulator&
ebos_simulator,
318 virtual void updateWaterThroughput(
const double dt,
WellState& well_state)
const = 0;
332 void solveWellEquation(
const Simulator& ebosSimulator,
337 const std::vector<RateVector>& connectionRates()
const
339 return connectionRates_;
342 virtual std::vector<double> getPrimaryVars()
const
347 virtual int setPrimaryVars(std::vector<double>::const_iterator)
354 const ModelParameters& param_;
355 std::vector<RateVector> connectionRates_;
356 std::vector< Scalar > B_avg_;
357 bool changed_to_stopped_this_step_ =
false;
358 bool thp_update_iterations =
false;
360 double wpolymer()
const;
362 double wfoam()
const;
364 double wsalt()
const;
366 double wmicrobes()
const;
368 double woxygen()
const;
370 double wurea()
const;
372 virtual double getRefDensity()
const = 0;
375 const std::vector<double>& compFrac()
const;
377 std::vector<double> initialWellRateFractions(
const Simulator& ebosSimulator,
const WellState& well_state)
const;
380 virtual void checkOperabilityUnderBHPLimit(
const WellState& well_state,
const Simulator& ebos_simulator, DeferredLogger& deferred_logger) =0;
383 virtual void checkOperabilityUnderTHPLimit(
const Simulator& ebos_simulator,
const WellState& well_state, DeferredLogger& deferred_logger) =0;
385 virtual void updateIPR(
const Simulator& ebos_simulator, DeferredLogger& deferred_logger)
const=0;
387 virtual void assembleWellEqWithoutIteration(
const Simulator& ebosSimulator,
389 const WellInjectionControls& inj_controls,
390 const WellProductionControls& prod_controls,
391 WellState& well_state,
392 const GroupState& group_state,
393 DeferredLogger& deferred_logger) = 0;
396 virtual bool iterateWellEqWithControl(
const Simulator& ebosSimulator,
398 const WellInjectionControls& inj_controls,
399 const WellProductionControls& prod_controls,
400 WellState& well_state,
401 const GroupState& group_state,
402 DeferredLogger& deferred_logger) = 0;
404 virtual bool iterateWellEqWithSwitching(
const Simulator& ebosSimulator,
406 const WellInjectionControls& inj_controls,
407 const WellProductionControls& prod_controls,
408 WellState& well_state,
409 const GroupState& group_state,
410 DeferredLogger& deferred_logger) = 0;
412 bool iterateWellEquations(
const Simulator& ebosSimulator,
414 WellState& well_state,
415 const GroupState& group_state,
416 DeferredLogger& deferred_logger);
418 bool solveWellForTesting(
const Simulator& ebosSimulator, WellState& well_state,
const GroupState& group_state,
419 DeferredLogger& deferred_logger);
421 Eval getPerfCellPressure(
const FluidState& fs)
const;
424 template<
class Value,
class Callback>
425 void getMobility(
const Simulator& ebosSimulator,
427 std::vector<Value>& mob,
428 Callback& extendEval,
429 [[maybe_unused]] DeferredLogger& deferred_logger)
const;
431 void computeConnLevelProdInd(
const FluidState& fs,
432 const std::function<
double(
const double)>& connPICalc,
433 const std::vector<Scalar>& mobility,
434 double* connPI)
const;
436 void computeConnLevelInjInd(
const FluidState& fs,
437 const Phase preferred_phase,
438 const std::function<
double(
const double)>& connIICalc,
439 const std::vector<Scalar>& mobility,
441 DeferredLogger& deferred_logger)
const;