Geant4  10.03.p01
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 
49 #include "G4INCLParticleTable.hh"
50 #include "G4INCLGlobals.hh"
51 
52 namespace 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 
71 
72  const G4double theFermiMomentum = ParticleTable::getFermiMomentum(theA,theZ);
73 
74  fermiMomentum[Proton] = theFermiMomentum * Math::pow13(2.*ZOverA);
75  const G4double theProtonFermiEnergy = std::sqrt(fermiMomentum[Proton]*fermiMomentum[Proton] + mp*mp) - mp;
76  fermiEnergy[Proton] = theProtonFermiEnergy;
77  // Use separation energies from the ParticleTable
78  const G4double theProtonSeparationEnergy = ParticleTable::getSeparationEnergy(Proton,theA,theZ);
79  separationEnergy[Proton] = theProtonSeparationEnergy;
80  vProton = theProtonFermiEnergy + theProtonSeparationEnergy;
81 
82  fermiMomentum[Neutron] = theFermiMomentum * Math::pow13(2.*(1.-ZOverA));
83  const G4double theNeutronFermiEnergy = std::sqrt(fermiMomentum[Neutron]*fermiMomentum[Neutron] + mn*mn) - mn;
84  fermiEnergy[Neutron] = theNeutronFermiEnergy;
85  // Use separation energies from the ParticleTable
86  const G4double theNeutronSeparationEnergy = ParticleTable::getSeparationEnergy(Neutron,theA,theZ);
87  separationEnergy[Neutron] = theNeutronSeparationEnergy;
88  vNeutron = theNeutronFermiEnergy + theNeutronSeparationEnergy;
89 
90  const G4double separationEnergyDeltaPlusPlus = 2.*theProtonSeparationEnergy - theNeutronSeparationEnergy;
91  separationEnergy[DeltaPlusPlus] = separationEnergyDeltaPlusPlus;
92  separationEnergy[DeltaPlus] = theProtonSeparationEnergy;
93  separationEnergy[DeltaZero] = theNeutronSeparationEnergy;
94  const G4double separationEnergyDeltaMinus = 2.*theNeutronSeparationEnergy - theProtonSeparationEnergy;
95  separationEnergy[DeltaMinus] = separationEnergyDeltaMinus;
96 
97  const G4double tinyMargin = 1E-7;
98  vDeltaPlus = vProton;
99  vDeltaZero = vNeutron;
100  vDeltaPlusPlus = std::max(separationEnergyDeltaPlusPlus + tinyMargin, 2.*vDeltaPlus - vDeltaZero);
101  vDeltaMinus = std::max(separationEnergyDeltaMinus + tinyMargin, 2.*vDeltaZero - vDeltaPlus);
102 
103  separationEnergy[PiPlus] = theProtonSeparationEnergy - theNeutronSeparationEnergy;
104  separationEnergy[PiZero] = 0.;
105  separationEnergy[PiMinus] = theNeutronSeparationEnergy - theProtonSeparationEnergy;
106 
107  separationEnergy[Eta] = 0.;
108  separationEnergy[Omega] = 0.;
110  separationEnergy[Photon] = 0.;
111 
113  fermiEnergy[DeltaPlus] = vDeltaPlus - separationEnergy[DeltaPlus];
114  fermiEnergy[DeltaZero] = vDeltaZero - separationEnergy[DeltaZero];
115  fermiEnergy[DeltaMinus] = vDeltaMinus - separationEnergy[DeltaMinus];
116 
117  INCL_DEBUG("Table of separation energies [MeV] for A=" << theA << ", Z=" << theZ << ":" << '\n'
118  << " proton: " << separationEnergy[Proton] << '\n'
119  << " neutron: " << separationEnergy[Neutron] << '\n'
120  << " delta++: " << separationEnergy[DeltaPlusPlus] << '\n'
121  << " delta+: " << separationEnergy[DeltaPlus] << '\n'
122  << " delta0: " << separationEnergy[DeltaZero] << '\n'
123  << " delta-: " << separationEnergy[DeltaMinus] << '\n'
124  << " pi+: " << separationEnergy[PiPlus] << '\n'
125  << " pi0: " << separationEnergy[PiZero] << '\n'
126  << " pi-: " << separationEnergy[PiMinus] << '\n'
127  << " eta: " << separationEnergy[Eta] << '\n'
128  << " omega: " << separationEnergy[Omega] << '\n'
129  << " etaprime:" << separationEnergy[EtaPrime] << '\n'
130  << " photon: " << separationEnergy[Photon] << '\n'
131  );
132 
133  INCL_DEBUG("Table of Fermi energies [MeV] for A=" << theA << ", Z=" << theZ << ":" << '\n'
134  << " proton: " << fermiEnergy[Proton] << '\n'
135  << " neutron: " << fermiEnergy[Neutron] << '\n'
136  << " delta++: " << fermiEnergy[DeltaPlusPlus] << '\n'
137  << " delta+: " << fermiEnergy[DeltaPlus] << '\n'
138  << " delta0: " << fermiEnergy[DeltaZero] << '\n'
139  << " delta-: " << fermiEnergy[DeltaMinus] << '\n'
140  );
141 
142  INCL_DEBUG("Table of Fermi momenta [MeV/c] for A=" << theA << ", Z=" << theZ << ":" << '\n'
143  << " proton: " << fermiMomentum[Proton] << '\n'
144  << " neutron: " << fermiMomentum[Neutron] << '\n'
145  );
146  }
147 
149 
150  switch( particle->getType() )
151  {
152  case Proton:
153  return vProton;
154  break;
155  case Neutron:
156  return vNeutron;
157  break;
158 
159  case PiPlus:
160  case PiZero:
161  case PiMinus:
162  return computePionPotentialEnergy(particle);
163  break;
164 
165  case Eta:
166  case Omega:
167  case EtaPrime:
168  return computePionResonancePotentialEnergy(particle);
169  break;
170 
171  case Photon:
172  return 0.0;
173  break;
174 
175  case DeltaPlusPlus:
176  return vDeltaPlusPlus;
177  break;
178  case DeltaPlus:
179  return vDeltaPlus;
180  break;
181  case DeltaZero:
182  return vDeltaZero;
183  break;
184  case DeltaMinus:
185  return vDeltaMinus;
186  break;
187  case Composite:
188  INCL_ERROR("No potential computed for particle of type Cluster.");
189  return 0.0;
190  break;
191  case UnknownParticle:
192  INCL_ERROR("Trying to compute potential energy for an unknown particle.");
193  return 0.0;
194  break;
195  }
196 
197  INCL_ERROR("There is no potential for this type of particle.");
198  return 0.0;
199  }
200 
201  }
202 }
203 
virtual G4double computePotentialEnergy(const Particle *const p) const
std::map< ParticleType, G4double > fermiEnergy
#define INCL_ERROR(x)
int G4int
Definition: G4Types.hh:78
double A(double temperature)
bool G4bool
Definition: G4Types.hh:79
const G4int theA
The mass number of the nucleus.
Isospin-dependent nuclear potential.
Isospin- and energy-independent nuclear potential.
G4ThreadLocal SeparationEnergyFn getSeparationEnergy
Static pointer to the separation-energy function.
G4double computePionResonancePotentialEnergy(const Particle *const p) const
Compute the potential energy for the given pion resonances (Eta, Omega and EtaPrime and Gamma also)...
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
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