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
|