Geant4-11
Public Member Functions | Protected Member Functions | Protected Attributes
G4GaussLaguerreQ Class Reference

#include <G4GaussLaguerreQ.hh>

Inheritance diagram for G4GaussLaguerreQ:
G4VGaussianQuadrature

Public Member Functions

 G4GaussLaguerreQ (const G4GaussLaguerreQ &)=delete
 
 G4GaussLaguerreQ (function pFunction, G4double alpha, G4int nLaguerre)
 
G4double GetAbscissa (G4int index) const
 
G4int GetNumber () const
 
G4double GetWeight (G4int index) const
 
G4double Integral () const
 
G4GaussLaguerreQoperator= (const G4GaussLaguerreQ &)=delete
 

Protected Member Functions

G4double GammaLogarithm (G4double xx)
 

Protected Attributes

G4doublefAbscissa = nullptr
 
function fFunction
 
G4int fNumber = 0
 
G4doublefWeight = nullptr
 

Detailed Description

Definition at line 44 of file G4GaussLaguerreQ.hh.

Constructor & Destructor Documentation

◆ G4GaussLaguerreQ() [1/2]

G4GaussLaguerreQ::G4GaussLaguerreQ ( function  pFunction,
G4double  alpha,
G4int  nLaguerre 
)

Definition at line 42 of file G4GaussLaguerreQ.cc.

44 : G4VGaussianQuadrature(pFunction)
45{
46 const G4double tolerance = 1.0e-10;
47 const G4int maxNumber = 12;
48 G4int i = 1, k = 1;
49 G4double newton0 = 0.0, newton1 = 0.0, temp1 = 0.0, temp2 = 0.0, temp3 = 0.0,
50 temp = 0.0, cofi = 0.0;
51
52 fNumber = nLaguerre;
55
56 for(i = 1; i <= fNumber; ++i) // Loop over the desired roots
57 {
58 if(i == 1)
59 {
60 newton0 = (1.0 + alpha) * (3.0 + 0.92 * alpha) /
61 (1.0 + 2.4 * fNumber + 1.8 * alpha);
62 }
63 else if(i == 2)
64 {
65 newton0 += (15.0 + 6.25 * alpha) / (1.0 + 0.9 * alpha + 2.5 * fNumber);
66 }
67 else
68 {
69 cofi = i - 2;
70 newton0 += ((1.0 + 2.55 * cofi) / (1.9 * cofi) +
71 1.26 * cofi * alpha / (1.0 + 3.5 * cofi)) *
72 (newton0 - fAbscissa[i - 3]) / (1.0 + 0.3 * alpha);
73 }
74 for(k = 1; k <= maxNumber; ++k)
75 {
76 temp1 = 1.0;
77 temp2 = 0.0;
78 for(G4int j = 1; j <= fNumber; ++j)
79 {
80 temp3 = temp2;
81 temp2 = temp1;
82 temp1 =
83 ((2 * j - 1 + alpha - newton0) * temp2 - (j - 1 + alpha) * temp3) / j;
84 }
85 temp = (fNumber * temp1 - (fNumber + alpha) * temp2) / newton0;
86 newton1 = newton0;
87 newton0 = newton1 - temp1 / temp;
88 if(std::fabs(newton0 - newton1) <= tolerance)
89 {
90 break;
91 }
92 }
93 if(k > maxNumber)
94 {
95 G4Exception("G4GaussLaguerreQ::G4GaussLaguerreQ()", "OutOfRange",
97 "Too many iterations in Gauss-Laguerre constructor");
98 }
99
100 fAbscissa[i - 1] = newton0;
101 fWeight[i - 1] = -std::exp(GammaLogarithm(alpha + fNumber) -
103 (temp * fNumber * temp2);
104 }
105}
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:35
static const G4double alpha
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
G4VGaussianQuadrature(function pFunction)
G4double GammaLogarithm(G4double xx)

References alpha, G4VGaussianQuadrature::fAbscissa, FatalException, G4VGaussianQuadrature::fNumber, G4VGaussianQuadrature::fWeight, G4Exception(), and G4VGaussianQuadrature::GammaLogarithm().

◆ G4GaussLaguerreQ() [2/2]

G4GaussLaguerreQ::G4GaussLaguerreQ ( const G4GaussLaguerreQ )
delete

Member Function Documentation

◆ GammaLogarithm()

G4double G4VGaussianQuadrature::GammaLogarithm ( G4double  xx)
protectedinherited

Definition at line 70 of file G4VGaussianQuadrature.cc.

71{
72 // Returns the value ln(Gamma(xx) for xx > 0. Full accuracy is obtained for
73 // xx > 1. For 0 < xx < 1. the reflection formula (6.1.4) can be used first.
74 // (Adapted from Numerical Recipes in C)
75
76 static const G4double cof[6] = { 76.18009172947146, -86.50532032941677,
77 24.01409824083091, -1.231739572450155,
78 0.1208650973866179e-2, -0.5395239384953e-5 };
79 G4double x = xx - 1.0;
80 G4double tmp = x + 5.5;
81 tmp -= (x + 0.5) * std::log(tmp);
82 G4double ser = 1.000000000190015;
83
84 for(size_t j = 0; j <= 5; ++j)
85 {
86 x += 1.0;
87 ser += cof[j] / x;
88 }
89 return -tmp + std::log(2.5066282746310005 * ser);
90}

Referenced by G4GaussJacobiQ::G4GaussJacobiQ(), and G4GaussLaguerreQ().

◆ GetAbscissa()

G4double G4VGaussianQuadrature::GetAbscissa ( G4int  index) const
inherited

Definition at line 53 of file G4VGaussianQuadrature.cc.

54{
55 return fAbscissa[index];
56}

References G4VGaussianQuadrature::fAbscissa.

◆ GetNumber()

G4int G4VGaussianQuadrature::GetNumber ( ) const
inherited

Definition at line 63 of file G4VGaussianQuadrature.cc.

63{ return fNumber; }

References G4VGaussianQuadrature::fNumber.

◆ GetWeight()

G4double G4VGaussianQuadrature::GetWeight ( G4int  index) const
inherited

Definition at line 58 of file G4VGaussianQuadrature.cc.

59{
60 return fWeight[index];
61}

References G4VGaussianQuadrature::fWeight.

◆ Integral()

G4double G4GaussLaguerreQ::Integral ( ) const

Definition at line 115 of file G4GaussLaguerreQ.cc.

116{
117 G4double integral = 0.0;
118 for(G4int i = 0; i < fNumber; ++i)
119 {
120 integral += fWeight[i] * fFunction(fAbscissa[i]);
121 }
122 return integral;
123}

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

◆ operator=()

G4GaussLaguerreQ & G4GaussLaguerreQ::operator= ( const G4GaussLaguerreQ )
delete

Field Documentation

◆ fAbscissa

G4double* G4VGaussianQuadrature::fAbscissa = nullptr
protectedinherited

◆ fFunction

function G4VGaussianQuadrature::fFunction
protectedinherited

◆ fNumber

G4int G4VGaussianQuadrature::fNumber = 0
protectedinherited

◆ fWeight

G4double* G4VGaussianQuadrature::fWeight = nullptr
protectedinherited

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