Geant4 11.2.2
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 = std::min(4.0, 100./(G4double)resA); // in MeV
84 if(0 < Z) { ec = cb; }
85
86 G4double ecsq = ec*ec;
87 G4double elab = K * (A + resA) / G4double(resA);
88
89 if(idx == 0) { // parameterization for neutron
90
91 if(resA < 40) { signor =0.7 + resA*0.0075; }
92 else if(resA > 210) { signor = 1. + (resA-210)*0.004; }
93 lambda = paramK[idx][3]/resA13 + paramK[idx][4];
94 mu = (paramK[idx][5] + paramK[idx][6]*resA13)*resA13;
95 // JMQ 20.11.2008 very low energy behaviour corrected
96 // (problem for A (apprx.)>60) fix for avoiding
97 // neutron xs going to zero at very low energies
98 nu = std::abs((paramK[idx][7]*resA + paramK[idx][8]*resA13)*resA13
99 + paramK[idx][9]);
100
101 } else { // parameterization for charged
102 // proton correction
103 if(idx == 1) {
104 if (resA <= 60) { signor = 0.92; }
105 else if (resA < 100) { signor = 0.8 + resA*0.002; }
106 }
107 lambda = paramK[idx][3]*resA + paramK[idx][4];
108 mu = paramK[idx][5]*amu1;
109 nu = amu1* (paramK[idx][7] + paramK[idx][8]*ec + paramK[idx][9]*ecsq);
110 }
111 /*
112 G4cout << "## idx=" << idx << " K=" << K << " elab=" << elab
113 << " ec=" << ec << " lambda=" << lambda << " mu=" << mu
114 << " nu=" << nu << G4endl;
115 */
116 // threashold cross section
117 if(elab < ec) {
118 G4double p = paramK[idx][0];
119 if(0 < Z) { p += paramK[idx][1]/ec + paramK[idx][2]/ecsq; }
120 G4double a = -2*p*ec + lambda - nu/ecsq;
121 G4double b = p*ecsq + mu + 2*nu/ec;
122 G4double det = a*a - 4*p*b;
123 G4double ecut = (det > 0.0) ? (std::sqrt(det) - a)/(2*p) : -a/(2*p);
124
125 //G4cout << " elab= " << elab << " ecut= " << ecut << " sig= " << sig
126 // << " sig1= " << (p*elab*elab + a*elab + b)*signor << G4endl;
127 // If ecut>0, sig=0 at elab=ecut
128 if(0 == idx) {
129 sig = (lambda*ec + mu + nu/ec)*signor*std::sqrt(elab/ec);
130 } else if(elab >= ecut) {
131 sig = (p*elab*elab + a*elab + b)*signor;
132
133 // extra proton correction
134 if(1 == idx) {
135 // c and w are for global correction factor for
136 // they are scaled down for light targets where ec is low.
137 G4double cc = std::min(3.15, ec*0.5);
138 G4double signor2 = (ec - elab - cc) *3.15/ (0.7*cc);
139 sig /= (1. + G4Exp(signor2));
140 }
141 }
142 //G4cout << " ecut= " << ecut << " a= " << a << " b= " << b
143 // << " signor= " << signor << " sig= " << sig << G4endl;
144
145 // high energy cross section
146 } else {
147 // etest is the energy above which the rxn cross section is
148 // compared with the geometrical limit and the max taken.
149
150 // neutron parameters
151 G4double etest = 32.;
152 G4double xnulam = 1.0;
153
154 // parameters for charged
155 static const G4double flow = 1.e-18;
156 static const G4double spill= 1.e+18;
157 if(0 < Z) {
158 etest = 0.0;
159 xnulam = nu / lambda;
160 xnulam = std::min(xnulam, spill);
161 if (xnulam >= flow) {
162 if(1 == idx) { etest = std::sqrt(xnulam) + 7.; }
163 else { etest = 1.2 *std::sqrt(xnulam); }
164 }
165 }
166 // ** For xnulam.gt.0, sig reaches a maximum at sqrt(xnulam).
167 sig = (lambda*elab + mu + nu/elab)*signor;
168 if (xnulam >= flow && elab >= etest) {
169 G4double geom = std::sqrt(A*K);
170 geom = 1.23*resA13 + paramK[idx][10] + 4.573/geom;
171 geom = 31.416 * geom * geom;
172 sig = std::max(sig, geom);
173 }
174 }
175 sig = std::max(sig, 0.0);
176 //G4cout << " ---- sig= " << sig << G4endl;
177 return sig;
178}
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition G4Exp.hh:180
double G4double
Definition G4Types.hh:83
const G4double A[17]

Referenced by G4EvaporationProbability::CrossSection(), and G4PreCompoundFragment::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: