Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <string>
7 : #include <tuple>
8 : #include <vector>
9 :
10 : #include "DataStructures/DataBox/DataBox.hpp"
11 : #include "IO/Observer/ObserverComponent.hpp"
12 : #include "IO/Observer/ReductionActions.hpp"
13 : #include "Parallel/GlobalCache.hpp"
14 : #include "Parallel/Invoke.hpp"
15 : #include "Utilities/GetOutput.hpp"
16 : #include "Utilities/Numeric.hpp"
17 :
18 : namespace mem_monitor {
19 : /*!
20 : * \brief Simple action meant to be used as a callback for
21 : * Parallel::contribute_to_reduction that writes the size of an Array parallel
22 : * component to disk.
23 : *
24 : * \details The columns in the dat file when running on 3 nodes will be
25 : *
26 : * - %Time
27 : * - Size on node 0 (MB)
28 : * - Size on node 1 (MB)
29 : * - Size on node 2 (MB)
30 : * - Average size per node (MB)
31 : *
32 : * The dat file will be placed in the `/MemoryMonitors/` group in the reduction
33 : * file. The name of the dat file is the `pretty_type::name` of the component.
34 : */
35 : template <typename ArrayComponent>
36 1 : struct ProcessArray {
37 : template <typename ParallelComponent, typename DbTags, typename Metavariables,
38 : typename ArrayIndex>
39 0 : static void apply(db::DataBox<DbTags>& /*box*/,
40 : Parallel::GlobalCache<Metavariables>& cache,
41 : const ArrayIndex& /*array_index*/, const double time,
42 : const std::vector<double>& size_per_node) {
43 : auto& observer_writer_proxy = Parallel::get_parallel_component<
44 : observers::ObserverWriter<Metavariables>>(cache);
45 :
46 : std::vector<std::string> legend{{"Time"}};
47 : for (size_t i = 0; i < size_per_node.size(); i++) {
48 : legend.emplace_back("Size on node " + get_output(i) + " (MB)");
49 : }
50 : legend.emplace_back("Average size per node (MB)");
51 :
52 : const double avg_size = alg::accumulate(size_per_node, 0.0) /
53 : static_cast<double>(size_per_node.size());
54 :
55 : Parallel::threaded_action<
56 : observers::ThreadedActions::WriteReductionDataRow>(
57 : // Node 0 is always the writer
58 : observer_writer_proxy[0], subfile_name<ArrayComponent>(), legend,
59 : std::make_tuple(time, size_per_node, avg_size));
60 : }
61 : };
62 : } // namespace mem_monitor
|