Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
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 hbar_Planck in the denominator
37//
38#include <iostream>
39
42#include "G4SystemOfUnits.hh"
44#include "G4ParticleTable.hh"
45#include "G4IonTable.hh"
46
47using namespace std;
48
50 G4double aGamma,
51 G4VCoulombBarrier * aCoulombBarrier)
52 : theA(anA),
53 theZ(aZ),
54 Gamma(aGamma),
55 theCoulombBarrierptr(aCoulombBarrier)
56{}
57
59 : theA(0),
60 theZ(0),
61 Gamma(0.0),
62 theCoulombBarrierptr(0)
63{}
64
66{}
67
70 G4double anEnergy)
71{
72 G4double probability = 0.0;
73
74 if (anEnergy > 0.0 && fragment.GetExcitationEnergy() > 0.0) {
75 probability = CalculateProbability(fragment, anEnergy);
76
77 }
78 return probability;
79}
80
81////////////////////////////////////
82
83// Computes the integrated probability of evaporation channel
85G4EvaporationProbability::CalculateProbability(const G4Fragment & fragment,
86 G4double MaximalKineticEnergy)
87{
88 G4int ResidualA = fragment.GetA_asInt() - theA;
89 G4int ResidualZ = fragment.GetZ_asInt() - theZ;
90 G4double U = fragment.GetExcitationEnergy();
91
92 if (OPTxs==0) {
93
94 G4double NuclearMass = fragment.ComputeGroundStateMass(theZ,theA);
95
97 fragment.GetZ_asInt());
98
99 G4double SystemEntropy = 2.0*std::sqrt(
101 (U-delta0));
102
103 const G4double RN = 1.5*fermi;
104
105 G4double Alpha = CalcAlphaParam(fragment);
106 G4double Beta = CalcBetaParam(fragment);
107
108 G4double Rmax = MaximalKineticEnergy;
109 G4double a = theEvapLDPptr->LevelDensityParameter(ResidualA,ResidualZ,Rmax);
110 G4double GlobalFactor = Gamma * Alpha/(a*a) *
111 (NuclearMass*RN*RN*fG4pow->Z23(ResidualA))/
112 (twopi* hbar_Planck*hbar_Planck);
113 G4double Term1 = (2.0*Beta*a-3.0)/2.0 + Rmax*a;
114 G4double Term2 = (2.0*Beta*a-3.0)*std::sqrt(Rmax*a) + 2.0*a*Rmax;
115
116 G4double ExpTerm1 = 0.0;
117 if (SystemEntropy <= 600.0) { ExpTerm1 = std::exp(-SystemEntropy); }
118
119 G4double ExpTerm2 = 2.*std::sqrt(a*Rmax) - SystemEntropy;
120 if (ExpTerm2 > 700.0) { ExpTerm2 = 700.0; }
121 ExpTerm2 = std::exp(ExpTerm2);
122
123 G4double Width = GlobalFactor*(Term1*ExpTerm1 + Term2*ExpTerm2);
124
125 return Width;
126
127 } else if (OPTxs==1 || OPTxs==2 ||OPTxs==3 || OPTxs==4) {
128
129 G4double EvaporatedMass = fragment.ComputeGroundStateMass(theZ,theA);
130 G4double ResidulalMass = fragment.ComputeGroundStateMass(ResidualZ,ResidualA);
131 G4double limit = std::max(0.0,fragment.GetGroundStateMass()-EvaporatedMass-ResidulalMass);
132 if (useSICB) {
133 limit = std::max(limit,theCoulombBarrierptr->GetCoulombBarrier(ResidualA,ResidualZ,U));
134 }
135
136 if (MaximalKineticEnergy <= limit) { return 0.0; }
137
138 // if Coulomb barrier cutoff is superimposed for all cross sections
139 // then the limit is the Coulomb Barrier
140 G4double LowerLimit= limit;
141
142 //MaximalKineticEnergy: asimptotic value (already accounted for in G4EvaporationChannel)
143
144 G4double UpperLimit = MaximalKineticEnergy;
145
146 G4double Width = IntegrateEmissionProbability(fragment,LowerLimit,UpperLimit);
147
148 return Width;
149 } else {
150 std::ostringstream errOs;
151 errOs << "Bad option for cross sections at evaporation" <<G4endl;
152 throw G4HadronicException(__FILE__, __LINE__, errOs.str());
153 }
154
155}
156
157/////////////////////////////////////////////////////////////////////
158
159G4double G4EvaporationProbability::
160IntegrateEmissionProbability(const G4Fragment & fragment,
161 const G4double & Low, const G4double & Up )
162{
163 static const G4int N = 10;
164 // 10-Points Gauss-Legendre abcisas and weights
165 static const G4double w[N] = {
166 0.0666713443086881,
167 0.149451349150581,
168 0.219086362515982,
169 0.269266719309996,
170 0.295524224714753,
171 0.295524224714753,
172 0.269266719309996,
173 0.219086362515982,
174 0.149451349150581,
175 0.0666713443086881
176 };
177 static const G4double x[N] = {
178 -0.973906528517172,
179 -0.865063366688985,
180 -0.679409568299024,
181 -0.433395394129247,
182 -0.148874338981631,
183 0.148874338981631,
184 0.433395394129247,
185 0.679409568299024,
186 0.865063366688985,
187 0.973906528517172
188 };
189
190 G4double Total = 0.0;
191
192
193 for (G4int i = 0; i < N; i++)
194 {
195
196 G4double KineticE = ((Up-Low)*x[i]+(Up+Low))/2.0;
197
198 Total += w[i]*ProbabilityDistributionFunction(fragment, KineticE);
199
200 }
201 Total *= (Up-Low)/2.0;
202 return Total;
203}
204
205
206/////////////////////////////////////////////////////////
207//New method (OPT=1,2,3,4)
208
211 G4double K)
212{
213 G4int ResidualA = fragment.GetA_asInt() - theA;
214 G4int ResidualZ = fragment.GetZ_asInt() - theZ;
215 G4double U = fragment.GetExcitationEnergy();
216 //G4cout << "### G4EvaporationProbability::ProbabilityDistributionFunction" << G4endl;
217 //G4cout << "FragZ= " << fragment.GetZ_asInt() << " FragA= " << fragment.GetA_asInt()
218 // << " Z= " << theZ << " A= " << theA << G4endl;
219 //G4cout << "PC " << fPairCorr << " DP " << theEvapLDPptr << G4endl;
220
221 // if(K <= theCoulombBarrierptr->GetCoulombBarrier(ResidualA,ResidualZ,U)) return 0.0;
222
223 G4double delta1 = fPairCorr->GetPairingCorrection(ResidualA,ResidualZ);
224
226 fragment.GetZ_asInt());
227
228
229 G4double ParticleMass = fragment.ComputeGroundStateMass(theZ,theA);
230 G4double ResidualMass = fragment.ComputeGroundStateMass(ResidualZ,ResidualA);
231
232 G4double theSeparationEnergy = ParticleMass + ResidualMass
233 - fragment.GetGroundStateMass();
234
236 fragment.GetZ_asInt(),
237 U - delta0);
238
239 G4double a1 = theEvapLDPptr->LevelDensityParameter(ResidualA, ResidualZ,
240 U - theSeparationEnergy - delta1);
241
242
243 G4double E0 = U - delta0;
244
245 G4double E1 = U - theSeparationEnergy - delta1 - K;
246
247 if (E1<0.) { return 0.; }
248
249 //JMQ 14/02/09 BUG fixed: hbarc should be in the denominator instead of hbar_Planck
250 //Without 1/hbar_Panck remains as a width
251
252 //G4double Prob=Gamma*ParticleMass/((pi*hbarc)*(pi*hbarc)*std::exp(2*std::sqrt(a0*E0)))
253 // *K*CrossSection(fragment,K)*std::exp(2*std::sqrt(a1*E1))*millibarn;
254
255 static const G4double pcoeff = millibarn/((pi*hbarc)*(pi*hbarc));
256
257 // Fixed numerical problem
258 G4double Prob = pcoeff*Gamma*ParticleMass*std::exp(2*(std::sqrt(a1*E1) - std::sqrt(a0*E0)))
259 *K*CrossSection(fragment,K);
260
261 return Prob;
262}
263
264
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
#define G4endl
Definition: G4ios.hh:52
G4double LevelDensityParameter(G4int A, G4int Z, G4double U) const
G4double EmissionProbability(const G4Fragment &fragment, G4double anEnergy)
virtual G4double CalcAlphaParam(const G4Fragment &fragment)=0
virtual G4double CalcBetaParam(const G4Fragment &fragment)=0
G4double ProbabilityDistributionFunction(const G4Fragment &aFragment, G4double K)
virtual G4double CrossSection(const G4Fragment &fragment, G4double K)=0
G4double GetGroundStateMass() const
Definition: G4Fragment.hh:240
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 GetPairingCorrection(G4int A, G4int Z) const
G4double Z23(G4int Z)
Definition: G4Pow.hh:134
virtual G4double GetCoulombBarrier(G4int ARes, G4int ZRes, G4double U) const =0
G4PairingCorrection * fPairCorr
G4EvaporationLevelDensityParameter * theEvapLDPptr