41 const static G4double R;
43 template <
typename Type>
44 static G4double CalculateDensityFromPressureTemperature(
const std::list<G4String>& components,
45 const std::list<Type>& componentFractions,
47 G4double temperature) {
49 G4double averageMolarMass = CalculateAverageMolarMass(components, componentFractions);
50 G4double density = (pressure*averageMolarMass)/(R*temperature);
55 template <
typename Type>
56 static G4double CalculateTemperatureFromPressureDensity(
const std::list<G4String>& components,
57 const std::list<Type>& componentFractions,
61 G4double averageMolarMass = CalculateAverageMolarMass(components, componentFractions);
62 G4double temperature = (pressure*averageMolarMass)/(R*density);
67 template <
typename Type>
68 static G4double CalculatePressureFromTemperatureDensity(
const std::list<G4String>& components,
69 const std::list<Type>& componentFractions,
73 G4double averageMolarMass = CalculateAverageMolarMass(components, componentFractions);
74 G4double pressure = (density*R*temperature)/(averageMolarMass);
79 template <
typename Type>
80 static G4double CalculateDensityFromNumberDensity(
const std::list<G4String>& components,
81 const std::list<Type>& componentFractions,
82 G4double numberDensity) {
84 G4double averageMolarMass = CalculateAverageMolarMass(components, componentFractions);
85 G4double density = numberDensity*averageMolarMass/CLHEP::Avogadro;
90 template <
typename Type>
91 static G4double CalculateDensityFromMolarDensity(
const std::list<G4String>& components,
92 const std::list<Type>& componentFractions,
93 G4double molarDensity) {
95 G4double averageMolarMass = CalculateAverageMolarMass(components, componentFractions);
96 G4double density = molarDensity*averageMolarMass;
101 template <
typename Type>
102 static G4double CalculateAverageMolarMass(
const std::list<G4String>& components,
103 const std::list<Type>& componentFractions){
105 std::vector<G4String> componentsVector{ components.begin(), components.end() };
106 std::vector<Type> componentFractionsVector{ componentFractions.begin(), componentFractions.end() };
107 std::map<G4String, Type> componentsTable;
109 G4double averageMolarMass = 0;
110 G4double fracSum = 0;
111 for (
size_t i=0; i < componentsVector.size(); i++)
113 const G4String& componentName = componentsVector[i];
116 size_t nbelement = component->GetNumberOfElements();
119 auto element = component->GetElement(0);
120 auto molarMass = element->GetN();
121 averageMolarMass = averageMolarMass + componentFractionsVector[i] * molarMass;
122 fracSum = fracSum + componentFractionsVector[i];
126 auto elementVector = component->GetElementVector();
127 std::list<G4String> elementNames;
128 std::list<Type> elementFractions;
129 for (
const auto element: *elementVector)
131 elementNames.push_back(element->GetName());
133 for (
size_t ii=0; ii < elementVector->size(); ii++)
135 elementFractions.push_back(component->GetFractionVector()[ii]);
137 averageMolarMass = averageMolarMass + componentFractionsVector[i] * CalculateAverageMolarMass(elementNames, elementFractions);
138 fracSum = fracSum + componentFractionsVector[i];
142 return averageMolarMass/fracSum;
146 template <
typename Type>
147 static void CheckGasLaw(G4String name,
148 G4double &temperature,
151 const std::list<G4String>& components,
152 const std::list<Type>& componentFractions) {
155 G4cout <<
"BDSIdealGas::CheckGasLaw: " << G4endl;
157 if (density != 0 && pressure == 0)
159 G4double calcPressure = CalculatePressureFromTemperatureDensity(components, componentFractions,
160 temperature, density);
161 pressure = calcPressure;
162 G4String msg =
"BDSIdealGas :: Computing pressure " + std::to_string(calcPressure);
163 msg +=
" atmosphere for material " + name;
167 else if (density !=0 && pressure !=0 && temperature == 300)
169 G4double calcTemp = CalculateTemperatureFromPressureDensity(components, componentFractions,
171 temperature = calcTemp;
172 G4String msg =
"BDSIdealGas :: Computing temperature " + std::to_string(calcTemp);
173 msg +=
" kelvin for material " + name;
177 else if (density == 0 && pressure !=0)
179 G4double calcDens = CalculateDensityFromPressureTemperature(components, componentFractions,
180 pressure, temperature);
182 G4String msg =
"BDSIdealGas :: Computing density " + std::to_string(calcDens);
183 msg +=
" g.cm-3 for material " + name;
187 else if (density !=0 && pressure !=0 && temperature != 300)
189 G4double calcDensity = CalculateDensityFromPressureTemperature(components, componentFractions, pressure, temperature);
190 if(density != calcDensity)
192 G4String msg =
"Ideal gas density calculated from pressure and temperature doesn't match given density\n";
193 msg +=
"Assuming temperature of 300K and computing correct pressure for this density";
196 pressure = CalculatePressureFromTemperatureDensity(components, componentFractions, temperature, density);