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
G4NeutronEvaporationProbability.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// J.M. Quesada (August2008). Based on:
29//
30// Hadronic Process: Nuclear De-excitations
31// by V. Lara (Oct 1998)
32//
33// Modified:
34// 03-09-2008 J.M. Quesada for external choice of inverse cross section option
35// 17-11-2010 V.Ivanchenko integer Z and A
36
38#include "G4SystemOfUnits.hh"
39
41 G4EvaporationProbability(1,0,2,&theCoulombBarrier) // A,Z,Gamma,&theCoulombBarrier
42{
43 ResidualA = ResidualZ = theA = theZ = FragmentA = 0;
44 ResidualAthrd = FragmentAthrd = 0.0;
45}
46
48{}
49
50G4double G4NeutronEvaporationProbability::CalcAlphaParam(const G4Fragment & fragment)
51{
52 return 0.76+2.2/fG4pow->Z13(fragment.GetA_asInt()-GetA());
53}
54
55G4double G4NeutronEvaporationProbability::CalcBetaParam(const G4Fragment & fragment)
56{
57 return (2.12/fG4pow->Z23(fragment.GetA_asInt()-GetA()) - 0.05)*MeV/
58 CalcAlphaParam(fragment);
59}
60
61////////////////////////////////////////////////////////////////////////////////////
62//J. M. Quesada (Dec 2007-June 2008): New inverse reaction cross sections
63//OPT=0 Dostrovski's parameterization
64//OPT=1,2 Chatterjee's paramaterization
65//OPT=3,4 Kalbach's parameterization
66//
68G4NeutronEvaporationProbability::CrossSection(const G4Fragment & fragment, G4double K)
69{
70 theA=GetA();
71 theZ=GetZ();
72 ResidualA=fragment.GetA_asInt()-theA;
73 ResidualZ=fragment.GetZ_asInt()-theZ;
74
75 ResidualAthrd=fG4pow->Z13(ResidualA);
76 FragmentA=fragment.GetA_asInt();
77 FragmentAthrd=fG4pow->Z13(FragmentA);
78
79 if (OPTxs==0) {std::ostringstream errOs;
80 errOs << "We should'n be here (OPT =0) at evaporation cross section calculation (neutrons)!!" <<G4endl;
81 throw G4HadronicException(__FILE__, __LINE__, errOs.str());
82 return 0.;}
83 else if( OPTxs==1 ||OPTxs==2) return GetOpt12( K);
84 else if (OPTxs==3 || OPTxs==4) return GetOpt34( K);
85 else{
86 std::ostringstream errOs;
87 errOs << "BAD NEUTRON CROSS SECTION OPTION AT EVAPORATION!!" <<G4endl;
88 throw G4HadronicException(__FILE__, __LINE__, errOs.str());
89 return 0.;
90 }
91}
92
93//********************* OPT=1,2 : Chatterjee's cross section ***************
94//(fitting to cross section from Bechetti & Greenles OM potential)
95
96G4double G4NeutronEvaporationProbability::GetOpt12(G4double K)
97{
98 G4double Kc=K;
99
100 // Pramana (Bechetti & Greenles) for neutrons is chosen
101
102 // JMQ xsec is set constat above limit of validity
103 if (K > 50*MeV) { Kc = 50*MeV; }
104
105 G4double landa, landa0, landa1, mu, mum0, mu1,nu, nu0, nu1, nu2,xs;
106
107 landa0 = 18.57;
108 landa1 = -22.93;
109 mum0 = 381.7;
110 mu1 = 24.31;
111 nu0 = 0.172;
112 nu1 = -15.39;
113 nu2 = 804.8;
114 landa = landa0/ResidualAthrd + landa1;
115 mu = mum0*ResidualAthrd + mu1*ResidualAthrd*ResidualAthrd;
116 nu = nu0*ResidualAthrd*ResidualA + nu1*ResidualAthrd*ResidualAthrd + nu2 ;
117 xs=landa*Kc + mu + nu/Kc;
118 if (xs <= 0.0 ){
119 std::ostringstream errOs;
120 G4cout<<"WARNING: NEGATIVE OPT=1 neutron cross section "<<G4endl;
121 errOs << "RESIDUAL: Ar=" << ResidualA << " Zr=" << ResidualZ <<G4endl;
122 errOs <<" xsec("<<Kc<<" MeV) ="<<xs <<G4endl;
123 throw G4HadronicException(__FILE__, __LINE__, errOs.str());
124 }
125 return xs;
126}
127
128// *********** OPT=3,4 : Kalbach's cross sections (from PRECO code)*************
129G4double G4NeutronEvaporationProbability::GetOpt34(G4double K)
130{
131 G4double landa, landa0, landa1, mu, mum0, mu1,nu, nu0, nu1, nu2;
132 G4double p, p0;
133 G4double flow,ec,ecsq,xnulam,etest(0.),ra(0.),a,signor(1.),sig;
134 G4double b,ecut,cut,ecut2,geom,elab;
135
136 //safety initialization
137 landa0=0;
138 landa1=0;
139 mum0=0.;
140 mu1=0.;
141 nu0=0.;
142 nu1=0.;
143 nu2=0.;
144 p0=0.;
145
146 flow = 1.e-18;
147
148 // PRECO xs for neutrons is choosen
149 p0 = -312.;
150 landa0 = 12.10;
151 landa1= -11.27;
152 mum0 = 234.1;
153 mu1 = 38.26;
154 nu0 = 1.55;
155 nu1 = -106.1;
156 nu2 = 1280.8;
157
158 if (ResidualA < 40) { signor =0.7 + ResidualA*0.0075; }
159 if (ResidualA > 210) { signor = 1. + (ResidualA-210)/250.; }
160 landa = landa0/ResidualAthrd + landa1;
161 mu = mum0*ResidualAthrd + mu1*ResidualAthrd*ResidualAthrd;
162 nu = nu0*ResidualAthrd*ResidualA + nu1*ResidualAthrd*ResidualAthrd + nu2;
163
164 // JMQ very low energy behaviour corrected (problem for A (apprx.)>60)
165 if (nu < 0.) { nu=-nu; }
166
167 ec = 0.5;
168 ecsq = 0.25;
169 p = p0;
170 xnulam = 1.;
171 etest = 32.;
172 // ** etest is the energy above which the rxn cross section is
173 // ** compared with the geometrical limit and the max taken.
174 // ** xnulam here is a dummy value to be used later.
175
176 a = -2.*p*ec + landa - nu/ecsq;
177 b = p*ecsq + mu + 2.*nu/ec;
178 ecut = 0.;
179 cut = a*a - 4.*p*b;
180 if (cut > 0.) { ecut = std::sqrt(cut); }
181 ecut = (ecut-a) / (p+p);
182 ecut2 = ecut;
183 if (cut < 0.) { ecut2 = ecut - 2.; }
184 elab = K * FragmentA / G4double(ResidualA);
185 sig = 0.;
186 if (elab <= ec) { //start for E<Ec
187 if (elab > ecut2) { sig = (p*elab*elab+a*elab+b) * signor; }
188 } //end for E<Ec
189 else { //start for E>Ec
190 sig = (landa*elab+mu+nu/elab) * signor;
191 geom = 0.;
192 if (xnulam < flow || elab < etest) { return sig; }
193 geom = std::sqrt(theA*K);
194 geom = 1.23*ResidualAthrd + ra + 4.573/geom;
195 geom = 31.416 * geom * geom;
196 sig = std::max(geom,sig);
197
198 }
199 return sig;
200}
201
double G4double
Definition: G4Types.hh:64
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
G4int GetZ_asInt() const
Definition: G4Fragment.hh:223
G4int GetA_asInt() const
Definition: G4Fragment.hh:218
G4double Z23(G4int Z)
Definition: G4Pow.hh:134
G4double Z13(G4int Z)
Definition: G4Pow.hh:110