Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4ParticleHPThermalScatteringData Class Reference

#include <G4ParticleHPThermalScatteringData.hh>

+ Inheritance diagram for G4ParticleHPThermalScatteringData:

Public Member Functions

 G4ParticleHPThermalScatteringData ()
 
 ~G4ParticleHPThermalScatteringData ()
 
G4bool IsIsoApplicable (const G4DynamicParticle *, G4int, G4int, const G4Element *, const G4Material *)
 
G4double GetIsoCrossSection (const G4DynamicParticle *, G4int, G4int, const G4Isotope *, const G4Element *, const G4Material *)
 
G4bool IsApplicable (const G4DynamicParticle *, const G4Element *)
 
G4double GetCrossSection (const G4DynamicParticle *, const G4Element *, const G4Material *)
 
G4double GetInelasticCrossSection (const G4DynamicParticle *, const G4Element *, const G4Material *)
 
G4double GetCoherentCrossSection (const G4DynamicParticle *, const G4Element *, const G4Material *)
 
G4double GetIncoherentCrossSection (const G4DynamicParticle *, const G4Element *, const G4Material *)
 
void BuildPhysicsTable (const G4ParticleDefinition &)
 
void DumpPhysicsTable (const G4ParticleDefinition &)
 
void AddUserThermalScatteringFile (G4String, G4String)
 
virtual void CrossSectionDescription (std::ostream &) const
 
- Public Member Functions inherited from G4VCrossSectionDataSet
 G4VCrossSectionDataSet (const G4String &nam="")
 
virtual ~G4VCrossSectionDataSet ()
 
virtual G4bool IsElementApplicable (const G4DynamicParticle *, G4int Z, const G4Material *mat=nullptr)
 
virtual G4bool IsIsoApplicable (const G4DynamicParticle *, G4int Z, G4int A, const G4Element *elm=nullptr, const G4Material *mat=nullptr)
 
G4double GetCrossSection (const G4DynamicParticle *, const G4Element *, const G4Material *mat=nullptr)
 
G4double ComputeCrossSection (const G4DynamicParticle *, const G4Element *, const G4Material *mat=nullptr)
 
virtual G4double ComputeCrossSectionPerElement (G4double kinEnergy, G4double loge, const G4ParticleDefinition *, const G4Element *, const G4Material *mat=nullptr)
 
virtual G4double GetElementCrossSection (const G4DynamicParticle *, G4int Z, const G4Material *mat=nullptr)
 
virtual G4double GetIsoCrossSection (const G4DynamicParticle *, G4int Z, G4int A, const G4Isotope *iso=nullptr, const G4Element *elm=nullptr, const G4Material *mat=nullptr)
 
virtual G4double ComputeIsoCrossSection (G4double kinEnergy, G4double loge, const G4ParticleDefinition *, G4int Z, G4int A, const G4Isotope *iso=nullptr, const G4Element *elm=nullptr, const G4Material *mat=nullptr)
 
virtual const G4IsotopeSelectIsotope (const G4Element *, G4double kinEnergy, G4double logE)
 
virtual void BuildPhysicsTable (const G4ParticleDefinition &)
 
virtual void DumpPhysicsTable (const G4ParticleDefinition &)
 
virtual void CrossSectionDescription (std::ostream &) const
 
virtual void SetVerboseLevel (G4int value)
 
G4double GetMinKinEnergy () const
 
void SetMinKinEnergy (G4double value)
 
G4double GetMaxKinEnergy () const
 
void SetMaxKinEnergy (G4double value)
 
bool ForAllAtomsAndEnergies () const
 
void SetForAllAtomsAndEnergies (G4bool val)
 
const G4StringGetName () const
 
void SetName (const G4String &nam)
 
G4VCrossSectionDataSetoperator= (const G4VCrossSectionDataSet &right)=delete
 
 G4VCrossSectionDataSet (const G4VCrossSectionDataSet &)=delete
 

Additional Inherited Members

- Protected Attributes inherited from G4VCrossSectionDataSet
G4int verboseLevel
 
G4String name
 

Detailed Description

Definition at line 61 of file G4ParticleHPThermalScatteringData.hh.

Constructor & Destructor Documentation

◆ G4ParticleHPThermalScatteringData()

G4ParticleHPThermalScatteringData::G4ParticleHPThermalScatteringData ( )

Definition at line 56 of file G4ParticleHPThermalScatteringData.cc.

57:G4VCrossSectionDataSet("NeutronHPThermalScatteringData")
58,coherent(nullptr)
59,incoherent(nullptr)
60,inelastic(nullptr)
61{
62 // Upper limit of neutron energy
63 emax = 4*eV;
64 SetMinKinEnergy( 0*MeV );
65 SetMaxKinEnergy( emax );
66
67 ke_cache = 0.0;
68 xs_cache = 0.0;
69 element_cache = nullptr;
70 material_cache = nullptr;
71
72 indexOfThermalElement.clear();
73
75}
void SetMaxKinEnergy(G4double value)
void SetMinKinEnergy(G4double value)

◆ ~G4ParticleHPThermalScatteringData()

G4ParticleHPThermalScatteringData::~G4ParticleHPThermalScatteringData ( )

Definition at line 77 of file G4ParticleHPThermalScatteringData.cc.

78{
79 clearCurrentXSData();
80
81 delete names;
82}

Member Function Documentation

◆ AddUserThermalScatteringFile()

void G4ParticleHPThermalScatteringData::AddUserThermalScatteringFile ( G4String  nameG4Element,
G4String  filename 
)

Definition at line 472 of file G4ParticleHPThermalScatteringData.cc.

473{
474 names->AddThermalElement( nameG4Element , filename );
475}

Referenced by G4ParticleHPThermalScattering::AddUserThermalScatteringFile().

◆ BuildPhysicsTable()

void G4ParticleHPThermalScatteringData::BuildPhysicsTable ( const G4ParticleDefinition aP)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 192 of file G4ParticleHPThermalScatteringData.cc.

193{
194
195 if ( &aP != G4Neutron::Neutron() )
196 throw G4HadronicException(__FILE__, __LINE__, "Attempt to use NeutronHP data for particles other than neutrons!!!");
197
198 //std::map < std::pair < G4Material* , const G4Element* > , G4int > dic;
199 //
200 dic.clear();
201 if ( G4Threading::IsMasterThread() ) clearCurrentXSData();
202
203 std::map < G4String , G4int > co_dic;
204
205 //Searching Nist Materials
206 static G4ThreadLocal G4MaterialTable* theMaterialTable = nullptr;
207 if (!theMaterialTable) theMaterialTable= G4Material::GetMaterialTable();
208 std::size_t numberOfMaterials = G4Material::GetNumberOfMaterials();
209 for ( std::size_t i = 0 ; i < numberOfMaterials ; ++i )
210 {
211 G4Material* material = (*theMaterialTable)[i];
212 G4int numberOfElements = (G4int)material->GetNumberOfElements();
213 for ( G4int j = 0 ; j < numberOfElements ; ++j )
214 {
215 const G4Element* element = material->GetElement(j);
216 if ( names->IsThisThermalElement ( material->GetName() , element->GetName() ) )
217 {
218 G4int ts_ID_of_this_geometry;
219 G4String ts_ndl_name = names->GetTS_NDL_Name( material->GetName() , element->GetName() );
220 if ( co_dic.find ( ts_ndl_name ) != co_dic.cend() )
221 {
222 ts_ID_of_this_geometry = co_dic.find ( ts_ndl_name ) -> second;
223 }
224 else
225 {
226 ts_ID_of_this_geometry = (G4int)co_dic.size();
227 co_dic.insert ( std::pair< G4String , G4int >( ts_ndl_name , ts_ID_of_this_geometry ) );
228 }
229
230 dic.insert( std::pair < std::pair < G4Material* , const G4Element* > , G4int > ( std::pair < G4Material* , const G4Element* > ( material , element ) , ts_ID_of_this_geometry ) );
231 }
232 }
233 }
234
235 //Searching TS Elements
236 static G4ThreadLocal G4ElementTable* theElementTable = nullptr;
237 if (!theElementTable) theElementTable= G4Element::GetElementTable();
238 std::size_t numberOfElements = G4Element::GetNumberOfElements();
239
240 for ( std::size_t i = 0 ; i < numberOfElements ; ++i )
241 {
242 const G4Element* element = (*theElementTable)[i];
243 if ( names->IsThisThermalElement ( element->GetName() ) )
244 {
245 if ( names->IsThisThermalElement ( element->GetName() ) )
246 {
247 G4int ts_ID_of_this_geometry;
248 G4String ts_ndl_name = names->GetTS_NDL_Name( element->GetName() );
249 if ( co_dic.find ( ts_ndl_name ) != co_dic.cend() )
250 {
251 ts_ID_of_this_geometry = co_dic.find ( ts_ndl_name ) -> second;
252 }
253 else
254 {
255 ts_ID_of_this_geometry = (G4int)co_dic.size();
256 co_dic.insert ( std::pair< G4String , G4int >( ts_ndl_name , ts_ID_of_this_geometry ) );
257 }
258
259 dic.insert( std::pair < std::pair < const G4Material* , const G4Element* > , G4int > ( std::pair < const G4Material* , const G4Element* > ( (G4Material*)NULL , element ) , ts_ID_of_this_geometry ) );
260 }
261 }
262 }
263
264 G4cout << G4endl;
265 G4cout << "Neutron HP Thermal Scattering Data: Following material-element pairs and/or elements are registered." << G4endl;
266 for ( auto it = dic.cbegin() ; it != dic.cend() ; ++it )
267 {
268 if ( it->first.first != nullptr )
269 {
270 G4cout << "Material " << it->first.first->GetName() << " - Element "
271 << it->first.second->GetName()
272 << ", internal thermal scattering id " << it->second << G4endl;
273 }
274 else
275 {
276 G4cout << "Element " << it->first.second->GetName()
277 << ", internal thermal scattering id " << it->second << G4endl;
278 }
279 }
280 G4cout << G4endl;
281
283
284 coherent = hpmanager->GetThermalScatteringCoherentCrossSections();
285 incoherent = hpmanager->GetThermalScatteringIncoherentCrossSections();
286 inelastic = hpmanager->GetThermalScatteringInelasticCrossSections();
287
289 {
290 if ( coherent == nullptr )
291 coherent = new std::map< G4int , std::map< G4double , G4ParticleHPVector* >* >;
292 if ( incoherent == nullptr )
293 incoherent = new std::map< G4int , std::map< G4double , G4ParticleHPVector* >* >;
294 if ( inelastic == nullptr )
295 inelastic = new std::map< G4int , std::map< G4double , G4ParticleHPVector* >* >;
296
297 // Read Cross Section Data files
298
299 G4String dirName;
300 if ( !G4FindDataDir( "G4NEUTRONHPDATA" ) )
301 throw G4HadronicException(__FILE__, __LINE__, "Please setenv G4NEUTRONHPDATA to point to the neutron cross-section files.");
302 G4String baseName = G4FindDataDir( "G4NEUTRONHPDATA" );
303
304 dirName = baseName + "/ThermalScattering";
305
306 G4String ndl_filename;
307 G4String full_name;
308
309 for ( auto it = co_dic.cbegin() ; it != co_dic.cend() ; ++it )
310 {
311 ndl_filename = it->first;
312 G4int ts_ID = it->second;
313
314 // Coherent
315 full_name = dirName + "/Coherent/CrossSection/" + ndl_filename;
316 auto coh_amapTemp_EnergyCross = readData( full_name );
317 coherent->insert ( std::pair < G4int , std::map< G4double , G4ParticleHPVector* >* > ( ts_ID , coh_amapTemp_EnergyCross ) );
318
319 // Incoherent
320 full_name = dirName + "/Incoherent/CrossSection/" + ndl_filename;
321 auto incoh_amapTemp_EnergyCross = readData( full_name );
322 incoherent->insert ( std::pair < G4int , std::map< G4double , G4ParticleHPVector* >* > ( ts_ID , incoh_amapTemp_EnergyCross ) );
323
324 // Inelastic
325 full_name = dirName + "/Inelastic/CrossSection/" + ndl_filename;
326 auto inela_amapTemp_EnergyCross = readData( full_name );
327 inelastic->insert ( std::pair < G4int , std::map< G4double , G4ParticleHPVector* >* > ( ts_ID , inela_amapTemp_EnergyCross ) );
328 }
332 }
333}
std::vector< G4Element * > G4ElementTable
const char * G4FindDataDir(const char *)
std::vector< G4Material * > G4MaterialTable
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
static G4ElementTable * GetElementTable()
Definition: G4Element.cc:403
static size_t GetNumberOfElements()
Definition: G4Element.cc:410
const G4String & GetName() const
Definition: G4Element.hh:127
static size_t GetNumberOfMaterials()
Definition: G4Material.cc:684
const G4Element * GetElement(G4int iel) const
Definition: G4Material.hh:197
size_t GetNumberOfElements() const
Definition: G4Material.hh:181
static G4MaterialTable * GetMaterialTable()
Definition: G4Material.cc:677
const G4String & GetName() const
Definition: G4Material.hh:172
static G4Neutron * Neutron()
Definition: G4Neutron.cc:103
void RegisterThermalScatteringIncoherentCrossSections(std::map< G4int, std::map< G4double, G4ParticleHPVector * > * > *val)
std::map< G4int, std::map< G4double, G4ParticleHPVector * > * > * GetThermalScatteringCoherentCrossSections()
std::map< G4int, std::map< G4double, G4ParticleHPVector * > * > * GetThermalScatteringInelasticCrossSections()
void RegisterThermalScatteringCoherentCrossSections(std::map< G4int, std::map< G4double, G4ParticleHPVector * > * > *val)
std::map< G4int, std::map< G4double, G4ParticleHPVector * > * > * GetThermalScatteringIncoherentCrossSections()
static G4ParticleHPManager * GetInstance()
void RegisterThermalScatteringInelasticCrossSections(std::map< G4int, std::map< G4double, G4ParticleHPVector * > * > *val)
G4bool IsMasterThread()
Definition: G4Threading.cc:124
#define G4ThreadLocal
Definition: tls.hh:77

◆ CrossSectionDescription()

void G4ParticleHPThermalScatteringData::CrossSectionDescription ( std::ostream &  outFile) const
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 477 of file G4ParticleHPThermalScatteringData.cc.

478{
479 outFile << "High Precision cross data based on thermal scattering data in evaluated nuclear data libraries for neutrons below 5eV on specific materials\n" ;
480}

◆ DumpPhysicsTable()

void G4ParticleHPThermalScatteringData::DumpPhysicsTable ( const G4ParticleDefinition aP)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 361 of file G4ParticleHPThermalScatteringData.cc.

362{
363 if( &aP != G4Neutron::Neutron() )
364 throw G4HadronicException(__FILE__, __LINE__, "Attempt to use NeutronHP data for particles other than neutrons!!!");
365}

◆ GetCoherentCrossSection()

G4double G4ParticleHPThermalScatteringData::GetCoherentCrossSection ( const G4DynamicParticle aP,
const G4Element anE,
const G4Material aM 
)

Definition at line 397 of file G4ParticleHPThermalScatteringData.cc.

398{
399 G4double result = 0;
400 G4int ts_id = getTS_ID( aM , anE );
401 G4double aT = aM->GetTemperature();
402 result = GetX ( aP , aT , coherent->find( ts_id )->second );
403 return result;
404}
double G4double
Definition: G4Types.hh:83
G4double GetTemperature() const
Definition: G4Material.hh:177

Referenced by G4ParticleHPThermalScattering::ApplyYourself().

◆ GetCrossSection()

G4double G4ParticleHPThermalScatteringData::GetCrossSection ( const G4DynamicParticle aP,
const G4Element anE,
const G4Material aM 
)

Definition at line 368 of file G4ParticleHPThermalScatteringData.cc.

369{
370 G4double result = 0;
371
372 G4int ts_id =getTS_ID( aM , anE );
373
374 if ( ts_id == -1 ) return result;
375
376 G4double aT = aM->GetTemperature();
377
378 G4double Xcoh = GetX ( aP , aT , coherent->find(ts_id)->second );
379 G4double Xincoh = GetX ( aP , aT , incoherent->find(ts_id)->second );
380 G4double Xinela = GetX ( aP , aT , inelastic->find(ts_id)->second );
381
382 result = Xcoh + Xincoh + Xinela;
383
384 return result;
385}

Referenced by G4ParticleHPThermalScattering::ApplyYourself(), and GetIsoCrossSection().

◆ GetIncoherentCrossSection()

G4double G4ParticleHPThermalScatteringData::GetIncoherentCrossSection ( const G4DynamicParticle aP,
const G4Element anE,
const G4Material aM 
)

Definition at line 406 of file G4ParticleHPThermalScatteringData.cc.

407{
408 G4double result = 0;
409 G4int ts_id = getTS_ID( aM , anE );
410 G4double aT = aM->GetTemperature();
411 result = GetX ( aP , aT , incoherent->find( ts_id )->second );
412 return result;
413}

◆ GetInelasticCrossSection()

G4double G4ParticleHPThermalScatteringData::GetInelasticCrossSection ( const G4DynamicParticle aP,
const G4Element anE,
const G4Material aM 
)

Definition at line 388 of file G4ParticleHPThermalScatteringData.cc.

389{
390 G4double result = 0;
391 G4int ts_id = getTS_ID( aM , anE );
392 G4double aT = aM->GetTemperature();
393 result = GetX ( aP , aT , inelastic->find( ts_id )->second );
394 return result;
395}

Referenced by G4ParticleHPThermalScattering::ApplyYourself().

◆ GetIsoCrossSection()

G4double G4ParticleHPThermalScatteringData::GetIsoCrossSection ( const G4DynamicParticle dp,
G4int  ,
G4int  ,
const G4Isotope ,
const G4Element element,
const G4Material material 
)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 100 of file G4ParticleHPThermalScatteringData.cc.

105{
106 ke_cache = dp->GetKineticEnergy();
107 element_cache = element;
108 material_cache = material;
109 G4double xs = GetCrossSection( dp , element , material );
110 xs_cache = xs;
111 return xs;
112}
G4double GetKineticEnergy() const
G4double GetCrossSection(const G4DynamicParticle *, const G4Element *, const G4Material *)

◆ IsApplicable()

G4bool G4ParticleHPThermalScatteringData::IsApplicable ( const G4DynamicParticle aP,
const G4Element anEle 
)

Definition at line 167 of file G4ParticleHPThermalScatteringData.cc.

168{
169 G4bool result = false;
170
171 G4double eKin = aP->GetKineticEnergy();
172 // Check energy
173 if ( eKin < emax )
174 {
175 // Check Particle Species
176 if ( aP->GetDefinition() == G4Neutron::Neutron() )
177 {
178 // anEle is one of Thermal elements
179 G4int ie = (G4int) anEle->GetIndex();
180 for (auto it = indexOfThermalElement.cbegin();
181 it != indexOfThermalElement.cend() ; ++it)
182 {
183 if ( ie == *it ) return true;
184 }
185 }
186 }
187
188 return result;
189}
bool G4bool
Definition: G4Types.hh:86
G4ParticleDefinition * GetDefinition() const
size_t GetIndex() const
Definition: G4Element.hh:182

◆ IsIsoApplicable()

G4bool G4ParticleHPThermalScatteringData::IsIsoApplicable ( const G4DynamicParticle dp,
G4int  ,
G4int  ,
const G4Element element,
const G4Material material 
)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 84 of file G4ParticleHPThermalScatteringData.cc.

88{
89 G4double eKin = dp->GetKineticEnergy();
90 if ( eKin > 4.0*eV //GetMaxKinEnergy()
91 || eKin < 0 //GetMinKinEnergy()
92 || dp->GetDefinition() != G4Neutron::Neutron() ) return false;
93
94 if ( dic.find( std::pair < const G4Material* , const G4Element* > ( (G4Material*)NULL , element ) ) != dic.end()
95 || dic.find( std::pair < const G4Material* , const G4Element* > ( material , element ) ) != dic.end() ) return true;
96
97 return false;
98}

The documentation for this class was generated from the following files: