Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4INCLNuclearPotentialIsospin.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// INCL++ intra-nuclear cascade model
27// Alain Boudard, CEA-Saclay, France
28// Joseph Cugnon, University of Liege, Belgium
29// Jean-Christophe David, CEA-Saclay, France
30// Pekka Kaitaniemi, CEA-Saclay, France, and Helsinki Institute of Physics, Finland
31// Sylvie Leray, CEA-Saclay, France
32// Davide Mancusi, CEA-Saclay, France
33//
34#define INCLXX_IN_GEANT4_MODE 1
35
36#include "globals.hh"
37
38/** \file G4INCLNuclearPotentialIsospin.cc
39 * \brief Isospin-dependent nuclear potential.
40 *
41 * Provides an isospin-dependent nuclear potential.
42 *
43 * \date 28 February 2011
44 * \author Davide Mancusi
45 */
46
50#include "G4INCLGlobals.hh"
51
52namespace G4INCL {
53
54 namespace NuclearPotential {
55
56 // Constructors
58 : INuclearPotential(A, Z, aPionPotential)
59 {
60 initialize();
61 }
62
63 // Destructor
65
66 void NuclearPotentialIsospin::initialize() {
67 const G4double ZOverA = ((G4double) theZ) / ((G4double) theA);
68
72
73 const G4double theFermiMomentum = ParticleTable::getFermiMomentum(theA,theZ);
74
75 fermiMomentum[Proton] = theFermiMomentum * Math::pow13(2.*ZOverA);
76 const G4double theProtonFermiEnergy = std::sqrt(fermiMomentum[Proton]*fermiMomentum[Proton] + mp*mp) - mp;
77 fermiEnergy[Proton] = theProtonFermiEnergy;
78 // Use separation energies from the ParticleTable
79 const G4double theProtonSeparationEnergy = ParticleTable::getSeparationEnergy(Proton,theA,theZ);
80 separationEnergy[Proton] = theProtonSeparationEnergy;
81 vProton = theProtonFermiEnergy + theProtonSeparationEnergy;
82
83 fermiMomentum[Neutron] = theFermiMomentum * Math::pow13(2.*(1.-ZOverA));
84 const G4double theNeutronFermiEnergy = std::sqrt(fermiMomentum[Neutron]*fermiMomentum[Neutron] + mn*mn) - mn;
85 fermiEnergy[Neutron] = theNeutronFermiEnergy;
86 // Use separation energies from the ParticleTable
87 const G4double theNeutronSeparationEnergy = ParticleTable::getSeparationEnergy(Neutron,theA,theZ);
88 separationEnergy[Neutron] = theNeutronSeparationEnergy;
89 vNeutron = theNeutronFermiEnergy + theNeutronSeparationEnergy;
90
91 const G4double separationEnergyDeltaPlusPlus = 2.*theProtonSeparationEnergy - theNeutronSeparationEnergy;
92 separationEnergy[DeltaPlusPlus] = separationEnergyDeltaPlusPlus;
93 separationEnergy[DeltaPlus] = theProtonSeparationEnergy;
94 separationEnergy[DeltaZero] = theNeutronSeparationEnergy;
95 const G4double separationEnergyDeltaMinus = 2.*theNeutronSeparationEnergy - theProtonSeparationEnergy;
96 separationEnergy[DeltaMinus] = separationEnergyDeltaMinus;
97
98 const G4double tinyMargin = 1E-7;
99 vDeltaPlus = vProton;
100 vDeltaZero = vNeutron;
101 vDeltaPlusPlus = std::max(separationEnergyDeltaPlusPlus + tinyMargin, 2.*vDeltaPlus - vDeltaZero);
102 vDeltaMinus = std::max(separationEnergyDeltaMinus + tinyMargin, 2.*vDeltaZero - vDeltaPlus);
103
104 vSigmaMinus = -16.; // Repulsive potential, from Eur. Phys.J.A. (2016) 52:21
105 vSigmaZero = -16.; // hypothesis: same potential for each sigma
106 vSigmaPlus = -16.;
107
108 vLambda = 30.;
109 vantiProton = 100.;
110 vantiNeutron = 50.;
111
112 const G4double asy = (theA - 2.*theZ)/theA;
113 // Jose Luis Rodriguez-Sanchez et al., Rapid Communication PRC 98, 021602 (2018)
114 if (asy > 0.236) vLambda = 40.91;
115 else if (asy > 0.133) vLambda = 56.549 - 678.73*asy + 4905.35*asy*asy - 9789.1*asy*asy*asy;
116
117 const G4double theLambdaSeparationEnergy = ParticleTable::getSeparationEnergy(Lambda,theA,theZ);
118 const G4double theantiLambdaSeparationEnergy = ParticleTable::getSeparationEnergy(antiLambda,theA,theZ);
119 const G4double theantiProtonSeparationEnergy = ParticleTable::getSeparationEnergy(antiProton,theA,theZ);
120 const G4double theantiNeutronSeparationEnergy = ParticleTable::getSeparationEnergy(antiNeutron,theA,theZ);
121
122 separationEnergy[PiPlus] = theProtonSeparationEnergy - theNeutronSeparationEnergy;
124 separationEnergy[PiMinus] = theNeutronSeparationEnergy - theProtonSeparationEnergy;
125
126 separationEnergy[Eta] = 0.;
130
131 separationEnergy[Lambda] = theLambdaSeparationEnergy;
132 separationEnergy[SigmaPlus] = theProtonSeparationEnergy + theLambdaSeparationEnergy - theNeutronSeparationEnergy;
133 separationEnergy[SigmaZero] = theLambdaSeparationEnergy;
134 separationEnergy[SigmaMinus] = theNeutronSeparationEnergy + theLambdaSeparationEnergy - theProtonSeparationEnergy;
135
136 separationEnergy[antiLambda] = theantiLambdaSeparationEnergy;
137 separationEnergy[antiSigmaPlus] = theantiProtonSeparationEnergy + theantiLambdaSeparationEnergy - theantiNeutronSeparationEnergy;
138 separationEnergy[antiSigmaZero] = theantiLambdaSeparationEnergy;
139 separationEnergy[antiSigmaMinus] = theantiNeutronSeparationEnergy + theantiLambdaSeparationEnergy - theantiProtonSeparationEnergy;
140
141 separationEnergy[KPlus] = theProtonSeparationEnergy - theLambdaSeparationEnergy;
142 separationEnergy[KZero] = (theNeutronSeparationEnergy - theLambdaSeparationEnergy);
143 separationEnergy[KZeroBar] = (theLambdaSeparationEnergy - theNeutronSeparationEnergy);
144 separationEnergy[KMinus] = 2.*theNeutronSeparationEnergy - theProtonSeparationEnergy-theLambdaSeparationEnergy;
145
146 separationEnergy[KShort] = (theNeutronSeparationEnergy - theLambdaSeparationEnergy);
147 separationEnergy[KLong] = (theNeutronSeparationEnergy - theLambdaSeparationEnergy);
148
149 separationEnergy[antiProton] = theantiProtonSeparationEnergy;
150 separationEnergy[antiNeutron] = theantiNeutronSeparationEnergy;
151
156
158 if (fermiEnergy[Lambda] <= 0.)
160 else
161 fermiMomentum[Lambda]=std::sqrt(std::pow(fermiEnergy[Lambda]+ml,2.0)-ml*ml);
162
166
169
170 INCL_DEBUG("Table of separation energies [MeV] for A=" << theA << ", Z=" << theZ << ":" << '\n'
171 << " proton: " << separationEnergy[Proton] << '\n'
172 << " neutron: " << separationEnergy[Neutron] << '\n'
173 << " delta++: " << separationEnergy[DeltaPlusPlus] << '\n'
174 << " delta+: " << separationEnergy[DeltaPlus] << '\n'
175 << " delta0: " << separationEnergy[DeltaZero] << '\n'
176 << " delta-: " << separationEnergy[DeltaMinus] << '\n'
177 << " pi+: " << separationEnergy[PiPlus] << '\n'
178 << " pi0: " << separationEnergy[PiZero] << '\n'
179 << " pi-: " << separationEnergy[PiMinus] << '\n'
180 << " eta: " << separationEnergy[Eta] << '\n'
181 << " omega: " << separationEnergy[Omega] << '\n'
182 << " etaprime:" << separationEnergy[EtaPrime] << '\n'
183 << " photon: " << separationEnergy[Photon] << '\n'
184 << " lambda: " << separationEnergy[Lambda] << '\n'
185 << " sigmaplus: " << separationEnergy[SigmaPlus] << '\n'
186 << " sigmazero: " << separationEnergy[SigmaZero] << '\n'
187 << " sigmaminus: " << separationEnergy[SigmaMinus] << '\n'
188 << " kplus: " << separationEnergy[KPlus] << '\n'
189 << " kzero: " << separationEnergy[KZero] << '\n'
190 << " kzerobar: " << separationEnergy[KZeroBar] << '\n'
191 << " kminus: " << separationEnergy[KMinus] << '\n'
192 << " kshort: " << separationEnergy[KShort] << '\n'
193 << " klong: " << separationEnergy[KLong] << '\n'
194 );
195
196 INCL_DEBUG("Table of Fermi energies [MeV] for A=" << theA << ", Z=" << theZ << ":" << '\n'
197 << " proton: " << fermiEnergy[Proton] << '\n'
198 << " neutron: " << fermiEnergy[Neutron] << '\n'
199 << " delta++: " << fermiEnergy[DeltaPlusPlus] << '\n'
200 << " delta+: " << fermiEnergy[DeltaPlus] << '\n'
201 << " delta0: " << fermiEnergy[DeltaZero] << '\n'
202 << " delta-: " << fermiEnergy[DeltaMinus] << '\n'
203 << " lambda: " << fermiEnergy[Lambda] << '\n'
204 << " sigma+: " << fermiEnergy[SigmaPlus] << '\n'
205 << " sigma0: " << fermiEnergy[SigmaZero] << '\n'
206 << " sigma-: " << fermiEnergy[SigmaMinus] << '\n'
207 );
208
209 INCL_DEBUG("Table of Fermi momenta [MeV/c] for A=" << theA << ", Z=" << theZ << ":" << '\n'
210 << " proton: " << fermiMomentum[Proton] << '\n'
211 << " neutron: " << fermiMomentum[Neutron] << '\n'
212 );
213 }
214
216
217 switch( particle->getType() )
218 {
219 case Proton:
220 return vProton;
221 break;
222 case Neutron:
223 return vNeutron;
224 break;
225
226 case PiPlus:
227 case PiZero:
228 case PiMinus:
229 return computePionPotentialEnergy(particle);
230 break;
231
232 case SigmaPlus:
233 return vSigmaPlus;
234 break;
235 case SigmaZero:
236 return vSigmaZero;
237 break;
238 case Lambda:
239 return vLambda;
240 break;
241 case SigmaMinus:
242 return vSigmaMinus;
243 break;
244
245 case Eta:
246 case Omega:
247 case EtaPrime:
249 break;
250
251 case KPlus:
252 case KZero:
253 case KZeroBar:
254 case KMinus:
255 case KShort:
256 case KLong:
257 return computeKaonPotentialEnergy(particle);
258 break;
259
260 case Photon:
261 return 0.0;
262 break;
263
264 case antiProton:
265 return vantiProton;
266 break;
267 case antiNeutron:
268 return vantiNeutron;
269 break;
270 case antiLambda:
271 return 0.0;
272 break;
273 case antiSigmaMinus:
274 return 0.0;
275 break;
276 case antiSigmaPlus:
277 return 0.0;
278 break;
279 case antiSigmaZero:
280 return 0.0;
281 break;
282 case antiXiMinus:
283 return 0.0;
284 break;
285 case antiXiZero:
286 return 0.0;
287 break;
288 case XiMinus:
289 return 0.0;
290 break;
291 case XiZero:
292 return 0.0;
293 break;
294
295 case DeltaPlusPlus:
296 return vDeltaPlusPlus;
297 break;
298 case DeltaPlus:
299 return vDeltaPlus;
300 break;
301 case DeltaZero:
302 return vDeltaZero;
303 break;
304 case DeltaMinus:
305 return vDeltaMinus;
306 break;
307 case Composite:
308 INCL_ERROR("No potential computed for particle of type Cluster.");
309 return 0.0;
310 break;
311 case antiComposite:
312 INCL_ERROR("No potential computed for particle of type Cluster");
313 return 0.0;
314 break;
315 case UnknownParticle:
316 INCL_ERROR("Trying to compute potential energy for an unknown particle.");
317 return 0.0;
318 break;
319 }
320
321 INCL_ERROR("There is no potential for this type of particle.");
322 return 0.0;
323 }
324
325 }
326}
327
#define INCL_ERROR(x)
#define INCL_DEBUG(x)
Isospin- and energy-independent nuclear potential.
Isospin-dependent nuclear potential.
double G4double
Definition G4Types.hh:83
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
const G4double A[17]
G4double computePionPotentialEnergy(const Particle *const p) const
Compute the potential energy for the given pion.
std::map< ParticleType, G4double > fermiMomentum
const G4int theA
The mass number of the nucleus.
std::map< ParticleType, G4double > separationEnergy
G4double computePionResonancePotentialEnergy(const Particle *const p) const
Compute the potential energy for the given pion resonances (Eta, Omega and EtaPrime and Gamma also).
G4double computeKaonPotentialEnergy(const Particle *const p) const
Compute the potential energy for the given kaon.
INuclearPotential(const G4int A, const G4int Z, const G4bool pionPot)
const G4int theZ
The charge number of the nucleus.
NuclearPotentialIsospin(const G4int A, const G4int Z, const G4bool pionPotential)
virtual G4double computePotentialEnergy(const Particle *const p) const
G4INCL::ParticleType getType() const
G4double pow13(G4double x)
G4ThreadLocal FermiMomentumFn getFermiMomentum
G4ThreadLocal SeparationEnergyFn getSeparationEnergy
Static pointer to the separation-energy function.
G4double getINCLMass(const G4int A, const G4int Z, const G4int S)
Get INCL nuclear mass (in MeV/c^2).