36 ,
public MultisegmentWellEval<GetPropType<TypeTag, Properties::FluidSystem>,
37 GetPropType<TypeTag, Properties::Indices>>
41 using MSWEval = MultisegmentWellEval<GetPropType<TypeTag, Properties::FluidSystem>,
44 using typename Base::Simulator;
45 using typename Base::IntensiveQuantities;
46 using typename Base::FluidSystem;
47 using typename Base::IndexTraits;
48 using typename Base::ModelParameters;
49 using typename Base::MaterialLaw;
50 using typename Base::Indices;
51 using typename Base::RateConverterType;
52 using typename Base::SparseMatrixAdapter;
53 using typename Base::FluidState;
54 using typename Base::WellStateType;
56 using Base::has_solvent;
57 using Base::has_polymer;
62 using typename Base::Scalar;
65 using typename Base::BVector;
66 using typename Base::Eval;
68 using typename MSWEval::Equations;
69 using typename MSWEval::EvalWell;
70 using typename MSWEval::BVectorWell;
72 using typename Base::PressureMatrix;
73 using FSInfo = std::tuple<Scalar,typename std::decay<decltype(std::declval<decltype(std::declval<const Simulator&>().model().intensiveQuantities(0, 0).fluidState())>().saltConcentration())>::type,
int>;
75 MultisegmentWell(
const Well& well,
78 const ModelParameters& param,
79 const RateConverterType& rate_converter,
80 const int pvtRegionIdx,
81 const int num_conservation_quantities,
83 const int index_of_well,
86 void init(
const std::vector<Scalar>& depth_arg,
87 const Scalar gravity_arg,
88 const std::vector<Scalar>& B_avg,
89 const bool changed_to_open_this_step)
override;
94 WellStateType& well_state,
102 const WellStateType& well_state,
103 const std::vector<Scalar>& B_avg,
105 const bool relax_tolerance)
const override;
108 void apply(
const BVector& x, BVector& Ax)
const override;
110 void apply(BVector& r)
const override;
116 WellStateType& well_state,
121 const WellStateType& well_state,
122 std::vector<Scalar>& well_potentials,
125 void updatePrimaryVariables(
const Simulator& simulator,
126 const WellStateType& well_state,
129 void solveEqAndUpdateWellState(
const Simulator& simulator,
130 WellStateType& well_state,
133 void calculateExplicitQuantities(
const Simulator& simulator,
134 const WellStateType& well_state,
137 void updateIPRImplicit(
const Simulator& simulator,
138 WellStateType& well_state,
141 void updateProductivityIndex(
const Simulator& simulator,
143 WellStateType& well_state,
146 Scalar connectionDensity(
const int globalConnIdx,
147 const int openConnIdx)
const override;
149 void addWellContributions(SparseMatrixAdapter& jacobian)
const override;
151 void addWellPressureEquations(PressureMatrix& mat,
153 const int pressureVarIndex,
154 const bool use_well_weights,
155 const WellStateType& well_state)
const override;
161 std::optional<Scalar>
162 computeBhpAtThpLimitProdWithAlq(
const Simulator& simulator,
163 const SummaryState& summary_state,
164 const Scalar alq_value,
166 bool iterate_if_no_solution)
const override;
168 std::vector<Scalar> getPrimaryVars()
const override;
170 int setPrimaryVars(
typename std::vector<Scalar>::const_iterator it)
override;
177 std::vector<std::vector<Scalar> > segment_fluid_initial_;
179 mutable int debug_cost_counter_ = 0;
182 void updateWellState(
const Simulator& simulator,
183 const BVectorWell& dwells,
184 WellStateType& well_state,
186 const Scalar relaxation_factor = 1.0);
189 void computeInitialSegmentFluids(
const Simulator& simulator);
192 void computePerfCellPressDiffs(
const Simulator& simulator);
194 template<
class Value>
195 void computePerfRate(
const IntensiveQuantities& int_quants,
196 const std::vector<Value>& mob_perfcells,
197 const std::vector<Scalar>& Tw,
200 const Value& segment_pressure,
201 const bool& allow_cf,
202 std::vector<Value>& cq_s,
207 template<
class Value>
208 void computePerfRate(
const Value& pressure_cell,
211 const std::vector<Value>& b_perfcells,
212 const std::vector<Value>& mob_perfcells,
213 const std::vector<Scalar>& Tw,
215 const Value& segment_pressure,
216 const Value& segment_density,
217 const bool& allow_cf,
218 const std::vector<Value>& cmix_s,
219 std::vector<Value>& cq_s,
226 void computeSegmentFluidProperties(
const Simulator& simulator,
230 template<
class Value>
231 void getMobility(
const Simulator& simulator,
232 const int local_perf_index,
233 std::vector<Value>& mob,
236 void computeWellRatesAtBhpLimit(
const Simulator& simulator,
237 std::vector<Scalar>& well_flux,
240 void computeWellRatesWithBhp(
const Simulator& simulator,
242 std::vector<Scalar>& well_flux,
245 void computeWellRatesWithBhpIterations(
const Simulator& simulator,
247 std::vector<Scalar>& well_flux,
251 computeWellPotentialWithTHP(
const WellStateType& well_state,
252 const Simulator& simulator,
255 bool computeWellPotentialsImplicit(
const Simulator& simulator,
256 const WellStateType& well_state,
257 std::vector<Scalar>& well_potentials,
260 Scalar getRefDensity()
const override;
262 bool iterateWellEqWithControl(
const Simulator& simulator,
264 const Well::InjectionControls& inj_controls,
265 const Well::ProductionControls& prod_controls,
266 WellStateType& well_state,
270 bool iterateWellEqWithSwitching(
const Simulator& simulator,
272 const Well::InjectionControls& inj_controls,
273 const Well::ProductionControls& prod_controls,
274 WellStateType& well_state,
277 const bool fixed_control =
false,
278 const bool fixed_status =
false)
override;
280 void assembleWellEqWithoutIteration(
const Simulator& simulator,
282 const Well::InjectionControls& inj_controls,
283 const Well::ProductionControls& prod_controls,
284 WellStateType& well_state,
288 void updateWaterThroughput(
const double dt, WellStateType& well_state)
const override;
290 EvalWell getSegmentSurfaceVolume(
const Simulator& simulator,
const int seg_idx)
const;
297 bool openCrossFlowAvoidSingularity(
const Simulator& simulator)
const;
301 bool allDrawDownWrongDirection(
const Simulator& simulator)
const;
303 std::optional<Scalar>
304 computeBhpAtThpLimitProd(
const WellStateType& well_state,
305 const Simulator& ebos_simulator,
306 const SummaryState& summary_state,
309 std::optional<Scalar>
310 computeBhpAtThpLimitInj(
const Simulator& ebos_simulator,
311 const SummaryState& summary_state,
314 Scalar maxPerfPress(
const Simulator& simulator)
const;
317 void checkOperabilityUnderBHPLimit(
const WellStateType& well_state,
318 const Simulator& ebos_simulator,
322 void checkOperabilityUnderTHPLimit(
const Simulator& ebos_simulator,
323 const WellStateType& well_state,
327 void updateIPR(
const Simulator& ebos_simulator,
330 FSInfo getFirstPerforationFluidStateInfo(
const Simulator& simulator)
const;