Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/geometry/magneticfield/src/G4BogackiShampine45.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 /geometry/magneticfield/src/G4BogackiShampine45.cc (Version 11.3.0) and /geometry/magneticfield/src/G4BogackiShampine45.cc (Version 10.1.p3)


  1 //                                                  1 
  2 // *******************************************    
  3 // * License and Disclaimer                       
  4 // *                                              
  5 // * The  Geant4 software  is  copyright of th    
  6 // * the Geant4 Collaboration.  It is provided    
  7 // * conditions of the Geant4 Software License    
  8 // * LICENSE and available at  http://cern.ch/    
  9 // * include a list of copyright holders.         
 10 // *                                              
 11 // * Neither the authors of this software syst    
 12 // * institutes,nor the agencies providing fin    
 13 // * work  make  any representation or  warran    
 14 // * regarding  this  software system or assum    
 15 // * use.  Please see the license in the file     
 16 // * for the full disclaimer and the limitatio    
 17 // *                                              
 18 // * This  code  implementation is the result     
 19 // * technical work of the GEANT4 collaboratio    
 20 // * By using,  copying,  modifying or  distri    
 21 // * any work based  on the software)  you  ag    
 22 // * use  in  resulting  scientific  publicati    
 23 // * acceptance of all terms of the Geant4 Sof    
 24 // *******************************************    
 25 //                                                
 26 // G4BogackiShampine45 implementation             
 27 //                                                
 28 // Bogacki-Shampine's RK 5(4) non-FSAL interpo    
 29 // Definition of the stepper() method that eva    
 30 // field propagation.                             
 31 //                                                
 32 // The Butcher table of the Bogacki-Shampine-8    
 33 //                                                
 34 //   0  |                                         
 35 //  1/6 |      1/6                                
 36 //  2/9 |      2/27          4/27                 
 37 //  3/7 |    183/1372     -162/343      1053/1    
 38 //  2/3 |     68/297        -4/11         42/1    
 39 //  3/4 |    597/22528      81/352     63099/5    
 40 //   1  | 174197/959244 -30942/79937 8152137/1    
 41 //   1  |    587/8064         0      4440339/1    
 42 //--------------------------------------------    
 43 //           587/8064         0      4440339/1    
 44 //          2479/34992        0          123/4    
 45 //                                                
 46 // Coefficients have been obtained from:          
 47 // http://www.netlib.org/ode/rksuite/             
 48 //                                                
 49 // Note on meaning of label "non-FSAL version"    
 50 //   This method calculates the deriviative dy    
 51 //   integration interval at each step, as par    
 52 //   endpoint and its error. So this value is     
 53 //   for re-use in case of a successful step.     
 54 //   (This is done in a 'later' version using     
 55 //                                                
 56 // Created: Somnath Banerjee, Google Summer of    
 57 // Revision: John Apostolakis, CERN, May 2016     
 58 // -------------------------------------------    
 59                                                   
 60 #include <cassert>                                
 61                                                   
 62 #include "G4BogackiShampine45.hh"                 
 63 #include "G4LineSection.hh"                       
 64                                                   
 65 G4bool G4BogackiShampine45::fPreparedConstants    
 66 G4double G4BogackiShampine45::bi[12][7];          
 67                                                   
 68 // Constructor                                    
 69 //                                                
 70 G4BogackiShampine45::G4BogackiShampine45(G4Equ    
 71                                          G4int    
 72                                          G4boo    
 73    : G4MagIntegratorStepper(EqRhs, noIntegrati    
 74 {                                                 
 75     const G4int numberOfVariables = noIntegrat    
 76                                                   
 77     // New Chunk of memory being created for u    
 78                                                   
 79     // aki - for storing intermediate RHS         
 80     ak2 = new G4double[numberOfVariables];        
 81     ak3 = new G4double[numberOfVariables];        
 82     ak4 = new G4double[numberOfVariables];        
 83     ak5 = new G4double[numberOfVariables];        
 84     ak6 = new G4double[numberOfVariables];        
 85     ak7 = new G4double[numberOfVariables];        
 86     ak8 = new G4double[numberOfVariables];        
 87     ak9 = new G4double[numberOfVariables];        
 88     ak10 = new G4double[numberOfVariables];       
 89     ak11 = new G4double[numberOfVariables];       
 90                                                   
 91     for (auto & i : p)                            
 92     {                                             
 93        i= new G4double[numberOfVariables];        
 94     }                                             
 95                                                   
 96     assert ( GetNumberOfStateVariables() >= 8     
 97     const G4int numStateVars = std::max(noInte    
 98                                         GetNum    
 99                                                   
100     // Must ensure space extra 'state' variabl    
101     yTemp = new G4double[numStateVars];           
102     yIn = new G4double[numStateVars] ;            
103                                                   
104     fLastInitialVector = new G4double[numState    
105     fLastFinalVector = new G4double[numStateVa    
106     fLastDyDx = new G4double[numberOfVariables    
107                                                   
108     fMidVector = new G4double[numberOfVariable    
109     fMidError =  new G4double[numberOfVariable    
110                                                   
111     if( ! fPreparedConstants )                    
112     {                                             
113        PrepareConstants();                        
114     }                                             
115                                                   
116     if( primary )                                 
117     {                                             
118        fAuxStepper = new G4BogackiShampine45(E    
119     }                                             
120 }                                                 
121                                                   
122 // Destructor                                     
123 //                                                
124 G4BogackiShampine45::~G4BogackiShampine45()       
125 {                                                 
126     // Clear all previously allocated memory f    
127     //                                            
128     delete [] ak2;                                
129     delete [] ak3;                                
130     delete [] ak4;                                
131     delete [] ak5;                                
132     delete [] ak6;                                
133     delete [] ak7;                                
134     delete [] ak8;                                
135     delete [] ak9;                                
136     delete [] ak10;                               
137     delete [] ak11;                               
138                                                   
139     for (auto & i : p)                            
140     {                                             
141        delete [] i;                               
142     }                                             
143                                                   
144     delete [] yTemp;                              
145     delete [] yIn;                                
146                                                   
147     delete [] fLastInitialVector;                 
148     delete [] fLastFinalVector;                   
149     delete [] fLastDyDx;                          
150     delete [] fMidVector;                         
151     delete [] fMidError;                          
152                                                   
153     delete fAuxStepper;                           
154 }                                                 
155                                                   
156 void G4BogackiShampine45::GetLastDydx( G4doubl    
157 {                                                 
158    const G4int numberOfVariables = GetNumberOf    
159                                                   
160    for(G4int i=0; i < numberOfVariables; ++i )    
161    {                                              
162       dyDxLast[i] = ak9[i];                       
163    }                                              
164 }                                                 
165                                                   
166 // Stepper                                        
167 //                                                
168 // Passing in the value of yInput[],the first     
169 // Giving back yOut and yErr arrays for output    
170 //                                                
171 void G4BogackiShampine45::Stepper( const G4dou    
172                                    const G4dou    
173                                          G4dou    
174                                          G4dou    
175                                          G4dou    
176 {                                                 
177     G4int i;                                      
178                                                   
179     // Constants from the Butcher tableu          
180     //                                            
181     const G4double                                
182        b21 = 1.0/6.0 ,                            
183        b31 = 2.0/27.0 ,     b32 = 4.0/27.0,       
184                                                   
185        b41 = 183.0/1372.0 , b42 = -162.0/343.0    
186                                                   
187        b51 = 68.0/297.0,    b52 = -4.0/11.0,      
188        b53 = 42.0/143.0,    b54 = 1960.0/3861.    
189                                                   
190        b61 = 597.0/22528.0,    b62 = 81.0/352.    
191        b63 = 63099.0/585728.0, b64 = 58653.0/3    
192        b65 = 4617.0/20480.0,                      
193                                                   
194        b71 = 174197.0/959244.0,    b72 = -3094    
195        b73 = 8152137.0/19744439.0, b74 = 66610    
196        b75 = -29421.0/29068.0,     b76 = 48204    
197                                                   
198        b81 = 587.0/8064.0,         b82 = 0.0,     
199        b83 = 4440339.0/15491840.0, b84 = 24353    
200        b85 = 387.0/44800.0,        b86 = 2152.    
201        b87 = 7267.0/94080.0;                      
202                                                   
203 //    c1 = 2479.0/34992.0,                        
204 //    c2 = 0.0,                                   
205 //    c3 = 123.0/416.0,                           
206 //    c4 = 612941.0/3411720.0,                    
207 //    c5 = 43.0/1440.0,                           
208 //    c6 = 2272.0/6561.0,                         
209 //    c7 = 79937.0/1113912.0,                     
210 //    c8 = 3293.0/556956.0,                       
211                                                   
212     // For the embedded higher order method on    
213     // taken and is used directly later (inste    
214     // of Butcher table in separate constants     
215     // difference)                                
216     //                                            
217     const G4double                                
218        dc1 = b81 -   2479.0 /   34992.0 ,         
219        dc2 = 0.0,                                 
220        dc3 = b83 -    123.0 /     416.0 ,         
221        dc4 = b84 - 612941.0 / 3411720.0,          
222        dc5 = b85 -     43.0 /    1440.0,          
223        dc6 = b86 -   2272.0 /    6561.0,          
224        dc7 = b87 -  79937.0 / 1113912.0,          
225        dc8 =     -   3293.0 /  556956.0;          
226                                                   
227     const G4int numberOfVariables = GetNumberO    
228                                                   
229     // The number of variables to be integrate    
230     //                                            
231     yOut[7] = yTemp[7]  = yIn[7] = yInput[7];     
232                                                   
233     // Saving yInput because yInput and yOut c    
234     //                                            
235     for(i=0; i<numberOfVariables; ++i)            
236     {                                             
237         yIn[i]=yInput[i];                         
238     }                                             
239                                                   
240     // RightHandSide(yIn, dydx) ;                 
241     // 1st Step - Not doing, getting passed       
242     //                                            
243     for(i=0; i<numberOfVariables; ++i)            
244     {                                             
245         yTemp[i] = yIn[i] + b21*Step*DyDx[i] ;    
246     }                                             
247     RightHandSide(yTemp, ak2) ;              /    
248                                                   
249     for(i=0; i<numberOfVariables; ++i)            
250     {                                             
251         yTemp[i] = yIn[i] + Step*(b31*DyDx[i]     
252     }                                             
253     RightHandSide(yTemp, ak3) ;              /    
254                                                   
255     for(i=0; i<numberOfVariables; ++i)            
256     {                                             
257         yTemp[i] = yIn[i] + Step*(b41*DyDx[i]     
258     }                                             
259     RightHandSide(yTemp, ak4) ;              /    
260                                                   
261     for(i=0; i<numberOfVariables; ++i)            
262     {                                             
263         yTemp[i] = yIn[i] + Step*(b51*DyDx[i]     
264                                   b54*ak4[i])     
265     }                                             
266     RightHandSide(yTemp, ak5) ;              /    
267                                                   
268     for(i=0; i<numberOfVariables; ++i)            
269     {                                             
270         yTemp[i] = yIn[i] + Step*(b61*DyDx[i]     
271                                   b64*ak4[i] +    
272     }                                             
273     RightHandSide(yTemp, ak6) ;              /    
274                                                   
275     for(i=0; i<numberOfVariables; ++i)            
276     {                                             
277         yTemp[i] = yIn[i] + Step*(b71*DyDx[i]     
278                                   b74*ak4[i] +    
279     }                                             
280     RightHandSide(yTemp, ak7);               /    
281                                                   
282     for(i=0; i<numberOfVariables; ++i)            
283     {                                             
284         yOut[i] = yIn[i] + Step*(b81*DyDx[i] +    
285                                   b84*ak4[i] +    
286                                   b87*ak7[i]);    
287     }                                             
288     RightHandSide(yOut, ak8);                /    
289                                                   
290     for(i=0; i<numberOfVariables; ++i)            
291     {                                             
292         yErr[i] = Step*(dc1*DyDx[i] + dc2*ak2[    
293                         dc5*ak5[i] + dc6*ak6[i    
294                                                   
295         // Store Input and Final values, for p    
296         //                                        
297         fLastInitialVector[i] = yIn[i] ;          
298         fLastFinalVector[i]   = yOut[i];          
299         fLastDyDx[i]          = DyDx[i];          
300     }                                             
301                                                   
302     fLastStepLength = Step;                       
303     fPreparedInterpolation= false;                
304                                                   
305     return ;                                      
306 }                                                 
307                                                   
308 // DistChord                                      
309 //                                                
310 G4double G4BogackiShampine45::DistChord() cons    
311 {                                                 
312     G4double distLine, distChord;                 
313     G4ThreeVector initialPoint, finalPoint, mi    
314                                                   
315     // Store last initial and final points        
316     // (they will be overwritten in self-Stepp    
317     //                                            
318     initialPoint = G4ThreeVector(fLastInitialV    
319                                  fLastInitialV    
320     finalPoint   = G4ThreeVector(fLastFinalVec    
321                                  fLastFinalVec    
322                                                   
323 #if 1                                             
324     // Old method -- Do half a step using Step    
325     //                                            
326     fAuxStepper->Stepper( fLastInitialVector,     
327                           fMidVector, fMidErro    
328 #else                                             
329     // New method -- Using interpolation,         
330     // requires only 3 extra stages (ie 3 extr    
331                                                   
332     // Use Interpolation, instead of auxiliary    
333     //                                            
334     if( ! fPreparedInterpolation )                
335     {                                             
336        G4BogackiShampine45* cThis = const_cast    
337        cThis-> SetupInterpolationHigh();          
338     }                                             
339     // For calculating the output at the tau f    
340     //                                            
341     G4double tau = 0.5;                           
342     InterpolateHigh( tau, fMidVector );           
343 #endif                                            
344                                                   
345     midPoint = G4ThreeVector( fMidVector[0], f    
346                                                   
347     // Use stored values of Initial and Endpoi    
348     // distance of Chord                          
349                                                   
350     if (initialPoint != finalPoint)               
351     {                                             
352         distLine  = G4LineSection::Distline( m    
353         distChord = distLine;                     
354     }                                             
355     else                                          
356     {                                             
357         distChord = (midPoint-initialPoint).ma    
358     }                                             
359     return distChord;                             
360 }                                                 
361                                                   
362 void G4BogackiShampine45::SetupInterpolationHi    
363 {                                                 
364     // Coefficients for the additional stages     
365     //                                            
366     const G4double                                
367     a91 = 455.0/6144.0 ,                          
368     a92 = 0.0 ,                                   
369     a93 = 10256301.0/35409920.0 ,                 
370     a94 = 2307361.0/17971200.0 ,                  
371     a95 = -387.0/102400.0 ,                       
372     a96 = 73.0/5130.0 ,                           
373     a97 = -7267.0/215040.0 ,                      
374     a98 = 1.0/32.0 ,                              
375                                                   
376     a101 = -837888343715.0/13176988637184.0 ,     
377     a102 = 30409415.0/52955362.0 ,                
378     a103 = -48321525963.0/759168069632.0 ,        
379     a104 = 8530738453321.0/197654829557760.0 ,    
380     a105 = 1361640523001.0/1626788720640.0 ,      
381     a106 = -13143060689.0/38604458898.0 ,         
382     a107 = 18700221969.0/379584034816.0 ,         
383     a108 = -5831595.0/847285792.0 ,               
384     a109 = -5183640.0/26477681.0 ,                
385                                                   
386     a111 = 98719073263.0/1551965184000.0 ,        
387     a112 = 1307.0/123552.0 ,                      
388     a113 = 4632066559387.0/70181753241600.0 ,     
389     a114 = 7828594302389.0/382182512025600.0 ,    
390     a115 = 40763687.0/11070259200.0 ,             
391     a116 = 34872732407.0/224610586200.0 ,         
392     a117 = -2561897.0/30105600.0 ,                
393     a118 = 1.0/10.0 ,                             
394     a119 = -1.0/10.0 ,                            
395     a1110 = -1403317093.0/11371610250.0 ;         
396                                                   
397     const G4int numberOfVariables= this->GetNu    
398     const G4double* dydx= fLastDyDx;              
399     const G4double Step = fLastStepLength;        
400                                                   
401     yTemp[7]  = yIn[7];                           
402                                                   
403     // Evaluate the extra stages                  
404     //                                            
405     for(G4int i=0; i<numberOfVariables; ++i)      
406     {                                             
407         yTemp[i] = yIn[i] + Step*(a91*dydx[i]     
408                                   a94*ak4[i] +    
409                                   a97*ak7[i] +    
410     }                                             
411                                                   
412     RightHandSide(yTemp, ak9);   // 9th stage     
413                                                   
414     for(G4int i=0; i<numberOfVariables; ++i)      
415     {                                             
416         yTemp[i] = yIn[i] + Step*(a101*dydx[i]    
417                                   a104*ak4[i]     
418                                   a107*ak7[i]     
419     }                                             
420                                                   
421     RightHandSide(yTemp, ak10);  // 10th stage    
422                                                   
423     for(G4int i=0; i<numberOfVariables; ++i)      
424     {                                             
425         yTemp[i] = yIn[i] + Step*(a111*dydx[i]    
426                                   a114*ak4[i]     
427                                   a117*ak7[i]     
428                                   a1110*ak10[i    
429     }                                             
430     RightHandSide(yTemp, ak11);  // 11th stage    
431                                                   
432     //  In future we can restrict the number o    
433     //                                            
434     G4int nwant = numberOfVariables;              
435                                                   
436     //  Form the coefficients of the interpola    
437     //  and scaled form.  The terms are groupe    
438     //  of the transformation, to cope with il    
439     //                                            
440     for (G4int l = 0; l < nwant; ++l)             
441     {                                             
442         //  Coefficient of tau^6                  
443         p[5][l] =   bi[5][6]*ak5[l] +             
444                   ((bi[10][6]*ak10[l] + bi[8][    
445                    (bi[7][6]*ak7[l] + bi[6][6]    
446                   ((bi[4][6]*ak4[l] + bi[9][6]    
447                    (bi[3][6]*ak3[l] + bi[11][6    
448                     bi[1][6]*dydx[l]);            
449         //  Coefficient of tau^5                  
450         p[4][l] = (bi[10][5]*ak10[l] + bi[9][5    
451                  ((bi[7][5]*ak7[l] + bi[6][5]*    
452                    bi[5][5]*ak5[l])  +  ((bi[4    
453                    bi[8][5]*ak8[l]) + (bi[3][5    
454                    bi[11][5]*ak11[l]) + bi[1][    
455         //  Coefficient of tau^4                  
456         p[3][l] = ((bi[4][4]*ak4[l] + bi[8][4]    
457                    (bi[7][4]*ak7[l] + bi[6][4]    
458                     bi[5][4]*ak5[l]) + ((bi[10    
459                     bi[9][4]*ak9[l]) +  (bi[3]    
460                     bi[11][4]*ak11[l]) + bi[1]    
461         //  Coefficient of tau^3                  
462         p[2][l] =  bi[5][3]*ak5[l] + bi[6][3]*    
463                  ((bi[3][3]*ak3[l] + bi[9][3]*    
464                  (bi[10][3]*ak10[l]+ bi[8][3]*    
465                  ((bi[4][3]*ak4[l] + bi[11][3]    
466         //  Coefficient of tau^2                  
467         p[1][l] = bi[5][2]*ak5[l]  + ((bi[6][2    
468                   bi[8][2]*ak8[l]) +   bi[1][2    
469                 ((bi[3][2]*ak3[l]  +   bi[9][2    
470                  bi[10][2]*ak10[l])+ ((bi[4][2    
471                  bi[11][2]*ak2[l]) +   bi[7][2    
472       }                                           
473                                                   
474       //  Scale all the coefficients by the st    
475       //                                          
476       for (auto & i : p)                          
477       {                                           
478          for (G4int l = 0; l < nwant; ++l)        
479          {                                        
480             i[l] *= Step;                         
481          }                                        
482       }                                           
483                                                   
484     fPreparedInterpolation = true;                
485 }                                                 
486                                                   
487 void G4BogackiShampine45::PrepareConstants()      
488 {                                                 
489     for(auto i=1; i<= 11; ++i)                    
490     {                                             
491         bi[i][1] = 0.0 ;                          
492     }                                             
493                                                   
494     for(auto i=1; i<=6; ++i)                      
495     {                                             
496         bi[2][i] = 0.0 ;                          
497     }                                             
498                                                   
499     bi[1][6] = -12134338393.0 / 1050809760.0 ,    
500     bi[1][5] =  -1620741229.0 / 50038560.0 ,      
501     bi[1][4] =  -2048058893.0 / 59875200.0 ,      
502     bi[1][3] = -87098480009.0 / 5254048800.0 ,    
503     bi[1][2] = -11513270273.0 / 3502699200.0 ,    
504     //                                            
505     bi[3][6] =  -33197340367.0 / 1218433216.0     
506     bi[3][5] = -539868024987.0 / 6092166080.0     
507     bi[3][4] =  -39991188681.0 / 374902528.0 ,    
508     bi[3][3] =  -69509738227.0 / 1218433216.0     
509     bi[3][2] =  -29327744613.0 / 2436866432.0     
510     //                                            
511     bi[4][6] =   -284800997201.0 /  1990533916    
512     bi[4][5] =  -7896875450471.0 / 16587782640    
513     bi[4][4] =   -333945812879.0 /   567103680    
514     bi[4][3] = -16209923456237.0 / 49763347920    
515     bi[4][2] =  -2382590741699.0 / 33175565280    
516     //                                            
517     bi[5][6] = -540919.0 / 741312.0 ,             
518     bi[5][5] = -103626067.0 / 43243200.0 ,        
519     bi[5][4] = -633779.0 / 211200.0 ,             
520     bi[5][3] = -32406787.0 / 18532800.0 ,         
521     bi[5][2] = -36591193.0 / 86486400.0 ,         
522     //                                            
523     bi[6][6] = 7157998304.0 / 374350977.0 ,       
524     bi[6][5] = 30405842464.0 / 623918295.0 ,      
525     bi[6][4] = 183022264.0 / 5332635.0 ,          
526     bi[6][3] = -3357024032.0 / 1871754885.0 ,     
527     bi[6][2] = -611586736.0 / 89131185.0 ,        
528     //                                            
529     bi[7][6] =  -138073.0 /  9408.0 ,             
530     bi[7][5] =  -719433.0 / 15680.0 ,             
531     bi[7][4] = -1620541.0 / 31360.0 ,             
532     bi[7][3] =  -385151.0 / 15680.0 ,             
533     bi[7][2] =  -65403.0  / 15680.0 ,             
534     //                                            
535     bi[8][6] = 1245.0 / 64.0 ,                    
536     bi[8][5] = 3991.0 / 64.0 ,                    
537     bi[8][4] = 4715.0 / 64.0 ,                    
538     bi[8][3] = 2501.0 / 64.0 ,                    
539     bi[8][2] =  149.0 / 16.0 ,                    
540     bi[8][1] = 1.0 ,                              
541     //                                            
542     bi[9][6] = 55.0 / 3.0 ,                       
543     bi[9][5] = 71.0 ,                             
544     bi[9][4] = 103.0 ,                            
545     bi[9][3] = 199.0 / 3.0 ,                      
546     bi[9][2] = 16.0 ,                             
547     //                                            
548     bi[10][6] =  -1774004627.0  /  75810735.0     
549     bi[10][5] =  -1774004627.0  /  25270245.0     
550     bi[10][4] =    -26477681.0  /    359975.0     
551     bi[10][3] = -11411880511.0  / 379053675.0     
552     bi[10][2] =   -423642896.0  / 126351225.0     
553     //                                            
554     bi[11][6] =  35.0 ,                           
555     bi[11][5] = 105.0 ,                           
556     bi[11][4] = 117.0 ,                           
557     bi[11][3] =  59.0 ,                           
558     bi[11][2] =  12.0 ;                           
559                                                   
560     fPreparedConstants = true;                    
561 }                                                 
562                                                   
563 void G4BogackiShampine45::InterpolateHigh(G4do    
564 {                                                 
565     G4int numberOfVariables = GetNumberOfVaria    
566                                                   
567     G4Exception("G4BogackiShampine45::Interpol    
568                 FatalException, "Method is not    
569                                                   
570     // const G4double *yIn=  fLastInitialVecto    
571     // const G4double *dydx= fLastDyDx;           
572     const G4double Step = fLastStepLength;        
573                                                   
574 #if 1                                             
575     G4int nwant = numberOfVariables;              
576     const G4int norder= 6;                        
577     G4int l, k;                                   
578                                                   
579     for (l = 0; l < nwant; ++l)                   
580     {                                             
581       yOut[l] = p[norder-1][l] * tau;             
582     }                                             
583     for (k = norder - 2; k >= 1; --k)             
584     {                                             
585       for (l = 0; l < nwant; ++l)                 
586       {                                           
587          yOut[l] = ( yOut[l] + p[k][l] ) * tau    
588       }                                           
589     }                                             
590     for (l = 0; l < nwant; ++l)                   
591     {                                             
592       yOut[l] = ( yOut[l] + Step * ak8[l] ) *     
593     }                                             
594     // The derivative at the end-point is next    
595 #else                                             
596     // The scheme tries to do the same as the     
597     // but fails                                  
598                                                   
599     G4double b[12];                               
600     const G4double* dydx = fLastDyDx;             
601                                                   
602     G4double tau0 = tau;                          
603                                                   
604     for(G4int iStage=1; iStage<=11; ++iStage)     
605     {                                             
606         b[iStage] = 0.0;                          
607         tau = tau0;                               
608         for(G4int j=6; j>=1; --j)                 
609         {                                         
610             b[iStage] += bi[iStage][j] * tau;     
611             tau *= tau0;                          
612         }                                         
613     }                                             
614                                                   
615     for(G4int i=0; i<numberOfVariables; ++i)      
616     {                                             
617         yOut[i] = yIn[i] + Step*(b[1]*dydx[i]     
618                                  b[4]*ak4[i] +    
619                                  b[7]*ak7[i] +    
620                                  b[10]*ak10[i]    
621     }                                             
622 #endif                                            
623 }                                                 
624