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 <iosfwd> 8 : #include <map> 9 : #include <string> 10 : #include <tuple> 11 : #include <unordered_map> 12 : 13 : #include "Utilities/TMPL.hpp" 14 : 15 : /// \cond 16 : template <size_t VolumeDim> 17 : class ElementId; 18 : namespace PUP { 19 : class er; 20 : } // namespace PUP 21 : /// \endcond 22 : 23 : namespace evolution::dg { 24 : /// Unique identifier for an equal-rate region. 25 : /// 26 : /// \see EqualRateRegions 27 1 : struct EqualRateRegionId { 28 0 : size_t type; 29 0 : size_t label; 30 : 31 0 : EqualRateRegionId() = default; 32 0 : EqualRateRegionId(const size_t type_in, const size_t label_in) 33 : : type(type_in), label(label_in) {} 34 : 35 0 : void pup(PUP::er& p); 36 : 37 0 : friend auto operator<=>(const EqualRateRegionId&, 38 : const EqualRateRegionId&) = default; 39 0 : friend bool operator==(const EqualRateRegionId&, 40 : const EqualRateRegionId&) = default; 41 0 : friend bool operator<(const EqualRateRegionId&, 42 : const EqualRateRegionId&) = default; 43 : }; 44 : 45 0 : std::ostream& operator<<(std::ostream& os, const EqualRateRegionId& id); 46 : 47 : namespace EqualRateRegions_detail { 48 : template <typename T> 49 : struct creation_tags { 50 : using type = typename T::creation_tags; 51 : }; 52 : } // namespace EqualRateRegions_detail 53 : 54 : /// Regions of the domain that cannot perform local time-stepping. 55 : /// 56 : /// The \p RegionGenerators template argument must be a `tmpl::list` 57 : /// of classes satisfying the `equal_rate_region_generator<Dim>` 58 : /// concept. 59 : template < 60 : size_t Dim, typename RegionGenerators, 61 : typename CreationTags = tmpl::join<tmpl::transform< 62 : RegionGenerators, EqualRateRegions_detail::creation_tags<tmpl::_1>>>> 63 1 : class EqualRateRegions; 64 : 65 : /// \copydoc EqualRateRegions 66 : template <size_t Dim> 67 1 : class EqualRateRegionsBase { 68 : protected: 69 0 : EqualRateRegionsBase() = default; 70 0 : EqualRateRegionsBase(const EqualRateRegionsBase&) = default; 71 0 : EqualRateRegionsBase(EqualRateRegionsBase&&) = default; 72 0 : EqualRateRegionsBase& operator=(const EqualRateRegionsBase&) = default; 73 0 : EqualRateRegionsBase& operator=(EqualRateRegionsBase&&) = default; 74 0 : ~EqualRateRegionsBase() = default; 75 : 76 : public: 77 : /// Map from all region names to ids. Inverse of `region_names()`. 78 1 : virtual const std::unordered_map<std::string, EqualRateRegionId>& regions() 79 : const = 0; 80 : 81 : /// Map from all region ids to names. Inverse of `regions()`. 82 1 : virtual const std::map<EqualRateRegionId, std::string>& region_names() 83 : const = 0; 84 : 85 : /// Check whether a particular element is in a given region. 86 1 : virtual bool is_in_region(const EqualRateRegionId& region, 87 : const ElementId<Dim>& element) const = 0; 88 : }; 89 : 90 : /// \copydoc EqualRateRegions 91 : template <size_t Dim, typename... RegionGenerators, typename... CreationTags> 92 1 : class EqualRateRegions<Dim, tmpl::list<RegionGenerators...>, 93 : tmpl::list<CreationTags...>> 94 : final : public EqualRateRegionsBase<Dim> { 95 : public: 96 0 : explicit EqualRateRegions() 97 : requires(sizeof...(CreationTags) > 0) 98 : = default; 99 : 100 0 : using creation_tags = tmpl::list<CreationTags...>; 101 : 102 0 : explicit EqualRateRegions(const typename CreationTags::type&... args); 103 : 104 1 : const std::unordered_map<std::string, EqualRateRegionId>& regions() 105 : const override; 106 : 107 1 : const std::map<EqualRateRegionId, std::string>& region_names() const override; 108 : 109 1 : bool is_in_region(const EqualRateRegionId& region, 110 : const ElementId<Dim>& element) const override; 111 : 112 0 : void pup(PUP::er& p); 113 : 114 : private: 115 0 : std::tuple<RegionGenerators...> generators_{}; 116 0 : std::unordered_map<std::string, EqualRateRegionId> regions_{}; 117 0 : std::map<EqualRateRegionId, std::string> region_names_{}; 118 : }; 119 : } // namespace evolution::dg