23#ifndef OPM_BLACKOILWELLMODEL_NLDD_IMPL_HEADER_INCLUDED
24#define OPM_BLACKOILWELLMODEL_NLDD_IMPL_HEADER_INCLUDED
27#ifndef OPM_BLACKOILWELLMODEL_NLDD_HEADER_INCLUDED
29#include <opm/simulators/wells/BlackoilWellModelNldd.hpp>
36template<
typename TypeTag>
42 OPM_TIMEBLOCK(assemble);
93 auto loggerGuard = wellModel_.groupStateHelper().pushLogger(
false);
95 this->updateWellControls(domain);
96 this->assembleWellEq(dt, domain);
99 wellModel_.updateCellRatesForDomain(domain.index, this->well_domain());
102template<
typename TypeTag>
106 const Domain& domain)
108 OPM_TIMEBLOCK(assembleWellEq);
109 for (
const auto& well : wellModel_.localNonshutWells()) {
110 if (this->well_domain().at(well->name()) == domain.index) {
111 well->assembleWellEq(wellModel_.simulator(),
113 wellModel_.groupStateHelper(),
114 wellModel_.wellState());
119template<
typename TypeTag>
127 throw std::logic_error(
"CPRW is not yet implemented for NLDD subdomains");
144template<
typename TypeTag>
154 auto loggerGuard = wellModel_.groupStateHelper().pushLogger(
false);
155 for (
const auto& well : wellModel_.localNonshutWells()) {
156 if (this->well_domain().at(well->name()) == domainIdx) {
157 const auto& cells = well->cells();
158 x_local_.resize(cells.size());
160 for (
size_t i = 0; i < cells.size(); ++i) {
161 x_local_[i] = x[cells[i]];
163 well->recoverWellSolutionAndUpdateWellState(wellModel_.simulator(),
165 wellModel_.groupStateHelper(),
166 wellModel_.wellState());
171template<
typename TypeTag>
175 const std::vector<Scalar>& B_avg,
178 const auto& iterCtx = wellModel_.simulator().problem().iterationContext();
179 const bool relax_tolerance = iterCtx.shouldRelax(wellModel_.numStrictIterations() + 1);
184 auto loggerGuard = wellModel_.groupStateHelper().pushLogger(
false);
186 for (
const auto& well : wellModel_.localNonshutWells()) {
187 if ((this->well_domain().at(well->name()) == domain.index)) {
188 if (well->isOperableAndSolvable() || well->wellIsStopped()) {
189 report += well->getWellConvergence(wellModel_.groupStateHelper(),
195 xreport.setWellFailed({CR::WellFailure::Type::Unsolvable,
196 CR::Severity::Normal, -1, well->name()});
204 if (wellModel_.terminalOutput()) {
205 for (
const auto& f : report.wellFailures()) {
206 if (f.severity() == ConvergenceReport::Severity::NotANumber) {
207 local_deferredLogger.debug(
"NaN residual found with phase " +
208 std::to_string(f.phase()) +
209 " for well " + f.wellName());
210 }
else if (f.severity() == ConvergenceReport::Severity::TooLarge) {
211 local_deferredLogger.debug(
"Too large residual found with phase " +
212 std::to_string(f.phase()) +
213 " for well " + f.wellName());
220template<
typename TypeTag>
225 OPM_TIMEBLOCK(updateWellControls);
226 if (!wellModel_.wellsActive()) {
239 for (
const auto& well : wellModel_.localNonshutWells()) {
240 if (this->well_domain().at(well->name()) == domain.index) {
241 constexpr auto mode = WellInterface<TypeTag>::IndividualOrGroup::Individual;
242 well->updateWellControl(wellModel_.simulator(),
244 wellModel_.groupStateHelper(),
245 wellModel_.wellState());
250template <
typename TypeTag>
255 std::vector<const SubDomainIndices*> genDomains;
256 std::ranges::transform(domains, std::back_inserter(genDomains),
257 [](
const auto& domain)
259 this->calcDomains(genDomains);
Class for handling the blackoil well model in a NLDD solver.
Definition BlackoilWellModelNldd.hpp:80
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
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition blackoilbioeffectsmodules.hh:45
Representing a part of a grid, in a way suitable for performing local solves.
Definition SubDomain.hpp:61