include/meltpooldg/compressible_flow/output_post_processor.hpp Source File

Developer Documentation: include/meltpooldg/compressible_flow/output_post_processor.hpp Source File
Developer Documentation
output_post_processor.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/dofs/dof_handler.h>
4
5#include <deal.II/lac/la_parallel_vector.h>
6
7#include <deal.II/numerics/data_component_interpretation.h>
8#include <deal.II/numerics/data_postprocessor.h>
9
14
16
17#include <string>
18#include <vector>
19
21{
28 template <int dim, typename number, IsConservedView View>
29 requires requires { typename View::state_type; }
30 class ConservedVariablesPostProcessor : public dealii::DataPostprocessor<dim>
31 {
32 public:
41 const std::function<View(typename View::state_type &)> &view_creator)
43 {}
44
45 std::vector<std::string>
46 get_names() const override
47 {
48 std::vector<std::string> names;
49 names.reserve(n_conserved_variables<dim>);
50 names.emplace_back("density");
51 names.insert(names.end(), dim, "momentum");
52 names.emplace_back("total_energy");
53 return names;
54 }
55
56 std::vector<dealii::DataComponentInterpretation::DataComponentInterpretation>
58 {
59 std::vector<dealii::DataComponentInterpretation::DataComponentInterpretation> interpretations;
60 interpretations.reserve(n_conserved_variables<dim>);
61 interpretations.push_back(dealii::DataComponentInterpretation::component_is_scalar);
62 interpretations.insert(interpretations.end(),
63 dim,
64 dealii::DataComponentInterpretation::component_is_part_of_vector);
65 interpretations.push_back(dealii::DataComponentInterpretation::component_is_scalar);
66 return interpretations;
67 }
68
69 dealii::UpdateFlags
70 get_needed_update_flags() const override
71 {
72 return dealii::update_values;
73 }
74
85 void
86 evaluate_vector_field(const dealii::DataPostprocessorInputs::Vector<dim> &inputs,
87 std::vector<dealii::Vector<number>> &computed_quantities) const override
88 {
89 const unsigned int n_evaluation_points = inputs.solution_values.size();
90
91 for (unsigned int p = 0; p < n_evaluation_points; ++p)
92 {
93 typename View::state_type w(dealii::make_array_view(inputs.solution_values[p]));
94 const View accessor = view_creator(w);
95
96 computed_quantities[p](ConservedVariableIndex<dim>::density) = accessor.density();
97 for (unsigned int d = 0; d < dim; ++d)
98 computed_quantities[p](ConservedVariableIndex<dim>::momentum + d) =
99 accessor.momentum(d);
100 computed_quantities[p](ConservedVariableIndex<dim>::energy) = accessor.total_energy();
101 }
102 }
103
106 const std::function<View(typename View::state_type &)> view_creator;
107 };
108
115 template <int dim, typename number, IsPrimitiveView View>
116 requires requires { typename View::state_type; }
117 class PrimitiveVariablesPostProcessor : public dealii::DataPostprocessor<dim>
118 {
119 constexpr static unsigned int n_primitive_variables = dim + 2;
120
121 enum class PrimitiveVariablesIndex : unsigned int
122 {
123 velocity = 0,
124 pressure = dim,
126 };
127
128 public:
137 const std::function<View(typename View::state_type &)> &view_creator)
139 {}
140
141 std::vector<std::string>
142 get_names() const override
143 {
144 std::vector<std::string> names;
145 names.reserve(n_primitive_variables);
146 names.insert(names.end(), dim, "velocity");
147 names.emplace_back("pressure");
148 names.emplace_back("temperature");
149 return names;
150 }
151
152 std::vector<dealii::DataComponentInterpretation::DataComponentInterpretation>
154 {
155 std::vector<dealii::DataComponentInterpretation::DataComponentInterpretation> interpretations;
156 interpretations.reserve(n_primitive_variables);
157 interpretations.insert(interpretations.end(),
158 dim,
159 dealii::DataComponentInterpretation::component_is_part_of_vector);
160 interpretations.push_back(dealii::DataComponentInterpretation::component_is_scalar);
161 interpretations.push_back(dealii::DataComponentInterpretation::component_is_scalar);
162 return interpretations;
163 }
164
165 dealii::UpdateFlags
166 get_needed_update_flags() const override
167 {
168 return dealii::update_values;
169 }
170
181 void
182 evaluate_vector_field(const dealii::DataPostprocessorInputs::Vector<dim> &inputs,
183 std::vector<dealii::Vector<number>> &computed_quantities) const override
184 {
185 const unsigned int n_evaluation_points = inputs.solution_values.size();
186
187 for (unsigned int p = 0; p < n_evaluation_points; ++p)
188 {
189 typename View::state_type w(dealii::make_array_view(inputs.solution_values[p]));
190 const View accessor = view_creator(w);
191
192 computed_quantities[p](static_cast<unsigned int>(PrimitiveVariablesIndex::pressure)) =
193 accessor.pressure();
194 for (unsigned int d = 0; d < dim; ++d)
195 computed_quantities[p](static_cast<unsigned int>(PrimitiveVariablesIndex::velocity) +
196 d) = accessor.velocity(d);
197 computed_quantities[p](static_cast<unsigned int>(PrimitiveVariablesIndex::temperature)) =
198 accessor.temperature();
199 }
200 }
201
204 const std::function<View(typename View::state_type &)> view_creator;
205 };
206
215 template <int dim, typename number, IsMaterialView View>
216 requires requires { typename View::state_type; }
217 class MaterialVariablesPostProcessor : public dealii::DataPostprocessor<dim>
218 {
219 constexpr static unsigned int n_material_variables = 5;
220
229
230 public:
239 const std::function<View(typename View::state_type &)> &view_creator)
241 {}
242
243 std::vector<std::string>
244 get_names() const override
245 {
246 std::vector<std::string> names;
247 names.reserve(n_material_variables);
248 names.emplace_back("dynamic_viscosity");
249 names.emplace_back("specific_gas_constant");
250 names.emplace_back("heat_capacity_ratio");
251 names.emplace_back("specific_isobaric_heat");
252 names.emplace_back("thermal_conductivity");
253 return names;
254 }
255
256 std::vector<dealii::DataComponentInterpretation::DataComponentInterpretation>
258 {
259 std::vector<dealii::DataComponentInterpretation::DataComponentInterpretation> interpretations(
260 n_material_variables, dealii::DataComponentInterpretation::component_is_scalar);
261 return interpretations;
262 }
263
264 dealii::UpdateFlags
265 get_needed_update_flags() const override
266 {
267 return dealii::update_values;
268 }
269
280 void
281 evaluate_vector_field(const dealii::DataPostprocessorInputs::Vector<dim> &inputs,
282 std::vector<dealii::Vector<number>> &computed_quantities) const override
283 {
284 const unsigned int n_evaluation_points = inputs.solution_values.size();
285
286 for (unsigned int p = 0; p < n_evaluation_points; ++p)
287 {
288 typename View::state_type w(dealii::make_array_view(inputs.solution_values[p]));
289 const View accessor = view_creator(w);
290
291 computed_quantities[p](static_cast<unsigned int>(
292 MaterialVariablesIndex::dynamic_viscosity)) = accessor.dynamic_viscosity();
293 computed_quantities[p](static_cast<unsigned int>(
294 MaterialVariablesIndex::specific_gas_constant)) = accessor.specific_gas_constant();
295 computed_quantities[p](static_cast<unsigned int>(
296 MaterialVariablesIndex::heat_capacity_ratio)) = accessor.heat_capacity_ratio();
297 computed_quantities[p](
299 accessor.specific_isobaric_heat();
300 computed_quantities[p](static_cast<unsigned int>(
301 MaterialVariablesIndex::thermal_conductivity)) = accessor.thermal_conductivity();
302 }
303 }
304
307 const std::function<View(typename View::state_type &)> view_creator;
308 };
309
316 template <int dim, typename number>
318 {
329 void
331 const dealii::DoFHandler<dim> &dof_handler,
332 const dealii::LinearAlgebra::distributed::Vector<number> &solution,
333 const std::vector<OutputType> &output_types) const
334 {
335 if (Utils::contains(output_types, OutputType::conserved_variables))
336 {
337 for (const auto &post_processor : conserved_post_processors)
338 {
339 data_out.add_data_vector(&dof_handler, &solution, post_processor.get());
340 }
341 }
342 if (Utils::contains(output_types, OutputType::primitive_variables))
343 {
344 for (const auto &post_processor : primitive_post_processors)
345 {
346 data_out.add_data_vector(&dof_handler, &solution, post_processor.get());
347 }
348 }
349 if (Utils::contains(output_types, OutputType::material_quantities))
350 {
351 for (const auto &post_processor : material_post_processors)
352 {
353 data_out.add_data_vector(&dof_handler, &solution, post_processor.get());
354 }
355 }
356 }
357
363 void
365 std::unique_ptr<dealii::DataPostprocessor<dim>> &&post_processor)
366 {
367 conserved_post_processors.emplace_back(std::move(post_processor));
368 }
369
375 void
377 std::unique_ptr<dealii::DataPostprocessor<dim>> &&post_processor)
378 {
379 primitive_post_processors.emplace_back(std::move(post_processor));
380 }
381
387 void
389 std::unique_ptr<dealii::DataPostprocessor<dim>> &&post_processor)
390 {
391 material_post_processors.emplace_back(std::move(post_processor));
392 }
393
394 private:
395 std::vector<std::unique_ptr<dealii::DataPostprocessor<dim>>> conserved_post_processors;
396 std::vector<std::unique_ptr<dealii::DataPostprocessor<dim>>> primitive_post_processors;
397 std::vector<std::unique_ptr<dealii::DataPostprocessor<dim>>> material_post_processors;
398 };
399} // namespace MeltPoolDG::CompressibleFlow
const std::function< View(typename View::state_type &)> view_creator
Definition output_post_processor.hpp:106
std::vector< dealii::DataComponentInterpretation::DataComponentInterpretation > get_data_component_interpretation() const override
Definition output_post_processor.hpp:57
void evaluate_vector_field(const dealii::DataPostprocessorInputs::Vector< dim > &inputs, std::vector< dealii::Vector< number > > &computed_quantities) const override
Definition output_post_processor.hpp:86
dealii::UpdateFlags get_needed_update_flags() const override
Definition output_post_processor.hpp:70
ConservedVariablesPostProcessor(const std::function< View(typename View::state_type &)> &view_creator)
Definition output_post_processor.hpp:40
std::vector< std::string > get_names() const override
Definition output_post_processor.hpp:46
Definition output_post_processor.hpp:218
MaterialVariablesIndex
Definition output_post_processor.hpp:222
static constexpr unsigned int n_material_variables
Definition output_post_processor.hpp:219
const std::function< View(typename View::state_type &)> view_creator
Definition output_post_processor.hpp:307
MaterialVariablesPostProcessor(const std::function< View(typename View::state_type &)> &view_creator)
Definition output_post_processor.hpp:238
dealii::UpdateFlags get_needed_update_flags() const override
Definition output_post_processor.hpp:265
std::vector< std::string > get_names() const override
Definition output_post_processor.hpp:244
void evaluate_vector_field(const dealii::DataPostprocessorInputs::Vector< dim > &inputs, std::vector< dealii::Vector< number > > &computed_quantities) const override
Definition output_post_processor.hpp:281
std::vector< dealii::DataComponentInterpretation::DataComponentInterpretation > get_data_component_interpretation() const override
Definition output_post_processor.hpp:257
static constexpr unsigned int n_primitive_variables
Definition output_post_processor.hpp:119
const std::function< View(typename View::state_type &)> view_creator
Definition output_post_processor.hpp:204
std::vector< std::string > get_names() const override
Definition output_post_processor.hpp:142
dealii::UpdateFlags get_needed_update_flags() const override
Definition output_post_processor.hpp:166
PrimitiveVariablesIndex
Definition output_post_processor.hpp:122
PrimitiveVariablesPostProcessor(const std::function< View(typename View::state_type &)> &view_creator)
Definition output_post_processor.hpp:136
std::vector< dealii::DataComponentInterpretation::DataComponentInterpretation > get_data_component_interpretation() const override
Definition output_post_processor.hpp:153
void evaluate_vector_field(const dealii::DataPostprocessorInputs::Vector< dim > &inputs, std::vector< dealii::Vector< number > > &computed_quantities) const override
Definition output_post_processor.hpp:182
A generic utility for managing simulation output data in the MeltPoolDG context.
Definition generic_data_out.hpp:32
void add_data_vector(const dealii::DoFHandler< dim > &dof_handler, const VectorType &data, const std::vector< std::string > &names, const std::vector< dealii::DataComponentInterpretation::DataComponentInterpretation > &data_component_interpretation=std::vector< dealii::DataComponentInterpretation::DataComponentInterpretation >(), const bool force_output=false)
Add a distributed vector with multiple components and custom interpretations.
This file contains various functions that can be used to set and evaluate boundary conditions for the...
Definition boundary_condition_functions.hpp:17
bool contains(const Container &c, typename Container::value_type const value)
Definition cpp23_functions.h:26
Definition output_post_processor.hpp:318
void add_primitive_variables_post_processor(std::unique_ptr< dealii::DataPostprocessor< dim > > &&post_processor)
Definition output_post_processor.hpp:376
void attach_to_data_out(GenericDataOut< dim, number > &data_out, const dealii::DoFHandler< dim > &dof_handler, const dealii::LinearAlgebra::distributed::Vector< number > &solution, const std::vector< OutputType > &output_types) const
Definition output_post_processor.hpp:330
std::vector< std::unique_ptr< dealii::DataPostprocessor< dim > > > conserved_post_processors
Definition output_post_processor.hpp:395
std::vector< std::unique_ptr< dealii::DataPostprocessor< dim > > > primitive_post_processors
Definition output_post_processor.hpp:396
void add_material_quantities_post_processor(std::unique_ptr< dealii::DataPostprocessor< dim > > &&post_processor)
Definition output_post_processor.hpp:388
void add_conserved_variables_post_processor(std::unique_ptr< dealii::DataPostprocessor< dim > > &&post_processor)
Definition output_post_processor.hpp:364
std::vector< std::unique_ptr< dealii::DataPostprocessor< dim > > > material_post_processors
Definition output_post_processor.hpp:397