GGEMS  1.1
GPU GEant4-based Monte Carlo Simulations
GGEMSIonizationParamsMaterial.cc
Go to the documentation of this file.
1 // ************************************************************************
2 // * This file is part of GGEMS. *
3 // * *
4 // * GGEMS is free software: you can redistribute it and/or modify *
5 // * it under the terms of the GNU General Public License as published by *
6 // * the Free Software Foundation, either version 3 of the License, or *
7 // * (at your option) any later version. *
8 // * *
9 // * GGEMS is distributed in the hope that it will be useful, *
10 // * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 // * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 // * GNU General Public License for more details. *
13 // * *
14 // * You should have received a copy of the GNU General Public License *
15 // * along with GGEMS. If not, see <https://www.gnu.org/licenses/>. *
16 // * *
17 // ************************************************************************
18 
33 
37 
39 : mean_excitation_energy_(0.0f),
40  log_mean_excitation_energy_(0.0f),
41  radiation_length_(0.0f),
42  x0_density_(0.0f),
43  x1_density_(0.0f),
44  d0_density_(0.0f),
45  c_density_(0.0f),
46  a_density_(0.0f),
47  m_density_(0.0f),
48  f1_fluct_(0.0f),
49  f2_fluct_(0.0f),
50  energy0_fluct_(0.0f),
51  energy1_fluct_(0.0f),
52  energy2_fluct_(0.0f),
53  log_energy1_fluct_(0.0f),
54  log_energy2_fluct_(0.0f)
55 {
56  GGcout("GGEMSIonizationParamsMaterial", "GGEMSIonizationParamsMaterial", 3) << "GGEMSIonizationParamsMaterial creating..." << GGendl;
57 
58  material_ = material;
59 
60  // Compute params
62 
63  GGcout("GGEMSIonizationParamsMaterial", "GGEMSIonizationParamsMaterial", 3) << "GGEMSIonizationParamsMaterial created!!!" << GGendl;
64 }
65 
69 
71 {
72  GGcout("GGEMSIonizationParamsMaterial", "~GGEMSIonizationParamsMaterial", 3) << "GGEMSIonizationParamsMaterial erasing..." << GGendl;
73 
74  GGcout("GGEMSIonizationParamsMaterial", "~GGEMSIonizationParamsMaterial", 3) << "GGEMSIonizationParamsMaterial erased!!!" << GGendl;
75 }
76 
80 
82 {
83  GGcout("GGEMSIonizationParamsMaterial", "ComputeIonizationParameters", 3) << "Computing ionization parameters for ..." << GGendl;
84 
85  // Get the material manager
87 
88  // Number of chemical elements in material
89  GGsize number_of_chemical_elements = static_cast<GGsize>(material_->nb_elements_);
90 
91  // Loop over the number of chemical elements
92  GGdouble axZ = 0.0f;
93  GGfloat total_number_of_electron_per_volume = 0.0f;
94  for (GGsize i = 0; i < number_of_chemical_elements; ++i) {
95  // Get element by element
96  GGEMSChemicalElement const& chemical_element = material_manager.GetChemicalElement(material_->chemical_element_name_[i]);
97  axZ = static_cast<GGdouble>(AVOGADRO)/ chemical_element.molar_mass_M_ * material_->density_ * material_->mixture_f_[i] * static_cast<GGdouble>(chemical_element.atomic_number_Z_);
98  log_mean_excitation_energy_ += static_cast<GGfloat>(axZ) * std::log(chemical_element.mean_excitation_energy_I_);
99  total_number_of_electron_per_volume += static_cast<GGfloat>(axZ);
100  }
101 
102  log_mean_excitation_energy_ /= total_number_of_electron_per_volume;
104 
105  // Compute density correction factor
106  // define material state (approximation based on threshold)
107  GGchar state = GAS;
108  if (material_->density_ > GASTHRESHOLD) state = SOLID;
109 
110  // Check if density effect data exist in the table
111  // R.M. Sternheimer, Atomic Data and Nuclear Data Tables, 30: 261 (1984)
112  GGint index_density_correction = material_manager.GetChemicalElement(material_->chemical_element_name_[0]).index_density_correction_;
113 
114  // Checking material with only one element, and checking the index of density correction
115  if(number_of_chemical_elements == 1 && index_density_correction > 0) {
116  // Take parameters for the density effect correction from
117  // R.M. Sternheimer et al. Density Effect For The Ionization Loss
118  // of Charged Particles in Various Substances.
119  // Atom. Data Nucl. Data Tabl. 30 (1984) 261-271.
120  c_density_ = GGEMSDensityParams::data[index_density_correction][2];
121  x0_density_ = GGEMSDensityParams::data[index_density_correction][3];
122  x1_density_ = GGEMSDensityParams::data[index_density_correction][4];
123  m_density_ = GGEMSDensityParams::data[index_density_correction][5];
124  a_density_ = GGEMSDensityParams::data[index_density_correction][6];
125  d0_density_ = GGEMSDensityParams::data[index_density_correction][7];
126  }
127  else { // Computing the density correction
128  static constexpr GGfloat kCd2 = 4.0f * PI * HBARC_SQUARED * CLASSIC_ELECTRON_RADIUS;
129 
130  GGfloat plasma_energy = std::sqrt(kCd2*total_number_of_electron_per_volume);
131 
132  // Compute parameters for the density effect correction in DE/Dx formula.
133  // The parametrization is from R.M. Sternheimer, Phys. Rev.B,3:3681 (1971)
134  GGchar icase = 0;
135  c_density_ = 1.0f + 2.0f*std::log(mean_excitation_energy_/plasma_energy);
136 
137  if (state == SOLID) {
138  GGfloat e100eV = 100.f*eV;
139  GGfloat climiS[] = {3.681f, 5.215f};
140  GGfloat x0valS[] = {1.000f, 1.500f};
141  GGfloat x1valS[] = {2.000f, 3.000f};
142 
143  if (mean_excitation_energy_ < e100eV) icase = 0;
144  else icase = 1;
145 
146  if (c_density_ < climiS[icase]) x0_density_ = 0.2f;
147  else x0_density_ = 0.326f * c_density_ - x0valS[icase];
148 
149  x1_density_ = x1valS[icase];
150  m_density_ = 3.0f;
151  }
152 
153  if (state == GAS) {
154  m_density_ = 3.0f;
155  x1_density_ = 4.0f;
156 
157  if (c_density_ < 10.0f) {
158  x0_density_ = 1.6f;
159  }
160  else if (c_density_ < 11.5f) {
161  x0_density_ = 1.6f + 0.2f*(c_density_ - 10.0f);
162  }
163  else if ( c_density_ < 12.25f) {
164  x0_density_ = 1.9f + (c_density_ - 11.5f) / 7.5f;
165  }
166  else if ( c_density_ < 13.804f) {
167  x0_density_ = 2.0f;
168  x1_density_ = 4.0f + (c_density_ - 12.25f) / 1.554f;
169  }
170  else {
171  x0_density_ = 0.326f * c_density_ - 2.5f;
172  x1_density_ = 5.0f;
173  }
174  }
175  }
176 
177  // a density parameter can be fixed for not conductive materials
178  if (d0_density_ == 0.0f) {
179  GGfloat twoln10 = 2.0f * std::log(10.0f);
180  GGfloat xa = c_density_ / twoln10;
181  a_density_ = twoln10 * (xa - x0_density_) / std::pow((x1_density_ - x0_density_), m_density_);
182  }
183 
184  // needs an 'effective Z'
185  GGfloat zeff = 0.0f;
186 
187  for (GGsize i = 0; i < number_of_chemical_elements; ++i) {
188  GGEMSChemicalElement const& kChemicalElement = material_manager.GetChemicalElement(material_->chemical_element_name_[i]);
189  zeff += (material_->mixture_f_[i] * static_cast<GGfloat>(kChemicalElement.atomic_number_Z_));
190  }
191 
192  if (zeff > 2.0f) f2_fluct_ = 2.0f / zeff;
193  else f2_fluct_ = 0.0f;
194 
195  f1_fluct_ = 1.0f - f2_fluct_;
196  energy2_fluct_ = 10.0f * zeff * zeff * eV;
200  energy0_fluct_ = 10.f*eV;
201 }
GGEMSChemicalElement::mean_excitation_energy_I_
GGfloat mean_excitation_energy_I_
Definition: GGEMSMaterialsDatabaseManager.hh:54
GGEMSIonizationParamsMaterial::log_energy1_fluct_
GGfloat log_energy1_fluct_
Definition: GGEMSIonizationParamsMaterial.hh:330
GGEMSIonizationParamsMaterial::log_mean_excitation_energy_
GGfloat log_mean_excitation_energy_
Definition: GGEMSIonizationParamsMaterial.hh:313
GGEMSSingleMaterial
GGEMS structure managing a specific material.
Definition: GGEMSMaterialsDatabaseManager.hh:64
GGEMSIonizationParamsMaterial::a_density_
GGfloat a_density_
Definition: GGEMSIonizationParamsMaterial.hh:321
GGEMSIonizationParamsMaterial::~GGEMSIonizationParamsMaterial
~GGEMSIonizationParamsMaterial(void)
GGEMSIonizationParamsMaterial destructor.
Definition: GGEMSIonizationParamsMaterial.cc:70
GGEMSIonizationParamsMaterial::energy1_fluct_
GGfloat energy1_fluct_
Definition: GGEMSIonizationParamsMaterial.hh:328
GASTHRESHOLD
__constant GGfloat GASTHRESHOLD
Definition: GGEMSConstants.hh:45
PI
__constant GGfloat PI
Definition: GGEMSConstants.hh:38
GGEMSIonizationParamsMaterial.hh
GGEMS class managing some physical params for ionization process for material.
GGchar
#define GGchar
Definition: GGEMSTypes.hh:196
GGEMSIonizationParamsMaterial::c_density_
GGfloat c_density_
Definition: GGEMSIonizationParamsMaterial.hh:320
eV
__constant GGfloat eV
Definition: GGEMSSystemOfUnits.hh:101
GGEMSSingleMaterial::chemical_element_name_
std::vector< std::string > chemical_element_name_
Definition: GGEMSMaterialsDatabaseManager.hh:65
GGEMSChemicalElement::molar_mass_M_
GGfloat molar_mass_M_
Definition: GGEMSMaterialsDatabaseManager.hh:53
SOLID
__constant GGchar SOLID
Definition: GGEMSMaterialsDatabaseManager.hh:43
GGEMSIonizationParamsMaterial::mean_excitation_energy_
GGfloat mean_excitation_energy_
Definition: GGEMSIonizationParamsMaterial.hh:312
GGsize
#define GGsize
Definition: GGEMSTypes.hh:252
GGint
#define GGint
Definition: GGEMSTypes.hh:224
GGEMSIonizationParamsMaterial::f1_fluct_
GGfloat f1_fluct_
Definition: GGEMSIonizationParamsMaterial.hh:325
GGEMSIonizationParamsMaterial::f2_fluct_
GGfloat f2_fluct_
Definition: GGEMSIonizationParamsMaterial.hh:326
GAS
__constant GGchar GAS
Definition: GGEMSMaterialsDatabaseManager.hh:44
GGEMSIonizationParamsMaterial::ComputeIonizationParameters
void ComputeIonizationParameters(void)
Computing all ionization parameters for a material.
Definition: GGEMSIonizationParamsMaterial.cc:81
GGEMSMaterialsDatabaseManager::GetInstance
static GGEMSMaterialsDatabaseManager & GetInstance(void)
Create at first time the Singleton.
Definition: GGEMSMaterialsDatabaseManager.hh:97
GGEMSSingleMaterial::density_
GGfloat density_
Definition: GGEMSMaterialsDatabaseManager.hh:67
GGEMSSingleMaterial::mixture_f_
std::vector< GGfloat > mixture_f_
Definition: GGEMSMaterialsDatabaseManager.hh:66
GGEMSIonizationParamsMaterial::x1_density_
GGfloat x1_density_
Definition: GGEMSIonizationParamsMaterial.hh:318
GGcout
GGEMSStream GGcout
Definition: GGEMSPrint.cc:34
GGEMSIonizationParamsMaterial::x0_density_
GGfloat x0_density_
Definition: GGEMSIonizationParamsMaterial.hh:317
GGEMSChemicalElement
GGEMS structure managing a specific chemical element.
Definition: GGEMSMaterialsDatabaseManager.hh:51
GGEMSChemicalElement::index_density_correction_
GGint index_density_correction_
Definition: GGEMSMaterialsDatabaseManager.hh:52
GGEMSMaterialsDatabaseManager::GetChemicalElement
GGEMSChemicalElement GetChemicalElement(std::string const &chemical_element_name) const
get the chemical element
Definition: GGEMSMaterialsDatabaseManager.hh:187
GGdouble
#define GGdouble
Definition: GGEMSTypes.hh:280
HBARC_SQUARED
__constant GGfloat HBARC_SQUARED
Definition: GGEMSConstants.hh:70
GGendl
#define GGendl
overload C++ std::endl
Definition: GGEMSPrint.hh:60
GGEMSIonizationParamsMaterial::energy2_fluct_
GGfloat energy2_fluct_
Definition: GGEMSIonizationParamsMaterial.hh:329
GGEMSPrint.hh
Print a custom std::cout end std::cerr handling verbosity.
GGEMSChemicalElement::atomic_number_Z_
GGuchar atomic_number_Z_
Definition: GGEMSMaterialsDatabaseManager.hh:56
GGEMSIonizationParamsMaterial::d0_density_
GGfloat d0_density_
Definition: GGEMSIonizationParamsMaterial.hh:319
GGEMSIonizationParamsMaterial::log_energy2_fluct_
GGfloat log_energy2_fluct_
Definition: GGEMSIonizationParamsMaterial.hh:331
GGEMSIonizationParamsMaterial::GGEMSIonizationParamsMaterial
GGEMSIonizationParamsMaterial(GGEMSSingleMaterial const *material)
GGEMSIonizationParamsMaterial constructor.
Definition: GGEMSIonizationParamsMaterial.cc:38
GGEMSIonizationParamsMaterial::material_
GGEMSSingleMaterial const * material_
Definition: GGEMSIonizationParamsMaterial.hh:333
GGEMSIonizationParamsMaterial::m_density_
GGfloat m_density_
Definition: GGEMSIonizationParamsMaterial.hh:322
CLASSIC_ELECTRON_RADIUS
__constant GGfloat CLASSIC_ELECTRON_RADIUS
Definition: GGEMSConstants.hh:75
AVOGADRO
__constant GGfloat AVOGADRO
Definition: GGEMSConstants.hh:43
GGEMSIonizationParamsMaterial::energy0_fluct_
GGfloat energy0_fluct_
Definition: GGEMSIonizationParamsMaterial.hh:327
GGEMSSingleMaterial::nb_elements_
GGsize nb_elements_
Definition: GGEMSMaterialsDatabaseManager.hh:68
GGEMSMaterialsDatabaseManager
GGEMS class managing the material database.
Definition: GGEMSMaterialsDatabaseManager.hh:79
GGfloat
#define GGfloat
Definition: GGEMSTypes.hh:273