CoolProp 7.1.0
An open-source fluid property and humid air property database
Solvers.h
Go to the documentation of this file.
1#ifndef SOLVERS_H
2#define SOLVERS_H
3
4#include <vector>
5#include <string>
6#include "Exceptions.h"
7#include "CoolPropTools.h"
8
9namespace CoolProp {
10
11// *****************************************************************************
12// *****************************************************************************
13// SOLVER WRAPPER CLASSES
14// *****************************************************************************
15// *****************************************************************************
16
18{
19 public:
21 std::string errstring;
23 int iter;
24 int verbosity = 0;
25 FuncWrapper1D() : errcode(0), errstring(""), iter(0) {};
26 virtual ~FuncWrapper1D(){};
27 virtual double call(double) = 0;
33 virtual bool input_not_in_range(double x) {
34 return false;
35 };
36};
37
39{
40 public:
41 virtual double deriv(double) = 0;
42};
43
45{
46 public:
47 virtual double second_deriv(double) = 0;
48};
49
51{
52 public:
53 virtual double third_deriv(double) = 0;
54};
55
57{
58 public:
60 std::string errstring;
62 virtual ~FuncWrapperND(){};
63 virtual std::vector<double> call(const std::vector<double>&) = 0; // must be provided
64 virtual std::vector<std::vector<double>> Jacobian(const std::vector<double>&);
65};
66
67// *****************************************************************************
68// *****************************************************************************
69// SOLVER ROUTINES
70// *****************************************************************************
71// *****************************************************************************
72
73// Single-Dimensional solvers, pointer versions
74double Brent(FuncWrapper1D* f, double a, double b, double macheps, double t, int maxiter);
75double Secant(FuncWrapper1D* f, double x0, double dx, double ftol, int maxiter);
76double BoundedSecant(FuncWrapper1D* f, double x0, double xmin, double xmax, double dx, double ftol, int maxiter);
77double ExtrapolatingSecant(FuncWrapper1D* f, double x0, double dx, double ftol, int maxiter);
78double Newton(FuncWrapper1DWithDeriv* f, double x0, double ftol, int maxiter);
79double Halley(FuncWrapper1DWithTwoDerivs* f, double x0, double ftol, int maxiter, double xtol_rel = 1e-12);
80double Householder4(FuncWrapper1DWithThreeDerivs* f, double x0, double ftol, int maxiter, double xtol_rel = 1e-12);
81
82// Single-Dimensional solvers, refere
83inline double Brent(FuncWrapper1D& f, double a, double b, double macheps, double t, int maxiter) {
84 return Brent(&f, a, b, macheps, t, maxiter);
85}
86inline double Secant(FuncWrapper1D& f, double x0, double dx, double ftol, int maxiter) {
87 return Secant(&f, x0, dx, ftol, maxiter);
88}
89
90inline double ExtrapolatingSecant(FuncWrapper1D& f, double x0, double dx, double ftol, int maxiter){
91 return ExtrapolatingSecant(&f, x0, dx, ftol, maxiter);
92}
93inline double BoundedSecant(FuncWrapper1D& f, double x0, double xmin, double xmax, double dx, double ftol, int maxiter){
94 return BoundedSecant(&f, x0, xmin, xmax, dx, ftol, maxiter);
95}
96inline double Newton(FuncWrapper1DWithDeriv& f, double x0, double ftol, int maxiter) {
97 return Newton(&f, x0, ftol, maxiter);
98}
99inline double Halley(FuncWrapper1DWithTwoDerivs& f, double x0, double ftol, int maxiter, double xtol_rel = 1e-12) {
100 return Halley(&f, x0, ftol, maxiter, xtol_rel);
101}
102inline double Householder4(FuncWrapper1DWithThreeDerivs& f, double x0, double ftol, int maxiter, double xtol_rel = 1e-12) {
103 return Householder4(&f, x0, ftol, maxiter, xtol_rel);
104}
105
106// Multi-Dimensional solvers
107std::vector<double> NDNewtonRaphson_Jacobian(FuncWrapperND* f, const std::vector<double>& x0, double tol, int maxiter, double w = 1.0);
108
109}; /*namespace CoolProp*/
110#endif