ROOT logo
// @(#)root/mathcore:$Id: AdaptiveIntegratorMultiDim.h 30749 2009-10-15 16:33:04Z brun $
// Author: M. Slawinska   08/2007 

/**********************************************************************
 *                                                                    *
 * Copyright (c) 2007 , LCG ROOT MathLib Team                         *
 *                                                                    *
 *                                                                    *
 **********************************************************************/

// Header source file for class AdaptiveIntegratorMultiDim


#ifndef ROOT_Math_AdaptiveIntegratorMultiDim
#define ROOT_Math_AdaptiveIntegratorMultiDim

#ifndef ROOT_Math_IFunctionfwd
#include "Math/IFunctionfwd.h"
#endif

#include "Math/VirtualIntegrator.h"

namespace ROOT {
namespace Math {


//__________________________________________________________________________________________
/**
   class for adaptive quadrature integration in multi-dimensions
   Algorithm from  A.C. Genz, A.A. Malik, An adaptive algorithm for numerical integration over 
   an N-dimensional rectangular region, J. Comput. Appl. Math. 6 (1980) 295-302.

   Converted/adapted by R.Brun to C++ from Fortran CERNLIB routine RADMUL (D120)
   The new code features many changes compared to the Fortran version.

   @ingroup Integration

  
*/

class AdaptiveIntegratorMultiDim : public VirtualIntegratorMultiDim {

public:

   /**
      construct given optionally tolerance (absolute and relative) and maximum size of working array 
      The size of working array represents the number of sub-division used for calculating the integral. 
      Higher the dimension, larger sizes are required for getting the same accuracy. 
   */
   explicit 
   AdaptiveIntegratorMultiDim(double absTol = 1.E-6, double relTol = 1E-6, unsigned int size = 100000);

   /**
      construct with a reference to the integrand function and given optionally 
      tolerance (absolute and relative) and maximum size of working array.
   */
   explicit
   AdaptiveIntegratorMultiDim(const IMultiGenFunction &f, double absTol = 1.E-9, double relTol = 1E-6, unsigned int size = 100000);

   /**
      destructor (no operations)
    */
   virtual ~AdaptiveIntegratorMultiDim() {}


   /**
      evaluate the integral with the previously given function between xmin[] and xmax[]  
   */
   double Integral(const double* xmin, const double * xmax);


   /// evaluate the integral passing a new function
   double Integral(const IMultiGenFunction &f, const double* xmin, const double * xmax);

   /// set the integration function (must implement multi-dim function interface: IBaseFunctionMultiDim)
   void SetFunction(const IMultiGenFunction &f);

   /// return result of integration 
   double Result() const { return fResult; }

   /// return integration error 
   double Error() const { return fError; } 

   /// return relative error
   double RelError() const { return fRelError; }

   /// return status of integration
   int Status() const { return fStatus; }

   /// return number of function evaluations in calculating the integral 
   unsigned int NEval() const { return fNEval; }
 
   /// set relative tolerance 
   void SetRelTolerance(double relTol);

   /// set absolute tolerance
   void SetAbsTolerance(double absTol);


 private:

   unsigned int fDim;     // dimentionality of integrand

   double fAbsTol;        // absolute tolerance
   double fRelTol;        // relative tolerance
   unsigned int fSize;    // max size of working array (explode with dimension)

   double fResult;        // last integration result 
   double fError;         // integration error 
   double fRelError;      // Relative error
   unsigned int  fNEval;  // number of function evaluation
   int fStatus;   // status of algorithm (error if not zero)

   const IMultiGenFunction* fFun;   // pointer to integrand function 

};

}//namespace Math
}//namespace ROOT

#endif /* ROOT_Math_AdaptiveIntegratorMultiDim */
 AdaptiveIntegratorMultiDim.h:1
 AdaptiveIntegratorMultiDim.h:2
 AdaptiveIntegratorMultiDim.h:3
 AdaptiveIntegratorMultiDim.h:4
 AdaptiveIntegratorMultiDim.h:5
 AdaptiveIntegratorMultiDim.h:6
 AdaptiveIntegratorMultiDim.h:7
 AdaptiveIntegratorMultiDim.h:8
 AdaptiveIntegratorMultiDim.h:9
 AdaptiveIntegratorMultiDim.h:10
 AdaptiveIntegratorMultiDim.h:11
 AdaptiveIntegratorMultiDim.h:12
 AdaptiveIntegratorMultiDim.h:13
 AdaptiveIntegratorMultiDim.h:14
 AdaptiveIntegratorMultiDim.h:15
 AdaptiveIntegratorMultiDim.h:16
 AdaptiveIntegratorMultiDim.h:17
 AdaptiveIntegratorMultiDim.h:18
 AdaptiveIntegratorMultiDim.h:19
 AdaptiveIntegratorMultiDim.h:20
 AdaptiveIntegratorMultiDim.h:21
 AdaptiveIntegratorMultiDim.h:22
 AdaptiveIntegratorMultiDim.h:23
 AdaptiveIntegratorMultiDim.h:24
 AdaptiveIntegratorMultiDim.h:25
 AdaptiveIntegratorMultiDim.h:26
 AdaptiveIntegratorMultiDim.h:27
 AdaptiveIntegratorMultiDim.h:28
 AdaptiveIntegratorMultiDim.h:29
 AdaptiveIntegratorMultiDim.h:30
 AdaptiveIntegratorMultiDim.h:31
 AdaptiveIntegratorMultiDim.h:32
 AdaptiveIntegratorMultiDim.h:33
 AdaptiveIntegratorMultiDim.h:34
 AdaptiveIntegratorMultiDim.h:35
 AdaptiveIntegratorMultiDim.h:36
 AdaptiveIntegratorMultiDim.h:37
 AdaptiveIntegratorMultiDim.h:38
 AdaptiveIntegratorMultiDim.h:39
 AdaptiveIntegratorMultiDim.h:40
 AdaptiveIntegratorMultiDim.h:41
 AdaptiveIntegratorMultiDim.h:42
 AdaptiveIntegratorMultiDim.h:43
 AdaptiveIntegratorMultiDim.h:44
 AdaptiveIntegratorMultiDim.h:45
 AdaptiveIntegratorMultiDim.h:46
 AdaptiveIntegratorMultiDim.h:47
 AdaptiveIntegratorMultiDim.h:48
 AdaptiveIntegratorMultiDim.h:49
 AdaptiveIntegratorMultiDim.h:50
 AdaptiveIntegratorMultiDim.h:51
 AdaptiveIntegratorMultiDim.h:52
 AdaptiveIntegratorMultiDim.h:53
 AdaptiveIntegratorMultiDim.h:54
 AdaptiveIntegratorMultiDim.h:55
 AdaptiveIntegratorMultiDim.h:56
 AdaptiveIntegratorMultiDim.h:57
 AdaptiveIntegratorMultiDim.h:58
 AdaptiveIntegratorMultiDim.h:59
 AdaptiveIntegratorMultiDim.h:60
 AdaptiveIntegratorMultiDim.h:61
 AdaptiveIntegratorMultiDim.h:62
 AdaptiveIntegratorMultiDim.h:63
 AdaptiveIntegratorMultiDim.h:64
 AdaptiveIntegratorMultiDim.h:65
 AdaptiveIntegratorMultiDim.h:66
 AdaptiveIntegratorMultiDim.h:67
 AdaptiveIntegratorMultiDim.h:68
 AdaptiveIntegratorMultiDim.h:69
 AdaptiveIntegratorMultiDim.h:70
 AdaptiveIntegratorMultiDim.h:71
 AdaptiveIntegratorMultiDim.h:72
 AdaptiveIntegratorMultiDim.h:73
 AdaptiveIntegratorMultiDim.h:74
 AdaptiveIntegratorMultiDim.h:75
 AdaptiveIntegratorMultiDim.h:76
 AdaptiveIntegratorMultiDim.h:77
 AdaptiveIntegratorMultiDim.h:78
 AdaptiveIntegratorMultiDim.h:79
 AdaptiveIntegratorMultiDim.h:80
 AdaptiveIntegratorMultiDim.h:81
 AdaptiveIntegratorMultiDim.h:82
 AdaptiveIntegratorMultiDim.h:83
 AdaptiveIntegratorMultiDim.h:84
 AdaptiveIntegratorMultiDim.h:85
 AdaptiveIntegratorMultiDim.h:86
 AdaptiveIntegratorMultiDim.h:87
 AdaptiveIntegratorMultiDim.h:88
 AdaptiveIntegratorMultiDim.h:89
 AdaptiveIntegratorMultiDim.h:90
 AdaptiveIntegratorMultiDim.h:91
 AdaptiveIntegratorMultiDim.h:92
 AdaptiveIntegratorMultiDim.h:93
 AdaptiveIntegratorMultiDim.h:94
 AdaptiveIntegratorMultiDim.h:95
 AdaptiveIntegratorMultiDim.h:96
 AdaptiveIntegratorMultiDim.h:97
 AdaptiveIntegratorMultiDim.h:98
 AdaptiveIntegratorMultiDim.h:99
 AdaptiveIntegratorMultiDim.h:100
 AdaptiveIntegratorMultiDim.h:101
 AdaptiveIntegratorMultiDim.h:102
 AdaptiveIntegratorMultiDim.h:103
 AdaptiveIntegratorMultiDim.h:104
 AdaptiveIntegratorMultiDim.h:105
 AdaptiveIntegratorMultiDim.h:106
 AdaptiveIntegratorMultiDim.h:107
 AdaptiveIntegratorMultiDim.h:108
 AdaptiveIntegratorMultiDim.h:109
 AdaptiveIntegratorMultiDim.h:110
 AdaptiveIntegratorMultiDim.h:111
 AdaptiveIntegratorMultiDim.h:112
 AdaptiveIntegratorMultiDim.h:113
 AdaptiveIntegratorMultiDim.h:114
 AdaptiveIntegratorMultiDim.h:115
 AdaptiveIntegratorMultiDim.h:116
 AdaptiveIntegratorMultiDim.h:117
 AdaptiveIntegratorMultiDim.h:118
 AdaptiveIntegratorMultiDim.h:119
 AdaptiveIntegratorMultiDim.h:120
 AdaptiveIntegratorMultiDim.h:121