SpECTRE Documentation Coverage Report
Current view: top level - Evolution/Imex/Actions - RecordTimeStepperData.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 <cstddef>
       7              : #include <optional>
       8              : 
       9              : #include "DataStructures/DataBox/DataBox.hpp"
      10              : #include "DataStructures/DataBox/PrefixHelpers.hpp"
      11              : #include "DataStructures/DataBox/Prefixes.hpp"
      12              : #include "DataStructures/Variables.hpp"
      13              : #include "Evolution/Imex/Protocols/ImexSystem.hpp"
      14              : #include "Evolution/Imex/Tags/ImplicitHistory.hpp"
      15              : #include "Parallel/AlgorithmExecution.hpp"
      16              : #include "Utilities/Gsl.hpp"
      17              : #include "Utilities/ProtocolHelpers.hpp"
      18              : #include "Utilities/TMPL.hpp"
      19              : 
      20              : /// \cond
      21              : class TimeStepId;
      22              : namespace Parallel {
      23              : template <typename Metavariables>
      24              : class GlobalCache;
      25              : }  // namespace Parallel
      26              : namespace Tags {
      27              : struct TimeStepId;
      28              : }  // namespace Tags
      29              : namespace tuples {
      30              : template <class... Tags>
      31              : class TaggedTuple;
      32              : }  // namespace tuples
      33              : /// \endcond
      34              : 
      35              : namespace imex::Actions {
      36              : /// \ingroup ActionsGroup
      37              : /// \brief Records the implicit sources in the implicit time stepper history.
      38              : ///
      39              : /// Uses:
      40              : /// - GlobalCache: nothing
      41              : /// - DataBox:
      42              : ///   - Tags::TimeStepId
      43              : ///   - system::variables_tag
      44              : ///   - as required by source terms
      45              : ///
      46              : /// DataBox changes:
      47              : /// - imex::Tags::ImplicitHistory<sector> for each sector
      48              : template <typename System>
      49            1 : struct RecordTimeStepperData {
      50              :   template <typename DbTags, typename... InboxTags, typename Metavariables,
      51              :             typename ArrayIndex, typename ActionList,
      52              :             typename ParallelComponent>
      53            0 :   static Parallel::iterable_action_return_t apply(
      54              :       db::DataBox<DbTags>& box, tuples::TaggedTuple<InboxTags...>& /*inboxes*/,
      55              :       const Parallel::GlobalCache<Metavariables>& /*cache*/,
      56              :       const ArrayIndex& /*array_index*/, ActionList /*meta*/,
      57              :       const ParallelComponent* const /*meta*/) {  // NOLINT const
      58              :     static_assert(tt::assert_conforms_to_v<System, protocols::ImexSystem>);
      59              : 
      60              :     const size_t number_of_grid_points =
      61              :         db::get<typename System::variables_tag>(box).number_of_grid_points();
      62              : 
      63              :     tmpl::for_each<typename System::implicit_sectors>([&](auto sector_v) {
      64              :       using sector = tmpl::type_from<decltype(sector_v)>;
      65              :       using source =
      66              :           typename tmpl::front<typename sector::solve_attempts>::source;
      67              :       using history_tag = Tags::ImplicitHistory<sector>;
      68              :       using DtSectorVars =
      69              :           Variables<db::wrap_tags_in<::Tags::dt, typename sector::tensors>>;
      70              :       db::mutate_apply<
      71              :           tmpl::list<history_tag>,
      72              :           tmpl::push_front<typename source::argument_tags, ::Tags::TimeStepId>>(
      73              :           [&](const gsl::not_null<typename history_tag::type*> history,
      74              :               const TimeStepId& time_step_id, const auto&... source_arguments) {
      75              :             history->insert_in_place(
      76              :                 time_step_id, history_tag::type::no_value,
      77              :                 [&](const gsl::not_null<DtSectorVars*> source_result) {
      78              :                   source_result->initialize(number_of_grid_points);
      79              :                   tmpl::as_pack<typename source::return_tags>(
      80              :                       [&](auto... source_tags) {
      81              :                         // The history stores derivatives as
      82              :                         // ::Tags::dt<Var>, but the source provides
      83              :                         // ::Tags::Source<Var>.  Since the only
      84              :                         // implicit equations we support are source
      85              :                         // terms, these quantities are equal, but we
      86              :                         // still need to make the types match.
      87              :                         source::apply(
      88              :                             make_not_null(
      89              :                                 &get<::Tags::dt<db::remove_tag_prefix<
      90              :                                     tmpl::type_from<decltype(source_tags)>>>>(
      91              :                                     *source_result))...,
      92              :                             source_arguments...);
      93              :                       });
      94              :                 });
      95              :           },
      96              :           make_not_null(&box));
      97              :     });
      98              : 
      99              :     return {Parallel::AlgorithmExecution::Continue, std::nullopt};
     100              :   }
     101              : };
     102              : }  // namespace imex::Actions
        

Generated by: LCOV version 2.0-1