| The Gaudi Framework v29r0 (ff2e7097)

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

- File List
- File Members

Integral.cpp
Go to the documentation of this file.
1 // ============================================================================
2 // Include files
3 // ============================================================================
4 // GaudiKernel
5 // ============================================================================
6 #include "GaudiKernel/GaudiException.h"
7 // ============================================================================
8 // GaudiMath
9 // ============================================================================
10 #include "GaudiMath/Constant.h"
11 #include "GaudiMath/Integral.h"
12 #include "GaudiMath/NumericalDefiniteIntegral.h"
13 // ============================================================================
14
15 #ifdef __ICC
16 // disable icc remark #1572: floating-point equality and inequality comparisons are unreliable
17 // The comparison are meant
18 #pragma warning( disable : 1572 )
19 // disable icc remark #2259: non-pointer conversion from "double" to "float" may lose significant bits
20 #pragma warning( disable : 2259 )
21 #endif
22
23 namespace GaudiMath
24 {
25
26 double Integral( const Genfun::AbsFunction& function, const double a, const double b,
27 const GaudiMath::Integration::Type type, const GaudiMath::Integration::KronrodRule rule,
28 const double epsabs, const double epsrel, const size_t size )
29 {
30 if ( 1 != function.dimensionality() ) {
31 throw GaudiException( "GaudiMath::Integral: illegal function dimension", "*GaudiMath*", StatusCode::FAILURE );
32 }
33
34 const Genfun::AbsFunction& one = Genfun::GaudiMathImplementation::Constant( 1.0, 1 );
35
36 const Genfun::AbsFunction& cross = Genfun::FunctionDirectProduct( &one, &function );
37
38 const Genfun::AbsFunction& result =
39 Genfun::GaudiMathImplementation::NumericalDefiniteIntegral( cross, 1, a, b, type, rule, epsabs, epsrel, size );
40
41 return result( Genfun::Argument( 1 ) );
42 }
43
44 double Integral( const Genfun::AbsFunction& function, const double a, const double b,
45 const std::vector<double>& points, const double epsabs, const double epsrel, const size_t size )
46 {
47
48 if ( 1 != function.dimensionality() ) {
49 throw GaudiException( "GaudiMath::Integral: illegal function dimension", "*GaudiMath*", StatusCode::FAILURE );
50 }
51
52 const Genfun::AbsFunction& one = Genfun::GaudiMathImplementation::Constant( 1.0, 1 );
53
54 const Genfun::AbsFunction& cross = Genfun::FunctionDirectProduct( &one, &function );
55
56 const Genfun::AbsFunction& result =
57 Genfun::GaudiMathImplementation::NumericalDefiniteIntegral( cross, 1, a, b, points, epsabs, epsrel, size );
58
59 return result( Genfun::Argument( 1 ) );
60 }
61
62 double Integral( const Genfun::AbsFunction& function, const double a, const GaudiMath::Integration::Inf b,
63 const double epsabs, const double epsrel, const size_t size )
64 {
65 if ( 1 != function.dimensionality() ) {
66 throw GaudiException( "GaudiMath::Integral: illegal function dimension", "*GaudiMath*", StatusCode::FAILURE );
67 }
68
69 const Genfun::AbsFunction& one = Genfun::GaudiMathImplementation::Constant( 1.0, 1 );
70
71 const Genfun::AbsFunction& cross = Genfun::FunctionDirectProduct( &one, &function );
72
73 const Genfun::AbsFunction& result =
74 Genfun::GaudiMathImplementation::NumericalDefiniteIntegral( cross, 1, a, b, epsabs, epsrel, size );
75
76 return result( Genfun::Argument( 1 ) );
77 }
78
79 double Integral( const Genfun::AbsFunction& function, const GaudiMath::Integration::Inf a, const double b,
80 const double epsabs, const double epsrel, const size_t size )
81 {
82 if ( 1 != function.dimensionality() ) {
83 throw GaudiException( "GaudiMath::Integral: illegal function dimension", "*GaudiMath*", StatusCode::FAILURE );
84 }
85
86 const Genfun::AbsFunction& one = Genfun::GaudiMathImplementation::Constant( 1.0, 1 );
87
88 const Genfun::AbsFunction& cross = Genfun::FunctionDirectProduct( &one, &function );
89
90 const Genfun::AbsFunction& result =
91 Genfun::GaudiMathImplementation::NumericalDefiniteIntegral( cross, 1, a, b, epsabs, epsrel, size );
92
93 return result( Genfun::Argument( 1 ) );
94 }
95
96 double Integral( const Genfun::AbsFunction& function, const GaudiMath::Integration::Inf /* a */,
97 const GaudiMath::Integration::Inf /* b */, const double epsabs, const double epsrel,
98 const size_t size )
99 {
100 if ( 1 != function.dimensionality() ) {
101 throw GaudiException( "GaudiMath::Integral: illegal function dimension", "*GaudiMath*", StatusCode::FAILURE );
102 }
103
104 const Genfun::AbsFunction& one = Genfun::GaudiMathImplementation::Constant( 1.0, 1 );
105
106 const Genfun::AbsFunction& cross = Genfun::FunctionDirectProduct( &one, &function );
107
108 // FIXME: (MCl) the static_cast below are needed to avoid warnings and to
109 // match the signature in NumericalDefiniteIntegral.h (around line 288).
110 const Genfun::AbsFunction& result = Genfun::GaudiMathImplementation::NumericalDefiniteIntegral(
111 cross, 1, static_cast<float>( epsabs ), static_cast<float>( epsrel ), size );
112
113 return result( Genfun::Argument( 1 ) );
114 }
115 }
116
117 // ============================================================================
118 // The END
119 // ============================================================================
GaudiException
Define general base for Gaudi exception.
Definition: GaudiException.h:22
StatusCode::FAILURE
Definition: StatusCode.h:31
GaudiMath::Integration::Inf
Inf
infinity
Definition: Integration.h:20
NumericalDefiniteIntegral.h
GaudiMath::Integration::Type
Type
type of integration (for finite limits)
Definition: Integration.h:24
GaudiException.h
gaudirun.type
type
Definition: gaudirun.py:133
std::vector< double >
Constant.h
Integral.h
GaudiMath
GaudiMath.h GaudiMath/GaudiMath.h.
Definition: Adapters.h:13
GaudiMath::Integral
GAUDI_API double Integral(const Genfun::AbsFunction &function, const double a, const double b, const GaudiMath::Integration::Type type=GaudiMath::Integration::Adaptive, const GaudiMath::Integration::KronrodRule rule=GaudiMath::Integration::Default, const double epsabs=1.e-10, const double epsrel=1.e-7, const size_t size=1000)
Definition: Integral.cpp:26
GaudiMath::Integration::KronrodRule
KronrodRule
integration rule
Definition: Integration.h:28
GaudiMath::Constant
Genfun::GaudiMathImplementation::Constant Constant
Definition: GaudiMath.h:26
Genfun::GaudiMathImplementation::NumericalDefiniteIntegral
This class allows the numerical evaluation of the following functions:
Definition: NumericalDefiniteIntegral.h:79