Wildmeshing Toolkit
Loading...
Searching...
No Matches
MultiMeshLinkConditionInvariant.cpp
Go to the documentation of this file.
1
#include "
MultiMeshLinkConditionInvariant.hpp
"
2
3
#include <stdexcept>
4
#include <
wmtk/EdgeMesh.hpp
>
5
#include <
wmtk/Mesh.hpp
>
6
#include <
wmtk/PointMesh.hpp
>
7
#include <
wmtk/TetMesh.hpp
>
8
#include <
wmtk/TriMesh.hpp
>
9
#include <
wmtk/multimesh/MultiMeshSimplexVisitor.hpp
>
10
#include <
wmtk/simplex/Simplex.hpp
>
11
#include <
wmtk/simplex/link_condition.hpp
>
12
13
namespace
wmtk::invariants
{
14
namespace
{
15
16
struct
MultiMeshLinkConditionFunctor
17
{
18
template
<
typename
T>
19
bool
operator()(
const
T& m,
const
simplex::Simplex& s, int64_t) {
20
return
this->operator()(m,s);
21
}
22
template
<
typename
MeshType>
23
bool
operator()(
const
MeshType& m,
const
simplex::Simplex& s)
const
24
{
25
return
m.is_free() ||
simplex::link_condition
(m, s.tuple());
26
}
27
};
28
}
// namespace
29
30
MultiMeshLinkConditionInvariant::MultiMeshLinkConditionInvariant
(
const
Mesh
& m)
31
:
Invariant
(m, true, false, false)
32
{}
33
bool
MultiMeshLinkConditionInvariant::before
(
const
simplex::Simplex
& t)
const
34
{
35
assert(t.
primitive_type
() ==
PrimitiveType::Edge
);
36
multimesh::MultiMeshSimplexVisitor
visitor(
37
std::integral_constant<int64_t, 1>{},
// specify that this runs on edges
38
MultiMeshLinkConditionFunctor{});
39
// TODO: fix visitor to work for const data
40
visitor.
execute_from_root
(
const_cast<
Mesh
&
>
(
mesh
()),
simplex::NavigatableSimplex
(
mesh
(),t));
41
const
auto
& data = visitor.cache();
42
43
for
(
const
auto
& [key, value_var] : data) {
44
const
bool
valid = std::get<bool>(value_var);
45
if
(!valid) {
46
return
false
;
47
}
48
}
49
50
return
true
;
51
}
52
}
// namespace wmtk::invariants
EdgeMesh.hpp
Mesh.hpp
MultiMeshLinkConditionInvariant.hpp
MultiMeshSimplexVisitor.hpp
PointMesh.hpp
Simplex.hpp
TetMesh.hpp
TriMesh.hpp
wmtk::Mesh
Definition
Mesh.hpp:95
wmtk::invariants::Invariant
Definition
Invariant.hpp:12
wmtk::invariants::Invariant::mesh
const Mesh & mesh() const
Definition
Invariant.cpp:35
wmtk::invariants::MultiMeshLinkConditionInvariant::before
bool before(const simplex::Simplex &t) const override
Definition
MultiMeshLinkConditionInvariant.cpp:33
wmtk::invariants::MultiMeshLinkConditionInvariant::MultiMeshLinkConditionInvariant
MultiMeshLinkConditionInvariant(const Mesh &m)
Definition
MultiMeshLinkConditionInvariant.cpp:30
wmtk::multimesh::MultiMeshSimplexVisitor
Definition
MultiMeshSimplexVisitor.hpp:30
wmtk::multimesh::MultiMeshSimplexVisitor::execute_from_root
void execute_from_root(Mesh &mesh, const simplex::NavigatableSimplex &simplex)
Definition
MultiMeshSimplexVisitor.hpp:114
wmtk::simplex::NavigatableSimplex
Definition
NavigatableSimplex.hpp:16
wmtk::simplex::Simplex
Definition
Simplex.hpp:22
wmtk::simplex::Simplex::primitive_type
PrimitiveType primitive_type() const
Definition
Simplex.hpp:51
link_condition.hpp
wmtk::invariants
Definition
CollapseEnergyBeforeInvariant.cpp:11
wmtk::simplex::link_condition
bool link_condition(const EdgeMesh &mesh, const Tuple &edge)
Check if the edge to collapse satisfying the link condition.
Definition
link_condition.cpp:43
wmtk::PrimitiveType::Edge
@ Edge
src
wmtk
invariants
MultiMeshLinkConditionInvariant.cpp
Generated by
1.9.8