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 <type_traits>
10 : #include <utility>
11 :
12 : #include "DataStructures/DataBox/DataBox.hpp"
13 : #include "DataStructures/DataBox/PrefixHelpers.hpp"
14 : #include "DataStructures/DataBox/Prefixes.hpp"
15 : #include "Domain/CoordinateMaps/Tags.hpp"
16 : #include "Domain/FunctionsOfTime/Tags.hpp"
17 : #include "Domain/Tags.hpp"
18 : #include "Domain/TagsTimeDependent.hpp"
19 : #include "Evolution/Initialization/InitialData.hpp"
20 : #include "NumericalAlgorithms/LinearOperators/Divergence.tpp" // Needs to be included somewhere and here seems most natural.
21 : #include "Parallel/AlgorithmExecution.hpp"
22 : #include "Parallel/GlobalCache.hpp"
23 : #include "ParallelAlgorithms/Initialization/MutateAssign.hpp"
24 : #include "PointwiseFunctions/AnalyticData/Tags.hpp"
25 : #include "Utilities/ErrorHandling/Error.hpp"
26 : #include "Utilities/Gsl.hpp"
27 : #include "Utilities/NoSuchType.hpp"
28 : #include "Utilities/TMPL.hpp"
29 :
30 : /// \cond
31 : namespace Frame {
32 : struct Inertial;
33 : } // namespace Frame
34 :
35 : namespace domain {
36 : namespace Tags {
37 : template <size_t VolumeDim, typename Frame>
38 : struct Coordinates;
39 : template <size_t VolumeDim>
40 : struct Mesh;
41 : } // namespace Tags
42 : } // namespace domain
43 :
44 : namespace tuples {
45 : template <class... Tags>
46 : class TaggedTuple;
47 : } // namespace tuples
48 : /// \endcond
49 :
50 0 : namespace Initialization {
51 0 : namespace Actions {
52 : /// \ingroup InitializationGroup
53 : /// \brief Allocate variables needed for evolution of conservative systems
54 : ///
55 : /// Uses:
56 : /// - DataBox:
57 : /// * `Tags::Mesh<Dim>`
58 : ///
59 : /// DataBox changes:
60 : /// - Adds:
61 : /// * System::variables_tag
62 : /// * db::add_tag_prefix<Tags::Flux, System::variables_tag>
63 : /// * db::add_tag_prefix<Tags::Source, System::variables_tag>
64 : ///
65 : /// - Removes: nothing
66 : /// - Modifies: nothing
67 : template <typename System>
68 1 : struct ConservativeSystem {
69 : private:
70 0 : static constexpr size_t dim = System::volume_dim;
71 :
72 0 : using variables_tag = typename System::variables_tag;
73 :
74 : template <typename LocalSystem,
75 : bool = LocalSystem::has_primitive_and_conservative_vars>
76 0 : struct simple_tags_impl {
77 0 : using type = tmpl::list<variables_tag>;
78 : };
79 :
80 : template <typename LocalSystem>
81 0 : struct simple_tags_impl<LocalSystem, true> {
82 0 : using type =
83 : tmpl::list<variables_tag, typename System::primitive_variables_tag>;
84 : };
85 :
86 : public:
87 0 : using simple_tags = typename simple_tags_impl<System>::type;
88 :
89 0 : using compute_tags = db::AddComputeTags<>;
90 :
91 : template <typename DbTagsList, typename... InboxTags, typename Metavariables,
92 : typename ArrayIndex, typename ActionList,
93 : typename ParallelComponent>
94 0 : static Parallel::iterable_action_return_t apply(
95 : db::DataBox<DbTagsList>& box,
96 : const tuples::TaggedTuple<InboxTags...>& /*inboxes*/,
97 : const Parallel::GlobalCache<Metavariables>& /*cache*/,
98 : const ArrayIndex& /*array_index*/, ActionList /*meta*/,
99 : const ParallelComponent* const /*meta*/) {
100 : const size_t num_grid_points =
101 : db::get<domain::Tags::Mesh<dim>>(box).number_of_grid_points();
102 : typename variables_tag::type vars(num_grid_points);
103 :
104 : if constexpr (System::has_primitive_and_conservative_vars) {
105 : using PrimitiveVars = typename System::primitive_variables_tag::type;
106 :
107 : PrimitiveVars primitive_vars{
108 : db::get<domain::Tags::Mesh<dim>>(box).number_of_grid_points()};
109 : Initialization::mutate_assign<simple_tags>(
110 : make_not_null(&box), std::move(vars), std::move(primitive_vars));
111 : } else {
112 : Initialization::mutate_assign<simple_tags>(make_not_null(&box),
113 : std::move(vars));
114 : }
115 : return {Parallel::AlgorithmExecution::Continue, std::nullopt};
116 : }
117 : };
118 : } // namespace Actions
119 : } // namespace Initialization
|