58 GetPropType<TypeTag, Properties::Indices>>
64 GetPropType<TypeTag, Properties::Indices>>;
69 using typename Base::Simulator;
70 using typename Base::IntensiveQuantities;
71 using typename Base::FluidSystem;
72 using typename Base::MaterialLaw;
74 using typename Base::Indices;
75 using typename Base::RateConverterType;
76 using typename Base::SparseMatrixAdapter;
77 using typename Base::FluidState;
78 using typename Base::RateVector;
80 using Base::has_solvent;
81 using Base::has_zFraction;
82 using Base::has_polymer;
83 using Base::has_polymermw;
85 using Base::has_brine;
86 using Base::has_energy;
89 using PolymerModule = BlackOilPolymerModule<TypeTag>;
90 using FoamModule = BlackOilFoamModule<TypeTag>;
91 using BrineModule = BlackOilBrineModule<TypeTag>;
92 using typename Base::PressureMatrix;
95 static constexpr int numWellConservationEq = Indices::numPhases + Indices::numSolvents;
97 static constexpr int numWellControlEq = 1;
100 static constexpr int numStaticWellEq = numWellConservationEq + numWellControlEq;
105 static constexpr int Bhp = numStaticWellEq - numWellControlEq;
107 using StdWellEval::WQTotal;
109 using typename Base::Scalar;
117 using typename Base::BVector;
119 using Eval =
typename StdWellEval::Eval;
120 using EvalWell =
typename StdWellEval::EvalWell;
121 using BVectorWell =
typename StdWellEval::BVectorWell;
127 const RateConverterType& rate_converter,
128 const int pvtRegionIdx,
129 const int num_components,
130 const int num_phases,
131 const int index_of_well,
132 const std::vector<PerforationData>& perf_data);
134 virtual void init(
const PhaseUsage* phase_usage_arg,
135 const std::vector<double>& depth_arg,
136 const double gravity_arg,
138 const std::vector< Scalar >& B_avg,
139 const bool changed_to_open_this_step)
override;
142 void initPrimaryVariablesEvaluation()
override;
147 const std::vector<double>& B_avg,
149 const bool relax_tolerance)
const override;
152 virtual void apply(
const BVector& x, BVector& Ax)
const override;
154 virtual void apply(BVector& r)
const override;
166 std::vector<double>& well_potentials,
169 void updatePrimaryVariables(
const SummaryState& summary_state,
173 virtual void solveEqAndUpdateWellState(
const SummaryState& summary_state,
177 virtual void calculateExplicitQuantities(
const Simulator& simulator,
181 virtual void updateProductivityIndex(
const Simulator& simulator,
186 virtual double connectionDensity(
const int globalConnIdx,
187 const int openConnIdx)
const override;
189 virtual void addWellContributions(SparseMatrixAdapter& mat)
const override;
191 virtual void addWellPressureEquations(PressureMatrix& mat,
193 const int pressureVarIndex,
194 const bool use_well_weights,
195 const WellState& well_state)
const override;
198 bool iterateWellEqWithControl(
const Simulator& simulator,
200 const Well::InjectionControls& inj_controls,
201 const Well::ProductionControls& prod_controls,
207 bool iterateWellEqWithSwitching(
const Simulator& simulator,
209 const Well::InjectionControls& inj_controls,
210 const Well::ProductionControls& prod_controls,
214 const bool fixed_control =
false,
215 const bool fixed_status =
false)
override;
224 double computeWellRatesAndBhpWithThpAlqProd(
const Simulator& simulator,
225 const SummaryState& summary_state,
227 std::vector<double>& potentials,
230 void computeWellRatesWithThpAlqProd(
231 const Simulator& simulator,
232 const SummaryState& summary_state,
234 std::vector<double>& potentials,
237 std::optional<double> computeBhpAtThpLimitProdWithAlq(
238 const Simulator& simulator,
239 const SummaryState& summary_state,
240 const double alq_value,
243 void updateIPRImplicit(
const Simulator& simulator,
247 virtual void computeWellRatesWithBhp(
248 const Simulator& simulator,
250 std::vector<double>& well_flux,
254 using Base::phaseUsage;
255 using Base::vfp_properties_;
260 std::vector<double> getPrimaryVars()
const override;
262 int setPrimaryVars(std::vector<double>::const_iterator it)
override;
268 void updateWellState(
const SummaryState& summary_state,
269 const BVectorWell& dwells,
275 using WellConnectionProps =
typename StdWellEval::StdWellConnections::Properties;
276 void computePropertiesForWellConnectionPressures(
const Simulator& simulator,
278 WellConnectionProps& props)
const;
280 void computeWellConnectionDensitesPressures(
const Simulator& simulator,
282 const WellConnectionProps& props,
285 void computeWellConnectionPressures(
const Simulator& simulator,
289 template<
class Value>
290 void computePerfRate(
const IntensiveQuantities& intQuants,
291 const std::vector<Value>& mob,
293 const std::vector<Scalar>& Tw,
296 std::vector<Value>& cq_s,
300 template<
class Value>
301 void computePerfRate(
const std::vector<Value>& mob,
302 const Value& pressure,
308 std::vector<Value>& b_perfcells_dense,
309 const std::vector<Scalar>& Tw,
312 const Value& skin_pressure,
313 const std::vector<Value>& cmix_s,
314 std::vector<Value>& cq_s,
318 void computeWellRatesWithBhpIterations(
const Simulator& simulator,
320 std::vector<double>& well_flux,
323 std::vector<double> computeWellPotentialWithTHP(
324 const Simulator& simulator,
328 bool computeWellPotentialsImplicit(
const Simulator& simulator,
329 std::vector<double>& well_potentials,
332 virtual double getRefDensity()
const override;
335 template<
class Value>
336 void getMobility(
const Simulator& simulator,
338 std::vector<Value>& mob,
341 void updateWaterMobilityWithPolymer(
const Simulator& simulator,
343 std::vector<EvalWell>& mob_water,
346 void updatePrimaryVariablesNewton(
const BVectorWell& dwells,
347 const bool stop_or_zero_rate_target,
350 void updateWellStateFromPrimaryVariables(
const bool stop_or_zero_rate_target,
352 const SummaryState& summary_state,
355 virtual void assembleWellEqWithoutIteration(
const Simulator& simulator,
357 const Well::InjectionControls& inj_controls,
358 const Well::ProductionControls& prod_controls,
363 void assembleWellEqWithoutIterationImpl(
const Simulator& simulator,
365 const Well::InjectionControls& inj_controls,
366 const Well::ProductionControls& prod_controls,
371 void calculateSinglePerf(
const Simulator& simulator,
374 std::vector<RateVector>& connectionRates,
375 std::vector<EvalWell>& cq_s,
376 EvalWell& water_flux_s,
377 EvalWell& cq_s_zfrac_effective,
381 void checkOperabilityUnderBHPLimit(
const WellState& well_state,
382 const Simulator& simulator,
386 void checkOperabilityUnderTHPLimit(
const Simulator& simulator,
391 void updateIPR(
const Simulator& simulator,
396 bool allDrawDownWrongDirection(
const Simulator& simulator)
const;
399 bool canProduceInjectWithCurrentBhp(
const Simulator& simulator,
408 bool openCrossFlowAvoidSingularity(
const Simulator& simulator)
const;
414 EvalWell pskin(
const double throuhgput,
415 const EvalWell& water_velocity,
416 const EvalWell& poly_inj_conc,
420 EvalWell pskinwater(
const double throughput,
421 const EvalWell& water_velocity,
425 EvalWell wpolymermw(
const double throughput,
426 const EvalWell& water_velocity,
430 void handleInjectivityRate(
const Simulator& simulator,
432 std::vector<EvalWell>& cq_s)
const;
435 void handleInjectivityEquations(
const Simulator& simulator,
438 const EvalWell& water_flux_s,
441 virtual void updateWaterThroughput(
const double dt,
WellState& well_state)
const override;
444 void checkConvergenceExtraEqs(
const std::vector<double>& res,
448 void updateConnectionRatePolyMW(
const EvalWell& cq_s_poly,
449 const IntensiveQuantities& int_quants,
452 std::vector<RateVector>& connectionRates,
456 std::optional<double> computeBhpAtThpLimitProd(
const WellState& well_state,
457 const Simulator& simulator,
458 const SummaryState& summary_state,
461 std::optional<double> computeBhpAtThpLimitInj(
const Simulator& simulator,
462 const SummaryState& summary_state,
466 Eval connectionRateEnergy(
const double maxOilSaturation,
467 const std::vector<EvalWell>& cq_s,
468 const IntensiveQuantities& intQuants,
471 template<
class Value>
472 void gasOilPerfRateInj(
const std::vector<Value>& cq_s,
476 const Value& pressure,
480 template<
class Value>
481 void gasOilPerfRateProd(std::vector<Value>& cq_s,
485 const Value& rvw)
const;
487 template<
class Value>
488 void gasWaterPerfRateProd(std::vector<Value>& cq_s,
491 const Value& rsw)
const;
493 template<
class Value>
494 void gasWaterPerfRateInj(
const std::vector<Value>& cq_s,
498 const Value& pressure,
501 template<
class Value>
502 void disOilVapWatVolumeRatio(Value& volumeRatio,
505 const Value& pressure,
506 const std::vector<Value>& cmix_s,
507 const std::vector<Value>& b_perfcells_dense,
510 template<
class Value>
511 void gasOilVolumeRatio(Value& volumeRatio,
514 const Value& pressure,
515 const std::vector<Value>& cmix_s,
516 const std::vector<Value>& b_perfcells_dense,