Changeset 1347 for trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4EvaporationProbability.cc
- Timestamp:
- Dec 22, 2010, 3:52:27 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/processes/hadronic/models/de_excitation/evaporation/src/G4EvaporationProbability.cc
r1315 r1347 44 44 #include "G4IonTable.hh" 45 45 46 47 G4EvaporationProbability::G4EvaporationProbability(const G4EvaporationProbability &) : G4VEmissionProbability() 46 G4EvaporationProbability::G4EvaporationProbability(G4int anA, G4int aZ, 47 G4double aGamma, 48 G4VCoulombBarrier * aCoulombBarrier) 49 : theA(anA), 50 theZ(aZ), 51 Gamma(aGamma), 52 theCoulombBarrierptr(aCoulombBarrier) 53 {} 54 55 G4EvaporationProbability::G4EvaporationProbability() 56 : theA(0), 57 theZ(0), 58 Gamma(0.0), 59 theCoulombBarrierptr(0) 60 {} 61 62 G4EvaporationProbability::~G4EvaporationProbability() 63 {} 64 65 G4double 66 G4EvaporationProbability::EmissionProbability(const G4Fragment & fragment, G4double anEnergy) 48 67 { 49 throw G4HadronicException(__FILE__, __LINE__, "G4EvaporationProbability::copy_constructor meant to not be accessable"); 50 } 51 52 53 54 55 const G4EvaporationProbability & G4EvaporationProbability:: 56 operator=(const G4EvaporationProbability &) 68 G4double EmissionProbability = 0.0; 69 G4double MaximalKineticEnergy = anEnergy; 70 71 if (MaximalKineticEnergy > 0.0 && fragment.GetExcitationEnergy() > 0.0) { 72 EmissionProbability = CalculateProbability(fragment, MaximalKineticEnergy); 73 74 } 75 return EmissionProbability; 76 } 77 78 //////////////////////////////////// 79 80 // Computes the integrated probability of evaporation channel 81 G4double 82 G4EvaporationProbability::CalculateProbability(const G4Fragment & fragment, 83 G4double MaximalKineticEnergy) 57 84 { 58 throw G4HadronicException(__FILE__, __LINE__, "G4EvaporationProbability::operator= meant to not be accessable"); 59 return *this; 60 } 61 62 63 G4bool G4EvaporationProbability::operator==(const G4EvaporationProbability &) const 64 { 65 return false; 66 } 67 68 G4bool G4EvaporationProbability::operator!=(const G4EvaporationProbability &) const 69 { 70 return true; 71 } 72 73 G4double G4EvaporationProbability::EmissionProbability(const G4Fragment & fragment, const G4double anEnergy) 74 { 75 G4double EmissionProbability = 0.0; 76 G4double MaximalKineticEnergy = anEnergy; 77 78 if (MaximalKineticEnergy > 0.0 && fragment.GetExcitationEnergy() > 0.0) { 79 EmissionProbability = CalculateProbability(fragment, MaximalKineticEnergy); 80 81 } 82 return EmissionProbability; 83 } 84 85 //////////////////////////////////// 86 87 // Computes the integrated probability of evaporation channel 88 G4double G4EvaporationProbability::CalculateProbability(const G4Fragment & fragment, const G4double MaximalKineticEnergy) 89 { 90 G4double ResidualA = fragment.GetA() - theA; 91 G4double ResidualZ = fragment.GetZ() - theZ; 92 G4double U = fragment.GetExcitationEnergy(); 85 G4int ResidualA = fragment.GetA_asInt() - theA; 86 G4int ResidualZ = fragment.GetZ_asInt() - theZ; 87 G4double U = fragment.GetExcitationEnergy(); 93 88 94 if (OPTxs==0) { 95 96 97 G4double NuclearMass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetNucleusMass(theZ,theA); 98 99 100 G4double delta0 = G4PairingCorrection::GetInstance()->GetPairingCorrection(static_cast<G4int>(fragment.GetA()), 101 static_cast<G4int>(fragment.GetZ())); 102 103 G4double SystemEntropy = 2.0*std::sqrt(theEvapLDPptr->LevelDensityParameter(static_cast<G4int>(fragment.GetA()), 104 static_cast<G4int>(fragment.GetZ()),U)* 105 (U-delta0)); 89 if (OPTxs==0) { 90 91 G4double NuclearMass = fragment.ComputeGroundStateMass(theZ,theA); 92 93 G4double delta0 = fPairCorr->GetPairingCorrection(fragment.GetA_asInt(), 94 fragment.GetZ_asInt()); 95 96 G4double SystemEntropy = 2.0*std::sqrt( 97 theEvapLDPptr->LevelDensityParameter(fragment.GetA_asInt(),fragment.GetZ_asInt(),U)* 98 (U-delta0)); 106 99 107 108 G4double RN = 1.5*fermi; 100 const G4double RN = 1.5*fermi; 109 101 110 102 G4double Alpha = CalcAlphaParam(fragment); … … 112 104 113 105 G4double Rmax = MaximalKineticEnergy; 114 G4double a = theEvapLDPptr->LevelDensityParameter(static_cast<G4int>(ResidualA), 115 static_cast<G4int>(ResidualZ), 116 Rmax); 117 G4double GlobalFactor = static_cast<G4double>(Gamma) * (Alpha/(a*a)) * 118 (NuclearMass*RN*RN*std::pow(ResidualA,2./3.))/ 119 (2.*pi* hbar_Planck*hbar_Planck); 106 G4double a = theEvapLDPptr->LevelDensityParameter(ResidualA,ResidualZ,Rmax); 107 G4double GlobalFactor = Gamma * Alpha/(a*a) * 108 (NuclearMass*RN*RN*fG4pow->Z23(ResidualA))/ 109 (twopi* hbar_Planck*hbar_Planck); 120 110 G4double Term1 = (2.0*Beta*a-3.0)/2.0 + Rmax*a; 121 111 G4double Term2 = (2.0*Beta*a-3.0)*std::sqrt(Rmax*a) + 2.0*a*Rmax; 122 112 123 113 G4double ExpTerm1 = 0.0; 124 if (SystemEntropy <= 600.0) ExpTerm1 = std::exp(-SystemEntropy);114 if (SystemEntropy <= 600.0) { ExpTerm1 = std::exp(-SystemEntropy); } 125 115 126 116 G4double ExpTerm2 = 2.*std::sqrt(a*Rmax) - SystemEntropy; 127 if (ExpTerm2 > 700.0) ExpTerm2 = 700.0;117 if (ExpTerm2 > 700.0) { ExpTerm2 = 700.0; } 128 118 ExpTerm2 = std::exp(ExpTerm2); 129 119 … … 134 124 } else if (OPTxs==1 || OPTxs==2 ||OPTxs==3 || OPTxs==4) { 135 125 136 G4double limit; 137 if (useSICB) limit=theCoulombBarrierptr->GetCoulombBarrier(G4lrint(ResidualA),G4lrint(ResidualZ),U); 138 else limit=0.; 139 140 if (MaximalKineticEnergy <= limit) return 0.0; 141 142 143 // if Coulomb barrier cutoff is superimposed for all cross sections the limit is the Coulomb Barrier 126 G4double EvaporatedMass = fragment.ComputeGroundStateMass(theZ,theA); 127 G4double ResidulalMass = fragment.ComputeGroundStateMass(ResidualZ,ResidualA); 128 G4double limit = std::max(0.0,fragment.GetGroundStateMass()-EvaporatedMass-ResidulalMass); 129 if (useSICB) { 130 limit = std::max(limit,theCoulombBarrierptr->GetCoulombBarrier(ResidualA,ResidualZ,U)); 131 } 132 133 if (MaximalKineticEnergy <= limit) { return 0.0; } 134 135 // if Coulomb barrier cutoff is superimposed for all cross sections 136 // then the limit is the Coulomb Barrier 144 137 G4double LowerLimit= limit; 145 138 146 // 139 //MaximalKineticEnergy: asimptotic value (already accounted for in G4EvaporationChannel) 147 140 148 141 G4double UpperLimit = MaximalKineticEnergy; 149 142 150 151 143 G4double Width = IntegrateEmissionProbability(fragment,LowerLimit,UpperLimit); 152 144 153 145 return Width; 154 } else {146 } else { 155 147 std::ostringstream errOs; 156 148 errOs << "Bad option for cross sections at evaporation" <<G4endl; … … 163 155 164 156 G4double G4EvaporationProbability:: 165 IntegrateEmissionProbability(const G4Fragment & fragment, const G4double & Low, const G4double & Up ) 157 IntegrateEmissionProbability(const G4Fragment & fragment, 158 const G4double & Low, const G4double & Up ) 166 159 { 167 168 160 static const G4int N = 10; 169 161 // 10-Points Gauss-Legendre abcisas and weights … … 212 204 //New method (OPT=1,2,3,4) 213 205 214 G4double G4EvaporationProbability::ProbabilityDistributionFunction( const G4Fragment & fragment, const G4double K) 206 G4double 207 G4EvaporationProbability::ProbabilityDistributionFunction( const G4Fragment & fragment, 208 G4double K) 215 209 { 216 210 G4int ResidualA = fragment.GetA_asInt() - theA; 211 G4int ResidualZ = fragment.GetZ_asInt() - theZ; 212 G4double U = fragment.GetExcitationEnergy(); 213 //G4cout << "### G4EvaporationProbability::ProbabilityDistributionFunction" << G4endl; 214 //G4cout << "FragZ= " << fragment.GetZ_asInt() << " FragA= " << fragment.GetA_asInt() 215 // << " Z= " << theZ << " A= " << theA << G4endl; 216 //G4cout << "PC " << fPairCorr << " DP " << theEvapLDPptr << G4endl; 217 218 // if(K <= theCoulombBarrierptr->GetCoulombBarrier(ResidualA,ResidualZ,U)) return 0.0; 219 220 G4double delta1 = fPairCorr->GetPairingCorrection(ResidualA,ResidualZ); 217 221 218 219 220 G4double ResidualA = fragment.GetA() - theA; 221 G4double ResidualZ = fragment.GetZ() - theZ; 222 G4double U = fragment.GetExcitationEnergy(); 223 224 // if(K <= theCoulombBarrierptr->GetCoulombBarrier(G4lrint(ResidualA),G4lrint(ResidualZ),U)) return 0.0; 225 226 G4double delta1 = G4PairingCorrection::GetInstance()->GetPairingCorrection(static_cast<G4int>(ResidualA),static_cast<G4int>(ResidualZ)); 227 228 229 G4double delta0 = G4PairingCorrection::GetInstance()->GetPairingCorrection(static_cast<G4int>(fragment.GetA()),static_cast<G4int>(fragment.GetZ())); 230 231 232 G4double ParticleMass = G4ParticleTable::GetParticleTable()->GetIonTable()->GetNucleusMass(theZ,theA); 233 234 G4double theSeparationEnergy= G4NucleiProperties::GetMassExcess(static_cast<G4int>(theA),static_cast<G4int>(theZ)) + 235 G4NucleiProperties::GetMassExcess(static_cast<G4int>(ResidualA),static_cast<G4int>(ResidualZ)) - 236 G4NucleiProperties::GetMassExcess(static_cast<G4int>(fragment.GetA()),static_cast<G4int>(fragment.GetZ())); 237 238 G4double a0 = theEvapLDPptr->LevelDensityParameter(static_cast<G4int>(fragment.GetA()),static_cast<G4int>(fragment.GetZ()),U - delta0); 239 240 G4double a1 = theEvapLDPptr->LevelDensityParameter(static_cast<G4int>(ResidualA),static_cast<G4int>(ResidualZ),U - theSeparationEnergy - delta1); 241 242 243 G4double E0=U-delta0; 244 245 G4double E1=U-theSeparationEnergy-delta1-K; 246 247 if (E1<0.) return 0.; 222 G4double delta0 = fPairCorr->GetPairingCorrection(fragment.GetA_asInt(), 223 fragment.GetZ_asInt()); 224 225 226 G4double ParticleMass = fragment.ComputeGroundStateMass(theZ,theA); 227 G4double ResidualMass = fragment.ComputeGroundStateMass(ResidualZ,ResidualA); 228 229 G4double theSeparationEnergy = ParticleMass + ResidualMass 230 - fragment.GetGroundStateMass(); 231 232 G4double a0 = theEvapLDPptr->LevelDensityParameter(fragment.GetA_asInt(), 233 fragment.GetZ_asInt(), 234 U - delta0); 235 236 G4double a1 = theEvapLDPptr->LevelDensityParameter(ResidualA, ResidualZ, 237 U - theSeparationEnergy - delta1); 238 239 240 G4double E0 = U - delta0; 241 242 G4double E1 = U - theSeparationEnergy - delta1 - K; 243 244 if (E1<0.) { return 0.; } 248 245 249 246 //JMQ 14/02/09 BUG fixed: hbarc should be in the denominator instead of hbar_Planck 250 247 //Without 1/hbar_Panck remains as a width 251 // G4double Prob=Gamma*ParticleMass/((pi*hbar_Planck)*(pi*hbar_Planck)*252 //std::exp(2*std::sqrt(a0*E0)))*K*CrossSection(fragment,K)*std::exp(2*std::sqrt(a1*E1))*millibarn;253 248 254 249 G4double Prob=Gamma*ParticleMass/((pi*hbarc)*(pi*hbarc)*std::exp(2*std::sqrt(a0*E0)))
Note: See TracChangeset
for help on using the changeset viewer.