Observe.hpp
1 // Distributed under the MIT License.
2 // See LICENSE.txt for details.
3 
4 #pragma once
5 
6 #include <cstddef>
7 #include <string>
8 #include <utility>
9 #include <vector>
10 
11 #include "IO/Observer/ObservationId.hpp"
12 #include "IO/Observer/ObserverComponent.hpp"
13 #include "IO/Observer/ReductionActions.hpp"
14 #include "IO/Observer/TypeOfObservation.hpp"
15 #include "Parallel/GlobalCache.hpp"
16 #include "Parallel/Invoke.hpp"
17 #include "Parallel/Reduction.hpp"
19 #include "Utilities/Functional.hpp"
20 #include "Utilities/PrettyType.hpp"
22 
23 namespace LinearSolver {
24 namespace observe_detail {
25 
26 using reduction_data = Parallel::ReductionData<
27  // Iteration
29  // Residual
31 
32 template <typename OptionsGroup>
33 struct Registration {
34  template <typename ParallelComponent, typename DbTagsList,
35  typename ArrayIndex>
37  register_info(const db::DataBox<DbTagsList>& /*box*/,
38  const ArrayIndex& /*array_index*/) noexcept {
40  observers::ObservationKey{pretty_type::get_name<OptionsGroup>()}};
41  }
42 };
43 
44 /*!
45  * \brief Contributes data from the residual monitor to the reduction observer
46  */
47 template <typename OptionsGroup, typename Metavariables>
48 void contribute_to_reduction_observer(
49  const size_t iteration_id, const double residual_magnitude,
50  Parallel::GlobalCache<Metavariables>& cache) noexcept {
51  const auto observation_id = observers::ObservationId(
52  iteration_id, pretty_type::get_name<OptionsGroup>());
53  auto& reduction_writer = Parallel::get_parallel_component<
55  Parallel::threaded_action<observers::ThreadedActions::WriteReductionData>(
56  // Node 0 is always the writer, so directly call the component on that
57  // node
58  reduction_writer[0], observation_id, static_cast<size_t>(sys::my_node()),
59  // When multiple linear solves are performed, e.g. for the nonlinear
60  // solver, we'll need to write into separate subgroups, e.g.:
61  // `/linear_residuals/<nonlinear_iteration_id>`
62  std::string{"/" + Options::name<OptionsGroup>() + "Residuals"},
63  std::vector<std::string>{"Iteration", "Residual"},
64  reduction_data{iteration_id, residual_magnitude});
65 }
66 
67 } // namespace observe_detail
68 } // namespace LinearSolver
observers::ObservationId
A unique identifier for an observation representing the type of observation and the instance (e....
Definition: ObservationId.hpp:71
std::string
utility
Parallel::GlobalCache
Definition: ElementReceiveInterpPoints.hpp:15
Parallel::ReductionDatum
The data to be reduced, and invokables to be called whenever two reduction messages are combined and ...
Definition: Reduction.hpp:63
std::pair
GlobalCache.hpp
Parallel::get_parallel_component
auto get_parallel_component(GlobalCache< Metavariables > &cache) noexcept -> Parallel::proxy_from_parallel_component< GlobalCache_detail::get_component_if_mocked< typename Metavariables::component_list, ParallelComponentTag >> &
Access the Charm++ proxy associated with a ParallelComponent.
Definition: GlobalCache.hpp:521
vector
PrettyType.hpp
observers::ObservationKey
Used as a key in maps to keep track of how many elements have registered.
Definition: ObservationId.hpp:28
ParallelInfo.hpp
Tags.hpp
observers::ObserverWriter
The nodegroup parallel component that is responsible for writing data to disk.
Definition: ObserverComponent.hpp:51
cstddef
LinearSolver
Functionality for solving linear systems of equations.
Definition: Gmres.cpp:16
observers::TypeOfObservation::Reduction
@ Reduction
The sender will only perform reduction observations.
Registration
Helpers for derived class registration.
Definition: Registration.hpp:32
string