154 std::vector<std::pair<Index, uint8_t>> edge_counts;
155 std::vector<std::pair<std::pair<Index, Index>,
Index>> edges;
157 elem_edges_.resize(3, base::elems_.cols());
158 elem_edge_polarities_.resize(3, base::elems_.cols());
160 std::set<Index> unique_tags { base::elem_tags_.begin(), base::elem_tags_.end() };
162 for (
Index tag: unique_tags)
164 std::map<std::pair<Index, Index>,
Index> unique_edges;
166 for (
Index elem = 0; elem < base::elems_.cols(); ++elem)
168 if (base::elem_tags_[elem] != tag)
171 for (uint8_t edge = 0; edge < 3; ++edge)
173 std::pair<Index, Index> verts = std::make_pair(
174 base::elems_(edge, elem),
175 base::elems_((edge + 1) % 3, elem)
178 if (!decoupled_edges_ && verts.first > verts.second)
179 std::swap(verts.first, verts.second);
181 bool inserted = unique_edges.insert(std::make_pair(verts, num_edges)).second;
185 elem_edges_(edge, elem) = num_edges;
186 elem_edge_polarities_(edge, elem) = 1;
187 edge_counts.push_back(std::make_pair(num_edges, 1));
188 edges.push_back(std::make_pair(verts, num_edges));
193 elem_edges_(edge, elem) = unique_edges[verts];
194 elem_edge_polarities_(edge, elem) = -1;
195 edge_counts[unique_edges[verts]].second++;
201 edges_.resize(2, num_edges);
202 for (
const auto& edge: edges)
205 std::vector<Index> boundary_edges, junction_edges, internal_edges;
209 boundary_edges.push_back(
edge);
211 junction_edges.push_back(
edge);
213 internal_edges.push_back(
edge);
216 boundary_edges_ = Eigen::Map<EigRowVec<Index>, Eigen::Unaligned> (
217 boundary_edges.data(), boundary_edges.size()
219 junction_edges_ = Eigen::Map<EigRowVec<Index>, Eigen::Unaligned> (
220 junction_edges.data(), junction_edges.size()
222 internal_edges_ = Eigen::Map<EigRowVec<Index>, Eigen::Unaligned> (
223 internal_edges.data(), internal_edges.size()
226 std::vector<Index> boundary_elems, junction_elems, internal_elems;
232 boundary_elems.push_back(
elem);
234 junction_elems.push_back(
elem);
236 internal_elems.push_back(
elem);
242 std::sort(v.begin(), v.end());
243 auto last = std::unique(v.begin(), v.end());
244 v.erase(
last, v.end());
252 boundary_elems_ = Eigen::Map<EigRowVec<Index>, Eigen::Unaligned> (
253 boundary_elems.data(), boundary_elems.size()
255 junction_elems_ = Eigen::Map<EigRowVec<Index>, Eigen::Unaligned> (
256 junction_elems.data(), junction_elems.size()
258 internal_elems_ = Eigen::Map<EigRowVec<Index>, Eigen::Unaligned> (
259 internal_elems.data(), internal_elems.size()