ryujin 2.1.1 revision 955e869188d49b3c97ca7b1cf4fd9ceb0e6f46ef
quantities.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2020 - 2024 by the ryujin authors
4//
5
6#pragma once
7
8#include <compile_time_options.h>
9
10#include "mpi_ensemble.h"
11#include "offline_data.h"
12
13#include <deal.II/base/parameter_acceptor.h>
14#include <deal.II/base/smartpointer.h>
15#include <deal.II/base/timer.h>
16#include <deal.II/lac/la_parallel_block_vector.h>
17#include <deal.II/lac/sparse_matrix.templates.h>
18#include <deal.II/lac/vector.h>
19
20#include <optional>
21
22namespace ryujin
23{
29 template <typename Description, int dim, typename Number = double>
30 class Quantities final : public dealii::ParameterAcceptor
31 {
32 public:
37
40
41 using View =
42 typename Description::template HyperbolicSystemView<dim, Number>;
43
44 using state_type = typename View::state_type;
45
47
49
56 Quantities(const MPIEnsemble &mpi_ensemble,
57 const OfflineData<dim, Number> &offline_data,
58 const HyperbolicSystem &hyperbolic_system,
59 const ParabolicSystem &parabolic_system,
60 const std::string &subsection = "/Quantities");
61
73 void prepare(const std::string &name);
74
80 void accumulate(const StateVector &state_vector, const Number t);
81
85 void write_out(const StateVector &state_vector,
86 const Number t,
87 unsigned int cycle);
88
90
91 private:
96
97 std::vector<std::tuple<std::string, std::string, std::string>>
98 interior_manifolds_;
99
100 std::vector<std::tuple<std::string, std::string, std::string>>
101 boundary_manifolds_;
102
103 bool clear_temporal_statistics_on_writeout_;
104
106
110
111 const MPIEnsemble &mpi_ensemble_;
112
113 dealii::SmartPointer<const OfflineData<dim, Number>> offline_data_;
114 dealii::SmartPointer<const HyperbolicSystem> hyperbolic_system_;
115 dealii::SmartPointer<const ParabolicSystem> parabolic_system_;
116
125 using boundary_point =
126 std::tuple<dealii::types::global_dof_index /*local dof index*/,
127 dealii::Tensor<1, dim, Number> /*normal*/,
128 Number /*normal mass*/,
129 Number /*boundary mass*/,
130 dealii::types::boundary_id /*id*/,
131 dealii::Point<dim>> /*position*/;
132
136 std::map<std::string, std::vector<boundary_point>> boundary_maps_;
137
143 using boundary_value =
144 std::tuple<state_type /* primitive state */,
145 state_type /* primitive state second moment */>;
146
150 using boundary_statistic =
151 std::tuple<std::vector<boundary_value> /* values old */,
152 std::vector<boundary_value> /* values new */,
153 std::vector<boundary_value> /* values sum */,
154 Number /* t old */,
155 Number /* t new */,
156 Number /* t sum */>;
157
161 std::map<std::string, boundary_statistic> boundary_statistics_;
162 std::map<std::string, std::vector<std::tuple<Number, boundary_value>>>
163 boundary_time_series_;
164
169 using interior_point =
170 std::tuple<dealii::types::global_dof_index /*local dof index*/,
171 Number /*mass*/,
172 dealii::Point<dim>> /*position*/;
173
177 std::map<std::string, std::vector<interior_point>> interior_maps_;
178
183 using interior_value =
184 std::tuple<state_type /* primitive state */,
185 state_type /* primitive state second moment */>;
186
190 using interior_statistic =
191 std::tuple<std::vector<interior_value> /* values old */,
192 std::vector<interior_value> /* values new */,
193 std::vector<interior_value> /* values sum */,
194 Number /* t old */,
195 Number /* t new */,
196 Number /* t sum */>;
197
201 std::map<std::string, interior_statistic> interior_statistics_;
202 std::map<std::string, std::vector<std::tuple<Number, interior_value>>>
203 interior_time_series_;
204
205 std::string base_name_;
206 bool first_cycle_;
207 std::optional<unsigned int> time_series_cycle_;
208
210
214
215 bool mesh_files_have_been_written_;
216
217 void write_mesh_files(unsigned int cycle);
218
219 void clear_statistics();
220
221 std::string header_;
222
223 template <typename point_type, typename value_type>
224 value_type internal_accumulate(const StateVector &state_vector,
225 const std::vector<point_type> &interior_map,
226 std::vector<value_type> &new_val);
227
228 template <typename value_type>
229 void internal_write_out(const std::string &file_name,
230 const std::string &time_stamp,
231 const std::vector<value_type> &values,
232 const Number scale);
233
234 template <typename value_type>
235 void internal_write_out_time_series(
236 const std::string &file_name,
237 const std::vector<std::tuple<Number, value_type>> &values,
238 bool append);
239
241 };
242
243} /* namespace ryujin */
typename Description::HyperbolicSystem HyperbolicSystem
Definition: quantities.h:38
typename Description::ParabolicSystem ParabolicSystem
Definition: quantities.h:39
void write_out(const StateVector &state_vector, const Number t, unsigned int cycle)
typename View::StateVector StateVector
Definition: quantities.h:46
void accumulate(const StateVector &state_vector, const Number t)
typename View::state_type state_type
Definition: quantities.h:44
typename Description::template HyperbolicSystemView< dim, Number > View
Definition: quantities.h:42
Quantities(const MPIEnsemble &mpi_ensemble, const OfflineData< dim, Number > &offline_data, const HyperbolicSystem &hyperbolic_system, const ParabolicSystem &parabolic_system, const std::string &subsection="/Quantities")
void prepare(const std::string &name)
std::tuple< MultiComponentVector< Number, problem_dim >, MultiComponentVector< Number, prec_dim >, BlockVector< Number > > StateVector
Definition: state_vector.h:51
Euler::HyperbolicSystem HyperbolicSystem
Definition: description.h:32
ryujin::StubParabolicSystem ParabolicSystem
Definition: description.h:37