Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4Evaporation.cc
Go to the documentation of this file.
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//
27// Hadronic Process: Nuclear De-excitations
28// by V. Lara (Oct 1998)
29//
30// Alex Howard - added protection for negative probabilities in the sum, 14/2/07
31//
32// Modif (03 September 2008) by J. M. Quesada for external choice of inverse
33// cross section option
34// JMQ (06 September 2008) Also external choices have been added for
35// superimposed Coulomb barrier (if useSICBis set true, by default is false)
36//
37// V.Ivanchenko (27 July 2009) added G4EvaporationDefaultGEMFactory option
38// V.Ivanchenko (10 May 2010) rewrited BreakItUp method: do not make new/delete
39// photon channel first, fission second,
40// added G4UnstableFragmentBreakUp to decay
41// unphysical fragments (like 2n or 2p),
42// use Z and A integer
43// V.Ivanchenko (22 April 2011) added check if a fragment can be deexcited
44// by the FermiBreakUp model
45// V.Ivanchenko (23 January 2012) added pointer of G4VPhotonEvaporation
46// V.Ivanchenko (6 May 2013) added check of existence of residual ion
47// in the ion table
48
49#include "G4Evaporation.hh"
50#include "G4SystemOfUnits.hh"
55#include "G4NistManager.hh"
56#include "G4VFermiBreakUp.hh"
59#include "G4ParticleTable.hh"
60#include "G4IonTable.hh"
61#include "G4NuclearLevelData.hh"
62#include "G4LevelManager.hh"
64#include "Randomize.hh"
65
67 : G4VEvaporation(),fVerbose(0),nChannels(0),minExcitation(0.1*keV),
68 isInitialised(false)
69{
70 if(photoEvaporation) { SetPhotonEvaporation(photoEvaporation); }
72
74 theChannelFactory = nullptr;
75
79 unstableBreakUp = new G4UnstableFragmentBreakUp();
80 /*
81 G4cout << "G4Evaporation() " << this << " thePhotonEvaporation: "
82 << photoEvaporation << " UnstableFragmentBreakUp: "
83 << unstableBreakUp << G4endl;
84 */
85}
86
88{
89 delete unstableBreakUp;
90}
91
93{
94 if(isInitialised) { return; }
95
96 G4DeexPrecoParameters* param = fLevelData->GetParameters();
97 minExcitation = param->GetMinExcitation();
98 fVerbose = param->GetVerbose();
99 unstableBreakUp->SetVerbose(fVerbose);
100
102 if(type == fCombined) { SetCombinedChannel(); }
103 else if(type == fGEM) { SetGEMChannel(); }
104 else if(type == fEvaporation) { SetDefaultChannel(); }
105 else if(type == fGEMVI) { SetGEMVIChannel(); }
106
107 isInitialised = true;
108}
109
110void G4Evaporation::InitialiseChannelFactory()
111{
113 nChannels = theChannels->size();
114 probabilities.resize(nChannels, 0.0);
115
116 if(fVerbose > 1) {
117 G4cout << "### G4Evaporation::InitialiseChannelFactory for "
118 << nChannels << " channels " << this << G4endl;
119 }
120 for(size_t i=0; i<nChannels; ++i) {
121 (*theChannels)[i]->SetOPTxs(OPTxs);
122 (*theChannels)[i]->Initialise();
123 }
124}
125
127{
132 delete theChannelFactory;
133 }
135 InitialiseChannelFactory();
136 }
137}
138
140{
141 if(fGEM != channelType) {
145 delete theChannelFactory;
146 }
148 InitialiseChannelFactory();
149 }
150}
151
153{
154 if(fGEMVI != channelType) {
158 delete theChannelFactory;
159 }
161 InitialiseChannelFactory();
162 }
163}
164
166{
167 if(fCombined != channelType) {
171 delete theChannelFactory;
172 }
175 InitialiseChannelFactory();
176 }
177}
178
180 G4Fragment* theResidualNucleus)
181{
182 if(!isInitialised) { InitialiseChannels(); }
183
184 G4double totprob, prob, oldprob = 0.0;
185 size_t maxchannel, i;
186
187 G4int Amax = theResidualNucleus->GetA_asInt();
188 if(fVerbose > 1) {
189 G4cout << "### G4Evaporation::BreakItUp loop" << G4endl;
190 }
191 CLHEP::HepRandomEngine* rndm = G4Random::getTheEngine();
192
193 // Starts loop over evaporated particles, loop is limited by number
194 // of nucleons
195 for(G4int ia=0; ia<Amax; ++ia) {
196
197 // g,n,p and light fragments - evaporation is finished
198 G4int Z = theResidualNucleus->GetZ_asInt();
199 G4int A = theResidualNucleus->GetA_asInt();
200 if(A <= 1) { break; }
201 G4double Eex = theResidualNucleus->GetExcitationEnergy();
202
203 // stop deecitation loop if residual can be deexcited by FBU
204 if(theFBU->IsApplicable(Z, A, Eex)) { break; }
205
206 // check if it is stable, then finish evaporation
207 G4double abun = nist->GetIsotopeAbundance(Z, A);
208 // stop deecitation loop in the case of a cold stable fragment
209 if(Eex <= minExcitation &&
210 (abun > 0.0 || (A == 3 && (Z == 1 || Z == 2)))) { break; }
211
212 totprob = 0.0;
213 maxchannel = nChannels;
214 if(fVerbose > 1) {
215 G4cout << "Evaporation# " << ia << " Z= " << Z << " A= " << A
216 << " Eex(MeV)= " << theResidualNucleus->GetExcitationEnergy()
217 << " aban= " << abun << G4endl;
218 }
219 // loop over evaporation channels
220 for(i=0; i<nChannels; ++i) {
221 prob = (*theChannels)[i]->GetEmissionProbability(theResidualNucleus);
222 if(fVerbose > 1 && prob > 0.0) {
223 G4cout << " Channel# " << i << " prob= " << prob << G4endl;
224 }
225 totprob += prob;
226 probabilities[i] = totprob;
227
228 // if two recent probabilities are near zero stop computations
229 if(i>=8 && prob > 0.0) {
230 if(prob <= totprob*1.e-8 && oldprob <= totprob*1.e-8) {
231 maxchannel = i+1;
232 break;
233 }
234 }
235 oldprob = prob;
236 }
237
238 // photon evaporation in the case of no other channels available
239 // do evaporation chain and return back ground state fragment
240 if(0.0 < totprob && probabilities[0] == totprob) {
241 if(fVerbose > 1) {
242 G4cout << "$$$ Start chain of gamma evaporation" << G4endl;
243 }
244 (*theChannels)[0]->BreakUpChain(theResult, theResidualNucleus);
245
246 // release residual stable fragment
247 if(abun > 0.0) {
248 theResidualNucleus->SetLongLived(true);
249 break;
250 }
251 // release residual fragment known to FBU
252 Eex = theResidualNucleus->GetExcitationEnergy();
253 if(theFBU->IsApplicable(Z, A, Eex)) { break; }
254
255 // release residual fragment with non-zero life time
256 if(theResidualNucleus->IsLongLived()) { break; }
257 totprob = 0.0;
258 }
259
260 if(0.0 == totprob && A < 30) {
261 // if residual fragment is exotic, then it forced to decay
262 // if success, then decay product is added to results
263 if(fVerbose > 1) {
264 G4cout << "$$$ Decay exotic fragment" << G4endl;
265 }
266 if(unstableBreakUp->BreakUpChain(theResult, theResidualNucleus)) {
267 continue;
268 }
269 // release if it is not possible to decay
270 break;
271 }
272
273 // select channel
274 totprob *= rndm->flat();
275
276 // loop over evaporation channels
277 for(i=0; i<maxchannel; ++i) { if(probabilities[i] >= totprob) { break; } }
278
279 if(fVerbose > 1) { G4cout << "$$$ Channel # " << i << G4endl; }
280 G4Fragment* frag = (*theChannels)[i]->EmittedFragment(theResidualNucleus);
281 if(fVerbose > 2 && frag) { G4cout << " " << *frag << G4endl; }
282
283 // normaly a fragment should be created
284 if(nullptr != frag) { theResult->push_back(frag); }
285 else { break; }
286 }
287}
@ fEvaporation
std::vector< G4Fragment * > G4FragmentVector
Definition: G4Fragment.hh:65
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
const G4double A[17]
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
virtual double flat()=0
G4DeexChannelType GetDeexChannelsType() const
G4double GetMinExcitation() const
G4Evaporation(G4VEvaporationChannel *photoEvaporation=nullptr)
virtual void InitialiseChannels() final
void SetGEMChannel()
void SetDefaultChannel()
void SetCombinedChannel()
virtual ~G4Evaporation()
void SetGEMVIChannel()
virtual void BreakFragment(G4FragmentVector *, G4Fragment *theNucleus) final
G4double GetExcitationEnergy() const
Definition: G4Fragment.hh:312
G4bool IsLongLived() const
Definition: G4Fragment.hh:448
G4int GetZ_asInt() const
Definition: G4Fragment.hh:289
void SetLongLived(G4bool value)
Definition: G4Fragment.hh:453
G4int GetA_asInt() const
Definition: G4Fragment.hh:284
static G4NistManager * Instance()
G4double GetIsotopeAbundance(G4int Z, G4int N) const
G4DeexPrecoParameters * GetParameters()
static G4NuclearLevelData * GetInstance()
G4IonTable * GetIonTable() const
static G4ParticleTable * GetParticleTable()
virtual G4bool BreakUpChain(G4FragmentVector *, G4Fragment *) final
virtual std::vector< G4VEvaporationChannel * > * GetChannel()=0
G4VFermiBreakUp * theFBU
G4VEvaporationChannel * thePhotonEvaporation
virtual void SetPhotonEvaporation(G4VEvaporationChannel *ptr)
G4VEvaporationFactory * theChannelFactory
std::vector< G4VEvaporationChannel * > * theChannels
virtual G4bool IsApplicable(G4int Z, G4int A, G4double mass) const =0