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