#include <G4Evaporation.hh>
Inheritance diagram for G4Evaporation:
Public Member Functions | |
G4Evaporation () | |
G4Evaporation (G4VEvaporationChannel *photoEvaporation) | |
virtual | ~G4Evaporation () |
virtual void | Initialise () |
G4FragmentVector * | BreakItUp (const G4Fragment &theNucleus) |
void | SetDefaultChannel () |
void | SetGEMChannel () |
void | SetCombinedChannel () |
virtual void | SetPhotonEvaporation (G4VEvaporationChannel *ptr) |
Definition at line 53 of file G4Evaporation.hh.
G4Evaporation::G4Evaporation | ( | ) |
Definition at line 59 of file G4Evaporation.cc.
References SetPhotonEvaporation(), and G4VEvaporation::thePhotonEvaporation.
00060 : theChannels(0),nChannels(0) 00061 { 00062 SetPhotonEvaporation(new G4PhotonEvaporation()); 00063 theChannelFactory = new G4EvaporationDefaultGEMFactory(thePhotonEvaporation); 00064 SetParameters(); 00065 InitialiseEvaporation(); 00066 }
G4Evaporation::G4Evaporation | ( | G4VEvaporationChannel * | photoEvaporation | ) |
Definition at line 68 of file G4Evaporation.cc.
References SetPhotonEvaporation(), and G4VEvaporation::thePhotonEvaporation.
00069 : theChannels(0),nChannels(0) 00070 { 00071 if(photoEvaporation) { SetPhotonEvaporation(photoEvaporation); } 00072 else { SetPhotonEvaporation(new G4PhotonEvaporation()); } 00073 00074 theChannelFactory = new G4EvaporationDefaultGEMFactory(thePhotonEvaporation); 00075 SetParameters(); 00076 InitialiseEvaporation(); 00077 }
G4Evaporation::~G4Evaporation | ( | ) | [virtual] |
Definition at line 99 of file G4Evaporation.cc.
References G4VEvaporation::thePhotonEvaporation.
00100 { 00101 CleanChannels(); 00102 delete thePhotonEvaporation; 00103 delete theChannelFactory; 00104 }
G4FragmentVector * G4Evaporation::BreakItUp | ( | const G4Fragment & | theNucleus | ) | [virtual] |
Implements G4VEvaporation.
Definition at line 165 of file G4Evaporation.cc.
References G4UnstableFragmentBreakUp::BreakUpFragment(), G4UniformRand, G4Fragment::GetA_asInt(), G4Fragment::GetExcitationEnergy(), G4NistManager::GetIsotopeAbundance(), and G4Fragment::GetZ_asInt().
00166 { 00167 G4FragmentVector * theResult = new G4FragmentVector; 00168 G4FragmentVector * theTempResult; 00169 const G4double Elimit = 3*MeV; 00170 00171 // The residual nucleus (after evaporation of each fragment) 00172 G4Fragment* theResidualNucleus = new G4Fragment(theNucleus); 00173 00174 G4double totprob, prob, oldprob = 0.0; 00175 size_t maxchannel, i; 00176 00177 G4int Amax = theResidualNucleus->GetA_asInt(); 00178 00179 // Starts loop over evaporated particles, loop is limited by number 00180 // of nucleons 00181 for(G4int ia=0; ia<Amax; ++ia) { 00182 00183 // g,n,p and light fragments - evaporation is finished 00184 G4int Z = theResidualNucleus->GetZ_asInt(); 00185 G4int A = theResidualNucleus->GetA_asInt(); 00186 00187 // stop deecitation loop if can be deexcited by FBU 00188 if(maxZforFBU > Z && maxAforFBU >= A) { 00189 theResult->push_back(theResidualNucleus); 00190 return theResult; 00191 } 00192 00193 // check if it is stable, then finish evaporation 00194 G4double abun = nist->GetIsotopeAbundance(Z, A); 00195 /* 00196 G4cout << "### G4Evaporation::BreakItUp step " << ia << " Z= " << Z 00197 << " A= " << A << " Eex(MeV)= " 00198 << theResidualNucleus->GetExcitationEnergy() 00199 << " aban= " << abun << G4endl; 00200 */ 00201 // stop deecitation loop in the case of the cold stable fragment 00202 G4double Eex = theResidualNucleus->GetExcitationEnergy(); 00203 if(Eex <= minExcitation && abun > 0.0) { 00204 theResult->push_back(theResidualNucleus); 00205 return theResult; 00206 } 00207 00208 totprob = 0.0; 00209 maxchannel = nChannels; 00210 /* 00211 G4cout << "### Evaporation loop #" << ia 00212 << " Fragment: " << theResidualNucleus << G4endl; 00213 */ 00214 // loop over evaporation channels 00215 for(i=0; i<nChannels; ++i) { 00216 prob = (*theChannels)[i]->GetEmissionProbability(theResidualNucleus); 00217 //G4cout << " Channel# " << i << " prob= " << prob << G4endl; 00218 00219 totprob += prob; 00220 probabilities[i] = totprob; 00221 // if two recent probabilities are near zero stop computations 00222 if(i>=8) { 00223 if(prob <= totprob*1.e-8 && oldprob <= totprob*1.e-8) { 00224 maxchannel = i+1; 00225 break; 00226 } 00227 } 00228 oldprob = prob; 00229 // protection for very excited fragment - avoid GEM 00230 if(7 == i && Eex > Elimit*A) { 00231 maxchannel = 8; 00232 break; 00233 } 00234 } 00235 00236 // photon evaporation in the case of no other channels available 00237 // do evaporation chain and reset total probability 00238 if(0.0 < totprob && probabilities[0] == totprob) { 00239 //G4cout << "Start gamma evaporation" << G4endl; 00240 theTempResult = (*theChannels)[0]->BreakUpFragment(theResidualNucleus); 00241 if(theTempResult) { 00242 size_t nsec = theTempResult->size(); 00243 for(size_t j=0; j<nsec; ++j) { 00244 theResult->push_back((*theTempResult)[j]); 00245 } 00246 delete theTempResult; 00247 } 00248 totprob = 0.0; 00249 } 00250 00251 // stable fragnent - evaporation is finished 00252 if(0.0 == totprob) { 00253 00254 // if fragment is exotic, then try to decay it 00255 if(0.0 == abun && Z < 20) { 00256 //G4cout << "$$$ Decay exotic fragment" << G4endl; 00257 theTempResult = unstableBreakUp.BreakUpFragment(theResidualNucleus); 00258 if(theTempResult) { 00259 size_t nsec = theTempResult->size(); 00260 for(size_t j=0; j<nsec; ++j) { 00261 theResult->push_back((*theTempResult)[j]); 00262 } 00263 delete theTempResult; 00264 } 00265 } 00266 00267 // save residual fragment 00268 theResult->push_back(theResidualNucleus); 00269 return theResult; 00270 } 00271 00272 00273 // select channel 00274 totprob *= G4UniformRand(); 00275 // loop over evaporation channels 00276 for(i=0; i<maxchannel; ++i) { if(probabilities[i] >= totprob) { break; } } 00277 00278 // this should not happen 00279 if(i >= nChannels) { i = nChannels - 1; } 00280 00281 00282 // single photon evaporation, primary pointer is kept 00283 if(0 == i) { 00284 //G4cout << "Single gamma" << G4endl; 00285 G4Fragment* gamma = (*theChannels)[0]->EmittedFragment(theResidualNucleus); 00286 if(gamma) { theResult->push_back(gamma); } 00287 00288 // fission, return results to the main loop if fission is succesful 00289 } else if(1 == i) { 00290 //G4cout << "Fission" << G4endl; 00291 theTempResult = (*theChannels)[1]->BreakUp(*theResidualNucleus); 00292 if(theTempResult) { 00293 size_t nsec = theTempResult->size(); 00294 G4bool deletePrimary = true; 00295 for(size_t j=0; j<nsec; ++j) { 00296 if(theResidualNucleus == (*theTempResult)[j]) { deletePrimary = false; } 00297 theResult->push_back((*theTempResult)[j]); 00298 } 00299 if(deletePrimary) { delete theResidualNucleus; } 00300 delete theTempResult; 00301 return theResult; 00302 } 00303 00304 // other channels 00305 } else { 00306 //G4cout << "Channel # " << i << G4endl; 00307 theTempResult = (*theChannels)[i]->BreakUp(*theResidualNucleus); 00308 if(theTempResult) { 00309 size_t nsec = theTempResult->size(); 00310 if(nsec > 0) { 00311 --nsec; 00312 for(size_t j=0; j<nsec; ++j) { 00313 theResult->push_back((*theTempResult)[j]); 00314 } 00315 // if the residual change its pointer 00316 // then delete previous residual fragment and update to the new 00317 if(theResidualNucleus != (*theTempResult)[nsec] ) { 00318 delete theResidualNucleus; 00319 theResidualNucleus = (*theTempResult)[nsec]; 00320 } 00321 } 00322 delete theTempResult; 00323 } 00324 } 00325 } 00326 00327 // loop is stopped, save residual 00328 theResult->push_back(theResidualNucleus); 00329 00330 return theResult; 00331 }
void G4Evaporation::Initialise | ( | ) | [virtual] |
Reimplemented from G4VEvaporation.
Definition at line 130 of file G4Evaporation.cc.
References G4VEvaporation::OPTxs, G4VEvaporation::SetOPTxs(), and G4VEvaporation::useSICB.
00131 { 00132 for(size_t i=0; i<nChannels; ++i) { 00133 (*theChannels)[i]->SetOPTxs(OPTxs); 00134 (*theChannels)[i]->UseSICB(useSICB); 00135 } 00136 }
void G4Evaporation::SetCombinedChannel | ( | ) |
Definition at line 152 of file G4Evaporation.cc.
References G4VEvaporation::thePhotonEvaporation.
00153 { 00154 delete theChannelFactory; 00155 theChannelFactory = new G4EvaporationDefaultGEMFactory(thePhotonEvaporation); 00156 InitialiseEvaporation(); 00157 }
void G4Evaporation::SetDefaultChannel | ( | ) |
Definition at line 138 of file G4Evaporation.cc.
References G4VEvaporation::thePhotonEvaporation.
00139 { 00140 delete theChannelFactory; 00141 theChannelFactory = new G4EvaporationFactory(thePhotonEvaporation); 00142 InitialiseEvaporation(); 00143 }
void G4Evaporation::SetGEMChannel | ( | ) |
Definition at line 145 of file G4Evaporation.cc.
References G4VEvaporation::thePhotonEvaporation.
00146 { 00147 delete theChannelFactory; 00148 theChannelFactory = new G4EvaporationGEMFactory(thePhotonEvaporation); 00149 InitialiseEvaporation(); 00150 }
void G4Evaporation::SetPhotonEvaporation | ( | G4VEvaporationChannel * | ptr | ) | [virtual] |
Reimplemented from G4VEvaporation.
Definition at line 159 of file G4Evaporation.cc.
References G4VEvaporation::SetPhotonEvaporation().
Referenced by G4Evaporation().
00160 { 00161 if(ptr) { G4VEvaporation::SetPhotonEvaporation(ptr); } 00162 if(0 < nChannels) { (*theChannels)[0] = ptr; } 00163 }