ryujin 2.1.1 revision e1e0c9cf84519540dcc04ed5bb49dc8a8c052779
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 - 2026 by the ryujin authors
4//
5
6#pragma once
7
8#include <compile_time_options.h>
9
10#include <ryujin/interface/parabolic_system.h>
11
12#include "gpu.h"
13#include "mpi_ensemble.h"
14#include "observer_pointer.h"
15#include "offline_data.h"
17
18#include <deal.II/base/parameter_acceptor.h>
19
20#include <optional>
21
22namespace ryujin
23{
48 template <typename HyperbolicDescription, int dim, typename Number = double>
49 class Quantities final : public dealii::ParameterAcceptor
50 {
51 public:
56
58
59 using View = typename HyperbolicSystem::template View<dim, Number>;
60
62
66
70 Quantities(const MPIEnsemble &mpi_ensemble,
71 const OfflineData<dim, Number> &offline_data,
72 const HyperbolicSystem &hyperbolic_system,
73 const Interface::ParabolicSystem &parabolic_system,
74 const MultiComponentVector<Number> &initial_precomputed,
75 const std::string &subsection = "/Quantities");
76
88 void prepare(const std::string &name);
89
91
95
101 void accumulate(const StateVector<Number> &state_vector, const Number t);
102
106 void write_out(const StateVector<Number> &state_vector,
107 const Number t,
108 unsigned int cycle);
109
110 private:
112
116
125 using ManifoldPoint =
127
137 struct Manifold {
138 std::string name;
139 bool boundary;
140 bool instantaneous;
141 bool time_averaged;
142 bool space_averaged;
143
147 std::vector<ManifoldPoint> points;
148
153 Mirrored<unsigned int *> indices{"quantities_indices"};
154 Mirrored<Number *> masses{"quantities_masses"};
155 Number mass_sum;
156
161 Mirrored<Number *> old{"quantities_old"};
162 Mirrored<Number *> current{"quantities_current"};
163 Mirrored<Number *> sum{"quantities_sum"};
164 Number t_old;
165 Number t_new;
166 Number t_sum;
167
172 std::vector<std::pair<Number, std::vector<Number>>> time_series;
173 std::optional<unsigned int> time_series_cycle;
174 };
175
177
181
182 std::vector<std::string> quantities_;
183
184 unsigned int n_moments_;
185
186 std::vector<std::tuple<std::string, std::string, std::string>>
187 interior_manifolds_;
188
189 std::vector<std::tuple<std::string, std::string, std::string>>
190 boundary_manifolds_;
191
192 bool clear_temporal_statistics_on_writeout_;
193
195
199
200 const MPIEnsemble &mpi_ensemble_;
201
202 dealii::ObserverPointer<const OfflineData<dim, Number>> offline_data_;
203
204 SelectedComponentsExtractor<HyperbolicDescription, dim, Number> extractor_;
205
210 std::vector<Manifold> manifolds_;
211
212 std::string base_name_;
213 bool mesh_files_have_been_written_;
214
216
220
225 unsigned int stride() const;
226
232 std::string header(bool averaged) const;
233
234 void write_mesh_files(unsigned int cycle);
235
236 void clear_statistics();
237
244 std::vector<Number> internal_accumulate(Manifold &manifold);
245
251 void internal_write_out(const std::string &file_name,
252 const std::string &time_stamp,
253 const Mirrored<Number *> &values,
254 const Number scale,
255 bool averaged);
256
257 void internal_write_out_time_series(
258 const std::string &file_name,
259 const std::vector<std::pair<Number, std::vector<Number>>> &values,
260 bool append);
261
263 };
264
265} /* namespace ryujin */
std::tuple< unsigned int, dealii::Tensor< 1, dim, Number >, Number, Number, dealii::types::boundary_id, dealii::Point< dim > > BoundaryDescription
void accumulate(const StateVector< Number > &state_vector, const Number t)
typename HyperbolicDescription::HyperbolicSystem HyperbolicSystem
Definition quantities.h:57
void write_out(const StateVector< Number > &state_vector, const Number t, unsigned int cycle)
typename HyperbolicSystem::template View< dim, Number > View
Definition quantities.h:59
void prepare(const std::string &name)