Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include "Evolution/Imex/Protocols/ImexSystem.hpp"
7 : #include "Time/Tags/TimeStepper.hpp"
8 : #include "Time/TimeSteppers/TimeStepper.hpp"
9 : #include "Utilities/ErrorHandling/Error.hpp"
10 : #include "Utilities/Gsl.hpp"
11 : #include "Utilities/ProtocolHelpers.hpp"
12 : #include "Utilities/TMPL.hpp"
13 :
14 : /// \cond
15 : namespace Parallel {
16 : template <typename Metavariables>
17 : struct GlobalCache;
18 : } // namespace Parallel
19 : namespace Tags {
20 : struct Time;
21 : } // namespace Tags
22 : namespace db {
23 : template <typename TagsList>
24 : class DataBox;
25 : } // namespace db
26 : namespace imex::Tags {
27 : template <typename ImplicitSector>
28 : struct ImplicitHistory;
29 : } // namespace imex::Tags
30 : namespace tuples {
31 : template <class... Tags>
32 : class TaggedTuple;
33 : } // namespace tuples
34 : /// \endcond
35 :
36 : namespace imex {
37 : /// Mutator to apply the implicit portion of dense output, intended
38 : /// for use in `RunEventsAndDenseTriggers`.
39 : template <typename ImexSystem>
40 1 : struct ImplicitDenseOutput {
41 : static_assert(tt::assert_conforms_to_v<ImexSystem, protocols::ImexSystem>);
42 :
43 0 : using return_tags = tmpl::list<typename ImexSystem::variables_tag>;
44 0 : using argument_tags = tmpl::push_front<
45 : tmpl::transform<typename ImexSystem::implicit_sectors,
46 : tmpl::bind<Tags::ImplicitHistory, tmpl::_1>>,
47 : ::Tags::TimeStepper<TimeStepper>, ::Tags::Time>;
48 :
49 : template <typename... Histories>
50 0 : static void apply(
51 : const gsl::not_null<typename ImexSystem::variables_tag::type*> variables,
52 : const TimeStepper& time_stepper, const double time,
53 : const Histories&... histories) {
54 : const auto update_sector = [&](auto sector_v, auto history) {
55 : using sector = tmpl::type_from<decltype(sector_v)>;
56 : auto sector_variables =
57 : variables->template reference_subset<typename sector::tensors>();
58 : const bool success = time_stepper.dense_update_u(
59 : make_not_null(§or_variables), history, time);
60 : if (not success) {
61 : ERROR("IMEX dense output failed with history:\n" << history);
62 : }
63 : };
64 : tmpl::as_pack<typename ImexSystem::implicit_sectors>(
65 : [&](auto... sectors_v) {
66 : EXPAND_PACK_LEFT_TO_RIGHT(update_sector(sectors_v, histories));
67 : });
68 : }
69 :
70 : template <typename DbTagsList, typename... InboxTags, typename Metavariables,
71 : typename ArrayIndex, typename ParallelComponent>
72 0 : static bool is_ready(
73 : const gsl::not_null<db::DataBox<DbTagsList>*> /*box*/,
74 : const gsl::not_null<tuples::TaggedTuple<InboxTags...>*> /*inboxes*/,
75 : Parallel::GlobalCache<Metavariables>& /*cache*/,
76 : const ArrayIndex& /*array_index*/,
77 : const ParallelComponent* /*component*/) {
78 : return true;
79 : }
80 : };
81 : } // namespace imex
|