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/G4EvaporationProbability.cc

    r819 r962  
    2424// ********************************************************************
    2525//
    26 //
    27 // $Id: G4EvaporationProbability.cc,v 1.5 2006/06/29 20:10:31 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
    3129// by V. Lara (Oct 1998)
    3230//
    33 
     31// Modif (03 September 2008) by J. M. Quesada for external choice of inverse
     32// cross section option
     33// JMQ (06 September 2008) Also external choices have been added for
     34// superimposed Coulomb barrier (if useSICB is set true, by default is false)
     35//
     36// JMQ (14 february 2009) bug fixed in emission width: hbarc instead of hbar_Planck in the denominator
     37//
     38#include <iostream>
     39using namespace std;
    3440
    3541#include "G4EvaporationProbability.hh"
     
    6369    return true;
    6470}
    65 
     71 
    6672G4double G4EvaporationProbability::EmissionProbability(const G4Fragment & fragment, const G4double anEnergy)
    6773{
    6874    G4double EmissionProbability = 0.0;
    6975    G4double MaximalKineticEnergy = anEnergy;
     76
    7077    if (MaximalKineticEnergy > 0.0 && fragment.GetExcitationEnergy() > 0.0) {
    71         EmissionProbability = CalcProbability(fragment,MaximalKineticEnergy);
    72         //              // Next there is a loop over excited states for this channel summing probabilities
    73         //              G4double SavedGamma = Gamma;
    74         //              for (G4int i = 0; i < ExcitationEnergies->length(); i++) {
    75         //                      if (ExcitationSpins->operator()(i) < 0.1) continue;
    76         //                      Gamma = ExcitationSpins->operator()(i)*A; // A is the channel mass number
    77         //                      // substract excitation energies
    78         //                      MaximalKineticEnergy -= ExcitationEnergies->operator()(i);
    79         //                      // update probability
    80         //                      EmissionProbability += CalcProbability(fragment,MaximalKineticEnergy);
    81         //                              EmissionProbability += tmp;
    82         //                      }
    83         //              // restore Gamma and MaximalKineticEnergy
    84         //              MaximalKineticEnergy = SavedMaximalKineticEnergy;
    85         //              Gamma = SavedGamma;
    86         //              }
     78        EmissionProbability = CalculateProbability(fragment, MaximalKineticEnergy);
     79
    8780    }
    8881    return EmissionProbability;
    8982}
    9083
    91 G4double G4EvaporationProbability::CalcProbability(const G4Fragment & fragment,
    92                                                    const G4double MaximalKineticEnergy)
    93     // Calculate integrated probability (width) for rvaporation channel
    94 {       
    95     G4double ResidualA = static_cast<G4double>(fragment.GetA() - theA);
    96     G4double ResidualZ = static_cast<G4double>(fragment.GetZ() - theZ);
     84////////////////////////////////////
     85
     86// Computes the integrated probability of evaporation channel
     87G4double G4EvaporationProbability::CalculateProbability(const G4Fragment & fragment, const G4double MaximalKineticEnergy)
     88{
     89    G4double ResidualA = fragment.GetA() - theA;
     90    G4double ResidualZ = fragment.GetZ() - theZ;
    9791    G4double U = fragment.GetExcitationEnergy();
     92   
     93 if (OPTxs==0) {
     94
    9895       
    9996    G4double NuclearMass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetNucleusMass(theZ,theA);
     
    107104                                      (U-delta0));
    108105                                                                 
    109     // compute the integrated probability of evaporation channel
     106
    110107    G4double RN = 1.5*fermi;
    111108
     
    133130       
    134131    return Width;
    135 }
    136 
    137 
    138 
    139 
     132             
     133 } else if (OPTxs==1 || OPTxs==2 ||OPTxs==3 || OPTxs==4) {
     134
     135   G4double limit;
     136   if (useSICB) limit=theCoulombBarrierptr->GetCoulombBarrier(G4lrint(ResidualA),G4lrint(ResidualZ),U);
     137   else limit=0.;
     138
     139   if (MaximalKineticEnergy <= limit)  return 0.0;
     140
     141
     142   // if Coulomb barrier cutoff is superimposed for all cross sections the limit is the Coulomb Barrier
     143   G4double LowerLimit= limit;
     144
     145   //  MaximalKineticEnergy: asimptotic value (already accounted for in G4EvaporationChannel)     
     146
     147   G4double UpperLimit = MaximalKineticEnergy;
     148
     149
     150   G4double Width = IntegrateEmissionProbability(fragment,LowerLimit,UpperLimit);
     151
     152   return Width;
     153 } else{
     154   std::ostringstream errOs;
     155   errOs << "Bad option for cross sections at evaporation"  <<G4endl;
     156   throw G4HadronicException(__FILE__, __LINE__, errOs.str());
     157 }
     158 
     159}
     160
     161/////////////////////////////////////////////////////////////////////
     162
     163G4double G4EvaporationProbability::
     164IntegrateEmissionProbability(const G4Fragment & fragment, const G4double & Low, const G4double & Up )
     165{
     166
     167  static const G4int N = 10;
     168  // 10-Points Gauss-Legendre abcisas and weights
     169  static const G4double w[N] = {
     170    0.0666713443086881,
     171    0.149451349150581,
     172    0.219086362515982,
     173    0.269266719309996,
     174    0.295524224714753,
     175    0.295524224714753,
     176    0.269266719309996,
     177    0.219086362515982,
     178    0.149451349150581,
     179    0.0666713443086881
     180  };
     181  static const G4double x[N] = {
     182    -0.973906528517172,
     183    -0.865063366688985,
     184    -0.679409568299024,
     185    -0.433395394129247,
     186    -0.148874338981631,
     187    0.148874338981631,
     188    0.433395394129247,
     189    0.679409568299024,
     190    0.865063366688985,
     191    0.973906528517172
     192  };
     193
     194  G4double Total = 0.0;
     195
     196
     197  for (G4int i = 0; i < N; i++)
     198    {
     199
     200      G4double KineticE = ((Up-Low)*x[i]+(Up+Low))/2.0;
     201
     202      Total += w[i]*ProbabilityDistributionFunction(fragment, KineticE);
     203
     204    }
     205  Total *= (Up-Low)/2.0;
     206  return Total;
     207}
     208
     209
     210/////////////////////////////////////////////////////////
     211//New method (OPT=1,2,3,4)
     212
     213G4double G4EvaporationProbability::ProbabilityDistributionFunction( const G4Fragment & fragment, const G4double K)
     214{
     215
     216 
     217
     218
     219  G4double ResidualA = fragment.GetA() - theA;
     220  G4double ResidualZ = fragment.GetZ() - theZ; 
     221  G4double U = fragment.GetExcitationEnergy();
     222
     223  //        if(K <= theCoulombBarrierptr->GetCoulombBarrier(G4lrint(ResidualA),G4lrint(ResidualZ),U)) return 0.0;   
     224
     225  G4double delta1 = G4PairingCorrection::GetInstance()->GetPairingCorrection(static_cast<G4int>(ResidualA),static_cast<G4int>(ResidualZ));
     226
     227 
     228  G4double delta0 = G4PairingCorrection::GetInstance()->GetPairingCorrection(static_cast<G4int>(fragment.GetA()),static_cast<G4int>(fragment.GetZ()));
     229
     230 
     231  G4double ParticleMass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetNucleusMass(theZ,theA);
     232
     233  G4double theSeparationEnergy= G4NucleiProperties::GetMassExcess(static_cast<G4int>(theA),static_cast<G4int>(theZ)) +
     234    G4NucleiProperties::GetMassExcess(static_cast<G4int>(ResidualA),static_cast<G4int>(ResidualZ)) -
     235    G4NucleiProperties::GetMassExcess(static_cast<G4int>(fragment.GetA()),static_cast<G4int>(fragment.GetZ()));
     236
     237  G4double a0 = theEvapLDPptr->LevelDensityParameter(static_cast<G4int>(fragment.GetA()),static_cast<G4int>(fragment.GetZ()),U - delta0);
     238
     239  G4double a1 = theEvapLDPptr->LevelDensityParameter(static_cast<G4int>(ResidualA),static_cast<G4int>(ResidualZ),U - theSeparationEnergy - delta1);
     240 
     241 
     242  G4double E0=U-delta0;
     243
     244  G4double E1=U-theSeparationEnergy-delta1-K;
     245
     246  if (E1<0.) return 0.;
     247
     248  //JMQ 14/02/09 BUG fixed: hbarc should be in the denominator instead of hbar_Planck
     249  //Without 1/hbar_Panck remains as a width
     250  //  G4double  Prob=Gamma*ParticleMass/((pi*hbar_Planck)*(pi*hbar_Planck)*
     251  //std::exp(2*std::sqrt(a0*E0)))*K*CrossSection(fragment,K)*std::exp(2*std::sqrt(a1*E1))*millibarn;
     252
     253  G4double Prob=Gamma*ParticleMass/((pi*hbarc)*(pi*hbarc)*std::exp(2*std::sqrt(a0*E0)))
     254    *K*CrossSection(fragment,K)*std::exp(2*std::sqrt(a1*E1))*millibarn;
     255
     256  return Prob;
     257}
     258
     259
Note: See TracChangeset for help on using the changeset viewer.