22#ifndef OPM_MULTISEGMENTWELL_HEADER_INCLUDED
23#define OPM_MULTISEGMENTWELL_HEADER_INCLUDED
25#include <opm/simulators/wells/WellInterface.hpp>
26#include <opm/simulators/wells/MultisegmentWellEval.hpp>
32 template<
typename TypeTag>
35 GetPropType<TypeTag, Properties::Indices>,
36 GetPropType<TypeTag, Properties::Scalar>>
41 GetPropType<TypeTag, Properties::Indices>,
42 GetPropType<TypeTag, Properties::Scalar>>;
44 using typename Base::Simulator;
45 using typename Base::IntensiveQuantities;
46 using typename Base::FluidSystem;
48 using typename Base::MaterialLaw;
49 using typename Base::Indices;
50 using typename Base::RateConverterType;
51 using typename Base::SparseMatrixAdapter;
52 using typename Base::FluidState;
54 using Base::has_solvent;
55 using Base::has_polymer;
60 using typename Base::Scalar;
63 using typename Base::BVector;
64 using typename Base::Eval;
67 using typename MSWEval::EvalWell;
68 using typename MSWEval::BVectorWell;
70 using typename Base::PressureMatrix;
76 const RateConverterType& rate_converter,
77 const int pvtRegionIdx,
78 const int num_components,
80 const int index_of_well,
81 const std::vector<PerforationData>& perf_data);
83 virtual void init(
const PhaseUsage* phase_usage_arg,
84 const std::vector<double>& depth_arg,
85 const double gravity_arg,
87 const std::vector< Scalar >& B_avg,
88 const bool changed_to_open_this_step)
override;
90 void initPrimaryVariablesEvaluation()
override;
100 const std::vector<double>& B_avg,
102 const bool relax_tolerance =
false)
const override;
105 virtual void apply(
const BVector& x, BVector& Ax)
const override;
107 virtual void apply(BVector& r)
const override;
119 std::vector<double>& well_potentials,
122 void updatePrimaryVariables(
const SummaryState& summary_state,
126 virtual void calculateExplicitQuantities(
const Simulator& ebosSimulator,
130 virtual void updateProductivityIndex(
const Simulator& ebosSimulator,
135 void addWellContributions(SparseMatrixAdapter& jacobian)
const override;
137 void addWellPressureEquations(PressureMatrix& mat,
139 const int pressureVarIndex,
140 const bool use_well_weights,
141 const WellState& well_state)
const override;
146 void computeConnLevelProdInd(
const FluidState& fs,
147 const std::function<
double(
const double)>& connPICalc,
148 const std::vector<Scalar>& mobility,
149 double* connPI)
const;
151 void computeConnLevelInjInd(
const FluidState& fs,
152 const Phase preferred_phase,
153 const std::function<
double(
const double)>& connIICalc,
154 const std::vector<Scalar>& mobility,
158 std::optional<double>
159 computeBhpAtThpLimitProdWithAlq(
const Simulator& ebos_simulator,
160 const SummaryState& summary_state,
161 const double alq_value,
170 std::vector<std::vector<double> > segment_fluid_initial_;
172 mutable int debug_cost_counter_ = 0;
175 void updateWellState(
const SummaryState& summary_state,
176 const BVectorWell& dwells,
179 const double relaxation_factor = 1.0);
183 void computeInitialSegmentFluids(
const Simulator& ebos_simulator);
186 void computePerfCellPressDiffs(
const Simulator& ebosSimulator);
188 void computePerfRateScalar(
const IntensiveQuantities& int_quants,
189 const std::vector<Scalar>& mob_perfcells,
193 const Scalar& segment_pressure,
194 const bool& allow_cf,
195 std::vector<Scalar>& cq_s,
198 void computePerfRateEval(
const IntensiveQuantities& int_quants,
199 const std::vector<EvalWell>& mob_perfcells,
203 const EvalWell& segment_pressure,
204 const bool& allow_cf,
205 std::vector<EvalWell>& cq_s,
206 EvalWell& perf_press,
207 double& perf_dis_gas_rate,
208 double& perf_vap_oil_rate,
211 template<
class Value>
212 void computePerfRate(
const Value& pressure_cell,
215 const std::vector<Value>& b_perfcells,
216 const std::vector<Value>& mob_perfcells,
219 const Value& segment_pressure,
220 const Value& segment_density,
221 const bool& allow_cf,
222 const std::vector<Value>& cmix_s,
223 std::vector<Value>& cq_s,
225 double& perf_dis_gas_rate,
226 double& perf_vap_oil_rate,
231 void computeSegmentFluidProperties(
const Simulator& ebosSimulator,
235 void getMobilityEval(
const Simulator& ebosSimulator,
237 std::vector<EvalWell>& mob)
const;
240 void getMobilityScalar(
const Simulator& ebosSimulator,
242 std::vector<Scalar>& mob)
const;
244 void computeWellRatesAtBhpLimit(
const Simulator& ebosSimulator,
245 std::vector<double>& well_flux,
248 virtual void computeWellRatesWithBhp(
const Simulator& ebosSimulator,
250 std::vector<double>& well_flux,
253 void computeWellRatesWithBhpIterations(
const Simulator& ebosSimulator,
255 std::vector<double>& well_flux,
258 std::vector<double> computeWellPotentialWithTHP(
260 const Simulator& ebos_simulator,
263 bool updateWellStateWithTHPTargetProd(
const Simulator& ebos_simulator,
267 virtual double getRefDensity()
const override;
269 virtual bool iterateWellEqWithControl(
const Simulator& ebosSimulator,
271 const Well::InjectionControls& inj_controls,
272 const Well::ProductionControls& prod_controls,
277 virtual void assembleWellEqWithoutIteration(
const Simulator& ebosSimulator,
279 const Well::InjectionControls& inj_controls,
280 const Well::ProductionControls& prod_controls,
285 virtual void updateWaterThroughput(
const double dt,
WellState& well_state)
const override;
287 EvalWell getSegmentSurfaceVolume(
const Simulator& ebos_simulator,
const int seg_idx)
const;
294 bool openCrossFlowAvoidSingularity(
const Simulator& ebos_simulator)
const;
298 bool allDrawDownWrongDirection(
const Simulator& ebos_simulator)
const;
302 std::optional<double> computeBhpAtThpLimitProd(
304 const Simulator& ebos_simulator,
305 const SummaryState& summary_state,
308 std::optional<double> computeBhpAtThpLimitInj(
const Simulator& ebos_simulator,
309 const SummaryState& summary_state,
312 double maxPerfPress(
const Simulator& ebos_simulator)
const;
315 virtual void checkOperabilityUnderBHPLimit(
const WellState& well_state,
const Simulator& ebos_simulator,
DeferredLogger& deferred_logger)
override;
318 virtual void checkOperabilityUnderTHPLimit(
const Simulator& ebos_simulator,
const WellState& well_state,
DeferredLogger& deferred_logger)
override;
321 virtual void updateIPR(
const Simulator& ebos_simulator,
DeferredLogger& deferred_logger)
const override;
326#include "MultisegmentWell_impl.hpp"
Represents the convergence status of the whole simulator, to make it possible to query and store the ...
Definition: ConvergenceReport.hpp:38
Definition: DeferredLogger.hpp:57
Definition: GroupState.hpp:34
Definition: MultisegmentWellEval.hpp:49
Definition: MultisegmentWell.hpp:37
virtual void updateWellStateWithTarget(const Simulator &ebos_simulator, const GroupState &group_state, WellState &well_state, DeferredLogger &deferred_logger) const override
updating the well state based the current control mode
Definition: MultisegmentWell_impl.hpp:167
virtual void apply(const BVector &x, BVector &Ax) const override
Ax = Ax - C D^-1 B x.
Definition: MultisegmentWell_impl.hpp:211
virtual std::vector< double > computeCurrentWellRates(const Simulator &ebosSimulator, DeferredLogger &deferred_logger) const override
Compute well rates based on current reservoir conditions and well variables.
Definition: MultisegmentWell_impl.hpp:1915
void recoverWellSolutionAndUpdateWellState(const SummaryState &summary_state, const BVector &x, WellState &well_state, DeferredLogger &deferred_logger) override
using the solution x to recover the solution xw for wells and applying xw to update Well State
Definition: MultisegmentWell_impl.hpp:246
virtual void computeWellPotentials(const Simulator &ebosSimulator, const WellState &well_state, std::vector< double > &well_potentials, DeferredLogger &deferred_logger) override
computing the well potentials for group control
Definition: MultisegmentWell_impl.hpp:267
virtual ConvergenceReport getWellConvergence(const WellState &well_state, const std::vector< double > &B_avg, DeferredLogger &deferred_logger, const bool relax_tolerance=false) const override
check whether the well equations get converged for this well
Definition: MultisegmentWell_impl.hpp:188
Class encapsulating some information about parallel wells.
Definition: ParallelWellInfo.hpp:184
Definition: WellInterface.hpp:74
Collect per-connection static information to enable calculating connection-level or well-level produc...
Definition: WellProdIndexCalculator.hpp:36
The state of a set of wells, tailored for use by the fully implicit blackoil simulator.
Definition: WellState.hpp:60
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: BlackoilPhases.hpp:27
Solver parameters for the BlackoilModel.
Definition: BlackoilModelParametersEbos.hpp:327
Definition: BlackoilPhases.hpp:46