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 : #include <tuple>
9 : #include <utility>
10 :
11 : #include "DataStructures/DataBox/DataBox.hpp"
12 : #include "Evolution/Systems/Cce/GaugeTransformBoundaryData.hpp"
13 : #include "Evolution/Systems/Cce/OptionTags.hpp"
14 : #include "Parallel/AlgorithmExecution.hpp"
15 : #include "Parallel/GlobalCache.hpp"
16 : #include "Utilities/Gsl.hpp"
17 : #include "Utilities/TMPL.hpp"
18 :
19 : namespace Cce {
20 : namespace Actions {
21 :
22 : /*!
23 : * \ingroup ActionsGroup
24 : * \brief Updates all of the gauge quantities associated with the additional
25 : * regularity-preserving gauge transformation on the boundaries for a new set of
26 : * Cauchy and partially flat Bondi-like coordinates.
27 : *
28 : * \details This action is to be called after `Tags::CauchyCartesianCoords`
29 : * and `Tags::PartiallyFlatCartesianCoords` have been updated, typically via a
30 : * time step of a set of coordinate evolution equations. It prepares the
31 : * gauge quantities in the \ref DataBoxGroup for calls to the individual
32 : * `GaugeAdjustedBoundaryValue` specializations.
33 : *
34 : * Internally, this dispatches to `GaugeUpdateAngularFromCartesian`,
35 : * `GaugeUpdateJacobianFromCoordinates`, `GaugeUpdateInterpolator`, and
36 : * `GaugeUpdateOmega` to perform the computations. Refer to the documentation
37 : * for those mutators for mathematical details.
38 : */
39 : template <bool EvolveCcm>
40 1 : struct UpdateGauge {
41 0 : using const_global_cache_tags = tmpl::list<Tags::LMax>;
42 :
43 : template <typename DbTags, typename... InboxTags, typename Metavariables,
44 : typename ArrayIndex, typename ActionList,
45 : typename ParallelComponent>
46 0 : static Parallel::iterable_action_return_t apply(
47 : db::DataBox<DbTags>& box,
48 : const tuples::TaggedTuple<InboxTags...>& /*inboxes*/,
49 : const Parallel::GlobalCache<Metavariables>& /*cache*/,
50 : const ArrayIndex& /*array_index*/, const ActionList /*meta*/,
51 : const ParallelComponent* const /*meta*/) {
52 : db::mutate_apply<GaugeUpdateAngularFromCartesian<
53 : Tags::CauchyAngularCoords, Tags::CauchyCartesianCoords>>(
54 : make_not_null(&box));
55 : db::mutate_apply<GaugeUpdateJacobianFromCoordinates<
56 : Tags::PartiallyFlatGaugeC, Tags::PartiallyFlatGaugeD,
57 : Tags::CauchyAngularCoords, Tags::CauchyCartesianCoords>>(
58 : make_not_null(&box));
59 : db::mutate_apply<GaugeUpdateInterpolator<Tags::CauchyAngularCoords>>(
60 : make_not_null(&box));
61 : db::mutate_apply<
62 : GaugeUpdateOmega<Tags::PartiallyFlatGaugeC, Tags::PartiallyFlatGaugeD,
63 : Tags::PartiallyFlatGaugeOmega>>(make_not_null(&box));
64 :
65 : if constexpr (EvolveCcm) {
66 : db::mutate_apply<
67 : GaugeUpdateAngularFromCartesian<Tags::PartiallyFlatAngularCoords,
68 : Tags::PartiallyFlatCartesianCoords>>(
69 : make_not_null(&box));
70 : db::mutate_apply<GaugeUpdateJacobianFromCoordinates<
71 : Tags::CauchyGaugeC, Tags::CauchyGaugeD,
72 : Tags::PartiallyFlatAngularCoords,
73 : Tags::PartiallyFlatCartesianCoords>>(make_not_null(&box));
74 : db::mutate_apply<
75 : GaugeUpdateInterpolator<Tags::PartiallyFlatAngularCoords>>(
76 : make_not_null(&box));
77 : db::mutate_apply<GaugeUpdateOmega<Tags::CauchyGaugeC, Tags::CauchyGaugeD,
78 : Tags::CauchyGaugeOmega>>(
79 : make_not_null(&box));
80 : }
81 : return {Parallel::AlgorithmExecution::Continue, std::nullopt};
82 : }
83 : };
84 : } // namespace Actions
85 : } // namespace Cce
|