Geant4 11.1.1
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 const G4double asy = (theA - 2.*theZ)/theA;
110 // Jose Luis Rodriguez-Sanchez et al., Rapid Communication PRC 98, 021602 (2018)
111 if (asy > 0.236) vLambda = 40.91;
112 else if (asy > 0.133) vLambda = 56.549 - 678.73*asy + 4905.35*asy*asy - 9789.1*asy*asy*asy;
113
114 const G4double theLambdaSeparationEnergy = ParticleTable::getSeparationEnergy(Lambda,theA,theZ);
115
116 separationEnergy[PiPlus] = theProtonSeparationEnergy - theNeutronSeparationEnergy;
118 separationEnergy[PiMinus] = theNeutronSeparationEnergy - theProtonSeparationEnergy;
119
120 separationEnergy[Eta] = 0.;
124
125 separationEnergy[Lambda] = theLambdaSeparationEnergy;
126 separationEnergy[SigmaPlus] = theProtonSeparationEnergy + theLambdaSeparationEnergy - theNeutronSeparationEnergy;
127 separationEnergy[SigmaZero] = theLambdaSeparationEnergy;
128 separationEnergy[SigmaMinus] = theNeutronSeparationEnergy + theLambdaSeparationEnergy - theProtonSeparationEnergy;
129
130 separationEnergy[KPlus] = theProtonSeparationEnergy - theLambdaSeparationEnergy;
131 separationEnergy[KZero] = (theNeutronSeparationEnergy - theLambdaSeparationEnergy);
132 separationEnergy[KZeroBar] = (theLambdaSeparationEnergy - theNeutronSeparationEnergy);
133 separationEnergy[KMinus] = 2.*theNeutronSeparationEnergy - theProtonSeparationEnergy-theLambdaSeparationEnergy;
134
135 separationEnergy[KShort] = (theNeutronSeparationEnergy - theLambdaSeparationEnergy);
136 separationEnergy[KLong] = (theNeutronSeparationEnergy - theLambdaSeparationEnergy);
137
142
144 if (fermiEnergy[Lambda] <= 0.)
146 else
147 fermiMomentum[Lambda]=std::sqrt(std::pow(fermiEnergy[Lambda]+ml,2.0)-ml*ml);
148
152
153 INCL_DEBUG("Table of separation energies [MeV] for A=" << theA << ", Z=" << theZ << ":" << '\n'
154 << " proton: " << separationEnergy[Proton] << '\n'
155 << " neutron: " << separationEnergy[Neutron] << '\n'
156 << " delta++: " << separationEnergy[DeltaPlusPlus] << '\n'
157 << " delta+: " << separationEnergy[DeltaPlus] << '\n'
158 << " delta0: " << separationEnergy[DeltaZero] << '\n'
159 << " delta-: " << separationEnergy[DeltaMinus] << '\n'
160 << " pi+: " << separationEnergy[PiPlus] << '\n'
161 << " pi0: " << separationEnergy[PiZero] << '\n'
162 << " pi-: " << separationEnergy[PiMinus] << '\n'
163 << " eta: " << separationEnergy[Eta] << '\n'
164 << " omega: " << separationEnergy[Omega] << '\n'
165 << " etaprime:" << separationEnergy[EtaPrime] << '\n'
166 << " photon: " << separationEnergy[Photon] << '\n'
167 << " lambda: " << separationEnergy[Lambda] << '\n'
168 << " sigmaplus: " << separationEnergy[SigmaPlus] << '\n'
169 << " sigmazero: " << separationEnergy[SigmaZero] << '\n'
170 << " sigmaminus: " << separationEnergy[SigmaMinus] << '\n'
171 << " kplus: " << separationEnergy[KPlus] << '\n'
172 << " kzero: " << separationEnergy[KZero] << '\n'
173 << " kzerobar: " << separationEnergy[KZeroBar] << '\n'
174 << " kminus: " << separationEnergy[KMinus] << '\n'
175 << " kshort: " << separationEnergy[KShort] << '\n'
176 << " klong: " << separationEnergy[KLong] << '\n'
177 );
178
179 INCL_DEBUG("Table of Fermi energies [MeV] for A=" << theA << ", Z=" << theZ << ":" << '\n'
180 << " proton: " << fermiEnergy[Proton] << '\n'
181 << " neutron: " << fermiEnergy[Neutron] << '\n'
182 << " delta++: " << fermiEnergy[DeltaPlusPlus] << '\n'
183 << " delta+: " << fermiEnergy[DeltaPlus] << '\n'
184 << " delta0: " << fermiEnergy[DeltaZero] << '\n'
185 << " delta-: " << fermiEnergy[DeltaMinus] << '\n'
186 << " lambda: " << fermiEnergy[Lambda] << '\n'
187 << " sigma+: " << fermiEnergy[SigmaPlus] << '\n'
188 << " sigma0: " << fermiEnergy[SigmaZero] << '\n'
189 << " sigma-: " << fermiEnergy[SigmaMinus] << '\n'
190 );
191
192 INCL_DEBUG("Table of Fermi momenta [MeV/c] for A=" << theA << ", Z=" << theZ << ":" << '\n'
193 << " proton: " << fermiMomentum[Proton] << '\n'
194 << " neutron: " << fermiMomentum[Neutron] << '\n'
195 );
196 }
197
199
200 switch( particle->getType() )
201 {
202 case Proton:
203 return vProton;
204 break;
205 case Neutron:
206 return vNeutron;
207 break;
208
209 case PiPlus:
210 case PiZero:
211 case PiMinus:
212 return computePionPotentialEnergy(particle);
213 break;
214
215 case SigmaPlus:
216 return vSigmaPlus;
217 break;
218 case SigmaZero:
219 return vSigmaZero;
220 break;
221 case Lambda:
222 return vLambda;
223 break;
224 case SigmaMinus:
225 return vSigmaMinus;
226 break;
227
228 case Eta:
229 case Omega:
230 case EtaPrime:
232 break;
233
234 case KPlus:
235 case KZero:
236 case KZeroBar:
237 case KMinus:
238 case KShort:
239 case KLong:
240 return computeKaonPotentialEnergy(particle);
241 break;
242
243 case Photon:
244 return 0.0;
245 break;
246
247 case DeltaPlusPlus:
248 return vDeltaPlusPlus;
249 break;
250 case DeltaPlus:
251 return vDeltaPlus;
252 break;
253 case DeltaZero:
254 return vDeltaZero;
255 break;
256 case DeltaMinus:
257 return vDeltaMinus;
258 break;
259 case Composite:
260 INCL_ERROR("No potential computed for particle of type Cluster.");
261 return 0.0;
262 break;
263 case UnknownParticle:
264 INCL_ERROR("Trying to compute potential energy for an unknown particle.");
265 return 0.0;
266 break;
267 }
268
269 INCL_ERROR("There is no potential for this type of particle.");
270 return 0.0;
271 }
272
273 }
274}
275
#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 G4int Z[17]
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.
std::map< ParticleType, G4double > fermiEnergy
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)