SpECTRE Documentation Coverage Report
Current view: top level - ParallelAlgorithms/Actions/MemoryMonitor - ProcessArray.hpp Hit Total Coverage
Commit: 47056168667e3fcaf5c2563461756c37676bb94c Lines: 1 3 33.3 %
Date: 2024-04-19 14:00:09
Legend: Lines: hit not hit

          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

Generated by: LCOV version 1.14