Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4KalbachCrossSection Class Reference

#include <G4KalbachCrossSection.hh>

Static Public Member Functions

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)
 

Detailed Description

Definition at line 40 of file G4KalbachCrossSection.hh.

Member Function Documentation

◆ ComputeCrossSection()

G4double G4KalbachCrossSection::ComputeCrossSection ( G4double  K,
G4double  cb,
G4double  resA13,
G4double  amu1,
G4int  idx,
G4int  Z,
G4int  A,
G4int  resA 
)
static

Definition at line 75 of file G4KalbachCrossSection.cc.

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
const G4int Z[17]
const G4double A[17]

Referenced by G4PreCompoundFragment::CrossSection(), and G4EvaporationProbability::CrossSection().

◆ ComputePowerParameter()

G4double G4KalbachCrossSection::ComputePowerParameter ( G4int  resA,
G4int  idx 
)
static

Definition at line 69 of file G4KalbachCrossSection.cc.

70{
71 return G4Pow::GetInstance()->powZ(resA, paramK[idx][6]);
72}
static G4Pow * GetInstance()
Definition: G4Pow.cc:41
G4double powZ(G4int Z, G4double y) const
Definition: G4Pow.hh:225

Referenced by G4PreCompoundFragment::CalcEmissionProbability(), and G4EvaporationProbability::CrossSection().


The documentation for this class was generated from the following files: