ryujin 2.5.0 revision c64172211cf21344cb9b9b0f3a1266aa6400d392
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 <ryujin/base/compile_time_options.h>
9#include <ryujin/base/gpu.h>
17
18#include <deal.II/base/parameter_acceptor.h>
19
20#include <optional>
21
22namespace ryujin
23{
51 template <int dim, typename Number = double>
52 class Quantities final : public dealii::ParameterAcceptor,
53 public Interface::Task<Number>
54 {
55 public:
60
65 const std::string &subsection = "/Quantities");
66
68
72
78 void prepare(TaskContext<Number> &context) override;
79
84 void execute(TaskContext<Number> &context) override;
85
87
88 private:
93
102 using ManifoldPoint =
104
114 struct Manifold {
115 std::string name;
116 bool boundary;
117 bool instantaneous;
118 bool time_averaged;
119 bool space_averaged;
120
124 std::vector<ManifoldPoint> points;
125
130 Mirrored<unsigned int *> indices{"quantities_indices"};
131 Mirrored<Number *> masses{"quantities_masses"};
132 Number mass_sum;
133
138 Mirrored<Number *> extracted{"quantities_extracted"};
139
144 Mirrored<Number *> old{"quantities_old"};
145 Mirrored<Number *> current{"quantities_current"};
146 Mirrored<Number *> sum{"quantities_sum"};
147 Number t_old;
148 Number t_new;
149 Number t_sum;
150
155 std::vector<std::pair<Number, std::vector<Number>>> time_series;
156 std::optional<unsigned int> time_series_cycle;
157 };
158
160
164
165 std::vector<std::string> quantities_;
166
167 unsigned int n_moments_;
168
169 std::vector<std::tuple<std::string, std::string, std::string>>
170 interior_manifolds_;
171
172 std::vector<std::tuple<std::string, std::string, std::string>>
173 boundary_manifolds_;
174
175 bool clear_temporal_statistics_on_writeout_;
176
178
182
183 Trigger<Number> trigger_;
184
185 const Interface::Simulation<dim, Number> &simulation_;
186 const MPIEnsemble &mpi_ensemble_;
187
188 dealii::ObserverPointer<const OfflineData<dim, Number>> offline_data_;
189
190 const Interface::Postprocessor<dim, Number> &postprocessor_;
191
192 typename Interface::Postprocessor<dim, Number>::Selection selection_;
193
198 std::vector<Manifold> manifolds_;
199
200 std::string base_name_;
201 bool mesh_files_have_been_written_;
202
204
208
214 void accumulate(const StateVector<Number> &state_vector, const Number t);
215
219 void write_out(const StateVector<Number> &state_vector,
220 const Number t,
221 unsigned int cycle);
222
227 unsigned int stride() const;
228
234 std::string header(bool averaged) const;
235
236 void write_mesh_files(unsigned int cycle);
237
238 void clear_statistics();
239
240 void clear_time_averages();
241
247 std::vector<Number>
248 internal_accumulate(Manifold &manifold,
249 const StateVector<Number> &state_vector);
250
256 void internal_write_out(const std::string &file_name,
257 const std::string &time_stamp,
258 const Mirrored<Number *> &values,
259 const Number scale,
260 bool averaged);
261
262 void internal_write_out_time_series(
263 const std::string &file_name,
264 const std::vector<std::pair<Number, std::vector<Number>>> &values,
265 bool append);
266
268 };
269
270} // namespace ryujin
std::tuple< unsigned int, dealii::Tensor< 1, dim, Number >, Number, Number, dealii::types::boundary_id, dealii::Point< dim > > BoundaryDescription
void prepare(TaskContext< Number > &context) override
void execute(TaskContext< Number > &context) override
Quantities(const Interface::Simulation< dim, Number > &simulation, const std::string &subsection="/Quantities")