Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4GaussLegendreQ Class Reference

#include <G4GaussLegendreQ.hh>

+ Inheritance 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() [1/2]

G4GaussLegendreQ::G4GaussLegendreQ ( function  pFunction)
explicit

Definition at line 33 of file G4GaussLegendreQ.cc.

◆ G4GaussLegendreQ() [2/2]

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
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}
@ FatalException
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41

Member Function Documentation

◆ AccurateIntegral()

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
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
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}

◆ Integral()

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}

◆ QuickIntegral()

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 G4double abscissa[] = { 0.148874338981631, 0.433395394129247,
127 0.679409568299024, 0.865063366688985,
128 0.973906528517172 } ;
129
130 static 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}

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