Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <cstddef>
7 : #include <pup.h>
8 : #include <pup_stl.h>
9 : #include <string>
10 : #include <tuple>
11 : #include <vector>
12 :
13 : #include "IO/Observer/ObserverComponent.hpp"
14 : #include "IO/Observer/ReductionActions.hpp"
15 : #include "Options/String.hpp"
16 : #include "Parallel/GlobalCache.hpp"
17 : #include "Parallel/Invoke.hpp"
18 : #include "Parallel/Printf/Printf.hpp"
19 : #include "ParallelAlgorithms/EventsAndTriggers/Event.hpp"
20 : #include "Time/Time.hpp"
21 : #include "Utilities/Serialization/CharmPupable.hpp"
22 : #include "Utilities/System/ParallelInfo.hpp"
23 : #include "Utilities/TMPL.hpp"
24 :
25 : /// \cond
26 : namespace Tags {
27 : struct TimeStep;
28 : } // namespace Tags
29 : /// \endcond
30 :
31 : namespace Cce::Events {
32 :
33 : /*!
34 : * \brief %Observe the size of the time steps on the characteristic evolution.
35 : *
36 : * Writes reduction quantities:
37 : * - `%Time`
38 : * - `Time Step`
39 : *
40 : * The subfile will be written into the `/Cce` subgroup.
41 : */
42 1 : class ObserveTimeStep : public Event {
43 : public:
44 : /// The name of the subfile inside the HDF5 file
45 1 : struct SubfileName {
46 0 : using type = std::string;
47 0 : static constexpr Options::String help = {
48 : "The name of the subfile inside the HDF5 file without an extension and "
49 : "without a preceding '/'. The subfile will be written into the "
50 : "subgroup '/Cce'."};
51 : };
52 :
53 0 : struct PrintTimeToTerminal {
54 0 : using type = bool;
55 0 : static constexpr Options::String help = {
56 : "Whether to print the time to screen."};
57 : };
58 :
59 : /// \cond
60 : explicit ObserveTimeStep(CkMigrateMessage* /*unused*/) {}
61 : using PUP::able::register_constructor;
62 : WRAPPED_PUPable_decl_template(ObserveTimeStep); // NOLINT
63 : /// \endcond
64 :
65 0 : using options = tmpl::list<SubfileName, PrintTimeToTerminal>;
66 0 : static constexpr Options::String help =
67 : "Observe the size of the time step for the characteristic evolution.\n"
68 : "\n"
69 : "Writes quantities:\n"
70 : "- Time\n"
71 : "- Time Step\n"
72 : "\n"
73 : "The subfile will be written into the subgroup '/Cce'.";
74 :
75 0 : ObserveTimeStep() = default;
76 0 : explicit ObserveTimeStep(const std::string& subfile_name,
77 : const bool output_time);
78 :
79 0 : using observed_reduction_data_tags = tmpl::list<>;
80 :
81 0 : using compute_tags_for_observation_box = tmpl::list<>;
82 :
83 0 : using return_tags = tmpl::list<>;
84 0 : using argument_tags = tmpl::list<::Tags::TimeStep>;
85 :
86 : template <typename ArrayIndex, typename ParallelComponent,
87 : typename Metavariables>
88 0 : void operator()(const TimeDelta& time_step,
89 : Parallel::GlobalCache<Metavariables>& cache,
90 : const ArrayIndex& /*array_index*/,
91 : const ParallelComponent* const /*meta*/,
92 : const ObservationValue& observation_value) const {
93 : std::vector<double> data_to_write{observation_value.value,
94 : time_step.value()};
95 :
96 : auto& writer = Parallel::get_parallel_component<
97 : observers::ObserverWriter<Metavariables>>(cache);
98 :
99 : Parallel::threaded_action<
100 : observers::ThreadedActions::WriteReductionDataRow>(
101 : writer[0], subfile_path_, legend_,
102 : std::make_tuple(std::move(data_to_write)));
103 :
104 : if (output_time_) {
105 : Parallel::printf(
106 : "Simulation time: %s\n"
107 : " Wall time: %s\n",
108 : std::to_string(observation_value.value), sys::pretty_wall_time());
109 : }
110 : }
111 :
112 0 : using is_ready_argument_tags = tmpl::list<>;
113 :
114 : template <typename Metavariables, typename ArrayIndex, typename Component>
115 0 : bool is_ready(Parallel::GlobalCache<Metavariables>& /*cache*/,
116 : const ArrayIndex& /*array_index*/,
117 : const Component* const /*meta*/) const {
118 : return true;
119 : }
120 :
121 1 : bool needs_evolved_variables() const override { return false; }
122 :
123 : // NOLINTNEXTLINE(google-runtime-references)
124 0 : void pup(PUP::er& p) override {
125 : Event::pup(p);
126 : p | subfile_path_;
127 : p | output_time_;
128 : p | legend_;
129 : }
130 :
131 : private:
132 0 : std::string subfile_path_;
133 0 : bool output_time_;
134 0 : std::vector<std::string> legend_;
135 : };
136 :
137 : ObserveTimeStep::ObserveTimeStep(const std::string& subfile_name,
138 : const bool output_time)
139 : : subfile_path_("/Cce/" + subfile_name),
140 : output_time_(output_time),
141 : legend_(std::vector<std::string>{"Time", "Time Step"}) {}
142 :
143 : /// \cond
144 : PUP::able::PUP_ID ObserveTimeStep::my_PUP_ID = 0; // NOLINT
145 : /// \endcond
146 : } // namespace Cce::Events
|