108 if (isInitialised) {
return; }
109 isInitialised =
true;
118 usePrecoInterface =
true;
123 if (param->
UseHETC()) { theEmission->SetHETCModel(); }
129 theTransition->UseCEMtr(param->
UseCEM());
153 if(primary != neutron && primary != proton) {
155 ed <<
"G4PreCompoundModel is used for ";
164 if(primary == proton) { Zp = 1; }
192 for(
auto const & prod : *result) {
194 prod->GetTotalEnergy(),
195 prod->GetMomentum());
197 G4double time = std::max(prod->GetFormationTime(), 0.0);
198 aNew.
SetTime(timePrimary + time);
201 theResult.AddSecondary(aNew);
212 if (usePrecoInterface) {
return fInterface->DeExcite(aFragment); }
221 G4cout <<
"### G4PreCompoundModel::DeExcite Z=" << Z <<
" A=" <<
A
222 <<
" U(MeV)=" << U <<
" Umin=" << fLowLimitExc*
A <<
G4endl;
227 if (!isActive || (Z < minZ &&
A < minA) || U < fLowLimitExc*
A ||
230 PerformEquilibriumEmission(aFragment, result);
236 if (U >
A*fMinEForMultiFrag) {
237 theTempResult = theMultiFrag->BreakItUp(aFragment);
241 theTempResult->push_back(
new G4Fragment(aFragment));
245 for (
auto & ptr : *theTempResult) {
249 delete theTempResult;
257 const G4double ldfact = 12.0/CLHEP::pi2;
258 const G4int countmax = 300;
266 if (nExcitons <= 0 || (Z < minZ &&
A < minA) ||
267 U > fHighLimitExc*
A || U <= fLowLimitExc*
A) {
268 PerformEquilibriumEmission(aFragment, result);
271 G4int eqExcitonNumber =
272 G4lrint(std::sqrt(ldfact*U*fNuclData->GetLevelDensity(Z,
A, U)));
274 G4cout <<
" 1st loop " << count <<
". Z=" << Z <<
" A=" <<
A
275 <<
" U(MeV)=" << U <<
" eqExcitationNumber=" << eqExcitonNumber
283 G4bool isTransition =
true;
290 if (nExcitons <= 0) {
291 PerformEquilibriumEmission(aFragment, result);
296 G4bool go_ahead = (nExcitons < eqExcitonNumber);
297 if (useSCO && go_ahead) {
302 PerformEquilibriumEmission(aFragment, result);
306 G4double transProbability = theTransition->CalculateProbability(aFragment);
307 G4double P1 = theTransition->GetTransitionProb1();
308 G4double P2 = theTransition->GetTransitionProb2();
309 G4double P3 = theTransition->GetTransitionProb3();
311 G4cout <<
" 2nd loop " << count <<
". Nex=" << nExcitons <<
" P1=" << P1
312 <<
" P2=" << P2 <<
" P3=" << P3 <<
G4endl;
318 PerformEquilibriumEmission(aFragment, result);
322 G4double emissionProbability = theEmission->GetTotalProbability(aFragment);
323 G4double totProbability = emissionProbability + transProbability;
325 G4cout <<
" prob_em=" << emissionProbability
326 <<
" prob_tot=" << totProbability <<
G4endl;
332 theTransition->PerformTransition(aFragment);
335 isTransition =
false;
336 result->push_back(theEmission->PerformEmission(aFragment));
339 }
while (isTransition);
342 if (count >= countmax) {
344 ed <<
"G4PreCompoundModel loop over " << countmax <<
" iterations; "
345 <<
"current G4Fragment: \n" << aFragment;
351 PerformEquilibriumEmission(aFragment, result);
361 <<
"The GEANT4 precompound model is considered as an extension of the\n"
362 <<
"hadron kinetic model. It gives a possibility to extend the low energy range\n"
363 <<
"of the hadron kinetic model for nucleon-nucleus inelastic collision and it \n"
364 <<
"provides a ”smooth” transition from kinetic stage of reaction described by the\n"
365 <<
"hadron kinetic model to the equilibrium stage of reaction described by the\n"
366 <<
"equilibrium deexcitation models.\n"
367 <<
"The initial information for calculation of pre-compound nuclear stage\n"
368 <<
"consists of the atomic mass number A, charge Z of residual nucleus, its\n"
369 <<
"four momentum P0, excitation energy U and number of excitons n, which equals\n"
370 <<
"the sum of the number of particles p (from them p_Z are charged) and the number of\n"
372 <<
"At the preequilibrium stage of reaction, we follow the exciton model approach in ref. [1],\n"
373 <<
"taking into account the competition among all possible nuclear transitions\n"
374 <<
"with ∆n = +2, −2, 0 (which are defined by their associated transition probabilities) and\n"
375 <<
"the emission of neutrons, protons, deuterons, thritium and helium nuclei (also defined by\n"
376 <<
"their associated emission probabilities according to exciton model)\n"
378 <<
"[1] K.K. Gudima, S.G. Mashnik, V.D. Toneev, Nucl. Phys. A401 329 (1983)\n"
386 outFile <<
"description of precompound model as used with DeExcite()" <<
"\n";
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
std::vector< G4Fragment * > G4FragmentVector
CLHEP::HepLorentzVector G4LorentzVector
std::vector< G4ReactionProduct * > G4ReactionProductVector
G4GLOB_DLL std::ostream G4cout
G4double GetPrecoLowEnergy() const
G4bool UseSoftCutoff() const
G4double GetPrecoHighEnergy() const
G4bool PrecoDummy() const
G4int GetMinAForPreco() const
G4bool NeverGoBack() const
G4double GetMinExPerNucleounForMF() const
G4int GetMinZForPreco() const
G4PreCompoundType GetPreCompoundType() const
G4int GetPrecoModelType() const
G4double GetExcitationEnergy() const
void SetCreatorModelID(G4int value)
void SetCreationTime(G4double time)
void SetNumberOfHoles(G4int valueTot, G4int valueP=0)
G4int GetNumberOfExcitons() const
G4int GetNumberOfLambdas() const
void SetNumberOfExcitedParticle(G4int valueTot, G4int valueP)
const G4ParticleDefinition * GetDefinition() const
const G4LorentzVector & Get4Momentum() const
G4double GetGlobalTime() const
void SetTime(G4double aT)
void SetCreatorModelID(G4int id)
static G4Neutron * Neutron()
static G4NuclearLevelData * GetInstance()
static G4double GetNuclearMass(const G4double A, const G4double Z)
const G4String & GetParticleName() const
static G4int GetModelID(const G4int modelIndex)
void InitialiseModel() override
void ModelDescription(std::ostream &outFile) const override
G4HadFinalState * ApplyYourself(const G4HadProjectile &thePrimary, G4Nucleus &theNucleus) override
G4ReactionProductVector * DeExcite(G4Fragment &aFragment) override
~G4PreCompoundModel() override
void DeExciteModelDescription(std::ostream &outFile) const override
G4PreCompoundModel(G4ExcitationHandler *ptr=nullptr)
void BuildPhysicsTable(const G4ParticleDefinition &) override
static G4Proton * Proton()
G4ExcitationHandler * GetExcitationHandler() const
G4VPreCompoundModel(G4ExcitationHandler *ptr=nullptr, const G4String &modelName="PrecompoundModel")
void SetExcitationHandler(G4ExcitationHandler *ptr)