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
G4LENDCrossSection.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// Class Description
27// Cross Section for LEND (Low Energy Nuclear Data)
28// LEND is Geant4 interface for GIDI (General Interaction Data Interface)
29// which gives a discription of nuclear and atomic reactions, such as
30// Binary collision cross sections
31// Particle number multiplicity distributions of reaction products
32// Energy and angular distributions of reaction products
33// Derived calculational constants
34// GIDI is developped at Lawrence Livermore National Laboratory
35// Class Description - End
36
37// 071025 First implementation done by T. Koi (SLAC/SCCS)
38// 101118 Name modifications for release T. Koi (SLAC/PPA)
39
40#include "G4LENDCrossSection.hh"
41#include "G4SystemOfUnits.hh"
42#include "G4ElementTable.hh"
44
45//TK110811
47 const G4Element* /*element*/ , const G4Material* /*material*/ )
48{
49 G4double eKin = dp->GetKineticEnergy();
50 if ( dp->GetDefinition() != proj ) return false;
51 if ( eKin > GetMaxKinEnergy() || eKin < GetMinKinEnergy() ) return false;
52
53 return true;
54}
55
57 const G4Isotope* /*isotope*/ , const G4Element* /*elment*/ , const G4Material* material )
58{
59
60 G4double xs = 0.0;
61 G4double ke = dp->GetKineticEnergy();
62 G4double temp = material->GetTemperature();
63
64 G4GIDI_target* aTarget = usedTarget_map.find( lend_manager->GetNucleusEncoding( iZ , iA ) )->second->GetTarget();
65
66 xs = getLENDCrossSection ( aTarget , ke , temp );
67
68 return xs;
69}
70
71
72/*
73G4bool G4LENDCrossSection::IsApplicable(const G4DynamicParticle*aP, const G4Element*)
74{
75 G4bool result = true;
76 G4double eKin = aP->GetKineticEnergy();
77 if( eKin > GetMaxKinEnergy() || aP->GetDefinition() != proj ) result = false;
78 return result;
79}
80*/
81
84{
85
86 default_evaluation = "endl99";
87 allow_nat = false;
88 allow_any = false;
89
90 SetMinKinEnergy( 0*MeV );
91 SetMaxKinEnergy( 20*MeV );
92
93 lend_manager = G4LENDManager::GetInstance();
94
95}
96
98{
99
100 for ( std::map< G4int , G4LENDUsedTarget* >::iterator
101 it = usedTarget_map.begin() ; it != usedTarget_map.end() ; it ++ )
102 {
103 delete it->second;
104 }
105
106}
107
109{
111}
112
114{
115
116 if ( &aP != proj )
117 throw G4HadronicException(__FILE__, __LINE__, "Attempt to use LEND data for particles other than neutrons!!!");
118
119 G4cout << G4endl;
120 G4cout << "Dump Cross Sections of " << GetName() << G4endl;
121 G4cout << "(Pointwise cross-section at 300 Kelvin.)" << G4endl;
122 G4cout << G4endl;
123
124 G4cout << "Target informaiton " << G4endl;
125
126 for ( std::map< G4int , G4LENDUsedTarget* >::iterator
127 it = usedTarget_map.begin() ; it != usedTarget_map.end() ; it ++ )
128 {
129 G4cout
130 << "Wanted " << it->second->GetWantedEvaluation()
131 << ", Z= " << it->second->GetWantedZ()
132 << ", A= " << it->second->GetWantedA()
133 << "; Actual " << it->second->GetActualEvaluation()
134 << ", Z= " << it->second->GetActualZ()
135 << ", A= " << it->second->GetActualA()
136 << ", " << it->second->GetTarget()
137 << G4endl;
138
139 G4int ie = 0;
140
141 G4GIDI_target* aTarget = it->second->GetTarget();
142 G4double aT = 300;
143 for ( ie = 0 ; ie < 130 ; ie++ )
144 {
145 G4double ke = 1.0e-5 * std::pow ( 10.0 , ie/10.0 ) *eV;
146
147 if ( ke < 20*MeV )
148 {
149 G4cout << " " << GetName() << ", cross section at " << ke/eV << " [eV] = " << getLENDCrossSection ( aTarget , ke , aT )/barn << " [barn] " << G4endl;
150 }
151 }
152 G4cout << G4endl;
153
154 }
155
156}
157
158
159/*
160//110810
161//G4double G4LENDCrossSection::GetCrossSection(const G4DynamicParticle* aP , const G4Element* anElement , G4double aT)
162G4double G4LENDCrossSection::GetCrossSection(const G4DynamicParticle* aP , int iZ , const G4Material* aMat)
163{
164
165//110810
166 G4double aT = aMat->GetTemperature();
167 G4Element* anElement = lend_manager->GetNistElementBuilder()->FindOrBuildElement( iZ );
168
169 G4double ke = aP->GetKineticEnergy();
170 G4double XS = 0.0;
171
172 G4int numberOfIsotope = anElement->GetNumberOfIsotopes();
173
174 if ( numberOfIsotope > 0 )
175 {
176 // User Defined Abundances
177 for ( G4int i_iso = 0 ; i_iso < numberOfIsotope ; i_iso++ )
178 {
179
180 G4int iZ = anElement->GetIsotope( i_iso )->GetZ();
181 G4int iA = anElement->GetIsotope( i_iso )->GetN();
182 G4double ratio = anElement->GetRelativeAbundanceVector()[i_iso];
183
184 G4GIDI_target* aTarget = usedTarget_map.find( lend_manager->GetNucleusEncoding( iZ , iA ) )->second->GetTarget();
185 XS += ratio*getLENDCrossSection ( aTarget , ke , aT );
186
187 }
188 }
189 else
190 {
191 // Natural Abundances
192 G4NistElementBuilder* nistElementBuild = lend_manager->GetNistElementBuilder();
193 G4int iZ = int ( anElement->GetZ() );
194 G4int numberOfNistIso = nistElementBuild->GetNumberOfNistIsotopes( int ( anElement->GetZ() ) );
195
196 G4int Nfirst = nistElementBuild->GetNistFirstIsotopeN( iZ );
197 for ( G4int i = 0 ; i < numberOfNistIso ; i++ )
198 {
199 G4int iA = Nfirst + i;
200 G4double ratio = nistElementBuild->GetIsotopeAbundance( iZ , iA );
201 if ( ratio > 0.0 )
202 {
203 G4GIDI_target* aTarget = usedTarget_map.find( lend_manager->GetNucleusEncoding( iZ , iA ) )->second->GetTarget();
204 XS += ratio*getLENDCrossSection ( aTarget , ke , aT );
205 //G4cout << ke/eV << " " << iZ << " " << iMass << " " << aTarget << " " << getLENDCrossSection ( aTarget , ke , aT ) << G4endl;
206 }
207 }
208 }
209
210 //G4cout << "XS= " << XS << G4endl;
211 return XS;
212}
213
214
215
216//110810
217//G4double G4LENDCrossSection::GetIsoCrossSection(const G4DynamicParticle* dp, const G4Isotope* isotope, G4double aT )
218G4double G4LENDCrossSection::GetIsoCrossSection(const G4DynamicParticle* dp, const G4Isotope* isotope, const G4Material* aMat)
219{
220
221//110810
222 G4double aT = aMat->GetTemperature();
223
224 G4double ke = dp->GetKineticEnergy();
225
226 G4int iZ = isotope->GetZ();
227 G4int iA = isotope->GetN();
228
229 G4GIDI_target* aTarget = usedTarget_map.find( lend_manager->GetNucleusEncoding( iZ , iA ) )->second->GetTarget();
230
231 return getLENDCrossSection ( aTarget , ke , aT );
232
233}
234
235
236
237//110810
238//G4double G4LENDCrossSection::GetZandACrossSection(const G4DynamicParticle* dp, G4int iZ, G4int iA, G4double aT)
239G4double G4LENDCrossSection::GetZandACrossSection(const G4DynamicParticle* dp, G4int iZ, G4int iA, const G4Material* aMat)
240{
241
242//110810
243 G4double aT = aMat->GetTemperature();
244
245 G4double ke = dp->GetKineticEnergy();
246
247 G4GIDI_target* aTarget = usedTarget_map.find( lend_manager->GetNucleusEncoding( iZ , iA ) )->second->GetTarget();
248
249 return getLENDCrossSection ( aTarget , ke , aT );
250
251}
252*/
253
254
255
256void G4LENDCrossSection::recreate_used_target_map()
257{
258 for ( std::map< G4int , G4LENDUsedTarget* >::iterator
259 it = usedTarget_map.begin() ; it != usedTarget_map.end() ; it ++ )
260 {
261 delete it->second;
262 }
263 usedTarget_map.clear();
264
266}
267
268
269
271{
272
274
275 size_t numberOfElements = G4Element::GetNumberOfElements();
276 static const G4ElementTable* theElementTable = G4Element::GetElementTable();
277
278 for ( size_t i = 0 ; i < numberOfElements ; ++i )
279 {
280
281 const G4Element* anElement = (*theElementTable)[i];
282 G4int numberOfIsotope = anElement->GetNumberOfIsotopes();
283
284 if ( numberOfIsotope > 0 )
285 {
286 // User Defined Abundances
287 for ( G4int i_iso = 0 ; i_iso < numberOfIsotope ; i_iso++ )
288 {
289 G4int iZ = anElement->GetIsotope( i_iso )->GetZ();
290 G4int iA = anElement->GetIsotope( i_iso )->GetN();
291
292 //G4LENDUsedTarget* aTarget = new G4LENDUsedTarget ( G4Neutron::Neutron() , default_evaluation , iZ , iA );
293 G4LENDUsedTarget* aTarget = new G4LENDUsedTarget ( proj , default_evaluation , iZ , iA );
294 if ( allow_nat == true ) aTarget->AllowNat();
295 if ( allow_any == true ) aTarget->AllowAny();
296 usedTarget_map.insert( std::pair< G4int , G4LENDUsedTarget* > ( lend_manager->GetNucleusEncoding( iZ , iA ) , aTarget ) );
297 }
298 }
299 else
300 {
301 // Natural Abundances
302 G4NistElementBuilder* nistElementBuild = lend_manager->GetNistElementBuilder();
303 G4int iZ = int ( anElement->GetZ() );
304 //G4cout << nistElementBuild->GetNumberOfNistIsotopes( int ( anElement->GetZ() ) ) << G4endl;
305 G4int numberOfNistIso = nistElementBuild->GetNumberOfNistIsotopes( int ( anElement->GetZ() ) );
306
307 for ( G4int ii = 0 ; ii < numberOfNistIso ; ii++ )
308 {
309 //G4cout << nistElementBuild->GetIsotopeAbundance( iZ , nistElementBuild->GetNistFirstIsotopeN( iZ ) + i ) << G4endl;
310 if ( nistElementBuild->GetIsotopeAbundance( iZ , nistElementBuild->GetNistFirstIsotopeN( iZ ) + ii ) > 0 )
311 {
312 G4int iMass = nistElementBuild->GetNistFirstIsotopeN( iZ ) + ii;
313 //G4cout << iZ << " " << nistElementBuild->GetNistFirstIsotopeN( iZ ) + i << " " << nistElementBuild->GetIsotopeAbundance ( iZ , iMass ) << G4endl;
314
315 G4LENDUsedTarget* aTarget = new G4LENDUsedTarget ( proj , default_evaluation , iZ , iMass );
316 if ( allow_nat == true ) aTarget->AllowNat();
317 if ( allow_any == true ) aTarget->AllowAny();
318 usedTarget_map.insert( std::pair< G4int , G4LENDUsedTarget* > ( lend_manager->GetNucleusEncoding( iZ , iMass ) , aTarget ) );
319
320 }
321
322 }
323 }
324 }
325
326 G4cout << "Dump UsedTarget for " << GetName() << G4endl;
327 G4cout << "Requested Evaluation, Z , A -> Actual Evaluation, Z , A(0=Nat) , Pointer of Target" << G4endl;
328 for ( std::map< G4int , G4LENDUsedTarget* >::iterator
329 it = usedTarget_map.begin() ; it != usedTarget_map.end() ; it ++ )
330 {
331 G4cout
332 << " " << it->second->GetWantedEvaluation()
333 << ", " << it->second->GetWantedZ()
334 << ", " << it->second->GetWantedA()
335 << " -> " << it->second->GetActualEvaluation()
336 << ", " << it->second->GetActualZ()
337 << ", " << it->second->GetActualA()
338 << ", " << it->second->GetTarget()
339 << G4endl;
340 }
341
342}
343
344 // elow ehigh xs_elow xs_ehigh ke (ke < elow)
346{
347 //XS propotinal to 1/v at low energy -> 1/root(E)
348 //XS = a * 1/root(E) + b
349 G4double a = ( y2 - y1 ) / ( 1/std::sqrt(x2) - 1/std::sqrt(x1) );
350 G4double b = y1 - a * 1/std::sqrt(x1);
351 G4double result = a * 1/std::sqrt(ke) + b;
352 return result;
353}
std::vector< G4Element * > G4ElementTable
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
G4double GetZ() const
Definition: G4Element.hh:131
static size_t GetNumberOfElements()
Definition: G4Element.cc:406
const G4Isotope * GetIsotope(G4int iso) const
Definition: G4Element.hh:169
size_t GetNumberOfIsotopes() const
Definition: G4Element.hh:158
static const G4ElementTable * GetElementTable()
Definition: G4Element.cc:399
G4int GetZ() const
Definition: G4Isotope.hh:91
G4int GetN() const
Definition: G4Isotope.hh:94
G4LENDCrossSection(const G4String name="")
G4double GetIsoCrossSection(const G4DynamicParticle *, G4int, G4int, const G4Isotope *, const G4Element *, const G4Material *)
G4ParticleDefinition * proj
G4double GetUltraLowEnergyExtrapolatedXS(G4double, G4double, G4double, G4double, G4double)
virtual G4double getLENDCrossSection(G4GIDI_target *, G4double, G4double)
void DumpPhysicsTable(const G4ParticleDefinition &)
void BuildPhysicsTable(const G4ParticleDefinition &)
G4bool IsIsoApplicable(const G4DynamicParticle *, G4int, G4int, const G4Element *, const G4Material *)
G4int GetNucleusEncoding(G4int iZ, G4int iA)
G4bool RequestChangeOfVerboseLevel(G4int)
G4NistElementBuilder * GetNistElementBuilder()
static G4LENDManager * GetInstance()
G4double GetTemperature() const
Definition: G4Material.hh:181
G4int GetNumberOfNistIsotopes(G4int Z)
G4double GetIsotopeAbundance(G4int Z, G4int N)
G4int GetNistFirstIsotopeN(G4int Z)
void SetMaxKinEnergy(G4double value)
void SetMinKinEnergy(G4double value)
const G4String & GetName() const