42 const static G4double R;
44 template <
typename Type>
45 static G4double CalculateDensityFromPressureTemperature(
const std::list<G4String>& components,
46 const std::list<Type>& componentFractions,
48 G4double temperature) {
50 G4double averageMolarMass = CalculateAverageMolarMass(components, componentFractions);
51 G4double density = (pressure*averageMolarMass)/(R*temperature);
56 template <
typename Type>
57 static G4double CalculateTemperatureFromPressureDensity(
const std::list<G4String>& components,
58 const std::list<Type>& componentFractions,
62 G4double averageMolarMass = CalculateAverageMolarMass(components, componentFractions);
63 G4double temperature = (pressure*averageMolarMass)/(R*density);
68 template <
typename Type>
69 static G4double CalculatePressureFromTemperatureDensity(
const std::list<G4String>& components,
70 const std::list<Type>& componentFractions,
74 G4double averageMolarMass = CalculateAverageMolarMass(components, componentFractions);
75 G4double pressure = (density*R*temperature)/(averageMolarMass);
80 template <
typename Type>
81 static G4double CalculateDensityFromNumberDensity(
const std::list<G4String>& components,
82 const std::list<Type>& componentFractions,
83 G4double numberDensity) {
85 G4double averageMolarMass = CalculateAverageMolarMass(components, componentFractions);
86 G4double density = numberDensity*averageMolarMass/CLHEP::Avogadro;
91 template <
typename Type>
92 static G4double CalculateDensityFromMolarDensity(
const std::list<G4String>& components,
93 const std::list<Type>& componentFractions,
94 G4double molarDensity) {
96 G4double averageMolarMass = CalculateAverageMolarMass(components, componentFractions);
97 G4double density = molarDensity*averageMolarMass;
102 template <
typename Type>
103 static G4double CalculateAverageMolarMass(
const std::list<G4String>& components,
104 const std::list<Type>& componentFractions){
106 std::vector<G4String> componentsVector{ components.begin(), components.end() };
107 std::vector<Type> componentFractionsVector{ componentFractions.begin(), componentFractions.end() };
108 std::map<G4String, Type> componentsTable;
110 G4double averageMolarMass = 0;
111 G4double fracSum = 0;
112 for (
size_t i=0; i < componentsVector.size(); i++)
114 const G4String& componentName = componentsVector[i];
117 size_t nbelement = component->GetNumberOfElements();
120 auto element = component->GetElement(0);
121 auto molarMass = element->GetN();
122 averageMolarMass = averageMolarMass + componentFractionsVector[i] * molarMass;
123 fracSum = fracSum + componentFractionsVector[i];
127 auto elementVector = component->GetElementVector();
128 std::list<G4String> elementNames;
129 std::list<Type> elementFractions;
130 for (
const auto element: *elementVector)
132 elementNames.push_back(element->GetName());
134 for (
size_t ii=0; ii < elementVector->size(); ii++)
136 elementFractions.push_back(component->GetFractionVector()[ii]);
138 averageMolarMass = averageMolarMass + componentFractionsVector[i] * CalculateAverageMolarMass(elementNames, elementFractions);
139 fracSum = fracSum + componentFractionsVector[i];
143 return averageMolarMass/fracSum;
147 template <
typename Type>
148 static void CheckGasLaw(G4String name,
149 G4double &temperature,
152 const std::list<G4String>& components,
153 const std::list<Type>& componentFractions) {
156 G4cout <<
"BDSIdealGas::CheckGasLaw: " << G4endl;
158 if (density != 0 && pressure == 0)
160 G4double calcPressure = CalculatePressureFromTemperatureDensity(components, componentFractions,
161 temperature, density);
162 pressure = calcPressure;
163 G4String msg =
"BDSIdealGas :: Computing pressure " + std::to_string(calcPressure);
164 msg +=
" atmosphere for material " + name;
168 else if (density !=0 && pressure !=0 && temperature == 300)
170 G4double calcTemp = CalculateTemperatureFromPressureDensity(components, componentFractions,
172 temperature = calcTemp;
173 G4String msg =
"BDSIdealGas :: Computing temperature " + std::to_string(calcTemp);
174 msg +=
" kelvin for material " + name;
178 else if (density == 0 && pressure !=0)
180 G4double calcDens = CalculateDensityFromPressureTemperature(components, componentFractions,
181 pressure, temperature);
183 G4String msg =
"BDSIdealGas :: Computing density " + std::to_string(calcDens);
184 msg +=
" g.cm-3 for material " + name;
188 else if (density !=0 && pressure !=0 && temperature != 300)
190 G4double calcDensity = CalculateDensityFromPressureTemperature(components, componentFractions, pressure, temperature);
191 if(density != calcDensity)
193 G4String msg =
"Ideal gas density calculated from pressure and temperature doesn't match given density\n";
194 msg +=
"Assuming temperature of 300K and computing correct pressure for this density";
197 pressure = CalculatePressureFromTemperatureDensity(components, componentFractions, temperature, density);