Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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
50#include "G4SystemOfUnits.hh"
51#include "Randomize.hh"
52#include "G4Pow.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)
72CalculateProbability(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)
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
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);
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
@ GE
Definition: Evaluator.cc:66
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4UniformRand()
Definition: Randomize.hh:53
G4int GetNumberOfParticles() const
Definition: G4Fragment.hh:305
G4int GetNumberOfHoles() const
Definition: G4Fragment.hh:325
void SetNumberOfCharged(G4int value)
Definition: G4Fragment.hh:349
G4double GetExcitationEnergy() const
Definition: G4Fragment.hh:235
G4int GetZ_asInt() const
Definition: G4Fragment.hh:223
void SetNumberOfHoles(G4int valueTot, G4int valueP=0)
Definition: G4Fragment.hh:335
void SetNumberOfParticles(G4int value)
Definition: G4Fragment.hh:344
G4int GetNumberOfCharged() const
Definition: G4Fragment.hh:310
G4int GetA_asInt() const
Definition: G4Fragment.hh:218
static G4Pow * GetInstance()
Definition: G4Pow.cc:50
G4double powN(G4double x, G4int n)
Definition: G4Pow.cc:98
static G4PreCompoundParameters * GetAddress()
virtual void PerformTransition(G4Fragment &aFragment)
virtual G4double CalculateProbability(const G4Fragment &aFragment)
static G4Proton * Proton()
Definition: G4Proton.cc:93