Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/inclxx/utils/src/G4INCLRootFinder.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 /processes/hadronic/models/inclxx/utils/src/G4INCLRootFinder.cc (Version 11.3.0) and /processes/hadronic/models/inclxx/utils/src/G4INCLRootFinder.cc (Version 9.4.p4)


  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 // INCL++ intra-nuclear cascade model             
 27 // Alain Boudard, CEA-Saclay, France              
 28 // Joseph Cugnon, University of Liege, Belgium    
 29 // Jean-Christophe David, CEA-Saclay, France      
 30 // Pekka Kaitaniemi, CEA-Saclay, France, and H    
 31 // Sylvie Leray, CEA-Saclay, France               
 32 // Davide Mancusi, CEA-Saclay, France             
 33 //                                                
 34 #define INCLXX_IN_GEANT4_MODE 1                   
 35                                                   
 36 #include "globals.hh"                             
 37                                                   
 38 /** \file G4INCLRootFinder.hh                     
 39  * \brief Static root-finder algorithm.           
 40  *                                                
 41  * Provides a stateless root-finder algorithm.    
 42  *                                                
 43  * \date 2nd March 2011                           
 44  * \author Davide Mancusi                         
 45  */                                               
 46                                                   
 47 #include "G4INCLRootFinder.hh"                    
 48 #include "G4INCLGlobals.hh"                       
 49 #include "G4INCLLogger.hh"                        
 50 #include <utility>                                
 51 #include <cmath>                                  
 52                                                   
 53 namespace G4INCL {                                
 54                                                   
 55   namespace RootFinder {                          
 56                                                   
 57     namespace {                                   
 58                                                   
 59       /// \brief Tolerance on the y value         
 60       const G4double toleranceY = 1.e-4;          
 61                                                   
 62       /// \brief Maximum number of iterations     
 63       const G4int maxIterations=50;               
 64                                                   
 65       /** \brief Bracket the root of the funct    
 66        *                                          
 67        * Tries to find a bracketing value for     
 68        *                                          
 69        * \param f pointer to a RootFunctor        
 70        * \param x0 starting value                 
 71        * \return if the root could be brackete    
 72        *   bracketing the root, as a pair. If     
 73        *   pair with first > second.              
 74        */                                         
 75       std::pair<G4double,G4double> bracketRoot    
 76         G4double y0 = (*f)(x0);                   
 77                                                   
 78         const G4double scaleFactor = 1.5;         
 79                                                   
 80         G4double x1;                              
 81         if(x0!=0.)                                
 82           x1=scaleFactor*x0;                      
 83         else                                      
 84           x1=1.;                                  
 85         G4double y1 = (*f)(x1);                   
 86                                                   
 87         if(Math::sign(y0)!=Math::sign(y1))        
 88           return std::make_pair(x0,x1);           
 89                                                   
 90         const G4double scaleFactorMinus1 = 1./    
 91         G4double oldx0, oldx1, oldy1;             
 92         G4int iterations=0;                       
 93         do {                                      
 94           if(iterations > maxIterations) {        
 95             INCL_DEBUG("Could not bracket the     
 96             return std::make_pair((G4double) 1    
 97           }                                       
 98                                                   
 99           oldx0=x0;                               
100           oldx1=x1;                               
101           oldy1=y1;                               
102                                                   
103           x0 *= scaleFactorMinus1;                
104           x1 *= scaleFactor;                      
105           y0 = (*f)(x0);                          
106           y1 = (*f)(x1);                          
107           iterations++;                           
108         } while(Math::sign(y0)==Math::sign(y1)    
109                                                   
110         if(Math::sign(y1)==Math::sign(oldy1))     
111           return std::make_pair(x0,oldx0);        
112         else                                      
113           return std::make_pair(oldx1,x1);        
114       }                                           
115                                                   
116     }                                             
117                                                   
118     Solution solve(RootFunctor const * const f    
119       // If we already have the solution, do n    
120       const G4double y0 = (*f)(x0);               
121       if( std::abs(y0) < toleranceY ) {           
122         return Solution(x0,y0);                   
123       }                                           
124                                                   
125       // Bracket the root and set the initial     
126       std::pair<G4double,G4double> bracket = b    
127       G4double x1 = bracket.first;                
128       G4double x2 = bracket.second;               
129       // If x1>x2, it means that we could not     
130       if(x1>x2) {                                 
131         // Maybe zero is a good solution?         
132         G4double y_at_zero = (*f)(0.);            
133         if(std::abs(y_at_zero)<=toleranceY) {     
134           f->cleanUp(true);                       
135           return Solution(0.,y_at_zero);          
136         } else {                                  
137           INCL_DEBUG("Root-finding algorithm c    
138           f->cleanUp(false);                      
139           return Solution();                      
140         }                                         
141       }                                           
142                                                   
143       G4double y1 = (*f)(x1);                     
144       G4double y2 = (*f)(x2);                     
145       G4double x = x1;                            
146       G4double y = y1;                            
147                                                   
148       /* ********************************         
149        * Start of the false-position loop         
150        * ********************************/        
151                                                   
152       // Keep track of the last updated interv    
153       G4int lastUpdated = 0;                      
154                                                   
155       for(G4int iterations=0; std::abs(y) > to    
156                                                   
157         if(iterations > maxIterations) {          
158           INCL_DEBUG("Root-finding algorithm d    
159           f->cleanUp(false);                      
160           return Solution();                      
161         }                                         
162                                                   
163         // Estimate the root position by linea    
164         x = (y1*x2-y2*x1)/(y1-y2);                
165                                                   
166         // Update the value of the function       
167         y = (*f)(x);                              
168                                                   
169         // Update the bracketing interval         
170         if(Math::sign(y) == Math::sign(y1)) {     
171           x1=x;                                   
172           y1=y;                                   
173           if(lastUpdated==-1) y2 *= 0.5;          
174           lastUpdated = -1;                       
175         } else {                                  
176           x2=x;                                   
177           y2=y;                                   
178           if(lastUpdated==1) y1 *= 0.5;           
179           lastUpdated = 1;                        
180         }                                         
181       }                                           
182                                                   
183       /* ******************************           
184        * End of the false-position loop           
185        * ******************************/          
186                                                   
187       f->cleanUp(true);                           
188       return Solution(x,y);                       
189     }                                             
190                                                   
191   } // namespace RootFinder                       
192 }                                                 
193