SpECTRE Documentation Coverage Report
Current view: top level - ParallelAlgorithms/Actions/MemoryMonitor - ProcessGroups.hpp Coverage Total Hit
Commit: 0d1d717af84a81fb1284a20c4013708fe85cc2f0 Lines: 33.3 % 3 1
Test Date: 2026-10-22 17:29:42
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 <type_traits>
       7              : 
       8              : #include "DataStructures/DataBox/DataBox.hpp"
       9              : #include "Parallel/GlobalCache.hpp"
      10              : #include "Parallel/Info.hpp"
      11              : #include "Parallel/Invoke.hpp"
      12              : #include "Parallel/Local.hpp"
      13              : #include "Parallel/MemoryMonitor/MemoryMonitor.hpp"
      14              : #include "Parallel/TypeTraits.hpp"
      15              : #include "Utilities/Serialization/Serialize.hpp"
      16              : 
      17              : namespace mem_monitor {
      18              : /*!
      19              :  * \brief Simple action meant to be run on every branch of a Group or NodeGroup
      20              :  * that computes the size of the local branch and reports that size to the
      21              :  * MemoryMonitor using the ContributeMemoryData simple action.
      22              :  */
      23            1 : struct ProcessGroups {
      24              :   template <typename ParallelComponent, typename DbTags, typename Metavariables,
      25              :             typename ArrayIndex>
      26            0 :   static void apply(db::DataBox<DbTags>& /*box*/,
      27              :                     Parallel::GlobalCache<Metavariables>& cache,
      28              :                     const ArrayIndex& array_index, const double time) {
      29              :     static_assert(Parallel::is_group_v<ParallelComponent> or
      30              :                       Parallel::is_nodegroup_v<ParallelComponent>,
      31              :                   "ProcessGroups can only be run on Group or Nodegroup "
      32              :                   "parallel components.");
      33              :     static_assert(std::is_same_v<ArrayIndex, int>,
      34              :                   "ArrayIndex of Group or Nodegroup parallel components must "
      35              :                   "be an int to use the ProcessGroups action.");
      36              : 
      37              :     auto& singleton_proxy =
      38              :         Parallel::get_parallel_component<MemoryMonitor<Metavariables>>(cache);
      39              : 
      40              :     auto& group_proxy =
      41              :         Parallel::get_parallel_component<ParallelComponent>(cache);
      42              : 
      43              :     const double size_in_bytes = static_cast<double>(
      44              :         size_of_object_in_bytes(*Parallel::local_branch(group_proxy)));
      45              : 
      46              :     const double size_in_MB = size_in_bytes / 1.0e6;
      47              : 
      48              :     // Note that we don't call Parallel::contribute_to_reduction here. This is
      49              :     // because Charm requires that all calls to contribute_to_reduction happen
      50              :     // in the exact same order every time, otherwise it is undefined behavior.
      51              :     // However, this simple action (ProcessGroups) is called on each branch
      52              :     // of a group or nodegroup. Because this is a simple action, the order that
      53              :     // the branches run the simple actions is completely random based on
      54              :     // communication patterns in charm. Thus, calling contribute_to_reduction
      55              :     // here would result in undefined behavior.
      56              :     // Also note that `array_index` here is my_node for nodegroups and my_proc
      57              :     // for groups
      58              :     Parallel::simple_action<ContributeMemoryData<ParallelComponent>>(
      59              :         singleton_proxy, time, array_index, size_in_MB);
      60              :   }
      61              : };
      62              : }  // namespace mem_monitor
        

Generated by: LCOV version 2.0-1