74class WellInterface :
public WellInterfaceIndices<GetPropType<TypeTag, Properties::FluidSystem>,
75 GetPropType<TypeTag, Properties::Indices>>
77 using Base = WellInterfaceIndices<GetPropType<TypeTag, Properties::FluidSystem>,
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 =
103 typename WellInterfaceFluidSystem<FluidSystem>::RateConverterType;
109 using ModelParameters =
typename Base::ModelParameters;
124 static constexpr bool has_micp = Indices::enableMICP;
127 using FluidState = BlackOilFluidState<Eval,
131 Indices::compositionSwitchIdx >= 0,
136 Indices::numPhases >;
141 const ModelParameters& param,
142 const RateConverterType& rate_converter,
143 const int pvtRegionIdx,
144 const int num_conservation_quantities,
145 const int num_phases,
146 const int index_of_well,
152 virtual void init(
const std::vector<Scalar>& depth_arg,
153 const Scalar gravity_arg,
154 const std::vector<Scalar>& B_avg,
155 const bool changed_to_open_this_step);
158 const WellStateType& well_state,
159 const std::vector<Scalar>& B_avg,
161 const bool relax_tolerance)
const = 0;
163 virtual void solveEqAndUpdateWellState(
const Simulator& simulator,
164 WellStateType& well_state,
167 void assembleWellEq(
const Simulator& simulator,
169 WellStateType& well_state,
173 void assembleWellEqWithoutIteration(
const Simulator& simulator,
175 WellStateType& well_state,
180 void prepareWellBeforeAssembling(
const Simulator& simulator,
182 WellStateType& well_state,
186 virtual void computeWellRatesWithBhp(
const Simulator& ebosSimulator,
188 std::vector<Scalar>& well_flux,
191 virtual std::optional<Scalar>
192 computeBhpAtThpLimitProdWithAlq(
const Simulator& ebos_simulator,
193 const SummaryState& summary_state,
194 const Scalar alq_value,
196 bool iterate_if_no_solution)
const = 0;
202 WellStateType& well_state,
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,
213 const WellStateType& well_state,
214 std::vector<Scalar>& well_potentials,
217 virtual void updateWellStateWithTarget(
const Simulator& simulator,
219 WellStateType& well_state,
222 virtual void scaleSegmentRatesAndPressure(WellStateType& well_state)
const;
224 virtual void computeWellRatesWithBhpIterations(
const Simulator& simulator,
226 std::vector<Scalar>& well_flux,
229 bool wellUnderZeroRateTarget(
const Simulator& simulator,
230 const WellStateType& well_state,
233 bool wellUnderZeroGroupRateTarget(
const Simulator& simulator,
234 const WellStateType& well_state,
236 std::optional<bool> group_control = std::nullopt)
const;
238 bool stoppedOrZeroRateTarget(
const Simulator& simulator,
239 const WellStateType& well_state,
242 bool updateWellStateWithTHPTargetProd(
const Simulator& simulator,
243 WellStateType& well_state,
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,
256 const Well::InjectionControls& inj_controls,
257 const Well::ProductionControls& prod_controls,
258 const Scalar WQTotal,
260 const bool fixed_control =
false,
261 const bool fixed_status =
false);
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,
282 const bool use_well_weights,
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,
292 const double simulation_time,
293 WellStateType& well_state,
295 WellTestState& welltest_state,
296 GLiftEclWells& ecl_well_map,
297 std::map<std::string, double>& open_times,
300 void checkWellOperability(
const Simulator& simulator,
301 const WellStateType& well_state,
304 void gliftBeginTimeStepWellTestUpdateALQ(
const Simulator& simulator,
305 WellStateType& well_state,
307 GLiftEclWells& ecl_well_map,
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>
334 WellStateType& well_state,
337 void solveWellEquation(
const Simulator& simulator,
338 WellStateType& well_state,
342 const std::vector<RateVector>& connectionRates()
const
344 return connectionRates_;
347 std::vector<Scalar> wellIndex(
const int perf,
348 const IntensiveQuantities& intQuants,
349 const Scalar trans_mult,
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,
360 const WellInjectionControls& inj_controls,
361 const WellProductionControls& prod_controls,
362 WellStateType& well_state,
365 const bool fixed_control =
false,
366 const bool fixed_status =
false) = 0;
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;
385 initialWellRateFractions(
const Simulator& ebosSimulator,
386 const WellStateType& well_state)
const;
389 virtual void checkOperabilityUnderBHPLimit(
const WellStateType& well_state,
390 const Simulator& simulator,
391 DeferredLogger& deferred_logger) = 0;
394 virtual void checkOperabilityUnderTHPLimit(
const Simulator& simulator,
395 const WellStateType& well_state,
396 DeferredLogger& deferred_logger) = 0;
398 virtual void updateIPR(
const Simulator& simulator,
399 DeferredLogger& deferred_logger)
const = 0;
401 virtual void assembleWellEqWithoutIteration(
const Simulator& simulator,
403 const WellInjectionControls& inj_controls,
404 const WellProductionControls& prod_controls,
405 WellStateType& well_state,
406 const GroupState<Scalar>& group_state,
407 DeferredLogger& deferred_logger) = 0;
410 virtual bool iterateWellEqWithControl(
const Simulator& simulator,
412 const WellInjectionControls& inj_controls,
413 const WellProductionControls& prod_controls,
414 WellStateType& well_state,
415 const GroupState<Scalar>& group_state,
416 DeferredLogger& deferred_logger) = 0;
418 virtual void updateIPRImplicit(
const Simulator& simulator,
419 WellStateType& well_state,
420 DeferredLogger& deferred_logger) = 0;
422 bool iterateWellEquations(
const Simulator& simulator,
424 WellStateType& well_state,
425 const GroupState<Scalar>& group_state,
426 DeferredLogger& deferred_logger);
428 bool solveWellWithOperabilityCheck(
const Simulator& simulator,
430 const Well::InjectionControls& inj_controls,
431 const Well::ProductionControls& prod_controls,
432 WellStateType& well_state,
433 const GroupState<Scalar>& group_state,
434 DeferredLogger& deferred_logger);
436 std::optional<Scalar>
437 estimateOperableBhp(
const Simulator& ebos_simulator,
439 WellStateType& well_state,
440 const SummaryState& summary_state,
441 DeferredLogger& deferred_logger);
443 bool solveWellWithBhp(
const Simulator& simulator,
446 WellStateType& well_state,
447 DeferredLogger& deferred_logger);
449 bool solveWellWithZeroRate(
const Simulator& simulator,
451 WellStateType& well_state,
452 DeferredLogger& deferred_logger);
454 bool solveWellForTesting(
const Simulator& simulator,
455 WellStateType& well_state,
456 const GroupState<Scalar>& group_state,
457 DeferredLogger& deferred_logger);
460 template<
class GasLiftSingleWell>
461 std::unique_ptr<GasLiftSingleWell> initializeGliftWellTest_(
const Simulator& simulator,
462 WellStateType& well_state,
463 const GroupState<Scalar>& group_state,
464 GLiftEclWells& ecl_well_map,
465 DeferredLogger& deferred_logger);
467 Eval getPerfCellPressure(
const FluidState& fs)
const;
470 template<
class Value,
class Callback>
471 void getMobility(
const Simulator& simulator,
472 const int local_perf_index,
473 std::vector<Value>& mob,
474 Callback& extendEval,
475 [[maybe_unused]] DeferredLogger& deferred_logger)
const;
477 void computeConnLevelProdInd(
const FluidState& fs,
478 const std::function<Scalar(
const Scalar)>& connPICalc,
479 const std::vector<Scalar>& mobility,
480 Scalar* connPI)
const;
482 void computeConnLevelInjInd(
const FluidState& fs,
483 const Phase preferred_phase,
484 const std::function<Scalar(
const Scalar)>& connIICalc,
485 const std::vector<Scalar>& mobility,
487 DeferredLogger& deferred_logger)
const;
489 Scalar computeConnectionDFactor(
const int perf,
490 const IntensiveQuantities& intQuants,
491 const SingleWellStateType& ws)
const;