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$ a \f$ to \f$ \infty \f$ 00034 (GSL) 00035 00036 \todo I had to add extra code to check for non-finite 00037 values for some integrations. This should be checked. 00038 00039 The extra line was of the form: 00040 \verbatim 00041 if (!finite(area1)) area1=0.0; 00042 \endverbatim 00043 */ 00044 template<class param_t, class func_t> class gsl_inte_qagiu : 00045 public gsl_inte_transform<param_t,func_t> { 00046 00047 #ifndef DOXGYEN_INTERNAL 00048 00049 protected: 00050 00051 /// Store the lower limit 00052 double la; 00053 00054 #endif 00055 00056 public: 00057 00058 /** 00059 00060 \brief Integrate function \c func from \c a to \f$ \infty \f$ 00061 00062 The value \c b is ignored. 00063 */ 00064 virtual double integ(func_t &func, double a, double b, param_t &pa) { 00065 double res, err; 00066 integ_err(func,a,b,pa,res,err); 00067 this->interror=err; 00068 return res; 00069 } 00070 00071 /** 00072 \brief Integrate function \c func from \c a to \f$ \infty \f$ 00073 giving result \c res and error \c err 00074 00075 The value \c b is ignored. 00076 */ 00077 virtual int integ_err(func_t &func, double a, double b, 00078 param_t &pa, double &res, double &err2) { 00079 00080 la=a; 00081 00082 double fv1[8], fv2[8]; 00083 00084 int status=qags(func,8,o2scl_inte_qag_coeffs::qk15_xgk, 00085 o2scl_inte_qag_coeffs::qk15_wg, 00086 o2scl_inte_qag_coeffs::qk15_wgk, 00087 fv1,fv2,0.0,1.0,this->tolx,this->tolf, 00088 this->wkspace,&res,&err2,pa); 00089 00090 return status; 00091 00092 } 00093 00094 #ifndef DOXYGEN_INTERNAL 00095 00096 protected: 00097 00098 /// Transform to \f$ t \in (0,1] \f$ 00099 virtual double transform(func_t &func, double t, param_t &pa) { 00100 double x=la+(1-t)/t, y=0.0; 00101 func(x,y,pa); 00102 00103 return y/t/t; 00104 } 00105 00106 #endif 00107 00108 }; 00109 00110 #ifndef DOXYGENP 00111 } 00112 #endif 00113 00114 #endif
Documentation generated with Doxygen and provided under the GNU Free Documentation License. See License Information for details.
Project hosting provided by
,
O2scl Sourceforge Project Page