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 : #include <string> 9 : #include <unordered_map> 10 : #include <utility> 11 : #include <vector> 12 : 13 : #include "Domain/Creators/OptionTags.hpp" 14 : #include "Domain/Structure/Direction.hpp" 15 : #include "Utilities/TMPL.hpp" 16 : 17 : /// \cond 18 : template <size_t VolumeDim> 19 : class DomainCreator; 20 : template <size_t VolumeDim> 21 : class ElementId; 22 : namespace PUP { 23 : class er; 24 : } // namespace PUP 25 : /// \endcond 26 : 27 : namespace evolution::dg { 28 : /// Equal-rate region generator for regions on nonconforming block boundaries. 29 : /// 30 : /// For each block that borders multiple other blocks on a single 31 : /// side, defines a region "NonconformingN", where "N" is the block 32 : /// number, consisting of all elements on the nonconforming boundary 33 : /// in that block and the neighboring blocks. If the block has 34 : /// nonconforming boundaries on both sides and is more than one 35 : /// element across, defines two regions "NonconformingN+" and 36 : /// "NonconformingN-". 37 : template <size_t Dim> 38 1 : class NonconformingEqualRateRegions { 39 : public: 40 0 : NonconformingEqualRateRegions() = default; 41 : 42 0 : using creation_tags = tmpl::list<domain::OptionTags::DomainCreator<Dim>>; 43 : 44 0 : explicit NonconformingEqualRateRegions( 45 : const std::unique_ptr<DomainCreator<Dim>>& domain_creator); 46 : 47 0 : std::unordered_map<std::string, size_t> regions() const; 48 : 49 0 : bool is_in_region(size_t region, const ElementId<Dim>& element_id) const; 50 : 51 0 : void pup(PUP::er& p); 52 : 53 : private: 54 0 : std::vector<std::string> region_names_{}; 55 0 : std::vector<std::vector<std::pair<size_t, Direction<Dim>>>> regions_{}; 56 : }; 57 : } // namespace evolution::dg