84 double cell_quality(
const size_t tid)
const override {
return m_tet_attribute[tid].m_quality; }
85 void set_cell_quality(
const size_t tid,
const double q)
override
87 m_tet_attribute[tid].m_quality = q;
89 bool allow_surface_swap()
const override {
return m_tet_params.allow_surface_swap; }
90 bool check_surface_topology()
const override {
return m_tet_params.check_surface_topology; }
93 m_vertex_extra[vid].m_is_on_open_boundary = is_open_boundary;
97 if (edge_length <= 0 || !m_vertex_extra[v1].m_is_on_open_boundary)
return true;
98 return m_vertex_extra[v2].m_is_on_open_boundary ||
101 bool collapse_is_order_2_edge(
const std::array<size_t, 2>& e)
override
105 bool collapse_after_connectivity(
108 const std::vector<std::array<size_t, 2>>&)
override
110 m_vertex_extra[v2].m_is_on_open_boundary =
111 m_vertex_extra[v1].m_is_on_open_boundary || m_vertex_extra[v2].m_is_on_open_boundary;
114 void collapse_after_vertex(
size_t,
size_t v2)
override
117 m_vertex_extra[v2].m_is_on_open_boundary =
false;
124 Parameters& _m_params,
125 std::shared_ptr<SampleEnvelope> _m_envelope,
126 int _num_threads = 1)
127 : wmtk::TetOptimizerMesh(_m_params, std::move(_m_envelope))
131 NUM_THREADS = _num_threads;
132 p_tet_attrs = &m_tet_attribute;
133 m_collapse_check_link_condition =
false;
134 m_collapse_check_manifold =
false;
136 optimization::deactivate_opt_logger();
144 void create_mesh_attributes(
145 const std::vector<VertexAttributes>& _vertex_attribute,
146 const std::vector<TetAttributes>& _tet_attribute)
148 const size_t n_tet = _tet_attribute.size();
149 m_vertex_attribute.resize(_vertex_attribute.size());
152 m_vertex_extra.resize(_vertex_attribute.size());
153 m_face_attribute.resize(4 * n_tet);
154 m_tet_attribute.resize(n_tet);
159 for (
size_t i = 0; i < _vertex_attribute.size(); i++)
160 m_vertex_attribute[i] = _vertex_attribute[i];
171 const size_t tcap = std::max(n_tet, m_tet_attribute.size());
172 m_tet_attribute.m_attributes = std::vector<TetAttributes>(tcap);
173 for (
size_t i = 0; i < n_tet; i++) m_tet_attribute[i] = _tet_attribute[i];
174 for (
size_t i = 0; i < n_tet; i++)
180 void output_mesh(std::string file);
208 void compute_winding_number(
209 const std::vector<Tuple>& tets,
210 const Eigen::MatrixXd& barycenters,
211 const std::vector<Vector3d>& vertices = {},
212 const std::vector<std::array<size_t, 3>>& faces = {});
216 void compute_winding_numbers(
217 const std::vector<std::string>& input_paths,
218 const std::vector<Tuple>& tets,
219 const Eigen::MatrixXd& barycenters,
220 const std::vector<Vector3d>& in_vertices = {},
221 const std::vector<std::array<size_t, 3>>& in_faces = {});
223 void filter_with_input_surface_winding_number();
224 void filter_with_tracked_surface_winding_number();
225 void filter_with_flood_fill();
229 std::atomic<int> cnt_split = 0, cnt_collapse = 0;
240 std::vector<std::array<size_t, 3>> old_face_vids;
243 triangle_insertion_local_cache;
254 const std::vector<Vector3d>& vertices,
255 const std::vector<std::array<size_t, 3>>& faces,
256 std::vector<Vector3r>& v_rational,
257 std::vector<std::array<size_t, 3>>& facets_after,
258 std::vector<bool>& is_v_on_input,
259 std::vector<std::array<size_t, 4>>& tets_after,
260 std::vector<bool>& tet_face_on_input_surface);
262 void init_from_Volumeremesher(
263 const std::vector<Vector3r>& v_rational,
264 const std::vector<std::array<size_t, 3>>& facets,
265 const std::vector<bool>& is_v_on_input,
266 const std::vector<std::array<size_t, 4>>& tets,
267 const std::vector<bool>& tet_face_on_input_surface);
269 void init_from_file(std::string input_dir);
287 void find_open_boundary();
305 void save_paraview(
const std::string& path,
const bool use_hdf5);
306 void write_optimization_debug_output(
const std::string& path)
override
308 save_paraview(path,
false);
310 void optimization_sanity_checks_extra()
override;
313 void init_sizing_field();
325 VectorXd t_winding_number_input;
326 VectorXd t_winding_number_tracked;
327 MatrixXd t_winding_number_per_input;
void insertion_by_volumeremesher(const std::vector< Vector3d > &vertices, const std::vector< std::array< size_t, 3 > > &faces, std::vector< Vector3r > &v_rational, std::vector< std::array< size_t, 3 > > &facets_after, std::vector< bool > &is_v_on_input, std::vector< std::array< size_t, 4 > > &tets_after, std::vector< bool > &tet_face_on_input_surface)
Conformally insert the input surface into a background tet mesh, via the exact arrangement (vol_rem::...
Definition VolumemesherInsertion.cpp:41