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 <unordered_map>
9 :
10 : #include "ControlSystem/Averager.hpp"
11 : #include "ControlSystem/Tags/IsActiveMap.hpp"
12 : #include "ControlSystem/Tags/MeasurementTimescales.hpp"
13 : #include "ControlSystem/Tags/SystemTags.hpp"
14 : #include "ControlSystem/UpdateFunctionOfTime.hpp"
15 : #include "Domain/Creators/Tags/ObjectCenter.hpp"
16 : #include "Domain/FunctionsOfTime/FunctionOfTime.hpp"
17 : #include "Domain/Structure/ObjectLabel.hpp"
18 : #include "Parallel/GlobalCache.hpp"
19 : #include "PointwiseFunctions/GeneralRelativity/Surfaces/Tags.hpp"
20 : #include "Utilities/Gsl.hpp"
21 : #include "Utilities/TMPL.hpp"
22 :
23 : namespace control_system {
24 : namespace Actions {
25 : namespace detail {
26 : template <typename Objects>
27 : struct get_center_tags;
28 :
29 : template <domain::ObjectLabel... Object>
30 : struct get_center_tags<domain::object_list<Object...>> {
31 : using type = tmpl::list<domain::Tags::ObjectCenter<Object>...>;
32 : };
33 :
34 : template <>
35 : struct get_center_tags<domain::object_list<>> {
36 : using type = tmpl::list<>;
37 : };
38 : } // namespace detail
39 :
40 : /*!
41 : * \ingroup ControlSystemGroup
42 : * \ingroup InitializationGroup
43 : * \brief Initialize items related to the control system
44 : *
45 : * GlobalCache:
46 : * - Uses:
47 : * - `control_system::Tags::MeasurementTimescales`
48 : * - `control_system::Tags::WriteDataToDisk`
49 : * - `control_system::Tags::ObserveCenters`
50 : * - `control_system::Tags::Verbosity`
51 : * - `control_system::Tags::IsActiveMap`
52 : * - `control_system::Tags::SystemToCombinedNames`
53 : * - `domain::Tags::ObjectCenter<domain::ObjectLabel::A>`
54 : * - `domain::Tags::ObjectCenter<domain::ObjectLabel::B>`
55 : *
56 : * DataBox:
57 : * - Uses: Nothing
58 : * - Adds:
59 : * - `control_system::Tags::Averager<ControlSystem>`
60 : * - `control_system::Tags::Controller<ControlSystem>`
61 : * - `control_system::Tags::TimescaleTuner<ControlSystem>`
62 : * - `control_system::Tags::ControlError<ControlSystem>`
63 : * - `control_system::Tags::CurrentNumberOfMeasurements`
64 : * - `control_system::Tags::UpdateAggregators`
65 : * - Removes: Nothing
66 : * - Modifies:
67 : * - `control_system::Tags::Averager<ControlSystem>`
68 : * - `control_system::Tags::CurrentNumberOfMeasurements`
69 : * - `control_system::Tags::UpdateAggregators`
70 : */
71 : template <typename Metavariables, typename ControlSystem>
72 1 : struct Initialize {
73 0 : static constexpr size_t deriv_order = ControlSystem::deriv_order;
74 :
75 0 : using simple_tags_from_options =
76 : tmpl::list<control_system::Tags::Averager<ControlSystem>,
77 : control_system::Tags::Controller<ControlSystem>,
78 : control_system::Tags::TimescaleTuner<ControlSystem>,
79 : control_system::Tags::ControlError<ControlSystem>>;
80 :
81 0 : using simple_tags =
82 : tmpl::push_back<typename ControlSystem::simple_tags,
83 : control_system::Tags::UpdateAggregators,
84 : control_system::Tags::CurrentNumberOfMeasurements>;
85 :
86 0 : using const_global_cache_tags = tmpl::flatten<tmpl::list<
87 : control_system::Tags::SystemToCombinedNames,
88 : control_system::Tags::MeasurementsPerUpdate,
89 : control_system::Tags::WriteDataToDisk,
90 : control_system::Tags::ObserveCenters, control_system::Tags::Verbosity,
91 : typename detail::get_center_tags<
92 : typename ControlSystem::control_error::object_centers>::type>>;
93 :
94 0 : using mutable_global_cache_tags =
95 : tmpl::list<control_system::Tags::MeasurementTimescales,
96 : control_system::Tags::IsActiveMap>;
97 :
98 0 : using compute_tags = tmpl::list<>;
99 :
100 0 : using return_tags =
101 : tmpl::list<control_system::Tags::Averager<ControlSystem>,
102 : control_system::Tags::CurrentNumberOfMeasurements,
103 : control_system::Tags::UpdateAggregators>;
104 :
105 0 : using argument_tags = tmpl::list<Parallel::Tags::GlobalCache<Metavariables>>;
106 :
107 0 : static void apply(
108 : const gsl::not_null<::Averager<deriv_order - 1>*> averager,
109 : const gsl::not_null<int*> current_number_of_measurements,
110 : const gsl::not_null<
111 : std::unordered_map<std::string, control_system::UpdateAggregator>*>
112 : update_aggregators,
113 : const Parallel::GlobalCache<Metavariables>* const& cache) {
114 : const auto& measurement_timescales =
115 : Parallel::get<control_system::Tags::MeasurementTimescales>(*cache);
116 : const std::unordered_map<std::string, std::string>&
117 : system_to_combined_names =
118 : Parallel::get<control_system::Tags::SystemToCombinedNames>(*cache);
119 : const auto& measurement_timescale_func = *(measurement_timescales.at(
120 : system_to_combined_names.at(ControlSystem::name())));
121 : const double initial_time = measurement_timescale_func.time_bounds()[0];
122 : const double measurement_timescale =
123 : min(measurement_timescale_func.func(initial_time)[0]);
124 :
125 : averager->assign_time_between_measurements(measurement_timescale);
126 : *current_number_of_measurements = 0;
127 :
128 : const std::unordered_map<std::string, bool>& is_active_map =
129 : Parallel::get<control_system::Tags::IsActiveMap>(*cache);
130 :
131 : std::unordered_map<std::string, std::unordered_set<std::string>>
132 : combined_to_system_names{};
133 : for (const auto& [control_system_name, combined_name] :
134 : system_to_combined_names) {
135 : if (combined_to_system_names.count(combined_name) != 1) {
136 : combined_to_system_names[combined_name];
137 : }
138 :
139 : // Only add active control systems
140 : if (is_active_map.at(control_system_name)) {
141 : combined_to_system_names.at(combined_name).insert(control_system_name);
142 : }
143 : }
144 :
145 : for (auto& [combined_name, control_system_names] :
146 : combined_to_system_names) {
147 : (*update_aggregators)[combined_name] = control_system::UpdateAggregator{
148 : combined_name, std::move(control_system_names)};
149 : }
150 : }
151 : };
152 : } // namespace Actions
153 : } // namespace control_system
|