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>
43 OPM_TIMEBLOCK(assemble);
50 this->updateWellControls(local_deferredLogger, domain);
51 this->assembleWellEq(dt, domain, local_deferredLogger);
54template<
typename TypeTag>
61 OPM_TIMEBLOCK(assembleWellEq);
62 for (
const auto& well : wellModel_.localNonshutWells()) {
63 if (this->well_domain().at(well->name()) == domain.index) {
64 well->assembleWellEq(wellModel_.simulator(),
66 wellModel_.wellState(),
67 wellModel_.groupState(),
73template<
typename TypeTag>
81 throw std::logic_error(
"CPRW is not yet implemented for NLDD subdomains");
98template<
typename TypeTag>
108 for (
const auto& well : wellModel_.localNonshutWells()) {
109 if (this->well_domain().at(well->name()) == domainIdx) {
110 const auto& cells = well->cells();
111 x_local_.resize(cells.size());
113 for (
size_t i = 0; i < cells.size(); ++i) {
114 x_local_[i] = x[cells[i]];
116 well->recoverWellSolutionAndUpdateWellState(wellModel_.simulator(),
118 wellModel_.wellState(),
119 local_deferredLogger);
124 if (wellModel_.terminalOutput()) {
125 local_deferredLogger.logMessages();
129template<
typename TypeTag>
133 const std::vector<Scalar>& B_avg,
136 const int iterationIdx = wellModel_.simulator().model().newtonMethod().numIterations();
137 const bool relax_tolerance = iterationIdx > wellModel_.numStrictIterations();
140 for (
const auto& well : wellModel_.localNonshutWells()) {
141 if ((this->well_domain().at(well->name()) == domain.index)) {
142 if (well->isOperableAndSolvable() || well->wellIsStopped()) {
143 report += well->getWellConvergence(wellModel_.simulator(),
144 wellModel_.wellState(),
146 local_deferredLogger,
151 xreport.setWellFailed({CR::WellFailure::Type::Unsolvable,
152 CR::Severity::Normal, -1, well->name()});
159 if (wellModel_.terminalOutput()) {
160 for (
const auto& f : report.wellFailures()) {
161 if (f.severity() == ConvergenceReport::Severity::NotANumber) {
162 local_deferredLogger.debug(
"NaN residual found with phase " +
163 std::to_string(f.phase()) +
164 " for well " + f.wellName());
165 }
else if (f.severity() == ConvergenceReport::Severity::TooLarge) {
166 local_deferredLogger.debug(
"Too large residual found with phase " +
167 std::to_string(f.phase()) +
168 " for well " + f.wellName());
175template<
typename TypeTag>
179 const Domain& domain)
181 OPM_TIMEBLOCK(updateWellControls);
182 if (!wellModel_.wellsActive()) {
190 for (
const auto& well : wellModel_.localNonshutWells()) {
191 if (this->well_domain().at(well->name()) == domain.index) {
192 constexpr auto mode = WellInterface<TypeTag>::IndividualOrGroup::Individual;
193 well->updateWellControl(wellModel_.simulator(),
195 wellModel_.wellState(),
196 wellModel_.groupState(),
202template <
typename TypeTag>
207 std::vector<const SubDomainIndices*> genDomains;
208 std::transform(domains.begin(), domains.end(),
209 std::back_inserter(genDomains),
210 [](
const auto& domain)
211 { return static_cast<const SubDomainIndices*>(&domain); });
212 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:43