OGS
MathLib::PiecewiseLinearMonotonicCurve Class Referencefinal

Detailed Description

Class for strong monotonic curves.

Definition at line 20 of file PiecewiseLinearMonotonicCurve.h.

#include <PiecewiseLinearMonotonicCurve.h>

Inheritance diagram for MathLib::PiecewiseLinearMonotonicCurve:
[legend]
Collaboration diagram for MathLib::PiecewiseLinearMonotonicCurve:
[legend]

Public Member Functions

 PiecewiseLinearMonotonicCurve (std::vector< double > x, std::vector< double > y)
 ~PiecewiseLinearMonotonicCurve ()=default
double getInverseVariable (const double y) const
Public Member Functions inherited from MathLib::PiecewiseLinearInterpolation
 PiecewiseLinearInterpolation (std::vector< double > supporting_points, std::vector< double > values_at_supp_pnts, bool supp_pnts_sorted=false)
 PiecewiseLinearInterpolation (std::vector< int > const &supporting_points, std::vector< double > const &values_at_supp_pnts, bool supp_pnts_sorted=false)
double getValue (double pnt_to_interpolate) const
 Calculates the interpolation value.
double getDerivative (double const pnt_to_interpolate) const
 Calculates derivative using quadratic interpolation and central difference quotient.
double getSupportMax () const
double getSupportMin () const

Private Member Functions

bool isStrongMonotonic () const

Additional Inherited Members

Protected Attributes inherited from MathLib::PiecewiseLinearInterpolation
std::vector< double > supp_pnts_
std::vector< double > values_at_supp_pnts_

Constructor & Destructor Documentation

◆ PiecewiseLinearMonotonicCurve()

MathLib::PiecewiseLinearMonotonicCurve::PiecewiseLinearMonotonicCurve ( std::vector< double > x,
std::vector< double > y )

@ x x coordinates of curve points @ y y coordinates of curve points

Definition at line 23 of file PiecewiseLinearMonotonicCurve.cpp.

25 : PiecewiseLinearInterpolation(std::move(x), std::move(y), false)
26{
27 if (!isStrongMonotonic())
28 {
29 OGS_FATAL("The given curve is not strong monotonic.");
30 }
31}
#define OGS_FATAL(...)
Definition Error.h:26
PiecewiseLinearInterpolation(std::vector< double > supporting_points, std::vector< double > values_at_supp_pnts, bool supp_pnts_sorted=false)

References MathLib::PiecewiseLinearInterpolation::PiecewiseLinearInterpolation(), isStrongMonotonic(), and OGS_FATAL.

◆ ~PiecewiseLinearMonotonicCurve()

MathLib::PiecewiseLinearMonotonicCurve::~PiecewiseLinearMonotonicCurve ( )
default

Member Function Documentation

◆ getInverseVariable()

double MathLib::PiecewiseLinearMonotonicCurve::getInverseVariable ( const double y) const

Get variable, x, or abscissa, by a given value y, the ordinate. If this curve is not monotonic, this function gives a fatal error.

Definition at line 47 of file PiecewiseLinearMonotonicCurve.cpp.

48{
49 std::size_t interval_idx = 0;
50 if (values_at_supp_pnts_.front() < values_at_supp_pnts_.back())
51 {
52 if (y <= values_at_supp_pnts_.front())
53 {
54 return supp_pnts_[0];
55 }
56 if (y >= values_at_supp_pnts_.back())
57 {
58 return supp_pnts_[supp_pnts_.size() - 1];
59 }
60
61 // search interval that has the point inside
62 auto const& it(std::lower_bound(values_at_supp_pnts_.begin(),
63 values_at_supp_pnts_.end(), y));
64 interval_idx = std::distance(values_at_supp_pnts_.begin(), it) - 1;
65 }
66 else
67 {
68 if (y >= values_at_supp_pnts_.front())
69 {
70 return supp_pnts_[0];
71 }
72 if (y <= values_at_supp_pnts_.back())
73 {
74 return supp_pnts_[supp_pnts_.size() - 1];
75 }
76
77 // search interval in the reverse direction for the point inside
78 auto const& it(std::lower_bound(values_at_supp_pnts_.rbegin(),
79 values_at_supp_pnts_.rend(), y));
80 interval_idx = values_at_supp_pnts_.size() -
81 (std::distance(values_at_supp_pnts_.rbegin(), it)) - 1;
82 }
83
84 const double xi_1 = supp_pnts_[interval_idx + 1];
85 const double xi = supp_pnts_[interval_idx];
86 const double yi_1 = values_at_supp_pnts_[interval_idx + 1];
87 const double yi = values_at_supp_pnts_[interval_idx];
88
89 // compute gradient: m = (x_{i+1} - x_i) / (y_{i+1} - y_i)
90 const double m = (xi_1 - xi) / (yi_1 - yi);
91
92 // compute the variable by linear interpolation: x = m * (y - y_i) + x_i,
93 // and then return the result.
94 return m * (y - yi) + xi;
95}

References MathLib::PiecewiseLinearInterpolation::supp_pnts_, and MathLib::PiecewiseLinearInterpolation::values_at_supp_pnts_.

◆ isStrongMonotonic()

bool MathLib::PiecewiseLinearMonotonicCurve::isStrongMonotonic ( ) const
private

Check monotonicity of this curve such as for any \(i\), \(y(x_{i+1})>y(x_{i})\) if \(x_{i+1}>x_{i}\) or for any \(i\) \(y(x_{i+1})<y(x_{i})\) if \(x_{i+1}>x_{i}\)

Returns
True if the curve exhibits strong monotonic.

Definition at line 33 of file PiecewiseLinearMonotonicCurve.cpp.

34{
35 const double gradient0 = getDerivative(supp_pnts_[0]);
36
37 if (std::abs(gradient0) < std::numeric_limits<double>::min())
38 {
39 return false;
40 }
41
42 return std::none_of(supp_pnts_.begin(), supp_pnts_.end(),
43 [&](const double p)
44 { return this->getDerivative(p) * gradient0 <= 0.; });
45}
double getDerivative(double const pnt_to_interpolate) const
Calculates derivative using quadratic interpolation and central difference quotient.
static const double p

References MathLib::PiecewiseLinearInterpolation::getDerivative(), MathLib::p, and MathLib::PiecewiseLinearInterpolation::supp_pnts_.

Referenced by PiecewiseLinearMonotonicCurve().


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