- Timestamp:
- Jun 18, 2010, 11:42:07 AM (15 years ago)
- Location:
- trunk/source/processes/hadronic/models/de_excitation/gem_evaporation/src
- Files:
-
- 2 edited
-
G4EvaporationGEMFactory.cc (modified) (4 diffs)
-
G4GEMProbability.cc (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/processes/hadronic/models/de_excitation/gem_evaporation/src/G4EvaporationGEMFactory.cc
r1228 r1315 25 25 // 26 26 // 27 // $Id: G4EvaporationGEMFactory.cc,v 1. 9 2009/09/15 12:54:16 vnivanch Exp $28 // GEANT4 tag $Name: geant4-09-0 3$27 // $Id: G4EvaporationGEMFactory.cc,v 1.10 2010/04/27 11:43:16 vnivanch Exp $ 28 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 29 29 // 30 30 // Hadronic Process: Nuclear De-excitations … … 103 103 #include "G4PhotonEvaporation.hh" 104 104 105 const G4EvaporationGEMFactory & 106 G4EvaporationGEMFactory::operator=(const G4EvaporationGEMFactory & ) 107 { 108 throw G4HadronicException(__FILE__, __LINE__, "G4EvaporationGEMFactory::operator= meant to not be accessable."); 109 return *this; 110 } 111 112 G4bool 113 G4EvaporationGEMFactory::operator==(const G4EvaporationGEMFactory & ) const 114 { 115 throw G4HadronicException(__FILE__, __LINE__, "G4EvaporationGEMFactory::operator== meant to not be accessable."); 116 return false; 117 } 118 119 G4bool 120 G4EvaporationGEMFactory::operator!=(const G4EvaporationGEMFactory & ) const 121 { 122 throw G4HadronicException(__FILE__, __LINE__, "G4EvaporationGEMFactory::operator!= meant to not be accessable."); 123 return true; 124 } 105 G4EvaporationGEMFactory::G4EvaporationGEMFactory() 106 {} 107 108 G4EvaporationGEMFactory::~G4EvaporationGEMFactory() 109 {} 125 110 126 111 std::vector<G4VEvaporationChannel*> * G4EvaporationGEMFactory::CreateChannel() … … 129 114 new std::vector<G4VEvaporationChannel*>; 130 115 theChannel->reserve(68); 116 117 theChannel->push_back( new G4PhotonEvaporation() ); // Photon Channel 118 theChannel->push_back( new G4CompetitiveFission() ); // Fission Channel 131 119 132 120 theChannel->push_back( new G4NeutronGEMChannel() ); // n … … 197 185 theChannel->push_back( new G4Mg28GEMChannel() ); // Mg28 198 186 199 theChannel->push_back( new G4CompetitiveFission() ); // Fission Channel200 theChannel->push_back( new G4PhotonEvaporation() ); // Photon Channel201 202 187 return theChannel; 203 188 } -
trunk/source/processes/hadronic/models/de_excitation/gem_evaporation/src/G4GEMProbability.cc
r1196 r1315 24 24 // ******************************************************************** 25 25 // 26 // $Id: G4GEMProbability.cc,v 1.13 2010/05/19 10:21:16 vnivanch Exp $ 27 // GEANT4 tag $Name: geant4-09-04-beta-cand-01 $ 28 // 29 //--------------------------------------------------------------------- 30 // 31 // Geant4 class G4GEMProbability 32 // 33 // 34 // Hadronic Process: Nuclear De-excitations 35 // by V. Lara (Sept 2001) 26 36 // 27 37 // … … 35 45 // -InitialLeveldensity calculated according to the right conditions of the 36 46 // initial excited nucleus. 47 // J. M. Quesada 19/04/2010 fix in emission probability calculation. 48 // V.Ivanchenko 20/04/2010 added usage of G4Pow and use more safe computation 49 // V.Ivanchenko 18/05/2010 trying to speedup the most slow method 50 // by usage of G4Pow, integer Z and A; moved constructor, 51 // destructor and virtual functions to source 37 52 38 53 #include "G4GEMProbability.hh" 39 54 #include "G4PairingCorrection.hh" 40 41 42 43 G4GEMProbability::G4GEMProbability(const G4GEMProbability &) : G4VEmissionProbability() 44 { 45 throw G4HadronicException(__FILE__, __LINE__, "G4GEMProbability::copy_constructor meant to not be accessable"); 46 } 47 48 49 50 51 const G4GEMProbability & G4GEMProbability:: 52 operator=(const G4GEMProbability &) 53 { 54 throw G4HadronicException(__FILE__, __LINE__, "G4GEMProbability::operator= meant to not be accessable"); 55 return *this; 56 } 57 58 59 G4bool G4GEMProbability::operator==(const G4GEMProbability &) const 60 { 61 return false; 62 } 63 64 G4bool G4GEMProbability::operator!=(const G4GEMProbability &) const 65 { 66 return true; 55 #include "G4Pow.hh" 56 #include "G4IonTable.hh" 57 58 G4GEMProbability:: G4GEMProbability() : 59 theA(0), theZ(0), Spin(0.0), theCoulombBarrierPtr(0), 60 ExcitationEnergies(0), ExcitationSpins(0), ExcitationLifetimes(0), Normalization(1.0) 61 { 62 theEvapLDPptr = new G4EvaporationLevelDensityParameter; 63 fG4pow = G4Pow::GetInstance(); 64 fPairCorr = G4PairingCorrection::GetInstance(); 65 } 66 67 G4GEMProbability:: G4GEMProbability(const G4int anA, const G4int aZ, const G4double aSpin) : 68 theA(anA), theZ(aZ), Spin(aSpin), theCoulombBarrierPtr(0), 69 ExcitationEnergies(0), ExcitationSpins(0), ExcitationLifetimes(0), Normalization(1.0) 70 { 71 theEvapLDPptr = new G4EvaporationLevelDensityParameter; 72 fG4pow = G4Pow::GetInstance(); 73 fPairCorr = G4PairingCorrection::GetInstance(); 74 } 75 76 G4GEMProbability::~G4GEMProbability() 77 { 78 delete theEvapLDPptr; 79 } 80 81 G4double G4GEMProbability::CalcAlphaParam(const G4Fragment & ) const 82 { 83 return 1.0; 84 } 85 86 G4double G4GEMProbability::CalcBetaParam(const G4Fragment & ) const 87 { 88 return 1.0; 89 } 90 91 G4double G4GEMProbability::CCoeficient(const G4double ) const 92 { 93 return 0.0; 67 94 } 68 95 … … 80 107 if (ExcitationEnergies && ExcitationSpins && ExcitationLifetimes) { 81 108 G4double SavedSpin = Spin; 82 for ( unsigned int i = 0; i < ExcitationEnergies->size(); i++) {109 for (size_t i = 0; i < ExcitationEnergies->size(); ++i) { 83 110 Spin = ExcitationSpins->operator[](i); 84 111 // substract excitation energies … … 86 113 if (Tmax > 0.0) { 87 114 G4double width = CalcProbability(fragment,Tmax,CoulombBarrier); 115 //JMQ April 2010 added condition to prevent reported crash 88 116 // update probability 89 if (hbar_Planck*std::log(2.0)/width < ExcitationLifetimes->operator[](i)) { 117 if (width > 0. && 118 hbar_Planck*fG4pow->logZ(2) < width*ExcitationLifetimes->operator[](i)) { 90 119 EmissionProbability += width; 91 120 } … … 98 127 return EmissionProbability; 99 128 } 129 130 131 G4double G4GEMProbability::CalcProbability(const G4Fragment & fragment, 132 const G4double MaximalKineticEnergy, 133 const G4double V) 134 135 // Calculate integrated probability (width) for evaporation channel 136 { 137 G4int A = fragment.GetA_asInt(); 138 G4int Z = fragment.GetZ_asInt(); 139 140 G4int ResidualA = A - theA; 141 G4int ResidualZ = Z - theZ; 142 G4double U = fragment.GetExcitationEnergy(); 143 144 G4double NuclearMass = fragment.ComputeGroundStateMass(theZ, theA); 145 146 G4double Alpha = CalcAlphaParam(fragment); 147 G4double Beta = CalcBetaParam(fragment); 148 149 150 // ***RESIDUAL*** 151 //JMQ (September 2009) the following quantities refer to the RESIDUAL: 152 153 G4double delta0 = fPairCorr->GetPairingCorrection(ResidualA, ResidualZ); 154 155 G4double a = theEvapLDPptr->LevelDensityParameter(ResidualA, 156 ResidualZ,MaximalKineticEnergy+V-delta0); 157 G4double Ux = (2.5 + 150.0/G4double(ResidualA))*MeV; 158 G4double Ex = Ux + delta0; 159 G4double T = 1.0/(std::sqrt(a/Ux) - 1.5/Ux); 160 //JMQ fixed bug in units 161 G4double E0 = Ex - T*(std::log(T/MeV) - std::log(a*MeV)/4.0 - 1.25*std::log(Ux/MeV) + 2.0*std::sqrt(a*Ux)); 162 // ***end RESIDUAL *** 163 164 // ***PARENT*** 165 //JMQ (September 2009) the following quantities refer to the PARENT: 166 167 G4double deltaCN=fPairCorr->GetPairingCorrection(A, Z); 168 G4double aCN = theEvapLDPptr->LevelDensityParameter(A, Z, U-deltaCN); 169 G4double UxCN = (2.5 + 150.0/G4double(A))*MeV; 170 G4double ExCN = UxCN + deltaCN; 171 G4double TCN = 1.0/(std::sqrt(aCN/UxCN) - 1.5/UxCN); 172 //JMQ fixed bug in units 173 G4double E0CN = ExCN - TCN*(std::log(TCN/MeV) - std::log(aCN*MeV)/4.0 - 1.25*std::log(UxCN/MeV) + 2.0*std::sqrt(aCN*UxCN)); 174 // ***end PARENT*** 175 176 G4double Width; 177 G4double InitialLevelDensity; 178 G4double t = MaximalKineticEnergy/T; 179 if ( MaximalKineticEnergy < Ex ) { 180 //JMQ 190709 bug in I1 fixed (T was missing) 181 Width = (I1(t,t)*T + (Beta+V)*I0(t))/std::exp(E0/T); 182 //JMQ 160909 fix: InitialLevelDensity has been taken away 183 //(different conditions for initial CN..) 184 } else { 185 186 //VI minor speedup 187 G4double expE0T = std::exp(E0/T); 188 const G4double sqrt2 = std::sqrt(2.0); 189 190 G4double tx = Ex/T; 191 G4double s = 2.0*std::sqrt(a*(MaximalKineticEnergy-delta0)); 192 G4double sx = 2.0*std::sqrt(a*(Ex-delta0)); 193 Width = I1(t,tx)*T/expE0T + I3(s,sx)*std::exp(s)/(sqrt2*a); 194 // For charged particles (Beta+V) = 0 beacuse Beta = -V 195 if (theZ == 0) { 196 Width += (Beta+V)*(I0(tx)/expE0T + 2.0*sqrt2*I2(s,sx)*std::exp(s)); 197 } 198 } 199 200 //JMQ 14/07/2009 BIG BUG : NuclearMass is in MeV => hbarc instead of hbar_planck must be used 201 // G4double g = (2.0*Spin+1.0)*NuclearMass/(pi2* hbar_Planck*hbar_Planck); 202 G4double g = (2.0*Spin+1.0)*NuclearMass/(pi2* hbarc*hbarc); 203 204 //JMQ 190709 fix on Rb and geometrical cross sections according to Furihata's paper 205 // (JAERI-Data/Code 2001-105, p6) 206 // G4double RN = 0.0; 207 G4double Rb = 0.0; 208 if (theA > 4) 209 { 210 // G4double R1 = std::pow(ResidualA,1.0/3.0); 211 // G4double R2 = std::pow(G4double(theA),1.0/3.0); 212 G4double Ad = fG4pow->Z13(ResidualA); 213 G4double Aj = fG4pow->Z13(theA); 214 // RN = 1.12*(R1 + R2) - 0.86*((R1+R2)/(R1*R2)); 215 Rb = 1.12*(Aj + Ad) - 0.86*((Aj+Ad)/(Aj*Ad))+2.85; 216 Rb *= fermi; 217 } 218 else if (theA>1) 219 { 220 G4double Ad = fG4pow->Z13(ResidualA); 221 G4double Aj = fG4pow->Z13(theA); 222 Rb=1.5*(Aj+Ad)*fermi; 223 } 224 else 225 { 226 G4double Ad = fG4pow->Z13(ResidualA); 227 Rb = 1.5*Ad*fermi; 228 } 229 // G4double GeometricalXS = pi*RN*RN*std::pow(ResidualA,2./3.); 230 G4double GeometricalXS = pi*Rb*Rb; 231 //end of JMQ fix on Rb by 190709 232 233 234 235 //JMQ 160909 fix: initial level density must be calculated according to the 236 // conditions at the initial compound nucleus 237 // (it has been removed from previous "if" for the residual) 238 239 if ( U < ExCN ) 240 { 241 InitialLevelDensity = (pi/12.0)*std::exp((U-E0CN)/TCN)/TCN; 242 } 243 else 244 { 245 // InitialLevelDensity = (pi/12.0)*std::exp(2*std::sqrt(aCN*(U-deltaCN)))/std::pow(aCN*std::pow(U-deltaCN,5.0),1.0/4.0); 246 //VI speedup 247 G4double x = U-deltaCN; 248 G4double x2 = x*x; 249 G4double x3 = x2*x; 250 InitialLevelDensity = (pi/12.0)*std::exp(2*std::sqrt(aCN*x))/std::sqrt(std::sqrt(aCN*x2*x3)); 251 } 252 // 253 254 255 //JMQ 190709 BUG : pi instead of sqrt(pi) must be here according to Furihata's report: 256 // Width *= std::sqrt(pi)*g*GeometricalXS*Alpha/(12.0*InitialLevelDensity); 257 Width *= pi*g*GeometricalXS*Alpha/(12.0*InitialLevelDensity); 258 259 260 return Width; 261 } 262 263 /* 100 264 101 265 G4double G4GEMProbability::CalcProbability(const G4Fragment & fragment, … … 219 383 return Width; 220 384 } 221 222 223 224 225 G4double G4GEMProbability::I0(const G4double t) 226 { 227 G4double result = (std::exp(t) - 1.0); 228 return result; 229 } 230 231 G4double G4GEMProbability::I1(const G4double t, const G4double tx) 232 { 233 G4double result = t - tx + 1.0; 234 result *= std::exp(tx); 235 result -= (t + 1.0); 236 return result; 237 } 238 239 240 G4double G4GEMProbability::I2(const G4double s, const G4double sx) 241 { 242 G4double S = 1.0/std::sqrt(s); 243 G4double Sx = 1.0/std::sqrt(sx); 244 245 G4double p1 = S*S*S*( 1.0 + S*S*( 1.5 + 3.75*S*S) ); 246 G4double p2 = Sx*Sx*Sx*( 1.0 + Sx*Sx*( 1.5 + 3.75*Sx*Sx) )*std::exp(sx-s); 247 248 return p1-p2; 249 } 385 */ 250 386 251 387 G4double G4GEMProbability::I3(const G4double s, const G4double sx)
Note:
See TracChangeset
for help on using the changeset viewer.
