74 GetPropType<TypeTag, Properties::Indices>>
77 GetPropType<TypeTag, Properties::Indices>>;
81 using Grid = GetPropType<TypeTag, Properties::Grid>;
82 using Simulator = GetPropType<TypeTag, Properties::Simulator>;
83 using FluidSystem = GetPropType<TypeTag, Properties::FluidSystem>;
84 using Indices = GetPropType<TypeTag, Properties::Indices>;
85 using IntensiveQuantities = GetPropType<TypeTag, Properties::IntensiveQuantities>;
86 using MaterialLaw = GetPropType<TypeTag, Properties::MaterialLaw>;
87 using SparseMatrixAdapter = GetPropType<TypeTag, Properties::SparseMatrixAdapter>;
88 using RateVector = GetPropType<TypeTag, Properties::RateVector>;
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;
96 using Scalar = GetPropType<TypeTag, Properties::Scalar>;
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 =
111 static constexpr bool has_solvent = getPropValue<TypeTag, Properties::EnableSolvent>();
112 static constexpr bool has_zFraction = getPropValue<TypeTag, Properties::EnableExtbo>();
113 static constexpr bool has_polymer = getPropValue<TypeTag, Properties::EnablePolymer>();
114 static constexpr bool has_energy = getPropValue<TypeTag, Properties::EnableEnergy>();
115 static const bool has_temperature = getPropValue<TypeTag, Properties::EnableTemperature>();
117 static constexpr bool has_polymermw = getPropValue<TypeTag, Properties::EnablePolymerMW>();
118 static constexpr bool has_foam = getPropValue<TypeTag, Properties::EnableFoam>();
119 static constexpr bool has_brine = getPropValue<TypeTag, Properties::EnableBrine>();
120 static constexpr bool has_watVapor = getPropValue<TypeTag, Properties::EnableVapwat>();
121 static constexpr bool has_disgas_in_water = getPropValue<TypeTag, Properties::EnableDisgasInWater>();
122 static constexpr bool has_saltPrecip = getPropValue<TypeTag, Properties::EnableSaltPrecipitation>();
123 static constexpr bool has_micp = getPropValue<TypeTag, Properties::EnableMICP>();
126 using FluidState = BlackOilFluidState<Eval,
130 Indices::compositionSwitchIdx >= 0,
135 Indices::numPhases >;
141 const RateConverterType& rate_converter,
142 const int pvtRegionIdx,
143 const int num_components,
144 const int num_phases,
145 const int index_of_well,
146 const std::vector<PerforationData>& perf_data);
151 virtual void init(
const PhaseUsage* phase_usage_arg,
152 const std::vector<double>& depth_arg,
153 const double gravity_arg,
155 const std::vector< Scalar >& B_avg,
156 const bool changed_to_open_this_step);
158 virtual void initPrimaryVariablesEvaluation() = 0;
162 const std::vector<double>& B_avg,
164 const bool relax_tolerance)
const = 0;
166 virtual void solveEqAndUpdateWellState(
const SummaryState& summary_state,
170 void assembleWellEq(
const Simulator& simulator,
176 void assembleWellEqWithoutIteration(
const Simulator& simulator,
183 void prepareWellBeforeAssembling(
const Simulator& simulator,
190 virtual void computeWellRatesWithBhp(
191 const Simulator& simulator,
193 std::vector<double>& well_flux,
197 virtual std::optional<double> computeBhpAtThpLimitProdWithAlq(
198 const Simulator& simulator,
199 const SummaryState& summary_state,
200 const double alq_value,
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& simulator,
220 std::vector<double>& well_potentials,
223 virtual void updateWellStateWithTarget(
const Simulator& simulator,
228 virtual void computeWellRatesWithBhpIterations(
const Simulator& simulator,
230 std::vector<double>& well_flux,
233 bool updateWellStateWithTHPTargetProd(
const Simulator& simulator,
237 enum class IndividualOrGroup { Individual, Group, Both };
238 bool updateWellControl(
const Simulator& simulator,
239 const IndividualOrGroup iog,
244 bool updateWellControlAndStatusLocalIteration(
const Simulator& simulator,
247 const Well::InjectionControls& inj_controls,
248 const Well::ProductionControls& prod_controls,
249 const double WQTotal,
251 const bool fixed_control =
false,
252 const bool fixed_status =
false);
254 virtual void updatePrimaryVariables(
const SummaryState& summary_state,
258 virtual void calculateExplicitQuantities(
const Simulator& simulator,
262 virtual void updateProductivityIndex(
const Simulator& simulator,
267 virtual double connectionDensity(
const int globalConnIdx,
268 const int openConnIdx)
const = 0;
277 virtual void addWellContributions(SparseMatrixAdapter&)
const = 0;
279 virtual void addWellPressureEquations(PressureMatrix& mat,
281 const int pressureVarIndex,
282 const bool use_well_weights,
285 void addCellRates(RateVector& rates,
int cellIdx)
const;
287 Scalar volumetricSurfaceRateForConnection(
int cellIdx,
int phaseIdx)
const;
291 void wellTesting(
const Simulator& simulator,
292 const double simulation_time,
296 void checkWellOperability(
const Simulator& simulator,
300 bool gliftBeginTimeStepWellTestIterateWellEquations(
301 const Simulator& simulator,
307 void gliftBeginTimeStepWellTestUpdateALQ(
const Simulator& simulator,
313 void updateWellOperability(
const Simulator& simulator,
317 bool updateWellOperabilityFromWellEq(
const Simulator& simulator,
322 virtual void updateWaterThroughput(
const double dt,
WellState& well_state)
const = 0;
336 void solveWellEquation(
const Simulator& simulator,
341 const std::vector<RateVector>& connectionRates()
const
343 return connectionRates_;
346 virtual std::vector<double> getPrimaryVars()
const
351 virtual int setPrimaryVars(std::vector<double>::const_iterator)
356 std::vector<double> wellIndex(
const int perf,
const IntensiveQuantities& intQuants,
const double trans_mult,
const SingleWellState& ws)
const;
358 void updateConnectionDFactor(
const Simulator& simulator, SingleWellState& ws)
const;
360 void updateConnectionTransmissibilityFactor(
const Simulator& simulator, SingleWellState& ws)
const;
365 const ModelParameters& param_;
366 std::vector<RateVector> connectionRates_;
367 std::vector< Scalar > B_avg_;
368 bool changed_to_stopped_this_step_ =
false;
369 bool thp_update_iterations =
false;
371 double wpolymer()
const;
373 double wfoam()
const;
375 double wsalt()
const;
377 double wmicrobes()
const;
379 double woxygen()
const;
381 double wurea()
const;
383 virtual double getRefDensity()
const = 0;
386 const std::vector<double>& compFrac()
const;
388 std::vector<double> initialWellRateFractions(
const Simulator& simulator,
389 const WellState& well_state)
const;
392 virtual void checkOperabilityUnderBHPLimit(
const WellState& well_state,
393 const Simulator& simulator,
394 DeferredLogger& deferred_logger) = 0;
397 virtual void checkOperabilityUnderTHPLimit(
const Simulator& simulator,
398 const WellState& well_state,
399 DeferredLogger& deferred_logger) = 0;
401 virtual void updateIPR(
const Simulator& simulator,
402 DeferredLogger& deferred_logger)
const=0;
404 virtual void assembleWellEqWithoutIteration(
const Simulator& simulator,
406 const WellInjectionControls& inj_controls,
407 const WellProductionControls& prod_controls,
408 WellState& well_state,
409 const GroupState& group_state,
410 DeferredLogger& deferred_logger) = 0;
413 virtual bool iterateWellEqWithControl(
const Simulator& simulator,
415 const WellInjectionControls& inj_controls,
416 const WellProductionControls& prod_controls,
417 WellState& well_state,
418 const GroupState& group_state,
419 DeferredLogger& deferred_logger) = 0;
421 virtual bool iterateWellEqWithSwitching(
const Simulator& simulator,
423 const WellInjectionControls& inj_controls,
424 const WellProductionControls& prod_controls,
425 WellState& well_state,
426 const GroupState& group_state,
427 DeferredLogger& deferred_logger,
428 const bool fixed_control =
false,
429 const bool fixed_status =
false) = 0;
431 virtual void updateIPRImplicit(
const Simulator& simulator,
432 WellState& well_state,
433 DeferredLogger& deferred_logger) = 0;
435 bool iterateWellEquations(
const Simulator& simulator,
437 WellState& well_state,
438 const GroupState& group_state,
439 DeferredLogger& deferred_logger);
441 bool solveWellWithTHPConstraint(
const Simulator& simulator,
443 const Well::InjectionControls& inj_controls,
444 const Well::ProductionControls& prod_controls,
445 WellState& well_state,
446 const GroupState& group_state,
447 DeferredLogger& deferred_logger);
449 std::optional<double> estimateOperableBhp(
const Simulator& simulator,
451 WellState& well_state,
452 const SummaryState& summary_state,
453 DeferredLogger& deferred_logger);
455 bool solveWellWithBhp(
const Simulator& simulator,
458 WellState& well_state,
459 DeferredLogger& deferred_logger);
461 bool solveWellWithZeroRate(
const Simulator& simulator,
463 WellState& well_state,
464 DeferredLogger& deferred_logger);
466 bool solveWellForTesting(
const Simulator& simulator,
467 WellState& well_state,
468 const GroupState& group_state,
469 DeferredLogger& deferred_logger);
471 Eval getPerfCellPressure(
const FluidState& fs)
const;
474 template<
class Value,
class Callback>
475 void getMobility(
const Simulator& simulator,
477 std::vector<Value>& mob,
478 Callback& extendEval,
479 [[maybe_unused]] DeferredLogger& deferred_logger)
const;
481 void computeConnLevelProdInd(
const FluidState& fs,
482 const std::function<
double(
const double)>& connPICalc,
483 const std::vector<Scalar>& mobility,
484 double* connPI)
const;
486 void computeConnLevelInjInd(
const FluidState& fs,
487 const Phase preferred_phase,
488 const std::function<
double(
const double)>& connIICalc,
489 const std::vector<Scalar>& mobility,
491 DeferredLogger& deferred_logger)
const;
493 double computeConnectionDFactor(
const int perf,
494 const IntensiveQuantities& intQuants,
495 const SingleWellState& ws)
const;