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 <tuple>
8 : #include <utility>
9 :
10 : #include "DataStructures/DataBox/DataBox.hpp"
11 : #include "Evolution/Systems/Cce/GaugeTransformBoundaryData.hpp"
12 : #include "Evolution/Systems/Cce/OptionTags.hpp"
13 : #include "Evolution/Systems/Cce/PreSwshDerivatives.hpp"
14 : #include "Evolution/Systems/Cce/PrecomputeCceDependencies.hpp"
15 : #include "Evolution/Systems/Cce/SwshDerivatives.hpp"
16 : #include "Evolution/Systems/Cce/Tags.hpp"
17 : #include "Parallel/AlgorithmExecution.hpp"
18 : #include "Parallel/GlobalCache.hpp"
19 : #include "Parallel/Invoke.hpp"
20 :
21 : namespace Cce {
22 : namespace Actions {
23 :
24 : /*!
25 : * \ingroup ActionsGroup
26 : * \brief Prepare the input quantities in the \ref DataBoxGroup for the
27 : * evaluation of the hypersurface integral used to compute `BondiTag`.
28 : *
29 : * \details Internally this calls the
30 : * `mutate_all_pre_swsh_derivatives_for_tag<BondiTag>()` and
31 : * `mutate_all_swsh_derivatives_for_tag<BondiTag>()` utility functions, which
32 : * determine which quantities are necessary for each of the hypersurface
33 : * computations.
34 : */
35 : template <typename BondiTag>
36 1 : struct CalculateIntegrandInputsForTag {
37 : template <typename DbTags, typename... InboxTags, typename Metavariables,
38 : typename ArrayIndex, typename ActionList,
39 : typename ParallelComponent>
40 0 : static Parallel::iterable_action_return_t apply(
41 : db::DataBox<DbTags>& box,
42 : const tuples::TaggedTuple<InboxTags...>& /*inboxes*/,
43 : const Parallel::GlobalCache<Metavariables>& /*cache*/,
44 : const ArrayIndex& /*array_index*/, const ActionList /*meta*/,
45 : const ParallelComponent* const /*meta*/) {
46 : mutate_all_pre_swsh_derivatives_for_tag<BondiTag>(make_not_null(&box));
47 : mutate_all_swsh_derivatives_for_tag<BondiTag>(make_not_null(&box));
48 : return {Parallel::AlgorithmExecution::Continue, std::nullopt};
49 : }
50 : };
51 :
52 : /*!
53 : * \ingroup ActionsGroup
54 : * \brief Perform all of the computations for dependencies of the hypersurface
55 : * equations that do not themselves depend on any hypersurface integrations.
56 : *
57 : * \details This is to be called as a 'pre-computation' step prior to looping
58 : * over the hypersurface integration set. Internally, this uses
59 : * `Cce::GaugeAdjustedBoundaryValue<Tag>` and
60 : * `Cce::mutate_all_precompute_cce_dependencies
61 : * <Tags::EvolutionGaugeBoundaryValue>()`
62 : * to calculate the requisite dependencies.
63 : */
64 1 : struct PrecomputeGlobalCceDependencies {
65 : template <typename... DbTags, typename... InboxTags, typename Metavariables,
66 : typename ArrayIndex, typename ActionList,
67 : typename ParallelComponent>
68 0 : static Parallel::iterable_action_return_t apply(
69 : db::DataBox<tmpl::list<DbTags...>>& box,
70 : const tuples::TaggedTuple<InboxTags...>& /*inboxes*/,
71 : const Parallel::GlobalCache<Metavariables>& /*cache*/,
72 : const ArrayIndex& /*array_index*/, const ActionList /*meta*/,
73 : const ParallelComponent* const /*meta*/) {
74 : tmpl::for_each<gauge_adjustments_setup_tags>([&box](auto tag_v) {
75 : using tag = typename decltype(tag_v)::type;
76 : db::mutate_apply<GaugeAdjustedBoundaryValue<tag>>(make_not_null(&box));
77 : });
78 : mutate_all_precompute_cce_dependencies<Tags::EvolutionGaugeBoundaryValue>(
79 : make_not_null(&box));
80 : return {Parallel::AlgorithmExecution::Continue, std::nullopt};
81 : }
82 : };
83 :
84 : } // namespace Actions
85 : } // namespace Cce
|