Opm::ConvergenceReport Class Reference

#include <ConvergenceReport.hpp>

Classes

struct  PenaltyCard
 
class  ReservoirConvergenceMetric
 
class  ReservoirFailure
 
class  WellConvergenceMetric
 
class  WellFailure
 

Public Types

enum  Status { AllGood = 0 , ReservoirFailed = 1 << 0 , WellFailed = 1 << 1 }
 
enum struct  Severity {
  None = 0 , Normal = 1 , ConvergenceMonitorFailure = 2 , TooLarge = 3 ,
  NotANumber = 4
}
 
enum struct  CnvRelaxSource {
  None , PvFraction , SolChange , FinalIter ,
  IterCount
}
 
enum struct  OscillationSource { NotDetected , Reservoir , WellControl , Mixed }
 
using CnvPvSplit = std::pair< std::vector< double >, std::vector< int > >
 

Public Member Functions

 ConvergenceReport ()
 
 ConvergenceReport (const double reportTime)
 
void clear ()
 
void setReservoirFailed (const ReservoirFailure &rf)
 
void setWellFailed (const WellFailure &wf)
 
template<typename... Args>
void setReservoirConvergenceMetric (Args &&... args)
 
template<typename... Args>
void setWellConvergenceMetric (Args &&... args)
 
void setWellGroupTargetsViolated (const bool wellGroupTargetsViolated)
 
void setNetworkNotYetBalancedForceAnotherNewtonIteration (const bool network_needs_more_balancing_force_another_newton_iteration)
 
void setCnvPoreVolSplit (const CnvPvSplit &cnvPvSplit, const double eligiblePoreVolume)
 
void setOscillationSource (const OscillationSource source)
 Record that the Newton solver damped this iteration for oscillation, together with what was unsatisfied at that point. More...
 
void setCnvRelaxation (const CnvRelaxSource source, const double toleranceApplied)
 Record which condition granted the relaxed CNV tolerance and the tolerance actually applied, so an accepted step's quality is visible. More...
 
ConvergenceReportoperator+= (const ConvergenceReport &other)
 
double reportTime () const
 
double eligiblePoreVolume () const
 
const CnvPvSplitcnvPvSplit () const
 
OscillationSource oscillationSource () const
 What was unsatisfied when oscillation damping was triggered, if it was. More...
 
CnvRelaxSource cnvRelaxSource () const
 Which condition granted the relaxed CNV tolerance this iteration. More...
 
double cnvToleranceApplied () const
 The CNV tolerance actually applied (0 if not recorded). More...
 
bool converged () const
 
bool wellGroupTargetsViolated () const
 Whether well/group control targets were violated (a control or target changed this iteration), forcing another Newton iteration even when all residual metrics are converged. More...
 
bool networkNeedsMoreBalancing () const
 Whether the network balance forced another Newton iteration even when all residual metrics are converged. More...
 
bool reservoirFailed () const
 
bool wellFailed () const
 
const std::vector< ReservoirFailure > & reservoirFailures () const
 
const std::vector< ReservoirConvergenceMetric > & reservoirConvergence () const
 
const std::vector< WellFailure > & wellFailures () const
 
const std::vector< WellConvergenceMetric > & wellConvergence () const
 
const PenaltyCardgetPenaltyCard () const
 
void addNonConvergedPenalty ()
 
void addDistanceDecayPenalty ()
 
void addLargeWellResidualsPenalty ()
 
Severity severityOfWorstFailure () const
 
template<typename Serializer >
void serializeOp (Serializer &serializer)
 

Detailed Description

Represents the convergence status of the whole simulator, to make it possible to query and store the reasons for convergence failures.

Member Typedef Documentation

◆ CnvPvSplit

using Opm::ConvergenceReport::CnvPvSplit = std::pair< std::vector<double>, std::vector<int> >

Member Enumeration Documentation

◆ CnvRelaxSource

Which condition, if any, granted the relaxed CNV tolerance this iteration. Ordered by precedence in the code so a single value can be reported even though several conditions may hold at once.

Enumerator
None 

strict tolerance applied

PvFraction 

non-strict pore volume below relaxed_max_pv_fraction

SolChange 

TUNINGDP-style solution-change targets met (disables CNV)

FinalIter 

min_strict_cnv_iter < 0 and iteration == NewtonMaxIterations

IterCount 

min_strict_cnv_iter >= 0 and iteration >= it

◆ OscillationSource

What was unsatisfied at the iteration where the Newton solver detected an oscillation. An association, not a proof of cause. Note the base rate when reading this: a non-final iteration almost always has unsatisfied reservoir residuals, so Reservoir is the common label and the discriminating signal is how often the control layer also participates (Mixed + WellControl).

Enumerator
NotDetected 
Reservoir 

reservoir residuals only

WellControl 

well control equations or a group/network gate only

Mixed 

both

◆ Severity

Enumerator
None 
Normal 
ConvergenceMonitorFailure 
TooLarge 
NotANumber 

◆ Status

Enumerator
AllGood 
ReservoirFailed 
WellFailed 

Constructor & Destructor Documentation

◆ ConvergenceReport() [1/2]

Opm::ConvergenceReport::ConvergenceReport ( )
inline

◆ ConvergenceReport() [2/2]

Opm::ConvergenceReport::ConvergenceReport ( const double  reportTime)
inlineexplicit

Member Function Documentation

◆ addDistanceDecayPenalty()

void Opm::ConvergenceReport::addDistanceDecayPenalty ( )
inline

◆ addLargeWellResidualsPenalty()

void Opm::ConvergenceReport::addLargeWellResidualsPenalty ( )
inline

◆ addNonConvergedPenalty()

void Opm::ConvergenceReport::addNonConvergedPenalty ( )
inline

◆ clear()

void Opm::ConvergenceReport::clear ( )
inline

References AllGood.

◆ cnvPvSplit()

const CnvPvSplit & Opm::ConvergenceReport::cnvPvSplit ( ) const
inline

Referenced by setCnvPoreVolSplit().

◆ cnvRelaxSource()

CnvRelaxSource Opm::ConvergenceReport::cnvRelaxSource ( ) const
inline

Which condition granted the relaxed CNV tolerance this iteration.

◆ cnvToleranceApplied()

double Opm::ConvergenceReport::cnvToleranceApplied ( ) const
inline

The CNV tolerance actually applied (0 if not recorded).

◆ converged()

bool Opm::ConvergenceReport::converged ( ) const
inline

References AllGood.

◆ eligiblePoreVolume()

double Opm::ConvergenceReport::eligiblePoreVolume ( ) const
inline

Referenced by setCnvPoreVolSplit().

◆ getPenaltyCard()

const PenaltyCard & Opm::ConvergenceReport::getPenaltyCard ( ) const
inline

◆ networkNeedsMoreBalancing()

bool Opm::ConvergenceReport::networkNeedsMoreBalancing ( ) const
inline

Whether the network balance forced another Newton iteration even when all residual metrics are converged.

◆ operator+=()

ConvergenceReport & Opm::ConvergenceReport::operator+= ( const ConvergenceReport other)
inline

References reservoirFailed(), and wellFailed().

◆ oscillationSource()

OscillationSource Opm::ConvergenceReport::oscillationSource ( ) const
inline

What was unsatisfied when oscillation damping was triggered, if it was.

◆ reportTime()

double Opm::ConvergenceReport::reportTime ( ) const
inline

◆ reservoirConvergence()

const std::vector< ReservoirConvergenceMetric > & Opm::ConvergenceReport::reservoirConvergence ( ) const
inline

◆ reservoirFailed()

bool Opm::ConvergenceReport::reservoirFailed ( ) const
inline

References ReservoirFailed.

Referenced by operator+=().

◆ reservoirFailures()

const std::vector< ReservoirFailure > & Opm::ConvergenceReport::reservoirFailures ( ) const
inline

◆ serializeOp()

template<typename Serializer >
void Opm::ConvergenceReport::serializeOp ( Serializer &  serializer)
inline

◆ setCnvPoreVolSplit()

void Opm::ConvergenceReport::setCnvPoreVolSplit ( const CnvPvSplit cnvPvSplit,
const double  eligiblePoreVolume 
)
inline

◆ setCnvRelaxation()

void Opm::ConvergenceReport::setCnvRelaxation ( const CnvRelaxSource  source,
const double  toleranceApplied 
)
inline

Record which condition granted the relaxed CNV tolerance and the tolerance actually applied, so an accepted step's quality is visible.

◆ setNetworkNotYetBalancedForceAnotherNewtonIteration()

void Opm::ConvergenceReport::setNetworkNotYetBalancedForceAnotherNewtonIteration ( const bool  network_needs_more_balancing_force_another_newton_iteration)
inline

◆ setOscillationSource()

void Opm::ConvergenceReport::setOscillationSource ( const OscillationSource  source)
inline

Record that the Newton solver damped this iteration for oscillation, together with what was unsatisfied at that point.

◆ setReservoirConvergenceMetric()

template<typename... Args>
void Opm::ConvergenceReport::setReservoirConvergenceMetric ( Args &&...  args)
inline

◆ setReservoirFailed()

void Opm::ConvergenceReport::setReservoirFailed ( const ReservoirFailure rf)
inline

◆ setWellConvergenceMetric()

template<typename... Args>
void Opm::ConvergenceReport::setWellConvergenceMetric ( Args &&...  args)
inline

◆ setWellFailed()

void Opm::ConvergenceReport::setWellFailed ( const WellFailure wf)
inline

◆ setWellGroupTargetsViolated()

void Opm::ConvergenceReport::setWellGroupTargetsViolated ( const bool  wellGroupTargetsViolated)
inline

◆ severityOfWorstFailure()

Severity Opm::ConvergenceReport::severityOfWorstFailure ( ) const
inline

References None.

◆ wellConvergence()

const std::vector< WellConvergenceMetric > & Opm::ConvergenceReport::wellConvergence ( ) const
inline

◆ wellFailed()

bool Opm::ConvergenceReport::wellFailed ( ) const
inline

References WellFailed.

Referenced by operator+=().

◆ wellFailures()

const std::vector< WellFailure > & Opm::ConvergenceReport::wellFailures ( ) const
inline

◆ wellGroupTargetsViolated()

bool Opm::ConvergenceReport::wellGroupTargetsViolated ( ) const
inline

Whether well/group control targets were violated (a control or target changed this iteration), forcing another Newton iteration even when all residual metrics are converged.

Referenced by setWellGroupTargetsViolated().


The documentation for this class was generated from the following file: