mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
Add well convergence metric
This commit is contained in:
parent
861cfeec49
commit
56da84517b
@ -191,6 +191,43 @@ namespace Opm
|
|||||||
std::string well_name_ {};
|
std::string well_name_ {};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class WellConvergenceMetric
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// Default constructor needed for object serialisation. Don't
|
||||||
|
// use this for anything else.
|
||||||
|
WellConvergenceMetric() = default;
|
||||||
|
|
||||||
|
WellConvergenceMetric(WellFailure::Type t, Severity s, int phase, double value, const std::string& well_name)
|
||||||
|
: type_(t), severity_(s), phase_(phase), value_(value), well_name_(well_name)
|
||||||
|
{}
|
||||||
|
|
||||||
|
WellFailure::Type type() const { return type_; }
|
||||||
|
Severity severity() const { return severity_; }
|
||||||
|
int phase() const { return phase_; }
|
||||||
|
double value() const { return value_; }
|
||||||
|
const std::string& wellName() const { return well_name_; }
|
||||||
|
|
||||||
|
template <typename Serializer>
|
||||||
|
void serializeOp(Serializer& serializer)
|
||||||
|
{
|
||||||
|
serializer(this->type_);
|
||||||
|
serializer(this->severity_);
|
||||||
|
serializer(this->phase_);
|
||||||
|
serializer(this->value_);
|
||||||
|
serializer(this->well_name_);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Note to maintainers: If you change this list of data members,
|
||||||
|
// then please update serializeOp() accordingly.
|
||||||
|
WellFailure::Type type_ { WellFailure::Type::Invalid };
|
||||||
|
Severity severity_ { Severity::None };
|
||||||
|
int phase_ { -1 };
|
||||||
|
double value_ { 0.0 };
|
||||||
|
std::string well_name_ {};
|
||||||
|
};
|
||||||
|
|
||||||
// ----------- Mutating member functions -----------
|
// ----------- Mutating member functions -----------
|
||||||
|
|
||||||
ConvergenceReport()
|
ConvergenceReport()
|
||||||
@ -231,6 +268,12 @@ namespace Opm
|
|||||||
this->res_convergence_.emplace_back(std::forward<Args>(args)...);
|
this->res_convergence_.emplace_back(std::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename... Args>
|
||||||
|
void setWellConvergenceMetric(Args&&... args)
|
||||||
|
{
|
||||||
|
this->well_convergence_.emplace_back(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
void setWellGroupTargetsViolated(const bool wellGroupTargetsViolated)
|
void setWellGroupTargetsViolated(const bool wellGroupTargetsViolated)
|
||||||
{
|
{
|
||||||
wellGroupTargetsViolated_ = wellGroupTargetsViolated;
|
wellGroupTargetsViolated_ = wellGroupTargetsViolated;
|
||||||
@ -250,6 +293,7 @@ namespace Opm
|
|||||||
res_failures_.insert(res_failures_.end(), other.res_failures_.begin(), other.res_failures_.end());
|
res_failures_.insert(res_failures_.end(), other.res_failures_.begin(), other.res_failures_.end());
|
||||||
well_failures_.insert(well_failures_.end(), other.well_failures_.begin(), other.well_failures_.end());
|
well_failures_.insert(well_failures_.end(), other.well_failures_.begin(), other.well_failures_.end());
|
||||||
res_convergence_.insert(res_convergence_.end(), other.res_convergence_.begin(), other.res_convergence_.end());
|
res_convergence_.insert(res_convergence_.end(), other.res_convergence_.begin(), other.res_convergence_.end());
|
||||||
|
well_convergence_.insert(well_convergence_.end(), other.well_convergence_.begin(), other.well_convergence_.end());
|
||||||
assert(reservoirFailed() != res_failures_.empty());
|
assert(reservoirFailed() != res_failures_.empty());
|
||||||
assert(wellFailed() != well_failures_.empty());
|
assert(wellFailed() != well_failures_.empty());
|
||||||
wellGroupTargetsViolated_ = (wellGroupTargetsViolated_ || other.wellGroupTargetsViolated_);
|
wellGroupTargetsViolated_ = (wellGroupTargetsViolated_ || other.wellGroupTargetsViolated_);
|
||||||
@ -316,6 +360,11 @@ namespace Opm
|
|||||||
return well_failures_;
|
return well_failures_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::vector<WellConvergenceMetric>& wellConvergence() const
|
||||||
|
{
|
||||||
|
return well_convergence_;
|
||||||
|
}
|
||||||
|
|
||||||
const PenaltyCard& getPenaltyCard() const
|
const PenaltyCard& getPenaltyCard() const
|
||||||
{
|
{
|
||||||
return penaltyCard_;
|
return penaltyCard_;
|
||||||
@ -360,6 +409,7 @@ namespace Opm
|
|||||||
serializer(this->res_failures_);
|
serializer(this->res_failures_);
|
||||||
serializer(this->well_failures_);
|
serializer(this->well_failures_);
|
||||||
serializer(this->res_convergence_);
|
serializer(this->res_convergence_);
|
||||||
|
serializer(this->well_convergence_);
|
||||||
serializer(this->wellGroupTargetsViolated_);
|
serializer(this->wellGroupTargetsViolated_);
|
||||||
serializer(this->cnvPvSplit_);
|
serializer(this->cnvPvSplit_);
|
||||||
serializer(this->eligiblePoreVolume_);
|
serializer(this->eligiblePoreVolume_);
|
||||||
@ -375,6 +425,7 @@ namespace Opm
|
|||||||
std::vector<ReservoirFailure> res_failures_;
|
std::vector<ReservoirFailure> res_failures_;
|
||||||
std::vector<WellFailure> well_failures_;
|
std::vector<WellFailure> well_failures_;
|
||||||
std::vector<ReservoirConvergenceMetric> res_convergence_;
|
std::vector<ReservoirConvergenceMetric> res_convergence_;
|
||||||
|
std::vector<WellConvergenceMetric> well_convergence_;
|
||||||
bool wellGroupTargetsViolated_;
|
bool wellGroupTargetsViolated_;
|
||||||
CnvPvSplit cnvPvSplit_{};
|
CnvPvSplit cnvPvSplit_{};
|
||||||
double eligiblePoreVolume_{};
|
double eligiblePoreVolume_{};
|
||||||
|
@ -134,13 +134,20 @@ getWellConvergence(const WellState<Scalar>& well_state,
|
|||||||
|
|
||||||
if (std::isnan(well_flux_residual[compIdx])) {
|
if (std::isnan(well_flux_residual[compIdx])) {
|
||||||
report.setWellFailed({type, CR::Severity::NotANumber, compIdx, baseif_.name()});
|
report.setWellFailed({type, CR::Severity::NotANumber, compIdx, baseif_.name()});
|
||||||
|
report.setWellConvergenceMetric(type, CR::Severity::NotANumber, compIdx, well_flux_residual[compIdx], baseif_.name());
|
||||||
} else if (well_flux_residual[compIdx] > maxResidualAllowed) {
|
} else if (well_flux_residual[compIdx] > maxResidualAllowed) {
|
||||||
report.setWellFailed({type, CR::Severity::TooLarge, compIdx, baseif_.name()});
|
report.setWellFailed({type, CR::Severity::TooLarge, compIdx, baseif_.name()});
|
||||||
|
report.setWellConvergenceMetric(type, CR::Severity::TooLarge, compIdx, well_flux_residual[compIdx], baseif_.name());
|
||||||
} else if (!relax_tolerance && well_flux_residual[compIdx] > tol_wells) {
|
} else if (!relax_tolerance && well_flux_residual[compIdx] > tol_wells) {
|
||||||
report.setWellFailed({type, CR::Severity::Normal, compIdx, baseif_.name()});
|
report.setWellFailed({type, CR::Severity::Normal, compIdx, baseif_.name()});
|
||||||
|
report.setWellConvergenceMetric(type, CR::Severity::Normal, compIdx, well_flux_residual[compIdx], baseif_.name());
|
||||||
} else if (well_flux_residual[compIdx] > relaxed_tolerance_flow) {
|
} else if (well_flux_residual[compIdx] > relaxed_tolerance_flow) {
|
||||||
report.setWellFailed({type, CR::Severity::Normal, compIdx, baseif_.name()});
|
report.setWellFailed({type, CR::Severity::Normal, compIdx, baseif_.name()});
|
||||||
|
report.setWellConvergenceMetric(type, CR::Severity::Normal, compIdx, well_flux_residual[compIdx], baseif_.name());
|
||||||
|
} else {
|
||||||
|
report.setWellConvergenceMetric(CR::WellFailure::Type::Invalid, CR::Severity::None, compIdx, well_flux_residual[compIdx], baseif_.name());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WellConvergence(baseif_).
|
WellConvergence(baseif_).
|
||||||
|
Loading…
Reference in New Issue
Block a user