WellInterface.hpp
Go to the documentation of this file.
1/*
2 Copyright 2017 SINTEF Digital, Mathematics and Cybernetics.
3 Copyright 2017 Statoil ASA.
4 Copyright 2017 IRIS
5 Copyright 2019 Norce
6
7 This file is part of the Open Porous Media project (OPM).
8
9 OPM is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14 OPM is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with OPM. If not, see <http://www.gnu.org/licenses/>.
21*/
22
23#ifndef OPM_WELLINTERFACE_HEADER_INCLUDED
24#define OPM_WELLINTERFACE_HEADER_INCLUDED
25
26// NOTE: GasLiftSingleWell.hpp includes StandardWell.hpp which includes ourself
27// (WellInterface.hpp), so we need to forward declare GasLiftSingleWell
28// for it to be defined in this file. Similar for BlackoilWellModel
29namespace Opm {
30 template<typename TypeTag> class GasLiftSingleWell;
31 template<typename TypeTag> class BlackoilWellModel;
32}
33
34#include <opm/common/OpmLog/OpmLog.hpp>
35#include <opm/common/ErrorMacros.hpp>
36#include <opm/common/Exceptions.hpp>
37
38#include <opm/input/eclipse/Schedule/Well/WellTestState.hpp>
39
40#include <opm/material/fluidstates/BlackOilFluidState.hpp>
41
43
45
54
56
58
59#include <dune/common/fmatrix.hh>
60#include <dune/istl/bcrsmatrix.hh>
61#include <dune/istl/matrixmatrix.hh>
62
63#include <opm/material/densead/Evaluation.hpp>
64
65#include <vector>
66
67namespace Opm
68{
69
70class WellInjectionProperties;
71class WellProductionProperties;
72template<typename Scalar, typename IndexTraits> class WellGroupHelper;
73
74template<typename TypeTag>
75class WellInterface : public WellInterfaceIndices<GetPropType<TypeTag, Properties::FluidSystem>,
76 GetPropType<TypeTag, Properties::Indices>>
77{
80public:
85 using IndexTraits = typename FluidSystem::IndexTraitsType;
93
94 using VectorBlockType = Dune::FieldVector<Scalar, Indices::numEq>;
95 using MatrixBlockType = Dune::FieldMatrix<Scalar, Indices::numEq, Indices::numEq>;
96 using Eval = typename Base::Eval;
97 using BVector = Dune::BlockVector<VectorBlockType>;
98 using PressureMatrix = Dune::BCRSMatrix<Opm::MatrixBlock<Scalar, 1, 1>>;
99
103
106
110
112
113 static constexpr bool has_solvent = getPropValue<TypeTag, Properties::EnableSolvent>();
114 static constexpr bool has_zFraction = getPropValue<TypeTag, Properties::EnableExtbo>();
115 static constexpr bool has_polymer = getPropValue<TypeTag, Properties::EnablePolymer>();
116 static constexpr EnergyModules energyModuleType = getPropValue<TypeTag, Properties::EnergyModuleType>();
117 static constexpr bool has_energy = energyModuleType == EnergyModules::FullyImplicitThermal;
118
119 // flag for polymer molecular weight related
120 static constexpr bool has_polymermw = getPropValue<TypeTag, Properties::EnablePolymerMW>();
121 static constexpr bool has_foam = getPropValue<TypeTag, Properties::EnableFoam>();
122 static constexpr bool has_brine = getPropValue<TypeTag, Properties::EnableBrine>();
123 static constexpr bool has_watVapor = getPropValue<TypeTag, Properties::EnableVapwat>();
124 static constexpr bool has_disgas_in_water = getPropValue<TypeTag, Properties::EnableDisgasInWater>();
125 static constexpr bool has_saltPrecip = getPropValue<TypeTag, Properties::EnableSaltPrecipitation>();
126 static constexpr bool has_bioeffects = getPropValue<TypeTag, Properties::EnableBioeffects>();
127 static constexpr bool has_micp = Indices::enableMICP;
128
129 // For the conversion between the surface volume rate and reservoir voidage rate
130 using FluidState = BlackOilFluidState<Eval,
132 energyModuleType == EnergyModules::ConstantTemperature,
133 (energyModuleType == EnergyModules::FullyImplicitThermal || energyModuleType == EnergyModules::SequentialImplicitThermal),
134 Indices::compositionSwitchIdx >= 0,
136 has_brine,
139 Indices::numPhases >;
141 WellInterface(const Well& well,
142 const ParallelWellInfo<Scalar>& pw_info,
143 const int time_step,
144 const ModelParameters& param,
145 const RateConverterType& rate_converter,
146 const int pvtRegionIdx,
147 const int num_conservation_quantities,
148 const int num_phases,
149 const int index_of_well,
150 const std::vector<PerforationData<Scalar>>& perf_data);
151
153 virtual ~WellInterface() = default;
154
155 virtual void init(const std::vector<Scalar>& depth_arg,
156 const Scalar gravity_arg,
157 const std::vector<Scalar>& B_avg,
158 const bool changed_to_open_this_step);
159
161 const WellStateType& well_state,
162 const std::vector<Scalar>& B_avg,
163 DeferredLogger& deferred_logger,
164 const bool relax_tolerance) const = 0;
165
166 virtual void solveEqAndUpdateWellState(const Simulator& simulator,
167 WellStateType& well_state,
168 DeferredLogger& deferred_logger) = 0;
169
170 void assembleWellEq(const Simulator& simulator,
171 const double dt,
172 const WellGroupHelperType& wgHelper,
173 WellStateType& well_state,
174 DeferredLogger& deferred_logger);
175
176 void assembleWellEqWithoutIteration(const Simulator& simulator,
177 const WellGroupHelperType& wgHelper,
178 const double dt,
179 WellStateType& well_state,
180 DeferredLogger& deferred_logger,
181 const bool solving_with_zero_rate);
182
183 // TODO: better name or further refactoring the function to make it more clear
184 void prepareWellBeforeAssembling(const Simulator& simulator,
185 const double dt,
186 const WellGroupHelperType& wgHelper,
187 WellStateType& well_state,
188 DeferredLogger& deferred_logger);
189
190 virtual void computeWellRatesWithBhp(const Simulator& ebosSimulator,
191 const Scalar& bhp,
192 std::vector<Scalar>& well_flux,
193 DeferredLogger& deferred_logger) const = 0;
194
195 virtual std::optional<Scalar>
197 const WellGroupHelperType& wgHelper,
198 const SummaryState& summary_state,
199 const Scalar alq_value,
200 DeferredLogger& deferred_logger,
201 bool iterate_if_no_solution) const = 0;
202
206 const BVector& x,
207 WellStateType& well_state,
208 DeferredLogger& deferred_logger) = 0;
209
211 virtual void apply(const BVector& x, BVector& Ax) const = 0;
212
214 virtual void apply(BVector& r) const = 0;
215
216 // TODO: before we decide to put more information under mutable, this function is not const
217 virtual void computeWellPotentials(const Simulator& simulator,
218 const WellStateType& well_state,
219 const WellGroupHelperType& wgHelper,
220 std::vector<Scalar>& well_potentials,
221 DeferredLogger& deferred_logger) = 0;
222
223 virtual void updateWellStateWithTarget(const Simulator& simulator,
224 const WellGroupHelperType& wgHelper,
225 WellStateType& well_state,
226 DeferredLogger& deferred_logger) const;
227
228 virtual void scaleSegmentRatesAndPressure(WellStateType& well_state) const;
229
230 virtual void computeWellRatesWithBhpIterations(const Simulator& simulator,
231 const Scalar& bhp,
232 const WellGroupHelperType& wgHelper,
233 std::vector<Scalar>& well_flux,
234 DeferredLogger& deferred_logger) const = 0;
235
236 bool wellUnderZeroRateTarget(const Simulator& simulator,
237 const WellStateType& well_state,
238 DeferredLogger& deferred_logger) const;
239
240 bool wellUnderZeroGroupRateTarget(const Simulator& simulator,
241 const WellStateType& well_state,
242 DeferredLogger& deferred_logger,
243 std::optional<bool> group_control = std::nullopt) const;
244
245 bool stoppedOrZeroRateTarget(const Simulator& simulator,
246 const WellStateType& well_state,
247 DeferredLogger& deferred_logger) const;
248
249 bool updateWellStateWithTHPTargetProd(const Simulator& simulator,
250 WellStateType& well_state,
251 const WellGroupHelperType& wgHelper,
252 DeferredLogger& deferred_logger) const;
253
254 enum class IndividualOrGroup { Individual, Group, Both };
255 bool updateWellControl(const Simulator& simulator,
256 const IndividualOrGroup iog,
257 const WellGroupHelperType& wgHelper,
258 WellStateType& well_state,
259 DeferredLogger& deferred_logger) /* const */;
260
262 const WellGroupHelperType& wgHelper,
263 const Well::InjectionControls& inj_controls,
264 const Well::ProductionControls& prod_controls,
265 const Scalar WQTotal,
266 WellStateType& well_state,
267 DeferredLogger& deferred_logger,
268 const bool fixed_control,
269 const bool fixed_status,
270 const bool solving_with_zero_rate);
271
272 virtual void updatePrimaryVariables(const Simulator& simulator,
273 const WellStateType& well_state,
274 DeferredLogger& deferred_logger) = 0;
275
276 virtual void calculateExplicitQuantities(const Simulator& simulator,
277 const WellStateType& well_state,
278 DeferredLogger& deferred_logger) = 0; // should be const?
279
280 virtual void updateProductivityIndex(const Simulator& simulator,
281 const WellProdIndexCalculator<Scalar>& wellPICalc,
282 WellStateType& well_state,
283 DeferredLogger& deferred_logger) const = 0;
284
285 // Add well contributions to matrix
287
289 const BVector& x,
290 const int pressureVarIndex,
291 const bool use_well_weights,
292 const WellStateType& well_state) const = 0;
293
294 void addCellRates(std::map<int, RateVector>& cellRates_) const;
295
296 Scalar volumetricSurfaceRateForConnection(int cellIdx, int phaseIdx) const;
297
298 // TODO: theoretically, it should be a const function
299 // Simulator is not const is because that assembleWellEq is non-const Simulator
300 void wellTesting(const Simulator& simulator,
301 const double simulation_time,
302 const WellGroupHelperType& wgHelper,
303 WellStateType& well_state,
304 WellTestState& welltest_state,
305 GLiftEclWells& ecl_well_map,
306 std::map<std::string, double>& open_times,
307 DeferredLogger& deferred_logger);
308
309 void checkWellOperability(const Simulator& simulator,
310 const WellStateType& well_state,
311 const WellGroupHelperType& wgHelper,
312 DeferredLogger& deferred_logger);
313
315 WellStateType& well_state,
316 const GroupState<Scalar>& group_state,
317 GLiftEclWells& ecl_well_map,
318 DeferredLogger& deferred_logger);
319
320 // check whether the well is operable under the current reservoir condition
321 // mostly related to BHP limit and THP limit
322 void updateWellOperability(const Simulator& simulator,
323 const WellStateType& well_state,
324 const WellGroupHelperType& wgHelper,
325 DeferredLogger& deferred_logger);
326
327 bool updateWellOperabilityFromWellEq(const Simulator& simulator,
328 const WellGroupHelperType& wgHelper,
329 DeferredLogger& deferred_logger);
330
331 // update perforation water throughput based on solved water rate
332 virtual void updateWaterThroughput(const double dt,
333 WellStateType& well_state) const = 0;
334
337 virtual std::vector<Scalar>
339 DeferredLogger& deferred_logger) const = 0;
340
344 void initializeProducerWellState(const Simulator& simulator,
345 WellStateType& well_state,
346 DeferredLogger& deferred_logger) const;
347
348 void solveWellEquation(const Simulator& simulator,
349 const WellGroupHelperType& wgHelper,
350 WellStateType& well_state,
351 DeferredLogger& deferred_logger);
352
353 const std::vector<RateVector>& connectionRates() const
354 {
355 return connectionRates_;
356 }
357
358 void updateConnectionDFactor(const Simulator& simulator,
359 SingleWellStateType& ws) const;
360
362 SingleWellStateType& ws) const;
363
364 virtual bool iterateWellEqWithSwitching(const Simulator& simulator,
365 const double dt,
366 const WellInjectionControls& inj_controls,
367 const WellProductionControls& prod_controls,
368 const WellGroupHelperType& wgHelper,
369 WellStateType& well_state,
370 DeferredLogger& deferred_logger,
371 const bool fixed_control,
372 const bool fixed_status,
373 const bool solving_with_zero_rate) = 0;
374protected:
375 // simulation parameters
376 std::vector<RateVector> connectionRates_;
377 std::vector<Scalar> B_avg_;
381
382 Scalar wpolymer() const;
383 Scalar wfoam() const;
384 Scalar wsalt() const;
385 Scalar wmicrobes() const;
386 Scalar woxygen() const;
387 Scalar wurea() const;
388
389 virtual Scalar getRefDensity() const = 0;
390
391 std::vector<Scalar>
392 initialWellRateFractions(const Simulator& ebosSimulator,
393 const WellStateType& well_state) const;
394
395 // check whether the well is operable under BHP limit with current reservoir condition
396 virtual void checkOperabilityUnderBHPLimit(const WellStateType& well_state,
397 const Simulator& simulator,
398 DeferredLogger& deferred_logger) = 0;
399
400 // check whether the well is operable under THP limit with current reservoir condition
401 virtual void checkOperabilityUnderTHPLimit(const Simulator& simulator,
402 const WellStateType& well_state,
403 const WellGroupHelperType& wgHelper,
404 DeferredLogger& deferred_logger) = 0;
405
406 virtual void updateIPR(const Simulator& simulator,
407 DeferredLogger& deferred_logger) const = 0;
408
409 virtual void assembleWellEqWithoutIteration(const Simulator& simulator,
410 const WellGroupHelperType& wgHelper,
411 const double dt,
412 const WellInjectionControls& inj_controls,
413 const WellProductionControls& prod_controls,
414 WellStateType& well_state,
415 DeferredLogger& deferred_logger,
416 const bool solving_with_zero_rate) = 0;
417
418 // iterate well equations with the specified control until converged
419 virtual bool iterateWellEqWithControl(const Simulator& simulator,
420 const double dt,
421 const WellInjectionControls& inj_controls,
422 const WellProductionControls& prod_controls,
423 const WellGroupHelperType& wgHelper,
424 WellStateType& well_state,
425 DeferredLogger& deferred_logger) = 0;
426
427 virtual void updateIPRImplicit(const Simulator& simulator,
428 const WellGroupHelperType& wgHelper,
429 WellStateType& well_state,
430 DeferredLogger& deferred_logger) = 0;
431
432 bool iterateWellEquations(const Simulator& simulator,
433 const double dt,
434 const WellGroupHelperType& wgHelper,
435 WellStateType& well_state,
436 DeferredLogger& deferred_logger);
437
438 bool solveWellWithOperabilityCheck(const Simulator& simulator,
439 const double dt,
440 const Well::InjectionControls& inj_controls,
441 const Well::ProductionControls& prod_controls,
442 const WellGroupHelperType& wgHelper,
443 WellStateType& well_state,
444 DeferredLogger& deferred_logger);
445
446 std::optional<Scalar>
447 estimateOperableBhp(const Simulator& ebos_simulator,
448 const double dt,
449 const WellGroupHelperType& wgHelper,
450 const SummaryState& summary_state,
451 WellStateType& well_state,
452 DeferredLogger& deferred_logger);
453
454 bool solveWellWithBhp(const Simulator& simulator,
455 const double dt,
456 const Scalar bhp,
457 const WellGroupHelperType& wgHelper,
458 WellStateType& well_state,
459 DeferredLogger& deferred_logger);
460
461 bool solveWellWithZeroRate(const Simulator& simulator,
462 const double dt,
463 const WellGroupHelperType& wgHelper,
464 WellStateType& well_state,
465 DeferredLogger& deferred_logger);
466
467 bool solveWellForTesting(const Simulator& simulator,
468 const WellGroupHelperType& wgHelper,
469 WellStateType& well_state,
470 DeferredLogger& deferred_logger);
471
472
473 template<class GasLiftSingleWell>
474 std::unique_ptr<GasLiftSingleWell> initializeGliftWellTest_(const Simulator& simulator,
475 WellStateType& well_state,
476 const GroupState<Scalar>& group_state,
477 GLiftEclWells& ecl_well_map,
478 DeferredLogger& deferred_logger);
479
480 Eval getPerfCellPressure(const FluidState& fs) const;
481
482 // get the transmissibility multiplier for specific perforation
483 template<class Value, class Callback>
484 void getTransMult(Value& trans_mult,
485 const Simulator& simulator,
486 const int cell_idx,
487 Callback& extendEval) const;
488
489 // get the well transmissibility for specific perforation
490 template<class Value>
491 void getTw(std::vector<Value>& wi,
492 const int perf,
493 const IntensiveQuantities& intQuants,
494 const Value& trans_mult,
495 const SingleWellStateType& ws) const;
496
497 // get the mobility for specific perforation
498 template<class Value, class Callback>
499 void getMobility(const Simulator& simulator,
500 const int local_perf_index,
501 std::vector<Value>& mob,
502 Callback& extendEval,
503 [[maybe_unused]] DeferredLogger& deferred_logger) const;
504
505 void computeConnLevelProdInd(const FluidState& fs,
506 const std::function<Scalar(const Scalar)>& connPICalc,
507 const std::vector<Scalar>& mobility,
508 Scalar* connPI) const;
509
510 void computeConnLevelInjInd(const FluidState& fs,
511 const Phase preferred_phase,
512 const std::function<Scalar(const Scalar)>& connIICalc,
513 const std::vector<Scalar>& mobility,
514 Scalar* connII,
515 DeferredLogger& deferred_logger) const;
516
517 Scalar computeConnectionDFactor(const int perf,
518 const IntensiveQuantities& intQuants,
519 const SingleWellStateType& ws) const;
520};
521
522} // namespace Opm
523
524#include "WellInterface_impl.hpp"
525
526#endif // OPM_WELLINTERFACE_HEADER_INCLUDED
Declares the properties required by the black oil model.
Definition: ConvergenceReport.hpp:38
Definition: DeferredLogger.hpp:57
std::map< std::string, std::pair< const Well *, int > > GLiftEclWells
Definition: GasLiftGroupInfo.hpp:64
Definition: GasLiftSingleWell.hpp:39
Definition: GroupState.hpp:41
Class encapsulating some information about parallel wells.
Definition: ParallelWellInfo.hpp:198
Definition: RateConverter.hpp:70
Manages the initializing and running of time dependent problems.
Definition: simulator.hh:84
Definition: SingleWellState.hpp:43
Definition: WellGroupHelper.hpp:59
Definition: WellInterfaceFluidSystem.hpp:50
static constexpr int Oil
Definition: WellInterfaceFluidSystem.hpp:65
static constexpr int Water
Definition: WellInterfaceFluidSystem.hpp:64
static constexpr int Gas
Definition: WellInterfaceFluidSystem.hpp:66
int pvtRegionIdx() const
Definition: WellInterfaceGeneric.hpp:130
Definition: WellInterfaceIndices.hpp:34
DenseAd::Evaluation< Scalar, Indices::numDerivatives > Eval
Definition: WellInterfaceIndices.hpp:40
typename WellInterfaceFluidSystem< GetPropType< TypeTag, Properties::FluidSystem > >::ModelParameters ModelParameters
Definition: WellInterfaceIndices.hpp:41
Definition: WellInterface.hpp:77
virtual std::vector< Scalar > computeCurrentWellRates(const Simulator &simulator, DeferredLogger &deferred_logger) const =0
std::optional< Scalar > estimateOperableBhp(const Simulator &ebos_simulator, const double dt, const WellGroupHelperType &wgHelper, const SummaryState &summary_state, WellStateType &well_state, DeferredLogger &deferred_logger)
Definition: WellInterface_impl.hpp:709
virtual void assembleWellEqWithoutIteration(const Simulator &simulator, const WellGroupHelperType &wgHelper, const double dt, const WellInjectionControls &inj_controls, const WellProductionControls &prod_controls, WellStateType &well_state, DeferredLogger &deferred_logger, const bool solving_with_zero_rate)=0
Scalar woxygen() const
Definition: WellInterface_impl.hpp:165
BlackOilFluidState< Eval, FluidSystem, energyModuleType==EnergyModules::ConstantTemperature,(energyModuleType==EnergyModules::FullyImplicitThermal||energyModuleType==EnergyModules::SequentialImplicitThermal), Indices::compositionSwitchIdx >=0, has_watVapor, has_brine, has_saltPrecip, has_disgas_in_water, Indices::numPhases > FluidState
Definition: WellInterface.hpp:139
static constexpr bool has_brine
Definition: WellInterface.hpp:122
IndividualOrGroup
Definition: WellInterface.hpp:254
GetPropType< TypeTag, Properties::Simulator > Simulator
Definition: WellInterface.hpp:82
bool updateWellOperabilityFromWellEq(const Simulator &simulator, const WellGroupHelperType &wgHelper, DeferredLogger &deferred_logger)
Definition: WellInterface_impl.hpp:1272
virtual void updateWellStateWithTarget(const Simulator &simulator, const WellGroupHelperType &wgHelper, WellStateType &well_state, DeferredLogger &deferred_logger) const
Definition: WellInterface_impl.hpp:1303
bool updateWellControlAndStatusLocalIteration(const Simulator &simulator, const WellGroupHelperType &wgHelper, const Well::InjectionControls &inj_controls, const Well::ProductionControls &prod_controls, const Scalar WQTotal, WellStateType &well_state, DeferredLogger &deferred_logger, const bool fixed_control, const bool fixed_status, const bool solving_with_zero_rate)
Definition: WellInterface_impl.hpp:277
Scalar computeConnectionDFactor(const int perf, const IntensiveQuantities &intQuants, const SingleWellStateType &ws) const
Definition: WellInterface_impl.hpp:1984
virtual void computeWellRatesWithBhp(const Simulator &ebosSimulator, const Scalar &bhp, std::vector< Scalar > &well_flux, DeferredLogger &deferred_logger) const =0
virtual void addWellContributions(SparseMatrixAdapter &) const =0
typename WellInterfaceFluidSystem< FluidSystem >::RateConverterType RateConverterType
Definition: WellInterface.hpp:105
const std::vector< RateVector > & connectionRates() const
Definition: WellInterface.hpp:353
Scalar wfoam() const
Definition: WellInterface_impl.hpp:127
virtual void updateIPR(const Simulator &simulator, DeferredLogger &deferred_logger) const =0
void getTransMult(Value &trans_mult, const Simulator &simulator, const int cell_idx, Callback &extendEval) const
Definition: WellInterface_impl.hpp:2072
std::vector< RateVector > connectionRates_
Definition: WellInterface.hpp:376
void computeConnLevelProdInd(const FluidState &fs, const std::function< Scalar(const Scalar)> &connPICalc, const std::vector< Scalar > &mobility, Scalar *connPI) const
Definition: WellInterface_impl.hpp:2195
void assembleWellEqWithoutIteration(const Simulator &simulator, const WellGroupHelperType &wgHelper, const double dt, WellStateType &well_state, DeferredLogger &deferred_logger, const bool solving_with_zero_rate)
Definition: WellInterface_impl.hpp:964
bool solveWellForTesting(const Simulator &simulator, const WellGroupHelperType &wgHelper, WellStateType &well_state, DeferredLogger &deferred_logger)
Definition: WellInterface_impl.hpp:830
Dune::BCRSMatrix< Opm::MatrixBlock< Scalar, 1, 1 > > PressureMatrix
Definition: WellInterface.hpp:98
bool solveWellWithBhp(const Simulator &simulator, const double dt, const Scalar bhp, const WellGroupHelperType &wgHelper, WellStateType &well_state, DeferredLogger &deferred_logger)
Definition: WellInterface_impl.hpp:747
void gliftBeginTimeStepWellTestUpdateALQ(const Simulator &simulator, WellStateType &well_state, const GroupState< Scalar > &group_state, GLiftEclWells &ecl_well_map, DeferredLogger &deferred_logger)
Definition: WellInterface_impl.hpp:1172
Scalar volumetricSurfaceRateForConnection(int cellIdx, int phaseIdx) const
Definition: WellInterface_impl.hpp:1124
virtual void init(const std::vector< Scalar > &depth_arg, const Scalar gravity_arg, const std::vector< Scalar > &B_avg, const bool changed_to_open_this_step)
Definition: WellInterface_impl.hpp:95
virtual void checkOperabilityUnderTHPLimit(const Simulator &simulator, const WellStateType &well_state, const WellGroupHelperType &wgHelper, DeferredLogger &deferred_logger)=0
void getTw(std::vector< Value > &wi, const int perf, const IntensiveQuantities &intQuants, const Value &trans_mult, const SingleWellStateType &ws) const
Definition: WellInterface_impl.hpp:1886
bool iterateWellEquations(const Simulator &simulator, const double dt, const WellGroupHelperType &wgHelper, WellStateType &well_state, DeferredLogger &deferred_logger)
Definition: WellInterface_impl.hpp:521
void getMobility(const Simulator &simulator, const int local_perf_index, std::vector< Value > &mob, Callback &extendEval, DeferredLogger &deferred_logger) const
Definition: WellInterface_impl.hpp:2085
void solveWellEquation(const Simulator &simulator, const WellGroupHelperType &wgHelper, WellStateType &well_state, DeferredLogger &deferred_logger)
Definition: WellInterface_impl.hpp:885
void assembleWellEq(const Simulator &simulator, const double dt, const WellGroupHelperType &wgHelper, WellStateType &well_state, DeferredLogger &deferred_logger)
Definition: WellInterface_impl.hpp:947
virtual void apply(const BVector &x, BVector &Ax) const =0
Ax = Ax - C D^-1 B x.
GetPropType< TypeTag, Properties::IntensiveQuantities > IntensiveQuantities
Definition: WellInterface.hpp:87
virtual bool iterateWellEqWithSwitching(const Simulator &simulator, const double dt, const WellInjectionControls &inj_controls, const WellProductionControls &prod_controls, const WellGroupHelperType &wgHelper, WellStateType &well_state, DeferredLogger &deferred_logger, const bool fixed_control, const bool fixed_status, const bool solving_with_zero_rate)=0
virtual void computeWellPotentials(const Simulator &simulator, const WellStateType &well_state, const WellGroupHelperType &wgHelper, std::vector< Scalar > &well_potentials, DeferredLogger &deferred_logger)=0
GetPropType< TypeTag, Properties::Scalar > Scalar
Definition: WellInterface.hpp:83
std::vector< Scalar > initialWellRateFractions(const Simulator &ebosSimulator, const WellStateType &well_state) const
Definition: WellInterface_impl.hpp:1748
static constexpr bool has_watVapor
Definition: WellInterface.hpp:123
void updateConnectionDFactor(const Simulator &simulator, SingleWellStateType &ws) const
Definition: WellInterface_impl.hpp:1964
virtual void updateWaterThroughput(const double dt, WellStateType &well_state) const =0
GetPropType< TypeTag, Properties::MaterialLaw > MaterialLaw
Definition: WellInterface.hpp:88
virtual Scalar getRefDensity() const =0
typename FluidSystem::IndexTraitsType IndexTraits
Definition: WellInterface.hpp:85
Eval getPerfCellPressure(const FluidState &fs) const
Definition: WellInterface_impl.hpp:2057
Dune::BlockVector< VectorBlockType > BVector
Definition: WellInterface.hpp:97
void initializeProducerWellState(const Simulator &simulator, WellStateType &well_state, DeferredLogger &deferred_logger) const
Definition: WellInterface_impl.hpp:1798
std::vector< Scalar > B_avg_
Definition: WellInterface.hpp:377
static constexpr bool has_bioeffects
Definition: WellInterface.hpp:126
bool changed_to_stopped_this_step_
Definition: WellInterface.hpp:378
static constexpr bool has_polymermw
Definition: WellInterface.hpp:120
virtual void calculateExplicitQuantities(const Simulator &simulator, const WellStateType &well_state, DeferredLogger &deferred_logger)=0
virtual bool iterateWellEqWithControl(const Simulator &simulator, const double dt, const WellInjectionControls &inj_controls, const WellProductionControls &prod_controls, const WellGroupHelperType &wgHelper, WellStateType &well_state, DeferredLogger &deferred_logger)=0
void addCellRates(std::map< int, RateVector > &cellRates_) const
Definition: WellInterface_impl.hpp:1105
static constexpr bool has_polymer
Definition: WellInterface.hpp:115
virtual void apply(BVector &r) const =0
r = r - C D^-1 Rw
GetPropType< TypeTag, Properties::Grid > Grid
Definition: WellInterface.hpp:81
bool wellUnderZeroGroupRateTarget(const Simulator &simulator, const WellStateType &well_state, DeferredLogger &deferred_logger, std::optional< bool > group_control=std::nullopt) const
Definition: WellInterface_impl.hpp:1716
virtual ~WellInterface()=default
Virtual destructor.
typename Base::ModelParameters ModelParameters
Definition: WellInterface.hpp:111
virtual void updatePrimaryVariables(const Simulator &simulator, const WellStateType &well_state, DeferredLogger &deferred_logger)=0
GetPropType< TypeTag, Properties::FluidSystem > FluidSystem
Definition: WellInterface.hpp:84
static constexpr bool has_solvent
Definition: WellInterface.hpp:113
static constexpr bool has_disgas_in_water
Definition: WellInterface.hpp:124
static constexpr bool has_saltPrecip
Definition: WellInterface.hpp:125
virtual void checkOperabilityUnderBHPLimit(const WellStateType &well_state, const Simulator &simulator, DeferredLogger &deferred_logger)=0
WellGroupHelper< Scalar, IndexTraits > WellGroupHelperType
Definition: WellInterface.hpp:102
static constexpr bool has_foam
Definition: WellInterface.hpp:121
GetPropType< TypeTag, Properties::RateVector > RateVector
Definition: WellInterface.hpp:90
virtual void recoverWellSolutionAndUpdateWellState(const Simulator &simulator, const BVector &x, WellStateType &well_state, DeferredLogger &deferred_logger)=0
void updateConnectionTransmissibilityFactor(const Simulator &simulator, SingleWellStateType &ws) const
Definition: WellInterface_impl.hpp:2026
void computeConnLevelInjInd(const FluidState &fs, const Phase preferred_phase, const std::function< Scalar(const Scalar)> &connIICalc, const std::vector< Scalar > &mobility, Scalar *connII, DeferredLogger &deferred_logger) const
Definition: WellInterface_impl.hpp:2229
typename GasLiftGroupInfo< Scalar, IndexTraits >::GLiftEclWells GLiftEclWells
Definition: WellInterface.hpp:92
std::unique_ptr< GasLiftSingleWell > initializeGliftWellTest_(const Simulator &simulator, WellStateType &well_state, const GroupState< Scalar > &group_state, GLiftEclWells &ecl_well_map, DeferredLogger &deferred_logger)
Definition: WellInterface_impl.hpp:2263
virtual void addWellPressureEquations(PressureMatrix &mat, const BVector &x, const int pressureVarIndex, const bool use_well_weights, const WellStateType &well_state) const =0
int number_of_well_reopenings_
Definition: WellInterface.hpp:380
virtual void solveEqAndUpdateWellState(const Simulator &simulator, WellStateType &well_state, DeferredLogger &deferred_logger)=0
virtual void computeWellRatesWithBhpIterations(const Simulator &simulator, const Scalar &bhp, const WellGroupHelperType &wgHelper, std::vector< Scalar > &well_flux, DeferredLogger &deferred_logger) const =0
bool updateWellStateWithTHPTargetProd(const Simulator &simulator, WellStateType &well_state, const WellGroupHelperType &wgHelper, DeferredLogger &deferred_logger) const
Definition: WellInterface_impl.hpp:2163
Scalar wsalt() const
Definition: WellInterface_impl.hpp:141
static constexpr bool has_micp
Definition: WellInterface.hpp:127
Dune::FieldMatrix< Scalar, Indices::numEq, Indices::numEq > MatrixBlockType
Definition: WellInterface.hpp:95
virtual std::optional< Scalar > computeBhpAtThpLimitProdWithAlq(const Simulator &ebos_simulator, const WellGroupHelperType &wgHelper, const SummaryState &summary_state, const Scalar alq_value, DeferredLogger &deferred_logger, bool iterate_if_no_solution) const =0
typename Base::Eval Eval
Definition: WellInterface.hpp:96
bool solveWellWithZeroRate(const Simulator &simulator, const double dt, const WellGroupHelperType &wgHelper, WellStateType &well_state, DeferredLogger &deferred_logger)
Definition: WellInterface_impl.hpp:797
bool wellUnderZeroRateTarget(const Simulator &simulator, const WellStateType &well_state, DeferredLogger &deferred_logger) const
Definition: WellInterface_impl.hpp:1698
virtual ConvergenceReport getWellConvergence(const Simulator &simulator, const WellStateType &well_state, const std::vector< Scalar > &B_avg, DeferredLogger &deferred_logger, const bool relax_tolerance) const =0
WellInterface(const Well &well, const ParallelWellInfo< Scalar > &pw_info, const int time_step, const ModelParameters &param, const RateConverterType &rate_converter, const int pvtRegionIdx, const int num_conservation_quantities, const int num_phases, const int index_of_well, const std::vector< PerforationData< Scalar > > &perf_data)
Constructor.
Definition: WellInterface_impl.hpp:58
virtual void updateIPRImplicit(const Simulator &simulator, const WellGroupHelperType &wgHelper, WellStateType &well_state, DeferredLogger &deferred_logger)=0
WellState< Scalar, IndexTraits > WellStateType
Definition: WellInterface.hpp:100
static constexpr bool has_energy
Definition: WellInterface.hpp:117
Scalar wpolymer() const
Definition: WellInterface_impl.hpp:111
SingleWellState< Scalar, IndexTraits > SingleWellStateType
Definition: WellInterface.hpp:101
bool updateWellControl(const Simulator &simulator, const IndividualOrGroup iog, const WellGroupHelperType &wgHelper, WellStateType &well_state, DeferredLogger &deferred_logger)
Definition: WellInterface_impl.hpp:189
virtual void updateProductivityIndex(const Simulator &simulator, const WellProdIndexCalculator< Scalar > &wellPICalc, WellStateType &well_state, DeferredLogger &deferred_logger) const =0
void wellTesting(const Simulator &simulator, const double simulation_time, const WellGroupHelperType &wgHelper, WellStateType &well_state, WellTestState &welltest_state, GLiftEclWells &ecl_well_map, std::map< std::string, double > &open_times, DeferredLogger &deferred_logger)
Definition: WellInterface_impl.hpp:395
GetPropType< TypeTag, Properties::Indices > Indices
Definition: WellInterface.hpp:86
bool solveWellWithOperabilityCheck(const Simulator &simulator, const double dt, const Well::InjectionControls &inj_controls, const Well::ProductionControls &prod_controls, const WellGroupHelperType &wgHelper, WellStateType &well_state, DeferredLogger &deferred_logger)
Definition: WellInterface_impl.hpp:589
void checkWellOperability(const Simulator &simulator, const WellStateType &well_state, const WellGroupHelperType &wgHelper, DeferredLogger &deferred_logger)
Definition: WellInterface_impl.hpp:1144
Scalar wurea() const
Definition: WellInterface_impl.hpp:177
void updateWellOperability(const Simulator &simulator, const WellStateType &well_state, const WellGroupHelperType &wgHelper, DeferredLogger &deferred_logger)
Definition: WellInterface_impl.hpp:1234
bool thp_update_iterations
Definition: WellInterface.hpp:379
Dune::FieldVector< Scalar, Indices::numEq > VectorBlockType
Definition: WellInterface.hpp:94
Scalar wmicrobes() const
Definition: WellInterface_impl.hpp:153
GetPropType< TypeTag, Properties::SparseMatrixAdapter > SparseMatrixAdapter
Definition: WellInterface.hpp:89
virtual void scaleSegmentRatesAndPressure(WellStateType &well_state) const
Definition: WellInterface_impl.hpp:1295
void prepareWellBeforeAssembling(const Simulator &simulator, const double dt, const WellGroupHelperType &wgHelper, WellStateType &well_state, DeferredLogger &deferred_logger)
Definition: WellInterface_impl.hpp:985
static constexpr bool has_zFraction
Definition: WellInterface.hpp:114
static constexpr EnergyModules energyModuleType
Definition: WellInterface.hpp:116
bool stoppedOrZeroRateTarget(const Simulator &simulator, const WellStateType &well_state, DeferredLogger &deferred_logger) const
Definition: WellInterface_impl.hpp:1735
Definition: WellProdIndexCalculator.hpp:37
Definition: WellState.hpp:66
Declares the properties required by the black oil model.
Phase
Phase indices for reservoir coupling, we currently only support black-oil phases (oil,...
Definition: ReservoirCoupling.hpp:141
Definition: blackoilbioeffectsmodules.hh:43
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(....
Definition: propertysystem.hh:233
Static data associated with a well perforation.
Definition: PerforationData.hpp:30