70 GetPropType<TypeTag, Properties::Indices>>
85 using GLiftOptWells =
typename BlackoilWellModel<TypeTag>::GLiftOptWells;
86 using GLiftProdWells =
typename BlackoilWellModel<TypeTag>::GLiftProdWells;
87 using GLiftWellStateMap =
88 typename BlackoilWellModel<TypeTag>::GLiftWellStateMap;
89 using GLiftSyncGroups =
typename GasLiftSingleWellGeneric<Scalar>::GLiftSyncGroups;
91 using VectorBlockType = Dune::FieldVector<Scalar, Indices::numEq>;
92 using MatrixBlockType = Dune::FieldMatrix<Scalar, Indices::numEq, Indices::numEq>;
93 using Eval =
typename Base::Eval;
94 using BVector = Dune::BlockVector<VectorBlockType>;
95 using PressureMatrix = Dune::BCRSMatrix<Opm::MatrixBlock<Scalar, 1, 1>>;
97 using RateConverterType =
98 typename WellInterfaceFluidSystem<FluidSystem>::RateConverterType;
104 using ModelParameters =
typename Base::ModelParameters;
121 using FluidState = BlackOilFluidState<Eval,
125 Indices::compositionSwitchIdx >= 0,
130 Indices::numPhases >;
135 const ModelParameters& param,
136 const RateConverterType& rate_converter,
137 const int pvtRegionIdx,
138 const int num_components,
139 const int num_phases,
140 const int index_of_well,
146 virtual void init(
const PhaseUsage* phase_usage_arg,
147 const std::vector<Scalar>& depth_arg,
148 const Scalar gravity_arg,
149 const std::vector<Scalar>& B_avg,
150 const bool changed_to_open_this_step);
152 virtual void initPrimaryVariablesEvaluation() = 0;
156 const std::vector<Scalar>& B_avg,
158 const bool relax_tolerance)
const = 0;
160 virtual void solveEqAndUpdateWellState(
const Simulator& simulator,
164 void assembleWellEq(
const Simulator& simulator,
170 void assembleWellEqWithoutIteration(
const Simulator& simulator,
177 void prepareWellBeforeAssembling(
const Simulator& simulator,
184 virtual void computeWellRatesWithBhp(
const Simulator& ebosSimulator,
186 std::vector<Scalar>& well_flux,
189 virtual std::optional<Scalar>
190 computeBhpAtThpLimitProdWithAlq(
const Simulator& ebos_simulator,
191 const SummaryState& summary_state,
192 const Scalar alq_value,
203 virtual void apply(
const BVector& x, BVector& Ax)
const = 0;
206 virtual void apply(BVector& r)
const = 0;
209 virtual void computeWellPotentials(
const Simulator& simulator,
211 std::vector<Scalar>& well_potentials,
214 virtual void updateWellStateWithTarget(
const Simulator& simulator,
219 virtual void computeWellRatesWithBhpIterations(
const Simulator& simulator,
221 std::vector<Scalar>& well_flux,
224 bool wellUnderZeroRateTarget(
const Simulator& simulator,
228 bool wellUnderZeroGroupRateTarget(
const Simulator& simulator,
231 std::optional<bool> group_control = std::nullopt)
const;
233 bool stoppedOrZeroRateTarget(
const Simulator& simulator,
237 bool updateWellStateWithTHPTargetProd(
const Simulator& simulator,
241 enum class IndividualOrGroup { Individual, Group, Both };
242 bool updateWellControl(
const Simulator& simulator,
243 const IndividualOrGroup iog,
248 bool updateWellControlAndStatusLocalIteration(
const Simulator& simulator,
251 const Well::InjectionControls& inj_controls,
252 const Well::ProductionControls& prod_controls,
253 const Scalar WQTotal,
255 const bool fixed_control =
false,
256 const bool fixed_status =
false);
258 virtual void updatePrimaryVariables(
const Simulator& simulator,
262 virtual void calculateExplicitQuantities(
const Simulator& simulator,
266 virtual void updateProductivityIndex(
const Simulator& simulator,
271 virtual Scalar connectionDensity(
const int globalConnIdx,
272 const int openConnIdx)
const = 0;
281 virtual void addWellContributions(SparseMatrixAdapter&)
const = 0;
283 virtual void addWellPressureEquations(PressureMatrix& mat,
285 const int pressureVarIndex,
286 const bool use_well_weights,
289 void addCellRates(RateVector& rates,
int cellIdx)
const;
291 Scalar volumetricSurfaceRateForConnection(
int cellIdx,
int phaseIdx)
const;
295 void wellTesting(
const Simulator& simulator,
296 const double simulation_time,
299 WellTestState& welltest_state,
302 void checkWellOperability(
const Simulator& simulator,
306 bool gliftBeginTimeStepWellTestIterateWellEquations(
const Simulator& ebos_simulator,
312 void gliftBeginTimeStepWellTestUpdateALQ(
const Simulator& simulator,
318 void updateWellOperability(
const Simulator& simulator,
322 bool updateWellOperabilityFromWellEq(
const Simulator& simulator,
327 virtual void updateWaterThroughput(
const double dt,
332 virtual std::vector<Scalar>
343 void solveWellEquation(
const Simulator& simulator,
348 const std::vector<RateVector>& connectionRates()
const
350 return connectionRates_;
353 virtual std::vector<Scalar> getPrimaryVars()
const
358 virtual int setPrimaryVars(
typename std::vector<Scalar>::const_iterator)
363 std::vector<Scalar> wellIndex(
const int perf,
364 const IntensiveQuantities& intQuants,
365 const Scalar trans_mult,
366 const SingleWellState<Scalar>& ws)
const;
368 void updateConnectionDFactor(
const Simulator& simulator,
369 SingleWellState<Scalar>& ws)
const;
371 void updateConnectionTransmissibilityFactor(
const Simulator& simulator,
372 SingleWellState<Scalar>& ws)
const;
374 virtual bool iterateWellEqWithSwitching(
const Simulator& simulator,
376 const WellInjectionControls& inj_controls,
377 const WellProductionControls& prod_controls,
378 WellState<Scalar>& well_state,
379 const GroupState<Scalar>& group_state,
380 DeferredLogger& deferred_logger,
381 const bool fixed_control =
false,
382 const bool fixed_status =
false) = 0;
385 std::vector<RateVector> connectionRates_;
386 std::vector<Scalar> B_avg_;
387 bool changed_to_stopped_this_step_ =
false;
388 bool thp_update_iterations =
false;
390 Scalar wpolymer()
const;
391 Scalar wfoam()
const;
392 Scalar wsalt()
const;
393 Scalar wmicrobes()
const;
394 Scalar woxygen()
const;
395 Scalar wurea()
const;
397 virtual Scalar getRefDensity()
const = 0;
400 const std::vector<Scalar>& compFrac()
const;
403 initialWellRateFractions(
const Simulator& ebosSimulator,
404 const WellState<Scalar>& well_state)
const;
407 virtual void checkOperabilityUnderBHPLimit(
const WellState<Scalar>& well_state,
408 const Simulator& simulator,
409 DeferredLogger& deferred_logger) = 0;
412 virtual void checkOperabilityUnderTHPLimit(
const Simulator& simulator,
413 const WellState<Scalar>& well_state,
414 DeferredLogger& deferred_logger) = 0;
416 virtual void updateIPR(
const Simulator& simulator,
417 DeferredLogger& deferred_logger)
const = 0;
419 virtual void assembleWellEqWithoutIteration(
const Simulator& simulator,
421 const WellInjectionControls& inj_controls,
422 const WellProductionControls& prod_controls,
423 WellState<Scalar>& well_state,
424 const GroupState<Scalar>& group_state,
425 DeferredLogger& deferred_logger) = 0;
428 virtual bool iterateWellEqWithControl(
const Simulator& simulator,
430 const WellInjectionControls& inj_controls,
431 const WellProductionControls& prod_controls,
432 WellState<Scalar>& well_state,
433 const GroupState<Scalar>& group_state,
434 DeferredLogger& deferred_logger) = 0;
436 virtual void updateIPRImplicit(
const Simulator& simulator,
437 WellState<Scalar>& well_state,
438 DeferredLogger& deferred_logger) = 0;
440 bool iterateWellEquations(
const Simulator& simulator,
442 WellState<Scalar>& well_state,
443 const GroupState<Scalar>& group_state,
444 DeferredLogger& deferred_logger);
446 bool solveWellWithTHPConstraint(
const Simulator& simulator,
448 const Well::InjectionControls& inj_controls,
449 const Well::ProductionControls& prod_controls,
450 WellState<Scalar>& well_state,
451 const GroupState<Scalar>& group_state,
452 DeferredLogger& deferred_logger);
454 std::optional<Scalar>
455 estimateOperableBhp(
const Simulator& ebos_simulator,
457 WellState<Scalar>& well_state,
458 const SummaryState& summary_state,
459 DeferredLogger& deferred_logger);
461 bool solveWellWithBhp(
const Simulator& simulator,
464 WellState<Scalar>& well_state,
465 DeferredLogger& deferred_logger);
467 bool solveWellWithZeroRate(
const Simulator& simulator,
469 WellState<Scalar>& well_state,
470 DeferredLogger& deferred_logger);
472 bool solveWellForTesting(
const Simulator& simulator,
473 WellState<Scalar>& well_state,
474 const GroupState<Scalar>& group_state,
475 DeferredLogger& deferred_logger);
477 Eval getPerfCellPressure(
const FluidState& fs)
const;
480 template<
class Value,
class Callback>
481 void getMobility(
const Simulator& simulator,
483 std::vector<Value>& mob,
484 Callback& extendEval,
485 [[maybe_unused]] DeferredLogger& deferred_logger)
const;
487 void computeConnLevelProdInd(
const FluidState& fs,
488 const std::function<Scalar(
const Scalar)>& connPICalc,
489 const std::vector<Scalar>& mobility,
490 Scalar* connPI)
const;
492 void computeConnLevelInjInd(
const FluidState& fs,
493 const Phase preferred_phase,
494 const std::function<Scalar(
const Scalar)>& connIICalc,
495 const std::vector<Scalar>& mobility,
497 DeferredLogger& deferred_logger)
const;
499 Scalar computeConnectionDFactor(
const int perf,
500 const IntensiveQuantities& intQuants,
501 const SingleWellState<Scalar>& ws)
const;