26 std::declval<const Derived>().mass_fraction(species_component)
27 } -> std::convertible_to<ValueType>;
29 std::declval<const Derived>().molar_mass(species_component)
30 } -> std::convertible_to<ValueType>;
33 ValueType total_amount_of_substance = 0.;
34 for (
unsigned int i = 0; i < n_species; ++i)
36 total_amount_of_substance +=
derived().mass_fraction(i) /
derived().molar_mass(i);
39 ValueType species_amount_of_substance =
40 derived().mass_fraction(species_component) /
derived().molar_mass(species_component);
41 return species_amount_of_substance / total_amount_of_substance;
62 std::declval<const Derived>().binary_diffusion_coefficient(species_component,
64 } -> std::convertible_to<ValueType>;
66 std::declval<const Derived>().mass_fraction(species_component)
67 } -> std::convertible_to<ValueType>;
70 ValueType denominator = 0.;
71 for (
unsigned int i = 0; i < n_species; ++i)
75 if (i != species_component and
76 derived().binary_diffusion_coefficient(species_component, i) > 0.)
83 const auto compute_final_mixture_averaged_diffusion_coefficient =
84 [&](
const ValueType &denominator) -> ValueType {
85 return (1. -
derived().mass_fraction(species_component)) / denominator;
90 ValueType tolerance = ValueType(1e-20);
91 if constexpr (std::is_floating_point_v<ValueType>)
93 return denominator < tolerance ?
95 compute_final_mixture_averaged_diffusion_coefficient(denominator);
99 return dealii::compare_and_apply_mask<dealii::SIMDComparison::greater_than>(
102 compute_final_mixture_averaged_diffusion_coefficient(denominator),
117 number SpeciesMaterial::*property) const
118 requires requires(int i) {
120 std::declval<const Derived>().mass_fraction(i)
121 } -> std::convertible_to<ValueType>;
124 ValueType result = 0.;
125 for (
const auto [index, species] : species_material | boost::adaptors::indexed())
127 if (index >= n_species)
129 result +=
derived().mass_fraction(index) * (species.*property);