Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4PreCompoundTransitions.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 // $Id$
27 //
28 // -------------------------------------------------------------------
29 //
30 // GEANT4 Class file
31 //
32 //
33 // File name: G4PreCompoundTransitions
34 //
35 // Author: V.Lara
36 //
37 // Modified:
38 // 16.02.2008 J.M.Quesada fixed bugs
39 // 06.09.2008 J.M.Quesada added external choices for:
40 // - "never go back" hipothesis (useNGB=true)
41 // - CEM transition probabilities (useCEMtr=true)
42 // 30.10.2009 J.M.Quesada: CEM transition probabilities have been renormalized
43 // (IAEA benchmark)
44 // 20.08.2010 V.Ivanchenko move constructor and destructor to the source and
45 // optimise the code
46 // 30.08.2011 M.Kelsey - Skip CalculateProbability if no excitons
47 
49 #include "G4PhysicalConstants.hh"
50 #include "G4SystemOfUnits.hh"
51 #include "Randomize.hh"
52 #include "G4Pow.hh"
53 #include "G4HadronicException.hh"
55 #include "G4Proton.hh"
56 
58 {
59  proton = G4Proton::Proton();
63  g4pow = G4Pow::GetInstance();
64 }
65 
67 {}
68 
69 // Calculates transition probabilities with
70 // DeltaN = +2 (Trans1) -2 (Trans2) and 0 (Trans3)
72 CalculateProbability(const G4Fragment & aFragment)
73 {
74  // Number of holes
75  G4int H = aFragment.GetNumberOfHoles();
76  // Number of Particles
77  G4int P = aFragment.GetNumberOfParticles();
78  // Number of Excitons
79  G4int N = P+H;
80  // Nucleus
81  G4int A = aFragment.GetA_asInt();
82  G4int Z = aFragment.GetZ_asInt();
83  G4double U = aFragment.GetExcitationEnergy();
84 
85  //G4cout << aFragment << G4endl;
86 
87  if(U < 10*eV || 0==N) { return 0.0; }
88 
89  //J. M. Quesada (Feb. 08) new physics
90  // OPT=1 Transitions are calculated according to Gudima's paper
91  // (original in G4PreCompound from VL)
92  // OPT=2 Transitions are calculated according to Gupta's formulae
93  //
94  if (useCEMtr){
95 
96  // Relative Energy (T_{rel})
97  G4double RelativeEnergy = 1.6*FermiEnergy + U/G4double(N);
98 
99  // Sample kind of nucleon-projectile
100  G4bool ChargedNucleon(false);
101  G4double chtest = 0.5;
102  if (P > 0) {
103  chtest = G4double(aFragment.GetNumberOfCharged())/G4double(P);
104  }
105  if (G4UniformRand() < chtest) { ChargedNucleon = true; }
106 
107  // Relative Velocity:
108  // <V_{rel}>^2
109  G4double RelativeVelocitySqr(0.0);
110  if (ChargedNucleon) {
111  RelativeVelocitySqr = 2.0*RelativeEnergy/CLHEP::proton_mass_c2;
112  } else {
113  RelativeVelocitySqr = 2.0*RelativeEnergy/CLHEP::neutron_mass_c2;
114  }
115 
116  // <V_{rel}>
117  G4double RelativeVelocity = std::sqrt(RelativeVelocitySqr);
118 
119  // Proton-Proton Cross Section
120  G4double ppXSection =
121  (10.63/RelativeVelocitySqr - 29.92/RelativeVelocity + 42.9)
122  * CLHEP::millibarn;
123  // Proton-Neutron Cross Section
124  G4double npXSection =
125  (34.10/RelativeVelocitySqr - 82.20/RelativeVelocity + 82.2)
126  * CLHEP::millibarn;
127 
128  // Averaged Cross Section: \sigma(V_{rel})
129  // G4double AveragedXSection = (ppXSection+npXSection)/2.0;
130  G4double AveragedXSection(0.0);
131  if (ChargedNucleon)
132  {
133  //JMQ: small bug fixed
134  //AveragedXSection=((Z-1.0) * ppXSection + (A-Z-1.0) * npXSection)/(A-1.0);
135  AveragedXSection = ((Z-1)*ppXSection + (A-Z)*npXSection)/G4double(A-1);
136  }
137  else
138  {
139  AveragedXSection = ((A-Z-1)*ppXSection + Z*npXSection)/G4double(A-1);
140  //AveragedXSection = ((A-Z-1)*npXSection + Z*ppXSection)/G4double(A-1);
141  }
142 
143  // Fermi relative energy ratio
144  G4double FermiRelRatio = FermiEnergy/RelativeEnergy;
145 
146  // This factor is introduced to take into account the Pauli principle
147  G4double PauliFactor = 1.0 - 1.4*FermiRelRatio;
148  if (FermiRelRatio > 0.5) {
149  G4double x = 2.0 - 1.0/FermiRelRatio;
150  PauliFactor += 0.4*FermiRelRatio*x*x*std::sqrt(x);
151  //PauliFactor +=
152  //(2.0/5.0)*FermiRelRatio*std::pow(2.0 - (1.0/FermiRelRatio), 5.0/2.0);
153  }
154  // Interaction volume
155  // G4double Vint = (4.0/3.0)
156  //*pi*std::pow(2.0*r0 + hbarc/(proton_mass_c2*RelativeVelocity) , 3.0);
157  G4double xx = 2.0*r0 + hbarc/(CLHEP::proton_mass_c2*RelativeVelocity);
158  // G4double Vint = (4.0/3.0)*CLHEP::pi*xx*xx*xx;
159  G4double Vint = CLHEP::pi*xx*xx*xx/0.75;
160 
161  // Transition probability for \Delta n = +2
162 
163  TransitionProb1 = AveragedXSection*PauliFactor
164  *std::sqrt(2.0*RelativeEnergy/CLHEP::proton_mass_c2)/Vint;
165 
166  //JMQ 281009 phenomenological factor in order to increase
167  // equilibrium contribution
168  // G4double factor=5.0;
169  // TransitionProb1 *= factor;
170  //
171  if (TransitionProb1 < 0.0) { TransitionProb1 = 0.0; }
172 
173  // GE = g*E where E is Excitation Energy
174  G4double GE = (6.0/pi2)*aLDP*A*U;
175 
176  //G4double Fph = ((P*P+H*H+P-H)/4.0 - H/2.0);
177  G4double Fph = G4double(P*P+H*H+P-3*H)/4.0;
178 
179  G4bool NeverGoBack(false);
180  if(useNGB) { NeverGoBack=true; }
181 
182  //JMQ/AH bug fixed: if (U-Fph < 0.0) NeverGoBack = true;
183  if (GE-Fph < 0.0) { NeverGoBack = true; }
184 
185  // F(p+1,h+1)
186  G4double Fph1 = Fph + N/2.0;
187 
188  G4double ProbFactor = g4pow->powN((GE-Fph)/(GE-Fph1),N+1);
189 
190  if (NeverGoBack)
191  {
192  TransitionProb2 = 0.0;
193  TransitionProb3 = 0.0;
194  }
195  else
196  {
197  // Transition probability for \Delta n = -2 (at F(p,h) = 0)
198  TransitionProb2 =
199  TransitionProb1 * ProbFactor * (P*H*(N+1)*(N-2))/((GE-Fph)*(GE-Fph));
200  if (TransitionProb2 < 0.0) { TransitionProb2 = 0.0; }
201 
202  // Transition probability for \Delta n = 0 (at F(p,h) = 0)
203  TransitionProb3 = TransitionProb1*(N+1)* ProbFactor
204  * (P*(P-1) + 4.0*P*H + H*(H-1))/(N*(GE-Fph));
205  if (TransitionProb3 < 0.0) { TransitionProb3 = 0.0; }
206  }
207  } else {
208  //JMQ: Transition probabilities from Gupta's work
209  // GE = g*E where E is Excitation Energy
210  G4double GE = (6.0/pi2)*aLDP*A*U;
211 
212  G4double Kmfp=2.;
213 
214  //TransitionProb1=1./Kmfp*3./8.*1./c_light*1.0e-9*(1.4e+21*U-2./(N+1)*6.0e+18*U*U);
215  TransitionProb1 = 3.0e-9*(1.4e+21*U - 1.2e+19*U*U/G4double(N+1))
216  /(8*Kmfp*CLHEP::c_light);
217  if (TransitionProb1 < 0.0) { TransitionProb1 = 0.0; }
218 
219  TransitionProb2=0.;
220  TransitionProb3=0.;
221 
222  if (!useNGB && N > 1) {
223  // TransitionProb2=1./Kmfp*3./8.*1./c_light*1.0e-9*(N-1.)*(N-2.)*P*H/(GE*GE)*(1.4e+21*U - 2./(N-1)*6.0e+18*U*U);
224  TransitionProb2 =
225  3.0e-9*(N-2)*P*H*(1.4e+21*U*(N-1) - 1.2e+19*U*U)/(8*Kmfp*c_light*GE*GE);
226  if (TransitionProb2 < 0.0) TransitionProb2 = 0.0;
227  }
228  }
229  // G4cout<<"U = "<<U<<G4endl;
230  // G4cout<<"N="<<N<<" P="<<P<<" H="<<H<<G4endl;
231  // G4cout<<"l+ ="<<TransitionProb1<<" l- ="<< TransitionProb2
232  // <<" l0 ="<< TransitionProb3<<G4endl;
234 }
235 
237 {
238  G4double ChosenTransition =
240  G4int deltaN = 0;
241  // G4int Nexcitons = result.GetNumberOfExcitons();
242  G4int Npart = result.GetNumberOfParticles();
243  G4int Ncharged = result.GetNumberOfCharged();
244  G4int Nholes = result.GetNumberOfHoles();
245  if (ChosenTransition <= TransitionProb1)
246  {
247  // Number of excitons is increased on \Delta n = +2
248  deltaN = 2;
249  }
250  else if (ChosenTransition <= TransitionProb1+TransitionProb2)
251  {
252  // Number of excitons is increased on \Delta n = -2
253  deltaN = -2;
254  }
255 
256  // AH/JMQ: Randomly decrease the number of charges if deltaN is -2 and
257  // in proportion to the number charges w.r.t. number of particles,
258  // PROVIDED that there are charged particles
259  deltaN /= 2;
260 
261  //G4cout << "deltaN= " << deltaN << G4endl;
262 
263  // JMQ the following lines have to be before SetNumberOfCharged, otherwise the check on
264  // number of charged vs. number of particles fails
265  result.SetNumberOfParticles(Npart+deltaN);
266  result.SetNumberOfHoles(Nholes+deltaN);
267 
268  if(deltaN < 0) {
269  if( Ncharged >= 1 && G4int(Npart*G4UniformRand()) <= Ncharged)
270  {
271  result.SetNumberOfCharged(Ncharged+deltaN); // deltaN is negative!
272  }
273 
274  } else if ( deltaN > 0 ) {
275  // With weight Z/A, number of charged particles is increased with +1
276  G4int A = result.GetA_asInt();
277  G4int Z = result.GetZ_asInt();
278  if( G4int(std::max(1, A - Npart)*G4UniformRand()) <= Z)
279  {
280  result.SetNumberOfCharged(Ncharged+deltaN);
281  }
282  }
283 
284  // Number of charged can not be greater that number of particles
285  if ( Npart < Ncharged )
286  {
287  result.SetNumberOfCharged(Npart);
288  }
289  //G4cout << "### After transition" << G4endl;
290  //G4cout << result << G4endl;
291 }
292