/*************************************************************************** * GIntegral.hpp - Integration class * * ----------------------------------------------------------------------- * * copyright (C) 2010-2013 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 "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 GIntegrand. ***************************************************************************/ 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; void max_iter(const int& max_iter); void eps(const double& eps); void silent(const bool& silent); const int& iter(void) const; const int& max_iter(void) const; const double& eps(void) const; const bool& silent(void) const; void kernel(GFunction* kernel); const GFunction* kernel(void) const; double romb(const double& a, const double& b, const int& k = 5); double trapzd(const double& a, const double& b, const int& n = 1, double result = 0.0); 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); // Protected data area GFunction* m_kernel; //!< Pointer to function kernel double m_eps; //!< Integration precision int m_max_iter; //!< Maximum number of iterations int m_iter; //!< Number of iterations used bool m_silent; //!< Suppress integration warnings }; /***********************************************************************//** * @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] max_iter Maximum number of iterations. ***************************************************************************/ inline void GIntegral::max_iter(const int& max_iter) { m_max_iter = max_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 precision * * @param[in] eps Precision. ***************************************************************************/ inline void GIntegral::eps(const double& eps) { m_eps = eps; return; } /***********************************************************************//** * @brief Get precision * * @return Precision. ***************************************************************************/ inline const double& GIntegral::eps(void) const { return m_eps; } /***********************************************************************//** * @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; } #endif /* GINTEGRAL_HPP */