source: trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4EvaporationProbability.cc @ 1315

Last change on this file since 1315 was 1315, checked in by garnier, 14 years ago

update geant4-09-04-beta-cand-01 interfaces-V09-03-09 vis-V09-03-08

File size: 9.0 KB
Line 
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>
39using namespace std;
40
41#include "G4EvaporationProbability.hh"
42#include "G4PairingCorrection.hh"
43#include "G4ParticleTable.hh"
44#include "G4IonTable.hh"
45
46
47G4EvaporationProbability::G4EvaporationProbability(const G4EvaporationProbability &) : G4VEmissionProbability()
48{
49    throw G4HadronicException(__FILE__, __LINE__, "G4EvaporationProbability::copy_constructor meant to not be accessable");
50}
51
52
53
54
55const G4EvaporationProbability & G4EvaporationProbability::
56operator=(const G4EvaporationProbability &)
57{
58    throw G4HadronicException(__FILE__, __LINE__, "G4EvaporationProbability::operator= meant to not be accessable");
59    return *this;
60}
61
62
63G4bool G4EvaporationProbability::operator==(const G4EvaporationProbability &) const
64{
65    return false;
66}
67
68G4bool G4EvaporationProbability::operator!=(const G4EvaporationProbability &) const
69{
70    return true;
71}
72 
73G4double G4EvaporationProbability::EmissionProbability(const G4Fragment & fragment, const G4double anEnergy)
74{
75    G4double EmissionProbability = 0.0;
76    G4double MaximalKineticEnergy = anEnergy;
77
78    if (MaximalKineticEnergy > 0.0 && fragment.GetExcitationEnergy() > 0.0) {
79        EmissionProbability = CalculateProbability(fragment, MaximalKineticEnergy);
80
81    }
82    return EmissionProbability;
83}
84
85////////////////////////////////////
86
87// Computes the integrated probability of evaporation channel
88G4double G4EvaporationProbability::CalculateProbability(const G4Fragment & fragment, const G4double MaximalKineticEnergy)
89{
90    G4double ResidualA = fragment.GetA() - theA;
91    G4double ResidualZ = fragment.GetZ() - theZ;
92    G4double U = fragment.GetExcitationEnergy();
93   
94 if (OPTxs==0) {
95
96       
97    G4double NuclearMass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetNucleusMass(theZ,theA);
98
99
100    G4double delta0 = G4PairingCorrection::GetInstance()->GetPairingCorrection(static_cast<G4int>(fragment.GetA()),
101                                                                               static_cast<G4int>(fragment.GetZ()));
102
103    G4double SystemEntropy = 2.0*std::sqrt(theEvapLDPptr->LevelDensityParameter(static_cast<G4int>(fragment.GetA()),
104                                                                           static_cast<G4int>(fragment.GetZ()),U)*
105                                      (U-delta0));
106                                                                 
107
108    G4double RN = 1.5*fermi;
109
110    G4double Alpha = CalcAlphaParam(fragment);
111    G4double Beta = CalcBetaParam(fragment);
112       
113    G4double Rmax = MaximalKineticEnergy;
114    G4double a = theEvapLDPptr->LevelDensityParameter(static_cast<G4int>(ResidualA),
115                                                      static_cast<G4int>(ResidualZ),
116                                                      Rmax);
117    G4double GlobalFactor = static_cast<G4double>(Gamma) * (Alpha/(a*a)) *
118        (NuclearMass*RN*RN*std::pow(ResidualA,2./3.))/
119        (2.*pi* hbar_Planck*hbar_Planck);
120    G4double Term1 = (2.0*Beta*a-3.0)/2.0 + Rmax*a;
121    G4double Term2 = (2.0*Beta*a-3.0)*std::sqrt(Rmax*a) + 2.0*a*Rmax;
122       
123    G4double ExpTerm1 = 0.0;
124    if (SystemEntropy <= 600.0) ExpTerm1 = std::exp(-SystemEntropy);
125       
126    G4double ExpTerm2 = 2.*std::sqrt(a*Rmax) - SystemEntropy;
127    if (ExpTerm2 > 700.0) ExpTerm2 = 700.0;
128    ExpTerm2 = std::exp(ExpTerm2);
129       
130    G4double Width = GlobalFactor*(Term1*ExpTerm1 + Term2*ExpTerm2);
131       
132    return Width;
133             
134 } else if (OPTxs==1 || OPTxs==2 ||OPTxs==3 || OPTxs==4) {
135
136   G4double limit;
137   if (useSICB) limit=theCoulombBarrierptr->GetCoulombBarrier(G4lrint(ResidualA),G4lrint(ResidualZ),U);
138   else limit=0.;
139
140   if (MaximalKineticEnergy <= limit)  return 0.0;
141
142
143   // if Coulomb barrier cutoff is superimposed for all cross sections the limit is the Coulomb Barrier
144   G4double LowerLimit= limit;
145
146   //  MaximalKineticEnergy: asimptotic value (already accounted for in G4EvaporationChannel)     
147
148   G4double UpperLimit = MaximalKineticEnergy;
149
150
151   G4double Width = IntegrateEmissionProbability(fragment,LowerLimit,UpperLimit);
152
153   return Width;
154 } else{
155   std::ostringstream errOs;
156   errOs << "Bad option for cross sections at evaporation"  <<G4endl;
157   throw G4HadronicException(__FILE__, __LINE__, errOs.str());
158 }
159 
160}
161
162/////////////////////////////////////////////////////////////////////
163
164G4double G4EvaporationProbability::
165IntegrateEmissionProbability(const G4Fragment & fragment, const G4double & Low, const G4double & Up )
166{
167
168  static const G4int N = 10;
169  // 10-Points Gauss-Legendre abcisas and weights
170  static const G4double w[N] = {
171    0.0666713443086881,
172    0.149451349150581,
173    0.219086362515982,
174    0.269266719309996,
175    0.295524224714753,
176    0.295524224714753,
177    0.269266719309996,
178    0.219086362515982,
179    0.149451349150581,
180    0.0666713443086881
181  };
182  static const G4double x[N] = {
183    -0.973906528517172,
184    -0.865063366688985,
185    -0.679409568299024,
186    -0.433395394129247,
187    -0.148874338981631,
188    0.148874338981631,
189    0.433395394129247,
190    0.679409568299024,
191    0.865063366688985,
192    0.973906528517172
193  };
194
195  G4double Total = 0.0;
196
197
198  for (G4int i = 0; i < N; i++) 
199    {
200
201      G4double KineticE = ((Up-Low)*x[i]+(Up+Low))/2.0;
202
203      Total += w[i]*ProbabilityDistributionFunction(fragment, KineticE);
204
205    }
206  Total *= (Up-Low)/2.0;
207  return Total;
208}
209
210
211/////////////////////////////////////////////////////////
212//New method (OPT=1,2,3,4)
213
214G4double G4EvaporationProbability::ProbabilityDistributionFunction( const G4Fragment & fragment, const G4double K)
215{ 
216
217 
218
219
220  G4double ResidualA = fragment.GetA() - theA;
221  G4double ResidualZ = fragment.GetZ() - theZ; 
222  G4double U = fragment.GetExcitationEnergy();
223
224  //        if(K <= theCoulombBarrierptr->GetCoulombBarrier(G4lrint(ResidualA),G4lrint(ResidualZ),U)) return 0.0;   
225
226  G4double delta1 = G4PairingCorrection::GetInstance()->GetPairingCorrection(static_cast<G4int>(ResidualA),static_cast<G4int>(ResidualZ));
227
228 
229  G4double delta0 = G4PairingCorrection::GetInstance()->GetPairingCorrection(static_cast<G4int>(fragment.GetA()),static_cast<G4int>(fragment.GetZ()));
230
231 
232  G4double ParticleMass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetNucleusMass(theZ,theA);
233
234  G4double theSeparationEnergy= G4NucleiProperties::GetMassExcess(static_cast<G4int>(theA),static_cast<G4int>(theZ)) +
235    G4NucleiProperties::GetMassExcess(static_cast<G4int>(ResidualA),static_cast<G4int>(ResidualZ)) -
236    G4NucleiProperties::GetMassExcess(static_cast<G4int>(fragment.GetA()),static_cast<G4int>(fragment.GetZ()));
237
238  G4double a0 = theEvapLDPptr->LevelDensityParameter(static_cast<G4int>(fragment.GetA()),static_cast<G4int>(fragment.GetZ()),U - delta0);
239
240  G4double a1 = theEvapLDPptr->LevelDensityParameter(static_cast<G4int>(ResidualA),static_cast<G4int>(ResidualZ),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  //  G4double  Prob=Gamma*ParticleMass/((pi*hbar_Planck)*(pi*hbar_Planck)*
252  //std::exp(2*std::sqrt(a0*E0)))*K*CrossSection(fragment,K)*std::exp(2*std::sqrt(a1*E1))*millibarn;
253
254  G4double Prob=Gamma*ParticleMass/((pi*hbarc)*(pi*hbarc)*std::exp(2*std::sqrt(a0*E0)))
255    *K*CrossSection(fragment,K)*std::exp(2*std::sqrt(a1*E1))*millibarn;
256
257  return Prob;
258}
259
260
Note: See TracBrowser for help on using the repository browser.