| The Gaudi Framework v28r2p1 (f1a77ff4)

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

NumericalIndefiniteIntegral.h
Go to the documentation of this file.
1 #ifndef GAUDIMATH_NUMERICALINDEFINITEINTEGRAL_H
2 #define GAUDIMATH_NUMERICALINDEFINITEINTEGRAL_H 1
3 // ============================================================================
4 // Include files
5 // ============================================================================
6 // STD & STL
7 // ============================================================================
8 #include <string>
9 // ============================================================================
10 // GaudiKernel
11 // ============================================================================
12 #include "GaudiKernel/StatusCode.h"
13 // ============================================================================
14 // GaudiMath
15 // ============================================================================
16 #include "GaudiMath/Integration.h"
17 // ============================================================================
18 // CLHEP
19 // ============================================================================
20 #include "CLHEP/GenericFunctions/AbsFunction.hh"
21 // ============================================================================
22 #include "gsl/gsl_integration.h"
23
24
25 #if defined(__clang__) || defined(__CLING__)
26 #pragma clang diagnostic push
27 #pragma clang diagnostic ignored "-Winconsistent-missing-override"
28 #elif defined(__GNUC__) && __GNUC__ >= 5
29 #pragma GCC diagnostic push
30 #pragma GCC diagnostic ignored "-Wsuggest-override"
31 #endif
32
34
35 namespace Genfun
36 {
37 namespace GaudiMathImplementation
38 {
83 class GAUDI_API NumericalIndefiniteIntegral : public AbsFunction
84 {
85 public:
86 struct _Workspace { gsl_integration_workspace* ws ; };
87 struct _Function ;
88 public:
89
91 typedef std::vector<double> Points ;
92
93 public:
94
96 FUNCTION_OBJECT_DEF( NumericalIndefiniteIntegral )
97
98 public:
99
163 NumericalIndefiniteIntegral
164 ( const AbsFunction& function ,
165 const size_t index ,
166 const double a ,
167 const GaudiMath::Integration::Limit limit =
168 GaudiMath::Integration::VariableHighLimit ,
169 const GaudiMath::Integration::Type type =
170 GaudiMath::Integration::Adaptive ,
171 const GaudiMath::Integration::KronrodRule rule =
172 GaudiMath::Integration::Default ,
173 const double epsabs = 1e-10 ,
174 const double epsrel = 1.e-7 ,
175 const size_t size = 1000 );
176
218 NumericalIndefiniteIntegral
219 ( const AbsFunction& function ,
220 const size_t index ,
221 const double a ,
222 const Points& points ,
223 const GaudiMath::Integration::Limit limit =
224 GaudiMath::Integration::VariableHighLimit ,
225 const double epsabs = 1e-9 ,
226 const double epsrel = 1.e-6 ,
227 const size_t size = 1000 ) ;
228
266 NumericalIndefiniteIntegral
267 ( const AbsFunction& function ,
268 const size_t index ,
269 const GaudiMath::Integration::Limit limit =
270 GaudiMath::Integration::VariableHighLimit ,
271 const double epsabs = 1e-9 ,
272 const double epsrel = 1.e-6 ,
273 const size_t size = 1000 ) ;
274
276 NumericalIndefiniteIntegral
277 ( const NumericalIndefiniteIntegral& ) ;
278
280 ~NumericalIndefiniteIntegral() override = default;
281
282 public:
283
285 unsigned int dimensionality() const override { return m_DIM ; }
286
288 double operator() ( double argument ) const override;
290 double operator() ( const Argument& argument ) const override;
291
293 bool hasAnalyticDerivative() const override { return true ;}
294
296 Genfun::Derivative partial ( unsigned int index ) const override;
297
298 public:
299
301 const AbsFunction& function () const { return *m_function ; }
303 double a () const { return m_a ; }
305 const Points& points () const { return m_points ; }
307 double epsabs () const { return m_epsabs ; }
309 double epsrel () const { return m_epsrel ; }
310
312 double result () const { return m_result ; }
314 double error () const { return m_error ; }
315
316 // maximal number of bisection integvals for adaptive algorithms
317 size_t size () const { return m_size ; }
318
320 GaudiMath::Integration::Limit
321 limit () const { return m_limit ; }
323 GaudiMath::Integration::Type
324 type () const { return m_type ; }
326 GaudiMath::Integration::Category
327 category () const { return m_category ; }
329 GaudiMath::Integration::KronrodRule
330 rule () const { return m_rule ; }
331
332 protected:
333
334 // adaptive integration on infinite intervals
335 double QAGI ( _Function* fun ) const ;
336 // adaptive integration with known singular points
337 double QAGP ( _Function* fun ) const ;
338 // non-adaptive integration
339 double QNG ( _Function* fun ) const ;
340 // adaptive integration
341 double QAG ( _Function* fun ) const ;
342 // adaptive integral with singularities
343 double QAGS ( _Function* fun ) const ;
344
345 // allocate the integration workspace
346 _Workspace* allocate () const ;
347 // the integration workspace
348 _Workspace* ws () const
349 { return m_ws.get(); }
350
351 // throw the exception
352 StatusCode Exception
353 ( const std::string& message ,
354 const StatusCode& sc = StatusCode::FAILURE ) const ;
355
356 private:
357
358 // default constructor is disabled
359 NumericalIndefiniteIntegral() ;
360 // assignement operator is disabled
361 NumericalIndefiniteIntegral& operator=
362 ( const NumericalIndefiniteIntegral& ) ;
363
364 public:
365
366 struct gsl_ws_deleter {
367 void operator()(_Workspace* p) const {
368 if (p) gsl_integration_workspace_free ( p->ws ) ;
369 delete p;
370 }
371 };
372 private:
373
374 std::unique_ptr<const AbsFunction> m_function ;
375 size_t m_DIM ;
376 size_t m_index ;
377
378 double m_a ;
379
380 GaudiMath::Integration::Limit m_limit ;
381 GaudiMath::Integration::Type m_type ;
382 GaudiMath::Integration::Category m_category ;
383 GaudiMath::Integration::KronrodRule m_rule ;
384
385 Points m_points ;
386 std::unique_ptr<double[]> m_pdata ;
387
388 double m_epsabs ;
389 double m_epsrel ;
390
391 mutable double m_result ;
392 mutable double m_error ;
393
394 size_t m_size ;
395 mutable std::unique_ptr<_Workspace,gsl_ws_deleter> m_ws ;
396
397 mutable Argument m_argument ;
398
399 };
401 FUNCTION_OBJECT_IMP( NumericalIndefiniteIntegral )
402
403 } // end of namespace GaudiMathImplementation
404 } // end of namespace Genfun
405
406 #if defined(__clang__) || defined(__CLING__)
407 #pragma clang diagnostic pop
408 #elif defined(__GNUC__) && __GNUC__ >= 5
409 #pragma GCC diagnostic pop
410 #endif
411
412 // ============================================================================
413 // The END
414 // ============================================================================
415 #endif // GAUDIMATH_NUMERICALINDEFINITEINTEGRAL_H
416 // ============================================================================
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_ws
std::unique_ptr< _Workspace, gsl_ws_deleter > m_ws
Definition: NumericalIndefiniteIntegral.h:395
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_error
double m_error
Definition: NumericalIndefiniteIntegral.h:392
StatusCode::FAILURE
Definition: StatusCode.h:29
gaudirun.default
default
Definition: gaudirun.py:141
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::epsrel
double epsrel() const
relatiove precision
Definition: NumericalIndefiniteIntegral.h:309
GaudiMath::Integration::Category
Category
integration category
Definition: Integration.h:30
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::result
double result() const
previous result
Definition: NumericalIndefiniteIntegral.h:312
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_pdata
std::unique_ptr< double[]> m_pdata
Definition: NumericalIndefiniteIntegral.h:386
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::error
double error() const
evaluate of previous error
Definition: NumericalIndefiniteIntegral.h:314
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_index
size_t m_index
Definition: NumericalIndefiniteIntegral.h:376
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_a
double m_a
Definition: NumericalIndefiniteIntegral.h:378
GaudiMath::Integration::Adaptive
Definition: Integration.h:26
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::limit
GaudiMath::Integration::Limit limit() const
integration limit
Definition: NumericalIndefiniteIntegral.h:321
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::size
size_t size() const
Definition: NumericalIndefiniteIntegral.h:317
GaudiMath::Derivative
Genfun::GaudiMathImplementation::NumericalDerivative Derivative
Definition: GaudiMath.h:29
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::_Workspace::ws
gsl_integration_workspace * ws
Definition: NumericalIndefiniteIntegral.h:86
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::category
GaudiMath::Integration::Category category() const
integration category
Definition: NumericalIndefiniteIntegral.h:327
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::gsl_ws_deleter
Definition: NumericalIndefiniteIntegral.h:366
std::string
STL class.
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_epsabs
double m_epsabs
Definition: NumericalIndefiniteIntegral.h:388
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_size
size_t m_size
Definition: NumericalIndefiniteIntegral.h:394
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_DIM
size_t m_DIM
Definition: NumericalIndefiniteIntegral.h:375
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::rule
GaudiMath::Integration::KronrodRule rule() const
integration rule
Definition: NumericalIndefiniteIntegral.h:330
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::_Function
Definition: NumericalIndefiniteIntegral.cpp:52
Integration.h
StatusCode
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
GaudiMath::Integration::Type
Type
type of integration (for finite limits)
Definition: Integration.h:25
gaudirun.type
type
Definition: gaudirun.py:125
GaudiMath::Integration::VariableHighLimit
Definition: Integration.h:23
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_epsrel
double m_epsrel
Definition: NumericalIndefiniteIntegral.h:389
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::_Workspace
Definition: NumericalIndefiniteIntegral.h:86
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::epsabs
double epsabs() const
absolute precision
Definition: NumericalIndefiniteIntegral.h:307
GaudiMath::Integration::Default
Definition: Integration.h:41
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::hasAnalyticDerivative
bool hasAnalyticDerivative() const override
Does this function have an analytic derivative?
Definition: NumericalIndefiniteIntegral.h:293
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_limit
GaudiMath::Integration::Limit m_limit
Definition: NumericalIndefiniteIntegral.h:380
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_category
GaudiMath::Integration::Category m_category
Definition: NumericalIndefiniteIntegral.h:382
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::type
GaudiMath::Integration::Type type() const
integration type
Definition: NumericalIndefiniteIntegral.h:324
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_function
std::unique_ptr< const AbsFunction > m_function
Definition: NumericalIndefiniteIntegral.h:374
std::vector< double >
std::unique_ptr< const AbsFunction >
Gaudi::Functional::operator()
virtual Out operator()(const vector_of_const_< In > &inputs) const =0
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::a
double a() const
integration limit
Definition: NumericalIndefiniteIntegral.h:303
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_type
GaudiMath::Integration::Type m_type
Definition: NumericalIndefiniteIntegral.h:381
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_argument
Argument m_argument
Definition: NumericalIndefiniteIntegral.h:397
GaudiMath::Integration::Limit
Limit
how to distinguish variable low and variable high limits
Definition: Integration.h:22
fun
double fun(const std::vector< double > &x)
Definition: PFuncTest.cpp:26
GaudiMath
GaudiMath.h GaudiMath/GaudiMath.h.
Definition: Adapters.h:13
GaudiMath::Integration::KronrodRule
KronrodRule
integration rule
Definition: Integration.h:34
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::Points
std::vector< double > Points
typedef for vector of singular points
Definition: NumericalIndefiniteIntegral.h:87
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_rule
GaudiMath::Integration::KronrodRule m_rule
Definition: NumericalIndefiniteIntegral.h:383
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_result
double m_result
Definition: NumericalIndefiniteIntegral.h:391
Genfun
CLHEP.
Definition: IEqSolver.h:13
StatusCode.h
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral
The simple class for numerical integrations.
Definition: NumericalIndefiniteIntegral.h:83
GAUDI_API
#define GAUDI_API
Definition: Kernel.h:107
Tuples::Type
Type
the list of available types for ntuples
Definition: TupleObj.h:79
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::points
const Points & points() const
known singularities
Definition: NumericalIndefiniteIntegral.h:305
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::gsl_ws_deleter::operator()
void operator()(_Workspace *p) const
Definition: NumericalIndefiniteIntegral.h:367
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::ws
_Workspace * ws() const
Definition: NumericalIndefiniteIntegral.h:348
Genfun::GaudiMathImplementation::NumericalIndefiniteIntegral::m_points
Points m_points
Definition: NumericalIndefiniteIntegral.h:385
Integration
collection of common types for classes NumericalIndefiniteIntegral and NumericalDefiniteIntegral ...