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 "DataStructures/TaggedTuple.hpp"
13 : #include "DataStructures/VariablesTag.hpp"
14 : #include "Evolution/Initialization/Evolution.hpp"
15 : #include "Evolution/Initialization/Tags.hpp"
16 : #include "Evolution/Systems/Cce/OptionTags.hpp"
17 : #include "Parallel/AlgorithmExecution.hpp"
18 : #include "ParallelAlgorithms/Initialization/MutateAssign.hpp"
19 : #include "Time/ChooseLtsStepSize.hpp"
20 : #include "Time/LtsMode.hpp"
21 : #include "Time/Slab.hpp"
22 : #include "Time/Tags/AdaptiveSteppingDiagnostics.hpp"
23 : #include "Time/Tags/LtsMode.hpp"
24 : #include "Time/Tags/StepNumberWithinSlab.hpp"
25 : #include "Time/Tags/Time.hpp"
26 : #include "Time/Tags/TimeStep.hpp"
27 : #include "Time/Tags/TimeStepId.hpp"
28 : #include "Time/Tags/TimeStepper.hpp"
29 : #include "Time/Time.hpp"
30 : #include "Time/TimeStepId.hpp"
31 : #include "Time/TimeSteppers/LtsTimeStepper.hpp"
32 : #include "Time/TimeSteppers/TimeStepper.hpp"
33 : #include "Utilities/Rational.hpp"
34 : #include "Utilities/Requires.hpp"
35 : #include "Utilities/TMPL.hpp"
36 :
37 : namespace Cce {
38 : namespace Actions {
39 :
40 : /*!
41 : * \ingroup ActionsGroup
42 : * \brief Initializes the contents of the `CharacteristicEvolution` component
43 : * for performing the time evolution of the system, which is the singleton that
44 : * handles the main evolution system for CCE computations.
45 : *
46 : * \details Sets up the \ref DataBoxGroup to be ready to perform the
47 : * time-stepping associated with the CCE system.
48 : *
49 : * \ref DataBoxGroup changes:
50 : * - Modifies: nothing
51 : * - Adds:
52 : * - `Tags::TimeStepId`
53 : * - `Tags::Next<Tags::TimeStepId>`
54 : * - `Tags::TimeStep`
55 : * - `Tags::Time`
56 : * - `Tags::AdaptiveSteppingDiagnostics`
57 : * - Removes: nothing
58 : */
59 1 : struct InitializeCharacteristicEvolutionTime {
60 0 : using simple_tags_from_options =
61 : tmpl::list<Initialization::Tags::InitialSlabSize,
62 : ::Initialization::Tags::InitialTimeDelta>;
63 :
64 0 : using const_global_cache_tags = tmpl::list<
65 : Tags::CceEvolutionPrefix<::Tags::ConcreteTimeStepper<LtsTimeStepper>>,
66 : Tags::CceEvolutionPrefix<::Tags::LtsModeForced<LtsMode::Conservative>>>;
67 :
68 0 : using simple_tags =
69 : tmpl::list<::Tags::TimeStepId, ::Tags::Next<::Tags::TimeStepId>,
70 : ::Tags::TimeStep, ::Tags::Time, ::Tags::StepNumberWithinSlab,
71 : ::Tags::AdaptiveSteppingDiagnostics>;
72 0 : using compute_tags =
73 : tmpl::transform<time_stepper_ref_tags<LtsTimeStepper>,
74 : tmpl::bind<Tags::CceEvolutionPrefix, tmpl::_1>>;
75 :
76 : template <typename DbTags, typename... InboxTags, typename Metavariables,
77 : typename ArrayIndex, typename ActionList,
78 : typename ParallelComponent>
79 0 : static Parallel::iterable_action_return_t apply(
80 : db::DataBox<DbTags>& box,
81 : const tuples::TaggedTuple<InboxTags...>& /*inboxes*/,
82 : const Parallel::GlobalCache<Metavariables>& /*cache*/,
83 : const ArrayIndex& /*array_index*/, const ActionList /*meta*/,
84 : const ParallelComponent* const /*meta*/) {
85 : const auto& time_stepper =
86 : db::get<Tags::CceEvolutionPrefix<::Tags::TimeStepper<TimeStepper>>>(
87 : box);
88 : const double initial_time_value = db::get<Tags::StartTime>(box);
89 :
90 : double unused_slab_size_goal{};
91 : db::mutate_apply<
92 : tmpl::list<::Tags::Next<::Tags::TimeStepId>, ::Tags::TimeStep>,
93 : tmpl::list<>>(
94 : Initialization::TimeStepping<Metavariables, TimeStepper, false, true>{},
95 : make_not_null(&box), make_not_null(&unused_slab_size_goal),
96 : initial_time_value,
97 : db::get<::Initialization::Tags::InitialTimeDelta>(box),
98 : db::get<::Initialization::Tags::InitialSlabSize>(box), time_stepper,
99 : LtsMode::Conservative);
100 :
101 : Initialization::mutate_assign<tmpl::list<::Tags::TimeStepId, ::Tags::Time>>(
102 : make_not_null(&box), TimeStepId{}, initial_time_value);
103 : return {Parallel::AlgorithmExecution::Continue, std::nullopt};
104 : }
105 : };
106 :
107 : } // namespace Actions
108 : } // namespace Cce
|