Geant4  10.01.p02
G4PreCompoundProton.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: G4PreCompoundProton.cc 90591 2015-06-04 13:45:29Z gcosmo $
27 //
28 // -------------------------------------------------------------------
29 //
30 // GEANT4 Class file
31 //
32 //
33 // File name: G4PreCompoundProton
34 //
35 // Author: V.Lara
36 //
37 // Modified:
38 // 21.08.2008 J. M. Quesada added external choice of inverse cross section option
39 // 21.08.2008 J. M. Quesada added external choice for superimposed Coulomb
40 // barrier (if useSICB=true)
41 // 20.08.2010 V.Ivanchenko added G4Pow and G4PreCompoundParameters pointers
42 // use int Z and A and cleanup
43 //
44 
45 #include "G4PreCompoundProton.hh"
46 #include "G4PhysicalConstants.hh"
47 #include "G4SystemOfUnits.hh"
48 #include "G4Proton.hh"
49 #include "G4Log.hh"
50 #include "G4Exp.hh"
51 
53  : G4PreCompoundNucleon(G4Proton::Proton(), &theProtonCoulombBarrier)
54 {
55  ResidualA = GetRestA();
56  ResidualZ = GetRestZ();
57  theA = GetA();
58  theZ = GetZ();
62 }
63 
65 {}
66 
68 {
69  G4double rj = 0.0;
70  if(nParticles > 0) {
71  rj = static_cast<G4double>(nCharged)/static_cast<G4double>(nParticles);
72  }
73  return rj;
74 }
75 
77 //J. M. Quesada (Dec 2007-June 2008): New inverse reaction cross sections
78 //OPT=0 Dostrovski's parameterization
79 //OPT=1 Chatterjee's paramaterization
80 //OPT=2,4 Wellisch's parametarization
81 //OPT=3 Kalbach's parameterization
82 //
84 {
85  ResidualA = GetRestA();
86  ResidualZ = GetRestZ();
87  theA = GetA();
88  theZ = GetZ();
92 
93  if (OPTxs==0) { return GetOpt0( K); }
94  else if( OPTxs == 1) { return GetOpt1( K); }
95  else if( OPTxs == 2) { return GetOpt2( K); }
96  else { return GetOpt3( K); }
97 }
98 
100 {
101  G4int aZ = ResidualZ;
102  G4double C = 0.0;
103  if (aZ >= 70)
104  {
105  C = 0.10;
106  }
107  else
108  {
109  C = ((((0.15417e-06*aZ) - 0.29875e-04)*aZ + 0.21071e-02)*aZ
110  - 0.66612e-01)*aZ + 0.98375;
111  }
112  return 1.0 + C;
113 }
114 
116 {
117  return -GetCoulombBarrier();
118 }
119 
120 //********************* OPT=1 : Chatterjee's cross section *********************
121 //(fitting to cross section from Bechetti & Greenles OM potential)
122 
124 {
125  G4double Kc=K;
126 
127  // JMQ xsec is set constat above limit of validity
128  if (K > 50*MeV) { Kc = 50*MeV; }
129 
130  const G4double p0 = 15.72;
131  const G4double p1 = 9.65;
132  const G4double p2 = -449.0;
133  const G4double landa0 = 0.00437;
134  const G4double landa1 = -16.58;
135  const G4double mm0 = 244.7;
136  const G4double mu1 = 0.503;
137  const G4double nu0 = 273.1;
138  const G4double nu1 = -182.4;
139  const G4double nu2 = -1.872;
140  const G4double delta = 0.;
141 
142  G4double Ec = 1.44*theZ*ResidualZ/(1.5*ResidualAthrd+delta);
143  G4double p = p0 + p1/Ec + p2/(Ec*Ec);
144  G4double landa = landa0*ResidualA + landa1;
145 
146  G4double resmu1 = g4pow->powZ(ResidualA,mu1);
147  G4double mu = mm0*resmu1;
148  G4double nu = resmu1*(nu0 + nu1*Ec + nu2*(Ec*Ec));
149  G4double q = landa - nu/(Ec*Ec) - 2*p*Ec;
150  G4double r = mu + 2*nu/Ec + p*(Ec*Ec);
151 
152  G4double ji = std::max(Kc,Ec);
153  G4double xs = 0.0;
154 
155  if(Kc < Ec) { xs = p*Kc*Kc + q*Kc + r;}
156  else {xs = p*(Kc - ji)*(Kc - ji) + landa*Kc + mu + nu*(2 - Kc/ji)/ji ;}
157 
158  xs = std::max(xs, 0.0);
159  return xs;
160 }
161 
162 //************* OPT=2 : Welisch's proton reaction cross section ***************
163 
165 {
166  // This is redundant when the Coulomb barrier is overimposed to all
167  // cross sections
168  // It should be kept when Coulomb barrier only imposed at OPTxs=2
169 
170  if(!useSICB && K<=theCoulombBarrier) { return 0.0; }
171 
172  G4double eekin=K;
173  G4int rnneu=ResidualA-ResidualZ;
174  G4double ekin=eekin/1000;
175  G4double r0=1.36*1.e-15;
176  G4double fac=pi*r0*r0;
177  G4double b0=2.247-0.915*(1.-1./ResidualAthrd);
178  G4double fac1=b0*(1.-1./ResidualAthrd);
179  G4double fac2=1.;
180  if(rnneu > 1.5) { fac2 = g4pow->logZ(rnneu); }
181  G4double xine_th= 1.e+31*fac*fac2*(1.+ResidualAthrd-fac1);
182  xine_th=(1.-0.15*G4Exp(-ekin))*xine_th/(1.00-0.0007*ResidualA);
183  G4double ff1=0.70-0.0020*ResidualA;
184  G4double ff2=1.00+1/G4double(ResidualA);
185  G4double ff3=0.8+18/G4double(ResidualA)-0.002*ResidualA;
186  G4double log10E = G4Log(ekin)/g4pow->logZ(10);
187  fac=1.-(1./(1.+G4Exp(-8.*ff1*(log10E + 1.37*ff2))));
188  xine_th=xine_th*(1.+ff3*fac);
189  ff1=1.-1/G4double(ResidualA)-0.001*ResidualA;
190  ff2=1.17-2.7/G4double(ResidualA)-0.0014*ResidualA;
191  fac=-8.*ff1*(log10E + 2.0*ff2);
192  xine_th /= (1.+G4Exp(fac));
193 
194  xine_th = std::max(xine_th, 0.0);
195  return xine_th;
196 }
197 
198 // *********** OPT=3 : Kalbach's cross sections (from PRECO code)*************
200 {
201  // ** p from becchetti and greenlees (but modified with sub-barrier
202  // ** correction function and xp2 changed from -449)
203 
204  const G4double p0 = 15.72;
205  const G4double p1 = 9.65;
206  const G4double p2 = -300.;
207  const G4double landa0 = 0.00437;
208  const G4double landa1 = -16.58;
209  const G4double mm0 = 244.7;
210  const G4double mu1 = 0.503;
211  const G4double nu0 = 273.1;
212  const G4double nu1 = -182.4;
213  const G4double nu2 = -1.872;
214 
215  const G4double flow = 1.e-18;
216  const G4double spill = 1.e+18;
217  const G4double ra = 0.0;
218 
219  G4double signor = 1.0;
220  if (ResidualA <= 60) { signor = 0.92; }
221  else if (ResidualA < 100) { signor = 0.8 + ResidualA*0.002; }
222 
223  G4double ec = 1.44 * theZ * ResidualZ / (1.5*ResidualAthrd+ra);
224  G4double ecsq = ec * ec;
225  G4double p = p0 + p1/ec + p2/ecsq;
226  G4double landa = landa0*ResidualA + landa1;
227  G4double a = g4pow->powZ(ResidualA,mu1);
228  G4double mu = mm0 * a;
229  G4double nu = a* (nu0+nu1*ec+nu2*ecsq);
230 
231  G4double c =std::min(3.15,ec*0.5);
232  G4double w = 0.7 * c / 3.15;
233 
234  G4double etest = 0.0;
235  G4double xnulam = nu / landa;
236  if(xnulam > spill) { xnulam=0.; }
237  else if(xnulam >= flow) { etest = std::sqrt(xnulam) + 7.; }
238 
239  a = -2.*p*ec + landa - nu/ecsq;
240  G4double b = p*ecsq + mu + 2.*nu/ec;
241  G4double ecut = 0.;
242  G4double cut = a*a - 4.*p*b;
243  if (cut > 0.) { ecut = std::sqrt(cut); }
244  ecut = (ecut-a) / (2*p);
245 
246  //JMQ 290310 for avoiding unphysical increase below minimum (at ecut)
247  // ecut<0 means that there is no cut with energy axis, i.e. xs is set
248  // to 0 bellow minimum
249 
250  G4double elab = K * FragmentA /G4double(ResidualA);
251  G4double sig = 0.;
252  if (elab <= ec) {
253  if (elab > ecut) { sig = (p*elab*elab+a*elab+b) * signor; }
254 
255  G4double signor2 = (ec-elab-c) / w;
256  sig /= (1. + G4Exp(signor2));
257 
258  } else {
259  sig = (landa*elab+mu+nu/elab) * signor;
260  G4double geom = 0.;
261  if (xnulam >= flow && elab >= etest) {
262  geom = std::sqrt(theA*K);
263  geom = 1.23*ResidualAthrd + ra + 4.573/geom;
264  geom = 31.416 * geom * geom;
265  sig = std::max(geom, sig);
266  }
267  }
268  sig = std::max(sig, 0.0);
269  return sig;
270 }
G4double GetOpt3(G4double K)
static const double MeV
Definition: G4SIunits.hh:193
G4double ResidualA13() const
const G4double pi
virtual G4double GetRj(G4int NumberParticles, G4int NumberCharged)
G4int GetA() const
const G4double nu1
G4double GetOpt0(G4double ekin)
G4double a
Definition: TRTMaterials.hh:39
virtual G4double CrossSection(G4double ekin)
int G4int
Definition: G4Types.hh:78
G4double logZ(G4int Z) const
Definition: G4Pow.hh:163
const G4double mm0
G4double Z13(G4int Z) const
Definition: G4Pow.hh:127
const G4double landa1
const G4double nu0
virtual G4double GetBeta()
const G4double p2
const G4double p1
G4int GetRestZ() const
virtual G4double GetAlpha()
const G4double mu1
G4double GetCoulombBarrier() const
G4double G4Log(G4double x)
Definition: G4Log.hh:230
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:183
const G4double p0
T max(const T t1, const T t2)
brief Return the largest of the two arguments
const G4double nu2
G4double GetOpt1(G4double K)
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
G4int GetRestA() const
static const G4double fac
G4int GetZ() const
G4double powZ(G4int Z, G4double y) const
Definition: G4Pow.hh:256
double G4double
Definition: G4Types.hh:76
const G4double landa0
static const G4double b0
G4double GetOpt2(G4double K)
const G4double r0