14 #include "IO/Observer/ArrayComponentId.hpp"
15 #include "IO/Observer/ObserverComponent.hpp"
16 #include "IO/Observer/Tags.hpp"
17 #include "IO/Observer/TypeOfObservation.hpp"
20 #include "Parallel/Invoke.hpp"
23 #include "Utilities/TaggedTuple.hpp"
39 template <
typename ParallelComponent,
typename DbTagsList,
40 typename Metavariables,
typename ArrayIndex>
41 static void apply(db::DataBox<DbTagsList>& box,
46 if constexpr (tmpl::list_contains_v<
48 db::mutate<Tags::ExpectedContributorsForObservations>(
50 [&id_of_caller, &observation_key](
53 volume_observers_registered) noexcept {
54 if (volume_observers_registered->find(observation_key) ==
55 volume_observers_registered->end()) {
56 (*volume_observers_registered)[observation_key] =
57 std::unordered_set<ArrayComponentId>{};
61 volume_observers_registered->at(observation_key)
62 .find(id_of_caller) !=
63 volume_observers_registered->at(observation_key).end())) {
64 ERROR(
"Trying to insert a Observer component more than once: "
68 volume_observers_registered->at(observation_key)
69 .insert(id_of_caller);
73 (void)observation_key;
77 "observers::Tags::ExpectedContributorsForObservations in the "
87 template <
typename ParallelComponent,
typename DbTagsList,
88 typename Metavariables,
typename ArrayIndex>
89 static void apply(db::DataBox<DbTagsList>& box,
93 const size_t caller_node_id) noexcept {
94 if constexpr (tmpl::list_contains_v<
97 Parallel::get_parallel_component<ParallelComponent>(
cache);
100 ASSERT(node_id == 0,
"Only node zero, not node "
102 <<
", should be called from another node");
104 db::mutate<Tags::NodesExpectedToContributeReductions>(
106 [&caller_node_id, &observation_key](
109 reduction_observers_registered_nodes) noexcept {
110 if (reduction_observers_registered_nodes->find(observation_key) ==
111 reduction_observers_registered_nodes->end()) {
112 (*reduction_observers_registered_nodes)[observation_key] =
116 reduction_observers_registered_nodes->at(observation_key)
117 .find(caller_node_id) !=
118 reduction_observers_registered_nodes->at(observation_key)
120 ERROR(
"Already registered node "
121 << caller_node_id <<
" for reduction observations.");
123 reduction_observers_registered_nodes->at(observation_key)
124 .insert(caller_node_id);
128 (void)observation_key;
129 (void)caller_node_id;
132 "observers::Tags::NodesExpectedToContributeReductions "
133 "in the DataBox. This means components are registering for "
134 "reductions before initialization is complete.");
148 template <
typename ParallelComponent,
typename DbTagsList,
149 typename Metavariables,
typename ArrayIndex>
150 static void apply(db::DataBox<DbTagsList>& box,
155 if constexpr (tmpl::list_contains_v<
158 Parallel::get_parallel_component<ParallelComponent>(
cache);
161 db::mutate<Tags::ExpectedContributorsForObservations>(
163 [&
cache, &id_of_caller, &node_id, &observation_key](
166 reduction_observers_registered) noexcept {
167 if (reduction_observers_registered->find(observation_key) ==
168 reduction_observers_registered->end()) {
169 (*reduction_observers_registered)[observation_key] =
170 std::unordered_set<ArrayComponentId>{};
175 observation_key, node_id);
178 if (
LIKELY(reduction_observers_registered->at(observation_key)
179 .find(id_of_caller) ==
180 reduction_observers_registered->at(observation_key)
182 reduction_observers_registered->at(observation_key)
183 .insert(id_of_caller);
185 ERROR(
"Trying to insert a Observer component more than once: "
187 <<
" with observation key: " << observation_key);
193 (void)observation_key;
196 "Could not find tag "
197 "observers::Tags::ExpectedContributorsForObservations in the "
210 template <
typename ParallelComponent,
typename DbTagList,
211 typename Metavariables,
typename ArrayIndex>
212 static void apply(db::DataBox<DbTagList>& box,
214 const ArrayIndex& array_index,
218 if constexpr (tmpl::list_contains_v<
221 bool observation_key_already_registered =
true;
222 db::mutate<observers::Tags::ExpectedContributorsForObservations>(
224 [&component_id, &observation_key,
225 &observation_key_already_registered](
228 array_component_ids) noexcept {
229 observation_key_already_registered =
230 (array_component_ids->find(observation_key) !=
231 array_component_ids->end());
232 if (
UNLIKELY(observation_key_already_registered and
233 array_component_ids->at(observation_key)
234 .find(component_id) !=
235 array_component_ids->at(observation_key).end())) {
237 "Trying to insert a component_id more than once for "
238 "observation. This means an element is registering itself "
239 "with the observers more than once. The component_id is "
240 << component_id <<
" and the observation key is "
243 array_component_ids->operator[](observation_key)
244 .insert(component_id);
247 if (observation_key_already_registered) {
253 auto& observer_writer =
258 switch (type_of_observation) {
259 case TypeOfObservation::Reduction:
262 observer_writer, observation_key,
266 case TypeOfObservation::Volume:
269 observer_writer, observation_key,
275 "Registering an unknown TypeOfObservation. Should be one of "
276 "'Reduction' or 'Volume'");
280 "The DataBox must contain the tag "
281 "observers::Tags::ExpectedContributorsForObservations when the "
283 "RegisterContributorWithObserver is called.");