15#include <lagrange/legacy/inline.h>
16#include <lagrange/utils/safe_cast.h>
19#include <lagrange/utils/warnoff.h>
20#include <tbb/parallel_sort.h>
21#include <lagrange/utils/warnon.h>
49template <
typename DerivedF,
typename DerivedC>
50Eigen::Index corner_to_edge_mapping(
51 const Eigen::MatrixBase<DerivedF>& F,
52 Eigen::PlainObjectBase<DerivedC>& C2E)
54 using Index =
typename DerivedF::Scalar;
62 UnorientedEdge(Index x, Index y, Index c)
68 auto key()
const {
return std::make_pair(v1, v2); }
70 bool operator<(
const UnorientedEdge& e)
const {
return key() < e.key(); }
72 bool operator!=(
const UnorientedEdge& e)
const {
return key() != e.key(); }
78 std::vector<UnorientedEdge> edges;
79 edges.reserve(F.rows() * F.cols());
80 for (Index f = 0; f < (Index)F.rows(); ++f) {
81 for (Index lv = 0; lv < (Index)F.cols(); ++lv) {
83 auto v2 = F(f, (lv + 1) % vert_per_facet);
84 edges.emplace_back(v1, v2, f * vert_per_facet + lv);
87 tbb::parallel_sort(edges.begin(), edges.end());
90 C2E.resize(F.rows() * F.cols());
92 for (
auto it_begin = edges.begin(); it_begin != edges.end();) {
94 auto it_end = std::find_if(it_begin, edges.end(), [&](
auto e) { return (e != *it_begin); });
95 for (
auto it = it_begin; it != it_end; ++it) {
96 C2E(it->corner) = num_edges;
constexpr auto safe_cast(SourceType value) -> std::enable_if_t<!std::is_same< SourceType, TargetType >::value, TargetType >
Perform safe cast from SourceType to TargetType, where "safe" means:
Definition safe_cast.h:51
bool operator!=(const shared_ptr< T > &sp1, const shared_ptr< U > &sp2)
Operator != overloading.
Definition shared_ptr.h:364
Main namespace for Lagrange.