Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4GEMProbability.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 G4GEMProbability
31//
32//
33// Hadronic Process: Nuclear De-excitations
34// by V. Lara (Sept 2001)
35//
36//
37// Hadronic Process: Nuclear De-excitations
38// by V. Lara (Sept 2001)
39//
40// J. M. Quesada : several fixes in total GEM width
41// J. M. Quesada 14/07/2009 bug fixed in total emission width (hbarc)
42// J. M. Quesada (September 2009) several fixes:
43// -level density parameter of residual calculated at its right excitation energy.
44// -InitialLeveldensity calculated according to the right conditions of the
45// initial excited nucleus.
46// J. M. Quesada 19/04/2010 fix in emission probability calculation.
47// V.Ivanchenko 20/04/2010 added usage of G4Pow and use more safe computation
48// V.Ivanchenko 18/05/2010 trying to speedup the most slow method
49// by usage of G4Pow, integer Z and A; moved constructor,
50// destructor and virtual functions to source
51
52#include "G4GEMProbability.hh"
55#include "G4SystemOfUnits.hh"
56
57G4GEMProbability:: G4GEMProbability(G4int anA, G4int aZ, G4double aSpin) :
58 theA(anA), theZ(aZ), Spin(aSpin), theCoulombBarrierPtr(0),
59 Normalization(1.0)
60{
61 theEvapLDPptr = new G4EvaporationLevelDensityParameter;
62 fG4pow = G4Pow::GetInstance();
63 fPlanck= CLHEP::hbar_Planck*fG4pow->logZ(2);
65}
66
68{
69 delete theEvapLDPptr;
70}
71
73 G4double MaximalKineticEnergy)
74{
75 G4double probability = 0.0;
76
77 if (MaximalKineticEnergy > 0.0 && fragment.GetExcitationEnergy() > 0.0) {
78 G4double CoulombBarrier = GetCoulombBarrier(fragment);
79
80 probability =
81 CalcProbability(fragment,MaximalKineticEnergy,CoulombBarrier);
82
83 // Next there is a loop over excited states for this channel
84 // summing probabilities
85 size_t nn = ExcitEnergies.size();
86 if (0 < nn) {
87 G4double SavedSpin = Spin;
88 for (size_t i = 0; i <nn; ++i) {
89 Spin = ExcitSpins[i];
90 // substract excitation energies
91 G4double Tmax = MaximalKineticEnergy - ExcitEnergies[i];
92 if (Tmax > 0.0) {
93 G4double width = CalcProbability(fragment,Tmax,CoulombBarrier);
94 //JMQ April 2010 added condition to prevent reported crash
95 // update probability
96 if (width > 0. && fPlanck < width*ExcitLifetimes[i]) {
97 probability += width;
98 }
99 }
100 }
101 // Restore Spin
102 Spin = SavedSpin;
103 }
104 }
105 Normalization = probability;
106 return probability;
107}
108
109
110G4double G4GEMProbability::CalcProbability(const G4Fragment & fragment,
111 G4double MaximalKineticEnergy,
112 G4double V)
113
114// Calculate integrated probability (width) for evaporation channel
115{
116 G4int A = fragment.GetA_asInt();
117 G4int Z = fragment.GetZ_asInt();
118
119 G4int ResidualA = A - theA;
120 G4int ResidualZ = Z - theZ;
121 G4double U = fragment.GetExcitationEnergy();
122
123 G4double NuclearMass = fragment.ComputeGroundStateMass(theZ, theA);
124
125 G4double Alpha = CalcAlphaParam(fragment);
126 G4double Beta = CalcBetaParam(fragment);
127
128 // ***RESIDUAL***
129 //JMQ (September 2009) the following quantities refer to the RESIDUAL:
130
131 G4double delta0 = fPairCorr->GetPairingCorrection(ResidualA, ResidualZ);
132
133 G4double a = theEvapLDPptr->
134 LevelDensityParameter(ResidualA,ResidualZ,MaximalKineticEnergy+V-delta0);
135 G4double Ux = (2.5 + 150.0/G4double(ResidualA))*MeV;
136 G4double Ex = Ux + delta0;
137 G4double T = 1.0/(std::sqrt(a/Ux) - 1.5/Ux);
138 //JMQ fixed bug in units
139 G4double E0 = Ex - T*(std::log(T/MeV) - std::log(a*MeV)/4.0
140 - 1.25*std::log(Ux/MeV) + 2.0*std::sqrt(a*Ux));
141 // ***end RESIDUAL ***
142
143 // ***PARENT***
144 //JMQ (September 2009) the following quantities refer to the PARENT:
145
146 G4double deltaCN = fPairCorr->GetPairingCorrection(A, Z);
147 G4double aCN = theEvapLDPptr->LevelDensityParameter(A, Z, U-deltaCN);
148 G4double UxCN = (2.5 + 150.0/G4double(A))*MeV;
149 G4double ExCN = UxCN + deltaCN;
150 G4double TCN = 1.0/(std::sqrt(aCN/UxCN) - 1.5/UxCN);
151 // ***end PARENT***
152
153 G4double Width;
154 G4double InitialLevelDensity;
155 G4double t = MaximalKineticEnergy/T;
156 if ( MaximalKineticEnergy < Ex ) {
157 //JMQ 190709 bug in I1 fixed (T was missing)
158 Width = (I1(t,t)*T + (Beta+V)*I0(t))/std::exp(E0/T);
159 //JMQ 160909 fix: InitialLevelDensity has been taken away
160 //(different conditions for initial CN..)
161 } else {
162
163 //VI minor speedup
164 G4double expE0T = std::exp(E0/T);
165 const G4double sqrt2 = std::sqrt(2.0);
166
167 G4double tx = Ex/T;
168 G4double s0 = 2.0*std::sqrt(a*(MaximalKineticEnergy-delta0));
169 G4double sx = 2.0*std::sqrt(a*(Ex-delta0));
170 Width = I1(t,tx)*T/expE0T + I3(s0,sx)*std::exp(s0)/(sqrt2*a);
171 // For charged particles (Beta+V) = 0 beacuse Beta = -V
172 if (theZ == 0) {
173 Width += (Beta+V)*(I0(tx)/expE0T + 2.0*sqrt2*I2(s0,sx)*std::exp(s0));
174 }
175 }
176
177 //JMQ 14/07/2009 BIG BUG : NuclearMass is in MeV => hbarc instead of hbar_planck must be used
178 // G4double g = (2.0*Spin+1.0)*NuclearMass/(pi2* hbar_Planck*hbar_Planck);
179 G4double gg = (2.0*Spin+1.0)*NuclearMass/(pi2* hbarc*hbarc);
180
181 //JMQ 190709 fix on Rb and geometrical cross sections according to Furihata's paper
182 // (JAERI-Data/Code 2001-105, p6)
183 // G4double RN = 0.0;
184 G4double Rb = 0.0;
185 if (theA > 4)
186 {
187 G4double Ad = fG4pow->Z13(ResidualA);
188 G4double Aj = fG4pow->Z13(theA);
189 Rb = 1.12*(Aj + Ad) - 0.86*((Aj+Ad)/(Aj*Ad))+2.85;
190 Rb *= fermi;
191 }
192 else if (theA>1)
193 {
194 G4double Ad = fG4pow->Z13(ResidualA);
195 G4double Aj = fG4pow->Z13(theA);
196 Rb=1.5*(Aj+Ad)*fermi;
197 }
198 else
199 {
200 G4double Ad = fG4pow->Z13(ResidualA);
201 Rb = 1.5*Ad*fermi;
202 }
203 // G4double GeometricalXS = pi*RN*RN*std::pow(ResidualA,2./3.);
204 G4double GeometricalXS = pi*Rb*Rb;
205 //end of JMQ fix on Rb by 190709
206
207 //JMQ 160909 fix: initial level density must be calculated according to the
208 // conditions at the initial compound nucleus
209 // (it has been removed from previous "if" for the residual)
210
211 if ( U < ExCN )
212 {
213 //JMQ fixed bug in units
214 //VI moved the computation here
215 G4double E0CN = ExCN - TCN*(std::log(TCN/MeV) - std::log(aCN*MeV)/4.0
216 - 1.25*std::log(UxCN/MeV)
217 + 2.0*std::sqrt(aCN*UxCN));
218 InitialLevelDensity = (pi/12.0)*std::exp((U-E0CN)/TCN)/TCN;
219 }
220 else
221 {
222 //VI speedup
223 G4double x = U-deltaCN;
224 G4double x1 = std::sqrt(aCN*x);
225 InitialLevelDensity = (pi/12.0)*std::exp(2*x1)/(x*std::sqrt(x1));
226 }
227
228 //JMQ 190709 BUG : pi instead of sqrt(pi) must be here according
229 // to Furihata's report:
230 Width *= pi*gg*GeometricalXS*Alpha/(12.0*InitialLevelDensity);
231
232 return Width;
233}
234
235G4double G4GEMProbability::I3(G4double s0, G4double sx)
236{
237 G4double s2 = s0*s0;
238 G4double sx2 = sx*sx;
239 G4double S = 1.0/std::sqrt(s0);
240 G4double S2 = S*S;
241 G4double Sx = 1.0/std::sqrt(sx);
242 G4double Sx2 = Sx*Sx;
243
244 G4double p1 = S *(2.0 + S2 *( 4.0 + S2 *( 13.5 + S2 *( 60.0 + S2 * 325.125 ))));
245 G4double p2 = Sx*Sx2 *(
246 (s2-sx2) + Sx2 *(
247 (1.5*s2+0.5*sx2) + Sx2 *(
248 (3.75*s2+0.25*sx2) + Sx2 *(
249 (12.875*s2+0.625*sx2) + Sx2 *(
250 (59.0625*s2+0.9375*sx2) + Sx2 *(324.8*s2+3.28*sx2))))));
251
252 p2 *= std::exp(sx-s0);
253
254 return p1-p2;
255}
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
G4double GetExcitationEnergy() const
Definition: G4Fragment.hh:235
G4int GetZ_asInt() const
Definition: G4Fragment.hh:223
G4double ComputeGroundStateMass(G4int Z, G4int A) const
Definition: G4Fragment.hh:273
G4int GetA_asInt() const
Definition: G4Fragment.hh:218
G4double GetCoulombBarrier(const G4Fragment &fragment) const
std::vector< G4double > ExcitSpins
std::vector< G4double > ExcitEnergies
virtual ~G4GEMProbability()
G4double CalcAlphaParam(const G4Fragment &) const
std::vector< G4double > ExcitLifetimes
G4double CalcBetaParam(const G4Fragment &) const
G4double EmissionProbability(const G4Fragment &fragment, G4double anEnergy)
static G4PairingCorrection * GetInstance()
G4double GetPairingCorrection(G4int A, G4int Z) const
static G4Pow * GetInstance()
Definition: G4Pow.cc:50
G4double Z13(G4int Z)
Definition: G4Pow.hh:110
G4double logZ(G4int Z)
Definition: G4Pow.hh:146
virtual G4double LevelDensityParameter(G4int A, G4int Z, G4double U) const =0
const G4double pi