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>::
53template<
typename TypeTag>
55BlackoilWellModelNldd<TypeTag>::
56assembleWellEq(
const double dt,
60 for (
const auto& well : wellModel_.localNonshutWells()) {
61 if (this->well_domain().
at(well->name()) ==
domain.index) {
62 well->assembleWellEq(wellModel_.simulator(),
64 wellModel_.wellState(),
65 wellModel_.groupState(),
71template<
typename TypeTag>
73BlackoilWellModelNldd<TypeTag>::
74addWellPressureEquations(PressureMatrix& ,
79 throw std::logic_error(
"CPRW is not yet implemented for NLDD subdomains");
96template<
typename TypeTag>
98BlackoilWellModelNldd<TypeTag>::
99recoverWellSolutionAndUpdateWellState(
const BVector& x,
106 for (
const auto& well : wellModel_.localNonshutWells()) {
107 if (this->well_domain().
at(well->name()) ==
domainIdx) {
108 const auto& cells = well->cells();
109 x_local_.resize(cells.size());
111 for (
size_t i = 0; i < cells.size(); ++i) {
112 x_local_[i] = x[cells[i]];
114 well->recoverWellSolutionAndUpdateWellState(wellModel_.simulator(),
116 wellModel_.wellState(),
122 if (wellModel_.terminalOutput()) {
127template<
typename TypeTag>
129BlackoilWellModelNldd<TypeTag>::
130getWellConvergence(
const Domain&
domain,
131 const std::vector<Scalar>&
B_avg,
134 const int iterationIdx = wellModel_.simulator().model().newtonMethod().numIterations();
137 ConvergenceReport report;
138 for (
const auto& well : wellModel_.localNonshutWells()) {
139 if ((this->well_domain().
at(well->name()) ==
domain.index)) {
140 if (well->isOperableAndSolvable() || well->wellIsStopped()) {
141 report += well->getWellConvergence(wellModel_.simulator(),
142 wellModel_.wellState(),
148 using CR = ConvergenceReport;
149 xreport.setWellFailed({CR::WellFailure::Type::Unsolvable,
150 CR::Severity::Normal, -1, well->name()});
157 if (wellModel_.terminalOutput()) {
158 for (
const auto&
f : report.wellFailures()) {
159 if (
f.severity() == ConvergenceReport::Severity::NotANumber) {
161 std::to_string(
f.phase()) +
162 " for well " +
f.wellName());
163 }
else if (
f.severity() == ConvergenceReport::Severity::TooLarge) {
165 std::to_string(
f.phase()) +
166 " for well " +
f.wellName());
173template<
typename TypeTag>
175BlackoilWellModelNldd<TypeTag>::
179 if (!wellModel_.wellsActive()) {
187 for (
const auto& well : wellModel_.localNonshutWells()) {
188 if (this->well_domain().
at(well->name()) ==
domain.index) {
189 constexpr auto mode = WellInterface<TypeTag>::IndividualOrGroup::Individual;
190 well->updateWellControl(wellModel_.simulator(),
192 wellModel_.wellState(),
193 wellModel_.groupState(),
199template <
typename TypeTag>
201BlackoilWellModelNldd<TypeTag>::
202setupDomains(
const std::vector<Domain>&
domains)
204 std::vector<const SubDomainIndices*>
genDomains;
208 { 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