Geant4  10.00.p03
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 // Pekka Kaitaniemi, CEA and Helsinki Institute of Physics
28 // Davide Mancusi, CEA
29 // Alain Boudard, CEA
30 // Sylvie Leray, CEA
31 // Joseph Cugnon, University of Liege
32 //
33 #define INCLXX_IN_GEANT4_MODE 1
34 
35 #include "globals.hh"
36 
48 #include "G4INCLParticleTable.hh"
49 #include "G4INCLGlobals.hh"
50 
51 namespace G4INCL {
52 
53  namespace NuclearPotential {
54 
55  // Constructors
57  : INuclearPotential(A, Z, aPionPotential)
58  {
59  initialize();
60  }
61 
62  // Destructor
64 
66  const G4double ZOverA = ((G4double) theZ) / ((G4double) theA);
67 
70 
71  const G4double theFermiMomentum = ParticleTable::getFermiMomentum(theA,theZ);
72 
73  fermiMomentum[Proton] = theFermiMomentum * Math::pow13(2.*ZOverA);
74  const G4double theProtonFermiEnergy = std::sqrt(fermiMomentum[Proton]*fermiMomentum[Proton] + mp*mp) - mp;
75  fermiEnergy[Proton] = theProtonFermiEnergy;
76  // Use separation energies from the ParticleTable
77  const G4double theProtonSeparationEnergy = ParticleTable::getSeparationEnergy(Proton,theA,theZ);
78  separationEnergy[Proton] = theProtonSeparationEnergy;
79  vProton = theProtonFermiEnergy + theProtonSeparationEnergy;
80 
81  fermiMomentum[Neutron] = theFermiMomentum * Math::pow13(2.*(1.-ZOverA));
82  const G4double theNeutronFermiEnergy = std::sqrt(fermiMomentum[Neutron]*fermiMomentum[Neutron] + mn*mn) - mn;
83  fermiEnergy[Neutron] = theNeutronFermiEnergy;
84  // Use separation energies from the ParticleTable
85  const G4double theNeutronSeparationEnergy = ParticleTable::getSeparationEnergy(Neutron,theA,theZ);
86  separationEnergy[Neutron] = theNeutronSeparationEnergy;
87  vNeutron = theNeutronFermiEnergy + theNeutronSeparationEnergy;
88 
89  const G4double separationEnergyDeltaPlusPlus = 2.*theProtonSeparationEnergy - theNeutronSeparationEnergy;
90  separationEnergy[DeltaPlusPlus] = separationEnergyDeltaPlusPlus;
91  separationEnergy[DeltaPlus] = theProtonSeparationEnergy;
92  separationEnergy[DeltaZero] = theNeutronSeparationEnergy;
93  const G4double separationEnergyDeltaMinus = 2.*theNeutronSeparationEnergy - theProtonSeparationEnergy;
94  separationEnergy[DeltaMinus] = separationEnergyDeltaMinus;
95 
96  const G4double tinyMargin = 1E-7;
99  vDeltaPlusPlus = std::max(separationEnergyDeltaPlusPlus + tinyMargin, 2.*vDeltaPlus - vDeltaZero);
100  vDeltaMinus = std::max(separationEnergyDeltaMinus + tinyMargin, 2.*vDeltaZero - vDeltaPlus);
101 
102  separationEnergy[PiPlus] = theProtonSeparationEnergy - theNeutronSeparationEnergy;
103  separationEnergy[PiZero] = 0.;
104  separationEnergy[PiMinus] = theNeutronSeparationEnergy - theProtonSeparationEnergy;
105 
107  fermiEnergy[DeltaPlus] = vDeltaPlus - separationEnergy[DeltaPlus];
108  fermiEnergy[DeltaZero] = vDeltaZero - separationEnergy[DeltaZero];
109  fermiEnergy[DeltaMinus] = vDeltaMinus - separationEnergy[DeltaMinus];
110 
111  INCL_DEBUG("Table of separation energies [MeV] for A=" << theA << ", Z=" << theZ << ":" << std::endl
112  << " proton: " << separationEnergy[Proton] << std::endl
113  << " neutron: " << separationEnergy[Neutron] << std::endl
114  << " delta++: " << separationEnergy[DeltaPlusPlus] << std::endl
115  << " delta+: " << separationEnergy[DeltaPlus] << std::endl
116  << " delta0: " << separationEnergy[DeltaZero] << std::endl
117  << " delta-: " << separationEnergy[DeltaMinus] << std::endl
118  << " pi+: " << separationEnergy[PiPlus] << std::endl
119  << " pi0: " << separationEnergy[PiZero] << std::endl
120  << " pi-: " << separationEnergy[PiMinus] << std::endl
121  );
122 
123  INCL_DEBUG("Table of Fermi energies [MeV] for A=" << theA << ", Z=" << theZ << ":" << std::endl
124  << " proton: " << fermiEnergy[Proton] << std::endl
125  << " neutron: " << fermiEnergy[Neutron] << std::endl
126  << " delta++: " << fermiEnergy[DeltaPlusPlus] << std::endl
127  << " delta+: " << fermiEnergy[DeltaPlus] << std::endl
128  << " delta0: " << fermiEnergy[DeltaZero] << std::endl
129  << " delta-: " << fermiEnergy[DeltaMinus] << std::endl
130  );
131 
132  INCL_DEBUG("Table of Fermi momenta [MeV/c] for A=" << theA << ", Z=" << theZ << ":" << std::endl
133  << " proton: " << fermiMomentum[Proton] << std::endl
134  << " neutron: " << fermiMomentum[Neutron] << std::endl
135  );
136  }
137 
139 
140  switch( particle->getType() )
141  {
142  case Proton:
143  return vProton;
144  break;
145  case Neutron:
146  return vNeutron;
147  break;
148 
149  case PiPlus:
150  case PiZero:
151  case PiMinus:
152  return computePionPotentialEnergy(particle);
153  break;
154 
155  case DeltaPlusPlus:
156  return vDeltaPlusPlus;
157  break;
158  case DeltaPlus:
159  return vDeltaPlus;
160  break;
161  case DeltaZero:
162  return vDeltaZero;
163  break;
164  case DeltaMinus:
165  return vDeltaMinus;
166  break;
167  case Composite:
168  INCL_ERROR("No potential computed for particle of type Cluster.");
169  return 0.0;
170  break;
171  case UnknownParticle:
172  INCL_ERROR("Trying to compute potential energy for an unknown particle.");
173  return 0.0;
174  break;
175  }
176 
177  INCL_ERROR("There is no potential for this type of particle.");
178  return 0.0;
179  }
180 
181  }
182 }
183 
virtual G4double computePotentialEnergy(const Particle *const p) const
std::map< ParticleType, G4double > fermiEnergy
#define INCL_ERROR(x)
int G4int
Definition: G4Types.hh:78
bool G4bool
Definition: G4Types.hh:79
const G4int theA
The mass number of the nucleus.
Isospin-dependent nuclear potential.
static const G4double A[nN]
Isospin- and energy-independent nuclear potential.
G4ThreadLocal SeparationEnergyFn getSeparationEnergy
Static pointer to the separation-energy function.
G4double getINCLMass(const G4int A, const G4int Z)
Get INCL nuclear mass (in MeV/c^2)
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4INCL::ParticleType getType() const
Get the particle type.
NuclearPotentialIsospin(const G4int A, const G4int Z, const G4bool pionPotential)
std::map< ParticleType, G4double > separationEnergy
const G4int theZ
The charge number of the nucleus.
G4double computePionPotentialEnergy(const Particle *const p) const
Compute the potential energy for the given pion.
double G4double
Definition: G4Types.hh:76
#define INCL_DEBUG(x)
std::map< ParticleType, G4double > fermiMomentum
G4double pow13(G4double x)
G4ThreadLocal FermiMomentumFn getFermiMomentum