71 useSCO(false),isInitialised(false),isActive(true),minZ(3),minA(5)
103 if(isInitialised) {
return; }
104 isInitialised =
true;
140 if(primary != neutron && primary != proton) {
142 ed <<
"G4PreCompoundModel is used for ";
151 if(primary == proton) { Zp = 1; }
178 for(G4ReactionProductVector::iterator i= result->begin();
179 i != result->end(); ++i)
183 (*i)->GetTotalEnergy(),
184 (*i)->GetMomentum());
186 G4double time=(*i)->GetFormationTime();
187 if(time < 0.0) { time = 0.0; }
188 aNew.
SetTime(timePrimary + time);
214 if (!isActive || (Z < minZ &&
A < minA) ||
215 U < fLowLimitExc*A || U >
A*fHighLimitExc) {
216 PerformEquilibriumEmission(aFragment, Result);
222 const G4double ldfact = 12.0/CLHEP::pi2;
223 const G4int countmax = 1000;
230 G4int eqExcitonNumber =
240 G4bool isTransition =
false;
255 G4bool go_ahead = (ne <= eqExcitonNumber);
258 if (useSCO && go_ahead) {
276 if(!go_ahead || P1 <= P2+P3 || Z < minZ ||
A < minA ||
277 U <= fLowLimitExc*A || U >
A*fHighLimitExc ||
280 PerformEquilibriumEmission(aFragment,Result);
290 G4double TotalProbability = emissionProbability + transProbability;
293 if (TotalProbability*
G4UniformRand() > emissionProbability) {
302 isTransition =
false;
306 }
while (isTransition);
309 if(count >= countmax) {
311 ed <<
"G4PreCompoundModel loop over " << countmax <<
" iterations; "
312 <<
"current G4Fragment: \n" << aFragment;
315 PerformEquilibriumEmission(aFragment, Result);
328 PrintWarning(
"UseHETCEmission");
333 PrintWarning(
"UseDefaultEmission");
338 PrintWarning(
"UseGNASHTransition");
343 PrintWarning(
"UseDefaultTransition");
348 PrintWarning(
"UseOPTxs");
353 PrintWarning(
"UseSICB");
358 PrintWarning(
"UseNGB");
363 PrintWarning(
"UseSCO");
368 PrintWarning(
"UseCEMtr");
371void G4PreCompoundModel::PrintWarning(
const G4String& mname)
374 ed <<
"Obsolete method of the preCompound model is called: "
375 << mname <<
"() \n Instead a corresponding method of "
376 <<
"G4DeexPrecoParameters class should be used";
388 <<
"The GEANT4 precompound model is considered as an extension of the\n"
389 <<
"hadron kinetic model. It gives a possibility to extend the low energy range\n"
390 <<
"of the hadron kinetic model for nucleon-nucleus inelastic collision and it \n"
391 <<
"provides a ”smooth” transition from kinetic stage of reaction described by the\n"
392 <<
"hadron kinetic model to the equilibrium stage of reaction described by the\n"
393 <<
"equilibrium deexcitation models.\n"
394 <<
"The initial information for calculation of pre-compound nuclear stage\n"
395 <<
"consists of the atomic mass number A, charge Z of residual nucleus, its\n"
396 <<
"four momentum P0 , excitation energy U and number of excitons n, which equals\n"
397 <<
"the sum of the number of particles p (from them p_Z are charged) and the number of\n"
399 <<
"At the preequilibrium stage of reaction, we follow the exciton model approach in ref. [1],\n"
400 <<
"taking into account the competition among all possible nuclear transitions\n"
401 <<
"with ∆n = +2, −2, 0 (which are defined by their associated transition probabilities) and\n"
402 <<
"the emission of neutrons, protons, deuterons, thritium and helium nuclei (also defined by\n"
403 <<
"their associated emission probabilities according to exciton model)\n"
405 <<
"[1] K.K. Gudima, S.G. Mashnik, V.D. Toneev, Nucl. Phys. A401 329 (1983)\n"
411 outFile <<
"description of precompound model as used with DeExcite()" <<
"\n";
double A(double temperature)
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.
CLHEP::HepLorentzVector G4LorentzVector
std::vector< G4ReactionProduct * > G4ReactionProductVector
G4double GetPrecoLowEnergy() const
G4bool UseSoftCutoff() const
G4double GetPrecoHighEnergy() const
G4bool PrecoDummy() const
G4int GetMinAForPreco() const
G4bool NeverGoBack() const
G4int GetMinZForPreco() const
G4int GetPrecoModelType() const
G4double GetExcitationEnergy() const
void SetCreationTime(G4double time)
void SetNumberOfHoles(G4int valueTot, G4int valueP=0)
G4int GetNumberOfExcitons() const
void SetNumberOfExcitedParticle(G4int valueTot, G4int valueP)
void SetStatusChange(G4HadFinalStateStatus aS)
void AddSecondary(G4DynamicParticle *aP, G4int mod=-1)
const G4ParticleDefinition * GetDefinition() const
const G4LorentzVector & Get4Momentum() const
G4double GetGlobalTime() const
void SetTime(G4double aT)
void SetCreatorModelType(G4int idx)
static G4Neutron * Neutron()
G4double GetLevelDensity(G4int Z, G4int A, G4double U)
G4DeexPrecoParameters * GetParameters()
static G4NuclearLevelData * GetInstance()
static G4double GetNuclearMass(const G4double A, const G4double Z)
const G4String & GetParticleName() const
G4ReactionProduct * PerformEmission(G4Fragment &aFragment)
G4double GetTotalProbability(const G4Fragment &aFragment)
virtual ~G4PreCompoundModel()
virtual void ModelDescription(std::ostream &outFile) const final
void UseDefaultTransition()
virtual void InitialiseModel() final
virtual G4HadFinalState * ApplyYourself(const G4HadProjectile &thePrimary, G4Nucleus &theNucleus) final
virtual G4ReactionProductVector * DeExcite(G4Fragment &aFragment) final
void UseGNASHTransition()
virtual void DeExciteModelDescription(std::ostream &outFile) const final
virtual void BuildPhysicsTable(const G4ParticleDefinition &) final
void UseDefaultEmission()
G4PreCompoundModel(G4ExcitationHandler *ptr=nullptr)
static G4Proton * Proton()
G4ExcitationHandler * GetExcitationHandler() const
void SetExcitationHandler(G4ExcitationHandler *ptr)
G4double GetTransitionProb3() const
virtual G4double CalculateProbability(const G4Fragment &aFragment)=0
virtual void PerformTransition(G4Fragment &aFragment)=0
G4double GetTransitionProb2() const
void UseCEMtr(G4bool use)
G4double GetTransitionProb1() const