Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4PreCompoundNeutron.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// -------------------------------------------------------------------
29//
30// GEANT4 Class file
31//
32//
33// File name: G4PreCompoundNeutron
34//
35// Author: V.Lara
36//
37// Modified:
38// 21.08.2008 J. M. Quesada add choice of options
39// 10.02.2009 J. M. Quesada set default opt3
40// 20.08.2010 V.Ivanchenko added G4Pow and G4PreCompoundParameters pointers
41// use int Z and A and cleanup
42//
43
45#include "G4SystemOfUnits.hh"
46#include "G4Neutron.hh"
47
49 : G4PreCompoundNucleon(G4Neutron::Neutron(), &theNeutronCoulombBarrier)
50{
51 ResidualA = GetRestA();
52 ResidualZ = GetRestZ();
53 theA = GetA();
54 theZ = GetZ();
55 ResidualAthrd = ResidualA13();
56 FragmentAthrd = ResidualAthrd;
57 FragmentA = theA + ResidualA;
58}
59
61{}
62
64{
65 G4double rj = 0.0;
66 if(nParticles > 0) {
67 rj = static_cast<G4double>(nParticles - nCharged)/
68 static_cast<G4double>(nParticles);
69 }
70 return rj;
71}
72
73////////////////////////////////////////////////////////////////////////////////////
74//J. M. Quesada (Dec 2007-June 2008): New inverse reaction cross sections
75//OPT=0 Dostrovski's parameterization
76//OPT=1,2 Chatterjee's paramaterization
77//OPT=3,4 Kalbach's parameterization
78//
80{
81 ResidualA = GetRestA();
82 ResidualZ = GetRestZ();
83 theA = GetA();
84 theZ = GetZ();
85 ResidualAthrd = ResidualA13();
86 FragmentA = theA + ResidualA;
87 FragmentAthrd = g4pow->Z13(FragmentA);
88
89 if (OPTxs==0) { return GetOpt0( K); }
90 else if( OPTxs==1 || OPTxs==2) { return GetOpt12( K); }
91 else if (OPTxs==3 || OPTxs==4) { return GetOpt34( K); }
92 else{
93 std::ostringstream errOs;
94 errOs << "BAD NEUTRON CROSS SECTION OPTION !!" <<G4endl;
95 throw G4HadronicException(__FILE__, __LINE__, errOs.str());
96 return 0.;
97 }
98}
99
101{
102 return 0.76+2.2/ResidualAthrd;
103}
104
106{
107 // return (2.12/std::pow(GetRestA(),2.0/3.0)-0.05)*MeV/GetAlpha();
108 return (2.12/(ResidualAthrd*ResidualAthrd)-0.05)*MeV/GetAlpha();
109}
110
111//********************* OPT=1,2 : Chatterjee's cross section ***************
112//(fitting to cross section from Bechetti & Greenles OM potential)
113
115{
116 G4double Kc=K;
117
118 // Pramana (Bechetti & Greenles) for neutrons is chosen
119
120 // JMQ xsec is set constat above limit of validity
121 if (K > 50*MeV) { Kc = 50*MeV; }
122
123 G4double landa, landa0, landa1, mu, mm0, mu1,nu, nu0, nu1, nu2,xs;
124
125 landa0 = 18.57;
126 landa1 = -22.93;
127 mm0 = 381.7;
128 mu1 = 24.31;
129 nu0 = 0.172;
130 nu1 = -15.39;
131 nu2 = 804.8;
132 landa = landa0/ResidualAthrd + landa1;
133 mu = mm0*ResidualAthrd + mu1*ResidualAthrd*ResidualAthrd;
134 nu = nu0*ResidualAthrd*ResidualA + nu1*ResidualAthrd*ResidualAthrd + nu2 ;
135 xs=landa*Kc + mu + nu/Kc;
136 if (xs <= 0.0 ){
137 std::ostringstream errOs;
138 G4cout<<"WARNING: NEGATIVE OPT=1 neutron cross section "<<G4endl;
139 errOs << "RESIDUAL: Ar=" << ResidualA << " Zr=" << ResidualZ <<G4endl;
140 errOs <<" xsec("<<Kc<<" MeV) ="<<xs <<G4endl;
141 throw G4HadronicException(__FILE__, __LINE__, errOs.str());
142 }
143 return xs;
144}
145
146// *********** OPT=3,4 : Kalbach's cross sections (from PRECO code)*************
148{
149 G4double landa, landa0, landa1, mu, mm0, mu1,nu, nu0, nu1, nu2;
150 G4double p, p0;
151 G4double flow,ec,ecsq,xnulam,etest(0.),ra(0.),a,signor(1.),sig;
152 G4double b,ecut,cut,ecut2,geom,elab;
153
154 flow = 1.e-18;
155
156 // PRECO xs for neutrons is choosen
157 p0 = -312.;
158 landa0 = 12.10;
159 landa1= -11.27;
160 mm0 = 234.1;
161 mu1 = 38.26;
162 nu0 = 1.55;
163 nu1 = -106.1;
164 nu2 = 1280.8;
165
166 if (ResidualA < 40) { signor =0.7 + ResidualA*0.0075; }
167 if (ResidualA > 210) { signor = 1. + (ResidualA-210)/250.; }
168 landa = landa0/ResidualAthrd + landa1;
169 mu = mm0*ResidualAthrd + mu1*ResidualAthrd*ResidualAthrd;
170 nu = nu0*ResidualAthrd*ResidualA + nu1*ResidualAthrd*ResidualAthrd + nu2;
171
172 // JMQ very low energy behaviour corrected (problem for A (apprx.)>60)
173 if (nu < 0.) { nu=-nu; }
174
175 ec = 0.5;
176 ecsq = 0.25;
177 p = p0;
178 xnulam = 1.;
179 etest = 32.;
180 // ** etest is the energy above which the rxn cross section is
181 // ** compared with the geometrical limit and the max taken.
182 // ** xnulam here is a dummy value to be used later.
183
184 a = -2.*p*ec + landa - nu/ecsq;
185 b = p*ecsq + mu + 2.*nu/ec;
186 ecut = 0.;
187 cut = a*a - 4.*p*b;
188 if (cut > 0.) { ecut = std::sqrt(cut); }
189 ecut = (ecut-a) / (p+p);
190 ecut2 = ecut;
191 if (cut < 0.) { ecut2 = ecut - 2.; }
192 elab = K * FragmentA / G4double(ResidualA);
193 sig = 0.;
194 if (elab <= ec) { //start for E<Ec
195 if (elab > ecut2) { sig = (p*elab*elab+a*elab+b) * signor; }
196 } //end for E<Ec
197 else { //start for E>Ec
198 sig = (landa*elab+mu+nu/elab) * signor;
199 geom = 0.;
200 if (xnulam < flow || elab < etest) { return sig; }
201 geom = std::sqrt(theA*K);
202 geom = 1.23*ResidualAthrd + ra + 4.573/geom;
203 geom = 31.416 * geom * geom;
204 sig = std::max(geom,sig);
205
206 }
207 return sig;
208}
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
G4double Z13(G4int Z)
Definition: G4Pow.hh:110
virtual G4double GetBeta()
virtual G4double CrossSection(G4double ekin)
virtual G4double GetAlpha()
G4double GetOpt12(G4double K)
G4double GetOpt34(G4double K)
virtual G4double GetRj(G4int NumberParticles, G4int NumberCharged)
G4double GetOpt0(G4double ekin)
G4double ResidualA13() const
G4int GetRestZ() const
G4int GetRestA() const