include/meltpooldg/species_transport/state_views_mixins.hpp Source File

Developer Documentation: include/meltpooldg/species_transport/state_views_mixins.hpp Source File
Developer Documentation
state_views_mixins.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/exception_macros.h>
4#include <deal.II/base/exceptions.h>
5
7
8#include <optional>
9#include <type_traits>
10
12{
29 template <int n_start_index, int n_species, typename ValueType, typename Derived>
31 {
32 using value_type = std::conditional_t<std::is_const_v<std::remove_reference_t<ValueType>>,
33 std::add_const_t<typename ValueType::value_type>,
34 typename ValueType::value_type>;
35
36
43 partial_density(const unsigned species_component) const
44 {
45 AssertIndexRange(species_component, n_species);
46 if (species_component < n_species - 1)
47 {
48 return value()[n_start_index + species_component];
49 }
50 else
52 }
53
59 typename ValueType::value_type
60 mass_fraction(const unsigned species_component) const
61 {
62 AssertIndexRange(species_component, n_species);
63 if (species_component < n_species - 1)
64 return value()[n_start_index + species_component] / derived().density();
65 else
67 }
68
69 private:
70 ValueType &
71 value() const
72 {
73 return static_cast<const Derived &>(*this).value();
74 }
75
76 const Derived &
77 derived() const
78 {
79 return static_cast<const Derived &>(*this);
80 }
81
88 typename ValueType::value_type
90 {
91 if (last_species_cache.mass_fraction.has_value())
92 return last_species_cache.mass_fraction.value();
93 else
94 {
95 last_species_cache.mass_fraction = typename ValueType::value_type(1.);
96 for (unsigned int i = 0; i < n_species - 1; ++i)
97 {
98 last_species_cache.mass_fraction.value() -= mass_fraction(i);
99 }
100 return last_species_cache.mass_fraction.value();
101 }
102 }
103
110 value_type &
112 {
113 if (last_species_cache.partial_density.has_value())
114 return last_species_cache.partial_density.value();
115 else
116 {
117 last_species_cache.partial_density = derived().density() * last_species_mass_fraction();
118 return last_species_cache.partial_density.value();
119 }
120 }
121
123 struct
124 {
125 mutable std::optional<typename ValueType::value_type> mass_fraction;
126 mutable std::optional<typename ValueType::value_type> partial_density;
128 };
129
130 template <int n_species, typename ValueType, typename Derived>
132 {
133 using value_type = std::conditional_t<std::is_const_v<std::remove_reference_t<ValueType>>,
134 std::add_const_t<typename ValueType::value_type>,
135 typename ValueType::value_type>;
136
143 typename ValueType::value_type
144 partial_pressure(const unsigned species_component) const
145 {
146 return derived().mole_fraction(species_component) * derived().pressure();
147 }
148
156 typename ValueType::value_type
157 partial_inner_energy(const unsigned species_component) const
158 {
159 return derived().specific_inner_energy() * derived().mass_fraction(species_component);
160 }
161
162 private:
163 ValueType &
164 value() const
165 {
166 return static_cast<const Derived &>(*this).value();
167 }
168
169 const Derived &
170 derived() const
171 {
172 return static_cast<const Derived &>(*this);
173 }
174 };
175
189 template <int n_start_index,
190 int n_species,
191 typename ValueType,
192 typename GradientType,
193 typename Derived>
195 {
196 using value_type = std::conditional_t<std::is_const_v<std::remove_reference_t<ValueType>>,
197 std::add_const_t<typename ValueType::value_type>,
198 typename ValueType::value_type>;
199
200 using gradient_type = std::conditional_t<std::is_const_v<std::remove_reference_t<GradientType>>,
201 std::add_const_t<typename GradientType::value_type>,
202 typename GradientType::value_type>;
203
211 grad_partial_density(const unsigned species_component) const
212 {
213 AssertIndexRange(species_component, n_species);
214 if (species_component < n_species - 1)
215 return gradient_value()[n_start_index + species_component];
216 else
218 }
219
226 typename GradientType::value_type
227 grad_mass_fraction(const unsigned species_component) const
228 {
229 AssertIndexRange(species_component, n_species);
230
231 if (species_component < n_species - 1)
232 return (gradient_value()[n_start_index + species_component] -
233 derived().grad_density() * derived().mass_fraction(species_component)) /
234 derived().density();
235 else
237 }
238
239 private:
240 ValueType &
241 value() const
242 {
243 return static_cast<const Derived &>(*this).value();
244 }
245
246 GradientType &
248 {
249 return static_cast<const Derived &>(*this).gradient_value();
250 }
251
252 const Derived &
253 derived() const
254 {
255 return static_cast<const Derived &>(*this);
256 }
257
266 {
267 if (last_species_cache.mass_fraction.has_value())
268 return last_species_cache.mass_fraction.value();
269 else
270 {
271 last_species_cache.mass_fraction = typename GradientType::value_type();
272 for (unsigned int i = 0; i < n_species - 1; ++i)
273 {
274 last_species_cache.mass_fraction.value() -= grad_mass_fraction(i);
275 }
276 return last_species_cache.mass_fraction.value();
277 }
278 }
279
286 typename GradientType::value_type &
288 {
289 if (last_species_cache.partial_density.has_value())
290 return last_species_cache.partial_density.value();
291 else
292 {
293 last_species_cache.partial_density =
294 derived().grad_density() * derived().mass_fraction(n_species - 1) +
295 derived().density() * derived().grad_mass_fraction(n_species - 1);
296 return last_species_cache.partial_density.value();
297 }
298 }
299
302 struct
303 {
304 mutable std::optional<typename GradientType::value_type> mass_fraction;
305 mutable std::optional<typename GradientType::value_type> partial_density;
307 };
308
316 template <int n_start_index, int n_species, typename Derived>
318 {
319 decltype(auto)
320 partial_density_flux(const unsigned species_component) const
321 {
322 AssertIndexRange(species_component, n_species - 1);
323 return get_value()[n_start_index + species_component];
324 }
325
326 private:
327 decltype(auto)
328 get_value() const
329 {
330 return static_cast<const Derived &>(*this).value();
331 }
332 };
333} // namespace MeltPoolDG::SpeciesTransport
Definition boundary_conditions.hpp:8
Definition state_views_mixins.hpp:132
ValueType::value_type partial_inner_energy(const unsigned species_component) const
Definition state_views_mixins.hpp:157
ValueType & value() const
Definition state_views_mixins.hpp:164
ValueType::value_type partial_pressure(const unsigned species_component) const
Definition state_views_mixins.hpp:144
const Derived & derived() const
Definition state_views_mixins.hpp:170
std::conditional_t< std::is_const_v< std::remove_reference_t< ValueType > >, std::add_const_t< typename ValueType::value_type >, typename ValueType::value_type > value_type
Definition state_views_mixins.hpp:135
Definition state_views_mixins.hpp:31
std::conditional_t< std::is_const_v< std::remove_reference_t< ValueType > >, std::add_const_t< typename ValueType::value_type >, typename ValueType::value_type > value_type
Definition state_views_mixins.hpp:34
ValueType & value() const
Definition state_views_mixins.hpp:71
ValueType::value_type last_species_mass_fraction() const
Definition state_views_mixins.hpp:89
const Derived & derived() const
Definition state_views_mixins.hpp:77
ValueType::value_type mass_fraction(const unsigned species_component) const
Definition state_views_mixins.hpp:60
std::optional< typename ValueType::value_type > mass_fraction
Definition state_views_mixins.hpp:125
struct MeltPoolDG::SpeciesTransport::DofValueMixin::@7 last_species_cache
Cache for the mass fraction and the partial density of the last species component.
std::optional< typename ValueType::value_type > partial_density
Definition state_views_mixins.hpp:126
value_type & partial_density(const unsigned species_component) const
Definition state_views_mixins.hpp:43
value_type & last_species_partial_density() const
Definition state_views_mixins.hpp:111
Definition state_views_mixins.hpp:318
decltype(auto) get_value() const
Definition state_views_mixins.hpp:328
decltype(auto) partial_density_flux(const unsigned species_component) const
Definition state_views_mixins.hpp:320
Definition state_views_mixins.hpp:195
std::conditional_t< std::is_const_v< std::remove_reference_t< GradientType > >, std::add_const_t< typename GradientType::value_type >, typename GradientType::value_type > gradient_type
Definition state_views_mixins.hpp:202
GradientType::value_type grad_mass_fraction(const unsigned species_component) const
Definition state_views_mixins.hpp:227
struct MeltPoolDG::SpeciesTransport::GradientValueMixin::@8 last_species_cache
const Derived & derived() const
Definition state_views_mixins.hpp:253
gradient_type & grad_partial_density(const unsigned species_component) const
Definition state_views_mixins.hpp:211
std::conditional_t< std::is_const_v< std::remove_reference_t< ValueType > >, std::add_const_t< typename ValueType::value_type >, typename ValueType::value_type > value_type
Definition state_views_mixins.hpp:198
ValueType & value() const
Definition state_views_mixins.hpp:241
GradientType & gradient_value() const
Definition state_views_mixins.hpp:247
GradientType::value_type & last_species_grad_partial_density() const
Definition state_views_mixins.hpp:287
std::optional< typename GradientType::value_type > partial_density
Definition state_views_mixins.hpp:305
std::optional< typename GradientType::value_type > mass_fraction
Definition state_views_mixins.hpp:304
gradient_type & last_species_grad_mass_fraction() const
Definition state_views_mixins.hpp:265