Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4PreCompoundTransitionsInt.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// GEANT4 Class file
27//
28// File name: G4PreCompoundTransitionsInt
29//
30// Author: V.Ivantchenko, 25 January 2025
31//
32
35#include "G4SystemOfUnits.hh"
36#include "Randomize.hh"
37#include "G4NuclearLevelData.hh"
39#include "G4Fragment.hh"
40#include "G4Proton.hh"
41#include "G4Exp.hh"
42#include "G4Log.hh"
43
45 : fVerbose(verb)
46{
47 proton = G4Proton::Proton();
49 G4DeexPrecoParameters* param = fNuclData->GetParameters();
50 FermiEnergy = param->GetFermiEnergy();
51 r0 = param->GetTransitionsR0();
52}
53
55CalculateProbability(const G4Fragment & aFragment)
56{
57 // Number of Particles
58 G4int P = aFragment.GetNumberOfParticles();
59 // Number of Excitons
60 //G4int N = P+H;
61 // Nucleus
62 G4int A = aFragment.GetA_asInt();
63 G4int Z = aFragment.GetZ_asInt();
64 G4double U = aFragment.GetExcitationEnergy();
65 TransitionProb2 = 0.0;
66 TransitionProb3 = 0.0;
67 /*
68 G4cout << "G4PreCompoundTransitions::CalculateProbability H/P/N/Z/A= "
69 << H << " " << P << " " << N << " " << Z << " " << A <<G4endl;
70 G4cout << aFragment << G4endl;
71 */
72 if(U < 10*eV || 0 == P) { return 0.0; }
73
74 //J. M. Quesada (Feb. 08) new physics
75 // OPT=1 Transitions are calculated according to Gudima's paper
76 // (original in G4PreCompound from VL)
77 // OPT=2 Transitions are calculated according to Gupta's formulae
78 //
79 static const G4double sixdpi2 = 6.0/CLHEP::pi2;
80 G4double GE = sixdpi2*U*fNuclData->GetLevelDensity(Z, A, U);
81 if (useCEMtr) {
82 // Relative Energy (T_{rel})
83 G4double RelativeEnergy = 1.6*FermiEnergy + U/G4double(2*P);
84
85 // Sample kind of nucleon-projectile
86 G4bool ChargedNucleon(false);
87 if(G4lrint(P*G4UniformRand()) <= aFragment.GetNumberOfCharged()) {
88 ChargedNucleon = true;
89 }
90
91 // Relative Velocity:
92 // <V_{rel}>^2
93 G4double RelativeVelocitySqr;
94 if (ChargedNucleon) {
95 RelativeVelocitySqr = 2*RelativeEnergy/CLHEP::proton_mass_c2;
96 } else {
97 RelativeVelocitySqr = 2*RelativeEnergy/CLHEP::neutron_mass_c2;
98 }
99 // <V_{rel}>
100 G4double RelativeVelocity = std::sqrt(RelativeVelocitySqr);
101
102 // Proton-Proton Cross Section
103 G4double ppXSection =
104 (10.63/RelativeVelocitySqr - 29.92/RelativeVelocity + 42.9)
105 * CLHEP::millibarn;
106 // Proton-Neutron Cross Section
107 G4double npXSection =
108 (34.10/RelativeVelocitySqr - 82.20/RelativeVelocity + 82.2)
109 * CLHEP::millibarn;
110
111 // Averaged Cross Section: \sigma(V_{rel})
112 G4double xs = (ChargedNucleon) ?
113 ((Z-1)*ppXSection + (A-Z)*npXSection)/G4double(A-1) :
114 ((A-Z-1)*ppXSection + Z*npXSection)/G4double(A-1);
115
116 // Fermi relative energy ratio
117 G4double FermiRelRatio = FermiEnergy/RelativeEnergy;
118
119 // This factor is introduced to take into account the Pauli principle
120 G4double PauliFactor = 1.0 - 1.4*FermiRelRatio;
121 if (FermiRelRatio > 0.5) {
122 G4double x = 2.0 - 1.0/FermiRelRatio;
123 PauliFactor += 0.4*FermiRelRatio*x*x*std::sqrt(x);
124 }
125 // Interaction volume
126 G4double xx = 2*r0 + CLHEP::hbarc/(CLHEP::proton_mass_c2*RelativeVelocity);
127 G4double Vint = CLHEP::pi*xx*xx*xx/0.75;
128
129 // Transition probability for \Delta n = +2
130 TransitionProb1 = std::max(0.0, xs*PauliFactor
131 *std::sqrt(2.0*RelativeEnergy/CLHEP::proton_mass_c2)/Vint);
132
133 //JMQ 281009 phenomenological factor in order to increase
134 // equilibrium contribution
135 // G4double factor=5.0;
136 // TransitionProb1 *= factor;
137
138 // GE = g*E where E is Excitation Energy
139 G4double Fph = G4double(P*(P - 1))*0.5;
140
141 if(!useNGB) {
142
143 // F(p+1,h+1)
144 G4double Fph1 = Fph + P;
145
146 static const G4double plimit = 100;
147
148 //JMQ/AH bug fixed: if (U-Fph < 0.0)
149 if (GE > Fph1) {
150 G4double x0 = GE-Fph;
151 G4double x1 = (2*P + 1)*G4Log(x0/(GE-Fph1));
152 if(x1 < plimit) {
153 x1 = G4Exp(x1)*TransitionProb1/x0;
154
155 // Transition probability for \Delta n = -2 (at F(p,h) = 0)
156 TransitionProb2 = std::max(0.0, (2*P*P*(2*P + 1)*(P - 1))*x1/x0);
157
158 // Transition probability for \Delta n = 0 (at F(p,h) = 0)
159 TransitionProb3 = std::max(0.0, ((2*P+1)*(3*P-1))*x1);
160 }
161 }
162 }
163
164 } else {
165 //JMQ: Transition probabilities from Gupta's work
166 // GE = g*E where E is Excitation Energy
167 TransitionProb1 = std::max(0.0, U*(4.2e+12 - 3.6e+10*U/G4double(2*P+1)))
168 /(16*CLHEP::c_light);
169
170 if (!useNGB) {
171 TransitionProb2 = (2*(2*P-1)*(P-1)*P*P)*TransitionProb1/(GE*GE);
172 }
173 }
175}
176
178{
179 G4int A = frag.GetA_asInt();
180 G4int Z = frag.GetZ_asInt();
181 G4int Npart = frag.GetNumberOfParticles();
182 G4int Ncharged = frag.GetNumberOfCharged();
183
184 G4double ChosenTransition =
186
187 G4int deltaN = 0;
188 // Number of excited particles inside the fragment
189 if (ChosenTransition <= TransitionProb1) {
190 if (Npart < A) { deltaN = 1; }
191 }
192 else if (ChosenTransition <= TransitionProb1+TransitionProb2) {
193 if (Npart > 0) { deltaN = -1; }
194 }
195 if (deltaN != 0) {
196 if (G4lrint(Npart*G4UniformRand()) <= Ncharged) {
197 Ncharged += deltaN;
198 Ncharged = std::min(std::max(Ncharged, 0), Z);
199 }
200 }
201 Npart += deltaN;
202 Ncharged = std::min(Ncharged, Npart);
203
204 // update fragment
205 frag.SetNumberOfExcitedParticle(Npart, Ncharged);
206 if (2 < fVerbose) {
207 G4cout << " # After transition Npart=" << Npart
208 << " Ncharged=" << Ncharged << " deltaN=" << deltaN << G4endl;
209 }
210}
211
@ GE
Definition Evaluator.cc:68
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition G4Exp.hh:132
G4double G4Log(G4double x)
Definition G4Log.hh:169
double G4double
Definition G4Types.hh:83
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
const G4double A[17]
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
#define G4UniformRand()
Definition Randomize.hh:52
G4int GetNumberOfParticles() const
G4double GetExcitationEnergy() const
G4int GetZ_asInt() const
void SetNumberOfExcitedParticle(G4int valueTot, G4int valueP)
G4int GetNumberOfCharged() const
G4int GetA_asInt() const
static G4NuclearLevelData * GetInstance()
G4double CalculateProbability(const G4Fragment &aFragment) override
void PerformTransition(G4Fragment &aFragment) override
static G4Proton * Proton()
Definition G4Proton.cc:90
int G4lrint(double ad)
Definition templates.hh:134