Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 "G4Pow.hh"
42#include "G4SystemOfUnits.hh"
43#include "G4ElementTable.hh"
45
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 //G4cout << "G4LENDCrossSection::GetIsoIsIsoApplicable this->GetName() = " << this->GetName() << ", iZ = " << iZ << ", iA = " << iA << ", allow_nat = " << allow_nat << G4endl;
54 //Check existence of target data
55 if ( element != NULL ) {
56 if ( element->GetNumberOfIsotopes() != 0 ) {
57 std::vector< const G4Isotope*> vIsotope;
58 for ( G4int i = 0 ; i != (G4int)element->GetNumberOfIsotopes() ; ++i ) {
59 if ( element->GetIsotope( i )->GetN() == iA ) vIsotope.push_back( element->GetIsotope( i ) );
60 }
61 for ( std::size_t i = 0 ; i != vIsotope.size() ; ++i ) {
62 G4int iM = vIsotope[i]->Getm();
63 if ( get_target_from_map( lend_manager->GetNucleusEncoding( iZ , iA , iM ) ) != NULL ) return true;
64 }
65 //No isomer has data
66 //Check natural aboundance data for the element
67 if ( get_target_from_map( lend_manager->GetNucleusEncoding( iZ , 0 , 0 ) ) != NULL ) return true;
68 } else {
69 //Check for iZ and iA under assuming iM = 0
70 if ( get_target_from_map( lend_manager->GetNucleusEncoding( iZ , iA , 0 ) ) != NULL ) return true;
71 //Check natural aboundance data for the element
72 if ( get_target_from_map( lend_manager->GetNucleusEncoding( iZ , 0 , 0 ) ) != NULL ) return true;
73 }
74 } else {
75 //Check for iZ and iA under assuming iM = 0
76 if ( get_target_from_map( lend_manager->GetNucleusEncoding( iZ , iA , 0 ) ) != NULL ) return true;
77 //Check natural aboundance data for iZ
78 if ( get_target_from_map( lend_manager->GetNucleusEncoding( iZ , 0 , 0 ) ) != NULL ) return true;
79 }
80 return false;
81}
82
84 const G4Isotope* isotope , const G4Element* /*elment*/ , const G4Material* material )
85{
86
87 G4double xs = 0.0;
88 G4double ke = dp->GetKineticEnergy();
89 G4double temp = material->GetTemperature();
90 G4int iM = 0;
91 if ( isotope != NULL ) iM = isotope->Getm();
92
93 G4GIDI_target* aTarget = get_target_from_map( lend_manager->GetNucleusEncoding( iZ , iA , iM ) );
94 if ( aTarget == NULL ) {
95 G4String message;
96 message = this->GetName();
97 message += " is unexpectedly called.";
98 //G4Exception( "G4LEND::GetIsoCrossSection(,)" , "LENDCrossSection-01" , JustWarning ,
99 G4Exception( "G4LEND::GetIsoCrossSection(,)" , "LENDCrossSection-01" , FatalException ,
100 message );
101 }
102 xs = getLENDCrossSection ( aTarget , ke , temp );
103
104 return xs;
105}
106
107
108/*
109G4bool G4LENDCrossSection::IsApplicable(const G4DynamicParticle*aP, const G4Element*)
110{
111 G4bool result = true;
112 G4double eKin = aP->GetKineticEnergy();
113 if( eKin > GetMaxKinEnergy() || aP->GetDefinition() != proj ) result = false;
114 return result;
115}
116*/
117
120{
121
122 proj = NULL; //will be set in an inherited class
123 //default_evaluation = "endl99";
124 //default_evaluation = "ENDF.B-VII.0";
125 default_evaluation = "ENDF/BVII.1";
126
127 allow_nat = false;
128 allow_any = false;
129
130 SetMinKinEnergy( 0*MeV );
131 SetMaxKinEnergy( 20*MeV );
132
133 lend_manager = G4LENDManager::GetInstance();
134
135}
136
138{
139
140 for ( std::map< G4int , G4LENDUsedTarget* >::iterator
141 it = usedTarget_map.begin() ; it != usedTarget_map.end() ; it ++ )
142 {
143 delete it->second;
144 }
145
146}
147
149{
151}
152
154{
155
156 if ( &aP != proj )
157 throw G4HadronicException(__FILE__, __LINE__, "Attempt to use LEND data for particles other than neutrons!!!");
158
159 G4cout << G4endl;
160 G4cout << "Dump Cross Sections of " << GetName() << G4endl;
161 G4cout << "(Pointwise cross-section at 300 Kelvin.)" << G4endl;
162 G4cout << G4endl;
163
164 G4cout << "Target informaiton " << G4endl;
165
166 for ( std::map< G4int , G4LENDUsedTarget* >::iterator
167 it = usedTarget_map.begin() ; it != usedTarget_map.end() ; it ++ )
168 {
169 G4cout
170 << "Wanted " << it->second->GetWantedEvaluation()
171 << ", Z= " << it->second->GetWantedZ()
172 << ", A= " << it->second->GetWantedA()
173 << "; Actual " << it->second->GetActualEvaluation()
174 << ", Z= " << it->second->GetActualZ()
175 << ", A= " << it->second->GetActualA()
176 << ", " << it->second->GetTarget()
177 << G4endl;
178
179 G4int ie = 0;
180
181 G4GIDI_target* aTarget = it->second->GetTarget();
182 G4double aT = 300;
183 for ( ie = 0 ; ie < 130 ; ie++ )
184 {
185 G4double ke = 1.0e-5 * G4Pow::GetInstance()->powA ( 10.0 , ie/10.0 ) *eV;
186
187 if ( ke < 20*MeV )
188 {
189 G4cout << " " << GetName() << ", cross section at " << ke/eV << " [eV] = " << getLENDCrossSection ( aTarget , ke , aT )/barn << " [barn] " << G4endl;
190 }
191 }
192 G4cout << G4endl;
193
194 }
195
196}
197
198
199/*
200//110810
201//G4double G4LENDCrossSection::GetCrossSection(const G4DynamicParticle* aP , const G4Element* anElement , G4double aT)
202G4double G4LENDCrossSection::GetCrossSection(const G4DynamicParticle* aP , int iZ , const G4Material* aMat)
203{
204
205//110810
206 G4double aT = aMat->GetTemperature();
207 G4Element* anElement = lend_manager->GetNistElementBuilder()->FindOrBuildElement( iZ );
208
209 G4double ke = aP->GetKineticEnergy();
210 G4double XS = 0.0;
211
212 G4int numberOfIsotope = anElement->GetNumberOfIsotopes();
213
214 if ( numberOfIsotope > 0 )
215 {
216 // User Defined Abundances
217 for ( G4int i_iso = 0 ; i_iso < numberOfIsotope ; i_iso++ )
218 {
219
220 G4int iZ = anElement->GetIsotope( i_iso )->GetZ();
221 G4int iA = anElement->GetIsotope( i_iso )->GetN();
222 G4double ratio = anElement->GetRelativeAbundanceVector()[i_iso];
223
224 G4GIDI_target* aTarget = usedTarget_map.find( lend_manager->GetNucleusEncoding( iZ , iA ) )->second->GetTarget();
225 XS += ratio*getLENDCrossSection ( aTarget , ke , aT );
226
227 }
228 }
229 else
230 {
231 // Natural Abundances
232 G4NistElementBuilder* nistElementBuild = lend_manager->GetNistElementBuilder();
233 G4int iZ = int ( anElement->GetZ() );
234 G4int numberOfNistIso = nistElementBuild->GetNumberOfNistIsotopes( int ( anElement->GetZ() ) );
235
236 G4int Nfirst = nistElementBuild->GetNistFirstIsotopeN( iZ );
237 for ( G4int i = 0 ; i < numberOfNistIso ; i++ )
238 {
239 G4int iA = Nfirst + i;
240 G4double ratio = nistElementBuild->GetIsotopeAbundance( iZ , iA );
241 if ( ratio > 0.0 )
242 {
243 G4GIDI_target* aTarget = usedTarget_map.find( lend_manager->GetNucleusEncoding( iZ , iA ) )->second->GetTarget();
244 XS += ratio*getLENDCrossSection ( aTarget , ke , aT );
245 //G4cout << ke/eV << " " << iZ << " " << iMass << " " << aTarget << " " << getLENDCrossSection ( aTarget , ke , aT ) << G4endl;
246 }
247 }
248 }
249
250 //G4cout << "XS= " << XS << G4endl;
251 return XS;
252}
253
254
255
256//110810
257//G4double G4LENDCrossSection::GetIsoCrossSection(const G4DynamicParticle* dp, const G4Isotope* isotope, G4double aT )
258G4double G4LENDCrossSection::GetIsoCrossSection(const G4DynamicParticle* dp, const G4Isotope* isotope, const G4Material* aMat)
259{
260
261//110810
262 G4double aT = aMat->GetTemperature();
263
264 G4double ke = dp->GetKineticEnergy();
265
266 G4int iZ = isotope->GetZ();
267 G4int iA = isotope->GetN();
268
269 G4GIDI_target* aTarget = usedTarget_map.find( lend_manager->GetNucleusEncoding( iZ , iA ) )->second->GetTarget();
270
271 return getLENDCrossSection ( aTarget , ke , aT );
272
273}
274
275
276
277//110810
278//G4double G4LENDCrossSection::GetZandACrossSection(const G4DynamicParticle* dp, G4int iZ, G4int iA, G4double aT)
279G4double G4LENDCrossSection::GetZandACrossSection(const G4DynamicParticle* dp, G4int iZ, G4int iA, const G4Material* aMat)
280{
281
282//110810
283 G4double aT = aMat->GetTemperature();
284
285 G4double ke = dp->GetKineticEnergy();
286
287 G4GIDI_target* aTarget = usedTarget_map.find( lend_manager->GetNucleusEncoding( iZ , iA ) )->second->GetTarget();
288
289 return getLENDCrossSection ( aTarget , ke , aT );
290
291}
292*/
293
294
295
296void G4LENDCrossSection::recreate_used_target_map()
297{
298 for ( std::map< G4int , G4LENDUsedTarget* >::iterator
299 it = usedTarget_map.begin() ; it != usedTarget_map.end() ; it ++ )
300 {
301 delete it->second;
302 }
303 usedTarget_map.clear();
304
306}
307
308
309
311{
312
314
315 std::size_t numberOfElements = G4Element::GetNumberOfElements();
316 static const G4ElementTable* theElementTable = G4Element::GetElementTable();
317
318 for ( std::size_t i = 0 ; i < numberOfElements ; ++i )
319 {
320
321 const G4Element* anElement = (*theElementTable)[i];
322 G4int numberOfIsotope = (G4int)anElement->GetNumberOfIsotopes();
323
324 if ( numberOfIsotope > 0 )
325 {
326 // User Defined Abundances
327 for ( G4int i_iso = 0 ; i_iso < numberOfIsotope ; i_iso++ )
328 {
329 G4int iZ = anElement->GetIsotope( i_iso )->GetZ();
330 G4int iA = anElement->GetIsotope( i_iso )->GetN();
331 G4int iIsomer = anElement->GetIsotope( i_iso )->Getm();
332
333 //G4LENDUsedTarget* aTarget = new G4LENDUsedTarget ( G4Neutron::Neutron() , default_evaluation , iZ , iA );
334 G4LENDUsedTarget* aTarget = new G4LENDUsedTarget ( proj , default_evaluation , iZ , iA , iIsomer );
335 if ( allow_nat == true ) aTarget->AllowNat();
336 if ( allow_any == true ) aTarget->AllowAny();
337 usedTarget_map.insert( std::pair< G4int , G4LENDUsedTarget* > ( lend_manager->GetNucleusEncoding( iZ , iA , iIsomer ) , aTarget ) );
338 }
339 }
340 else
341 {
342 // Natural Abundances
343 G4NistElementBuilder* nistElementBuild = lend_manager->GetNistElementBuilder();
344 G4int iZ = int ( anElement->GetZ() );
345 //G4cout << nistElementBuild->GetNumberOfNistIsotopes( int ( anElement->GetZ() ) ) << G4endl;
346 G4int numberOfNistIso = nistElementBuild->GetNumberOfNistIsotopes( int ( anElement->GetZ() ) );
347
348 for ( G4int ii = 0 ; ii < numberOfNistIso ; ii++ )
349 {
350 //G4cout << nistElementBuild->GetIsotopeAbundance( iZ , nistElementBuild->GetNistFirstIsotopeN( iZ ) + i ) << G4endl;
351 if ( nistElementBuild->GetIsotopeAbundance( iZ , nistElementBuild->GetNistFirstIsotopeN( iZ ) + ii ) > 0 )
352 {
353 G4int iMass = nistElementBuild->GetNistFirstIsotopeN( iZ ) + ii;
354 //G4cout << iZ << " " << nistElementBuild->GetNistFirstIsotopeN( iZ ) + i << " " << nistElementBuild->GetIsotopeAbundance ( iZ , iMass ) << G4endl;
355 G4int iIsomer = 0;
356
357 G4LENDUsedTarget* aTarget = new G4LENDUsedTarget ( proj , default_evaluation , iZ , iMass );
358 if ( allow_nat == true ) aTarget->AllowNat();
359 if ( allow_any == true ) aTarget->AllowAny();
360 usedTarget_map.insert( std::pair< G4int , G4LENDUsedTarget* > ( lend_manager->GetNucleusEncoding( iZ , iMass , iIsomer ) , aTarget ) );
361
362 }
363
364 }
365 }
366 }
368}
369
370 // elow ehigh xs_elow xs_ehigh ke (ke < elow)
372{
373 //XS propotinal to 1/v at low energy -> 1/root(E)
374 //XS = a * 1/root(E) + b
375 G4double a = ( y2 - y1 ) / ( 1/std::sqrt(x2) - 1/std::sqrt(x1) );
376 G4double b = y1 - a * 1/std::sqrt(x1);
377 G4double result = a * 1/std::sqrt(ke) + b;
378 return result;
379}
380
382 G4GIDI_target* target = NULL;
383 if ( usedTarget_map.find( nuclear_code ) != usedTarget_map.end() ) {
384 target = usedTarget_map.find( nuclear_code )->second->GetTarget();
385 }
386 return target;
387}
388
390
391 if ( lend_manager->GetVerboseLevel() >= 1 || force ) {
392 if ( usedTarget_map.size() == 0 ) create_used_target_map();
393 G4cout << "Dumping UsedTarget of " << GetName() << " for " << proj->GetParticleName() << G4endl;
394 G4cout << "Requested Evaluation, Z , A -> Actual Evaluation, Z , A(0=Nat) " << G4endl;
395 for ( std::map< G4int , G4LENDUsedTarget* >::iterator
396 it = usedTarget_map.begin() ; it != usedTarget_map.end() ; it ++ ) {
397 G4cout
398 << " " << it->second->GetWantedEvaluation()
399 << ", " << it->second->GetWantedZ()
400 << ", " << it->second->GetWantedA()
401 << " -> " << it->second->GetActualEvaluation()
402 << ", " << it->second->GetActualZ()
403 << ", " << it->second->GetActualA()
404 << G4endl;
405 }
406 }
407}
408
std::vector< G4Element * > G4ElementTable
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
static G4ElementTable * GetElementTable()
Definition: G4Element.cc:403
G4double GetZ() const
Definition: G4Element.hh:131
static size_t GetNumberOfElements()
Definition: G4Element.cc:410
const G4Isotope * GetIsotope(G4int iso) const
Definition: G4Element.hh:170
size_t GetNumberOfIsotopes() const
Definition: G4Element.hh:159
G4int GetZ() const
Definition: G4Isotope.hh:90
G4int Getm() const
Definition: G4Isotope.hh:99
G4int GetN() const
Definition: G4Isotope.hh:93
G4LENDCrossSection(const G4String name="")
G4GIDI_target * get_target_from_map(G4int nuclear_code)
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 DumpLENDTargetInfo(G4bool force=false)
void BuildPhysicsTable(const G4ParticleDefinition &)
G4bool IsIsoApplicable(const G4DynamicParticle *, G4int, G4int, const G4Element *, const G4Material *)
G4bool RequestChangeOfVerboseLevel(G4int)
G4int GetNucleusEncoding(G4int iZ, G4int iA, G4int iM)
G4NistElementBuilder * GetNistElementBuilder()
static G4LENDManager * GetInstance()
G4int GetVerboseLevel()
G4double GetTemperature() const
Definition: G4Material.hh:177
G4int GetNumberOfNistIsotopes(G4int Z) const
G4double GetIsotopeAbundance(G4int Z, G4int N) const
G4int GetNistFirstIsotopeN(G4int Z) const
const G4String & GetParticleName() const
static G4Pow * GetInstance()
Definition: G4Pow.cc:41
G4double powA(G4double A, G4double y) const
Definition: G4Pow.hh:230
void SetMaxKinEnergy(G4double value)
void SetMinKinEnergy(G4double value)
const G4String & GetName() const