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 <memory> 8 : 9 : #include "DataStructures/DataBox/Tag.hpp" 10 : 11 : /// \cond 12 : template <size_t Dim, typename T> 13 : class DirectionalIdMap; 14 : template <size_t Dim> 15 : class Mesh; 16 : namespace evolution::dg { 17 : template <size_t Dim> 18 : class BoundaryMessage; 19 : template <size_t Dim> 20 : class MortarData; 21 : template <size_t Dim> 22 : class MortarDataHolder; 23 : template <size_t Dim> 24 : class MortarInfo; 25 : } // namespace evolution::dg 26 : class TimeStepId; 27 : namespace TimeSteppers { 28 : template <typename LocalData, typename RemoteData, typename CouplingResult> 29 : class BoundaryHistory; 30 : } // namespace TimeSteppers 31 : /// \endcond 32 : 33 : /// %Tags used for DG evolution scheme. 34 : namespace evolution::dg::Tags { 35 : /// Data on mortars, indexed by (Direction, ElementId) pairs 36 : /// 37 : /// The `Dim` is the volume dimension, not the face dimension. 38 : template <size_t Dim> 39 1 : struct MortarData : db::SimpleTag { 40 0 : using type = DirectionalIdMap<Dim, evolution::dg::MortarDataHolder<Dim>>; 41 : }; 42 : 43 : /// History of the data on mortars, indexed by (Direction, ElementId) pairs, and 44 : /// used by the linear multistep local time stepping code. 45 : /// 46 : /// The `Dim` is the volume dimension, not the face dimension. 47 : /// 48 : /// `CouplingResult` is the result of calling a functor of type `Coupling` used 49 : /// in `TimeSteppers::BoundaryHistory`. It is also the result of 50 : /// `LtsTimeStepper::compute_boundary_delta()`, which again has a `Coupling` 51 : /// template parameter. 52 : template <size_t Dim, typename CouplingResult> 53 1 : struct MortarDataHistory : db::SimpleTag { 54 0 : using type = DirectionalIdMap< 55 : Dim, TimeSteppers::BoundaryHistory<::evolution::dg::MortarData<Dim>, 56 : ::evolution::dg::MortarData<Dim>, 57 : CouplingResult>>; 58 : }; 59 : 60 : /// Mesh on the mortars, indexed by (Direction, ElementId) pairs 61 : /// 62 : /// The `Dim` is the volume dimension, not the face dimension. 63 : template <size_t Dim> 64 1 : struct MortarMesh : db::SimpleTag { 65 0 : using type = DirectionalIdMap<Dim, Mesh<Dim - 1>>; 66 : }; 67 : 68 : /// The ::evolution::dg::MortarInfo for each mortar 69 : /// 70 : /// The `Dim` is the volume dimension, not the face dimension. 71 : template <size_t Dim> 72 1 : struct MortarInfo : db::SimpleTag { 73 0 : using type = DirectionalIdMap<Dim, ::evolution::dg::MortarInfo<Dim>>; 74 : }; 75 : 76 : /// The next temporal id at which to receive data on the specified mortar. 77 : /// 78 : /// The `Dim` is the volume dimension, not the face dimension. 79 : template <size_t Dim> 80 1 : struct MortarNextTemporalId : db::SimpleTag { 81 0 : using type = DirectionalIdMap<Dim, TimeStepId>; 82 : }; 83 : 84 : /// \brief The BoundaryMessage received from the inbox 85 : /// 86 : /// We must store the `std::unique_ptr` in the DataBox so the memory persists in 87 : /// case data was sent from another node 88 : /// \tparam Dim The volume dimension, not the face dimension 89 : template <size_t Dim> 90 1 : struct BoundaryMessageFromInbox : db::SimpleTag { 91 0 : using type = DirectionalIdMap<Dim, std::unique_ptr<BoundaryMessage<Dim>>>; 92 : }; 93 : } // namespace evolution::dg::Tags