Geant4  10.03.p01
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4GaussLegendreQ Class Reference

#include <G4GaussLegendreQ.hh>

Inheritance diagram for G4GaussLegendreQ:
Collaboration diagram for G4GaussLegendreQ:

Public Member Functions

 G4GaussLegendreQ (function pFunction)
 
 G4GaussLegendreQ (function pFunction, G4int nLegendre)
 
G4double Integral (G4double a, G4double b) const
 
G4double QuickIntegral (G4double a, G4double b) const
 
G4double AccurateIntegral (G4double a, G4double b) const
 
- Public Member Functions inherited from G4VGaussianQuadrature
 G4VGaussianQuadrature (function pFunction)
 
virtual ~G4VGaussianQuadrature ()
 
G4double GetAbscissa (G4int index) const
 
G4double GetWeight (G4int index) const
 
G4int GetNumber () const
 

Additional Inherited Members

- Protected Member Functions inherited from G4VGaussianQuadrature
G4double GammaLogarithm (G4double xx)
 
- Protected Attributes inherited from G4VGaussianQuadrature
function fFunction
 
G4doublefAbscissa
 
G4doublefWeight
 
G4int fNumber
 

Detailed Description

Definition at line 90 of file G4GaussLegendreQ.hh.

Constructor & Destructor Documentation

G4GaussLegendreQ::G4GaussLegendreQ ( function  pFunction)
explicit

Definition at line 33 of file G4GaussLegendreQ.cc.

34  : G4VGaussianQuadrature(pFunction)
35 {
36 }
G4VGaussianQuadrature(function pFunction)
G4GaussLegendreQ::G4GaussLegendreQ ( function  pFunction,
G4int  nLegendre 
)

Definition at line 47 of file G4GaussLegendreQ.cc.

49  : G4VGaussianQuadrature(pFunction)
50 {
51  const G4double tolerance = 1.6e-10 ;
52  G4int k = nLegendre ;
53  fNumber = (nLegendre + 1)/2 ;
54  if(2*fNumber != k)
55  {
56  G4Exception("G4GaussLegendreQ::G4GaussLegendreQ()", "InvalidCall",
57  FatalException, "Invalid nLegendre argument !") ;
58  }
59  G4double newton0=0.0, newton1=0.0,
60  temp1=0.0, temp2=0.0, temp3=0.0, temp=0.0 ;
61 
62  fAbscissa = new G4double[fNumber] ;
63  fWeight = new G4double[fNumber] ;
64 
65  for(G4int i=1;i<=fNumber;i++) // Loop over the desired roots
66  {
67  newton0 = std::cos(pi*(i - 0.25)/(k + 0.5)) ; // Initial root
68  do // approximation
69  { // loop of Newton's method
70  temp1 = 1.0 ;
71  temp2 = 0.0 ;
72  for(G4int j=1;j<=k;j++)
73  {
74  temp3 = temp2 ;
75  temp2 = temp1 ;
76  temp1 = ((2.0*j - 1.0)*newton0*temp2 - (j - 1.0)*temp3)/j ;
77  }
78  temp = k*(newton0*temp1 - temp2)/(newton0*newton0 - 1.0) ;
79  newton1 = newton0 ;
80  newton0 = newton1 - temp1/temp ; // Newton's method
81  }
82  while(std::fabs(newton0 - newton1) > tolerance) ;
83 
84  fAbscissa[fNumber-i] = newton0 ;
85  fWeight[fNumber-i] = 2.0/((1.0 - newton0*newton0)*temp*temp) ;
86  }
87 }
G4VGaussianQuadrature(function pFunction)
int G4int
Definition: G4Types.hh:78
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
static constexpr double pi
Definition: G4SIunits.hh:75
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Member Function Documentation

G4double G4GaussLegendreQ::AccurateIntegral ( G4double  a,
G4double  b 
) const

Definition at line 154 of file G4GaussLegendreQ.cc.

155 {
156  // From Abramowitz M., Stegan I.A. 1964 , Handbook of Math... , p. 919
157 
158  static const
159  G4double abscissa[] = {
160  0.016276744849602969579, 0.048812985136049731112,
161  0.081297495464425558994, 0.113695850110665920911,
162  0.145973714654896941989, 0.178096882367618602759, // 6
163 
164  0.210031310460567203603, 0.241743156163840012328,
165  0.273198812591049141487, 0.304364944354496353024,
166  0.335208522892625422616, 0.365696861472313635031, // 12
167 
168  0.395797649828908603285, 0.425478988407300545365,
169  0.454709422167743008636, 0.483457973920596359768,
170  0.511694177154667673586, 0.539388108324357436227, // 18
171 
172  0.566510418561397168404, 0.593032364777572080684,
173  0.618925840125468570386, 0.644163403784967106798,
174  0.668718310043916153953, 0.692564536642171561344, // 24
175 
176  0.715676812348967626225, 0.738030643744400132851,
177  0.759602341176647498703, 0.780369043867433217604,
178  0.800308744139140817229, 0.819400310737931675539, // 30
179 
180  0.837623511228187121494, 0.854959033434601455463,
181  0.871388505909296502874, 0.886894517402420416057,
182  0.901460635315852341319, 0.915071423120898074206, // 36
183 
184  0.927712456722308690965, 0.939370339752755216932,
185  0.950032717784437635756, 0.959688291448742539300,
186  0.968326828463264212174, 0.975939174585136466453, // 42
187 
188  0.982517263563014677447, 0.988054126329623799481,
189  0.992543900323762624572, 0.995981842987209290650,
190  0.998364375863181677724, 0.999689503883230766828 // 48
191  } ;
192 
193  static const
194  G4double weight[] = {
195  0.032550614492363166242, 0.032516118713868835987,
196  0.032447163714064269364, 0.032343822568575928429,
197  0.032206204794030250669, 0.032034456231992663218, // 6
198 
199  0.031828758894411006535, 0.031589330770727168558,
200  0.031316425596862355813, 0.031010332586313837423,
201  0.030671376123669149014, 0.030299915420827593794, // 12
202 
203  0.029896344136328385984, 0.029461089958167905970,
204  0.028994614150555236543, 0.028497411065085385646,
205  0.027970007616848334440, 0.027412962726029242823, // 18
206 
207  0.026826866725591762198, 0.026212340735672413913,
208  0.025570036005349361499, 0.024900633222483610288,
209  0.024204841792364691282, 0.023483399085926219842, // 24
210 
211  0.022737069658329374001, 0.021966644438744349195,
212  0.021172939892191298988, 0.020356797154333324595,
213  0.019519081140145022410, 0.018660679627411467385, // 30
214 
215  0.017782502316045260838, 0.016885479864245172450,
216  0.015970562902562291381, 0.015038721026994938006,
217  0.014090941772314860916, 0.013128229566961572637, // 36
218 
219  0.012151604671088319635, 0.011162102099838498591,
220  0.010160770535008415758, 0.009148671230783386633,
221  0.008126876925698759217, 0.007096470791153865269, // 42
222 
223  0.006058545504235961683, 0.005014202742927517693,
224  0.003964554338444686674, 0.002910731817934946408,
225  0.001853960788946921732, 0.000796792065552012429 // 48
226  } ;
227  G4double xMean = 0.5*(a + b),
228  xDiff = 0.5*(b - a),
229  integral = 0.0, dx = 0.0 ;
230  for(G4int i=0;i<48;i++)
231  {
232  dx = xDiff*abscissa[i] ;
233  integral += weight[i]*(fFunction(xMean + dx) + fFunction(xMean - dx)) ;
234  }
235  return integral *= xDiff ;
236 }
int G4int
Definition: G4Types.hh:78
double G4double
Definition: G4Types.hh:76
G4double G4GaussLegendreQ::Integral ( G4double  a,
G4double  b 
) const

Definition at line 99 of file G4GaussLegendreQ.cc.

100 {
101  G4double xMean = 0.5*(a + b),
102  xDiff = 0.5*(b - a),
103  integral = 0.0, dx = 0.0 ;
104  for(G4int i=0;i<fNumber;i++)
105  {
106  dx = xDiff*fAbscissa[i] ;
107  integral += fWeight[i]*(fFunction(xMean + dx) + fFunction(xMean - dx)) ;
108  }
109  return integral *= xDiff ;
110 }
int G4int
Definition: G4Types.hh:78
double G4double
Definition: G4Types.hh:76
G4double G4GaussLegendreQ::QuickIntegral ( G4double  a,
G4double  b 
) const

Definition at line 122 of file G4GaussLegendreQ.cc.

123 {
124  // From Abramowitz M., Stegan I.A. 1964 , Handbook of Math... , p. 916
125 
126  static const G4double abscissa[] = { 0.148874338981631, 0.433395394129247,
127  0.679409568299024, 0.865063366688985,
128  0.973906528517172 } ;
129 
130  static const G4double weight[] = { 0.295524224714753, 0.269266719309996,
131  0.219086362515982, 0.149451349150581,
132  0.066671344308688 } ;
133  G4double xMean = 0.5*(a + b),
134  xDiff = 0.5*(b - a),
135  integral = 0.0, dx = 0.0 ;
136  for(G4int i=0;i<5;i++)
137  {
138  dx = xDiff*abscissa[i] ;
139  integral += weight[i]*(fFunction(xMean + dx) + fFunction(xMean - dx)) ;
140  }
141  return integral *= xDiff ;
142 }
int G4int
Definition: G4Types.hh:78
double G4double
Definition: G4Types.hh:76

The documentation for this class was generated from the following files: