113 static const int numEq = Indices::numEq;
114 static const int solventSaturationIdx = Indices::solventSaturationIdx;
122 using VectorBlockType = Dune::FieldVector<Scalar, numEq>;
123 using BVector = Dune::BlockVector<VectorBlockType>;
130 SurfaceToReservoirVoidage<FluidSystem, std::vector<int> >;
134 AverageRegionalPressure<FluidSystem, std::vector<int> >;
144 beginReportStep(simulator_.episodeIndex());
147 void beginTimeStep();
149 void beginIteration()
152 assemble(simulator_.model().newtonMethod().numIterations(),
153 simulator_.timeStepSize());
162 timeStepSucceeded(simulator_.time(), simulator_.timeStepSize());
170 void computeTotalRatesForDof(RateVector& rate,
171 unsigned globalIdx)
const;
173 template <
class Context>
174 void computeTotalRatesForDof(RateVector& rate,
175 const Context& context,
180 using WellInterfacePtr = std::shared_ptr<WellInterface<TypeTag> >;
186 this->simulator_.vanguard().transferWTestState(),
192 void prepareDeserialize(
const int report_step)
194 prepareDeserialize(report_step, grid().size(0),
198 data::Wells wellData()
const
200 auto wsrpt = this->wellState()
201 .report(simulator_.vanguard().globalCell().data(),
202 [
this](
const int well_index) ->
bool
204 return this->wasDynamicallyShutThisTimeStep(well_index);
208 const auto&
tracerRates = this->simulator_.problem()
209 .tracerModel().getWellTracerRates();
211 .tracerModel().getWellFreeTracerRates();
213 .tracerModel().getWellSolTracerRates();
215 .tracerModel().getMswTracerRates();
226 this->assignWellTargets(
wsrpt);
227 this->assignShutConnections(
wsrpt, this->reportStepIndex());
232 this->assignMassGasRate(
wsrpt, FluidSystem::referenceDensity(FluidSystem::gasPhaseIdx, 0));
237 data::WellBlockAveragePressures wellBlockAveragePressures()
const
239 return this->wbp_.computeWellBlockAveragePressures(this->gravity_);
242#if COMPILE_GPU_BRIDGE
252 void addWellContributions(SparseMatrixAdapter& jacobian)
const;
255 void addReservoirSourceTerms(GlobalEqVector& residual,
256 const std::vector<typename SparseMatrixAdapter::MatrixBlock*>&
diagMatAddress)
const;
259 void beginReportStep(
const int time_step);
271 std::tuple<bool, bool, Scalar>
278 bool updateGroupControls(
const Group& group,
283 WellInterfacePtr getWell(
const std::string& well_name)
const;
285 using PressureMatrix = Dune::BCRSMatrix<Opm::MatrixBlock<Scalar, 1, 1>>;
287 void addWellPressureEquations(PressureMatrix& jacobian,
288 const BVector& weights,
290 void addWellPressureEquationsStruct(PressureMatrix& jacobian)
const;
291 void addWellPressureEquationsDomain(PressureMatrix& jacobian,
292 const BVector& weights,
297 OPM_THROW(std::logic_error,
"Attempt to access NLDD data without a NLDD solver");
299 return nldd_->addWellPressureEquations(jacobian,
308 return well_container_;
314 OPM_THROW(std::logic_error,
"Attempt to access NLDD data without a NLDD solver");
316 return nldd_->well_local_cells();
319 const std::map<std::string, int>& well_domain()
const
322 OPM_THROW(std::logic_error,
"Attempt to access NLDD data without a NLDD solver");
325 return nldd_->well_domain();
328 auto begin()
const {
return well_container_.begin(); }
329 auto end()
const {
return well_container_.end(); }
330 bool empty()
const {
return well_container_.empty(); }
332 bool addMatrixContributions()
const
335 int numStrictIterations()
const
345 void recoverWellSolutionAndUpdateWellState(
const BVector& x);
349 void recoverWellSolutionAndUpdateWellStateDomain(
const BVector& x,
352 const Grid& grid()
const
353 {
return simulator_.vanguard().grid(); }
355 const Simulator& simulator()
const
356 {
return simulator_; }
362 Simulator& simulator_;
365 std::vector<WellInterfacePtr> well_container_{};
367 std::vector<bool> is_cell_perforated_{};
372 void createWellContainer(
const int report_step)
override;
375 createWellPointer(
const int wellID,
376 const int report_step)
const;
378 template <
typename WellType>
379 std::unique_ptr<WellType>
380 createTypedWellPointer(
const int wellID,
383 WellInterfacePtr createWellForWellTest(
const std::string& well_name,
384 const int report_step,
387 const ModelParameters param_;
388 std::size_t global_num_cells_{};
390 std::size_t local_num_cells_{};
392 std::vector<Scalar> depth_{};
393 bool alternative_well_rate_init_{};
394 std::map<std::string, Scalar> well_group_thp_calc_;
395 std::unique_ptr<RateConverterType> rateConverter_{};
396 std::map<std::string, std::unique_ptr<AverageRegionalPressureType>> regionalAveragePressureCalculator_{};
398 SimulatorReportSingle last_report_{};
403 std::vector<Scalar> B_avg_{};
405 const EquilGrid& equilGrid()
const
406 {
return simulator_.vanguard().equilGrid(); }
408 const EclipseState& eclState()
const
409 {
return simulator_.vanguard().eclState(); }
452 void endReportStep();
457 void updateAverageFormationFactor();
459 void computePotentials(
const std::size_t
widx,
465 const std::vector<Scalar>& wellPerfEfficiencyFactors()
const;
468 void calculateProductivityIndexValues(DeferredLogger&
deferred_logger)
override;
473 int numComponents()
const;
475 int reportStepIndex()
const;
479 void prepareWellsBeforeAssembling(
const double dt, DeferredLogger&
deferred_logger);
482 void assembleWellEqWithoutIteration(
const double dt, DeferredLogger&
deferred_logger);
484 void extractLegacyCellPvtRegionIndex_();
486 void extractLegacyDepth_();
493 void calcResvCoeff(
const int fipnum,
495 const std::vector<Scalar>& production_rates,
498 void calcInjResvCoeff(
const int fipnum,
502 void computeWellTemperature();
505 BlackoilWellModel(Simulator& simulator,
const PhaseUsage& pu);
514 mutable BVector x_local_;