Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4KalbachCrossSection.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//
27//
28// V.Ivanchenko 26.02.2018
29//
30
32#include "G4Exp.hh"
33#include "G4Pow.hh"
34
35//from subroutine sigpar of PRECO-2000 by Constance Kalbach Walker
36// Calculate optical model reaction cross sections
37// using the empirical parameterization
38// of Narasimha Murthy, Chaterjee, and Gupta
39// going over to the geometrical limit at high energy.
40//
41// Proton cross sections scaled down with signor for a<100
42// (appropriate for becchetti-greenlees potential).
43// p2 reduced and global red'n factor introduced below Bc
44// Neutron cross sections scaled down with signor for a<40
45// Scaled up for A>210 (added June '98 to conform with
46// my published papers)
47// (appropriate for Mani et al potential)
48//
49
50// index: 0-neutron, 1-proton, 2-deuteron, 3-triton, 4-He3, 5-He4
51// parameters: p0, p1, p2, lambda0, lambda1, mu0, mu1, nu0, nu1, nu2, ra
52
53static const G4double paramK[6][11] = {
54 // n from mani, melkanoff and iori
55 {-312., 0., 0., 12.10, -11.27, 234.1, 38.26, 1.55, -106.1, 1280.8, 0.0},
56 // p from becchetti and greenlees (but modified with sub-barrier
57 // correction function and p2 changed from -449)
58 {15.72, 9.65, -300., 0.00437,-16.58, 244.7, 0.503, 273.1, -182.4, -1.872, 0.0},
59 // d from o.m. of perey and perey
60 {0.798, 420.3,-1651., 0.00619, -7.54, 583.5, 0.337, 421.8, -474.5, -3.592, 0.8},
61 // t from o.m. of hafele, flynn et al
62 {-21.45,484.7,-1608., 0.0186, -8.9, 686.3, 0.325, 368.9, -522.2, -4.998, 0.8},
63 // 3he from o.m. of gibson et al
64 {-2.88,205.6, -1487.,0.00459,-8.93, 611.2, 0.35 , 473.8, -468.2, -2.225, 0.8},
65 // alpha from huizenga and igo
66 { 10.95,-85.2, 1146., 0.0643,-13.96, 781.2, 0.29, -304.7,-470.0, -8.580, 1.2}
67};
68
70{
71 return G4Pow::GetInstance()->powZ(resA, paramK[idx][6]);
72}
73
76 G4double resA13, G4double amu1,
77 G4int idx, G4int Z, G4int A,
78 G4int resA)
79{
80 G4double sig = 0.0;
81 G4double signor = 1.0;
82 G4double lambda, mu, nu;
83 G4double ec = 0.5;
84 if(0 < Z) { ec = cb; }
85 //JMQ 13.02.2009 tuning for improving cluster emission ddxs
86 // (spallation benchmark)
87 /*
88 G4double xx = 1.7;
89 if(1 == A) { xx = 1.5; }
90 ec = 1.44 * Z * resZ / (xx*resA13 + paramK[idx][10]);
91 }
92 */
93 G4double ecsq = ec*ec;
94 G4double elab = K * (A + resA) / G4double(resA);
95
96 if(idx == 0) { // parameterization for neutron
97
98 if(resA < 40) { signor =0.7 + resA*0.0075; }
99 else if(resA > 210) { signor = 1. + (resA-210)*0.004; }
100 lambda = paramK[idx][3]/resA13 + paramK[idx][4];
101 mu = (paramK[idx][5] + paramK[idx][6]*resA13)*resA13;
102 // JMQ 20.11.2008 very low energy behaviour corrected
103 // (problem for A (apprx.)>60) fix for avoiding
104 // neutron xs going to zero at very low energies
105 nu = std::abs((paramK[idx][7]*resA + paramK[idx][8]*resA13)*resA13
106 + paramK[idx][9]);
107
108 } else { // parameterization for charged
109 // proton correction
110 if(idx == 1) {
111 if (resA <= 60) { signor = 0.92; }
112 else if (resA < 100) { signor = 0.8 + resA*0.002; }
113 }
114 lambda = paramK[idx][3]*resA + paramK[idx][4];
115 mu = paramK[idx][5]*amu1;
116 nu = amu1* (paramK[idx][7] + paramK[idx][8]*ec + paramK[idx][9]*ecsq);
117 }
118 /*
119 G4cout << "## idx= " << idx << " K= " << K << " elab= " << elab << " ec= " << ec
120 << " lambda= " << lambda << " mu= " << mu << " nu= " << nu << G4endl;
121 */
122 // threashold cross section
123 if(elab < ec) {
124 G4double p = paramK[idx][0];
125 if(0 < Z) { p += paramK[idx][1]/ec + paramK[idx][2]/ecsq; }
126 G4double a = -2*p*ec + lambda - nu/ecsq;
127 G4double b = p*ecsq + mu + 2*nu/ec;
128 G4double ecut;
129 G4double det = a*a - 4*p*b;
130 if (det > 0.0) { ecut = (std::sqrt(det) - a)/(2*p); }
131 else { ecut = -a/(2*p); }
132
133 //G4cout << " elab= " << elab << " ecut= " << ecut << " sig= " << sig
134 // << " sig1= " << (p*elab*elab + a*elab + b)*signor << G4endl;
135 // If ecut>0, sig=0 at elab=ecut
136 if(0 == idx) {
137 sig = (lambda*ec + mu + nu/ec)*signor*std::sqrt(elab/ec);
138 } else if(elab >= ecut) {
139 sig = (p*elab*elab + a*elab + b)*signor;
140
141 // extra proton correction
142 if(1 == idx) {
143 // c and w are for global correction factor for
144 // they are scaled down for light targets where ec is low.
145 G4double cc = std::min(3.15, ec*0.5);
146 G4double signor2 = (ec - elab - cc) *3.15/ (0.7*cc);
147 sig /= (1. + G4Exp(signor2));
148 }
149 }
150 //G4cout << " ecut= " << ecut << " a= " << a << " b= " << b
151 // << " signor= " << signor << " sig= " << sig << G4endl;
152
153 // high energy cross section
154 } else {
155 // etest is the energy above which the rxn cross section is
156 // compared with the geometrical limit and the max taken.
157
158 // neutron parameters
159 G4double etest = 32.;
160 G4double xnulam = 1.0;
161
162 // parameters for charged
163 static const G4double flow = 1.e-18;
164 static const G4double spill= 1.e+18;
165 if(0 < Z) {
166 etest = 0.0;
167 xnulam = nu / lambda;
168 xnulam = std::min(xnulam, spill);
169 if (xnulam >= flow) {
170 if(1 == idx) { etest = std::sqrt(xnulam) + 7.; }
171 else { etest = 1.2 *std::sqrt(xnulam); }
172 }
173 }
174 // ** For xnulam.gt.0, sig reaches a maximum at sqrt(xnulam).
175 sig = (lambda*elab + mu + nu/elab)*signor;
176 if (xnulam >= flow && elab >= etest) {
177 G4double geom = std::sqrt(A*K);
178 geom = 1.23*resA13 + paramK[idx][10] + 4.573/geom;
179 geom = 31.416 * geom * geom;
180 sig = std::max(sig, geom);
181 }
182 }
183 sig = std::max(sig, 0.0);
184 //G4cout << " ---- sig= " << sig << G4endl;
185 return sig;
186}
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:180
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
const G4double A[17]
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 G4Pow * GetInstance()
Definition: G4Pow.cc:41
G4double powZ(G4int Z, G4double y) const
Definition: G4Pow.hh:225