#ifndef SOLVERS_H #define SOLVERS_H #include #include #include "Exceptions.h" #include "CoolPropTools.h" namespace CoolProp { // ***************************************************************************** // ***************************************************************************** // SOLVER WRAPPER CLASSES // ***************************************************************************** // ***************************************************************************** class FuncWrapper1D { public: int errcode; std::string errstring; Dictionary options; int iter; FuncWrapper1D() : errcode(0), errstring(""){}; virtual ~FuncWrapper1D(){}; virtual double call(double) = 0; /** * /brief A function for checking whether the input is in range; * * Meant to be implemented by derived classes; return true if input is out of range */ virtual bool input_not_in_range(double x) { return false; }; }; class FuncWrapper1DWithDeriv : public FuncWrapper1D { public: virtual double deriv(double) = 0; }; class FuncWrapper1DWithTwoDerivs : public FuncWrapper1DWithDeriv { public: virtual double second_deriv(double) = 0; }; class FuncWrapper1DWithThreeDerivs : public FuncWrapper1DWithTwoDerivs { public: virtual double third_deriv(double) = 0; }; class FuncWrapperND { public: int errcode; std::string errstring; FuncWrapperND() : errcode(0), errstring(""){}; virtual ~FuncWrapperND(){}; virtual std::vector call(const std::vector&) = 0; // must be provided virtual std::vector> Jacobian(const std::vector&); }; // ***************************************************************************** // ***************************************************************************** // SOLVER ROUTINES // ***************************************************************************** // ***************************************************************************** // Single-Dimensional solvers, pointer versions double Brent(FuncWrapper1D* f, double a, double b, double macheps, double t, int maxiter); double Secant(FuncWrapper1D* f, double x0, double dx, double ftol, int maxiter); double BoundedSecant(FuncWrapper1D* f, double x0, double xmin, double xmax, double dx, double ftol, int maxiter); double ExtrapolatingSecant(FuncWrapper1D* f, double x0, double dx, double ftol, int maxiter); double Newton(FuncWrapper1DWithDeriv* f, double x0, double ftol, int maxiter); double Halley(FuncWrapper1DWithTwoDerivs* f, double x0, double ftol, int maxiter, double xtol_rel = 1e-12); double Householder4(FuncWrapper1DWithThreeDerivs* f, double x0, double ftol, int maxiter, double xtol_rel = 1e-12); // Single-Dimensional solvers, refere inline double Brent(FuncWrapper1D& f, double a, double b, double macheps, double t, int maxiter) { return Brent(&f, a, b, macheps, t, maxiter); } inline double Secant(FuncWrapper1D& f, double x0, double dx, double ftol, int maxiter) { return Secant(&f, x0, dx, ftol, maxiter); } inline double ExtrapolatingSecant(FuncWrapper1D& f, double x0, double dx, double ftol, int maxiter){ return ExtrapolatingSecant(&f, x0, dx, ftol, maxiter); } inline double BoundedSecant(FuncWrapper1D& f, double x0, double xmin, double xmax, double dx, double ftol, int maxiter){ return BoundedSecant(&f, x0, xmin, xmax, dx, ftol, maxiter); } inline double Newton(FuncWrapper1DWithDeriv& f, double x0, double ftol, int maxiter) { return Newton(&f, x0, ftol, maxiter); } inline double Halley(FuncWrapper1DWithTwoDerivs& f, double x0, double ftol, int maxiter, double xtol_rel = 1e-12) { return Halley(&f, x0, ftol, maxiter, xtol_rel); } inline double Householder4(FuncWrapper1DWithThreeDerivs& f, double x0, double ftol, int maxiter, double xtol_rel = 1e-12) { return Householder4(&f, x0, ftol, maxiter, xtol_rel); } // Multi-Dimensional solvers std::vector NDNewtonRaphson_Jacobian(FuncWrapperND* f, const std::vector& x0, double tol, int maxiter, double w = 1.0); }; /*namespace CoolProp*/ #endif