Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/global/HEPNumerics/src/G4GaussJacobiQ.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /global/HEPNumerics/src/G4GaussJacobiQ.cc (Version 11.3.0) and /global/HEPNumerics/src/G4GaussJacobiQ.cc (Version 9.6.p4)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 // G4GaussJacobiQ class implementation         << 
 27 //                                                 26 //
 28 // Author: V.Grichine, 13.05.1997              <<  27 // $Id$
 29 // ------------------------------------------- <<  28 //
 30                                                << 
 31 #include "G4GaussJacobiQ.hh"                       29 #include "G4GaussJacobiQ.hh"
 32                                                    30 
                                                   >>  31 
 33 // -------------------------------------------     32 // -------------------------------------------------------------
 34 //                                                 33 //
 35 // Constructor for Gauss-Jacobi integration me <<  34 // Constructor for Gauss-Jacobi integration method. 
 36 //                                                 35 //
 37                                                    36 
 38 G4GaussJacobiQ::G4GaussJacobiQ(function pFunct <<  37 G4GaussJacobiQ::G4GaussJacobiQ(       function pFunction,
 39                                G4double beta,  <<  38                                       G4double alpha,
 40   : G4VGaussianQuadrature(pFunction)           <<  39                                       G4double beta, 
                                                   >>  40                                       G4int nJacobi           ) 
                                                   >>  41    : G4VGaussianQuadrature(pFunction)
 41                                                    42 
 42 {                                                  43 {
 43   const G4double tolerance = 1.0e-12;          <<  44   const G4double tolerance = 1.0e-12 ;
 44   const G4double maxNumber = 12;               <<  45   const G4double maxNumber = 12 ;
 45   G4int i = 1, k = 1;                          <<  46   G4int i=1, k=1 ;
 46   G4double root      = 0.;                     <<  47   G4double root=0.;
 47   G4double alphaBeta = 0.0, alphaReduced = 0.0 <<  48   G4double alphaBeta=0.0, alphaReduced=0.0, betaReduced=0.0,
 48            root2 = 0.0, root3 = 0.0;           <<  49            root1=0.0, root2=0.0, root3=0.0 ;
 49   G4double a = 0.0, b = 0.0, c = 0.0, newton1  <<  50   G4double a=0.0, b=0.0, c=0.0,
 50            newton3 = 0.0, newton0 = 0.0, temp  <<  51            newton1=0.0, newton2=0.0, newton3=0.0, newton0=0.0,
 51                                                <<  52            temp=0.0, rootTemp=0.0 ;
 52   fNumber   = nJacobi;                         <<  53 
 53   fAbscissa = new G4double[fNumber];           <<  54   fNumber   = nJacobi ;
 54   fWeight   = new G4double[fNumber];           <<  55   fAbscissa = new G4double[fNumber] ;
                                                   >>  56   fWeight   = new G4double[fNumber] ;
 55                                                    57 
 56   for(i = 1; i <= nJacobi; ++i)                <<  58   for (i=1;i<=nJacobi;i++)
 57   {                                                59   {
 58     if(i == 1)                                 <<  60      if (i == 1)
 59     {                                          <<  61      {
 60       alphaReduced = alpha / nJacobi;          <<  62         alphaReduced = alpha/nJacobi ;
 61       betaReduced  = beta / nJacobi;           <<  63         betaReduced = beta/nJacobi ;
 62       root1        = (1.0 + alpha) * (2.78002  <<  64         root1 = (1.0+alpha)*(2.78002/(4.0+nJacobi*nJacobi)+
 63                                0.767999 * alph <<  65               0.767999*alphaReduced/nJacobi) ;
 64       root2        = 1.0 + 1.48 * alphaReduced <<  66         root2 = 1.0+1.48*alphaReduced+0.96002*betaReduced
 65               0.451998 * alphaReduced * alphaR <<  67               + 0.451998*alphaReduced*alphaReduced
 66               0.83001 * alphaReduced * betaRed <<  68               + 0.83001*alphaReduced*betaReduced ;
 67       root = 1.0 - root1 / root2;              <<  69         root  = 1.0-root1/root2 ;
 68     }                                          <<  70      } 
 69     else if(i == 2)                            <<  71      else if (i == 2)
 70     {                                          <<  72      {
 71       root1 = (4.1002 + alpha) / ((1.0 + alpha <<  73         root1=(4.1002+alpha)/((1.0+alpha)*(1.0+0.155998*alpha)) ;
 72       root2 = 1.0 + 0.06 * (nJacobi - 8.0) * ( <<  74         root2=1.0+0.06*(nJacobi-8.0)*(1.0+0.12*alpha)/nJacobi ;
 73       root3 =                                  <<  75         root3=1.0+0.012002*beta*(1.0+0.24997*std::fabs(alpha))/nJacobi ;
 74         1.0 + 0.012002 * beta * (1.0 + 0.24997 <<  76         root -= (1.0-root)*root1*root2*root3 ;
 75       root -= (1.0 - root) * root1 * root2 * r <<  77      } 
 76     }                                          <<  78      else if (i == 3) 
 77     else if(i == 3)                            <<  79      {
 78     {                                          <<  80         root1=(1.67001+0.27998*alpha)/(1.0+0.37002*alpha) ;
 79       root1 = (1.67001 + 0.27998 * alpha) / (1 <<  81         root2=1.0+0.22*(nJacobi-8.0)/nJacobi ;
 80       root2 = 1.0 + 0.22 * (nJacobi - 8.0) / n <<  82         root3=1.0+8.0*beta/((6.28001+beta)*nJacobi*nJacobi) ;
 81       root3 = 1.0 + 8.0 * beta / ((6.28001 + b <<  83         root -= (fAbscissa[0]-root)*root1*root2*root3 ;
 82       root -= (fAbscissa[0] - root) * root1 *  <<  84      }
 83     }                                          <<  85      else if (i == nJacobi-1)
 84     else if(i == nJacobi - 1)                  <<  86      {
 85     {                                          <<  87         root1=(1.0+0.235002*beta)/(0.766001+0.118998*beta) ;
 86       root1 = (1.0 + 0.235002 * beta) / (0.766 <<  88         root2=1.0/(1.0+0.639002*(nJacobi-4.0)/(1.0+0.71001*(nJacobi-4.0))) ;
 87       root2 = 1.0 / (1.0 + 0.639002 * (nJacobi <<  89         root3=1.0/(1.0+20.0*alpha/((7.5+alpha)*nJacobi*nJacobi)) ;
 88                              (1.0 + 0.71001 *  <<  90         root += (root-fAbscissa[nJacobi-4])*root1*root2*root3 ;
 89       root3 = 1.0 / (1.0 + 20.0 * alpha / ((7. <<  91      } 
 90       root += (root - fAbscissa[nJacobi - 4])  <<  92      else if (i == nJacobi) 
 91     }                                          <<  93      {
 92     else if(i == nJacobi)                      <<  94         root1 = (1.0+0.37002*beta)/(1.67001+0.27998*beta) ;
 93     {                                          <<  95         root2 = 1.0/(1.0+0.22*(nJacobi-8.0)/nJacobi) ;
 94       root1 = (1.0 + 0.37002 * beta) / (1.6700 <<  96         root3 = 1.0/(1.0+8.0*alpha/((6.28002+alpha)*nJacobi*nJacobi)) ;
 95       root2 = 1.0 / (1.0 + 0.22 * (nJacobi - 8 <<  97         root += (root-fAbscissa[nJacobi-3])*root1*root2*root3 ;
 96       root3 =                                  <<  98      } 
 97         1.0 / (1.0 + 8.0 * alpha / ((6.28002 + <<  99      else
 98       root += (root - fAbscissa[nJacobi - 3])  << 100      {
 99     }                                          << 101         root = 3.0*fAbscissa[i-2]-3.0*fAbscissa[i-3]+fAbscissa[i-4] ;
100     else                                       << 102      }
101     {                                          << 103      alphaBeta = alpha + beta ;
102       root = 3.0 * fAbscissa[i - 2] - 3.0 * fA << 104      for (k=1;k<=maxNumber;k++)
103     }                                          << 105      {
104     alphaBeta = alpha + beta;                  << 106         temp = 2.0 + alphaBeta ;
105     for(k = 1; k <= maxNumber; ++k)            << 107         newton1 = (alpha-beta+temp*root)/2.0 ;
106     {                                          << 108         newton2 = 1.0 ;
107       temp    = 2.0 + alphaBeta;               << 109         for (G4int j=2;j<=nJacobi;j++)
108       newton1 = (alpha - beta + temp * root) / << 110         {
109       newton2 = 1.0;                           << 111            newton3 = newton2 ;
110       for(G4int j = 2; j <= nJacobi; ++j)      << 112            newton2 = newton1 ;
111       {                                        << 113            temp = 2*j+alphaBeta ;
112         newton3 = newton2;                     << 114            a = 2*j*(j+alphaBeta)*(temp-2.0) ;
113         newton2 = newton1;                     << 115            b = (temp-1.0)*(alpha*alpha-beta*beta+temp*(temp-2.0)*root) ;
114         temp    = 2 * j + alphaBeta;           << 116            c = 2.0*(j-1+alpha)*(j-1+beta)*temp ;
115         a       = 2 * j * (j + alphaBeta) * (t << 117            newton1 = (b*newton2-c*newton3)/a ;
116         b       = (temp - 1.0) *               << 118         }
117             (alpha * alpha - beta * beta + tem << 119         newton0 = (nJacobi*(alpha - beta - temp*root)*newton1 +
118         c       = 2.0 * (j - 1 + alpha) * (j - << 120                2.0*(nJacobi + alpha)*(nJacobi + beta)*newton2)/
119         newton1 = (b * newton2 - c * newton3)  << 121               (temp*(1.0 - root*root)) ;
120       }                                        << 122         rootTemp = root ;
121       newton0 = (nJacobi * (alpha - beta - tem << 123         root = rootTemp - newton1/newton0 ;
122                  2.0 * (nJacobi + alpha) * (nJ << 124         if (std::fabs(root-rootTemp) <= tolerance)
123                 (temp * (1.0 - root * root));  << 125         {
124       rootTemp = root;                         << 126            break ;
125       root     = rootTemp - newton1 / newton0; << 127         }
126       if(std::fabs(root - rootTemp) <= toleran << 128      }
127       {                                        << 129      if (k > maxNumber) 
128         break;                                 << 130      {
129       }                                        << 131         G4Exception("G4GaussJacobiQ::G4GaussJacobiQ()", "OutOfRange",
130     }                                          << 132                     FatalException, "Too many iterations in constructor.") ;
131     if(k > maxNumber)                          << 133      }
132     {                                          << 134      fAbscissa[i-1] = root ;
133       G4Exception("G4GaussJacobiQ::G4GaussJaco << 135      fWeight[i-1] = std::exp(GammaLogarithm((G4double)(alpha+nJacobi)) + 
134                   FatalException, "Too many it << 136                         GammaLogarithm((G4double)(beta+nJacobi)) - 
135     }                                          << 137                         GammaLogarithm((G4double)(nJacobi+1.0)) -
136     fAbscissa[i - 1] = root;                   << 138                         GammaLogarithm((G4double)(nJacobi + alphaBeta + 1.0)))
137     fWeight[i - 1] =                           << 139                         *temp*std::pow(2.0,alphaBeta)/(newton0*newton2) ;
138       std::exp(GammaLogarithm((G4double)(alpha << 
139                GammaLogarithm((G4double)(beta  << 
140                GammaLogarithm((G4double)(nJaco << 
141                GammaLogarithm((G4double)(nJaco << 
142       temp * std::pow(2.0, alphaBeta) / (newto << 
143   }                                               140   }
144 }                                                 141 }
145                                                   142 
                                                   >> 143 
146 // -------------------------------------------    144 // ----------------------------------------------------------
147 //                                                145 //
148 // Gauss-Jacobi method for integration of         146 // Gauss-Jacobi method for integration of
149 // ((1-x)^alpha)*((1+x)^beta)*pFunction(x)        147 // ((1-x)^alpha)*((1+x)^beta)*pFunction(x)
150 // from minus unit to plus unit .                 148 // from minus unit to plus unit .
151                                                   149 
152 G4double G4GaussJacobiQ::Integral() const      << 150 
                                                   >> 151 G4double 
                                                   >> 152 G4GaussJacobiQ::Integral() const 
153 {                                                 153 {
154   G4double integral = 0.0;                     << 154    G4double integral = 0.0 ;
155   for(G4int i = 0; i < fNumber; ++i)           << 155    for(G4int i=0;i<fNumber;i++)
156   {                                            << 156    {
157     integral += fWeight[i] * fFunction(fAbscis << 157       integral += fWeight[i]*fFunction(fAbscissa[i]) ;
158   }                                            << 158    }
159   return integral;                             << 159    return integral ;
160 }                                                 160 }
                                                   >> 161 
161                                                   162