Geant4 10.7.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
nf_GnG_adaptiveQuadrature.cc File Reference
#include <float.h>
#include "nf_integration.h"

Go to the source code of this file.

Classes

struct  nf_GnG_adaptiveQuadrature_info_s
 

Typedefs

typedef struct nf_GnG_adaptiveQuadrature_info_s nf_GnG_adaptiveQuadrature_info
 

Functions

nfu_status nf_GnG_adaptiveQuadrature (nf_GnG_adaptiveQuadrature_callback quadratureFunction, nf_Legendre_GaussianQuadrature_callback integrandFunction, void *argList, double x1, double x2, int maxDepth, double tolerance, double *integral, long *evaluations)
 

Typedef Documentation

◆ nf_GnG_adaptiveQuadrature_info

Function Documentation

◆ nf_GnG_adaptiveQuadrature()

nfu_status nf_GnG_adaptiveQuadrature ( nf_GnG_adaptiveQuadrature_callback  quadratureFunction,
nf_Legendre_GaussianQuadrature_callback  integrandFunction,
void *  argList,
double  x1,
double  x2,
int  maxDepth,
double  tolerance,
double *  integral,
long *  evaluations 
)

Definition at line 31 of file nf_GnG_adaptiveQuadrature.cc.

32 {
33/*
34* See W. Gander and W. Gautschi, "Adaptive quadrature--revisited", BIT 40 (2000), 84-101.
35*/
36 int i1;
37 double estimate = 0., y1, integral_, coarse;
38 nfu_status status = nfu_Okay;
39 nf_GnG_adaptiveQuadrature_info adaptiveQuadrature_info = { nfu_Okay, integrandFunction, argList, quadratureFunction, 0., 0, maxDepth, 0 };
40
41 *integral = 0.;
42 *evaluations = 0;
43 if( x1 == x2 ) return( nfu_Okay );
44
45 if( tolerance < 10 * DBL_EPSILON ) tolerance = 10 * DBL_EPSILON;
47
48 for( i1 = 0; i1 < numberOfInitialPoints; i1++ ) {
49 if( ( status = integrandFunction( x1 + ( x2 - x1 ) * initialPoints[i1], &y1, argList ) ) != nfu_Okay ) return( status );
50 estimate += y1;
51 }
52 if( ( status = quadratureFunction( integrandFunction, argList, x1, x2, &integral_ ) ) != nfu_Okay ) return( status );
53 estimate = 0.5 * ( estimate * ( x2 - x1 ) / numberOfInitialPoints + integral_ );
54 if( estimate == 0. ) estimate = x2 - x1;
55 adaptiveQuadrature_info.estimate = tolerance * estimate / DBL_EPSILON;
56
57 if( ( status = quadratureFunction( integrandFunction, argList, x1, x2, &coarse ) ) != nfu_Okay ) return( status );
58 integral_ = nf_GnG_adaptiveQuadrature2( &adaptiveQuadrature_info, coarse, x1, x2, 0 );
59
60 for( i1 = 0; i1 < 2; i1++ ) { /* Estimate may be off by more than a factor of 10. Iterate at most 2 times. */
61 if( integral_ == 0. ) break;
62 y1 = integral_ / estimate;
63 if( ( y1 > 0.1 ) && ( y1 < 10. ) ) break;
64
65 estimate = integral_;
66 adaptiveQuadrature_info.estimate = tolerance * integral_ / DBL_EPSILON;
67 *evaluations += adaptiveQuadrature_info.evaluations;
68 adaptiveQuadrature_info.evaluations = 0;
69 integral_ = nf_GnG_adaptiveQuadrature2( &adaptiveQuadrature_info, integral_, x1, x2, 0 );
70 }
71
72 *evaluations += adaptiveQuadrature_info.evaluations;
73 if( adaptiveQuadrature_info.status == nfu_Okay ) *integral = integral_;
74 return( adaptiveQuadrature_info.status );
75}
#define nf_GnG_adaptiveQuadrature_MaxMaxDepth
@ nfu_Okay
Definition: nf_utilities.h:25
enum nfu_status_e nfu_status
#define DBL_EPSILON
Definition: templates.hh:66

Referenced by ptwXY_integrateWithFunction().