Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 //J.M. Quesada (August2008). Based on: 27 // 28 // Hadronic Process: Nuclear De-excitations 29 // by V. Lara (Oct 1998) 30 // 31 // Modified: 32 // 03-09-2008 J.M. Quesada for external choice of inverse cross section option 33 // 06-09-2008 J.M. Quesada Also external choices have been added for superimposed 34 // Coulomb barrier (if useSICB is set true, by default is false) 35 // 17-11-2010 V.Ivanchenko in constructor replace G4VEmissionProbability by 36 // G4EvaporationProbability and do not new and delete probability 37 // object at each call; use G4Pow 38 39 #include "G4EvaporationChannel.hh" 40 #include "G4EvaporationProbability.hh" 41 #include "G4CoulombBarrier.hh" 42 #include "G4NuclearLevelData.hh" 43 #include "G4NucleiProperties.hh" 44 #include "G4Pow.hh" 45 #include "G4Log.hh" 46 #include "G4Exp.hh" 47 #include "G4PhysicalConstants.hh" 48 #include "G4SystemOfUnits.hh" 49 #include "Randomize.hh" 50 #include "G4RandomDirection.hh" 51 #include "G4PhysicsModelCatalog.hh" 52 53 G4EvaporationChannel::G4EvaporationChannel(G4int anA, G4int aZ, 54 G4EvaporationProbability* aprob): 55 G4VEvaporationChannel(), 56 theProbability(aprob), 57 theCoulombBarrier(new G4CoulombBarrier(anA, aZ)), 58 theA(anA), theZ(aZ) 59 { 60 secID = G4PhysicsModelCatalog::GetModelID("model_G4EvaporationChannel"); 61 evapMass = G4NucleiProperties::GetNuclearMass(theA, theZ); 62 evapMass2 = evapMass*evapMass; 63 theLevelData = G4NuclearLevelData::GetInstance(); 64 } 65 66 G4EvaporationChannel::~G4EvaporationChannel() 67 { 68 delete theCoulombBarrier; 69 } 70 71 void G4EvaporationChannel::Initialise() 72 { 73 theProbability->Initialise(); 74 G4VEvaporationChannel::Initialise(); 75 } 76 77 G4double G4EvaporationChannel::GetEmissionProbability(G4Fragment* fragment) 78 { 79 theProbability->ResetProbability(); 80 G4int fragA = fragment->GetA_asInt(); 81 G4int fragZ = fragment->GetZ_asInt(); 82 resA = fragA - theA; 83 resZ = fragZ - theZ; 84 85 // Only channels which are physically allowed are taken into account 86 if(resA < theA || resA < resZ || resZ < 0 || (resA == theA && resZ < theZ) 87 || ((resA > 1) && (resA == resZ || resZ == 0))) 88 { return 0.0; } 89 90 G4double exEnergy = fragment->GetExcitationEnergy(); 91 G4double fragMass = fragment->GetGroundStateMass(); 92 mass = fragMass + exEnergy; 93 resMass = G4NucleiProperties::GetNuclearMass(resA, resZ); 94 if (mass <= evapMass + resMass) { return 0.0; } 95 96 ekinmax = 0.5*((mass-resMass)*(mass+resMass) + evapMass2)/mass - evapMass; 97 98 // for OPTxs=1 elim=0 for all fragments - x-section include the CoulombBarrier 99 G4double elim = 0.0; 100 if(theZ > 0) { 101 bCoulomb = theCoulombBarrier->GetCoulombBarrier(resA, resZ, 0.0); 102 103 // for OPTxs >0 penetration under the barrier is taken into account 104 elim = (0 < OPTxs) ? bCoulomb*0.5 : bCoulomb; 105 } 106 /* 107 G4cout << "G4EvaporationChannel::Initialize Z=" << theZ <<" A=" << theA 108 << " FragZ=" << fragZ << " FragA=" << fragA << G4endl; 109 G4cout << " Eex=" << exEnergy << " CB=" << bCoulomb 110 << " Elim=" << elim << " Efree=" << mass - resMass - evapMass 111 << G4endl; 112 */ 113 // Coulomb barrier compound at rest 114 G4double resM = mass - evapMass - elim; 115 if (resM < resMass) { return 0.0; } 116 G4double ekinmin = 0.5*((mass-resM)*(mass+resM) + evapMass2)/mass - evapMass; 117 118 /* 119 G4cout << "Emin= " <<ekinmin<<" Emax= "<<ekinmax 120 << " mass= " << mass << " resM= " << resMass 121 << " evapM= " << evapMass << G4endl; 122 */ 123 if(ekinmax <= ekinmin) { return 0.0; } 124 125 theProbability->SetDecayKinematics(resZ, resA, resMass, mass); 126 G4double prob = theProbability->TotalProbability(*fragment, ekinmin, 127 ekinmax, bCoulomb, 128 exEnergy); 129 return prob; 130 } 131 132 G4Fragment* G4EvaporationChannel::EmittedFragment(G4Fragment* theNucleus) 133 { 134 G4double ekin = ekinmax; 135 // assumed, that TotalProbability(...) was already called 136 // if value iz zero no possiblity to sample final state 137 if(resA > 4 && theProbability->GetProbability() > 0.0) { 138 ekin = theProbability->SampleEnergy(); 139 } 140 ekin = std::max(ekin, 0.0); 141 G4LorentzVector lv0 = theNucleus->GetMomentum(); 142 G4LorentzVector lv(std::sqrt(ekin*(ekin + 2.0*evapMass))*G4RandomDirection(), 143 ekin + evapMass); 144 lv.boost(lv0.boostVector()); 145 146 G4Fragment* evFragment = new G4Fragment(theA, theZ, lv); 147 evFragment->SetCreatorModelID(secID); 148 lv0 -= lv; 149 theNucleus->SetZAandMomentum(lv0, resZ, resA); 150 theNucleus->SetCreatorModelID(secID); 151 return evFragment; 152 } 153 154 G4double G4EvaporationChannel::ComputeInverseXSection(G4Fragment* frag, 155 G4double kinEnergy) 156 { 157 G4double p = ComputeProbability(frag, kinEnergy); 158 return (p > 0.0) ? theProbability->RecentXS() : 0.0; 159 } 160 161 G4double G4EvaporationChannel::ComputeProbability(G4Fragment* frag, 162 G4double kinEnergy) 163 { 164 G4double prob = GetEmissionProbability(frag); 165 if (prob <= 0.0) { return 0.0; } 166 167 bCoulomb = (theZ > 0) ? theCoulombBarrier->GetCoulombBarrier(resA, resZ, 0.0) : 0.0; 168 G4double p = theProbability->ComputeProbability(kinEnergy, bCoulomb); 169 return p; 170 } 171