00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #include "G4PreCompoundNeutron.hh"
00045 #include "G4SystemOfUnits.hh"
00046 #include "G4Neutron.hh"
00047
00048 G4PreCompoundNeutron::G4PreCompoundNeutron()
00049 : G4PreCompoundNucleon(G4Neutron::Neutron(), &theNeutronCoulombBarrier)
00050 {
00051 ResidualA = GetRestA();
00052 ResidualZ = GetRestZ();
00053 theA = GetA();
00054 theZ = GetZ();
00055 ResidualAthrd = ResidualA13();
00056 FragmentAthrd = ResidualAthrd;
00057 FragmentA = theA + ResidualA;
00058 }
00059
00060 G4PreCompoundNeutron::~G4PreCompoundNeutron()
00061 {}
00062
00063 G4double G4PreCompoundNeutron::GetRj(G4int nParticles, G4int nCharged)
00064 {
00065 G4double rj = 0.0;
00066 if(nParticles > 0) {
00067 rj = static_cast<G4double>(nParticles - nCharged)/
00068 static_cast<G4double>(nParticles);
00069 }
00070 return rj;
00071 }
00072
00074
00075
00076
00077
00078
00079 G4double G4PreCompoundNeutron::CrossSection(const G4double K)
00080 {
00081 ResidualA = GetRestA();
00082 ResidualZ = GetRestZ();
00083 theA = GetA();
00084 theZ = GetZ();
00085 ResidualAthrd = ResidualA13();
00086 FragmentA = theA + ResidualA;
00087 FragmentAthrd = g4pow->Z13(FragmentA);
00088
00089 if (OPTxs==0) { return GetOpt0( K); }
00090 else if( OPTxs==1 || OPTxs==2) { return GetOpt12( K); }
00091 else if (OPTxs==3 || OPTxs==4) { return GetOpt34( K); }
00092 else{
00093 std::ostringstream errOs;
00094 errOs << "BAD NEUTRON CROSS SECTION OPTION !!" <<G4endl;
00095 throw G4HadronicException(__FILE__, __LINE__, errOs.str());
00096 return 0.;
00097 }
00098 }
00099
00100 G4double G4PreCompoundNeutron::GetAlpha()
00101 {
00102 return 0.76+2.2/ResidualAthrd;
00103 }
00104
00105 G4double G4PreCompoundNeutron::GetBeta()
00106 {
00107
00108 return (2.12/(ResidualAthrd*ResidualAthrd)-0.05)*MeV/GetAlpha();
00109 }
00110
00111
00112
00113
00114 G4double G4PreCompoundNeutron::GetOpt12(G4double K)
00115 {
00116 G4double Kc=K;
00117
00118
00119
00120
00121 if (K > 50*MeV) { Kc = 50*MeV; }
00122
00123 G4double landa, landa0, landa1, mu, mm0, mu1,nu, nu0, nu1, nu2,xs;
00124
00125 landa0 = 18.57;
00126 landa1 = -22.93;
00127 mm0 = 381.7;
00128 mu1 = 24.31;
00129 nu0 = 0.172;
00130 nu1 = -15.39;
00131 nu2 = 804.8;
00132 landa = landa0/ResidualAthrd + landa1;
00133 mu = mm0*ResidualAthrd + mu1*ResidualAthrd*ResidualAthrd;
00134 nu = nu0*ResidualAthrd*ResidualA + nu1*ResidualAthrd*ResidualAthrd + nu2 ;
00135 xs=landa*Kc + mu + nu/Kc;
00136 if (xs <= 0.0 ){
00137 std::ostringstream errOs;
00138 G4cout<<"WARNING: NEGATIVE OPT=1 neutron cross section "<<G4endl;
00139 errOs << "RESIDUAL: Ar=" << ResidualA << " Zr=" << ResidualZ <<G4endl;
00140 errOs <<" xsec("<<Kc<<" MeV) ="<<xs <<G4endl;
00141 throw G4HadronicException(__FILE__, __LINE__, errOs.str());
00142 }
00143 return xs;
00144 }
00145
00146
00147 G4double G4PreCompoundNeutron::GetOpt34(G4double K)
00148 {
00149 G4double landa, landa0, landa1, mu, mm0, mu1,nu, nu0, nu1, nu2;
00150 G4double p, p0;
00151 G4double flow,ec,ecsq,xnulam,etest(0.),ra(0.),a,signor(1.),sig;
00152 G4double b,ecut,cut,ecut2,geom,elab;
00153
00154 flow = 1.e-18;
00155
00156
00157 p0 = -312.;
00158 landa0 = 12.10;
00159 landa1= -11.27;
00160 mm0 = 234.1;
00161 mu1 = 38.26;
00162 nu0 = 1.55;
00163 nu1 = -106.1;
00164 nu2 = 1280.8;
00165
00166 if (ResidualA < 40) { signor =0.7 + ResidualA*0.0075; }
00167 if (ResidualA > 210) { signor = 1. + (ResidualA-210)/250.; }
00168 landa = landa0/ResidualAthrd + landa1;
00169 mu = mm0*ResidualAthrd + mu1*ResidualAthrd*ResidualAthrd;
00170 nu = nu0*ResidualAthrd*ResidualA + nu1*ResidualAthrd*ResidualAthrd + nu2;
00171
00172
00173 if (nu < 0.) { nu=-nu; }
00174
00175 ec = 0.5;
00176 ecsq = 0.25;
00177 p = p0;
00178 xnulam = 1.;
00179 etest = 32.;
00180
00181
00182
00183
00184 a = -2.*p*ec + landa - nu/ecsq;
00185 b = p*ecsq + mu + 2.*nu/ec;
00186 ecut = 0.;
00187 cut = a*a - 4.*p*b;
00188 if (cut > 0.) { ecut = std::sqrt(cut); }
00189 ecut = (ecut-a) / (p+p);
00190 ecut2 = ecut;
00191 if (cut < 0.) { ecut2 = ecut - 2.; }
00192 elab = K * FragmentA / G4double(ResidualA);
00193 sig = 0.;
00194 if (elab <= ec) {
00195 if (elab > ecut2) { sig = (p*elab*elab+a*elab+b) * signor; }
00196 }
00197 else {
00198 sig = (landa*elab+mu+nu/elab) * signor;
00199 geom = 0.;
00200 if (xnulam < flow || elab < etest) { return sig; }
00201 geom = std::sqrt(theA*K);
00202 geom = 1.23*ResidualAthrd + ra + 4.573/geom;
00203 geom = 31.416 * geom * geom;
00204 sig = std::max(geom,sig);
00205
00206 }
00207 return sig;
00208 }