ryujin 2.1.1 revision ee5cbcbf2346c1299c942d0e1f13b46449973c18
Loading...
Searching...
No Matches
quantities.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2020 - 2025 by the ryujin authors
4//
5
6#pragma once
7
8#include <compile_time_options.h>
9
10#include "mpi_ensemble.h"
11#include "observer_pointer.h"
12#include "offline_data.h"
13
14#include <deal.II/base/parameter_acceptor.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 = typename HyperbolicSystem::template View<dim, Number>;
42
43 using state_type = typename View::state_type;
44
45 using StateVector = typename View::StateVector;
46
48
52
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
76
80
86 void accumulate(const StateVector &state_vector, const Number t);
87
91 void write_out(const StateVector &state_vector,
92 const Number t,
93 unsigned int cycle);
94
95 private:
97
101
110 using boundary_point =
111 std::tuple<dealii::types::global_dof_index /*local dof index*/,
112 dealii::Tensor<1, dim, Number> /*normal*/,
113 Number /*normal mass*/,
114 Number /*boundary mass*/,
115 dealii::types::boundary_id /*id*/,
116 dealii::Point<dim>> /*position*/;
117
123 using boundary_value =
124 std::tuple<state_type /* primitive state */,
125 state_type /* primitive state second moment */>;
126
130 using boundary_statistic =
131 std::tuple<std::vector<boundary_value> /* values old */,
132 std::vector<boundary_value> /* values new */,
133 std::vector<boundary_value> /* values sum */,
134 Number /* t old */,
135 Number /* t new */,
136 Number /* t sum */>;
137
142 using interior_point =
143 std::tuple<dealii::types::global_dof_index /*local dof index*/,
144 Number /*mass*/,
145 dealii::Point<dim>> /*position*/;
146
151 using interior_value =
152 std::tuple<state_type /* primitive state */,
153 state_type /* primitive state second moment */>;
154
158 using interior_statistic =
159 std::tuple<std::vector<interior_value> /* values old */,
160 std::vector<interior_value> /* values new */,
161 std::vector<interior_value> /* values sum */,
162 Number /* t old */,
163 Number /* t new */,
164 Number /* t sum */>;
165
167
171
172 std::vector<std::tuple<std::string, std::string, std::string>>
173 interior_manifolds_;
174
175 std::vector<std::tuple<std::string, std::string, std::string>>
176 boundary_manifolds_;
177
178 bool clear_temporal_statistics_on_writeout_;
179
181
185
186 const MPIEnsemble &mpi_ensemble_;
187
188 dealii::ObserverPointer<const OfflineData<dim, Number>> offline_data_;
189 dealii::ObserverPointer<const HyperbolicSystem> hyperbolic_system_;
190 dealii::ObserverPointer<const ParabolicSystem> parabolic_system_;
191
195 std::map<std::string, std::vector<boundary_point>> boundary_maps_;
196
200 std::map<std::string, boundary_statistic> boundary_statistics_;
201 std::map<std::string, std::vector<std::tuple<Number, boundary_value>>>
202 boundary_time_series_;
203
207 std::map<std::string, std::vector<interior_point>> interior_maps_;
208
212 std::map<std::string, interior_statistic> interior_statistics_;
213 std::map<std::string, std::vector<std::tuple<Number, interior_value>>>
214 interior_time_series_;
215
216 std::string base_name_;
217 std::string header_;
218 bool first_cycle_;
219 std::optional<unsigned int> time_series_cycle_;
220 bool mesh_files_have_been_written_;
221
223
227
228 void write_mesh_files(unsigned int cycle);
229
230 void clear_statistics();
231
232 template <typename point_type, typename value_type>
233 value_type internal_accumulate(const StateVector &state_vector,
234 const std::vector<point_type> &interior_map,
235 std::vector<value_type> &new_val);
236
237 template <typename value_type>
238 void internal_write_out(const std::string &file_name,
239 const std::string &time_stamp,
240 const std::vector<value_type> &values,
241 const Number scale);
242
243 template <typename value_type>
244 void internal_write_out_time_series(
245 const std::string &file_name,
246 const std::vector<std::tuple<Number, value_type>> &values,
247 bool append);
248
250 };
251
252} /* 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:45
void accumulate(const StateVector &state_vector, const Number t)
typename View::state_type state_type
Definition quantities.h:43
typename HyperbolicSystem::template View< dim, Number > View
Definition quantities.h:41
void prepare(const std::string &name)
Euler::HyperbolicSystem HyperbolicSystem
Definition description.h:34
ryujin::StubParabolicSystem ParabolicSystem
Definition description.h:36