Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4GEMChannel.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//
27// Hadronic Process: Nuclear De-excitations
28// by V. Lara (Oct 1998)
29//
30// J. M. Quesada (September 2009) bugs fixed in probability distribution for kinetic
31// energy sampling:
32// -hbarc instead of hbar_Planck (BIG BUG)
33// -quantities for initial nucleus and residual are calculated separately
34// V.Ivanchenko (September 2009) Added proper protection for unphysical final state
35// J. M. Quesada (October 2009) fixed bug in CoulombBarrier calculation
36
37#include "G4GEMChannel.hh"
38#include "G4VCoulombBarrier.hh"
42#include "G4SystemOfUnits.hh"
43#include "G4Pow.hh"
44#include "G4Log.hh"
45#include "G4Exp.hh"
46#include "G4RandomDirection.hh"
48
50 G4GEMProbability * aEmissionStrategy) :
52 A(theA),
53 Z(theZ),
54 EmissionProbability(0.0),
55 MaximalKineticEnergy(-CLHEP::GeV),
56 theEvaporationProbabilityPtr(aEmissionStrategy),
57 secID(-1)
58{
59 theCoulombBarrierPtr = new G4GEMCoulombBarrier(theA, theZ);
60 theEvaporationProbabilityPtr->SetCoulomBarrier(theCoulombBarrierPtr);
61 theLevelDensityPtr = new G4EvaporationLevelDensityParameter;
62 MyOwnLevelDensity = true;
63 EvaporatedMass = G4NucleiProperties::GetNuclearMass(A, Z);
64 ResidualMass = CoulombBarrier = 0.0;
65 fG4pow = G4Pow::GetInstance();
66 ResidualZ = ResidualA = 0;
68 secID = G4PhysicsModelCatalog::GetModelID("model_G4GEMChannel");
69}
70
72{
73 if (MyOwnLevelDensity) { delete theLevelDensityPtr; }
74 delete theCoulombBarrierPtr;
75}
76
78{
79 G4int anA = fragment->GetA_asInt();
80 G4int aZ = fragment->GetZ_asInt();
81 ResidualA = anA - A;
82 ResidualZ = aZ - Z;
83 /*
84 G4cout << "G4GEMChannel: Z= " << Z << " A= " << A
85 << " FragmentZ= " << aZ << " FragmentA= " << anA
86 << " Zres= " << ResidualZ << " Ares= " << ResidualA
87 << G4endl;
88 */
89 // We only take into account channels which are physically allowed
90 EmissionProbability = 0.0;
91
92 // Only channels which are physically allowed are taken into account
93 if (ResidualA >= ResidualZ && ResidualZ >= 0 && ResidualA >= A) {
94
95 //Effective excitation energy
96 G4double ExEnergy = fragment->GetExcitationEnergy()
97 - fNucData->GetPairingCorrection(aZ, anA);
98 if(ExEnergy > 0.0) {
99 ResidualMass = G4NucleiProperties::GetNuclearMass(ResidualA, ResidualZ);
100 G4double FragmentMass = fragment->GetGroundStateMass();
101 G4double Etot = FragmentMass + ExEnergy;
102 // Coulomb Barrier calculation
103 CoulombBarrier =
104 theCoulombBarrierPtr->GetCoulombBarrier(ResidualA,ResidualZ,ExEnergy);
105 /*
106 G4cout << "Eexc(MeV)= " << ExEnergy/MeV
107 << " CoulBarrier(MeV)= " << CoulombBarrier/MeV << G4endl;
108 */
109 if(Etot > ResidualMass + EvaporatedMass + CoulombBarrier) {
110
111 // Maximal Kinetic Energy
112 MaximalKineticEnergy = ((Etot-ResidualMass)*(Etot+ResidualMass)
113 + EvaporatedMass*EvaporatedMass)/(2.0*Etot)
114 - EvaporatedMass - CoulombBarrier;
115
116 //G4cout << "CBarrier(MeV)= " << CoulombBarrier/MeV << G4endl;
117
118 if (MaximalKineticEnergy > 0.0) {
119 // Total emission probability for this channel
120 EmissionProbability = theEvaporationProbabilityPtr->
121 EmissionProbability(*fragment, MaximalKineticEnergy);
122 }
123 }
124 }
125 }
126 //G4cout << "Prob= " << EmissionProbability << G4endl;
127 return EmissionProbability;
128}
129
131{
132 G4Fragment* evFragment = 0;
133 G4double evEnergy = SampleKineticEnergy(*theNucleus) + EvaporatedMass;
134
135 G4ThreeVector momentum = G4RandomDirection()*
136 std::sqrt((evEnergy - EvaporatedMass)*(evEnergy + EvaporatedMass));
137
138 G4LorentzVector EvaporatedMomentum(momentum, evEnergy);
139 G4LorentzVector ResidualMomentum = theNucleus->GetMomentum();
140 EvaporatedMomentum.boost(ResidualMomentum.boostVector());
141
142 evFragment = new G4Fragment(A, Z, EvaporatedMomentum);
143 if ( evFragment != nullptr ) { evFragment->SetCreatorModelID(secID); }
144 ResidualMomentum -= EvaporatedMomentum;
145 theNucleus->SetZandA_asInt(ResidualZ, ResidualA);
146 theNucleus->SetMomentum(ResidualMomentum);
147 theNucleus->SetCreatorModelID(secID);
148
149 return evFragment;
150}
151
152G4double G4GEMChannel::SampleKineticEnergy(const G4Fragment & fragment)
153// Samples fragment kinetic energy.
154{
155 G4double U = fragment.GetExcitationEnergy();
156
157 G4double Alpha = theEvaporationProbabilityPtr->CalcAlphaParam(fragment);
158 G4double Beta = theEvaporationProbabilityPtr->CalcBetaParam(fragment);
159
160 // ***RESIDUAL***
161 //JMQ (September 2009) the following quantities refer to the RESIDUAL:
162 G4double delta0 = fNucData->GetPairingCorrection(ResidualZ,ResidualA);
163 G4double Ux = (2.5 + 150.0/ResidualA)*MeV;
164 G4double Ex = Ux + delta0;
165 G4double InitialLevelDensity;
166 // ***end RESIDUAL ***
167
168 // ***PARENT***
169 //JMQ (September 2009) the following quantities refer to the PARENT:
170
171 G4double deltaCN = fNucData->GetPairingCorrection(fragment.GetZ_asInt(),
172 fragment.GetA_asInt());
173 G4double aCN = theLevelDensityPtr->LevelDensityParameter(fragment.GetA_asInt(),
174 fragment.GetZ_asInt(),
175 U-deltaCN);
176 G4double UxCN = (2.5 + 150.0/G4double(fragment.GetA_asInt()))*MeV;
177 G4double ExCN = UxCN + deltaCN;
178 G4double TCN = 1.0/(std::sqrt(aCN/UxCN) - 1.5/UxCN);
179 // ***end PARENT***
180
181 //JMQ quantities calculated for CN in InitialLevelDensity
182 if ( U < ExCN )
183 {
184 G4double E0CN = ExCN - TCN*(G4Log(TCN/MeV) - G4Log(aCN*MeV)/4.0
185 - 1.25*G4Log(UxCN/MeV) + 2.0*std::sqrt(aCN*UxCN));
186 InitialLevelDensity = (pi/12.0)*G4Exp((U-E0CN)/TCN)/TCN;
187 }
188 else
189 {
190 G4double x = U-deltaCN;
191 G4double x1 = std::sqrt(aCN*x);
192 InitialLevelDensity = (pi/12.0)*G4Exp(2*x1)/(x*std::sqrt(x1));
193 }
194
195 G4double Spin = theEvaporationProbabilityPtr->GetSpin();
196 //JMQ BIG BUG fixed: hbarc instead of hbar_Planck !!!!
197 // it was also fixed in total probability
198 G4double gg = (2.0*Spin+1.0)*EvaporatedMass/(pi2* hbarc*hbarc);
199 //
200 //JMQ fix on Rb and geometrical cross sections according to Furihata's paper
201 // (JAERI-Data/Code 2001-105, p6)
202 G4double Rb = 0.0;
203 if (A > 4)
204 {
205 G4double Ad = fG4pow->Z13(ResidualA);
206 G4double Aj = fG4pow->Z13(A);
207 Rb = (1.12*(Aj + Ad) - 0.86*((Aj+Ad)/(Aj*Ad))+2.85)*fermi;
208 }
209 else if (A>1)
210 {
211 G4double Ad = fG4pow->Z13(ResidualA);
212 G4double Aj = fG4pow->Z13(A);
213 Rb=1.5*(Aj+Ad)*fermi;
214 }
215 else
216 {
217 G4double Ad = fG4pow->Z13(ResidualA);
218 Rb = 1.5*Ad*fermi;
219 }
220 G4double GeometricalXS = pi*Rb*Rb;
221
222 G4double ConstantFactor = gg*GeometricalXS*Alpha*pi/(InitialLevelDensity*12);
223 //JMQ : this is the assimptotic maximal kinetic energy of the ejectile
224 // (obtained by energy-momentum conservation).
225 // In general smaller than U-theSeparationEnergy
226 G4double theEnergy = MaximalKineticEnergy + CoulombBarrier;
229
230 for(G4int i=0; i<100; ++i) {
231 KineticEnergy = CoulombBarrier + G4UniformRand()*(MaximalKineticEnergy);
232 G4double edelta = theEnergy-KineticEnergy-delta0;
233 Probability = ConstantFactor*(KineticEnergy + Beta);
234 G4double a =
235 theLevelDensityPtr->LevelDensityParameter(ResidualA,ResidualZ,edelta);
236 G4double T = 1.0/(std::sqrt(a/Ux) - 1.5/Ux);
237 //JMQ fix in units
238
239 if (theEnergy - KineticEnergy < Ex) {
240 G4double E0 = Ex - T*(G4Log(T) - G4Log(a)*0.25
241 - 1.25*G4Log(Ux) + 2.0*std::sqrt(a*Ux));
242 Probability *= G4Exp((theEnergy-KineticEnergy-E0)/T)/T;
243 } else {
244 G4double e2 = edelta*edelta;
245 Probability *=
246 G4Exp(2*std::sqrt(a*edelta) - 0.25*G4Log(a*edelta*e2*e2));
247 }
248 if(EmissionProbability*G4UniformRand() <= Probability) { break; }
249 }
250
251 return KineticEnergy;
252}
253
255{
256 theEvaporationProbabilityPtr->Dump();
257}
258
259
260
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition G4Exp.hh:180
G4double G4Log(G4double x)
Definition G4Log.hh:227
G4ThreeVector G4RandomDirection()
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
const G4double A[17]
#define G4UniformRand()
Definition Randomize.hh:52
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
G4double GetGroundStateMass() const
void SetZandA_asInt(G4int Znew, G4int Anew, G4int Lnew=0)
G4double GetExcitationEnergy() const
const G4LorentzVector & GetMomentum() const
void SetCreatorModelID(G4int value)
G4int GetZ_asInt() const
void SetMomentum(const G4LorentzVector &value)
G4int GetA_asInt() const
virtual void Dump() const
virtual G4Fragment * EmittedFragment(G4Fragment *theNucleus)
virtual ~G4GEMChannel()
G4GEMChannel(G4int theA, G4int theZ, const G4String &aName, G4GEMProbability *aEmissionStrategy)
virtual G4double GetEmissionProbability(G4Fragment *theNucleus)
G4double CalcAlphaParam(const G4Fragment &) const
G4double CalcBetaParam(const G4Fragment &) const
G4double GetSpin(void) const
void SetCoulomBarrier(const G4VCoulombBarrier *aCoulombBarrierStrategy)
G4PairingCorrection * GetPairingCorrection()
static G4NuclearLevelData * GetInstance()
static G4double GetNuclearMass(const G4double A, const G4double Z)
static G4int GetModelID(const G4int modelIndex)
static G4Pow * GetInstance()
Definition G4Pow.cc:41
G4double Z13(G4int Z) const
Definition G4Pow.hh:123
virtual G4double GetCoulombBarrier(G4int ARes, G4int ZRes, G4double U=0.0) const =0
virtual G4double LevelDensityParameter(G4int A, G4int Z, G4double U) const =0
G4double CoulombBarrier(const G4int Z1, const G4int A1, const G4int Z2, const G4int A2, const G4double exc)
G4double Probability(const G4int A, const G4FermiFragment *f1, const G4FermiFragment *f2, const G4double mass, const G4double exc)