Wildmeshing Toolkit
Loading...
Searching...
No Matches
TriWildMesh.h
1#pragma once
2
3#include <wmtk/TriOptimizerMesh.h>
4
5#include <wmtk/SurfaceTagAttributes.h>
6#include <cstdlib>
7
8#include <wmtk/utils/PartitionMesh.h>
9#include <wmtk/utils/VectorUtils.h>
10#include <polysolve/nonlinear/Problem.hpp>
11#include <wmtk/AttributeCollection.hpp>
12#include <wmtk/Types.hpp>
13#include <wmtk/envelope/Envelope.hpp>
14#include <wmtk/optimization/SmoothVertex.hpp>
15#include <wmtk/optimization/solver.hpp>
16#include <wmtk/threading/enumerable_thread_specific.hpp>
17
18// clang-format off
19#include <wmtk/utils/DisableWarnings.hpp>
20#include <fastenvelope/FastEnvelope.h>
21#include <wmtk/utils/EnableWarnings.hpp>
22// clang-format on
23
24#include "Parameters.h"
25
26#include <atomic>
27#include <memory>
28#include <set>
29
30namespace wmtk::components::triwild {
31
33using VertexAttributes = wmtk::TriOptimizerMesh::VertexAttributes;
34using EdgeAttributes = wmtk::TriOptimizerMesh::EdgeAttributes;
35using FaceAttributes = wmtk::TriOptimizerMesh::FaceAttributes;
36
38inline constexpr size_t NO_FEATURE = std::numeric_limits<size_t>::max();
39
41{
42public:
51 {
68 size_t m_feature_id = std::numeric_limits<size_t>::max();
69 };
71
75
76 std::vector<Vector2d> m_V_envelope;
77 std::vector<Vector2i> m_E_envelope;
90 double m_feature_eps = -1;
91
108 std::vector<Vector2d> m_feature_points;
110 std::atomic<size_t> m_feature_rejects = 0;
111
120 bool smoothing_position_is_allowed(const size_t vid, const Vector2d& p) const override;
121 void split_after_vertex(const size_t vid) override
122 {
123 m_vertex_extra[vid].m_feature_id = NO_FEATURE;
124 }
125
132 std::pair<size_t, size_t> feature_retention(double* worst_ratio = nullptr) const;
133
135 bool collapse_breaks_feature(const size_t v1_id, const size_t v2_id) const;
136
137
138 TriWildMesh(Parameters& _m_params, double envelope_eps, int _num_threads = 0)
139 : wmtk::TriOptimizerMesh(_m_params)
140 , m_tri_params(_m_params)
141 , m_feature_eps(envelope_eps)
142 {
143 m_vertex_attr_group.add(&m_vertex_extra);
144 m_envelope_eps = envelope_eps;
145 NUM_THREADS = _num_threads;
146
147 optimization::deactivate_opt_logger();
148
149 double& wa = m_params.w_amips;
150 double& we = m_params.w_envelope;
151 we = 1 - wa;
152 logger().info("w_envelope = {}", we);
153 }
154
155 ~TriWildMesh() {}
156
157public:
176 void init_mesh(
177 const MatrixXd& V,
178 const std::vector<Vector2r>& V_rational,
179 const MatrixXi& F,
180 const MatrixXi& E,
181 const std::vector<std::string>& tag_names,
182 const MatrixXd& V_env,
183 const MatrixXi& E_env);
184
185 void init_surfaces_and_boundaries();
186
187 void init_envelope(const MatrixXd& V, const MatrixXi& F);
188
208 size_t refine_sizing_around_worst(double max_energy) override;
209
210 void write_msh_groups(std::string file, const bool write_envelope = true);
211
212 void write_vtu(const std::string& path) const;
213
214public:
221 void compute_winding_numbers(const std::vector<MatrixXd>& Vs, const std::vector<MatrixXi>& Es);
222
227
228 int flood_fill();
229
230protected:
231 void write_smoothing_debug_output(const std::string& path) const override { write_vtu(path); }
232
233 void collapse_pass_begin() override { m_feature_rejects = 0; }
234 void collapse_pass_end(size_t) override
235 {
236 if (const size_t n = m_feature_rejects.load(); n > 0) {
237 logger().info(
238 "[feature] {} collapses refused to keep a polyline endpoint or junction "
239 "within {:.6} of its input position",
240 n,
241 m_envelope_eps);
242 }
243 }
244 bool collapse_before_vertex(size_t v1, size_t v2) override
245 {
246 if (!collapse_breaks_feature(v1, v2)) return true;
247 m_feature_rejects.fetch_add(1, std::memory_order_relaxed);
248 return false;
249 }
250 void collapse_after_vertex(size_t v1, size_t v2) override
251 {
252 if (m_vertex_extra[v2].m_feature_id == NO_FEATURE) {
253 m_vertex_extra[v2].m_feature_id = m_vertex_extra[v1].m_feature_id;
254 }
255 }
256};
257
258
259} // namespace wmtk::components::triwild
Whether a codimension-1 simplex is tracked surface, and which bbox side it lies on.
Definition SurfaceTagAttributes.h:15
What triwild and simwild's 2D mesh share.
Definition TriOptimizerMesh.h:38
AttributeContainerGroup m_vertex_attr_group
What p_vertex_attrs points at, so a derived class can register more.
Definition TriOptimizerMesh.h:95
OptimizerParameters & m_params
Definition TriOptimizerMesh.h:135
Definition TriWildMesh.h:41
std::pair< size_t, size_t > feature_retention(double *worst_ratio=nullptr) const
{feature points still represented within eps, total feature points}.
Definition TriWildMesh.cpp:716
void compute_winding_numbers(const std::vector< MatrixXd > &Vs, const std::vector< MatrixXi > &Es)
Tag every face with the inputs it lies inside, by winding number.
Definition TriWildMesh.cpp:510
void filter_with_input_winding_number()
Remove the faces that lie inside no input (needs compute_winding_numbers).
Definition TriWildMesh.cpp:563
std::atomic< size_t > m_feature_rejects
Collapses refused because they would drop or displace a feature point. Diagnostic.
Definition TriWildMesh.h:110
Parameters & m_tri_params
Definition TriWildMesh.h:74
bool collapse_breaks_feature(const size_t v1_id, const size_t v2_id) const
True iff collapsing v1 into v2 would drop or displace a feature point.
Definition TriWildMesh.cpp:775
std::vector< Vector2d > m_feature_points
Definition TriWildMesh.h:108
double m_feature_eps
Definition TriWildMesh.h:90
void filter_with_flood_fill()
Remove the flood-fill region that dominates the mesh boundary (needs flood_fill).
Definition TriWildMesh.cpp:577
bool smoothing_position_is_allowed(const size_t vid, const Vector2d &p) const override
May vertex vid sit at p?
Definition TriWildMesh.cpp:764
size_t refine_sizing_around_worst(double max_energy) override
The old global sizing-field update (KNN R-ball around every low-quality triangle)....
Definition TriWildMesh.cpp:335
void init_mesh(const MatrixXd &V, const std::vector< Vector2r > &V_rational, const MatrixXi &F, const MatrixXi &E, const std::vector< std::string > &tag_names, const MatrixXd &V_env, const MatrixXi &E_env)
Init mesh from IGL-style matrices.
Definition TriWildMesh.cpp:42
Definition AttributeCollection.hpp:36
double w_amips
Definition OptimizerParameters.h:154
Definition TriOptimizerMesh.h:73
Definition TriOptimizerMesh.h:41
The fields shared with tetwild and simwild live in wmtk::OptimizerParameters.
Definition Parameters.h:10
triwild's per-vertex additions to the shared VertexAttributes.
Definition TriWildMesh.h:51
size_t m_feature_id
Definition TriWildMesh.h:68