SpECTRE Documentation Coverage Report
Current view: top level - ParallelAlgorithms/Actions/MemoryMonitor - ProcessSingleton.hpp Hit Total Coverage
Commit: aabde07399ba7837e5db64eedfd0a21f31f96922 Lines: 1 3 33.3 %
Date: 2024-04-26 02:38:13
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/Info.hpp"
      15             : #include "Parallel/Invoke.hpp"
      16             : #include "Parallel/Local.hpp"
      17             : #include "Utilities/Serialization/Serialize.hpp"
      18             : 
      19             : namespace mem_monitor {
      20             : /*!
      21             :  * \brief Simple action meant to be run on a Singleton that writes the size of
      22             :  * the Singleton component to disk.
      23             :  *
      24             :  * \details The columns in the dat file are
      25             :  *
      26             :  * - %Time
      27             :  * - Proc
      28             :  * - Size (MB)
      29             :  *
      30             :  * The dat file will be placed in the `/MemoryMonitors/` group in the reduction
      31             :  * file. The name of the dat file is the `pretty_type::name` of the component.
      32             :  */
      33           1 : struct ProcessSingleton {
      34             :   template <typename ParallelComponent, typename DbTags, typename Metavariables,
      35             :             typename ArrayIndex>
      36           0 :   static void apply(db::DataBox<DbTags>& /*box*/,
      37             :                     Parallel::GlobalCache<Metavariables>& cache,
      38             :                     const ArrayIndex& /*array_index*/, const double time) {
      39             :     static_assert(
      40             :         Parallel::is_singleton_v<ParallelComponent>,
      41             :         "ProcessSingleton can only be run on a Singleton parallel component.");
      42             :     auto& singleton_proxy =
      43             :         Parallel::get_parallel_component<ParallelComponent>(cache);
      44             :     const double size_in_bytes = static_cast<double>(
      45             :         size_of_object_in_bytes(*Parallel::local(singleton_proxy)));
      46             :     const double size_in_MB = size_in_bytes / 1.0e6;
      47             : 
      48             :     const std::vector<std::string> legend{{"Time", "Proc", "Size (MB)"}};
      49             : 
      50             :     auto& observer_writer_proxy = Parallel::get_parallel_component<
      51             :         observers::ObserverWriter<Metavariables>>(cache);
      52             : 
      53             :     Parallel::threaded_action<
      54             :         observers::ThreadedActions::WriteReductionDataRow>(
      55             :         // Node 0 is always the writer
      56             :         observer_writer_proxy[0], subfile_name<ParallelComponent>(), legend,
      57             :         std::make_tuple(
      58             :             time, Parallel::my_proc<size_t>(*Parallel::local(singleton_proxy)),
      59             :             size_in_MB));
      60             :   }
      61             : };
      62             : }  // namespace mem_monitor

Generated by: LCOV version 1.14