Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // 27 // Hadronic Process: Nuclear De-excitations 27 // Hadronic Process: Nuclear De-excitations 28 // by V. Lara (Oct 1998) 28 // by V. Lara (Oct 1998) 29 // 29 // 30 // J. M. Quesada (March 2009). Bugs fixed: 30 // J. M. Quesada (March 2009). Bugs fixed: 31 // - Full relativistic calculation (L 31 // - Full relativistic calculation (Lorentz boosts) 32 // - Fission pairing energy is includ 32 // - Fission pairing energy is included in fragment excitation energies 33 // Now Energy and momentum are conserved in fi 33 // Now Energy and momentum are conserved in fission 34 34 35 #include "G4CompetitiveFission.hh" 35 #include "G4CompetitiveFission.hh" 36 #include "G4PairingCorrection.hh" 36 #include "G4PairingCorrection.hh" 37 #include "G4ParticleMomentum.hh" 37 #include "G4ParticleMomentum.hh" 38 #include "G4NuclearLevelData.hh" 38 #include "G4NuclearLevelData.hh" 39 #include "G4VFissionBarrier.hh" 39 #include "G4VFissionBarrier.hh" 40 #include "G4FissionBarrier.hh" 40 #include "G4FissionBarrier.hh" 41 #include "G4FissionProbability.hh" 41 #include "G4FissionProbability.hh" 42 #include "G4VLevelDensityParameter.hh" 42 #include "G4VLevelDensityParameter.hh" 43 #include "G4FissionLevelDensityParameter.hh" 43 #include "G4FissionLevelDensityParameter.hh" 44 #include "G4Pow.hh" 44 #include "G4Pow.hh" 45 #include "Randomize.hh" 45 #include "Randomize.hh" 46 #include "G4RandomDirection.hh" 46 #include "G4RandomDirection.hh" 47 #include "G4PhysicalConstants.hh" 47 #include "G4PhysicalConstants.hh" 48 #include "G4PhysicsModelCatalog.hh" << 49 48 50 G4CompetitiveFission::G4CompetitiveFission() : << 49 G4CompetitiveFission::G4CompetitiveFission() : G4VEvaporationChannel("fission") 51 { 50 { 52 theFissionBarrierPtr = new G4FissionBarrier; 51 theFissionBarrierPtr = new G4FissionBarrier; >> 52 myOwnFissionBarrier = true; >> 53 53 theFissionProbabilityPtr = new G4FissionProb 54 theFissionProbabilityPtr = new G4FissionProbability; >> 55 myOwnFissionProbability = true; >> 56 54 theLevelDensityPtr = new G4FissionLevelDensi 57 theLevelDensityPtr = new G4FissionLevelDensityParameter; >> 58 myOwnLevelDensity = true; >> 59 >> 60 maxKineticEnergy = fissionBarrier = fissionProbability = 0.0; 55 pairingCorrection = G4NuclearLevelData::GetI 61 pairingCorrection = G4NuclearLevelData::GetInstance()->GetPairingCorrection(); 56 theSecID = G4PhysicsModelCatalog::GetModelID << 57 } 62 } 58 63 59 G4CompetitiveFission::~G4CompetitiveFission() 64 G4CompetitiveFission::~G4CompetitiveFission() 60 { 65 { 61 if (myOwnFissionBarrier) delete theFissionBa 66 if (myOwnFissionBarrier) delete theFissionBarrierPtr; 62 if (myOwnFissionProbability) delete theFissi 67 if (myOwnFissionProbability) delete theFissionProbabilityPtr; 63 if (myOwnLevelDensity) delete theLevelDensit 68 if (myOwnLevelDensity) delete theLevelDensityPtr; 64 } 69 } 65 70 66 void G4CompetitiveFission::Initialise() << 67 { << 68 if (!isInitialised) { << 69 isInitialised = true; << 70 G4VEvaporationChannel::Initialise(); << 71 if (OPTxs == 1) { fFactor = 0.5; } << 72 } << 73 } << 74 << 75 G4double G4CompetitiveFission::GetEmissionProb 71 G4double G4CompetitiveFission::GetEmissionProbability(G4Fragment* fragment) 76 { 72 { 77 if (!isInitialised) { Initialise(); } << 78 G4int Z = fragment->GetZ_asInt(); 73 G4int Z = fragment->GetZ_asInt(); 79 G4int A = fragment->GetA_asInt(); 74 G4int A = fragment->GetA_asInt(); 80 fissionProbability = 0.0; 75 fissionProbability = 0.0; 81 // Saddle point excitation energy ---> A = 6 76 // Saddle point excitation energy ---> A = 65 82 if (A >= 65 && Z > 16) { 77 if (A >= 65 && Z > 16) { 83 G4double exEnergy = fragment->GetExcitatio 78 G4double exEnergy = fragment->GetExcitationEnergy() - 84 pairingCorrection->GetFissionPairingCorr 79 pairingCorrection->GetFissionPairingCorrection(A, Z); 85 80 86 if (exEnergy > 0.0) { 81 if (exEnergy > 0.0) { 87 fissionBarrier = theFissionBarrierPtr->F 82 fissionBarrier = theFissionBarrierPtr->FissionBarrier(A, Z, exEnergy); 88 maxKineticEnergy = exEnergy - fissionBar 83 maxKineticEnergy = exEnergy - fissionBarrier; 89 fissionProbability = 84 fissionProbability = 90 theFissionProbabilityPtr->EmissionProbabilit 85 theFissionProbabilityPtr->EmissionProbability(*fragment, 91 maxKineticEnergy); 86 maxKineticEnergy); 92 } 87 } 93 } 88 } 94 return fissionProbability*fFactor; << 89 return fissionProbability; 95 } 90 } 96 91 97 G4Fragment* G4CompetitiveFission::EmittedFragm 92 G4Fragment* G4CompetitiveFission::EmittedFragment(G4Fragment* theNucleus) 98 { 93 { 99 G4Fragment * Fragment1 = nullptr; 94 G4Fragment * Fragment1 = nullptr; 100 // Nucleus data 95 // Nucleus data 101 // Atomic number of nucleus 96 // Atomic number of nucleus 102 G4int A = theNucleus->GetA_asInt(); 97 G4int A = theNucleus->GetA_asInt(); 103 // Charge of nucleus 98 // Charge of nucleus 104 G4int Z = theNucleus->GetZ_asInt(); 99 G4int Z = theNucleus->GetZ_asInt(); 105 // Excitation energy (in MeV) 100 // Excitation energy (in MeV) 106 G4double U = theNucleus->GetExcitationEnergy 101 G4double U = theNucleus->GetExcitationEnergy(); 107 G4double pcorr = pairingCorrection->GetFissi 102 G4double pcorr = pairingCorrection->GetFissionPairingCorrection(A,Z); 108 if (U <= pcorr) { return Fragment1; } 103 if (U <= pcorr) { return Fragment1; } 109 104 110 // Atomic Mass of Nucleus (in MeV) 105 // Atomic Mass of Nucleus (in MeV) 111 G4double M = theNucleus->GetGroundStateMass( 106 G4double M = theNucleus->GetGroundStateMass(); 112 107 113 // Nucleus Momentum 108 // Nucleus Momentum 114 G4LorentzVector theNucleusMomentum = theNucl 109 G4LorentzVector theNucleusMomentum = theNucleus->GetMomentum(); 115 110 116 // Calculate fission parameters 111 // Calculate fission parameters 117 theParam.DefineParameters(A, Z, U-pcorr, fis 112 theParam.DefineParameters(A, Z, U-pcorr, fissionBarrier); 118 113 119 // First fragment 114 // First fragment 120 G4int A1 = 0; 115 G4int A1 = 0; 121 G4int Z1 = 0; 116 G4int Z1 = 0; 122 G4double M1 = 0.0; 117 G4double M1 = 0.0; 123 118 124 // Second fragment 119 // Second fragment 125 G4int A2 = 0; 120 G4int A2 = 0; 126 G4int Z2 = 0; 121 G4int Z2 = 0; 127 G4double M2 = 0.0; 122 G4double M2 = 0.0; 128 123 129 G4double FragmentsExcitationEnergy = 0.0; 124 G4double FragmentsExcitationEnergy = 0.0; 130 G4double FragmentsKineticEnergy = 0.0; 125 G4double FragmentsKineticEnergy = 0.0; 131 126 132 G4int Trials = 0; 127 G4int Trials = 0; 133 do { 128 do { 134 129 135 // First fragment 130 // First fragment 136 A1 = FissionAtomicNumber(A); 131 A1 = FissionAtomicNumber(A); 137 Z1 = FissionCharge(A, Z, A1); 132 Z1 = FissionCharge(A, Z, A1); 138 M1 = G4NucleiProperties::GetNuclearMass(A1 133 M1 = G4NucleiProperties::GetNuclearMass(A1, Z1); 139 134 140 // Second Fragment 135 // Second Fragment 141 A2 = A - A1; 136 A2 = A - A1; 142 Z2 = Z - Z1; 137 Z2 = Z - Z1; 143 if (A2 < 1 || Z2 < 0 || Z2 > A2) { 138 if (A2 < 1 || Z2 < 0 || Z2 > A2) { 144 FragmentsExcitationEnergy = -1.0; 139 FragmentsExcitationEnergy = -1.0; 145 continue; 140 continue; 146 } 141 } 147 M2 = G4NucleiProperties::GetNuclearMass(A2 142 M2 = G4NucleiProperties::GetNuclearMass(A2, Z2); 148 // Maximal Kinetic Energy (available energ 143 // Maximal Kinetic Energy (available energy for fragments) 149 G4double Tmax = M + U - M1 - M2 - pcorr; 144 G4double Tmax = M + U - M1 - M2 - pcorr; 150 145 151 // Check that fragment masses are less or 146 // Check that fragment masses are less or equal than total energy 152 if (Tmax < 0.0) { 147 if (Tmax < 0.0) { 153 FragmentsExcitationEnergy = -1.0; 148 FragmentsExcitationEnergy = -1.0; 154 continue; 149 continue; 155 } 150 } 156 151 157 FragmentsKineticEnergy = FissionKineticEne 152 FragmentsKineticEnergy = FissionKineticEnergy( A , Z, 158 A1, Z1, 153 A1, Z1, 159 A2, Z2, 154 A2, Z2, 160 U , Tmax); 155 U , Tmax); 161 156 162 // Excitation Energy 157 // Excitation Energy 163 // FragmentsExcitationEnergy = Tmax - Frag 158 // FragmentsExcitationEnergy = Tmax - FragmentsKineticEnergy; 164 // JMQ 04/03/09 BUG FIXED: in order to ful 159 // JMQ 04/03/09 BUG FIXED: in order to fulfill energy conservation the 165 // fragments carry the fission pairing ene 160 // fragments carry the fission pairing energy in form of 166 // excitation energy 161 // excitation energy 167 162 168 FragmentsExcitationEnergy = 163 FragmentsExcitationEnergy = 169 Tmax - FragmentsKineticEnergy + pcorr; 164 Tmax - FragmentsKineticEnergy + pcorr; 170 165 171 // Loop checking, 05-Aug-2015, Vladimir Iv 166 // Loop checking, 05-Aug-2015, Vladimir Ivanchenko 172 } while (FragmentsExcitationEnergy < 0.0 && 167 } while (FragmentsExcitationEnergy < 0.0 && ++Trials < 100); 173 168 174 if (FragmentsExcitationEnergy <= 0.0) { 169 if (FragmentsExcitationEnergy <= 0.0) { 175 throw G4HadronicException(__FILE__, __LINE 170 throw G4HadronicException(__FILE__, __LINE__, 176 "G4CompetitiveFission::BreakItUp: Excita 171 "G4CompetitiveFission::BreakItUp: Excitation energy for fragments < 0.0!"); 177 } 172 } 178 173 179 // Fragment 1 174 // Fragment 1 180 M1 += FragmentsExcitationEnergy * A1/static_ 175 M1 += FragmentsExcitationEnergy * A1/static_cast<G4double>(A); 181 // Fragment 2 176 // Fragment 2 182 M2 += FragmentsExcitationEnergy * A2/static_ 177 M2 += FragmentsExcitationEnergy * A2/static_cast<G4double>(A); 183 // primary 178 // primary 184 M += U; 179 M += U; 185 180 186 G4double etot1 = ((M - M2)*(M + M2) + M1*M1) 181 G4double etot1 = ((M - M2)*(M + M2) + M1*M1)/(2*M); 187 G4ParticleMomentum Momentum1 = 182 G4ParticleMomentum Momentum1 = 188 std::sqrt((etot1 - M1)*(etot1+M1))*G4Rando 183 std::sqrt((etot1 - M1)*(etot1+M1))*G4RandomDirection(); 189 G4LorentzVector FourMomentum1(Momentum1, eto 184 G4LorentzVector FourMomentum1(Momentum1, etot1); 190 FourMomentum1.boost(theNucleusMomentum.boost 185 FourMomentum1.boost(theNucleusMomentum.boostVector()); 191 186 192 // Create Fragments 187 // Create Fragments 193 Fragment1 = new G4Fragment( A1, Z1, FourMome 188 Fragment1 = new G4Fragment( A1, Z1, FourMomentum1); 194 if (Fragment1 != nullptr) { Fragment1->SetCr << 195 theNucleusMomentum -= FourMomentum1; 189 theNucleusMomentum -= FourMomentum1; 196 theNucleus->SetZandA_asInt(Z2, A2); 190 theNucleus->SetZandA_asInt(Z2, A2); 197 theNucleus->SetMomentum(theNucleusMomentum); 191 theNucleus->SetMomentum(theNucleusMomentum); 198 theNucleus->SetCreatorModelID(theSecID); << 199 return Fragment1; 192 return Fragment1; 200 } 193 } 201 194 202 G4int 195 G4int 203 G4CompetitiveFission::FissionAtomicNumber(G4in 196 G4CompetitiveFission::FissionAtomicNumber(G4int A) 204 // Calculates the atomic number of a fission 197 // Calculates the atomic number of a fission product 205 { 198 { 206 199 207 // For Simplicity reading code 200 // For Simplicity reading code 208 G4int A1 = theParam.GetA1(); 201 G4int A1 = theParam.GetA1(); 209 G4int A2 = theParam.GetA2(); 202 G4int A2 = theParam.GetA2(); 210 G4double As = theParam.GetAs(); 203 G4double As = theParam.GetAs(); 211 G4double Sigma2 = theParam.GetSigma2(); 204 G4double Sigma2 = theParam.GetSigma2(); 212 G4double SigmaS = theParam.GetSigmaS(); 205 G4double SigmaS = theParam.GetSigmaS(); 213 G4double w = theParam.GetW(); 206 G4double w = theParam.GetW(); 214 207 215 G4double C2A = A2 + 3.72*Sigma2; 208 G4double C2A = A2 + 3.72*Sigma2; 216 G4double C2S = As + 3.72*SigmaS; 209 G4double C2S = As + 3.72*SigmaS; 217 210 218 G4double C2 = 0.0; 211 G4double C2 = 0.0; 219 if (w > 1000.0 ) { C2 = C2S; } 212 if (w > 1000.0 ) { C2 = C2S; } 220 else if (w < 0.001) { C2 = C2A; } 213 else if (w < 0.001) { C2 = C2A; } 221 else { C2 = std::max(C2A,C2S 214 else { C2 = std::max(C2A,C2S); } 222 215 223 G4double C1 = A-C2; 216 G4double C1 = A-C2; 224 if (C1 < 30.0) { 217 if (C1 < 30.0) { 225 C2 = A-30.0; 218 C2 = A-30.0; 226 C1 = 30.0; 219 C1 = 30.0; 227 } 220 } 228 221 229 G4double Am1 = (As + A1)*0.5; 222 G4double Am1 = (As + A1)*0.5; 230 G4double Am2 = (A1 + A2)*0.5; 223 G4double Am2 = (A1 + A2)*0.5; 231 224 232 // Get Mass distributions as sum of symmetri 225 // Get Mass distributions as sum of symmetric and asymmetric Gasussians 233 G4double Mass1 = MassDistribution(As,A); 226 G4double Mass1 = MassDistribution(As,A); 234 G4double Mass2 = MassDistribution(Am1,A); 227 G4double Mass2 = MassDistribution(Am1,A); 235 G4double Mass3 = MassDistribution(G4double(A 228 G4double Mass3 = MassDistribution(G4double(A1),A); 236 G4double Mass4 = MassDistribution(Am2,A); 229 G4double Mass4 = MassDistribution(Am2,A); 237 G4double Mass5 = MassDistribution(G4double(A 230 G4double Mass5 = MassDistribution(G4double(A2),A); 238 // get maximal value among Mass1,...,Mass5 231 // get maximal value among Mass1,...,Mass5 239 G4double MassMax = Mass1; 232 G4double MassMax = Mass1; 240 if (Mass2 > MassMax) { MassMax = Mass2; } 233 if (Mass2 > MassMax) { MassMax = Mass2; } 241 if (Mass3 > MassMax) { MassMax = Mass3; } 234 if (Mass3 > MassMax) { MassMax = Mass3; } 242 if (Mass4 > MassMax) { MassMax = Mass4; } 235 if (Mass4 > MassMax) { MassMax = Mass4; } 243 if (Mass5 > MassMax) { MassMax = Mass5; } 236 if (Mass5 > MassMax) { MassMax = Mass5; } 244 237 245 // Sample a fragment mass number, which lies 238 // Sample a fragment mass number, which lies between C1 and C2 246 G4double xm; 239 G4double xm; 247 G4double Pm; 240 G4double Pm; 248 do { 241 do { 249 xm = C1+G4UniformRand()*(C2-C1); 242 xm = C1+G4UniformRand()*(C2-C1); 250 Pm = MassDistribution(xm,A); 243 Pm = MassDistribution(xm,A); 251 // Loop checking, 05-Aug-2015, Vladimir Iv 244 // Loop checking, 05-Aug-2015, Vladimir Ivanchenko 252 } while (MassMax*G4UniformRand() > Pm); 245 } while (MassMax*G4UniformRand() > Pm); 253 G4int ires = G4lrint(xm); 246 G4int ires = G4lrint(xm); 254 247 255 return ires; 248 return ires; 256 } 249 } 257 250 258 G4double 251 G4double 259 G4CompetitiveFission::MassDistribution(G4doubl 252 G4CompetitiveFission::MassDistribution(G4double x, G4int A) 260 // This method gives mass distribution F(x) 253 // This method gives mass distribution F(x) = F_{asym}(x)+w*F_{sym}(x) 261 // which consist of symmetric and asymmetric 254 // which consist of symmetric and asymmetric sum of gaussians components. 262 { 255 { 263 G4double y0 = (x-theParam.GetAs())/theParam. 256 G4double y0 = (x-theParam.GetAs())/theParam.GetSigmaS(); 264 G4double Xsym = LocalExp(y0); 257 G4double Xsym = LocalExp(y0); 265 258 266 G4double y1 = (x - theParam.GetA1())/thePara 259 G4double y1 = (x - theParam.GetA1())/theParam.GetSigma1(); 267 G4double y2 = (x - theParam.GetA2())/thePara 260 G4double y2 = (x - theParam.GetA2())/theParam.GetSigma2(); 268 G4double z1 = (x - A + theParam.GetA1())/the 261 G4double z1 = (x - A + theParam.GetA1())/theParam.GetSigma1(); 269 G4double z2 = (x - A + theParam.GetA2())/the 262 G4double z2 = (x - A + theParam.GetA2())/theParam.GetSigma2(); 270 G4double Xasym = LocalExp(y1) + LocalExp(y2) 263 G4double Xasym = LocalExp(y1) + LocalExp(y2) 271 + 0.5*(LocalExp(z1) + LocalExp(z2)); 264 + 0.5*(LocalExp(z1) + LocalExp(z2)); 272 265 273 G4double res; 266 G4double res; 274 G4double w = theParam.GetW(); 267 G4double w = theParam.GetW(); 275 if (w > 1000) { res = Xsym; } 268 if (w > 1000) { res = Xsym; } 276 else if (w < 0.001) { res = Xasym; } 269 else if (w < 0.001) { res = Xasym; } 277 else { res = w*Xsym+Xasym; } 270 else { res = w*Xsym+Xasym; } 278 return res; 271 return res; 279 } 272 } 280 273 281 G4int G4CompetitiveFission::FissionCharge(G4in 274 G4int G4CompetitiveFission::FissionCharge(G4int A, G4int Z, G4double Af) 282 // Calculates the charge of a fission produc 275 // Calculates the charge of a fission product for a given atomic number Af 283 { 276 { 284 static const G4double sigma = 0.6; 277 static const G4double sigma = 0.6; 285 G4double DeltaZ = 0.0; 278 G4double DeltaZ = 0.0; 286 if (Af >= 134.0) { DeltaZ = -0.45; 279 if (Af >= 134.0) { DeltaZ = -0.45; } 287 else if (Af <= (A-134.0)) { DeltaZ = 0.45; } 280 else if (Af <= (A-134.0)) { DeltaZ = 0.45; } 288 else { DeltaZ = -0.45*( 281 else { DeltaZ = -0.45*(Af-A*0.5)/(134.0-A*0.5); } 289 282 290 G4double Zmean = (Af/A)*Z + DeltaZ; 283 G4double Zmean = (Af/A)*Z + DeltaZ; 291 284 292 G4double theZ; 285 G4double theZ; 293 do { 286 do { 294 theZ = G4RandGauss::shoot(Zmean,sigma); 287 theZ = G4RandGauss::shoot(Zmean,sigma); 295 // Loop checking, 05-Aug-2015, Vladimir Iv 288 // Loop checking, 05-Aug-2015, Vladimir Ivanchenko 296 } while (theZ < 1.0 || theZ > (Z-1.0) || th 289 } while (theZ < 1.0 || theZ > (Z-1.0) || theZ > Af); 297 290 298 return G4lrint(theZ); 291 return G4lrint(theZ); 299 } 292 } 300 293 301 G4double 294 G4double 302 G4CompetitiveFission::FissionKineticEnergy(G4i 295 G4CompetitiveFission::FissionKineticEnergy(G4int A, G4int Z, 303 G4int Af1, G4int /*Zf1*/, 296 G4int Af1, G4int /*Zf1*/, 304 G4int Af2, G4int /*Zf2*/, 297 G4int Af2, G4int /*Zf2*/, 305 G4double /*U*/, G4double Tmax) 298 G4double /*U*/, G4double Tmax) 306 // Gives the kinetic energy of fission produ 299 // Gives the kinetic energy of fission products 307 { 300 { 308 // Find maximal value of A for fragments 301 // Find maximal value of A for fragments 309 G4int AfMax = std::max(Af1,Af2); 302 G4int AfMax = std::max(Af1,Af2); 310 303 311 // Weights for symmetric and asymmetric comp 304 // Weights for symmetric and asymmetric components 312 G4double Pas = 0.0; 305 G4double Pas = 0.0; 313 if (theParam.GetW() <= 1000) { 306 if (theParam.GetW() <= 1000) { 314 G4double x1 = (AfMax-theParam.GetA1())/the 307 G4double x1 = (AfMax-theParam.GetA1())/theParam.GetSigma1(); 315 G4double x2 = (AfMax-theParam.GetA2())/the 308 G4double x2 = (AfMax-theParam.GetA2())/theParam.GetSigma2(); 316 Pas = 0.5*LocalExp(x1) + LocalExp(x2); 309 Pas = 0.5*LocalExp(x1) + LocalExp(x2); 317 } 310 } 318 311 319 G4double Ps = 0.0; 312 G4double Ps = 0.0; 320 if (theParam.GetW() >= 0.001) { 313 if (theParam.GetW() >= 0.001) { 321 G4double xs = (AfMax-theParam.GetAs())/the 314 G4double xs = (AfMax-theParam.GetAs())/theParam.GetSigmaS(); 322 Ps = theParam.GetW()*LocalExp(xs); 315 Ps = theParam.GetW()*LocalExp(xs); 323 } 316 } 324 G4double Psy = (Pas + Ps > 0.0) ? Ps/(Pas+Ps 317 G4double Psy = (Pas + Ps > 0.0) ? Ps/(Pas+Ps) : 0.5; 325 318 326 // Fission fractions Xsy and Xas formed in s 319 // Fission fractions Xsy and Xas formed in symmetric and asymmetric modes 327 G4double PPas = theParam.GetSigma1() + 2.0 * 320 G4double PPas = theParam.GetSigma1() + 2.0 * theParam.GetSigma2(); 328 G4double PPsy = theParam.GetW() * theParam.G 321 G4double PPsy = theParam.GetW() * theParam.GetSigmaS(); 329 G4double Xas = (PPas + PPsy > 0.0) ? PPas/(P 322 G4double Xas = (PPas + PPsy > 0.0) ? PPas/(PPas+PPsy) : 0.5; 330 G4double Xsy = 1.0 - Xas; 323 G4double Xsy = 1.0 - Xas; 331 324 332 // Average kinetic energy for symmetric and 325 // Average kinetic energy for symmetric and asymmetric components 333 G4double Eaverage = (0.1071*(Z*Z)/G4Pow::Get 326 G4double Eaverage = (0.1071*(Z*Z)/G4Pow::GetInstance()->Z13(A) + 22.2)*CLHEP::MeV; 334 327 335 // Compute maximal average kinetic energy of 328 // Compute maximal average kinetic energy of fragments and Energy Dispersion 336 G4double TaverageAfMax; 329 G4double TaverageAfMax; 337 G4double ESigma = 10*CLHEP::MeV; 330 G4double ESigma = 10*CLHEP::MeV; 338 // Select randomly fission mode (symmetric o 331 // Select randomly fission mode (symmetric or asymmetric) 339 if (G4UniformRand() > Psy) { // Asymmetric M 332 if (G4UniformRand() > Psy) { // Asymmetric Mode 340 G4double A11 = theParam.GetA1()-0.7979*the 333 G4double A11 = theParam.GetA1()-0.7979*theParam.GetSigma1(); 341 G4double A12 = theParam.GetA1()+0.7979*the 334 G4double A12 = theParam.GetA1()+0.7979*theParam.GetSigma1(); 342 G4double A21 = theParam.GetA2()-0.7979*the 335 G4double A21 = theParam.GetA2()-0.7979*theParam.GetSigma2(); 343 G4double A22 = theParam.GetA2()+0.7979*the 336 G4double A22 = theParam.GetA2()+0.7979*theParam.GetSigma2(); 344 // scale factor 337 // scale factor 345 G4double ScaleFactor = 0.5*theParam.GetSig 338 G4double ScaleFactor = 0.5*theParam.GetSigma1()* 346 (AsymmetricRatio(A,A11)+AsymmetricRatio( 339 (AsymmetricRatio(A,A11)+AsymmetricRatio(A,A12))+ 347 theParam.GetSigma2()*(AsymmetricRatio(A, 340 theParam.GetSigma2()*(AsymmetricRatio(A,A21)+AsymmetricRatio(A,A22)); 348 // Compute average kinetic energy for frag 341 // Compute average kinetic energy for fragment with AfMax 349 TaverageAfMax = (Eaverage + 12.5 * Xsy) * 342 TaverageAfMax = (Eaverage + 12.5 * Xsy) * (PPas/ScaleFactor) * 350 AsymmetricRatio(A,G4double(AfMax)); 343 AsymmetricRatio(A,G4double(AfMax)); 351 344 352 } else { // Symmetric Mode 345 } else { // Symmetric Mode 353 G4double As0 = theParam.GetAs() + 0.7979*t 346 G4double As0 = theParam.GetAs() + 0.7979*theParam.GetSigmaS(); 354 // Compute average kinetic energy for frag 347 // Compute average kinetic energy for fragment with AfMax 355 TaverageAfMax = (Eaverage - 12.5*CLHEP::Me 348 TaverageAfMax = (Eaverage - 12.5*CLHEP::MeV*Xas) 356 *SymmetricRatio(A, G4double(AfMax))/Symm 349 *SymmetricRatio(A, G4double(AfMax))/SymmetricRatio(A, As0); 357 ESigma = 8.0*CLHEP::MeV; 350 ESigma = 8.0*CLHEP::MeV; 358 } 351 } 359 352 360 // Select randomly, in accordance with Gauss 353 // Select randomly, in accordance with Gaussian distribution, 361 // fragment kinetic energy 354 // fragment kinetic energy 362 G4double KineticEnergy; 355 G4double KineticEnergy; 363 G4int i = 0; 356 G4int i = 0; 364 do { 357 do { 365 KineticEnergy = G4RandGauss::shoot(Taverag 358 KineticEnergy = G4RandGauss::shoot(TaverageAfMax, ESigma); 366 if (++i > 100) return Eaverage; 359 if (++i > 100) return Eaverage; 367 // Loop checking, 05-Aug-2015, Vladimir Iv 360 // Loop checking, 05-Aug-2015, Vladimir Ivanchenko 368 } while (KineticEnergy < Eaverage-3.72*ESigm 361 } while (KineticEnergy < Eaverage-3.72*ESigma || 369 KineticEnergy > Eaverage+3.72*ESigma || 362 KineticEnergy > Eaverage+3.72*ESigma || 370 KineticEnergy > Tmax); 363 KineticEnergy > Tmax); 371 364 372 return KineticEnergy; 365 return KineticEnergy; 373 } 366 } 374 367 375 void G4CompetitiveFission::SetFissionBarrier(G 368 void G4CompetitiveFission::SetFissionBarrier(G4VFissionBarrier * aBarrier) 376 { 369 { 377 if (myOwnFissionBarrier) delete theFissionBa 370 if (myOwnFissionBarrier) delete theFissionBarrierPtr; 378 theFissionBarrierPtr = aBarrier; 371 theFissionBarrierPtr = aBarrier; 379 myOwnFissionBarrier = false; 372 myOwnFissionBarrier = false; 380 } 373 } 381 374 382 void 375 void 383 G4CompetitiveFission::SetEmissionStrategy(G4VE 376 G4CompetitiveFission::SetEmissionStrategy(G4VEmissionProbability * aFissionProb) 384 { 377 { 385 if (myOwnFissionProbability) delete theFissi 378 if (myOwnFissionProbability) delete theFissionProbabilityPtr; 386 theFissionProbabilityPtr = aFissionProb; 379 theFissionProbabilityPtr = aFissionProb; 387 myOwnFissionProbability = false; 380 myOwnFissionProbability = false; 388 } 381 } 389 382 390 void 383 void 391 G4CompetitiveFission::SetLevelDensityParameter 384 G4CompetitiveFission::SetLevelDensityParameter(G4VLevelDensityParameter* aLevelDensity) 392 { 385 { 393 if (myOwnLevelDensity) delete theLevelDensit 386 if (myOwnLevelDensity) delete theLevelDensityPtr; 394 theLevelDensityPtr = aLevelDensity; 387 theLevelDensityPtr = aLevelDensity; 395 myOwnLevelDensity = false; 388 myOwnLevelDensity = false; 396 } 389 } 397 390 398 391