Ignore:
Timestamp:
Apr 6, 2009, 12:30:29 PM (15 years ago)
Author:
garnier
Message:

update processes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4ProtonEvaporationProbability.cc

    r819 r962  
    2424// ********************************************************************
    2525//
    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:
    2927//
    3028// 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
    3433
    3534#include "G4ProtonEvaporationProbability.hh"
    3635
    3736G4ProtonEvaporationProbability::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   
    8340}
    8441
     
    10663}
    10764
    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)
    10972{
    11073    // Data comes from
     
    12689       
    12790}
     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//
     98G4double 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
     131G4double 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
     174G4double 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)*************
     221G4double 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.