/*************************************************************************** * GIntegral.hpp - Integration class * * ----------------------------------------------------------------------- * * copyright (C) 2010-2014 by Juergen Knoedlseder * * ----------------------------------------------------------------------- * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * * * ***************************************************************************/ /** * @file GIntegral.hpp * @brief Integration class interface definition * @author Juergen Knoedlseder */ #ifndef GINTEGRAL_HPP #define GINTEGRAL_HPP /* __ Includes ___________________________________________________________ */ #include #include #include "GBase.hpp" #include "GFunction.hpp" /***********************************************************************//** * @class GIntegral * * @brief GIntegral class interface definition. * * This class allows to perform integration using various methods. The * integrand is implemented by a derived class of GFunction. ***************************************************************************/ class GIntegral : public GBase { public: // Constructors and destructors explicit GIntegral(void); explicit GIntegral(GFunction* kernel); GIntegral(const GIntegral& integral); virtual ~GIntegral(void); // Operators GIntegral& operator=(const GIntegral& integral); // Methods void clear(void); GIntegral* clone(void) const; std::string classname(void) const; void max_iter(const int& iter); const int& max_iter(void) const; void fixed_iter(const int& iter); const int& fixed_iter(void) const; void eps(const double& eps); const double& eps(void) const; void silent(const bool& silent); const bool& silent(void) const; const int& iter(void) const; const int& calls(void) const; const bool& is_valid(void) const; const std::string& message(void) const; void kernel(GFunction* kernel); const GFunction* kernel(void) const; double romberg(std::vector bounds, const int& order = 5); double romberg(const double& a, const double& b, const int& order = 5); double trapzd(const double& a, const double& b, const int& n = 1, double result = 0.0); double adaptive_simpson(const double& a, const double& b) const; double gauss_kronrod(const double& a, const double& b) const; std::string print(const GChatter& chatter = NORMAL) const; protected: // Protected methods void init_members(void); void copy_members(const GIntegral& integral); void free_members(void); double polint(double* xa, double* ya, int n, double x, double *dy); double adaptive_simpson_aux(const double& a, const double& b, const double& eps, const double& S, const double& fa, const double& fb, const double& fc, const int& bottom) const; double rescale_error(double err, const double& result_abs, const double& result_asc) const; // Protected data area GFunction* m_kernel; //!< Pointer to function kernel double m_eps; //!< Requested relative integration precision int m_max_iter; //!< Maximum number of iterations int m_fix_iter; //!< Fixed number of iterations bool m_silent; //!< Suppress integration warnings in console // Integrator results mutable int m_iter; //!< Number of iterations used mutable int m_calls; //!< Number of function calls used mutable bool m_isvalid; //!< Integration result valid (true=yes) mutable bool m_has_abserr; //!< Has absolute integration error mutable bool m_has_relerr; //!< Has relative integration error mutable double m_abserr; //!< Absolute integration error mutable double m_relerr; //!< Absolute integration error mutable std::string m_message; //!< Status message (if result is invalid) }; /***********************************************************************//** * @brief Return class name * * @return String containing the class name ("GIntegral"). ***************************************************************************/ inline std::string GIntegral::classname(void) const { return ("GIntegral"); } /***********************************************************************//** * @brief Return number of iterations * * @return Number of iterations. ***************************************************************************/ inline const int& GIntegral::iter(void) const { return m_iter; } /***********************************************************************//** * @brief Set maximum number of iterations * * @param[in] iter Maximum number of iterations. ***************************************************************************/ inline void GIntegral::max_iter(const int& iter) { m_max_iter = iter; return; } /***********************************************************************//** * @brief Return maximum number of iterations * * @return Maximum number of iterations. ***************************************************************************/ inline const int& GIntegral::max_iter(void) const { return m_max_iter; } /***********************************************************************//** * @brief Set fixed number of iterations * * @param[in] iter Fixed number of iterations. * * If the fixed number of iterations is set, the integration algorithm will * always performed the given number of iterations, irrespectively of the * precision that is reached. This feature is relevant for computing * numerical derivates from numerically integrated functions. ***************************************************************************/ inline void GIntegral::fixed_iter(const int& iter) { m_fix_iter = iter; return; } /***********************************************************************//** * @brief Return fixed number of iterations * * @return Fixed number of iterations. ***************************************************************************/ inline const int& GIntegral::fixed_iter(void) const { return m_fix_iter; } /***********************************************************************//** * @brief Set relative precision * * @param[in] eps Relative precision. ***************************************************************************/ inline void GIntegral::eps(const double& eps) { m_eps = eps; return; } /***********************************************************************//** * @brief Get relative precision * * @return Relative precision. ***************************************************************************/ inline const double& GIntegral::eps(void) const { return m_eps; } /***********************************************************************//** * @brief Get number of function calls * * @return Number of function calls. ***************************************************************************/ inline const int& GIntegral::calls(void) const { return m_calls; } /***********************************************************************//** * @brief Set silence flag * * @param[in] silent Silence flag. ***************************************************************************/ inline void GIntegral::silent(const bool& silent) { m_silent = silent; return; } /***********************************************************************//** * @brief Get silence flag * * @return True is class is silent, false otherwise. ***************************************************************************/ inline const bool& GIntegral::silent(void) const { return m_silent; } /***********************************************************************//** * @brief Set kernel * * @param[in] kernel Kernel. * * Sets the kernel for which the integral should be determined. ***************************************************************************/ inline void GIntegral::kernel(GFunction* kernel) { m_kernel = kernel; return; } /***********************************************************************//** * @brief Get kernel * * @return Kernel. ***************************************************************************/ inline const GFunction* GIntegral::kernel(void) const { return m_kernel; } /***********************************************************************//** * @brief Signal if integration result is valid * * @return True is integration result is valid. ***************************************************************************/ inline const bool& GIntegral::is_valid(void) const { return m_isvalid; } /***********************************************************************//** * @brief Return integration status message * * @return Integration status message. ***************************************************************************/ inline const std::string& GIntegral::message(void) const { return m_message; } #endif /* GINTEGRAL_HPP */