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>
38BlackoilWellModelNldd<TypeTag>::
54template<
typename TypeTag>
56BlackoilWellModelNldd<TypeTag>::
57assembleWellEq(
const double dt,
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>
75BlackoilWellModelNldd<TypeTag>::
76addWellPressureEquations(PressureMatrix& ,
81 throw std::logic_error(
"CPRW is not yet implemented for NLDD subdomains");
98template<
typename TypeTag>
100BlackoilWellModelNldd<TypeTag>::
101recoverWellSolutionAndUpdateWellState(
const BVector& x,
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(),
124 if (wellModel_.terminalOutput()) {
129template<
typename TypeTag>
131BlackoilWellModelNldd<TypeTag>::
132getWellConvergence(
const Domain&
domain,
133 const std::vector<Scalar>&
B_avg,
136 const int iterationIdx = wellModel_.simulator().model().newtonMethod().numIterations();
139 ConvergenceReport report;
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(),
150 using CR = ConvergenceReport;
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) {
163 std::to_string(
f.phase()) +
164 " for well " +
f.wellName());
165 }
else if (
f.severity() == ConvergenceReport::Severity::TooLarge) {
167 std::to_string(
f.phase()) +
168 " for well " +
f.wellName());
175template<
typename TypeTag>
177BlackoilWellModelNldd<TypeTag>::
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>
204BlackoilWellModelNldd<TypeTag>::
205setupDomains(
const std::vector<Domain>&
domains)
207 std::vector<const SubDomainIndices*>
genDomains;
211 { return static_cast<const SubDomainIndices*>(&domain); });
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition blackoilboundaryratevector.hh:37
constexpr auto getPropValue()
get the value data member of a property
Definition propertysystem.hh:242