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 <memory>
8 : #include <string>
9 : #include <unordered_map>
10 : #include <vector>
11 :
12 : #include "IO/H5/TensorData.hpp"
13 : #include "Options/String.hpp"
14 : #include "ParallelAlgorithms/Events/ObserveConstantsPerElement.hpp"
15 : #include "ParallelAlgorithms/EventsAndTriggers/Event.hpp"
16 : #include "Utilities/Serialization/CharmPupable.hpp"
17 : #include "Utilities/TMPL.hpp"
18 : #include "Utilities/TypeTraits/IsA.hpp"
19 :
20 : /// \cond
21 : enum class FloatingPointType;
22 : template <size_t VolumeDim>
23 : class Domain;
24 : template <size_t VolumeDim>
25 : class ElementId;
26 : class TimeDelta;
27 : namespace domain {
28 : namespace FunctionsOfTime {
29 : class FunctionOfTime;
30 : } // namespace FunctionsOfTime
31 : namespace Tags {
32 : template <size_t VolumeDim>
33 : struct Domain;
34 : struct FunctionsOfTime;
35 : template <size_t VolumeDim, typename Frame>
36 : struct MinimumGridSpacing;
37 : } // namespace Tags
38 : } // namespace domain
39 : namespace Frame {
40 : struct Inertial;
41 : } // namespace Frame
42 : namespace Parallel {
43 : template <typename Metavariables>
44 : class GlobalCache;
45 : } // namespace Parallel
46 : namespace Tags {
47 : template <typename Tag>
48 : struct HistoryEvolvedVariables;
49 : struct Time;
50 : struct TimeStep;
51 : } // namespace Tags
52 : namespace TimeSteppers {
53 : template <typename Vars>
54 : class History;
55 : } // namespace TimeSteppers
56 : /// \endcond
57 :
58 : namespace dg::Events {
59 : /*!
60 : * \brief %Observe the time step in the volume.
61 : *
62 : * Observe the time step size in each element. Each element is output
63 : * as a single cell with two points per dimension and the observation
64 : * constant on all those points.
65 : *
66 : * Writes volume quantities:
67 : * - InertialCoordinates (only element corners)
68 : * - Time step
69 : * - Slab fraction
70 : * - Minimum grid spacing
71 : * - Integration order
72 : */
73 : template <typename System>
74 1 : class ObserveTimeStepVolume
75 : : public ObserveConstantsPerElement<System::volume_dim> {
76 : public:
77 0 : static constexpr size_t volume_dim = System::volume_dim;
78 : // The variables are only used to get the integration order, which
79 : // should be the same for all of them in a split-variables system.
80 0 : using variables_tag = tmpl::conditional_t<
81 : tt::is_a_v<tmpl::list, typename System::variables_tag>,
82 : tmpl::front<typename System::variables_tag>,
83 : typename System::variables_tag>;
84 :
85 : /// \cond
86 : explicit ObserveTimeStepVolume(CkMigrateMessage* m);
87 : using PUP::able::register_constructor;
88 : WRAPPED_PUPable_decl_template(ObserveTimeStepVolume); // NOLINT
89 : /// \endcond
90 :
91 0 : static constexpr Options::String help =
92 : "Observe the time step and integration order in the volume.";
93 :
94 0 : ObserveTimeStepVolume();
95 :
96 0 : ObserveTimeStepVolume(const std::string& subfile_name,
97 : ::FloatingPointType coordinates_floating_point_type,
98 : ::FloatingPointType floating_point_type);
99 :
100 0 : using compute_tags_for_observation_box = tmpl::list<>;
101 :
102 0 : using return_tags = tmpl::list<>;
103 0 : using argument_tags =
104 : tmpl::list<::Tags::Time, ::domain::Tags::FunctionsOfTime,
105 : ::domain::Tags::Domain<volume_dim>, ::Tags::TimeStep,
106 : domain::Tags::MinimumGridSpacing<volume_dim, Frame::Inertial>,
107 : ::Tags::HistoryEvolvedVariables<variables_tag>>;
108 :
109 : template <typename Metavariables, typename ParallelComponent>
110 0 : void operator()(
111 : const double time,
112 : const std::unordered_map<
113 : std::string,
114 : std::unique_ptr<domain::FunctionsOfTime::FunctionOfTime>>&
115 : functions_of_time,
116 : const Domain<volume_dim>& domain, const TimeDelta& time_step,
117 : const double minimum_grid_spacing,
118 : const TimeSteppers::History<typename variables_tag::type>& history,
119 : Parallel::GlobalCache<Metavariables>& cache,
120 : const ElementId<volume_dim>& element_id,
121 : const ParallelComponent* const component,
122 : const Event::ObservationValue& observation_value) const {
123 : std::vector<TensorComponent> components =
124 : assemble_data(time, functions_of_time, domain, element_id, time_step,
125 : minimum_grid_spacing, history);
126 :
127 : this->observe(components, cache, element_id, component, observation_value);
128 : }
129 :
130 1 : bool needs_evolved_variables() const override;
131 :
132 : private:
133 0 : std::vector<TensorComponent> assemble_data(
134 : double time,
135 : const std::unordered_map<
136 : std::string,
137 : std::unique_ptr<domain::FunctionsOfTime::FunctionOfTime>>&
138 : functions_of_time,
139 : const Domain<volume_dim>& domain, const ElementId<volume_dim>& element_id,
140 : const TimeDelta& time_step, double minimum_grid_spacing,
141 : const TimeSteppers::History<typename variables_tag::type>& history) const;
142 : };
143 : } // namespace dg::Events
|