Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4EvaporationProbability.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// J.M. Quesada (August2008). Based on:
27//
28// Hadronic Process: Nuclear De-excitations
29// by V. Lara (Oct 1998)
30//
31// Modif (03 September 2008) by J. M. Quesada for external choice of inverse
32// cross section option
33// JMQ (06 September 2008) Also external choices have been added for
34// superimposed Coulomb barrier (if useSICB is set true, by default is false)
35//
36// JMQ (14 february 2009) bug fixed in emission width: hbarc instead of
37// hbar_Planck in the denominator
38//
39// V.Ivanchenko general clean-up since 2010
40//
42#include "G4NuclearLevelData.hh"
43#include "G4VCoulombBarrier.hh"
45#include "G4SystemOfUnits.hh"
47#include "G4NucleiProperties.hh"
50#include "G4InterfaceToXS.hh"
51#include "G4IsotopeList.hh"
52#include "G4DeexPrecoUtility.hh"
53#include "G4Neutron.hh"
54#include "G4Proton.hh"
55#include "G4Deuteron.hh"
56#include "G4Triton.hh"
57#include "G4He3.hh"
58#include "G4Alpha.hh"
59#include "Randomize.hh"
60#include "G4Exp.hh"
61#include "G4Log.hh"
62#include "G4Pow.hh"
63
64namespace
65{
66 const G4double explim = 160.; // limit of G4Exp argument, OPTxs = 0
67 const G4double lim = 2*CLHEP::MeV; // limit on x-section interface, OPTxs = 1
68 const G4double kmin = 20*CLHEP::keV; // low-energy limit on primary kinetic energy
69}
70
72 G4double aGamma)
73 : G4VEmissionProbability(aZ, anA), fGamma(aGamma)
74{
75 resA13 = lastA = muu = freeU = a0 = a1 = delta0 = delta1 = 0.0;
76 pcoeff = fGamma*pEvapMass*CLHEP::millibarn
77 /((CLHEP::pi*CLHEP::hbarc)*(CLHEP::pi*CLHEP::hbarc));
78
79 if (1 == theZ && 1 == theA) { index = 1; }
80 else if (1 == theZ && 2 == theA) { index = 2; }
81 else if (1 == theZ && 3 == theA) { index = 3; }
82 else if (2 == theZ && 3 == theA) { index = 4; }
83 else if (2 == theZ && 4 == theA) { index = 5; }
84
85 if (OPTxs == 1) {
86 const G4ParticleDefinition* part = nullptr;
87 if (index == 1) { part = G4Proton::Proton(); }
88 else if (index == 2) { part = G4Deuteron::Deuteron(); }
89 else if (index == 3) { part = G4Triton::Triton(); }
90 else if (index == 4) { part = G4He3::He3(); }
91 else if (index == 5) { part = G4Alpha::Alpha(); }
92 else { part = G4Neutron::Neutron(); }
93 fXSection = new G4InterfaceToXS(part, index);
94 }
95
96 if (0 == aZ) {
97 ResetIntegrator(0.15*CLHEP::MeV, 0.01);
98 } else {
99 ResetIntegrator(0.20*CLHEP::MeV, 0.01);
100 }
101}
102
107
112
117
119 const G4Fragment& fragment, G4double minEnergy, G4double maxEnergy,
120 G4double CB, G4double exEnergy)
121{
122 G4int fragA = fragment.GetA_asInt();
123 G4int fragZ = fragment.GetZ_asInt();
124 freeU = exEnergy;
125 a0 = pNuclearLevelData->GetLevelDensity(fragZ, fragA, freeU);
126 delta0 = pNuclearLevelData->GetPairingCorrection(fragZ, fragA);
127 delta1 = pNuclearLevelData->GetPairingCorrection(resZ, resA);
128 resA13 = pG4pow->Z13(resA);
129 /*
130 G4cout << "G4EvaporationProbability: Z= " << theZ << " A= " << theA
131 << " resZ= " << resZ << " resA= " << resA
132 << " fragZ= " << fragZ << " fragA= " << fragA
133 << "\n freeU= " << freeU
134 << " a0= " << a0 << " OPT= " << OPTxs << " emin= "
135 << minEnergy << " emax= " << maxEnergy
136 << " CB= " << CB << G4endl;
137 */
138 if (OPTxs==0) {
139
140 G4double SystemEntropy = 2.0*std::sqrt(a0*freeU);
141 const G4double RN2 = 2.25*CLHEP::fermi*CLHEP::fermi
142 /(CLHEP::twopi*CLHEP::hbar_Planck*hbar_Planck);
143
144 G4double Alpha = CalcAlphaParam(fragment);
145 G4double Beta = CalcBetaParam(fragment);
146
147 // to be checked where to use a0, where - a1
148 a1 = pNuclearLevelData->GetLevelDensity(resZ,resA,freeU);
149 G4double GlobalFactor = fGamma*Alpha*pEvapMass*RN2*resA13*resA13/(a1*a1);
150
151 G4double maxea = maxEnergy*a1;
152 G4double Term1 = Beta*a1 - 1.5 + maxea;
153 G4double Term2 = (2.0*Beta*a1-3.0)*std::sqrt(maxea) + 2*maxea;
154
155 G4double ExpTerm1 = (SystemEntropy <= explim) ? G4Exp(-SystemEntropy) : 0.0;
156
157 G4double ExpTerm2 = 2.*std::sqrt(maxea) - SystemEntropy;
158 ExpTerm2 = std::min(ExpTerm2, explim);
159 ExpTerm2 = G4Exp(ExpTerm2);
160
161 pProbability = GlobalFactor*(Term1*ExpTerm1 + Term2*ExpTerm2);
162
163 } else {
164 // if Coulomb barrier cutoff is superimposed for all cross sections
165 // then the limit is the Coulomb Barrier
166 pProbability = IntegrateProbability(minEnergy, maxEnergy, CB);
167 }
168 /*
169 G4cout << "TotalProbability: Emin=" << minEnergy << " Emax= " << maxEnergy
170 << " CB= " << CB << " prob=" << pProbability << G4endl;
171 */
172 return pProbability;
173}
174
176{
177 G4double K = std::max(kinE, kmin);
178 // abnormal case - should never happens
179 if(pMass < pEvapMass + pResMass + K) { return 0.0; }
180
181 G4double K1 = pMass - pEvapMass - K;
182 G4double mres = std::sqrt(K1*K1 - K*(2*pEvapMass + K));
183
184 G4double excRes = mres - pResMass;
185 if (excRes < 0.0) { return 0.0; }
186 G4double K2 = 0.5*(pMass + pEvapMass + mres)*(pMass - pEvapMass - mres)/mres;
187 G4double xs = CrossSection(K2, CB);
188 if (xs <= 0.0) { return 0.0; }
189
190 a1 = pNuclearLevelData->GetLevelDensity(resZ, resA, excRes);
191 G4double E0 = std::max(freeU - delta0, 0.0);
192 G4double E1 = std::max(excRes - delta1, 0.0);
193 G4double prob = pcoeff*G4Exp(2.0*(std::sqrt(a1*E1) - std::sqrt(a0*E0)))*K*xs;
194 return prob;
195}
196
199{
200 G4double K = std::max(kine, kmin);
201 // compute power once
202 if (OPTxs > 1 && 0 < index && resA != lastA) {
203 lastA = resA;
205 }
206 // In the case of OPTxs = 0 this method is not called
207 if (OPTxs == 1) {
208 G4int Z = std::min(resZ, ZMAXNUCLEARDATA);
209 if (0 == index) {
210 G4double e1 = lowEnergyLimitMeV[Z];
211 if (e1 == 0.0) { e1 = lim; }
212 K = std::max(K, e1);
213 } else {
214 if (K < 0.5*CB) {
215 recentXS = 0.0;
216 return recentXS;
217 }
218 K = std::max(K, 2*CB);
219 }
220 G4double corr = G4DeexPrecoUtility::CorrectionFactor(index, theZ, resA13, CB, kine);
221 recentXS = corr*fXSection->GetElementCrossSection(K, Z)/CLHEP::millibarn;
222
223 } else if (OPTxs == 2) {
224 recentXS = G4ChatterjeeCrossSection::ComputeCrossSection(K, CB, resA13, muu,
225 index, theZ, resA);
226 } else if (OPTxs == 3) {
227 recentXS = G4KalbachCrossSection::ComputeCrossSection(K, CB, resA13, muu,
228 index, theZ, theA, resA);
229 }
230 return recentXS;
231}
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition G4Exp.hh:132
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
static G4Alpha * Alpha()
Definition G4Alpha.cc:83
static G4double ComputeCrossSection(G4double K, G4double cb, G4double resA13, G4double amu1, G4int idx, G4int Z, G4int resA)
static G4double CorrectionFactor(const G4int index, const G4int Z, const G4double A13, const G4double bCoulomb, const G4double ekin)
static G4Deuteron * Deuteron()
Definition G4Deuteron.cc:90
G4double CrossSection(G4double K, G4double CB)
G4EvaporationProbability(G4int anA, G4int aZ, G4double aGamma)
G4double ComputeProbability(G4double K, G4double CB) override
virtual G4double CalcAlphaParam(const G4Fragment &fragment)
virtual G4double TotalProbability(const G4Fragment &fragment, G4double minKinEnergy, G4double maxKinEnergy, G4double CB, G4double exEnergy)
virtual G4double CalcBetaParam(const G4Fragment &fragment)
G4int GetZ_asInt() const
G4int GetA_asInt() const
static G4He3 * He3()
Definition G4He3.cc:90
static G4double ComputePowerParameter(G4int resA, G4int idx)
static G4double ComputeCrossSection(G4double K, G4double cb, G4double resA13, G4double amu1, G4int idx, G4int Z, G4int A, G4int resA)
static G4Neutron * Neutron()
Definition G4Neutron.cc:101
static G4Proton * Proton()
Definition G4Proton.cc:90
static G4Triton * Triton()
Definition G4Triton.cc:90
G4VEmissionProbability(G4int Z, G4int A)
G4double IntegrateProbability(G4double elow, G4double ehigh, G4double CB)
G4NuclearLevelData * pNuclearLevelData
void ResetIntegrator(G4double de, G4double eps)