35 GetPropType<TypeTag, Properties::Indices>>
40 GetPropType<TypeTag, Properties::Indices>>;
42 using typename Base::Simulator;
43 using typename Base::IntensiveQuantities;
44 using typename Base::FluidSystem;
46 using typename Base::MaterialLaw;
47 using typename Base::Indices;
48 using typename Base::RateConverterType;
49 using typename Base::SparseMatrixAdapter;
50 using typename Base::FluidState;
52 using Base::has_solvent;
53 using Base::has_polymer;
58 using typename Base::Scalar;
61 using typename Base::BVector;
62 using typename Base::Eval;
65 using typename MSWEval::EvalWell;
66 using typename MSWEval::BVectorWell;
68 using typename Base::PressureMatrix;
74 const RateConverterType& rate_converter,
75 const int pvtRegionIdx,
76 const int num_components,
78 const int index_of_well,
79 const std::vector<PerforationData>& perf_data);
81 virtual void init(
const PhaseUsage* phase_usage_arg,
82 const std::vector<double>& depth_arg,
83 const double gravity_arg,
85 const std::vector< Scalar >& B_avg,
86 const bool changed_to_open_this_step)
override;
88 void initPrimaryVariablesEvaluation()
override;
99 const std::vector<double>& B_avg,
101 const bool relax_tolerance)
const override;
104 virtual void apply(
const BVector& x, BVector& Ax)
const override;
106 virtual void apply(BVector& r)
const override;
118 std::vector<double>& well_potentials,
121 void updatePrimaryVariables(
const SummaryState& summary_state,
125 virtual void solveEqAndUpdateWellState(
const SummaryState& summary_state,
129 virtual void calculateExplicitQuantities(
const Simulator& simulator,
133 void updateIPRImplicit(
const Simulator& simulator,
137 virtual void updateProductivityIndex(
const Simulator& simulator,
142 double connectionDensity(
const int globalConnIdx,
143 const int openConnIdx)
const override;
145 void addWellContributions(SparseMatrixAdapter& jacobian)
const override;
147 void addWellPressureEquations(PressureMatrix& mat,
149 const int pressureVarIndex,
150 const bool use_well_weights,
151 const WellState& well_state)
const override;
156 std::optional<double>
157 computeBhpAtThpLimitProdWithAlq(
const Simulator& simulator,
158 const SummaryState& summary_state,
159 const double alq_value,
162 std::vector<double> getPrimaryVars()
const override;
164 int setPrimaryVars(std::vector<double>::const_iterator it)
override;
172 std::vector<std::vector<double> > segment_fluid_initial_;
174 mutable int debug_cost_counter_ = 0;
177 void updateWellState(
const SummaryState& summary_state,
178 const BVectorWell& dwells,
181 const double relaxation_factor = 1.0);
185 void computeInitialSegmentFluids(
const Simulator& simulator);
188 void computePerfCellPressDiffs(
const Simulator& simulator);
190 template<
class Value>
191 void computePerfRate(
const IntensiveQuantities& int_quants,
192 const std::vector<Value>& mob_perfcells,
193 const std::vector<Scalar>& Tw,
196 const Value& segment_pressure,
197 const bool& allow_cf,
198 std::vector<Value>& cq_s,
203 template<
class Value>
204 void computePerfRate(
const Value& pressure_cell,
207 const std::vector<Value>& b_perfcells,
208 const std::vector<Value>& mob_perfcells,
209 const std::vector<Scalar>& Tw,
211 const Value& segment_pressure,
212 const Value& segment_density,
213 const bool& allow_cf,
214 const std::vector<Value>& cmix_s,
215 std::vector<Value>& cq_s,
222 void computeSegmentFluidProperties(
const Simulator& simulator,
226 template<
class Value>
227 void getMobility(
const Simulator& simulator,
229 std::vector<Value>& mob,
232 void computeWellRatesAtBhpLimit(
const Simulator& simulator,
233 std::vector<double>& well_flux,
236 void computeWellRatesWithBhp(
const Simulator& simulator,
238 std::vector<double>& well_flux,
241 void computeWellRatesWithBhpIterations(
const Simulator& simulator,
243 std::vector<double>& well_flux,
246 std::vector<double> computeWellPotentialWithTHP(
248 const Simulator& simulator,
251 bool computeWellPotentialsImplicit(
const Simulator& simulator,
252 std::vector<double>& well_potentials,
255 virtual double getRefDensity()
const override;
257 virtual bool iterateWellEqWithControl(
const Simulator& simulator,
259 const Well::InjectionControls& inj_controls,
260 const Well::ProductionControls& prod_controls,
265 virtual bool iterateWellEqWithSwitching(
const Simulator& simulator,
267 const Well::InjectionControls& inj_controls,
268 const Well::ProductionControls& prod_controls,
272 const bool fixed_control =
false,
273 const bool fixed_status =
false)
override;
275 virtual void assembleWellEqWithoutIteration(
const Simulator& simulator,
277 const Well::InjectionControls& inj_controls,
278 const Well::ProductionControls& prod_controls,
283 virtual void updateWaterThroughput(
const double dt,
WellState& well_state)
const override;
285 EvalWell getSegmentSurfaceVolume(
const Simulator& simulator,
const int seg_idx)
const;
292 bool openCrossFlowAvoidSingularity(
const Simulator& simulator)
const;
296 bool allDrawDownWrongDirection(
const Simulator& simulator)
const;
300 std::optional<double> computeBhpAtThpLimitProd(
302 const Simulator& simulator,
303 const SummaryState& summary_state,
306 std::optional<double> computeBhpAtThpLimitInj(
const Simulator& simulator,
307 const SummaryState& summary_state,
310 double maxPerfPress(
const Simulator& simulator)
const;
313 void checkOperabilityUnderBHPLimit(
const WellState& well_state,
314 const Simulator& simulator,
318 void checkOperabilityUnderTHPLimit(
const Simulator& simulator,
323 void updateIPR(
const Simulator& simulator,