Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4RegionModel.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 // $Id$
27 //
28 // 20100319 M. Kelsey -- Eliminate unnecessary use of std::pow()
29 // 20101019 M. Kelsey -- CoVerity report: unitialized constructor
30 
31 #include "G4RegionModel.hh"
32 #include "G4PhysicalConstants.hh"
33 #include "G4HadronicException.hh"
35 
36 using namespace G4InuclSpecialFunctions;
37 
38 const G4double G4RegionModel::radius0 = 1.0E-15;
39 const G4double G4RegionModel::BE = 7;
40 
41 G4RegionModel::G4RegionModel(const G4int numberOfLayers,
42  const G4int A, const G4int Z)
43  : massNumber(A), protonNumber(Z)
44 {
45  //count the radiuses, densities and fermi momenta with A and Z
46  G4double r = radius0*G4cbrt(A);
47 
48  if(numberOfLayers==1){
49  radius.push_back(r);
50 
51  G4double vol = 4.0/3.0 * pi * r*r*r;
52  G4double rho = G4double(A) / vol;
53  density.push_back(rho);
54 
55  G4double protonMass = G4Proton::Proton()->GetPDGMass();
56  G4double neutronMass = G4Neutron::Neutron()->GetPDGMass();
57  G4double protonDensity = G4double(Z) / vol;
58  G4double neutronDensity = G4double(A-Z) / vol;
59 
60  protonFermiEnergy.push_back(GetFermiEnergy(protonDensity, protonMass));
61  neutronFermiEnergy.push_back(GetFermiEnergy(neutronDensity, neutronMass));
62 
63  protonFermiMomentum.push_back(GetFermiMomentum(protonDensity, protonMass));
64  neutronFermiMomentum.push_back(GetFermiMomentum(neutronDensity, neutronMass));
65 
66  G4double fermiEP = *protonFermiEnergy.begin();
67  G4double fermiEN = *neutronFermiEnergy.begin();
68  protonPotentialEnergy.push_back(-(fermiEP + BE));
69  neutronPotentialEnergy.push_back(-(fermiEN + BE));
70  }
71  else{
72  if(numberOfLayers==3){
73  radius.push_back(0.1*r);
74  radius.push_back(0.2*r);
75  radius.push_back(0.9*r);
76 
77  }
78  }
79 }
80 
82 
84  my_iterator j=density.begin();
85  for(my_iterator i=radius.begin(); i<radius.end(); i++){
86  if(r <= *i) return *j;
87  j++;
88  }
89  return 0;
90 }
91 
93  if(particle == 0){ //proton
94  my_iterator j=protonPotentialEnergy.begin();
95  for(my_iterator i=radius.begin(); i<radius.end(); i++){
96  if(r <= *i) return *j;
97  j++;
98  }
99  return 0;
100  }
101 
102  if(particle == 1){ //neutron
103  my_iterator j=neutronPotentialEnergy.begin();
104  for(my_iterator i=radius.begin(); i<radius.end(); i++){
105  if(r <= *i) return *j;
106  j++;
107  }
108  return 0;
109  }
110  return 0;
111 }
112 
114  G4int nucleon){
115  if(nucleon == 0){
116  my_iterator j=protonFermiMomentum.begin();
117  for(my_iterator i=radius.begin(); i<radius.end(); i++){
118  if(r <= *i) return *j;
119  j++;
120  }
121  }
122  if(nucleon==1){
123  my_iterator j=neutronFermiMomentum.begin();
124  for(my_iterator i=radius.begin(); i<radius.end(); i++){
125  if(r <= *i) return *j;
126  j++;
127  }
128  }
129  throw G4HadronicException(__FILE__, __LINE__, "G4RegionModel::GetMaximumNucleonMomentum - return value undefined");
130  return 0;
131 
132 }
133 
134 G4double G4RegionModel::GetFermiMomentum(G4double aDensity,
135  G4double aMass){
136  return std::sqrt(2*aMass*GetFermiEnergy(aDensity, aMass));
137 }
138 
139 G4double G4RegionModel::GetFermiEnergy(G4double aDensity,
140  G4double aMass){
141  G4double densFactor = G4cbrt(3.0*pi2*aDensity); // 2/3 power
142  densFactor *= densFactor;
143 
144  return hbar_Planck*hbar_Planck/(2.0*aMass) * densFactor;
145 }
146 
147 
148 
149 
150 
151 
152 
153 
154 
155 
156 
157 
158 
159