/home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/discretization/data/output_session.hh Source File#

DiFfRG: /home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/discretization/data/output_session.hh Source File
DiFfRG
Discretization Framework for functional Renormalization Group flows
output_session.hh
Go to the documentation of this file.
1#pragma once
2
13
14#include <map>
15#include <mutex>
16#include <set>
17#include <stdexcept>
18#include <string>
19#include <utility>
20#include <vector>
21
22namespace DiFfRG
23{
24 using namespace dealii;
25
26 namespace internal
27 {
28 template <typename...> inline constexpr bool output_frame_api_removed = false;
29 }
30
31 template <uint dim, typename VectorType> class OutputSession_impl;
32
41 template <uint dim, typename VectorType> class OutputFrame
42 {
43 public:
45 {
46 public:
47 void attach(const DoFHandler<dim> &dof_handler, const VectorType &solution, const std::string &name)
48 {
49 sink->attach(dof_handler, solution, name);
50 }
51 void attach(const DoFHandler<dim> &dof_handler, const VectorType &solution, const std::vector<std::string> &names)
52 {
53 sink->attach(dof_handler, solution, names);
54 }
55
56 private:
57 explicit FieldCollector(FEOutput<dim, VectorType> &sink) : sink(&sink) {}
59 friend class OutputFrame;
60 };
61
63 {
64 public:
65 void value(const std::string &name, double value) { sink->value(name, value); }
66 void set_Lambda(double Lambda) { sink->set_Lambda(Lambda); }
67
68 private:
69 explicit TableRecord(CsvOutput &sink) : sink(&sink) {}
71 friend class OutputFrame;
72 };
73
75 {
76 public:
77 template <typename... Args> void scalar(Args &&...args) { sink->scalar(std::forward<Args>(args)...); }
78 template <typename... Args> void map(Args &&...args) { sink->map(std::forward<Args>(args)...); }
79
80 private:
81 explicit Hdf5Record(HDF5Output &sink) : sink(&sink) {}
83 friend class OutputFrame;
84 };
85
86 OutputFrame(const OutputFrame &) = delete;
87 OutputFrame &operator=(const OutputFrame &) = delete;
90
92 FieldCollector fields() { return FieldCollector(session.fe_out); }
100 FieldCollector fields(const std::string &name) { return FieldCollector(session.field_output(name)); }
101 TableRecord table(const std::string &name) { return TableRecord(session.csv(name)); }
102 Hdf5Record hdf5(const std::string &name) { return Hdf5Record(session.hdf5(name)); }
103 Hdf5Record hdf5() { return Hdf5Record(session.hdf5()); }
104 DiagnosticPort diagnostics() const { return session.diagnostic_port(); }
105
106 template <typename Name>
107 [[deprecated("OutputFrame::csv(name) was removed. Use auto table = output.table(name) instead")]] CsvOutput &
108 csv(Name &&name)
109 {
111 "OutputFrame::csv(name) was removed. Use auto table = output.table(name) instead");
112 return session.csv(std::forward<Name>(name));
113 }
114
115 template <typename Lambda>
116 [[deprecated("OutputFrame::set_Lambda(value) was removed. Call set_Lambda(value) on the TableRecord returned by "
117 "output.table(name) instead")]] void
118 set_Lambda(Lambda &&)
119 {
121 "OutputFrame::set_Lambda(value) was removed. Call set_Lambda(value) on the TableRecord returned "
122 "by output.table(name) instead");
123 }
124
125 template <typename LegacyVectorType = VectorType>
126 [[deprecated("OutputFrame::fe_output() was removed. Use auto fields = output.fields(); fields.attach(...) "
127 "instead")]] FEOutput<dim, VectorType> &
129 {
131 "OutputFrame::fe_output() was removed. Use auto fields = output.fields(); fields.attach(...) "
132 "instead");
133 return session.fe_out;
134 }
135
137 {
138 session.attach_eom_potential(std::move(result));
139 }
140
142 {
143 session.attach_raw_potential(std::move(potential));
144 }
145
146 void dump_table(const std::string &name, const std::vector<std::vector<double>> &values, bool append = false,
147 const std::vector<std::string> &header = {})
148 {
149 session.dump_to_csv(name, values, append, header);
150 }
151
152 const std::string &run_name() const noexcept { return session.output_name; }
153
154 void register_readout(const std::string &id)
155 {
156 if (id.empty()) throw std::invalid_argument("OutputFrame::register_readout: id must not be empty.");
157 if (!readout_ids.insert(id).second)
158 throw std::invalid_argument("OutputFrame::register_readout: duplicate id '" + id + "'.");
159 }
160
161 private:
162 explicit OutputFrame(OutputSession_impl<dim, VectorType> &session) : session(session) {}
164 std::set<std::string> readout_ids;
165 friend class OutputSession_impl<dim, VectorType>;
166 };
167
175 template <uint dim, typename VectorType> class OutputSession_impl
176 {
177 public:
189
191 OutputSession_impl &operator=(const OutputSession_impl &) = delete;
193 OutputSession_impl &operator=(OutputSession_impl &&) = delete;
194
195 template <typename Contributor> void write_frame(const double time, Contributor &&contributor)
196 {
197 std::scoped_lock lock(submission_mutex);
199 if (terminal_error) std::rethrow_exception(terminal_error);
200 if (finished) throw std::logic_error("OutputSession::write_frame: session has already been finished.");
201 if (!active) return;
202
203 try {
205 ScopedTimer total_timer(current_frame.total);
206 {
207 const auto solves_before = internal::potential_solve_stats();
208 ScopedTimer contributor_timer(current_frame.contributor);
209 OutputFrame<dim, VectorType> frame(*this);
210 std::forward<Contributor>(contributor)(frame);
211 contributor_timer.stop();
212 const auto &solves_after = internal::potential_solve_stats();
213 current_frame.potential_solve_count += solves_after.solves - solves_before.solves;
214 current_frame.potential_solves += solves_after.seconds - solves_before.seconds;
215 }
216 flush_frame(time);
217 total_timer.stop();
218 record_frame(time);
219 } catch (...) {
220 terminal_error = std::current_exception();
221 throw;
222 }
223 }
224
227
229 void drain();
230
232 void finish() { finish_impl(/* crashed = */ false); }
233 void set_Lambda(double Lambda);
234 const std::string &run_name() const noexcept { return output_name; }
235 const OutputPath &path() const noexcept { return output_path; }
236 bool is_writer_rank() const noexcept { return active; }
237
238 private:
240 {
241 if (config.contains("/output/folder")) return OutputPath(config);
242 const auto name = config.get_string("/output/name", "output");
244 config.get_string("/output/field_directory", name));
245 }
246
248 FEOutput<dim, VectorType> &field_output(const std::string &name);
249 template <typename FieldVectorType>
250 void configure_field_output(FEOutput<dim, FieldVectorType> &sink, const std::string &group_name);
253 CsvOutput &csv(const std::string &name);
254 HDF5Output &hdf5(const std::string &name);
256 void flush_frame(double time);
258 void record_frame(double time);
259 void dump_to_csv(const std::string &name, const std::vector<std::vector<double>> &values, bool append,
260 const std::vector<std::string> &header);
262
267 void finish_impl(bool crashed);
268
269 const std::string top_folder;
270 const std::string output_name;
271 const std::string output_folder;
272 double Lambda = -1.;
273 bool active = true;
274 bool finished = false;
275 std::exception_ptr deferred_error;
276 std::exception_ptr terminal_error;
277 mutable std::mutex submission_mutex;
278
285 std::optional<ReconstructedRawPotential<dim, typename VectorType::value_type>> pending_raw_potential;
287 std::vector<ReconstructedEoMPotential<dim, typename VectorType::value_type>> pending_eom_potentials;
289 std::map<std::string, FEOutput<dim, VectorType>> named_fe_outs;
290 std::set<std::string> pending_named_fe_outs;
291 std::map<std::string, CsvOutput> csv_files;
292
294 const std::string filename_h5;
295 std::map<std::string, HDF5Output> h5_files;
297
301
302 friend class OutputFrame<dim, VectorType>;
303 };
304
305 // ##############################################################################
306 // Application-facing spelling
307 // ##############################################################################
308 //
309 // The class above takes the linear algebra spelled out because it is compiled out of line: the
310 // set of valid arguments is closed by the explicit instantiations in src/. Applications name
311 // the assembler instead and let this alias project it onto that fixed parameter list. That
312 // projection is also what keeps the session in step with the timestepper, which holds an
313 // OutputSession_impl<dim, VectorType> * taken from the very same assembler.
314 //
315 // The argument is anything exposing dim and VectorType -- an Assembler, or a Discretization
316 // where the assembler type is not a single type (e.g. a test running one discretization
317 // against several models).
318 template <typename AssemblerOrDiscretization>
321} // namespace DiFfRG
A hierarchical configuration tree, readable from JSON and TOML files.
Definition config_tree.hh:32
A class to output data to a CSV file.
Definition csv_output.hh:21
Definition diagnostic_port.hh:21
A class to output finite element data to disk as .vtu files and .pvd time series.
Definition fe_output.hh:37
Writes staged HDF5 frames on a single background thread.
Definition hdf5_writer.hh:31
A class to output data to a CSV file.
Definition hdf5_output.hh:42
Definition output_session.hh:45
FEOutput< dim, VectorType > * sink
Definition output_session.hh:58
void attach(const DoFHandler< dim > &dof_handler, const VectorType &solution, const std::string &name)
Definition output_session.hh:47
friend class OutputFrame
Definition output_session.hh:59
FieldCollector(FEOutput< dim, VectorType > &sink)
Definition output_session.hh:57
void attach(const DoFHandler< dim > &dof_handler, const VectorType &solution, const std::vector< std::string > &names)
Definition output_session.hh:51
Definition output_session.hh:75
void scalar(Args &&...args)
Definition output_session.hh:77
Hdf5Record(HDF5Output &sink)
Definition output_session.hh:81
void map(Args &&...args)
Definition output_session.hh:78
HDF5Output * sink
Definition output_session.hh:82
Definition output_session.hh:63
friend class OutputFrame
Definition output_session.hh:71
void value(const std::string &name, double value)
Definition output_session.hh:65
TableRecord(CsvOutput &sink)
Definition output_session.hh:69
void set_Lambda(double Lambda)
Definition output_session.hh:66
CsvOutput * sink
Definition output_session.hh:70
Definition output_session.hh:42
OutputFrame(const OutputFrame &)=delete
const std::string & run_name() const noexcept
Definition output_session.hh:152
OutputFrame & operator=(const OutputFrame &)=delete
void attach_raw_potential(ReconstructedRawPotential< dim, typename VectorType::value_type > potential)
Definition output_session.hh:141
Hdf5Record hdf5(const std::string &name)
Definition output_session.hh:102
FieldCollector fields()
Definition output_session.hh:92
OutputFrame(OutputFrame &&)=delete
FEOutput< dim, VectorType > & fe_output()
Definition output_session.hh:128
void register_readout(const std::string &id)
Definition output_session.hh:154
OutputFrame & operator=(OutputFrame &&)=delete
CsvOutput & csv(Name &&name)
Definition output_session.hh:108
TableRecord table(const std::string &name)
Definition output_session.hh:101
void dump_table(const std::string &name, const std::vector< std::vector< double > > &values, bool append=false, const std::vector< std::string > &header={})
Definition output_session.hh:146
void attach_eom_potential(EoMResult< dim, typename VectorType::value_type > result)
Definition output_session.hh:136
OutputFrame(OutputSession_impl< dim, VectorType > &session)
Definition output_session.hh:162
Hdf5Record hdf5()
Definition output_session.hh:103
void set_Lambda(Lambda &&)
Definition output_session.hh:118
OutputSession_impl< dim, VectorType > & session
Definition output_session.hh:163
DiagnosticPort diagnostics() const
Definition output_session.hh:104
FieldCollector fields(const std::string &name)
Definition output_session.hh:100
Definition output_path.hh:16
static OutputPath temporary(TemporaryRetention retention=TemporaryRetention::remove_on_destruction, std::string run_name="output", std::filesystem::path field_directory="output")
Definition output_session.hh:176
HDF5Output & hdf5(const std::string &name)
void set_Lambda(double Lambda)
HDF5FrameWriter hdf5_writer
Definition output_session.hh:283
void record_frame(double time)
OutputSession_impl()
Definition output_session.hh:178
std::map< std::string, FEOutput< dim, VectorType > > named_fe_outs
Definition output_session.hh:289
const std::string & run_name() const noexcept
Definition output_session.hh:234
std::mutex submission_mutex
Definition output_session.hh:277
OutputSession_impl(OutputPath path, const ConfigTree &config)
Definition output_session.hh:184
void write_frame(const double time, Contributor &&contributor)
Definition output_session.hh:195
void flush_frame(double time)
OutputPath output_path
Definition output_session.hh:263
bool is_writer_rank() const noexcept
Definition output_session.hh:236
void configure_field_output(FEOutput< dim, FieldVectorType > &sink, const std::string &group_name)
ReportPort report_port() const
Definition output_session.hh:226
Config::OutputSettings settings
Definition output_session.hh:264
FEOutput< dim, VectorType > & fe_output()
Definition output_session.hh:247
FEOutput< dim, dealii::Vector< typename VectorType::value_type > > potential_fe_out
Definition output_session.hh:286
void dump_to_csv(const std::string &name, const std::vector< std::vector< double > > &values, bool append, const std::vector< std::string > &header)
std::set< std::string > pending_named_fe_outs
Definition output_session.hh:290
CsvOutput & csv(const std::string &name)
std::vector< ReconstructedEoMPotential< dim, typename VectorType::value_type > > pending_eom_potentials
Definition output_session.hh:287
FrameTimings current_frame
Definition output_session.hh:299
FEOutput< dim, VectorType > & field_output(const std::string &name)
void attach_raw_potential(ReconstructedRawPotential< dim, typename VectorType::value_type > potential)
std::optional< ReconstructedRawPotential< dim, typename VectorType::value_type > > pending_raw_potential
Definition output_session.hh:285
void finish_impl(bool crashed)
void finish()
Definition output_session.hh:232
bool use_hdf5
Definition output_session.hh:293
bool active
Definition output_session.hh:273
std::exception_ptr terminal_error
Definition output_session.hh:276
std::exception_ptr deferred_error
Definition output_session.hh:275
std::map< std::string, CsvOutput > csv_files
Definition output_session.hh:291
bool finished
Definition output_session.hh:274
const std::string top_folder
Definition output_session.hh:269
const std::string output_name
Definition output_session.hh:270
double Lambda
Definition output_session.hh:272
OutputSession_impl(OutputPath path, Config::OutputSettings settings={})
void attach_eom_potential(EoMResult< dim, typename VectorType::value_type > result)
DiagnosticPort diagnostic_port() const
Definition output_session.hh:225
FEOutput< dim, VectorType > fe_out
Definition output_session.hh:284
OutputTimings timings
Definition output_session.hh:300
FEOutput< dim, dealii::Vector< typename VectorType::value_type > > eom_potential_fe_out
Definition output_session.hh:288
RunReporter run_reporter
Definition output_session.hh:279
DiagnosticPort diagnostics_port
Definition output_session.hh:296
OutputSession_impl(const ConfigTree &config)
Definition output_session.hh:179
static OutputPath path_from(const ConfigTree &config)
Definition output_session.hh:239
const std::string output_folder
Definition output_session.hh:271
std::map< std::string, HDF5Output > h5_files
Definition output_session.hh:295
const OutputPath & path() const noexcept
Definition output_session.hh:235
const std::string filename_h5
Definition output_session.hh:294
Running statistics over all frames of one run.
Definition output_timings.hh:62
Definition run_reporter.hh:96
Definition run_reporter.hh:156
ReportPort port() const
Adds the wall time of its scope to a double, in seconds.
Definition output_timings.hh:97
void stop()
Definition output_timings.hh:108
constexpr bool output_frame_api_removed
Definition output_session.hh:28
PotentialSolveStats & potential_solve_stats()
Definition eom.hh:70
Definition complex_math.hh:10
@ config
/discretization/threads.
Definition output_settings.hh:15
Result of finding an EoM point, optionally including its reconstructed potential.
Definition eom.hh:163
Wall-clock cost of producing one output frame, split by where the time went.
Definition output_timings.hh:33
double total
the whole frame, from write_frame entry to flush_frame exit
Definition output_timings.hh:51
std::size_t potential_solve_count
Definition output_timings.hh:53
double contributor
the whole user contributor callback (attach + readouts)
Definition output_timings.hh:34
double potential_solves
of which: internal::solve_potential
Definition output_timings.hh:35