175{
177
178 G4double totprob, prob, oldprob = 0.0;
179 size_t maxchannel, i;
180
181 G4int Amax = theResidualNucleus->GetA_asInt();
182 if(fVerbose > 1) {
183 G4cout <<
"### G4Evaporation::BreakItUp loop" <<
G4endl;
184 }
186
187
188
189 for(
G4int ia=0; ia<Amax; ++ia) {
190
191
192 G4int Z = theResidualNucleus->GetZ_asInt();
193 G4int A = theResidualNucleus->GetA_asInt();
194 if(
A <= 1) {
break; }
195 G4double Eex = theResidualNucleus->GetExcitationEnergy();
196
197
199
200
202
203 if(Eex <= minExcitation &&
204 (abun > 0.0 || (
A == 3 && (Z == 1 || Z == 2)))) {
break; }
205
206 totprob = 0.0;
207 maxchannel = nChannels;
208 if(fVerbose > 1) {
209 G4cout <<
"Evaporation# " << ia <<
" Z= " << Z <<
" A= " <<
A
210 << " Eex(MeV)= " << theResidualNucleus->GetExcitationEnergy()
211 <<
" aban= " << abun <<
G4endl;
212 }
213
214 for(i=0; i<nChannels; ++i) {
215 prob = (*theChannels)[i]->GetEmissionProbability(theResidualNucleus);
216 if(fVerbose > 1 && prob > 0.0) {
217 G4cout <<
" Channel# " << i <<
" prob= " << prob <<
G4endl;
218 }
219 totprob += prob;
220 probabilities[i] = totprob;
221
222
223 if(i>=8 && prob > 0.0) {
224 if(prob <= totprob*1.e-8 && oldprob <= totprob*1.e-8) {
225 maxchannel = i+1;
226 break;
227 }
228 }
229 oldprob = prob;
230 }
231
232
233
234 if(0.0 < totprob && probabilities[0] == totprob) {
235 if(fVerbose > 1) {
236 G4cout <<
"$$$ Start chain of gamma evaporation" <<
G4endl;
237 }
238 (*theChannels)[0]->BreakUpChain(theResult, theResidualNucleus);
239
240
241 if(abun > 0.0) {
242 theResidualNucleus->SetLongLived(true);
243 break;
244 }
245
246 Eex = theResidualNucleus->GetExcitationEnergy();
248
249
250 if(theResidualNucleus->IsLongLived()) { break; }
251 totprob = 0.0;
252 }
253
254 if(0.0 == totprob &&
A < 30) {
255
256
257 if(fVerbose > 1) {
259 }
260 if(unstableBreakUp->
BreakUpChain(theResult, theResidualNucleus)) {
261 continue;
262 }
263
264 break;
265 }
266
267
268 totprob *= rndm->
flat();
269
270
271 for (i=0; i<maxchannel; ++i) {
272 if (probabilities[i] >= totprob) { break; }
273 }
274
275 if(fVerbose > 1) {
G4cout <<
"$$$ Channel # " << i <<
G4endl; }
276 G4Fragment* frag = (*theChannels)[i]->EmittedFragment(theResidualNucleus);
277 if(fVerbose > 2 && frag) {
G4cout <<
" " << *frag <<
G4endl; }
278
279
280 if(nullptr != frag) { theResult->push_back(frag); }
281 else { break; }
282 }
283}
G4GLOB_DLL std::ostream G4cout
void InitialiseChannels() override
G4double GetIsotopeAbundance(G4int Z, G4int N) const
virtual G4bool BreakUpChain(G4FragmentVector *, G4Fragment *) final
virtual G4bool IsApplicable(G4int Z, G4int A, G4double eexc) const =0