The Gaudi Framework  v30r3 (a5ef0a68)
Integral.cpp
Go to the documentation of this file.
1 // ============================================================================
2 // Include files
3 // ============================================================================
4 // GaudiKernel
5 // ============================================================================
7 // ============================================================================
8 // GaudiMath
9 // ============================================================================
10 #include "GaudiMath/Constant.h"
11 #include "GaudiMath/Integral.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,
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 // ============================================================================
constexpr static const auto FAILURE
Definition: StatusCode.h:88
Define general base for Gaudi exception.
constexpr auto size(const C &c) noexcept(noexcept(c.size())) -> decltype(c.size())
Type
type of integration (for finite limits)
Definition: Integration.h:24
GaudiMath.h GaudiMath/GaudiMath.h.
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
KronrodRule
integration rule
Definition: Integration.h:28
Genfun::GaudiMathImplementation::Constant Constant
Definition: GaudiMath.h:26
This class allows the numerical evaluation of the following functions: