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 <utility>
8 :
9 : #include "Domain/Structure/DirectionalId.hpp"
10 : #include "Domain/Structure/DirectionalIdMap.hpp"
11 : #include "Domain/Structure/Element.hpp"
12 : #include "Domain/Structure/ElementId.hpp"
13 : #include "Utilities/Gsl.hpp"
14 :
15 : namespace domain {
16 : /*!
17 : * \brief Remove entries in `map_to_trim` that aren't face neighbors of the
18 : * `element`
19 : */
20 : template <size_t Dim, typename T>
21 1 : void remove_nonexistent_neighbors(
22 : const gsl::not_null<DirectionalIdMap<Dim, T>*> map_to_trim,
23 : const Element<Dim>& element) {
24 : std::array<DirectionalId<Dim>, maximum_number_of_neighbors(Dim)>
25 : ids_to_remove{};
26 : size_t ids_index = 0;
27 : for (const auto& [neighbor_id, mesh] : *map_to_trim) {
28 : const auto& neighbors = element.neighbors();
29 : if (const auto neighbors_it = neighbors.find(neighbor_id.direction());
30 : neighbors_it != neighbors.end()) {
31 : if (const auto neighbor_it =
32 : neighbors_it->second.ids().find(neighbor_id.id());
33 : neighbor_it == neighbors_it->second.ids().end()) {
34 : gsl::at(ids_to_remove, ids_index) = neighbor_id;
35 : ++ids_index;
36 : }
37 : } else {
38 : gsl::at(ids_to_remove, ids_index) = neighbor_id;
39 : ++ids_index;
40 : }
41 : }
42 : for (size_t i = 0; i < ids_index; ++i) {
43 : map_to_trim->erase(gsl::at(ids_to_remove, i));
44 : }
45 : }
46 : } // namespace domain
|