Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4ChebyshevApproximation.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27// $Id$
28//
29
32
33// Constructor for initialisation of the class data members.
34// It creates the array fChebyshevCof[0,...,fNumber-1], fNumber = n ;
35// which consists of Chebyshev coefficients describing the function
36// pointed by pFunction. The values a and b fix the interval of validity
37// of the Chebyshev approximation.
38
40 G4int n,
41 G4double a,
42 G4double b )
43 : fFunction(pFunction), fNumber(n),
44 fChebyshevCof(new G4double[fNumber]),
45 fMean(0.5*(b+a)), fDiff(0.5*(b-a))
46{
47 G4int i=0, j=0 ;
48 G4double rootSum=0.0, cofj=0.0 ;
49 G4double* tempFunction = new G4double[fNumber] ;
50 G4double weight = 2.0/fNumber ;
51 G4double cof = 0.5*weight*pi ; // pi/n
52
53 for (i=0;i<fNumber;i++)
54 {
55 rootSum = std::cos(cof*(i+0.5)) ;
56 tempFunction[i]= fFunction(rootSum*fDiff+fMean) ;
57 }
58 for (j=0;j<fNumber;j++)
59 {
60 cofj = cof*j ;
61 rootSum = 0.0 ;
62
63 for (i=0;i<fNumber;i++)
64 {
65 rootSum += tempFunction[i]*std::cos(cofj*(i+0.5)) ;
66 }
67 fChebyshevCof[j] = weight*rootSum ;
68 }
69 delete[] tempFunction ;
70}
71
72// --------------------------------------------------------------------
73//
74// Constructor for creation of Chebyshev coefficients for mx-derivative
75// from pFunction. The value of mx ! MUST BE ! < nx , because the result
76// array of fChebyshevCof will be of (nx-mx) size. The values a and b
77// fix the interval of validity of the Chebyshev approximation.
78
81 G4int nx, G4int mx,
82 G4double a, G4double b )
83 : fFunction(pFunction), fNumber(nx),
84 fChebyshevCof(new G4double[fNumber]),
85 fMean(0.5*(b+a)), fDiff(0.5*(b-a))
86{
87 if(nx <= mx)
88 {
89 G4Exception("G4ChebyshevApproximation::G4ChebyshevApproximation()",
90 "InvalidCall", FatalException, "Invalid arguments !") ;
91 }
92 G4int i=0, j=0 ;
93 G4double rootSum = 0.0, cofj=0.0;
94 G4double* tempFunction = new G4double[fNumber] ;
95 G4double weight = 2.0/fNumber ;
96 G4double cof = 0.5*weight*pi ; // pi/nx
97
98 for (i=0;i<fNumber;i++)
99 {
100 rootSum = std::cos(cof*(i+0.5)) ;
101 tempFunction[i] = fFunction(rootSum*fDiff+fMean) ;
102 }
103 for (j=0;j<fNumber;j++)
104 {
105 cofj = cof*j ;
106 rootSum = 0.0 ;
107
108 for (i=0;i<fNumber;i++)
109 {
110 rootSum += tempFunction[i]*std::cos(cofj*(i+0.5)) ;
111 }
112 fChebyshevCof[j] = weight*rootSum ; // corresponds to pFunction
113 }
114 // Chebyshev coefficients for (mx)-derivative of pFunction
115
116 for(i=1;i<=mx;i++)
117 {
118 DerivativeChebyshevCof(tempFunction) ;
119 fNumber-- ;
120 for(j=0;j<fNumber;j++)
121 {
122 fChebyshevCof[j] = tempFunction[j] ; // corresponds to (i)-derivative
123 }
124 }
125 delete[] tempFunction ; // delete of dynamically allocated tempFunction
126}
127
128// ------------------------------------------------------
129//
130// Constructor for creation of Chebyshev coefficients for integral
131// from pFunction.
132
134 G4double a,
135 G4double b,
136 G4int n )
137 : fFunction(pFunction), fNumber(n),
138 fChebyshevCof(new G4double[fNumber]),
139 fMean(0.5*(b+a)), fDiff(0.5*(b-a))
140{
141 G4int i=0, j=0;
142 G4double rootSum=0.0, cofj=0.0;
143 G4double* tempFunction = new G4double[fNumber] ;
144 G4double weight = 2.0/fNumber;
145 G4double cof = 0.5*weight*pi ; // pi/n
146
147 for (i=0;i<fNumber;i++)
148 {
149 rootSum = std::cos(cof*(i+0.5)) ;
150 tempFunction[i]= fFunction(rootSum*fDiff+fMean) ;
151 }
152 for (j=0;j<fNumber;j++)
153 {
154 cofj = cof*j ;
155 rootSum = 0.0 ;
156
157 for (i=0;i<fNumber;i++)
158 {
159 rootSum += tempFunction[i]*std::cos(cofj*(i+0.5)) ;
160 }
161 fChebyshevCof[j] = weight*rootSum ; // corresponds to pFunction
162 }
163 // Chebyshev coefficients for integral of pFunction
164
165 IntegralChebyshevCof(tempFunction) ;
166 for(j=0;j<fNumber;j++)
167 {
168 fChebyshevCof[j] = tempFunction[j] ; // corresponds to integral
169 }
170 delete[] tempFunction ; // delete of dynamically allocated tempFunction
171}
172
173
174
175// ---------------------------------------------------------------
176//
177// Destructor deletes the array of Chebyshev coefficients
178
180{
181 delete[] fChebyshevCof ;
182}
183
184// ---------------------------------------------------------------
185//
186// Access function for Chebyshev coefficients
187//
188
189
192{
193 if(number < 0 && number >= fNumber)
194 {
195 G4Exception("G4ChebyshevApproximation::GetChebyshevCof()",
196 "InvalidCall", FatalException, "Argument out of range !") ;
197 }
198 return fChebyshevCof[number] ;
199}
200
201// --------------------------------------------------------------
202//
203// Evaluate the value of fFunction at the point x via the Chebyshev coefficients
204// fChebyshevCof[0,...,fNumber-1]
205
208{
209 G4double evaluate = 0.0, evaluate2 = 0.0, temp = 0.0,
210 xReduced = 0.0, xReduced2 = 0.0 ;
211
212 if ((x-fMean+fDiff)*(x-fMean-fDiff) > 0.0)
213 {
214 G4Exception("G4ChebyshevApproximation::ChebyshevEvaluation()",
215 "InvalidCall", FatalException, "Invalid argument !") ;
216 }
217 xReduced = (x-fMean)/fDiff ;
218 xReduced2 = 2.0*xReduced ;
219 for (G4int i=fNumber-1;i>=1;i--)
220 {
221 temp = evaluate ;
222 evaluate = xReduced2*evaluate - evaluate2 + fChebyshevCof[i] ;
223 evaluate2 = temp ;
224 }
225 return xReduced*evaluate - evaluate2 + 0.5*fChebyshevCof[0] ;
226}
227
228// ------------------------------------------------------------------
229//
230// Returns the array derCof[0,...,fNumber-2], the Chebyshev coefficients of the
231// derivative of the function whose coefficients are fChebyshevCof
232
233void
235{
236 G4double cof = 1.0/fDiff ;
237 derCof[fNumber-1] = 0.0 ;
238 derCof[fNumber-2] = 2*(fNumber-1)*fChebyshevCof[fNumber-1] ;
239 for(G4int i=fNumber-3;i>=0;i--)
240 {
241 derCof[i] = derCof[i+2] + 2*(i+1)*fChebyshevCof[i+1] ;
242 }
243 for(G4int j=0;j<fNumber;j++)
244 {
245 derCof[j] *= cof ;
246 }
247}
248
249// ------------------------------------------------------------------------
250//
251// This function produces the array integralCof[0,...,fNumber-1] , the Chebyshev
252// coefficients of the integral of the function whose coefficients are
253// fChebyshevCof[]. The constant of integration is set so that the integral
254// vanishes at the point (fMean - fDiff), i.e. at the begining of the interval of
255// validity (we start the integration from this point).
256//
257
258void
260{
261 G4double cof = 0.5*fDiff, sum = 0.0, factor = 1.0 ;
262 for(G4int i=1;i<fNumber-1;i++)
263 {
264 integralCof[i] = cof*(fChebyshevCof[i-1] - fChebyshevCof[i+1])/i ;
265 sum += factor*integralCof[i] ;
266 factor = -factor ;
267 }
268 integralCof[fNumber-1] = cof*fChebyshevCof[fNumber-2]/(fNumber-1) ;
269 sum += factor*integralCof[fNumber-1] ;
270 integralCof[0] = 2.0*sum ; // set the constant of integration
271}
G4double(* function)(G4double)
@ FatalException
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
G4double GetChebyshevCof(G4int number) const
G4ChebyshevApproximation(function pFunction, G4int n, G4double a, G4double b)
void DerivativeChebyshevCof(G4double derCof[]) const
void IntegralChebyshevCof(G4double integralCof[]) const
G4double ChebyshevEvaluation(G4double x) const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41