G4GaussLegendreQ Class Reference

#include <G4GaussLegendreQ.hh>

Inheritance diagram for G4GaussLegendreQ:

G4VGaussianQuadrature

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

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.

00034    : G4VGaussianQuadrature(pFunction)
00035 {
00036 }

G4GaussLegendreQ::G4GaussLegendreQ ( function  pFunction,
G4int  nLegendre 
)

Definition at line 47 of file G4GaussLegendreQ.cc.

References G4VGaussianQuadrature::fAbscissa, FatalException, G4VGaussianQuadrature::fNumber, G4VGaussianQuadrature::fWeight, G4Exception(), and G4INCL::Math::pi.

00049    : G4VGaussianQuadrature(pFunction)
00050 {
00051    const G4double tolerance = 1.6e-10 ;
00052    G4int k = nLegendre ;
00053    fNumber = (nLegendre + 1)/2 ;
00054    if(2*fNumber != k)
00055    {
00056       G4Exception("G4GaussLegendreQ::G4GaussLegendreQ()", "InvalidCall",
00057                   FatalException, "Invalid nLegendre argument !") ;
00058    }
00059    G4double newton0=0.0, newton1=0.0,
00060             temp1=0.0, temp2=0.0, temp3=0.0, temp=0.0 ;
00061 
00062    fAbscissa = new G4double[fNumber] ;
00063    fWeight   = new G4double[fNumber] ;
00064       
00065    for(G4int i=1;i<=fNumber;i++)      // Loop over the desired roots
00066    {
00067       newton0 = std::cos(pi*(i - 0.25)/(k + 0.5)) ;  // Initial root
00068       do                                            // approximation
00069       {               // loop of Newton's method               
00070          temp1 = 1.0 ;
00071          temp2 = 0.0 ;
00072          for(G4int j=1;j<=k;j++)
00073          {
00074             temp3 = temp2 ;
00075             temp2 = temp1 ;
00076             temp1 = ((2.0*j - 1.0)*newton0*temp2 - (j - 1.0)*temp3)/j ;
00077          }
00078          temp = k*(newton0*temp1 - temp2)/(newton0*newton0 - 1.0) ;
00079          newton1 = newton0 ;
00080          newton0 = newton1 - temp1/temp ;       // Newton's method
00081       }
00082       while(std::fabs(newton0 - newton1) > tolerance) ;
00083 
00084       fAbscissa[fNumber-i] = newton0 ;
00085       fWeight[fNumber-i] = 2.0/((1.0 - newton0*newton0)*temp*temp) ;
00086    }
00087 }


Member Function Documentation

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

Definition at line 154 of file G4GaussLegendreQ.cc.

References G4VGaussianQuadrature::fFunction.

00155 {   
00156    // From Abramowitz M., Stegan I.A. 1964 , Handbook of Math... , p. 919
00157    
00158    static 
00159    G4double abscissa[] = { 
00160                            0.016276744849602969579, 0.048812985136049731112,
00161                            0.081297495464425558994, 0.113695850110665920911,
00162                            0.145973714654896941989, 0.178096882367618602759,  // 6
00163                            
00164                            0.210031310460567203603, 0.241743156163840012328,
00165                            0.273198812591049141487, 0.304364944354496353024,
00166                            0.335208522892625422616, 0.365696861472313635031,  // 12
00167    
00168                            0.395797649828908603285, 0.425478988407300545365,
00169                            0.454709422167743008636, 0.483457973920596359768,
00170                            0.511694177154667673586, 0.539388108324357436227,  // 18
00171    
00172                            0.566510418561397168404, 0.593032364777572080684,
00173                            0.618925840125468570386, 0.644163403784967106798,
00174                            0.668718310043916153953, 0.692564536642171561344,  // 24
00175    
00176                            0.715676812348967626225, 0.738030643744400132851,
00177                            0.759602341176647498703, 0.780369043867433217604,
00178                            0.800308744139140817229, 0.819400310737931675539,  // 30
00179    
00180                            0.837623511228187121494, 0.854959033434601455463,
00181                            0.871388505909296502874, 0.886894517402420416057,
00182                            0.901460635315852341319, 0.915071423120898074206,  // 36
00183    
00184                            0.927712456722308690965, 0.939370339752755216932,
00185                            0.950032717784437635756, 0.959688291448742539300,
00186                            0.968326828463264212174, 0.975939174585136466453,  // 42
00187    
00188                            0.982517263563014677447, 0.988054126329623799481,
00189                            0.992543900323762624572, 0.995981842987209290650,
00190                            0.998364375863181677724, 0.999689503883230766828   // 48
00191                                                                             } ;
00192    
00193    static 
00194    G4double weight[] =   {  
00195                            0.032550614492363166242, 0.032516118713868835987,
00196                            0.032447163714064269364, 0.032343822568575928429,
00197                            0.032206204794030250669, 0.032034456231992663218,  // 6
00198    
00199                            0.031828758894411006535, 0.031589330770727168558,
00200                            0.031316425596862355813, 0.031010332586313837423,
00201                            0.030671376123669149014, 0.030299915420827593794,  // 12
00202    
00203                            0.029896344136328385984, 0.029461089958167905970,
00204                            0.028994614150555236543, 0.028497411065085385646,
00205                            0.027970007616848334440, 0.027412962726029242823,  // 18
00206    
00207                            0.026826866725591762198, 0.026212340735672413913,
00208                            0.025570036005349361499, 0.024900633222483610288,
00209                            0.024204841792364691282, 0.023483399085926219842,  // 24
00210    
00211                            0.022737069658329374001, 0.021966644438744349195,
00212                            0.021172939892191298988, 0.020356797154333324595,
00213                            0.019519081140145022410, 0.018660679627411467385,  // 30
00214    
00215                            0.017782502316045260838, 0.016885479864245172450,
00216                            0.015970562902562291381, 0.015038721026994938006,
00217                            0.014090941772314860916, 0.013128229566961572637,  // 36
00218    
00219                            0.012151604671088319635, 0.011162102099838498591,
00220                            0.010160770535008415758, 0.009148671230783386633,
00221                            0.008126876925698759217, 0.007096470791153865269,  // 42
00222    
00223                            0.006058545504235961683, 0.005014202742927517693,
00224                            0.003964554338444686674, 0.002910731817934946408,
00225                            0.001853960788946921732, 0.000796792065552012429   // 48
00226                                                                             } ;
00227    G4double xMean = 0.5*(a + b),
00228             xDiff = 0.5*(b - a),
00229             integral = 0.0, dx = 0.0 ;
00230    for(G4int i=0;i<48;i++)
00231    {
00232       dx = xDiff*abscissa[i] ;
00233       integral += weight[i]*(fFunction(xMean + dx) + fFunction(xMean - dx)) ;
00234    }
00235    return integral *= xDiff ;
00236 }

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

Definition at line 99 of file G4GaussLegendreQ.cc.

References G4VGaussianQuadrature::fAbscissa, G4VGaussianQuadrature::fFunction, G4VGaussianQuadrature::fNumber, and G4VGaussianQuadrature::fWeight.

00100 {
00101    G4double xMean = 0.5*(a + b),
00102             xDiff = 0.5*(b - a),
00103             integral = 0.0, dx = 0.0 ;
00104    for(G4int i=0;i<fNumber;i++)
00105    {
00106       dx = xDiff*fAbscissa[i] ;
00107       integral += fWeight[i]*(fFunction(xMean + dx) + fFunction(xMean - dx)) ;
00108    }
00109    return integral *= xDiff ;
00110 }

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

Definition at line 122 of file G4GaussLegendreQ.cc.

References G4VGaussianQuadrature::fFunction.

00123 {
00124    // From Abramowitz M., Stegan I.A. 1964 , Handbook of Math... , p. 916
00125 
00126    static G4double abscissa[] = { 0.148874338981631, 0.433395394129247,
00127                                   0.679409568299024, 0.865063366688985,
00128                                   0.973906528517172                      } ;
00129    
00130    static G4double weight[] =   { 0.295524224714753, 0.269266719309996, 
00131                                   0.219086362515982, 0.149451349150581,
00132                                   0.066671344308688                      } ;
00133    G4double xMean = 0.5*(a + b),
00134             xDiff = 0.5*(b - a),
00135             integral = 0.0, dx = 0.0 ;
00136    for(G4int i=0;i<5;i++)
00137    {
00138       dx = xDiff*abscissa[i] ;
00139       integral += weight[i]*(fFunction(xMean + dx) + fFunction(xMean - dx)) ;
00140    }
00141    return integral *= xDiff ;
00142 }


The documentation for this class was generated from the following files:
Generated on Mon May 27 17:52:02 2013 for Geant4 by  doxygen 1.4.7