58 GetPropType<TypeTag, Properties::Indices>>
69 using typename Base::Simulator;
70 using typename Base::IntensiveQuantities;
71 using typename Base::FluidSystem;
72 using typename Base::MaterialLaw;
73 using typename Base::ModelParameters;
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;
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;
116 using typename Base::BVector;
118 using Eval =
typename StdWellEval::Eval;
119 using EvalWell =
typename StdWellEval::EvalWell;
120 using BVectorWell =
typename StdWellEval::BVectorWell;
125 const ModelParameters& param,
126 const RateConverterType& rate_converter,
127 const int pvtRegionIdx,
128 const int num_components,
129 const int num_phases,
130 const int index_of_well,
133 virtual void init(
const PhaseUsage* phase_usage_arg,
134 const std::vector<Scalar>& depth_arg,
135 const Scalar gravity_arg,
136 const std::vector<Scalar>& B_avg,
137 const bool changed_to_open_this_step)
override;
139 void initPrimaryVariablesEvaluation()
override;
144 const std::vector<Scalar>& B_avg,
146 const bool relax_tolerance)
const override;
149 virtual void apply(
const BVector& x, BVector& Ax)
const override;
151 virtual void apply(BVector& r)
const override;
163 std::vector<Scalar>& well_potentials,
166 void updatePrimaryVariables(
const Simulator& simulator,
170 void solveEqAndUpdateWellState(
const Simulator& simulator,
174 void calculateExplicitQuantities(
const Simulator& simulator,
178 void updateProductivityIndex(
const Simulator& simulator,
183 Scalar connectionDensity(
const int globalConnIdx,
184 const int openConnIdx)
const override;
186 void addWellContributions(SparseMatrixAdapter& mat)
const override;
188 void addWellPressureEquations(PressureMatrix& mat,
190 const int pressureVarIndex,
191 const bool use_well_weights,
195 bool iterateWellEqWithControl(
const Simulator& simulator,
197 const Well::InjectionControls& inj_controls,
198 const Well::ProductionControls& prod_controls,
204 bool iterateWellEqWithSwitching(
const Simulator& simulator,
206 const Well::InjectionControls& inj_controls,
207 const Well::ProductionControls& prod_controls,
211 const bool fixed_control =
false,
212 const bool fixed_status =
false)
override;
221 Scalar computeWellRatesAndBhpWithThpAlqProd(
const Simulator& ebos_simulator,
222 const SummaryState &summary_state,
224 std::vector<Scalar>& potentials,
227 void computeWellRatesWithThpAlqProd(
const Simulator& ebos_simulator,
228 const SummaryState& summary_state,
230 std::vector<Scalar>& potentials,
233 std::optional<Scalar>
234 computeBhpAtThpLimitProdWithAlq(
const Simulator& ebos_simulator,
235 const SummaryState& summary_state,
236 const Scalar alq_value,
239 void updateIPRImplicit(
const Simulator& simulator,
243 void computeWellRatesWithBhp(
const Simulator& ebosSimulator,
245 std::vector<Scalar>& well_flux,
249 using Base::phaseUsage;
250 using Base::vfp_properties_;
256 std::vector<Scalar> getPrimaryVars()
const override;
258 int setPrimaryVars(
typename std::vector<Scalar>::const_iterator it)
override;
264 void updateWellState(
const Simulator& simulator,
265 const BVectorWell& dwells,
269 using WellConnectionProps =
typename StdWellEval::StdWellConnections::Properties;
274 computePropertiesForWellConnectionPressures(
const Simulator& simulator,
277 void computeWellConnectionDensitesPressures(
const Simulator& simulator,
279 const WellConnectionProps& props,
282 void computeWellConnectionPressures(
const Simulator& simulator,
286 template<
class Value>
287 void computePerfRate(
const IntensiveQuantities& intQuants,
288 const std::vector<Value>& mob,
290 const std::vector<Scalar>& Tw,
293 std::vector<Value>& cq_s,
297 template<
class Value>
298 void computePerfRate(
const std::vector<Value>& mob,
299 const Value& pressure,
305 std::vector<Value>& b_perfcells_dense,
306 const std::vector<Scalar>& Tw,
309 const Value& skin_pressure,
310 const std::vector<Value>& cmix_s,
311 std::vector<Value>& cq_s,
315 void computeWellRatesWithBhpIterations(
const Simulator& ebosSimulator,
317 std::vector<Scalar>& well_flux,
321 computeWellPotentialWithTHP(
const Simulator& ebosSimulator,
325 bool computeWellPotentialsImplicit(
const Simulator& ebos_simulator,
326 std::vector<Scalar>& well_potentials,
329 Scalar getRefDensity()
const override;
332 template<
class Value>
333 void getMobility(
const Simulator& simulator,
335 std::vector<Value>& mob,
338 void updateWaterMobilityWithPolymer(
const Simulator& simulator,
340 std::vector<EvalWell>& mob_water,
343 void updatePrimaryVariablesNewton(
const BVectorWell& dwells,
344 const bool stop_or_zero_rate_target,
348 const SummaryState& summary_state,
351 void assembleWellEqWithoutIteration(
const Simulator& simulator,
353 const Well::InjectionControls& inj_controls,
354 const Well::ProductionControls& prod_controls,
359 void assembleWellEqWithoutIterationImpl(
const Simulator& simulator,
361 const Well::InjectionControls& inj_controls,
362 const Well::ProductionControls& prod_controls,
367 void calculateSinglePerf(
const Simulator& simulator,
370 std::vector<RateVector>& connectionRates,
371 std::vector<EvalWell>& cq_s,
372 EvalWell& water_flux_s,
373 EvalWell& cq_s_zfrac_effective,
382 void checkOperabilityUnderTHPLimit(
const Simulator& simulator,
387 void updateIPR(
const Simulator& simulator,
392 bool allDrawDownWrongDirection(
const Simulator& simulator)
const;
395 bool canProduceInjectWithCurrentBhp(
const Simulator& simulator,
404 bool openCrossFlowAvoidSingularity(
const Simulator& simulator)
const;
410 EvalWell pskin(
const Scalar throughput,
411 const EvalWell& water_velocity,
412 const EvalWell& poly_inj_conc,
416 EvalWell pskinwater(
const Scalar throughput,
417 const EvalWell& water_velocity,
421 EvalWell wpolymermw(
const Scalar throughput,
422 const EvalWell& water_velocity,
426 void handleInjectivityRate(
const Simulator& simulator,
428 std::vector<EvalWell>& cq_s)
const;
431 void handleInjectivityEquations(
const Simulator& simulator,
434 const EvalWell& water_flux_s,
437 void updateWaterThroughput(
const double dt,
441 void checkConvergenceExtraEqs(
const std::vector<Scalar>& res,
445 void updateConnectionRatePolyMW(
const EvalWell& cq_s_poly,
446 const IntensiveQuantities& int_quants,
449 std::vector<RateVector>& connectionRates,
452 std::optional<Scalar>
455 const SummaryState& summary_state,
458 std::optional<Scalar>
459 computeBhpAtThpLimitInj(
const Simulator& simulator,
460 const SummaryState& summary_state,
464 Eval connectionRateEnergy(
const Scalar maxOilSaturation,
465 const std::vector<EvalWell>& cq_s,
466 const IntensiveQuantities& intQuants,
469 template<
class Value>
470 void gasOilPerfRateInj(
const std::vector<Value>& cq_s,
474 const Value& pressure,
478 template<
class Value>
479 void gasOilPerfRateProd(std::vector<Value>& cq_s,
483 const Value& rvw)
const;
485 template<
class Value>
486 void gasWaterPerfRateProd(std::vector<Value>& cq_s,
489 const Value& rsw)
const;
491 template<
class Value>
492 void gasWaterPerfRateInj(
const std::vector<Value>& cq_s,
496 const Value& pressure,
499 template<
class Value>
500 void disOilVapWatVolumeRatio(Value& volumeRatio,
503 const Value& pressure,
504 const std::vector<Value>& cmix_s,
505 const std::vector<Value>& b_perfcells_dense,
508 template<
class Value>
509 void gasOilVolumeRatio(Value& volumeRatio,
512 const Value& pressure,
513 const std::vector<Value>& cmix_s,
514 const std::vector<Value>& b_perfcells_dense,