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 <utility>
8 :
9 : #include "DataStructures/DataBox/DataBox.hpp"
10 : #include "DataStructures/DataBox/Protocols/Mutator.hpp"
11 : #include "DataStructures/TaggedTuple.hpp"
12 : #include "Parallel/AlgorithmExecution.hpp"
13 : #include "Utilities/TMPL.hpp"
14 :
15 : /// \cond
16 : namespace Parallel {
17 : template <typename Metavariables>
18 : class GlobalCache;
19 : } // namespace Parallel
20 : /// \endcond
21 :
22 : namespace Initialization {
23 : namespace Actions {
24 : /*!
25 : * \ingroup ActionsGroup
26 : * \brief Initialize the list of simple tags in `Mutators::return_tags` by
27 : * calling each mutator in the order they are specified
28 : *
29 : * There's a specialization for `AddSimpleTags<tmpl::list<Mutators...>>` that
30 : * can also be used if a `tmpl::list` is available.
31 : *
32 : * Uses: nothing
33 : *
34 : * DataBox changes:
35 : * - Adds:
36 : * - Each simple tag in the list `Mutators::return_tags`
37 : * - Removes:
38 : * - nothing
39 : * - Modifies:
40 : * - Each simple tag in the list `Mutators::return_tags`
41 : */
42 : template <typename... Mutators>
43 1 : struct AddSimpleTags {
44 0 : using simple_tags =
45 : tmpl::flatten<tmpl::append<typename Mutators::return_tags...>>;
46 0 : using compute_tags = tmpl::list<>;
47 :
48 : static_assert((tt::assert_conforms_to_v<Mutators, db::protocols::Mutator> and
49 : ...));
50 :
51 : template <typename DbTagsList, typename... InboxTags, typename Metavariables,
52 : typename ArrayIndex, typename ActionList,
53 : typename ParallelComponent>
54 0 : static Parallel::iterable_action_return_t apply(
55 : db::DataBox<DbTagsList>& box,
56 : const tuples::TaggedTuple<InboxTags...>& /*inboxes*/,
57 : const Parallel::GlobalCache<Metavariables>& /*cache*/,
58 : const ArrayIndex& /*array_index*/, ActionList /*meta*/,
59 : const ParallelComponent* const /*meta*/) {
60 : EXPAND_PACK_LEFT_TO_RIGHT(db::mutate_apply<Mutators>(make_not_null(&box)));
61 : return {Parallel::AlgorithmExecution::Continue, std::nullopt};
62 : }
63 : };
64 :
65 : /// \cond
66 : template <typename... Mutators>
67 : struct AddSimpleTags<tmpl::list<Mutators...>>
68 : : public AddSimpleTags<Mutators...> {};
69 : /// \endcond
70 : } // namespace Actions
71 : } // namespace Initialization
|