gsl_inte_qagil.h

00001 /*
00002   -------------------------------------------------------------------
00003   
00004   Copyright (C) 2006, 2007, Andrew W. Steiner
00005   
00006   This file is part of O2scl.
00007   
00008   O2scl is free software; you can redistribute it and/or modify
00009   it under the terms of the GNU General Public License as published by
00010   the Free Software Foundation; either version 3 of the License, or
00011   (at your option) any later version.
00012   
00013   O2scl is distributed in the hope that it will be useful,
00014   but WITHOUT ANY WARRANTY; without even the implied warranty of
00015   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016   GNU General Public License for more details.
00017   
00018   You should have received a copy of the GNU General Public License
00019   along with O2scl. If not, see <http://www.gnu.org/licenses/>.
00020 
00021   -------------------------------------------------------------------
00022 */
00023 #ifndef O2SCL_GSL_INTE_QAGIL_H
00024 #define O2SCL_GSL_INTE_QAGIL_H
00025 
00026 #include <o2scl/inte.h>
00027 #include <o2scl/gsl_inte_qags.h>
00028 
00029 #ifndef DOXYGENP
00030 namespace o2scl {
00031 #endif
00032 
00033   /** \brief Integrate a function from \f$ -\infty \f$ to 
00034       \f$ \mathrm{b} \f$ (GSL)
00035   */
00036   template<class param_t, class func_t> class gsl_inte_qagil : 
00037   public gsl_inte_transform<param_t,func_t> {
00038 
00039 #ifndef DOXYGEN_INTERNAL      
00040 
00041   protected:
00042 
00043     /// Store the upper limit
00044     double lb;
00045 
00046 #endif
00047 
00048   public:
00049     
00050     /** 
00051         \brief Integrate function \c func from \f$ -\infty \f$ to \c b.
00052 
00053         The value given in \c a is ignored.
00054      */
00055     virtual double integ(func_t &func, double a, double b, param_t &pa) {
00056       double res, err;
00057       integ_err(func,a,b,pa,res,err);
00058       this->interror=err;
00059       return res;
00060     }
00061     
00062     /** 
00063         \brief Integrate function \c func from \f$ -\infty \f$ to \c b
00064         and place the result in \c res and the error in \c err2
00065 
00066         The value given in \c a is ignored.
00067     */
00068     virtual int integ_err(func_t &func, double a, double b, 
00069                           param_t &pa, double &res, double &err2) {
00070       
00071       lb=b;
00072 
00073       double fv1[8], fv2[8];
00074         
00075       int status=qags(func,8,o2scl_inte_qag_coeffs::qk15_xgk,
00076                        o2scl_inte_qag_coeffs::qk15_wg,
00077                        o2scl_inte_qag_coeffs::qk15_wgk,
00078                        fv1,fv2,0.0,1.0,this->tolx,this->tolf,
00079                        this->wkspace,&res,&err2,pa);
00080       return status;
00081         
00082     }
00083 
00084   protected:
00085       
00086     /// Transform to \f$ t \in (0,1] \f$
00087     virtual double transform(func_t &func, double t, param_t &pa) {
00088       double x=lb-(1-t)/t, y;
00089       func(x,y,pa);
00090       return y/t/t;
00091     }
00092       
00093   };
00094   
00095 #ifndef DOXYGENP
00096 }
00097 #endif
00098 
00099 #endif

Documentation generated with Doxygen and provided under the GNU Free Documentation License. See License Information for details.

Project hosting provided by SourceForge.net Logo, O2scl Sourceforge Project Page