Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4NeutronHPChannelList.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// neutron_hp -- source file
27// J.P. Wellisch, Nov-1996
28// A prototype of the low energy neutron transport model.
29//
30// 070523 bug fix for G4FPE_DEBUG on by A. Howard ( and T. Koi)
31//
33#include "G4Element.hh"
34#include "G4HadFinalState.hh"
35#include "G4HadProjectile.hh"
37
38 G4int G4NeutronHPChannelList::trycounter = 0;
39
41 {
42 nChannels = n;
43 theChannels = new G4NeutronHPChannel * [n];
44 allChannelsCreated = false;
45 theInitCount = 0;
46 }
47
49 {
50 nChannels = 0;
51 theChannels = 0;
52 allChannelsCreated = false;
53 theInitCount = 0;
54 }
55
57 {
58 if(theChannels!=0)
59 {
60 for(G4int i=0;i<nChannels; i++)
61 {
62 delete theChannels[i];
63 }
64 delete [] theChannels;
65 }
66 }
67
69 #include "G4NeutronHPManager.hh"
71 {
73 G4int i, ii;
74 // decide on the isotope
75 G4int numberOfIsos(0);
76 for(ii=0; ii<nChannels; ii++)
77 {
78 numberOfIsos = theChannels[ii]->GetNiso();
79 if(numberOfIsos!=0) break;
80 }
81 G4double * running= new G4double [numberOfIsos];
82 running[0] = 0;
83 for(i=0;i<numberOfIsos; i++)
84 {
85 if(i!=0) running[i] = running[i-1];
86 for(ii=0; ii<nChannels; ii++)
87 {
88 if(theChannels[ii]->HasAnyData(i))
89 {
90 running[i] +=theChannels[ii]->GetWeightedXsec(aThermalE.GetThermalEnergy(aTrack,
91 theChannels[ii]->GetN(i),
92 theChannels[ii]->GetZ(i),
93 aTrack.GetMaterial()->GetTemperature()),
94 i);
95 }
96 }
97 }
98 G4int isotope=nChannels-1;
99 G4double random=G4UniformRand();
100 for(i=0;i<numberOfIsos; i++)
101 {
102 isotope = i;
103 //if(random<running[i]/running[numberOfIsos-1]) break;
104 if(running[numberOfIsos-1] != 0) if(random<running[i]/running[numberOfIsos-1]) break;
105 }
106 delete [] running;
107
108 // decide on the channel
109 running = new G4double[nChannels];
110 running[0]=0;
111 G4int targA=-1; // For production of unChanged
112 G4int targZ=-1;
113 for(i=0; i<nChannels; i++)
114 {
115 if(i!=0) running[i] = running[i-1];
116 if(theChannels[i]->HasAnyData(isotope))
117 {
118 running[i] += theChannels[i]->GetFSCrossSection(aThermalE.GetThermalEnergy(aTrack,
119 theChannels[i]->GetN(isotope),
120 theChannels[i]->GetZ(isotope),
121 aTrack.GetMaterial()->GetTemperature()),
122 isotope);
123 targA=(G4int)theChannels[i]->GetN(isotope); //Will be simply used the last valid value
124 targZ=(G4int)theChannels[i]->GetZ(isotope);
125 }
126 }
127
128 //TK120607
129 if ( running[nChannels-1] == 0 )
130 {
131 //This happened usually by the miss match between the cross section data and model
132 if ( targA == -1 && targZ == -1 ) {
133 throw G4HadronicException(__FILE__, __LINE__, "NeutronHP model encounter lethal discrepancy with cross section data");
134 }
135
136 //TK121106
137 G4cout << "Warning from NeutronHP: could not find proper reaction channel. This may cause by inconsistency between cross section and model. Unchanged final states are returned." << G4endl;
138 unChanged.Clear();
139
140 //For Ep Check create unchanged final state including rest target
141 G4ParticleDefinition* targ_pd = G4ParticleTable::GetParticleTable()->GetIon ( targZ , targA , 0.0 );
142 G4DynamicParticle* targ_dp = new G4DynamicParticle( targ_pd , G4ThreeVector(1,0,0), 0.0 );
143 unChanged.SetEnergyChange(aTrack.GetKineticEnergy());
144 unChanged.SetMomentumChange(aTrack.Get4Momentum().vect() );
145 unChanged.AddSecondary(targ_dp);
146 //TK121106
149 return &unChanged;
150 }
151 //TK120607
152
153
154 G4int lChan=0;
155 random=G4UniformRand();
156 for(i=0; i<nChannels; i++)
157 {
158 lChan = i;
159 if(running[nChannels-1] != 0) if(random<running[i]/running[nChannels-1]) break;
160 }
161 delete [] running;
162 return theChannels[lChan]->ApplyYourself(aTrack, isotope);
163 }
164
165 void G4NeutronHPChannelList::Init(G4Element * anElement, const G4String & dirName)
166 {
167 theDir = dirName;
168// G4cout << theDir << G4endl;
169 theElement = anElement;
170// G4cout << theElement << G4endl;
171 ;
172 }
173
175 const G4String & aName)
176 {
177 if(!allChannelsCreated)
178 {
179 if(nChannels!=0)
180 {
181 G4NeutronHPChannel ** theBuffer = new G4NeutronHPChannel * [nChannels+1];
182 G4int i;
183 for(i=0; i<nChannels; i++)
184 {
185 theBuffer[i] = theChannels[i];
186 }
187 delete [] theChannels;
188 theChannels = theBuffer;
189 }
190 else
191 {
192 theChannels = new G4NeutronHPChannel * [nChannels+1];
193 }
194 G4String name;
195 name = aName+"/";
196 theChannels[nChannels] = new G4NeutronHPChannel;
197 theChannels[nChannels]->Init(theElement, theDir, name);
198 nChannels++;
199 }
200
201 //110527TKDB Unnessary codes, Detected by gcc4.6 compiler
202 //G4bool result;
203 //result = theChannels[theInitCount]->Register(theFS);
204 theChannels[theInitCount]->Register(theFS);
205 theInitCount++;
206 }
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:53
Hep3Vector vect() const
void AddSecondary(G4DynamicParticle *aP)
void SetEnergyChange(G4double anEnergy)
void SetMomentumChange(const G4ThreeVector &aV)
const G4Material * GetMaterial() const
G4double GetKineticEnergy() const
const G4LorentzVector & Get4Momentum() const
G4double GetTemperature() const
Definition: G4Material.hh:181
void Register(G4NeutronHPFinalState *theFS, const G4String &aName)
G4HadFinalState * ApplyYourself(const G4Element *theElement, const G4HadProjectile &aTrack)
G4double GetN(G4int i)
G4bool Register(G4NeutronHPFinalState *theFS)
G4HadFinalState * ApplyYourself(const G4HadProjectile &theTrack, G4int isoNumber=-1)
G4double GetFSCrossSection(G4double energy, G4int isoNumber)
G4double GetZ(G4int i)
void Init(G4Element *theElement, const G4String dirName)
G4double GetWeightedXsec(G4double energy, G4int isoNumber)
static G4NeutronHPManager * GetInstance()
G4NeutronHPReactionWhiteBoard * GetReactionWhiteBoard()
G4double GetThermalEnergy(const G4HadProjectile &aP, const G4Element *anE, G4double aT)
static G4ParticleTable * GetParticleTable()
G4ParticleDefinition * GetIon(G4int atomicNumber, G4int atomicMass, G4double excitationEnergy)