152 for(
G4int i=0; i<200; ++i) {
fSig[i] = 0.0; }
185 fragmentVector->clear();
193 if (verboseLevel >= 2)
195 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
196 <<
"oooooooooooooooooooooooooooooooooooooooo"
200 G4cout <<
"Initial prefragment A=" <<A
202 <<
", excitation energy = " <<ex/
MeV <<
" MeV"
213 if (verboseLevel >= 2)
216 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
217 <<
"oooooooooooooooooooooooooooooooooooooooo"
220 return fragmentVector;
225 lorentzVector.
setE(lorentzVector.
e()-ex+10.0*
eV);
229 fragmentVector->push_back(fragment);
234 fragmentVector->push_back(fragment);
236 if (verboseLevel >= 2)
238 G4cout <<
"Final fragment is in fact only a nucleon) :" <<
G4endl;
240 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
241 <<
"oooooooooooooooooooooooooooooooooooooooo"
244 return fragmentVector;
252 if (DAabl > A) DAabl =
A;
262 G4int AF = A - DAabl;
278 for (ZF=minZ; ZF<=zmax; ++ZF)
280 sum +=
G4Exp(-R*g4calc->
powA(std::abs(ZF - 0.486*AFd + 3.8E-04*AFd*AFd),1.5));
288 for (ZF=minZ; ZF<=zmax; ++ZF) {
289 if(sum <= fSig[ZF]) {
break; }
292 G4int DZabl = Z - ZF;
303 for (
G4int ift=0; ift<nFragTypes; ift++)
308 if (fragType[ift]->GetPDGCharge() > 0.0)
317 evapType.push_back(type);
340 evapType.erase(evapType.end()-1);
342 totalEpost += massFinalFrag;
347 if (verboseLevel >= 2)
349 G4cout <<
"Final fragment A=" <<AF
352 for (
G4int ift=0; ift<nFragTypes; ift++)
355 G4int n = std::count(evapType.begin(),evapType.end(),type);
358 <<
", number of particles emitted = " <<n <<
G4endl;
367 G4double totalEpre = massPreFrag + ex;
368 G4double excess = totalEpre - totalEpost;
373 if (produceSecondaries && evapType.size()>0)
377 SelectSecondariesByEvaporation (resultNucleus);
378 nEvap = fragmentVector->size();
380 if (evapType.size() > 0)
381 SelectSecondariesByDefault (boost);
395 lorentzVector.
boost(-boost);
397 fragmentVector->push_back(frag);
399 delete resultNucleus;
404 if (verboseLevel >= 2)
413 G4FragmentVector::iterator iter;
414 for (iter = fragmentVector->begin(); iter != fragmentVector->end(); iter++)
425 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
426 <<
"oooooooooooooooooooooooooooooooooooooooo"
430 return fragmentVector;
437 G4Fragment theResidualNucleus = *intermediateNucleus;
440 while (evaporate && evapType.size() != 0)
448 std::vector <G4VEvaporationChannel*> theChannels1;
449 theChannels1.clear();
450 std::vector <G4VEvaporationChannel*>::iterator i;
451 VectorOfFragmentTypes::iterator iter;
452 std::vector <VectorOfFragmentTypes::iterator> iters;
454 iter = std::find(evapType.begin(), evapType.end(),
G4Alpha::Alpha());
455 if (iter != evapType.end())
458 i = theChannels1.end() - 1;
459 (*i)->SetOPTxs(OPTxs);
460 (*i)->UseSICB(useSICB);
462 iters.push_back(iter);
464 iter = std::find(evapType.begin(), evapType.end(),
G4He3::He3());
465 if (iter != evapType.end())
468 i = theChannels1.end() - 1;
469 (*i)->SetOPTxs(OPTxs);
470 (*i)->UseSICB(useSICB);
472 iters.push_back(iter);
475 if (iter != evapType.end())
478 i = theChannels1.end() - 1;
479 (*i)->SetOPTxs(OPTxs);
480 (*i)->UseSICB(useSICB);
482 iters.push_back(iter);
485 if (iter != evapType.end())
488 i = theChannels1.end() - 1;
489 (*i)->SetOPTxs(OPTxs);
490 (*i)->UseSICB(useSICB);
492 iters.push_back(iter);
495 if (iter != evapType.end())
498 i = theChannels1.end() - 1;
499 (*i)->SetOPTxs(OPTxs);
500 (*i)->UseSICB(useSICB);
502 iters.push_back(iter);
505 if (iter != evapType.end())
508 i = theChannels1.end() - 1;
509 (*i)->SetOPTxs(OPTxs);
510 (*i)->UseSICB(useSICB);
512 iters.push_back(iter);
514 G4int nChannels = theChannels1.size();
519 std::vector<G4VEvaporationChannel*>::iterator iterEv;
520 for (iterEv=theChannels1.begin(); iterEv!=theChannels1.end(); iterEv++) {
521 totalProb += (*iterEv)->GetEmissionProbability(intermediateNucleus);
522 probEvapType[ich] = totalProb;
525 if (totalProb > 0.0) {
534 for (ii=0; ii<nChannels; ii++) {
535 if (xi < probEvapType[ii]) {
break; }
537 if (ii >= nChannels) { ii = nChannels - 1; }
539 BreakUpFragment(intermediateNucleus);
540 fragmentVector->push_back((*evaporationResult)[0]);
541 intermediateNucleus = (*evaporationResult)[1];
542 delete evaporationResult;
561 for (
unsigned i=0; i<
evapType.size(); i++)
568 G4double sintheta = std::sqrt((1.0 - costheta)*(1.0 + costheta));
570 G4ThreeVector direction(sintheta*std::cos(phi),sintheta*std::sin(phi),costheta);
572 lorentzVector.
boost(-boost);
590 G4cout <<
" *****************************************************************"
592 G4cout <<
" Nuclear ablation model for nuclear-nuclear interactions activated"
594 G4cout <<
" (Written by QinetiQ Ltd for the European Space Agency)"
596 G4cout <<
" !!! WARNING: This model is not well validation and should not be used for accurate simulation !!!"
598 G4cout <<
" *****************************************************************"
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
T max(const T t1, const T t2)
brief Return the largest of the two arguments
const G4LorentzVector & GetMomentum() const
CLHEP::Hep3Vector G4ThreeVector
std::vector< G4VEvaporationChannel * > * theChannels
static G4ParticleTable * GetParticleTable()
static constexpr double MeV
Hep3Vector findBoostToCM() const
G4bool produceSecondaries
const G4String & GetParticleName() const
VectorOfFragmentTypes evapType
G4IonTable * GetIonTable() const
G4double GetPDGCharge() const
static G4Proton * Proton()
G4double GetGroundStateMass() const
G4VEvaporationFactory * theChannelFactory
G4double GetPDGMass() const
static G4Deuteron * Deuteron()
void SelectSecondariesByDefault(G4ThreeVector)
G4double powZ(G4int Z, G4double y) const
G4ParticleDefinition * fragType[6]
static G4Pow * GetInstance()
G4double powA(G4double A, G4double y) const
G4int GetBaryonNumber() const
static constexpr double twopi
G4FragmentVector * fragmentVector
double A(double temperature)
static constexpr double eV
static constexpr double rad
void PrintWelcomeMessage()
static G4Triton * Triton()
static G4Neutron * Neutron()
G4FragmentVector * BreakItUp(const G4Fragment &theNucleus)
G4GLOB_DLL std::ostream G4cout
CLHEP::HepLorentzVector G4LorentzVector
G4double GetExcitationEnergy() const
double B(double temperature)
std::vector< G4Fragment * > G4FragmentVector
void SelectSecondariesByEvaporation(G4Fragment *)
virtual std::vector< G4VEvaporationChannel * > * GetChannel()=0
virtual ~G4WilsonAblationModel()
HepLorentzVector & boost(double, double, double)
T min(const T t1, const T t2)
brief Return the smallest of the two arguments