Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4PreCompoundInterface.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// GEANT4 Class file
27//
28// File name: G4PreCompoundInterface
29//
30// Author: V.Ivantchenko, 20 January 2025
31//
32
35#include "G4SystemOfUnits.hh"
40#include "G4Proton.hh"
41#include "G4Neutron.hh"
42
43#include "G4NucleiProperties.hh"
44#include "G4NuclearLevelData.hh"
46#include "Randomize.hh"
47#include "G4DynamicParticle.hh"
48#include "G4ParticleTypes.hh"
49#include "G4ParticleTable.hh"
50#include "G4LorentzVector.hh"
51#include "G4Exp.hh"
53
54////////////////////////////////////////////////////////////////////////////////
55
61
62////////////////////////////////////////////////////////////////////////////////
63
65{
66 delete theEmission;
67 delete theTransition;
68 delete GetExcitationHandler();
69}
70
71////////////////////////////////////////////////////////////////////////////////
72
77
78////////////////////////////////////////////////////////////////////////////////
79
81{
82 if (isInitialised) { return; }
83 isInitialised = true;
84
85 G4DeexPrecoParameters* param = fNuclData->GetParameters();
86
87 fLowLimitExc = param->GetPrecoLowEnergy();
88 fHighLimitExc = param->GetPrecoHighEnergy();
89 fVerbose = param->GetVerbose();
90
91 if (param->PrecoDummy()) {
92 isActive = false;
93 } else {
94 theEmission = new G4PreCompoundEmissionInt(fVerbose);
95 theEmission->SetOPTxs(param->GetPrecoModelType());
96 theTransition = new G4PreCompoundTransitionsInt(fVerbose);
97 }
98
100}
101
102////////////////////////////////////////////////////////////////////////////////
103
105{
107 if (!isInitialised) { InitialiseModel(); }
108
109 // decays by de-excitation
110 G4double U = frag.GetExcitationEnergy();
111 G4int Z = frag.GetZ_asInt();
112 G4int A = frag.GetA_asInt();
113 if (1 < fVerbose) {
114 G4cout << "### G4PreCompoundInterface::DeExcite Z=" << Z << " A=" << A
115 << " U(MeV)=" << U << G4endl;
116 }
117 if (!isActive || Z < minZ || A < minA ||
118 U < fLowLimitExc*A || U > A*fHighLimitExc ||
119 0 < frag.GetNumberOfLambdas()) {
120 PerformEquilibriumEmission(frag, res);
121 return res;
122 }
123 // decays by precompound model
124 BreakUpFragment(frag, res);
125 return res;
126}
127
128void G4PreCompoundInterface::BreakUpFragment(G4Fragment& frag,
130{
131 // check initial fragment and number of excitons is not defined
132 G4double U = frag.GetExcitationEnergy();
133 G4int Z = frag.GetZ_asInt();
134 G4int A = frag.GetA_asInt();
135 if (Z < minZ || A < minA || U < fLowLimitExc*A) {
136 PerformEquilibriumEmission(frag, res);
137 return;
138 }
139
140 const G4double ldfact = 3.0/CLHEP::pi2;
141 const G4double eperex = 20.0*CLHEP::MeV;
142
143 // number of excitons may be defined or not defined
144 G4int np = frag.GetNumberOfParticles();
145 G4int nz = frag.GetNumberOfCharged();
146 if (0 == np) {
147 np = G4lrint(U/eperex);
148 np = std::min(np, A);
149 frag.SetNumberOfParticles(np);
150 nz = G4lrint((np*Z)/(G4double)A);
151 nz = std::min(std::min(nz, np), Z);
152 frag.SetNumberOfExcitedParticle(np, nz);
153 }
154
155 // main loop over fragments
156 for (G4int i=0; i<50; ++i) {
157 if (Z < minZ || A < minA || U < fLowLimitExc*A) {
158 break;
159 }
160
161 // eqNum is the number of particle, not excitons
162 G4int eqNum =
163 G4lrint(std::sqrt(ldfact*U*fNuclData->GetLevelDensity(Z, A, U)));
164 if (2 < fVerbose) {
165 G4cout << " 1st loop " << i << ". Z=" << Z << " A=" << A
166 << " U(MeV)=" << U << " Npart=" << np << " Nch=" << nz
167 << " eqExcitationNumber=" << eqNum << G4endl;
168 }
169 if (np <= eqNum) { break; }
170
171 // Loop for transitions, it is performed while there are
172 // preequilibrium transitions and is completed by emission
173 G4bool isTransition = false;
174 G4bool isEquilibrium = false;
175
176 for (G4int j=0; j<20; ++j) {
177 G4double transProbability =
178 theTransition->CalculateProbability(frag);
179 G4double P1 = theTransition->GetTransitionProb1();
180 G4double P2 = theTransition->GetTransitionProb2();
181 G4double P3 = theTransition->GetTransitionProb3();
182 if (2 < fVerbose) {
183 G4cout << " 2nd loop " << j << ". Npart=" << np << " P1=" << P1
184 << " P2=" << P2 << " P3=" << P3 << G4endl;
185 }
186 if (np <= eqNum || P1 <= P2+P3) {
187 isEquilibrium = true;
188 break;
189 }
190
191 G4double emissionProbability =
192 theEmission->GetTotalProbability(frag);
193
194 // Sum of all probabilities
195 G4double totalProb = emissionProbability + transProbability;
196
197 // Select subprocess
198 if (totalProb*G4UniformRand() > emissionProbability) {
199 isTransition = true;
200 theTransition->PerformTransition(frag);
201 isEquilibrium = (np <= eqNum);
202 } else {
203 isTransition = false;
204 auto product = theEmission->PerformEmission(frag);
205 res->push_back(product);
206
207 // new parameters of the residual fragment
208 U = frag.GetExcitationEnergy();
209 Z = frag.GetZ_asInt();
210 A = frag.GetA_asInt();
211 }
212 np = frag.GetNumberOfParticles();
213 nz = frag.GetNumberOfCharged();
214 if (!isTransition || isEquilibrium) { break; }
215 }
216 if (isEquilibrium) { break; }
217 }
218 PerformEquilibriumEmission(frag, res);
219}
220
221////////////////////////////////////////////////////////////////////////////////
222// Documentation
223////////////////////////////////////////////////////////////////////////////////
224
225void G4PreCompoundInterface::ModelDescription(std::ostream& outFile) const
226{
227 outFile
228 << "The GEANT4 precompound model is considered as an extension of the\n"
229 << "hadron kinetic model. It gives a possibility to extend the low energy range\n"
230 << "of the hadron kinetic model for nucleon-nucleus inelastic collision and it \n"
231 << "provides a ”smooth” transition from kinetic stage of reaction described by the\n"
232 << "hadron kinetic model to the equilibrium stage of reaction described by the\n"
233 << "equilibrium deexcitation models.\n"
234 << "The initial information for calculation of pre-compound nuclear stage\n"
235 << "consists of the atomic mass number A, charge Z of residual nucleus, its\n"
236 << "four momentum P0 , excitation energy U and number of excitons n, which equals\n"
237 << "the sum of the number of particles p (from them p_Z are charged) and the number of\n"
238 << "holes h.\n"
239 << "At the preequilibrium stage of reaction, we follow the exciton model approach in ref. [1],\n"
240 << "taking into account the competition among all possible nuclear transitions\n"
241 << "with ∆n = +2, −2, 0 (which are defined by their associated transition probabilities) and\n"
242 << "the emission of neutrons, protons, deuterons, thritium and helium nuclei (also defined by\n"
243 << "their associated emission probabilities according to exciton model)\n"
244 << "\n"
245 << "[1] K.K. Gudima, S.G. Mashnik, V.D. Toneev, Nucl. Phys. A401 329 (1983)\n"
246 << "\n";
247}
248
250{
251 outFile << "description of precompound model as used with DeExcite()" << "\n";
252}
253
254////////////////////////////////////////////////////////////////////////////////
std::vector< G4ReactionProduct * > G4ReactionProductVector
double G4double
Definition G4Types.hh:83
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
const G4double A[17]
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
#define G4UniformRand()
Definition Randomize.hh:52
G4double GetPrecoHighEnergy() const
G4int GetNumberOfParticles() const
G4double GetExcitationEnergy() const
G4int GetZ_asInt() const
G4int GetNumberOfLambdas() const
void SetNumberOfExcitedParticle(G4int valueTot, G4int valueP)
void SetNumberOfParticles(G4int value)
G4int GetNumberOfCharged() const
G4int GetA_asInt() const
static G4NuclearLevelData * GetInstance()
void ModelDescription(std::ostream &outFile) const override
G4ReactionProductVector * DeExcite(G4Fragment &aFragment) override
void DeExciteModelDescription(std::ostream &) const override
void BuildPhysicsTable(const G4ParticleDefinition &) override
G4ExcitationHandler * GetExcitationHandler() const
G4VPreCompoundModel(G4ExcitationHandler *ptr=nullptr, const G4String &modelName="PrecompoundModel")
int G4lrint(double ad)
Definition templates.hh:134