SpECTRE Documentation Coverage Report
Current view: top level - Parallel - GetSection.hpp Hit Total Coverage
Commit: 9b01d30df5d2e946e7e38cc43c008be18ae9b1d2 Lines: 1 2 50.0 %
Date: 2024-04-23 04:54:49
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 <optional>
       7             : #include <type_traits>
       8             : 
       9             : #include "DataStructures/DataBox/DataBox.hpp"
      10             : #include "Parallel/Reduction.hpp"
      11             : #include "Parallel/Tags/Section.hpp"
      12             : #include "Utilities/ErrorHandling/Assert.hpp"
      13             : #include "Utilities/Gsl.hpp"
      14             : 
      15             : namespace Parallel {
      16             : 
      17             : /*!
      18             :  * \brief Retrieve the section that the element belongs to, or
      19             :  * `Parallel::no_section()` if `SectionIdTag` is `void`.
      20             :  *
      21             :  * This function is useful to support sections in parallel algorithms. Specify
      22             :  * the `SectionIdTag` template parameter to retrieve the associated section, or
      23             :  * set it to `void` when the parallel algorithm runs over all elements of the
      24             :  * parallel component. See `Parallel::Section` for details on sections.
      25             :  *
      26             :  * Only call this function on elements that are part of a section. In case not
      27             :  * all elements are part of a section with the `SectionIdTag`, make sure to skip
      28             :  * those elements before calling this function.
      29             :  */
      30             : template <typename ParallelComponent, typename SectionIdTag,
      31             :           typename DbTagsList>
      32           1 : auto& get_section(
      33             :     [[maybe_unused]] const gsl::not_null<db::DataBox<DbTagsList>*> box) {
      34             :   if constexpr (std::is_same_v<SectionIdTag, void>) {
      35             :     return Parallel::no_section();
      36             :   } else {
      37             :     std::optional<Parallel::Section<ParallelComponent, SectionIdTag>>& section =
      38             :         db::get_mutable_reference<
      39             :             Parallel::Tags::Section<ParallelComponent, SectionIdTag>>(box);
      40             :     ASSERT(section.has_value(),
      41             :            "Call 'get_section' only on elements that belong to a section. This "
      42             :            "is probably a bug, because the other elements should presumably be "
      43             :            "skipped. The section is: "
      44             :                << db::tag_name<SectionIdTag>());
      45             :     return *section;
      46             :   }
      47             : }
      48             : 
      49             : }  // namespace Parallel

Generated by: LCOV version 1.14