149 for(
G4int i=0; i<200; ++i) {
fSig[i] = 0.0; }
182 fragmentVector->clear();
190 if (verboseLevel >= 2)
192 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
193 <<
"oooooooooooooooooooooooooooooooooooooooo"
197 G4cout <<
"Initial prefragment A=" <<A
199 <<
", excitation energy = " <<ex/
MeV <<
" MeV"
210 if (verboseLevel >= 2)
213 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
214 <<
"oooooooooooooooooooooooooooooooooooooooo"
217 return fragmentVector;
222 lorentzVector.setE(lorentzVector.e()-ex+10.0*
eV);
226 fragmentVector->push_back(fragment);
231 fragmentVector->push_back(fragment);
233 if (verboseLevel >= 2)
235 G4cout <<
"Final fragment is in fact only a nucleon) :" <<
G4endl;
237 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
238 <<
"oooooooooooooooooooooooooooooooooooooooo"
241 return fragmentVector;
249 if (DAabl > A) DAabl =
A;
259 G4int AF = A - DAabl;
275 for (ZF=minZ; ZF<=zmax; ++ZF)
277 sum +=
G4Exp(-R*g4pow->
powA(std::abs(ZF - 0.486*AFd + 3.8E-04*AFd*AFd),1.5));
285 for (ZF=minZ; ZF<=zmax; ++ZF) {
286 if(sum <= fSig[ZF]) {
break; }
289 G4int DZabl = Z - ZF;
300 for (
G4int ift=0; ift<nFragTypes; ift++)
305 if (fragType[ift]->GetPDGCharge() > 0.0)
314 evapType.push_back(type);
337 evapType.erase(evapType.end()-1);
339 totalEpost += massFinalFrag;
344 if (verboseLevel >= 2)
346 G4cout <<
"Final fragment A=" <<AF
349 for (
G4int ift=0; ift<nFragTypes; ift++)
352 G4int n = std::count(evapType.begin(),evapType.end(),type);
355 <<
", number of particles emitted = " <<n <<
G4endl;
364 G4double totalEpre = massPreFrag + ex;
365 G4double excess = totalEpre - totalEpost;
370 if (produceSecondaries && evapType.size()>0)
374 SelectSecondariesByEvaporation (resultNucleus);
375 nEvap = fragmentVector->size();
376 boost = resultNucleus->
GetMomentum().findBoostToCM();
377 if (evapType.size() > 0)
378 SelectSecondariesByDefault (boost);
389 G4double p = std::sqrt(e*e-mass*mass);
392 lorentzVector.boost(-boost);
394 fragmentVector->push_back(frag);
396 delete resultNucleus;
401 if (verboseLevel >= 2)
410 G4FragmentVector::iterator iter;
411 for (iter = fragmentVector->begin(); iter != fragmentVector->end(); iter++)
422 G4cout <<
"oooooooooooooooooooooooooooooooooooooooo"
423 <<
"oooooooooooooooooooooooooooooooooooooooo"
427 return fragmentVector;
434 G4Fragment theResidualNucleus = *intermediateNucleus;
437 while (evaporate && evapType.size() != 0)
445 std::vector <G4VEvaporationChannel*> theChannels1;
446 theChannels1.clear();
447 std::vector <G4VEvaporationChannel*>::iterator i;
448 VectorOfFragmentTypes::iterator iter;
449 std::vector <VectorOfFragmentTypes::iterator> iters;
451 iter = std::find(evapType.begin(), evapType.end(),
G4Alpha::Alpha());
452 if (iter != evapType.end())
455 i = theChannels1.end() - 1;
456 (*i)->SetOPTxs(OPTxs);
457 (*i)->UseSICB(useSICB);
459 iters.push_back(iter);
461 iter = std::find(evapType.begin(), evapType.end(),
G4He3::He3());
462 if (iter != evapType.end())
465 i = theChannels1.end() - 1;
466 (*i)->SetOPTxs(OPTxs);
467 (*i)->UseSICB(useSICB);
469 iters.push_back(iter);
472 if (iter != evapType.end())
475 i = theChannels1.end() - 1;
476 (*i)->SetOPTxs(OPTxs);
477 (*i)->UseSICB(useSICB);
479 iters.push_back(iter);
482 if (iter != evapType.end())
485 i = theChannels1.end() - 1;
486 (*i)->SetOPTxs(OPTxs);
487 (*i)->UseSICB(useSICB);
489 iters.push_back(iter);
492 if (iter != evapType.end())
495 i = theChannels1.end() - 1;
496 (*i)->SetOPTxs(OPTxs);
497 (*i)->UseSICB(useSICB);
499 iters.push_back(iter);
502 if (iter != evapType.end())
505 i = theChannels1.end() - 1;
506 (*i)->SetOPTxs(OPTxs);
507 (*i)->UseSICB(useSICB);
509 iters.push_back(iter);
511 G4int nChannels = theChannels1.size();
516 std::vector<G4VEvaporationChannel*>::iterator iterEv;
517 for (iterEv=theChannels1.begin(); iterEv!=theChannels1.end(); iterEv++) {
518 totalProb += (*iterEv)->GetEmissionProbability(intermediateNucleus);
519 probEvapType[ich] = totalProb;
522 if (totalProb > 0.0) {
531 for (ii=0; ii<nChannels; ii++) {
532 if (xi < probEvapType[ii]) {
break; }
534 if (ii >= nChannels) { ii = nChannels - 1; }
536 BreakUp(*intermediateNucleus);
537 fragmentVector->push_back((*evaporationResult)[0]);
538 *intermediateNucleus = *(*evaporationResult)[1];
540 delete evaporationResult;
560 for (
unsigned i=0; i<
evapType.size(); i++)
565 G4double p = std::sqrt(e*e-mass*mass);
567 G4double sintheta = std::sqrt((1.0 - costheta)*(1.0 + costheta));
569 G4ThreeVector direction(sintheta*std::cos(phi),sintheta*std::sin(phi),costheta);
571 lorentzVector.boost(-boost);
589 G4cout <<
" *****************************************************************"
591 G4cout <<
" Nuclear ablation model for nuclear-nuclear interactions activated"
593 G4cout <<
" (Written by QinetiQ Ltd for the European Space Agency)"
595 G4cout <<
" !!! WARNING: This model is not well validation and should not be used for accurate simulation !!!"
597 G4cout <<
" *****************************************************************"
static G4Pow * GetInstance()
G4double powA(G4double A, G4double y) const
virtual std::vector< G4VEvaporationChannel * > * GetChannel()=0
void SelectSecondariesByDefault(G4ThreeVector)
VectorOfFragmentTypes evapType
CLHEP::Hep3Vector G4ThreeVector
virtual ~G4WilsonAblationModel()
G4ParticleDefinition * fragType[6]
double B(double temperature)
void SelectSecondariesByEvaporation(G4Fragment *)
const G4String & GetParticleName() const
std::vector< G4VEvaporationChannel * > * theChannels
void PrintWelcomeMessage()
G4bool produceSecondaries
G4IonTable * GetIonTable() const
G4GLOB_DLL std::ostream G4cout
double A(double temperature)
const G4LorentzVector & GetMomentum() const
static const double twopi
std::vector< G4Fragment * > G4FragmentVector
static G4Triton * Triton()
static G4Proton * Proton()
G4double GetGroundStateMass() const
static G4Neutron * Neutron()
static G4Deuteron * Deuteron()
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double GetPDGMass() const
static G4ParticleTable * GetParticleTable()
T max(const T t1, const T t2)
brief Return the largest of the two arguments
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
G4double powZ(G4int Z, G4double y) const
G4double GetPDGCharge() const
G4VEvaporationFactory * theChannelFactory
G4FragmentVector * fragmentVector
G4double GetExcitationEnergy() const
G4int GetBaryonNumber() const
CLHEP::HepLorentzVector G4LorentzVector
G4FragmentVector * BreakItUp(const G4Fragment &theNucleus)