Changeset 962 for trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4ProtonEvaporationProbability.cc
- Timestamp:
- Apr 6, 2009, 12:30:29 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4ProtonEvaporationProbability.cc
r819 r962 24 24 // ******************************************************************** 25 25 // 26 // 27 // $Id: G4ProtonEvaporationProbability.cc,v 1.4 2006/06/29 20:10:43 gunter Exp $ 28 // GEANT4 tag $Name: geant4-09-01-patch-02 $ 26 //J.M. Quesada (August2008). Based on: 29 27 // 30 28 // Hadronic Process: Nuclear De-excitations 31 // by V. Lara (Nov 1999) 32 // 33 29 // by V. Lara (Oct 1998) 30 // 31 // Modif (03 September 2008) by J. M. Quesada for external choice of inverse 32 // cross section option 34 33 35 34 #include "G4ProtonEvaporationProbability.hh" 36 35 37 36 G4ProtonEvaporationProbability::G4ProtonEvaporationProbability() : 38 G4EvaporationProbability(1,1,2) // A,Z,Gamma 39 { 40 std::vector<G4double>::size_type NumExcitedStatesEnergy = 31+1; 41 std::vector<G4int>::size_type NumExcitedStatesSpin = 31+1; 42 ExcitEnergies.reserve(NumExcitedStatesEnergy); 43 ExcitSpins.reserve(NumExcitedStatesSpin); 44 ExcitEnergies.insert(ExcitEnergies.begin(),NumExcitedStatesEnergy,0.0); 45 ExcitSpins.insert(ExcitSpins.begin(),NumExcitedStatesSpin,0); 46 47 48 49 ExcitEnergies[15] = 5.96*MeV; 50 ExcitEnergies[17] = 1.74*MeV; 51 ExcitEnergies[18] = 4.44*MeV; 52 ExcitEnergies[19] = 1.67*MeV; 53 ExcitEnergies[20] = 4.32*MeV; 54 ExcitEnergies[22] = 3.68*MeV; 55 ExcitEnergies[23] = 6.69*MeV; 56 ExcitEnergies[25] = 3.95*MeV; 57 ExcitEnergies[26] = 6.32*MeV; 58 ExcitEnergies[27] = 0.30*MeV; 59 ExcitEnergies[28] = 6.18*MeV; 60 ExcitEnergies[29] = 6.92*MeV; 61 ExcitEnergies[30] = 3.06*MeV; 62 ExcitEnergies[31] = 3.57*MeV; 63 64 65 ExcitSpins[15] = 8; 66 ExcitSpins[17] = 1; 67 ExcitSpins[18] = 6; 68 ExcitSpins[19] = 5; 69 ExcitSpins[20] = 6; 70 ExcitSpins[22] = 4; 71 ExcitSpins[23] = 8; 72 ExcitSpins[25] = 3; 73 ExcitSpins[26] = 4; 74 ExcitSpins[27] = 7; 75 ExcitSpins[28] = 4; 76 ExcitSpins[29] = 5; 77 ExcitSpins[30] = 2; 78 ExcitSpins[31] = 10; 79 80 SetExcitationEnergiesPtr(&ExcitEnergies); 81 SetExcitationSpinsPtr(&ExcitSpins); 82 37 G4EvaporationProbability(1,1,2,&theCoulombBarrier) // A,Z,Gamma,&theCoulombBarrier 38 { 39 83 40 } 84 41 … … 106 63 } 107 64 108 G4double G4ProtonEvaporationProbability::CCoeficient(const G4double aZ) const 65 G4double G4ProtonEvaporationProbability::CalcAlphaParam(const G4Fragment & fragment) 66 { return 1.0 + CCoeficient(static_cast<G4double>(fragment.GetZ()-GetZ()));} 67 68 G4double G4ProtonEvaporationProbability::CalcBetaParam(const G4Fragment & ) 69 { return 0.0; } 70 71 G4double G4ProtonEvaporationProbability::CCoeficient(const G4double aZ) 109 72 { 110 73 // Data comes from … … 126 89 127 90 } 91 92 /////////////////////////////////////////////////////////////////////////////////// 93 //J. M. Quesada (Dec 2007-June 2008): New inverse reaction cross sections 94 //OPT=0 Dostrovski's parameterization 95 //OPT=1,2 Chatterjee's paramaterization 96 //OPT=3,4 Kalbach's parameterization 97 // 98 G4double G4ProtonEvaporationProbability::CrossSection(const G4Fragment & fragment, const G4double K) 99 { 100 // G4cout<<" In G4ProtonEVaporationProbability OPTxs="<<OPTxs<<G4endl; 101 // G4cout<<" In G4ProtonEVaporationProbability useSICB="<<useSICB<<G4endl; 102 103 theA=GetA(); 104 theZ=GetZ(); 105 ResidualA=fragment.GetA()-theA; 106 ResidualZ=fragment.GetZ()-theZ; 107 108 ResidualAthrd=std::pow(ResidualA,0.33333); 109 FragmentA=fragment.GetA(); 110 FragmentAthrd=std::pow(FragmentA,0.33333); 111 U=fragment.GetExcitationEnergy(); 112 113 114 if (OPTxs==0) {std::ostringstream errOs; 115 errOs << "We should'n be here (OPT =0) at evaporation cross section calculation (protons)!!" <<G4endl; 116 throw G4HadronicException(__FILE__, __LINE__, errOs.str()); 117 return 0.;} 118 else if( OPTxs==1 ) return GetOpt1( K); 119 else if( OPTxs==2 ||OPTxs==4) return GetOpt2( K); 120 else if (OPTxs==3 ) return GetOpt3( K); 121 else{ 122 std::ostringstream errOs; 123 errOs << "BAD PROTON CROSS SECTION OPTION AT EVAPORATION!!" <<G4endl; 124 throw G4HadronicException(__FILE__, __LINE__, errOs.str()); 125 return 0.; 126 } 127 } 128 //********************* OPT=1 : Chatterjee's cross section ************************ 129 //(fitting to cross section from Bechetti & Greenles OM potential) 130 131 G4double G4ProtonEvaporationProbability::GetOpt1(const G4double K) 132 { 133 G4double Kc=K; 134 135 // JMQ xsec is set constat above limit of validity 136 if (K>50) Kc=50; 137 138 G4double landa, landa0, landa1, mu, mu0, mu1,nu, nu0, nu1, nu2,xs; 139 G4double p, p0, p1, p2,Ec,delta,q,r,ji; 140 141 p0 = 15.72; 142 p1 = 9.65; 143 p2 = -449.0; 144 landa0 = 0.00437; 145 landa1 = -16.58; 146 mu0 = 244.7; 147 mu1 = 0.503; 148 nu0 = 273.1; 149 nu1 = -182.4; 150 nu2 = -1.872; 151 delta=0.; 152 153 Ec = 1.44*theZ*ResidualZ/(1.5*ResidualAthrd+delta); 154 p = p0 + p1/Ec + p2/(Ec*Ec); 155 landa = landa0*ResidualA + landa1; 156 mu = mu0*std::pow(ResidualA,mu1); 157 nu = std::pow(ResidualA,mu1)*(nu0 + nu1*Ec + nu2*(Ec*Ec)); 158 q = landa - nu/(Ec*Ec) - 2*p*Ec; 159 r = mu + 2*nu/Ec + p*(Ec*Ec); 160 161 ji=std::max(Kc,Ec); 162 if(Kc < Ec) { xs = p*Kc*Kc + q*Kc + r;} 163 else {xs = p*(Kc - ji)*(Kc - ji) + landa*Kc + mu + nu*(2 - Kc/ji)/ji ;} 164 if (xs <0.0) {xs=0.0;} 165 166 return xs; 167 168 } 169 170 171 172 //************* OPT=2 : Wellisch's proton reaction cross section ************************ 173 174 G4double G4ProtonEvaporationProbability::GetOpt2(const G4double K) 175 { 176 177 G4double rnpro,rnneu,eekin,ekin,ff1,ff2,ff3,r0,fac,fac1,fac2,b0,xine_th(0); 178 179 //This is redundant when the Coulomb barrier is overimposed to all cross sections 180 //It should be kept when Coulomb barrier only imposed at OPTxs=2, this is why .. 181 182 if(!useSICB && K <= theCoulombBarrier.GetCoulombBarrier(G4lrint(ResidualA),G4lrint(ResidualZ),U)) return xine_th=0.0; 183 184 eekin=K; 185 rnpro=ResidualZ; 186 rnneu=ResidualA-ResidualZ; 187 ekin=eekin/1000; 188 189 r0=1.36*1.e-15; 190 fac=pi*r0*r0; 191 b0=2.247-0.915*(1.-1./ResidualAthrd); 192 fac1=b0*(1.-1./ResidualAthrd); 193 fac2=1.; 194 if(rnneu > 1.5) fac2=std::log(rnneu); 195 xine_th= 1.e+31*fac*fac2*(1.+ResidualAthrd-fac1); 196 xine_th=(1.-0.15*std::exp(-ekin))*xine_th/(1.00-0.0007*ResidualA); 197 ff1=0.70-0.0020*ResidualA ; 198 ff2=1.00+1/ResidualA; 199 ff3=0.8+18/ResidualA-0.002*ResidualA; 200 fac=1.-(1./(1.+std::exp(-8.*ff1*(std::log10(ekin)+1.37*ff2)))); 201 xine_th=xine_th*(1.+ff3*fac); 202 ff1=1.-1/ResidualA-0.001*ResidualA; 203 ff2=1.17-2.7/ResidualA-0.0014*ResidualA; 204 fac=-8.*ff1*(std::log10(ekin)+2.0*ff2); 205 fac=1./(1.+std::exp(fac)); 206 xine_th=xine_th*fac; 207 if (xine_th < 0.0){ 208 std::ostringstream errOs; 209 G4cout<<"WARNING: negative Wellisch cross section "<<G4endl; 210 errOs << "RESIDUAL: A=" << ResidualA << " Z=" << ResidualZ <<G4endl; 211 errOs <<" xsec("<<ekin<<" MeV) ="<<xine_th <<G4endl; 212 throw G4HadronicException(__FILE__, __LINE__, errOs.str()); 213 } 214 215 return xine_th; 216 217 } 218 219 220 // *********** OPT=3 : Kalbach's cross sections (from PRECO code)************* 221 G4double G4ProtonEvaporationProbability::GetOpt3(const G4double K) 222 { 223 // ** p from becchetti and greenlees (but modified with sub-barrier 224 // ** correction function and xp2 changed from -449) 225 // JMQ (june 2008) : refinement of proton cross section for light systems 226 // 227 G4double landa, landa0, landa1, mu, mu0, mu1,nu, nu0, nu1, nu2; 228 G4double p, p0, p1, p2; 229 p0 = 15.72; 230 p1 = 9.65; 231 p2 = -300.; 232 landa0 = 0.00437; 233 landa1 = -16.58; 234 mu0 = 244.7; 235 mu1 = 0.503; 236 nu0 = 273.1; 237 nu1 = -182.4; 238 nu2 = -1.872; 239 240 // parameters for proton cross section refinement 241 G4double afit,bfit,a2,b2; 242 afit=-0.0785656; 243 bfit=5.10789; 244 a2= -0.00089076; 245 b2= 0.0231597; 246 247 G4double ec,ecsq,xnulam,etest(0.),ra(0.),a,w,c,signor(1.),signor2,sig; 248 G4double b,ecut,cut,ecut2,geom,elab; 249 250 251 G4double flow = 1.e-18; 252 G4double spill= 1.e+18; 253 254 255 if (ResidualA <= 60.) signor = 0.92; 256 else if (ResidualA < 100.) signor = 0.8 + ResidualA*0.002; 257 258 259 ec = 1.44 * theZ * ResidualZ / (1.5*ResidualAthrd+ra); 260 ecsq = ec * ec; 261 p = p0 + p1/ec + p2/ecsq; 262 landa = landa0*ResidualA + landa1; 263 a = std::pow(ResidualA,mu1); 264 mu = mu0 * a; 265 nu = a* (nu0+nu1*ec+nu2*ecsq); 266 267 c =std::min(3.15,ec*0.5); 268 w = 0.7 * c / 3.15; 269 270 xnulam = nu / landa; 271 if (xnulam > spill) xnulam=0.; 272 if (xnulam >= flow) etest =std::sqrt(xnulam) + 7.; 273 274 a = -2.*p*ec + landa - nu/ecsq; 275 b = p*ecsq + mu + 2.*nu/ec; 276 ecut = 0.; 277 cut = a*a - 4.*p*b; 278 if (cut > 0.) ecut = std::sqrt(cut); 279 ecut = (ecut-a) / (p+p); 280 ecut2 = ecut; 281 if (cut < 0.) ecut2 = ecut - 2.; 282 elab = K * FragmentA / ResidualA; 283 sig = 0.; 284 if (elab <= ec) { //start for E<Ec 285 if (elab > ecut2) sig = (p*elab*elab+a*elab+b) * signor; 286 signor2 = (ec-elab-c) / w; 287 signor2 = 1. + std::exp(signor2); 288 sig = sig / signor2; 289 // signor2 is empirical global corr'n at low elab for protons in PRECO, not enough for light targets 290 // refinement for proton cross section 291 if (ResidualZ<=26) 292 sig = sig*std::exp(-(a2*ResidualZ + b2)*(elab-(afit*ResidualZ+bfit)*ec)*(elab-(afit*ResidualZ+bfit)*ec)); 293 } //end for E<Ec 294 else { //start for E>Ec 295 sig = (landa*elab+mu+nu/elab) * signor; 296 297 // refinement for proton cross section 298 if ( ResidualZ<=26 && elab <=(afit*ResidualZ+bfit)*ec) 299 sig = sig*std::exp(-(a2*ResidualZ + b2)*(elab-(afit*ResidualZ+bfit)*ec)*(elab-(afit*ResidualZ+bfit)*ec)); 300 301 // 302 geom = 0.; 303 304 if (xnulam < flow || elab < etest) 305 { 306 if (sig <0.0) {sig=0.0;} 307 return sig; 308 } 309 geom = std::sqrt(theA*K); 310 geom = 1.23*ResidualAthrd + ra + 4.573/geom; 311 geom = 31.416 * geom * geom; 312 sig = std::max(geom,sig); 313 314 } //end for E>Ec 315 return sig;} 316 317 318 319 // ************************** end of cross sections ******************************* 320
Note: See TracChangeset
for help on using the changeset viewer.