Geant4 Cross Reference |
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 // G4GaussHermiteQ class implementation << 27 // 26 // 28 // Author: V.Grichine, 13.05.1997 V.Grichine << 27 // $Id$ 29 // ------------------------------------------- << 28 // 30 29 31 #include "G4GaussHermiteQ.hh" 30 #include "G4GaussHermiteQ.hh" 32 #include "G4PhysicalConstants.hh" 31 #include "G4PhysicalConstants.hh" 33 32 34 #include <limits> << 35 << 36 // ------------------------------------------- 33 // ---------------------------------------------------------- 37 // 34 // 38 // Constructor for Gauss-Hermite 35 // Constructor for Gauss-Hermite 39 36 40 G4GaussHermiteQ::G4GaussHermiteQ(function pFun << 37 G4GaussHermiteQ::G4GaussHermiteQ ( function pFunction, 41 : G4VGaussianQuadrature(pFunction) << 38 G4int nHermite ) >> 39 : G4VGaussianQuadrature(pFunction) 42 { 40 { 43 const G4double tolerance = 1.0e-12; << 41 const G4double tolerance = 1.0e-12 ; 44 const G4int maxNumber = 12; << 42 const G4int maxNumber = 12 ; 45 << 43 46 G4int i = 1, j = 1, k = 1; << 44 G4int i=1, j=1, k=1 ; 47 G4double newton0 = 0.; << 45 G4double newton0=0.; 48 G4double newton1 = 0.0, temp1 = 0.0, temp2 = << 46 G4double newton1=0.0, temp1=0.0, temp2=0.0, temp3=0.0, temp=0.0 ; 49 G4double piInMinusQ = std::pow(pi, -0.25); << 47 G4double piInMinusQ = std::pow(pi,-0.25) ; // 1.0/std::sqrt(std::sqrt(pi)) ?? 50 << 48 51 fNumber = (nHermite + 1) / 2; << 49 fNumber = (nHermite +1)/2 ; 52 fAbscissa = new G4double[fNumber]; << 50 fAbscissa = new G4double[fNumber] ; 53 fWeight = new G4double[fNumber]; << 51 fWeight = new G4double[fNumber] ; 54 << 52 55 for(i = 1; i <= fNumber; ++i) << 53 for(i=1;i<=fNumber;i++) 56 { << 54 { 57 if(i == 1) << 55 if(i == 1) 58 { << 56 { 59 newton0 = << 57 newton0 = std::sqrt((G4double)(2*nHermite + 1)) - 60 std::sqrt((G4double)(2 * nHermite + 1) << 58 1.85575001*std::pow((G4double)(2*nHermite + 1),-0.16666999) ; 61 1.85575001 * std::pow((G4double)(2 * n << 59 } 62 } << 60 else if(i == 2) 63 else if(i == 2) << 61 { 64 { << 62 newton0 -= 1.14001*std::pow((G4double)nHermite,0.425999)/newton0 ; 65 newton0 -= 1.14001 * std::pow((G4double) << 63 } 66 } << 64 else if(i == 3) 67 else if(i == 3) << 65 { 68 { << 66 newton0 = 1.86002*newton0 - 0.86002*fAbscissa[0] ; 69 newton0 = 1.86002 * newton0 - 0.86002 * << 67 } 70 } << 68 else if(i == 4) 71 else if(i == 4) << 69 { 72 { << 70 newton0 = 1.91001*newton0 - 0.91001*fAbscissa[1] ; 73 newton0 = 1.91001 * newton0 - 0.91001 * << 71 } 74 } << 72 else 75 else << 73 { 76 { << 74 newton0 = 2.0*newton0 - fAbscissa[i - 3] ; 77 newton0 = 2.0 * newton0 - fAbscissa[i - << 75 } 78 } << 76 for(k=1;k<=maxNumber;k++) 79 for(k = 1; k <= maxNumber; ++k) << 77 { 80 { << 78 temp1 = piInMinusQ ; 81 temp1 = piInMinusQ; << 79 temp2 = 0.0 ; 82 temp2 = 0.0; << 80 for(j=1;j<=nHermite;j++) 83 for(j = 1; j <= nHermite; ++j) << 81 { 84 { << 82 temp3 = temp2 ; 85 temp3 = temp2; << 83 temp2 = temp1 ; 86 temp2 = temp1; << 84 temp1 = newton0*std::sqrt(2.0/j)*temp2 87 temp1 = newton0 * std::sqrt(2.0 / j) * << 85 - std::sqrt(((G4double)(j - 1))/j)*temp3 ; 88 std::sqrt(((G4double)(j - 1)) << 86 } 89 } << 87 temp = std::sqrt((G4double)2*nHermite)*temp2 ; 90 temp = std::sqrt((G4double) 2 * nHerm << 88 newton1 = newton0 ; 91 newton1 = newton0; << 89 newton0 = newton1 - temp1/temp ; 92 G4double ratio = std::numeric_limits<G4d << 90 if(std::fabs(newton0 - newton1) <= tolerance) 93 if(temp > 0.0) << 91 { 94 { << 92 break ; 95 ratio = temp1 / temp; << 93 } 96 } << 94 } 97 newton0 = newton1 - ratio; << 95 if(k > maxNumber) 98 if(std::fabs(newton0 - newton1) <= toler << 96 { 99 { << 97 G4Exception("G4GaussHermiteQ::G4GaussHermiteQ()", 100 break; << 98 "OutOfRange", FatalException, 101 } << 99 "Too many iterations in Gauss-Hermite constructor.") ; 102 } << 100 } 103 if(k > maxNumber) << 101 fAbscissa[i-1] = newton0 ; 104 { << 102 fWeight[i-1] = 2.0/(temp*temp) ; 105 G4Exception("G4GaussHermiteQ::G4GaussHer << 103 } 106 FatalException, << 107 "Too many iterations in Gaus << 108 } << 109 fAbscissa[i - 1] = newton0; << 110 fWeight[i - 1] = 2.0 / (temp * temp); << 111 } << 112 } 104 } 113 105 >> 106 114 // ------------------------------------------- 107 // ---------------------------------------------------------- 115 // 108 // 116 // Gauss-Hermite method for integration of std 109 // Gauss-Hermite method for integration of std::exp(-x*x)*nFunction(x) 117 // from minus infinity to plus infinity . << 110 // from minus infinity to plus infinity . 118 111 119 G4double G4GaussHermiteQ::Integral() const << 112 G4double G4GaussHermiteQ::Integral() const 120 { 113 { 121 G4double integral = 0.0; << 114 G4double integral = 0.0 ; 122 for(G4int i = 0; i < fNumber; ++i) << 115 for(G4int i=0;i<fNumber;i++) 123 { << 116 { 124 integral += << 117 integral += fWeight[i]*(fFunction(fAbscissa[i]) 125 fWeight[i] * (fFunction(fAbscissa[i]) + << 118 + fFunction(-fAbscissa[i])) ; 126 } << 119 } 127 return integral; << 120 return integral ; 128 } 121 } 129 122