Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/inclxx/incl_physics/src/G4INCLElasticChannel.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/incl_physics/src/G4INCLElasticChannel.cc (Version 11.3.0) and /processes/hadronic/models/inclxx/incl_physics/src/G4INCLElasticChannel.cc (Version 6.0.p1)


  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 #include "G4INCLElasticChannel.hh"                
 39 #include "G4INCLRandom.hh"                        
 40 #include "G4INCLKinematicsUtils.hh"               
 41 #include "G4INCLParticleTable.hh"                 
 42 #include "G4INCLCrossSections.hh"                 
 43 #include "G4INCLGlobals.hh"                       
 44                                                   
 45 namespace G4INCL {                                
 46                                                   
 47   ElasticChannel::ElasticChannel(Particle *p1,    
 48     :particle1(p1), particle2(p2)                 
 49   {                                               
 50   }                                               
 51                                                   
 52   ElasticChannel::~ElasticChannel()               
 53   {                                               
 54   }                                               
 55                                                   
 56   void ElasticChannel::fillFinalState(FinalSta    
 57   {                                               
 58     ParticleType p1TypeOld = particle1->getTyp    
 59     ParticleType p2TypeOld = particle2->getTyp    
 60                                                   
 61     /* Concerning the way we calculate the lab    
 62      * in CrossSections::elasticNNLegacy().       
 63      */                                           
 64     const G4double s = KinematicsUtils::square    
 65     const G4double pl = KinematicsUtils::momen    
 66                                                   
 67     const G4int isospin = ParticleTable::getIs    
 68       ParticleTable::getIsospin(particle2->get    
 69                                                   
 70     // Calculate the outcome of the channel:      
 71     G4double psq = particle1->getMomentum().ma    
 72     G4double pnorm = std::sqrt(psq);              
 73     G4double b = CrossSections::calculateNNAng    
 74     G4double btmax = 4.0 * psq * b;               
 75     G4double z = std::exp(-btmax);                
 76     G4double ranres = Random::shoot();            
 77     G4double y = 1.0 - ranres * (1.0 - z);        
 78     G4double T = std::log(y)/b;                   
 79     G4int iexpi = 0;                              
 80     G4double apt = 1.0;                           
 81                                                   
 82     // Handle np case                             
 83     if((particle1->getType() == Proton && part    
 84        (particle1->getType() == Neutron && par    
 85       if(pl > 800.0) {                            
 86         const G4double x = 0.001 * pl; // Tran    
 87         apt = (800.0/pl)*(800.0/pl);              
 88         G4double cpt = std::max(6.23 * std::ex    
 89         G4double alphac = 100.0 * 1.0e-6;         
 90         G4double aaa = (1 + apt) * (1 - std::e    
 91         G4double argu = psq * alphac;             
 92                                                   
 93         if(argu >= 8) {                           
 94           argu = 0.0;                             
 95         } else {                                  
 96           argu = std::exp(-4.0 * argu);           
 97         }                                         
 98                                                   
 99         G4double aac = cpt * (1.0 - argu)/alph    
100         G4double fracpn = aaa/(aac + aaa);        
101         if(Random::shoot() > fracpn) {            
102           z = std::exp(-4.0 * psq *alphac);       
103           iexpi = 1;                              
104           y = 1.0 - ranres*(1.0 - z);             
105           T = std::log(y)/alphac;                 
106         }                                         
107       }                                           
108     }                                             
109                                                   
110     G4double ctet = 1.0 + 0.5*T/psq;              
111     if(std::abs(ctet) > 1.0) ctet = Math::sign    
112     G4double stet = std::sqrt(1.0 - ctet*ctet)    
113     G4double rndm = Random::shoot();              
114                                                   
115     G4double fi = Math::twoPi * rndm;             
116     G4double cfi = std::cos(fi);                  
117     G4double sfi = std::sin(fi);                  
118                                                   
119     G4double xx = particle1->getMomentum().per    
120     G4double zz = std::pow(particle1->getMomen    
121                                                   
122     if(xx >= (zz * 1.0e-8)) {                     
123       ThreeVector p = particle1->getMomentum()    
124       G4double yn = std::sqrt(xx);                
125       G4double zn = yn * pnorm;                   
126       G4double ex[3], ey[3], ez[3];               
127       ez[0] = p.getX() / pnorm;                   
128       ez[1] = p.getY() / pnorm;                   
129       ez[2] = p.getZ() / pnorm;                   
130                                                   
131       // Vector Ex is chosen arbitrarily:         
132       ex[0] = p.getY() / yn;                      
133       ex[1] = -p.getX() / yn;                     
134       ex[2] = 0.0;                                
135                                                   
136       ey[0] = p.getX() * p.getZ() / zn;           
137       ey[1] = p.getY() * p.getZ() / zn;           
138       ey[2] = -xx/zn;                             
139                                                   
140       G4double pX = (ex[0]*cfi*stet + ey[0]*sf    
141       G4double pY = (ex[1]*cfi*stet + ey[1]*sf    
142       G4double pZ = (ex[2]*cfi*stet + ey[2]*sf    
143                                                   
144       ThreeVector p1momentum = ThreeVector(pX,    
145       particle1->setMomentum(p1momentum);         
146       particle2->setMomentum(-p1momentum);        
147     } else { // if(xx < (zz * 1.0e-8)) {          
148       G4double momZ = particle1->getMomentum()    
149       G4double pX = momZ * cfi * stet;            
150       G4double pY = momZ * sfi * stet;            
151       G4double pZ = momZ * ctet;                  
152                                                   
153       ThreeVector p1momentum(pX, pY, pZ);         
154       particle1->setMomentum(p1momentum);         
155       particle2->setMomentum(-p1momentum);        
156     }                                             
157                                                   
158     // Handle backward scattering here.           
159                                                   
160     if((particle1->getType() == Proton && part    
161        (particle1->getType() == Neutron && par    
162       rndm = Random::shoot();                     
163       apt = 1.0;                                  
164       if(pl > 800.0) {                            
165         apt = std::pow(800.0/pl, 2);              
166       }                                           
167       if(iexpi == 1 || rndm > 1.0/(1.0 + apt))    
168         particle1->setType(p2TypeOld);            
169         particle2->setType(p1TypeOld);            
170       }                                           
171     }                                             
172                                                   
173     // Note: there is no need to update the ki    
174     // as this is elastic scattering.             
175                                                   
176     fs->addModifiedParticle(particle1);           
177     fs->addModifiedParticle(particle2);           
178                                                   
179     }                                             
180                                                   
181 }                                                 
182