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 "Domain/Creators/Tags/Domain.hpp"
13 : #include "Domain/Creators/Tags/FunctionsOfTime.hpp"
14 : #include "Domain/Creators/Tags/InitialExtents.hpp"
15 : #include "Domain/Creators/Tags/InitialRefinementLevels.hpp"
16 : #include "Elliptic/DiscontinuousGalerkin/Initialization.hpp"
17 : #include "Elliptic/DiscontinuousGalerkin/Tags.hpp"
18 : #include "Parallel/AlgorithmExecution.hpp"
19 : #include "Utilities/Gsl.hpp"
20 : #include "Utilities/TMPL.hpp"
21 :
22 : /// \cond
23 : namespace Parallel {
24 : template <typename Metavariables>
25 : struct GlobalCache;
26 : } // namespace Parallel
27 : namespace tuples {
28 : template <typename... Tags>
29 : struct TaggedTuple;
30 : } // namespace tuples
31 : template <size_t VolumeDim>
32 : class ElementId;
33 : /// \endcond
34 :
35 : namespace elliptic::dg::Actions {
36 : /*!
37 : * \ingroup InitializationGroup
38 : * \brief Initialize items related to the basic structure of the element
39 : *
40 : * DataBox:
41 : * - Uses:
42 : * - `domain::Tags::Domain<Dim, Frame::Inertial>`
43 : * - `domain::Tags::InitialExtents<Dim>`
44 : * - `domain::Tags::InitialRefinementLevels<Dim>`
45 : * - `domain::Tags::FunctionsOfTime` (Parameters for maps that distort the
46 : * domain. These are always evaluated at t=0.)
47 : * - Adds:
48 : * - `domain::Tags::Mesh<Dim>`
49 : * - `domain::Tags::Element<Dim>`
50 : * - `domain::Tags::ElementMap<Dim, Frame::Inertial>`
51 : * - `domain::Tags::Coordinates<Dim, Frame::ElementLogical>`
52 : * - `domain::Tags::Coordinates<Dim, Frame::Inertial>`
53 : * - `domain::Tags::InverseJacobian<Dim, Frame::ElementLogical,
54 : * Frame::Inertial>`
55 : * - `domain::Tags::DetInvJacobian<Frame::ElementLogical, Frame::Inertial>`
56 : */
57 : template <size_t Dim>
58 1 : struct InitializeDomain {
59 : private:
60 0 : using InitializeGeometry = elliptic::dg::InitializeGeometry<Dim>;
61 :
62 : public:
63 0 : using simple_tags_from_options =
64 : tmpl::list<domain::Tags::InitialExtents<Dim>,
65 : domain::Tags::InitialRefinementLevels<Dim>>;
66 0 : using simple_tags = typename InitializeGeometry::return_tags;
67 0 : using compute_tags = tmpl::list<>;
68 0 : using const_global_cache_tags =
69 : tmpl::list<domain::Tags::FunctionsOfTimeInitialize,
70 : elliptic::dg::Tags::Quadrature>;
71 :
72 : template <typename DbTagsList, typename... InboxTags, typename Metavariables,
73 : typename ActionList, typename ParallelComponent>
74 0 : static Parallel::iterable_action_return_t apply(
75 : db::DataBox<DbTagsList>& box,
76 : const tuples::TaggedTuple<InboxTags...>& /*inboxes*/,
77 : const Parallel::GlobalCache<Metavariables>& /*cache*/,
78 : const ElementId<Dim>& element_id, const ActionList /*meta*/,
79 : const ParallelComponent* const /*meta*/) {
80 : db::mutate_apply<InitializeGeometry>(make_not_null(&box), element_id);
81 : return {Parallel::AlgorithmExecution::Continue, std::nullopt};
82 : }
83 : };
84 : } // namespace elliptic::dg::Actions
|