Changeset 962 for trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4EvaporationProbability.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/G4EvaporationProbability.cc
r819 r962 24 24 // ******************************************************************** 25 25 // 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: 29 27 // 30 28 // Hadronic Process: Nuclear De-excitations 31 29 // by V. Lara (Oct 1998) 32 30 // 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> 39 using namespace std; 34 40 35 41 #include "G4EvaporationProbability.hh" … … 63 69 return true; 64 70 } 65 71 66 72 G4double G4EvaporationProbability::EmissionProbability(const G4Fragment & fragment, const G4double anEnergy) 67 73 { 68 74 G4double EmissionProbability = 0.0; 69 75 G4double MaximalKineticEnergy = anEnergy; 76 70 77 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 87 80 } 88 81 return EmissionProbability; 89 82 } 90 83 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 87 G4double G4EvaporationProbability::CalculateProbability(const G4Fragment & fragment, const G4double MaximalKineticEnergy) 88 { 89 G4double ResidualA = fragment.GetA() - theA; 90 G4double ResidualZ = fragment.GetZ() - theZ; 97 91 G4double U = fragment.GetExcitationEnergy(); 92 93 if (OPTxs==0) { 94 98 95 99 96 G4double NuclearMass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetNucleusMass(theZ,theA); … … 107 104 (U-delta0)); 108 105 109 // compute the integrated probability of evaporation channel 106 110 107 G4double RN = 1.5*fermi; 111 108 … … 133 130 134 131 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 163 G4double G4EvaporationProbability:: 164 IntegrateEmissionProbability(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 213 G4double 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.