178{
179
180
181
182
183
185 fragmentVector->clear();
186
187
188
189
193 if (verboseLevel >= 2)
194 {
195 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
196 <<"oooooooooooooooooooooooooooooooooooooooo"
200 G4cout <<
"Initial prefragment A=" <<
A
201 <<", Z=" <<Z
202 <<", excitation energy = " <<ex/MeV <<" MeV"
204 }
205
206
207
208
209
210
211 if (A == 0)
212 {
213 if (verboseLevel >= 2)
214 {
216 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
217 <<"oooooooooooooooooooooooooooooooooooooooo"
219 }
220 return fragmentVector;
221 }
222 else if (A == 1)
223 {
225 lorentzVector.
setE(lorentzVector.
e()-ex+10.0*eV);
226 if (Z == 0)
227 {
229 fragmentVector->push_back(fragment);
230 }
231 else
232 {
234 fragmentVector->push_back(fragment);
235 }
236 if (verboseLevel >= 2)
237 {
238 G4cout <<
"Final fragment is in fact only a nucleon) :" <<
G4endl;
240 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
241 <<"oooooooooooooooooooooooooooooooooooooooo"
243 }
244 return fragmentVector;
245 }
246
247
248
249
250
252 if (DAabl > A) DAabl =
A;
253
254
255
256
257
258
259
260
261
264
265 if (AF > 0)
266 {
270 G4int minZ = std::max(1, Z - DAabl);
271
272
273
274
275
276 G4int zmax = std::min(199, Z);
278 for (ZF=minZ; ZF<=zmax; ++ZF)
279 {
280 sum +=
G4Exp(-R*g4calc->
powA(std::abs(ZF - 0.486*AFd + 3.8E-04*AFd*AFd),1.5));
281 fSig[ZF] = sum;
282 }
283
284
285
286
288 for (ZF=minZ; ZF<=zmax; ++ZF) {
289 if(sum <= fSig[ZF]) { break; }
290 }
291 }
292 G4int DZabl = Z - ZF;
293
294
295
296
297
298
299
300
302 evapType.clear();
303 for (
G4int ift=0; ift<nFragTypes; ift++)
304 {
308 if (fragType[ift]->GetPDGCharge() > 0.0)
311 if (n > 0.0)
312 {
315 {
316 totalEpost += mass;
317 evapType.push_back(type);
318 }
321 }
322 }
323
324
325
326
327
328
329
330
332 if (AF > 0)
334 GetIonMass(ZF,AF);
335 else
336 {
340 evapType.erase(evapType.end()-1);
341 }
342 totalEpost += massFinalFrag;
343
344
345
346
347 if (verboseLevel >= 2)
348 {
349 G4cout <<
"Final fragment A=" <<AF
350 <<", Z=" <<ZF
352 for (
G4int ift=0; ift<nFragTypes; ift++)
353 {
355 G4int n = std::count(evapType.begin(),evapType.end(),type);
356 if (n > 0)
358 <<
", number of particles emitted = " <<
n <<
G4endl;
359 }
360 }
361
362
363
364
365
367 G4double totalEpre = massPreFrag + ex;
368 G4double excess = totalEpre - totalEpost;
369
373 if (produceSecondaries && evapType.size()>0)
374 {
375 if (excess > 0.0)
376 {
377 SelectSecondariesByEvaporation (resultNucleus);
378 nEvap = fragmentVector->size();
380 if (evapType.size() > 0)
381 SelectSecondariesByDefault (boost);
382 }
383 else
385 }
386
387 if (AF > 0)
388 {
390 GetIonMass(ZF,AF);
392 G4double p = std::sqrt(e*e-mass*mass);
395 lorentzVector.
boost(-boost);
397 fragmentVector->push_back(frag);
398 }
399 delete resultNucleus;
400
401
402
403
404 if (verboseLevel >= 2)
405 {
406 if (nEvap > 0)
407 {
411 }
413 G4FragmentVector::iterator iter;
414 for (iter = fragmentVector->begin(); iter != fragmentVector->end(); iter++)
415 {
416 if (ie == nEvap)
417 {
418
422 }
424 }
425 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
426 <<"oooooooooooooooooooooooooooooooooooooooo"
428 }
429
430 return fragmentVector;
431}
double A(double temperature)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
std::vector< G4Fragment * > G4FragmentVector
CLHEP::HepLorentzVector G4LorentzVector
CLHEP::Hep3Vector G4ThreeVector
G4GLOB_DLL std::ostream G4cout
HepLorentzVector & boost(double, double, double)
Hep3Vector findBoostToCM() const
G4double GetGroundStateMass() const
G4double GetExcitationEnergy() const
const G4LorentzVector & GetMomentum() const
G4double GetPDGMass() const
G4double GetPDGCharge() const
G4int GetBaryonNumber() const
const G4String & GetParticleName() const
G4IonTable * GetIonTable() const
static G4ParticleTable * GetParticleTable()
static G4Pow * GetInstance()
G4double powZ(G4int Z, G4double y) const
G4double powA(G4double A, G4double y) const