- Timestamp:
- Dec 22, 2010, 3:52:27 PM (14 years ago)
- Location:
- trunk/source/processes/hadronic/models/de_excitation/fission/src
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/processes/hadronic/models/de_excitation/fission/src/G4CompetitiveFission.cc
r1340 r1347 25 25 // 26 26 // 27 // $Id: G4CompetitiveFission.cc,v 1.1 2 2010/05/03 16:49:19vnivanch Exp $28 // GEANT4 tag $Name: geant4-09-0 3-ref-09$27 // $Id: G4CompetitiveFission.cc,v 1.14 2010/11/17 20:22:46 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-ref-00 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 39 39 #include "G4PairingCorrection.hh" 40 40 #include "G4ParticleMomentum.hh" 41 #include "G4Pow.hh" 41 42 42 43 G4CompetitiveFission::G4CompetitiveFission() : G4VEvaporationChannel("fission") … … 57 58 } 58 59 59 G4CompetitiveFission::G4CompetitiveFission(const G4CompetitiveFission &) : G4VEvaporationChannel()60 {61 }62 63 60 G4CompetitiveFission::~G4CompetitiveFission() 64 61 { … … 70 67 } 71 68 72 const G4CompetitiveFission & G4CompetitiveFission::operator=(const G4CompetitiveFission &)73 {74 throw G4HadronicException(__FILE__, __LINE__, "G4CompetitiveFission::operator= meant to not be accessable");75 return *this;76 }77 78 G4bool G4CompetitiveFission::operator==(const G4CompetitiveFission &right) const79 {80 return (this == (G4CompetitiveFission *) &right);81 }82 83 G4bool G4CompetitiveFission::operator!=(const G4CompetitiveFission &right) const84 {85 return (this != (G4CompetitiveFission *) &right);86 }87 88 89 90 91 69 void G4CompetitiveFission::Initialize(const G4Fragment & fragment) 92 70 { 93 G4int anA = static_cast<G4int>(fragment.GetA()); 94 G4int aZ = static_cast<G4int>(fragment.GetZ()); 95 G4double ExEnergy = fragment.GetExcitationEnergy() - 96 G4PairingCorrection::GetInstance()->GetFissionPairingCorrection(anA,aZ); 97 98 99 // Saddle point excitation energy ---> A = 65 100 // Fission is excluded for A < 65 101 if (anA >= 65 && ExEnergy > 0.0) { 102 FissionBarrier = theFissionBarrierPtr->FissionBarrier(anA,aZ,ExEnergy); 103 MaximalKineticEnergy = ExEnergy - FissionBarrier; 104 LevelDensityParameter = theLevelDensityPtr->LevelDensityParameter(anA,aZ,ExEnergy); 105 FissionProbability = theFissionProbabilityPtr->EmissionProbability(fragment,MaximalKineticEnergy); 106 } 107 else { 108 MaximalKineticEnergy = -1000.0*MeV; 109 LevelDensityParameter = 0.0; 110 FissionProbability = 0.0; 111 } 112 113 return; 114 } 115 116 71 G4int anA = fragment.GetA_asInt(); 72 G4int aZ = fragment.GetZ_asInt(); 73 G4double ExEnergy = fragment.GetExcitationEnergy() - 74 G4PairingCorrection::GetInstance()->GetFissionPairingCorrection(anA,aZ); 75 76 77 // Saddle point excitation energy ---> A = 65 78 // Fission is excluded for A < 65 79 if (anA >= 65 && ExEnergy > 0.0) { 80 FissionBarrier = theFissionBarrierPtr->FissionBarrier(anA,aZ,ExEnergy); 81 MaximalKineticEnergy = ExEnergy - FissionBarrier; 82 LevelDensityParameter = 83 theLevelDensityPtr->LevelDensityParameter(anA,aZ,ExEnergy); 84 FissionProbability = 85 theFissionProbabilityPtr->EmissionProbability(fragment,MaximalKineticEnergy); 86 } 87 else { 88 MaximalKineticEnergy = -1000.0*MeV; 89 LevelDensityParameter = 0.0; 90 FissionProbability = 0.0; 91 } 92 } 117 93 118 94 G4FragmentVector * G4CompetitiveFission::BreakUp(const G4Fragment & theNucleus) 119 95 { 120 // Nucleus data 121 // Atomic number of nucleus 122 G4int A = static_cast<G4int>(theNucleus.GetA()); 123 // Charge of nucleus 124 G4int Z = static_cast<G4int>(theNucleus.GetZ()); 125 // Excitation energy (in MeV) 126 G4double U = theNucleus.GetExcitationEnergy() - 127 G4PairingCorrection::GetInstance()->GetFissionPairingCorrection(A,Z); 128 // Check that U > 0 129 if (U <= 0.0) { 130 G4FragmentVector * theResult = new G4FragmentVector; 131 theResult->push_back(new G4Fragment(theNucleus)); 132 return theResult; 133 } 134 135 136 // Atomic Mass of Nucleus (in MeV) 137 G4double M = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(Z,A); 138 139 // Nucleus Momentum 140 G4LorentzVector theNucleusMomentum = theNucleus.GetMomentum(); 141 142 // Calculate fission parameters 143 G4FissionParameters theParameters(A,Z,U,FissionBarrier); 144 145 // First fragment 146 G4int A1 = 0; 147 G4int Z1 = 0; 148 G4double M1 = 0.0; 149 150 // Second fragment 151 G4int A2 = 0; 152 G4int Z2 = 0; 153 G4double M2 = 0.0; 154 155 G4double FragmentsExcitationEnergy = 0.0; 156 G4double FragmentsKineticEnergy = 0.0; 157 158 //JMQ 04/03/09 It will be used latter to fix the bug in energy conservation 159 G4double FissionPairingEnergy=G4PairingCorrection::GetInstance()->GetFissionPairingCorrection(A,Z); 160 161 G4int Trials = 0; 162 do { 163 164 // First fragment 165 A1 = FissionAtomicNumber(A,theParameters); 166 Z1 = FissionCharge(A,Z,A1); 167 M1 = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(Z1,A1); 168 169 170 // Second Fragment 171 A2 = A - A1; 172 Z2 = Z - Z1; 173 if (A2 < 1 || Z2 < 0) 174 throw G4HadronicException(__FILE__, __LINE__, "G4CompetitiveFission::BreakUp: Can't define second fragment! "); 175 176 M2 = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(Z2,A2); 177 178 // Check that fragment masses are less or equal than total energy 179 if (M1 + M2 > theNucleusMomentum.e()) 180 throw G4HadronicException(__FILE__, __LINE__, "G4CompetitiveFission::BreakUp: Fragments Mass > Total Energy"); 181 182 // Maximal Kinetic Energy (available energy for fragments) 183 G4double Tmax = M + U - M1 - M2; 184 185 FragmentsKineticEnergy = FissionKineticEnergy( A , Z, 186 A1, Z1, 187 A2, Z2, 188 U , Tmax, 189 theParameters); 96 // Nucleus data 97 // Atomic number of nucleus 98 G4int A = theNucleus.GetA_asInt(); 99 // Charge of nucleus 100 G4int Z = theNucleus.GetZ_asInt(); 101 // Excitation energy (in MeV) 102 G4double U = theNucleus.GetExcitationEnergy() - 103 G4PairingCorrection::GetInstance()->GetFissionPairingCorrection(A,Z); 104 // Check that U > 0 105 if (U <= 0.0) { 106 G4FragmentVector * theResult = new G4FragmentVector; 107 theResult->push_back(new G4Fragment(theNucleus)); 108 return theResult; 109 } 110 111 // Atomic Mass of Nucleus (in MeV) 112 G4double M = theNucleus.GetGroundStateMass(); 113 114 // Nucleus Momentum 115 G4LorentzVector theNucleusMomentum = theNucleus.GetMomentum(); 116 117 // Calculate fission parameters 118 G4FissionParameters theParameters(A,Z,U,FissionBarrier); 119 120 // First fragment 121 G4int A1 = 0; 122 G4int Z1 = 0; 123 G4double M1 = 0.0; 124 125 // Second fragment 126 G4int A2 = 0; 127 G4int Z2 = 0; 128 G4double M2 = 0.0; 129 130 G4double FragmentsExcitationEnergy = 0.0; 131 G4double FragmentsKineticEnergy = 0.0; 132 133 //JMQ 04/03/09 It will be used latter to fix the bug in energy conservation 134 G4double FissionPairingEnergy= 135 G4PairingCorrection::GetInstance()->GetFissionPairingCorrection(A,Z); 136 137 G4int Trials = 0; 138 do { 139 140 // First fragment 141 A1 = FissionAtomicNumber(A,theParameters); 142 Z1 = FissionCharge(A,Z,A1); 143 M1 = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(Z1,A1); 144 145 // Second Fragment 146 A2 = A - A1; 147 Z2 = Z - Z1; 148 if (A2 < 1 || Z2 < 0) { 149 throw G4HadronicException(__FILE__, __LINE__, 150 "G4CompetitiveFission::BreakUp: Can't define second fragment! "); 151 } 152 M2 = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass(Z2,A2); 153 154 // Check that fragment masses are less or equal than total energy 155 if (M1 + M2 > theNucleusMomentum.e()) { 156 throw G4HadronicException(__FILE__, __LINE__, 157 "G4CompetitiveFission::BreakUp: Fragments Mass > Total Energy"); 158 } 159 // Maximal Kinetic Energy (available energy for fragments) 160 G4double Tmax = M + U - M1 - M2; 161 162 FragmentsKineticEnergy = FissionKineticEnergy( A , Z, 163 A1, Z1, 164 A2, Z2, 165 U , Tmax, 166 theParameters); 190 167 191 // Excitation Energy 192 // FragmentsExcitationEnergy = Tmax - FragmentsKineticEnergy; 193 // JMQ 04/03/09 BUG FIXED: in order to fulfill energy conservation the 194 // fragments carry the fission pairing energy in form of 195 //excitation energy 196 197 FragmentsExcitationEnergy = Tmax - FragmentsKineticEnergy+FissionPairingEnergy; 198 199 } while (FragmentsExcitationEnergy < 0.0 && Trials++ < 100); 168 // Excitation Energy 169 // FragmentsExcitationEnergy = Tmax - FragmentsKineticEnergy; 170 // JMQ 04/03/09 BUG FIXED: in order to fulfill energy conservation the 171 // fragments carry the fission pairing energy in form of 172 //excitation energy 173 174 FragmentsExcitationEnergy = 175 Tmax - FragmentsKineticEnergy+FissionPairingEnergy; 176 177 } while (FragmentsExcitationEnergy < 0.0 && Trials++ < 100); 200 178 201 202 203 if (FragmentsExcitationEnergy <= 0.0) 204 throw G4HadronicException(__FILE__, __LINE__, "G4CompetitiveFission::BreakItUp: Excitation energy for fragments < 0.0!"); 205 206 207 // while (FragmentsExcitationEnergy < 0 && Trials < 100); 208 209 // Fragment 1 210 G4double U1 = FragmentsExcitationEnergy * (static_cast<G4double>(A1)/static_cast<G4double>(A)); 179 if (FragmentsExcitationEnergy <= 0.0) { 180 throw G4HadronicException(__FILE__, __LINE__, 181 "G4CompetitiveFission::BreakItUp: Excitation energy for fragments < 0.0!"); 182 } 183 184 // while (FragmentsExcitationEnergy < 0 && Trials < 100); 185 186 // Fragment 1 187 G4double U1 = FragmentsExcitationEnergy * A1/static_cast<G4double>(A); 211 188 // Fragment 2 212 G4double U2 = FragmentsExcitationEnergy * (static_cast<G4double>(A2)/static_cast<G4double>(A)); 213 214 215 //JMQ 04/03/09 Full relativistic calculation is performed 216 // 217 G4double Fragment1KineticEnergy=(FragmentsKineticEnergy*(FragmentsKineticEnergy+2*(M2+U2)))/(2*(M1+U1+M2+U2+FragmentsKineticEnergy)); 218 G4ParticleMomentum Momentum1(IsotropicVector(std::sqrt(Fragment1KineticEnergy*(Fragment1KineticEnergy+2*(M1+U1))))); 219 G4ParticleMomentum Momentum2(-Momentum1); 220 G4LorentzVector FourMomentum1(Momentum1,std::sqrt(Momentum1.mag2()+(M1+U1)*(M1+U1))); 221 G4LorentzVector FourMomentum2(Momentum2,std::sqrt(Momentum2.mag2()+(M2+U2)*(M2+U2))); 222 223 //JMQ 04/03/09 now we do Lorentz boosts (instead of Galileo boosts) 224 FourMomentum1.boost(theNucleusMomentum.boostVector()); 225 FourMomentum2.boost(theNucleusMomentum.boostVector()); 189 G4double U2 = FragmentsExcitationEnergy * A2/static_cast<G4double>(A); 190 191 //JMQ 04/03/09 Full relativistic calculation is performed 192 // 193 G4double Fragment1KineticEnergy= 194 (FragmentsKineticEnergy*(FragmentsKineticEnergy+2*(M2+U2))) 195 /(2*(M1+U1+M2+U2+FragmentsKineticEnergy)); 196 G4ParticleMomentum Momentum1(IsotropicVector(std::sqrt(Fragment1KineticEnergy*(Fragment1KineticEnergy+2*(M1+U1))))); 197 G4ParticleMomentum Momentum2(-Momentum1); 198 G4LorentzVector FourMomentum1(Momentum1,std::sqrt(Momentum1.mag2()+(M1+U1)*(M1+U1))); 199 G4LorentzVector FourMomentum2(Momentum2,std::sqrt(Momentum2.mag2()+(M2+U2)*(M2+U2))); 200 201 //JMQ 04/03/09 now we do Lorentz boosts (instead of Galileo boosts) 202 FourMomentum1.boost(theNucleusMomentum.boostVector()); 203 FourMomentum2.boost(theNucleusMomentum.boostVector()); 226 204 227 //////////JMQ 04/03: Old version calculation is commented 228 // There was vioation of energy momentum conservation 229 230 // G4double Pmax = std::sqrt( 2 * ( ( (M1+U1)*(M2+U2) ) / 231 // ( (M1+U1)+(M2+U2) ) ) * FragmentsKineticEnergy); 232 233 //G4ParticleMomentum momentum1 = IsotropicVector( Pmax ); 234 // G4ParticleMomentum momentum2( -momentum1 ); 235 236 // Perform a Galileo boost for fragments 237 // momentum1 += (theNucleusMomentum.boostVector() * (M1+U1)); 238 // momentum2 += (theNucleusMomentum.boostVector() * (M2+U2)); 239 240 241 // Create 4-momentum for first fragment 242 // Warning!! Energy conservation is broken 243 //JMQ 04/03/09 ...NOT ANY MORE!! BUGS FIXED: Energy and momentum are NOW conserved 244 // G4LorentzVector FourMomentum1( momentum1 , std::sqrt(momentum1.mag2() + (M1+U1)*(M1+U1))); 245 246 // Create 4-momentum for second fragment 247 // Warning!! Energy conservation is broken 248 //JMQ 04/03/09 ...NOT ANY MORE!! BUGS FIXED: Energy and momentum are NOW conserved 249 // G4LorentzVector FourMomentum2( momentum2 , std::sqrt(momentum2.mag2() + (M2+U2)*(M2+U2))); 250 251 ////////// 252 253 // Create Fragments 254 G4Fragment * Fragment1 = new G4Fragment( A1, Z1, FourMomentum1); 255 if (!Fragment1) throw G4HadronicException(__FILE__, __LINE__, "G4CompetitiveFission::BreakItUp: Can't create Fragment1! "); 256 G4Fragment * Fragment2 = new G4Fragment( A2, Z2, FourMomentum2); 257 if (!Fragment2) throw G4HadronicException(__FILE__, __LINE__, "G4CompetitiveFission::BreakItUp: Can't create Fragment2! "); 258 259 #ifdef PRECOMPOUND_TEST 260 Fragment1->SetCreatorModel(G4String("G4CompetitiveFission")); 261 Fragment2->SetCreatorModel(G4String("G4CompetitiveFission")); 205 //////////JMQ 04/03: Old version calculation is commented 206 // There was vioation of energy momentum conservation 207 208 // G4double Pmax = std::sqrt( 2 * ( ( (M1+U1)*(M2+U2) ) / 209 // ( (M1+U1)+(M2+U2) ) ) * FragmentsKineticEnergy); 210 211 //G4ParticleMomentum momentum1 = IsotropicVector( Pmax ); 212 // G4ParticleMomentum momentum2( -momentum1 ); 213 214 // Perform a Galileo boost for fragments 215 // momentum1 += (theNucleusMomentum.boostVector() * (M1+U1)); 216 // momentum2 += (theNucleusMomentum.boostVector() * (M2+U2)); 217 218 219 // Create 4-momentum for first fragment 220 // Warning!! Energy conservation is broken 221 //JMQ 04/03/09 ...NOT ANY MORE!! BUGS FIXED: Energy and momentum are NOW conserved 222 // G4LorentzVector FourMomentum1( momentum1 , std::sqrt(momentum1.mag2() + (M1+U1)*(M1+U1))); 223 224 // Create 4-momentum for second fragment 225 // Warning!! Energy conservation is broken 226 //JMQ 04/03/09 ...NOT ANY MORE!! BUGS FIXED: Energy and momentum are NOW conserved 227 // G4LorentzVector FourMomentum2( momentum2 , std::sqrt(momentum2.mag2() + (M2+U2)*(M2+U2))); 228 229 ////////// 230 231 // Create Fragments 232 G4Fragment * Fragment1 = new G4Fragment( A1, Z1, FourMomentum1); 233 G4Fragment * Fragment2 = new G4Fragment( A2, Z2, FourMomentum2); 234 235 // Create Fragment Vector 236 G4FragmentVector * theResult = new G4FragmentVector; 237 238 theResult->push_back(Fragment1); 239 theResult->push_back(Fragment2); 240 241 #ifdef debug 242 CheckConservation(theNucleus,theResult); 262 243 #endif 263 // Create Fragment Vector 264 G4FragmentVector * theResult = new G4FragmentVector; 265 266 theResult->push_back(Fragment1); 267 theResult->push_back(Fragment2); 268 269 #ifdef debug 270 CheckConservation(theNucleus,theResult); 271 #endif 272 273 return theResult; 274 } 275 276 277 278 G4int G4CompetitiveFission::FissionAtomicNumber(const G4int A, const G4FissionParameters & theParam) 279 // Calculates the atomic number of a fission product 280 { 281 282 // For Simplicity reading code 283 const G4double A1 = theParam.GetA1(); 284 const G4double A2 = theParam.GetA2(); 285 const G4double As = theParam.GetAs(); 286 // const G4double Sigma1 = theParam.GetSigma1(); 287 const G4double Sigma2 = theParam.GetSigma2(); 288 const G4double SigmaS = theParam.GetSigmaS(); 289 const G4double w = theParam.GetW(); 290 291 292 // G4double FasymAsym = 2.0*std::exp(-((A2-As)*(A2-As))/(2.0*Sigma2*Sigma2)) + 293 // std::exp(-((A1-As)*(A1-As))/(2.0*Sigma1*Sigma1)); 294 295 // G4double FsymA1A2 = std::exp(-((As-(A1+A2))*(As-(A1+A2)))/(2.0*SigmaS*SigmaS)); 296 297 298 G4double C2A = A2 + 3.72*Sigma2; 299 G4double C2S = As + 3.72*SigmaS; 300 301 G4double C2 = 0.0; 302 if (w > 1000.0 ) C2 = C2S; 303 else if (w < 0.001) C2 = C2A; 304 else C2 = std::max(C2A,C2S); 305 306 G4double C1 = A-C2; 307 if (C1 < 30.0) { 308 C2 = A-30.0; 309 C1 = 30.0; 310 } 311 312 G4double Am1 = (As + A1)/2.0; 313 G4double Am2 = (A1 + A2)/2.0; 314 315 // Get Mass distributions as sum of symmetric and asymmetric Gasussians 316 G4double Mass1 = MassDistribution(As,A,theParam); 317 G4double Mass2 = MassDistribution(Am1,A,theParam); 318 G4double Mass3 = MassDistribution(A1,A,theParam); 319 G4double Mass4 = MassDistribution(Am2,A,theParam); 320 G4double Mass5 = MassDistribution(A2,A,theParam); 321 // get maximal value among Mass1,...,Mass5 322 G4double MassMax = Mass1; 323 if (Mass2 > MassMax) MassMax = Mass2; 324 if (Mass3 > MassMax) MassMax = Mass3; 325 if (Mass4 > MassMax) MassMax = Mass4; 326 if (Mass5 > MassMax) MassMax = Mass5; 327 328 // Sample a fragment mass number, which lies between C1 and C2 329 G4double m; 330 G4double Pm; 331 do { 332 m = C1+G4UniformRand()*(C2-C1); 333 Pm = MassDistribution(m,A,theParam); 334 } while (G4UniformRand() > Pm/MassMax); 335 336 return static_cast<G4int>(m+0.5); 337 } 338 339 340 341 342 343 344 G4double G4CompetitiveFission::MassDistribution(const G4double x, const G4double A, 345 const G4FissionParameters & theParam) 346 // This method gives mass distribution F(x) = F_{asym}(x)+w*F_{sym}(x) 347 // which consist of symmetric and asymmetric sum of gaussians components. 348 { 349 G4double Xsym = std::exp(-0.5*(x-theParam.GetAs())*(x-theParam.GetAs())/ 350 (theParam.GetSigmaS()*theParam.GetSigmaS())); 351 352 G4double Xasym = std::exp(-0.5*(x-theParam.GetA2())*(x-theParam.GetA2())/ 353 (theParam.GetSigma2()*theParam.GetSigma2())) + 354 std::exp(-0.5*(x-(A-theParam.GetA2()))*(x-(A-theParam.GetA2()))/ 355 (theParam.GetSigma2()*theParam.GetSigma2())) + 356 0.5*std::exp(-0.5*(x-theParam.GetA1())*(x-theParam.GetA1())/ 357 (theParam.GetSigma1()*theParam.GetSigma1())) + 358 0.5*std::exp(-0.5*(x-(A-theParam.GetA1()))*(x-(A-theParam.GetA1()))/ 359 (theParam.GetSigma1()*theParam.GetSigma1())); 360 361 if (theParam.GetW() > 1000) return Xsym; 362 else if (theParam.GetW() < 0.001) return Xasym; 363 else return theParam.GetW()*Xsym+Xasym; 364 } 365 366 367 368 369 G4int G4CompetitiveFission::FissionCharge(const G4double A, 370 const G4double Z, 371 const G4double Af) 372 // Calculates the charge of a fission product for a given atomic number Af 373 { 374 const G4double sigma = 0.6; 375 G4double DeltaZ = 0.0; 376 if (Af >= 134.0) DeltaZ = -0.45; // 134 <= Af 377 else if (Af <= (A-134.0)) DeltaZ = 0.45; // Af <= (A-134) 378 else DeltaZ = -0.45*(Af-(A/2.0))/(134.0-(A/2.0)); // (A-134) < Af < 134 379 380 G4double Zmean = (Af/A)*Z + DeltaZ; 244 245 return theResult; 246 } 247 248 G4int 249 G4CompetitiveFission::FissionAtomicNumber(G4int A, 250 const G4FissionParameters & theParam) 251 // Calculates the atomic number of a fission product 252 { 253 254 // For Simplicity reading code 255 const G4double A1 = theParam.GetA1(); 256 const G4double A2 = theParam.GetA2(); 257 const G4double As = theParam.GetAs(); 258 // const G4double Sigma1 = theParam.GetSigma1(); 259 const G4double Sigma2 = theParam.GetSigma2(); 260 const G4double SigmaS = theParam.GetSigmaS(); 261 const G4double w = theParam.GetW(); 262 263 // G4double FasymAsym = 2.0*std::exp(-((A2-As)*(A2-As))/(2.0*Sigma2*Sigma2)) + 264 // std::exp(-((A1-As)*(A1-As))/(2.0*Sigma1*Sigma1)); 265 266 // G4double FsymA1A2 = std::exp(-((As-(A1+A2))*(As-(A1+A2)))/(2.0*SigmaS*SigmaS)); 267 268 G4double C2A = A2 + 3.72*Sigma2; 269 G4double C2S = As + 3.72*SigmaS; 270 271 G4double C2 = 0.0; 272 if (w > 1000.0 ) C2 = C2S; 273 else if (w < 0.001) C2 = C2A; 274 else C2 = std::max(C2A,C2S); 275 276 G4double C1 = A-C2; 277 if (C1 < 30.0) { 278 C2 = A-30.0; 279 C1 = 30.0; 280 } 281 282 G4double Am1 = (As + A1)/2.0; 283 G4double Am2 = (A1 + A2)/2.0; 284 285 // Get Mass distributions as sum of symmetric and asymmetric Gasussians 286 G4double Mass1 = MassDistribution(As,A,theParam); 287 G4double Mass2 = MassDistribution(Am1,A,theParam); 288 G4double Mass3 = MassDistribution(A1,A,theParam); 289 G4double Mass4 = MassDistribution(Am2,A,theParam); 290 G4double Mass5 = MassDistribution(A2,A,theParam); 291 // get maximal value among Mass1,...,Mass5 292 G4double MassMax = Mass1; 293 if (Mass2 > MassMax) MassMax = Mass2; 294 if (Mass3 > MassMax) MassMax = Mass3; 295 if (Mass4 > MassMax) MassMax = Mass4; 296 if (Mass5 > MassMax) MassMax = Mass5; 297 298 // Sample a fragment mass number, which lies between C1 and C2 299 G4double m; 300 G4double Pm; 301 do { 302 m = C1+G4UniformRand()*(C2-C1); 303 Pm = MassDistribution(m,A,theParam); 304 } while (MassMax*G4UniformRand() > Pm); 305 306 return static_cast<G4int>(m+0.5); 307 } 308 309 G4double 310 G4CompetitiveFission::MassDistribution(G4double x, G4double A, 311 const G4FissionParameters & theParam) 312 // This method gives mass distribution F(x) = F_{asym}(x)+w*F_{sym}(x) 313 // which consist of symmetric and asymmetric sum of gaussians components. 314 { 315 G4double Xsym = std::exp(-0.5*(x-theParam.GetAs())*(x-theParam.GetAs())/ 316 (theParam.GetSigmaS()*theParam.GetSigmaS())); 317 318 G4double Xasym = std::exp(-0.5*(x-theParam.GetA2())*(x-theParam.GetA2())/ 319 (theParam.GetSigma2()*theParam.GetSigma2())) + 320 std::exp(-0.5*(x-(A-theParam.GetA2()))*(x-(A-theParam.GetA2()))/ 321 (theParam.GetSigma2()*theParam.GetSigma2())) + 322 0.5*std::exp(-0.5*(x-theParam.GetA1())*(x-theParam.GetA1())/ 323 (theParam.GetSigma1()*theParam.GetSigma1())) + 324 0.5*std::exp(-0.5*(x-(A-theParam.GetA1()))*(x-(A-theParam.GetA1()))/ 325 (theParam.GetSigma1()*theParam.GetSigma1())); 326 327 if (theParam.GetW() > 1000) return Xsym; 328 else if (theParam.GetW() < 0.001) return Xasym; 329 else return theParam.GetW()*Xsym+Xasym; 330 } 331 332 G4int G4CompetitiveFission::FissionCharge(G4double A, G4double Z, 333 G4double Af) 334 // Calculates the charge of a fission product for a given atomic number Af 335 { 336 const G4double sigma = 0.6; 337 G4double DeltaZ = 0.0; 338 if (Af >= 134.0) DeltaZ = -0.45; // 134 <= Af 339 else if (Af <= (A-134.0)) DeltaZ = 0.45; // Af <= (A-134) 340 else DeltaZ = -0.45*(Af-(A/2.0))/(134.0-(A/2.0)); // (A-134) < Af < 134 341 342 G4double Zmean = (Af/A)*Z + DeltaZ; 381 343 382 G4double theZ; 383 do { 384 theZ = G4RandGauss::shoot(Zmean,sigma); 385 } while (theZ < 1.0 || theZ > (Z-1.0) || theZ > Af); 386 // return static_cast<G4int>(theZ+0.5); 387 return static_cast<G4int>(theZ+0.5); 388 } 389 390 391 392 393 G4double G4CompetitiveFission::FissionKineticEnergy(const G4double A, const G4double Z, 394 const G4double Af1, const G4double /*Zf1*/, 395 const G4double Af2, const G4double /*Zf2*/, 396 const G4double /*U*/, const G4double Tmax, 397 const G4FissionParameters & theParam) 398 // Gives the kinetic energy of fission products 399 { 400 // Find maximal value of A for fragments 401 G4double AfMax = std::max(Af1,Af2); 402 if (AfMax < (A/2.0)) AfMax = A - AfMax; 403 404 // Weights for symmetric and asymmetric components 405 G4double Pas; 406 if (theParam.GetW() > 1000) Pas = 0.0; 407 else { 408 G4double P1 = 0.5*std::exp(-0.5*(AfMax-theParam.GetA1())*(AfMax-theParam.GetA1())/ 409 (theParam.GetSigma1()*theParam.GetSigma1())); 410 411 G4double P2 = std::exp(-0.5*(AfMax-theParam.GetA2())*(AfMax-theParam.GetA2())/ 412 (theParam.GetSigma2()*theParam.GetSigma2())); 413 414 Pas = P1+P2; 415 } 416 417 418 G4double Ps; 419 if (theParam.GetW() < 0.001) Ps = 0.0; 420 else 421 Ps = theParam.GetW()*std::exp(-0.5*(AfMax-theParam.GetAs())*(AfMax-theParam.GetAs())/ 422 (theParam.GetSigmaS()*theParam.GetSigmaS())); 423 424 425 426 G4double Psy = Ps/(Pas+Ps); 427 428 429 // Fission fractions Xsy and Xas formed in symmetric and asymmetric modes 430 G4double PPas = theParam.GetSigma1() + 2.0 * theParam.GetSigma2(); 431 G4double PPsy = theParam.GetW() * theParam.GetSigmaS(); 432 G4double Xas = PPas / (PPas+PPsy); 433 G4double Xsy = PPsy / (PPas+PPsy); 434 435 436 // Average kinetic energy for symmetric and asymmetric components 437 G4double Eaverage = 0.1071*MeV*(Z*Z)/std::pow(A,1.0/3.0) + 22.2*MeV; 438 439 440 // Compute maximal average kinetic energy of fragments and Energy Dispersion (sqrt) 441 G4double TaverageAfMax; 442 G4double ESigma; 443 // Select randomly fission mode (symmetric or asymmetric) 444 if (G4UniformRand() > Psy) { // Asymmetric Mode 445 G4double A11 = theParam.GetA1()-0.7979*theParam.GetSigma1(); 446 G4double A12 = theParam.GetA1()+0.7979*theParam.GetSigma1(); 447 G4double A21 = theParam.GetA2()-0.7979*theParam.GetSigma2(); 448 G4double A22 = theParam.GetA2()+0.7979*theParam.GetSigma2(); 449 // scale factor 450 G4double ScaleFactor = 0.5*theParam.GetSigma1()*(AsymmetricRatio(A,A11)+AsymmetricRatio(A,A12))+ 451 theParam.GetSigma2()*(AsymmetricRatio(A,A21)+AsymmetricRatio(A,A22)); 452 // Compute average kinetic energy for fragment with AfMax 453 TaverageAfMax = (Eaverage + 12.5 * Xsy) * (PPas/ScaleFactor) * AsymmetricRatio(A,AfMax); 454 ESigma = 10.0*MeV; // MeV 455 456 } else { // Symmetric Mode 457 G4double As0 = theParam.GetAs() + 0.7979*theParam.GetSigmaS(); 458 // scale factor 459 G4double ScaleFactor = theParam.GetW()*theParam.GetSigmaS()*SymmetricRatio(A,As0); 460 // Compute average kinetic energy for fragment with AfMax 461 TaverageAfMax = (Eaverage - 12.5*MeV*Xas) * (PPsy/ScaleFactor) * SymmetricRatio(A,AfMax); 462 ESigma = 8.0*MeV; 463 } 464 465 466 // Select randomly, in accordance with Gaussian distribution, fragment kinetic energy 467 G4double KineticEnergy; 468 G4int i = 0; 469 do { 470 KineticEnergy = G4RandGauss::shoot(TaverageAfMax,ESigma); 471 if (i++ > 100) return Eaverage; 472 } while (KineticEnergy < Eaverage-3.72*ESigma || 473 KineticEnergy > Eaverage+3.72*ESigma || 474 KineticEnergy > Tmax); 475 476 return KineticEnergy; 477 } 478 479 480 481 482 483 G4double G4CompetitiveFission::AsymmetricRatio(const G4double A,const G4double A11) 484 { 485 const G4double B1 = 23.5; 486 const G4double A00 = 134.0; 487 return Ratio(A,A11,B1,A00); 488 } 489 490 G4double G4CompetitiveFission::SymmetricRatio(const G4double A,const G4double A11) 491 { 492 const G4double B1 = 5.32; 493 const G4double A00 = A/2.0; 494 return Ratio(A,A11,B1,A00); 495 } 496 497 G4double G4CompetitiveFission::Ratio(const G4double A,const G4double A11, 498 const G4double B1,const G4double A00) 499 { 500 if (A == 0) throw G4HadronicException(__FILE__, __LINE__, "G4CompetitiveFission::Ratio: A == 0!"); 501 if (A11 >= A/2.0 && A11 <= (A00+10.0)) return 1.0-B1*((A11-A00)/A)*((A11-A00)/A); 502 else return 1.0-B1*(10.0/A)*(10.0/A)-2.0*(10.0/A)*B1*((A11-A00-10.0)/A); 503 } 504 505 506 507 344 G4double theZ; 345 do { 346 theZ = G4RandGauss::shoot(Zmean,sigma); 347 } while (theZ < 1.0 || theZ > (Z-1.0) || theZ > Af); 348 // return static_cast<G4int>(theZ+0.5); 349 return static_cast<G4int>(theZ+0.5); 350 } 351 352 G4double 353 G4CompetitiveFission::FissionKineticEnergy(G4int A, G4int Z, 354 G4double Af1, G4double /*Zf1*/, 355 G4double Af2, G4double /*Zf2*/, 356 G4double /*U*/, G4double Tmax, 357 const G4FissionParameters & theParam) 358 // Gives the kinetic energy of fission products 359 { 360 // Find maximal value of A for fragments 361 G4double AfMax = std::max(Af1,Af2); 362 if (AfMax < (A/2.0)) AfMax = A - AfMax; 363 364 // Weights for symmetric and asymmetric components 365 G4double Pas; 366 if (theParam.GetW() > 1000) Pas = 0.0; 367 else { 368 G4double P1 = 0.5*std::exp(-0.5*(AfMax-theParam.GetA1())*(AfMax-theParam.GetA1())/ 369 (theParam.GetSigma1()*theParam.GetSigma1())); 370 371 G4double P2 = std::exp(-0.5*(AfMax-theParam.GetA2())*(AfMax-theParam.GetA2())/ 372 (theParam.GetSigma2()*theParam.GetSigma2())); 373 374 Pas = P1+P2; 375 } 376 377 G4double Ps; 378 if (theParam.GetW() < 0.001) Ps = 0.0; 379 else { 380 Ps = theParam.GetW()*std::exp(-0.5*(AfMax-theParam.GetAs())*(AfMax-theParam.GetAs())/ 381 (theParam.GetSigmaS()*theParam.GetSigmaS())); 382 } 383 G4double Psy = Ps/(Pas+Ps); 384 385 // Fission fractions Xsy and Xas formed in symmetric and asymmetric modes 386 G4double PPas = theParam.GetSigma1() + 2.0 * theParam.GetSigma2(); 387 G4double PPsy = theParam.GetW() * theParam.GetSigmaS(); 388 G4double Xas = PPas / (PPas+PPsy); 389 G4double Xsy = PPsy / (PPas+PPsy); 390 391 // Average kinetic energy for symmetric and asymmetric components 392 G4double Eaverage = 0.1071*MeV*(Z*Z)/G4Pow::GetInstance()->Z13(A) + 22.2*MeV; 393 394 395 // Compute maximal average kinetic energy of fragments and Energy Dispersion (sqrt) 396 G4double TaverageAfMax; 397 G4double ESigma; 398 // Select randomly fission mode (symmetric or asymmetric) 399 if (G4UniformRand() > Psy) { // Asymmetric Mode 400 G4double A11 = theParam.GetA1()-0.7979*theParam.GetSigma1(); 401 G4double A12 = theParam.GetA1()+0.7979*theParam.GetSigma1(); 402 G4double A21 = theParam.GetA2()-0.7979*theParam.GetSigma2(); 403 G4double A22 = theParam.GetA2()+0.7979*theParam.GetSigma2(); 404 // scale factor 405 G4double ScaleFactor = 0.5*theParam.GetSigma1()*(AsymmetricRatio(A,A11)+AsymmetricRatio(A,A12))+ 406 theParam.GetSigma2()*(AsymmetricRatio(A,A21)+AsymmetricRatio(A,A22)); 407 // Compute average kinetic energy for fragment with AfMax 408 TaverageAfMax = (Eaverage + 12.5 * Xsy) * (PPas/ScaleFactor) * AsymmetricRatio(A,AfMax); 409 ESigma = 10.0*MeV; // MeV 410 411 } else { // Symmetric Mode 412 G4double As0 = theParam.GetAs() + 0.7979*theParam.GetSigmaS(); 413 // scale factor 414 G4double ScaleFactor = theParam.GetW()*theParam.GetSigmaS()*SymmetricRatio(A,As0); 415 // Compute average kinetic energy for fragment with AfMax 416 TaverageAfMax = (Eaverage - 12.5*MeV*Xas) * (PPsy/ScaleFactor) * SymmetricRatio(A,AfMax); 417 ESigma = 8.0*MeV; 418 } 419 420 421 // Select randomly, in accordance with Gaussian distribution, fragment kinetic energy 422 G4double KineticEnergy; 423 G4int i = 0; 424 do { 425 KineticEnergy = G4RandGauss::shoot(TaverageAfMax,ESigma); 426 if (i++ > 100) return Eaverage; 427 } while (KineticEnergy < Eaverage-3.72*ESigma || 428 KineticEnergy > Eaverage+3.72*ESigma || 429 KineticEnergy > Tmax); 430 431 return KineticEnergy; 432 } 433 434 G4double G4CompetitiveFission::AsymmetricRatio(G4int A, G4double A11) 435 { 436 const G4double B1 = 23.5; 437 const G4double A00 = 134.0; 438 return Ratio(G4double(A),A11,B1,A00); 439 } 440 441 G4double G4CompetitiveFission::SymmetricRatio(G4int A, G4double A11) 442 { 443 const G4double B1 = 5.32; 444 const G4double A00 = A/2.0; 445 return Ratio(G4double(A),A11,B1,A00); 446 } 447 448 G4double G4CompetitiveFission::Ratio(G4double A, G4double A11, 449 G4double B1, G4double A00) 450 { 451 if (A == 0.0) { 452 throw G4HadronicException(__FILE__, __LINE__, 453 "G4CompetitiveFission::Ratio: A == 0!"); 454 } 455 if (A11 >= A/2.0 && A11 <= (A00+10.0)) { 456 return 1.0-B1*((A11-A00)/A)*((A11-A00)/A); 457 } else { 458 return 1.0-B1*(10.0/A)*(10.0/A)-2.0*(10.0/A)*B1*((A11-A00-10.0)/A); 459 } 460 } 508 461 509 462 G4ThreeVector G4CompetitiveFission::IsotropicVector(const G4double Magnitude) 510 // Samples a isotropic random vectorwith a magnitud given by Magnitude. 511 // By default Magnitude = 1.0 512 { 513 G4double CosTheta = 1.0 - 2.0*G4UniformRand(); 514 G4double SinTheta = std::sqrt(1.0 - CosTheta*CosTheta); 515 G4double Phi = twopi*G4UniformRand(); 516 G4ThreeVector Vector(Magnitude*std::cos(Phi)*SinTheta, 517 Magnitude*std::sin(Phi)*SinTheta, 518 Magnitude*CosTheta); 519 return Vector; 520 } 521 463 // Samples a isotropic random vectorwith a magnitud given by Magnitude. 464 // By default Magnitude = 1.0 465 { 466 G4double CosTheta = 1.0 - 2.0*G4UniformRand(); 467 G4double SinTheta = std::sqrt(1.0 - CosTheta*CosTheta); 468 G4double Phi = twopi*G4UniformRand(); 469 G4ThreeVector Vector(Magnitude*std::cos(Phi)*SinTheta, 470 Magnitude*std::sin(Phi)*SinTheta, 471 Magnitude*CosTheta); 472 return Vector; 473 } 522 474 523 475 #ifdef debug -
trunk/source/processes/hadronic/models/de_excitation/fission/src/G4FissionBarrier.cc
r1340 r1347 25 25 // 26 26 // 27 // $Id: G4FissionBarrier.cc,v 1. 7 2009/12/16 16:50:07vnivanch Exp $28 // GEANT4 tag $Name: geant4-09-0 3-ref-09$27 // $Id: G4FissionBarrier.cc,v 1.8 2010/11/17 20:22:46 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-ref-00 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations 31 31 // by V. Lara (Oct 1998) 32 32 // 33 // 17.11.2010 V.Ivanchenko cleanup and add usage of G4Pow 33 34 34 35 #include "G4FissionBarrier.hh" 36 #include "G4Pow.hh" 35 37 36 G4FissionBarrier::G4FissionBarrier(const G4FissionBarrier & ) : G4VFissionBarrier() 38 G4FissionBarrier::G4FissionBarrier() 39 {} 40 41 G4FissionBarrier::~G4FissionBarrier() 42 {} 43 44 G4double 45 G4FissionBarrier::FissionBarrier(G4int A, G4int Z, G4double U) 46 // Compute fission barrier according with Barashenkov's 47 // prescription for A >= 65 37 48 { 38 throw G4HadronicException(__FILE__, __LINE__, "G4FissionBarrier::copy_constructor meant to not be accessable."); 49 if (A >= 65) { 50 return BarashenkovFissionBarrier(A,Z)/(1.0 + std::sqrt(U/(2.0*A))); 51 } else { return 100.0*GeV; } 39 52 } 40 53 54 G4double 55 G4FissionBarrier::BarashenkovFissionBarrier(G4int A, G4int Z) 56 // Calculates Fission Barrier heights 57 { 58 // Liquid drop model parameters for 59 // surface energy of a spherical nucleus 60 const G4double aSurf = 17.9439*MeV; 61 // and coulomb energy 62 const G4double aCoul = 0.7053*MeV; 63 const G4double k = 1.7826; 64 G4int N = A - Z; 41 65 42 const G4FissionBarrier & G4FissionBarrier::operator=(const G4FissionBarrier & ) 43 { 44 throw G4HadronicException(__FILE__, __LINE__, "G4FissionBarrier::operator= meant to not be accessable."); 45 return *this; 66 // fissibility parameter 67 G4double x = (aCoul/(2.0*aSurf))*(Z*Z)/static_cast<G4double>(A); 68 x /= (1.0 - k*(N-Z)*(N-Z)/static_cast<G4double>(A*A)); 69 70 // Liquid drop model part of Fission Barrier 71 G4double BF0 = aSurf*G4Pow::GetInstance()->Z23(A); 72 if (x <= 2./3.) { BF0 *= 0.38*(3./4.-x); } 73 else { BF0 *= 0.83*(1. - x)*(1. - x)*(1. - x); } 74 75 // 76 G4double D = 1.248*MeV; 77 D *= (N - 2*(N/2) + Z - 2*(Z/2)); 78 79 return BF0 + D - SellPlusPairingCorrection(Z,N); 46 80 } 47 81 48 G4bool G4FissionBarrier::operator==(const G4FissionBarrier & ) const49 {50 return false;51 }52 53 G4bool G4FissionBarrier::operator!=(const G4FissionBarrier & ) const54 {55 return true;56 }57 58 59 60 G4double G4FissionBarrier::FissionBarrier(const G4int A, const G4int Z, const G4double U)61 // Compute fission barrier according with Barashenkov's prescription for A >= 6562 {63 if (A >= 65) return BarashenkovFissionBarrier(A,Z)/(1.0 + std::sqrt(U/(2.0*static_cast<G4double>(A))));64 else return 100.0*GeV;65 }66 67 68 G4double G4FissionBarrier::BarashenkovFissionBarrier(const G4int A, const G4int Z)69 // Calculates Fission Barrier heights70 {71 // Liquid drop model parameters for72 // surface energy of a spherical nucleus73 const G4double aSurf = 17.9439*MeV;74 // and coulomb energy75 const G4double aCoul = 0.7053*MeV;76 const G4int N = A - Z;77 const G4double k = 1.7826;78 79 // fissibility parameter80 G4double x = (aCoul/(2.0*aSurf))*(static_cast<G4double>(Z)*static_cast<G4double>(Z))/static_cast<G4double>(A);81 x /= (1.0 - k*(static_cast<G4double>(N-Z)/static_cast<G4double>(A))*82 (static_cast<G4double>(N-Z)/static_cast<G4double>(A)));83 84 // Liquid drop model part of Fission Barrier85 G4double BF0 = aSurf*std::pow(static_cast<G4double>(A),2./3.);86 if (x <= 2./3.) BF0 *= 0.38*(3./4.-x);87 else BF0 *= 0.83*(1. - x)*(1. - x)*(1. - x);88 89 90 //91 G4double D = 1.248*MeV;92 D *= (static_cast<G4double>(N)-2.0*(N/2)) + (static_cast<G4double>(Z)-2.0*(Z/2));93 94 return BF0 + D - SellPlusPairingCorrection(Z,N);95 }96 -
trunk/source/processes/hadronic/models/de_excitation/fission/src/G4FissionLevelDensityParameter.cc
r1340 r1347 25 25 // 26 26 // 27 // $Id: G4FissionLevelDensityParameter.cc,v 1. 7 2009/11/21 18:05:26 vnivanch Exp $28 // GEANT4 tag $Name: geant4-09-0 3-ref-09$27 // $Id: G4FissionLevelDensityParameter.cc,v 1.8 2010/11/17 20:22:46 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-ref-00 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 39 39 40 40 41 G4FissionLevelDensityParameter:: 42 G4FissionLevelDensityParameter(const G4FissionLevelDensityParameter &) : G4VLevelDensityParameter() 43 { 44 throw G4HadronicException(__FILE__, __LINE__, "G4FissionLevelDensityParameter::copy_constructor meant to not be accessable"); 45 } 41 G4FissionLevelDensityParameter::G4FissionLevelDensityParameter() 42 {} 46 43 47 48 const G4FissionLevelDensityParameter & G4FissionLevelDensityParameter:: 49 operator=(const G4FissionLevelDensityParameter &) 50 { 51 throw G4HadronicException(__FILE__, __LINE__, "G4FissionLevelDensityParameter::operator= meant to not be accessable"); 52 return *this; 53 } 54 55 56 G4bool G4FissionLevelDensityParameter:: 57 operator==(const G4FissionLevelDensityParameter &) const 58 { 59 return false; 60 } 61 62 G4bool G4FissionLevelDensityParameter:: 63 operator!=(const G4FissionLevelDensityParameter &) const 64 { 65 return true; 66 } 44 G4FissionLevelDensityParameter::~G4FissionLevelDensityParameter() 45 {} 67 46 68 47 69 48 G4double G4FissionLevelDensityParameter:: 70 LevelDensityParameter( const G4int A,const G4int Z,constG4double U) const49 LevelDensityParameter(G4int A, G4int Z, G4double U) const 71 50 { 72 51 G4double EvapLDP = -
trunk/source/processes/hadronic/models/de_excitation/fission/src/G4FissionParameters.cc
r1340 r1347 25 25 // 26 26 // 27 // $Id: G4FissionParameters.cc,v 1. 7 2009/11/19 10:30:49vnivanch Exp $28 // GEANT4 tag $Name: geant4-09-0 3-ref-09$27 // $Id: G4FissionParameters.cc,v 1.8 2010/11/17 20:22:46 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-ref-00 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 41 41 const G4double G4FissionParameters::A2 = 141.0; 42 42 43 44 G4FissionParameters::G4FissionParameters(const G4int A, const G4int Z, const G4double ExEnergy, 45 const G4double FissionBarrier) 43 G4FissionParameters::G4FissionParameters(G4int A, G4int Z, G4double ExEnergy, 44 G4double FissionBarrier) 46 45 { 47 G4double U = ExEnergy; 46 G4double U = ExEnergy; 47 48 As = A/2.0; 48 49 49 As = A/2.0; 50 if (A <= 235) Sigma2 = 5.6; // MeV 51 else Sigma2 = 5.6 + 0.096*(A-235); // MeV 50 52 51 if (A <= 235) Sigma2 = 5.6; // MeV 52 else Sigma2 = 5.6 + 0.096*(A-235); // MeV 53 Sigma1 = 0.5*Sigma2; // MeV 53 54 54 Sigma1 = 0.5*Sigma2; // MeV55 SigmaS = std::exp(0.00553*U/MeV + 2.1386); // MeV 55 56 56 SigmaS = std::exp(0.00553*U/MeV + 2.1386); // MeV 57 //JMQ 310509 58 // if (SigmaS > 20.0) SigmaS = 20.0; 59 // SigmaS*=1.3; 60 //JMQ 301009: retuning (after CEM transition prob.have been chosen as default) 61 SigmaS*=0.8; 62 // 57 63 58 //JMQ 310509 59 // if (SigmaS > 20.0) SigmaS = 20.0; 60 // SigmaS*=1.3; 61 //JMQ 301009: retuning (after CEM transition prob.have been chosen as default) 62 SigmaS*=0.8; 63 // 64 G4double FasymAsym = 2.0*std::exp(-((A2-As)*(A2-As))/(2.0*Sigma2*Sigma2)) + 65 std::exp(-((A1-As)*(A1-As))/(2.0*Sigma1*Sigma1)); 64 66 65 G4double FasymAsym = 2.0*std::exp(-((A2-As)*(A2-As))/(2.0*Sigma2*Sigma2)) + 66 std::exp(-((A1-As)*(A1-As))/(2.0*Sigma1*Sigma1)); 67 68 G4double FsymA1A2 = std::exp(-((As-(A1+A2)/2.0)*(As-(A1+A2)/2.0))/(2.0*SigmaS*SigmaS)); 67 G4double FsymA1A2 = std::exp(-((As-(A1+A2)/2.0)*(As-(A1+A2)/2.0)) 68 /(2.0*SigmaS*SigmaS)); 69 69 70 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 71 G4double wa = 0.0; 72 w = 0.0; 73 if (Z >= 90) { // Z >= 90 74 if (U <= 16.25) wa = std::exp(0.5385*U/MeV-9.9564); // U <= 16.25 MeV 75 else wa = std::exp(0.09197*U/MeV-2.7003); // U > 16.25 MeV 76 } else if (Z == 89) { // Z == 89 77 wa = std::exp(0.09197*U-1.0808); 78 } else if (Z >= 82) { // 82 <= Z <= 88 79 G4double X = FissionBarrier - 7.5*MeV; 80 if (X < 0.0) X = 0.0; 81 wa = std::exp(0.09197*(U-X)/MeV-1.0808); 82 } else { // Z < 82 83 w = 1001.0; 84 } 85 85 86 if (w == 0.0) { 87 G4double w1 = std::max(1.03*wa - FasymAsym, 0.0001); 88 G4double w2 = std::max(1.0 - FsymA1A2*wa, 0.0001); 86 if (w == 0.0) { 87 G4double w1 = std::max(1.03*wa - FasymAsym, 0.0001); 88 G4double w2 = std::max(1.0 - FsymA1A2*wa, 0.0001); 89 90 w = w1/w2; 89 91 90 w = w1/w2; 91 92 if (82 <= Z && Z < 89 && A < 227) w *= std::exp(0.3*(227-A)); 93 } 92 if (82 <= Z && Z < 89 && A < 227) w *= std::exp(0.3*(227-A)); 93 } 94 94 95 95 } 96 96 97 G4FissionParameters::~G4FissionParameters() 98 {} 97 99 98 G4FissionParameters::G4FissionParameters(const G4FissionParameters &)99 {100 throw G4HadronicException(__FILE__, __LINE__, "G4FissionParameters::copy_constructor meant to not be accessable");101 }102 103 104 const G4FissionParameters & G4FissionParameters::operator=(const G4FissionParameters &)105 {106 throw G4HadronicException(__FILE__, __LINE__, "G4FissionParameters::operator= meant to not be accessable");107 return *this;108 }109 110 111 G4bool G4FissionParameters::operator==(const G4FissionParameters &) const112 {113 return false;114 }115 116 G4bool G4FissionParameters::operator!=(const G4FissionParameters &) const117 {118 return true;119 }120 121 -
trunk/source/processes/hadronic/models/de_excitation/fission/src/G4FissionProbability.cc
r1340 r1347 25 25 // 26 26 // 27 // $Id: G4FissionProbability.cc,v 1. 9 2009/02/15 17:03:25vnivanch Exp $28 // GEANT4 tag $Name: geant4-09-0 3-ref-09$27 // $Id: G4FissionProbability.cc,v 1.10 2010/11/17 20:22:46 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-ref-00 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 38 38 #include "G4PairingCorrection.hh" 39 39 40 G4FissionProbability::G4FissionProbability() 41 {} 42 43 G4FissionProbability::~G4FissionProbability() 44 {} 40 45 41 46 42 G4FissionProbability::G4FissionProbability(const G4FissionProbability &) : G4VEmissionProbability() 47 G4double 48 G4FissionProbability::EmissionProbability(const G4Fragment & fragment, 49 G4double MaximalKineticEnergy) 50 // Compute integrated probability of fission channel 43 51 { 44 throw G4HadronicException(__FILE__, __LINE__, "G4FissionProbability::copy_constructor meant to not be accessable"); 52 if (MaximalKineticEnergy <= 0.0) return 0.0; 53 G4int A = fragment.GetA_asInt(); 54 G4int Z = fragment.GetZ_asInt(); 55 G4double U = fragment.GetExcitationEnergy(); 56 57 G4double Ucompound = U - 58 G4PairingCorrection::GetInstance()->GetPairingCorrection(A,Z); 59 60 G4double Ufission = U - 61 G4PairingCorrection::GetInstance()->GetFissionPairingCorrection(A,Z); 62 63 G4double SystemEntropy = 64 2.0*std::sqrt(theEvapLDP.LevelDensityParameter(A,Z,Ucompound)*Ucompound); 65 66 G4double afission = theFissLDP.LevelDensityParameter(A,Z,Ufission); 67 68 G4double Cf = 2.0*std::sqrt(afission*MaximalKineticEnergy); 69 70 // G4double Q1 = 1.0 + (Cf - 1.0)*std::exp(Cf); 71 // G4double Q2 = 4.0*pi*afission*std::exp(SystemEntropy); 72 73 // G4double probability = Q1/Q2; 74 75 G4double Exp1 = 0.0; 76 if (SystemEntropy <= 160.0) { Exp1 = std::exp(-SystemEntropy); } 77 // @@@@@@@@@@@@@@@@@ hpw changed max to min - cannot notify vicente now 78 G4double Exp2 = std::exp( std::min(700.0,Cf-SystemEntropy) ); 79 80 // JMQ 14/02/09 BUG fixed in fission probability (missing parenthesis 81 // at denominator) 82 //AH fix from Vincente: G4double probability = 83 // (Exp1 + (1.0-Cf)*Exp2) / 4.0*pi*afission; 84 // G4double probability = (Exp1 + (Cf-1.0)*Exp2) / 4.0*pi*afission; 85 G4double probability = (Exp1 + (Cf-1.0)*Exp2) / (4.0*pi*afission); 86 87 return probability; 45 88 } 46 89 47 48 49 50 const G4FissionProbability & G4FissionProbability::operator=(const G4FissionProbability &)51 {52 throw G4HadronicException(__FILE__, __LINE__, "G4FissionProbability::operator= meant to not be accessable");53 return *this;54 }55 56 57 G4bool G4FissionProbability::operator==(const G4FissionProbability &) const58 {59 return false;60 }61 62 G4bool G4FissionProbability::operator!=(const G4FissionProbability &) const63 {64 return true;65 }66 67 68 G4double G4FissionProbability::EmissionProbability(const G4Fragment & fragment, const G4double MaximalKineticEnergy)69 // Compute integrated probability of fission channel70 {71 if (MaximalKineticEnergy <= 0.0) return 0.0;72 G4double A = fragment.GetA();73 G4double Z = fragment.GetZ();74 G4double U = fragment.GetExcitationEnergy();75 76 G4double Ucompound = U - G4PairingCorrection::GetInstance()->GetPairingCorrection(static_cast<G4int>(A),77 static_cast<G4int>(Z));78 G4double Ufission = U - G4PairingCorrection::GetInstance()->GetFissionPairingCorrection(static_cast<G4int>(A),79 static_cast<G4int>(Z));80 81 G4double SystemEntropy = 2.0*std::sqrt(theEvapLDP.LevelDensityParameter(static_cast<G4int>(A),82 static_cast<G4int>(Z),83 Ucompound)*Ucompound);84 85 G4double afission = theFissLDP.LevelDensityParameter(static_cast<G4int>(A),86 static_cast<G4int>(Z),87 Ufission);88 89 G4double Cf = 2.0*std::sqrt(afission*MaximalKineticEnergy);90 91 // G4double Q1 = 1.0 + (Cf - 1.0)*std::exp(Cf);92 // G4double Q2 = 4.0*pi*afission*std::exp(SystemEntropy);93 94 // G4double probability = Q1/Q2;95 96 97 G4double Exp1 = 0.0;98 if (SystemEntropy <= 160.0) Exp1 = std::exp(-SystemEntropy);99 // @@@@@@@@@@@@@@@@@ hpw changed max to min - cannot notify vicente now100 G4double Exp2 = std::exp( std::min(700.0,Cf-SystemEntropy) );101 102 // JMQ 14/02/09 BUG fixed in fission probability (missing parenthesis at denominator)103 //AH fix from Vincente: G4double probability = (Exp1 + (1.0-Cf)*Exp2) / 4.0*pi*afission;104 // G4double probability = (Exp1 + (Cf-1.0)*Exp2) / 4.0*pi*afission;105 G4double probability = (Exp1 + (Cf-1.0)*Exp2) / (4.0*pi*afission);106 107 108 109 return probability;110 }111 -
trunk/source/processes/hadronic/models/de_excitation/fission/src/G4VFissionBarrier.cc
r1340 r1347 25 25 // 26 26 // 27 // $Id: G4VFissionBarrier.cc,v 1. 4 2006/06/29 20:13:43 gunterExp $28 // GEANT4 tag $Name: geant4-09-0 3-ref-09$27 // $Id: G4VFissionBarrier.cc,v 1.5 2010/11/17 20:22:46 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-ref-00 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 34 34 #include "G4VFissionBarrier.hh" 35 35 36 G4VFissionBarrier::G4VFissionBarrier(const G4VFissionBarrier & ) 37 { 38 throw G4HadronicException(__FILE__, __LINE__, "G4VFissionBarrier::copy_constructor meant to not be accessable."); 39 } 36 G4VFissionBarrier::G4VFissionBarrier() {} 37 G4VFissionBarrier::~G4VFissionBarrier() {} 40 38 41 42 const G4VFissionBarrier & G4VFissionBarrier::operator=(const G4VFissionBarrier & )43 {44 throw G4HadronicException(__FILE__, __LINE__, "G4VFissionBarrier::operator= meant to not be accessable.");45 return *this;46 }47 48 G4bool G4VFissionBarrier::operator==(const G4VFissionBarrier & ) const49 {50 return false;51 }52 53 G4bool G4VFissionBarrier::operator!=(const G4VFissionBarrier & ) const54 {55 return true;56 }57
Note: See TracChangeset
for help on using the changeset viewer.