44 using ExprPtr = expression_parser::ExpressionPtr;
50 std::vector<Vector2d> m_V_envelope;
51 std::vector<Vector2i> m_E_envelope;
53 std::vector<std::tuple<ExprPtr, double>> m_sizing_field;
54 std::vector<std::tuple<ExprPtr, double>> m_quality_field;
56 bool m_collapse_check_link_condition =
false;
57 bool m_collapse_check_topology =
false;
58 bool m_collapse_check_manifold =
false;
71 m_envelope_eps = envelope_eps;
72 NUM_THREADS = _num_threads;
74 optimization::deactivate_opt_logger();
79 logger().info(
"w_envelope = {}", we);
97 const MatrixSi& T_tags,
98 const std::vector<std::string>& tag_names);
110 const MatrixSi& T_tags,
111 const std::vector<std::string>& tag_names);
113 void init_surfaces_and_boundaries();
115 void init_envelope(
const MatrixXd& V,
const MatrixXi& F);
117 CellTag string_set_to_cell_tag(
const std::set<std::string>& str_set);
119 void set_sizing_field(
const nlohmann::json& sizing_field_json);
121 void set_quality_field(
const nlohmann::json& quality_field_json);
123 double target_quality(
const size_t tid)
const;
124 double target_quality(
const Tuple& t)
const;
127 double quality_rel(
const size_t tid)
const override;
129 bool check_mesh_quality(
double& max_rel_quality,
const bool verbose =
false)
const;
159 std::vector<size_t> active_vertices()
const override;
175 void write_msh(std::string file,
const bool write_envelope =
true);
177 void write_vtu(
const std::string& path)
const;
178 void write_vtu_with_energies(
const std::string& path)
const;
187 std::shared_ptr<polysolve::nonlinear::Problem> get_envelope_energy(
const Tuple& t)
const;
189 std::vector<std::array<double, 6>> get_amips_assembles(
const Tuple& t)
const;
190 std::shared_ptr<polysolve::nonlinear::Problem> get_amips_energy(
const Tuple& t)
const;
198 double triangle_area(
const size_t fid)
const;
223 std::vector<ConnectedComponent>
find_holes(
const std::vector<CellTag>& tag_in)
const;
242 const std::vector<CellTag>& lcc_tags,
243 const size_t n_lcc = 1);
245 void fill_holes_topo(
246 const std::vector<CellTag>& fill_holes_tags,
247 double threshold = std::numeric_limits<double>::infinity());
249 void seal_connected_components(
250 const std::vector<CellTag>& tag_sets,
251 const std::vector<ConnectedComponent>& components);
253 void tight_seal_topo(
254 const std::vector<std::vector<CellTag>>& tight_seal_tag_sets,
255 double threshold = std::numeric_limits<double>::infinity());
257 void resolve_overlaps(
const std::vector<std::array<ExprPtr, 2>>& intersecting_tags);
259 void replace_tags(
const std::vector<CellTag>& tags_in,
const std::vector<CellTag>& tags_out);
261 void tag_priority(
const std::vector<int64_t>& tags_order);
267 std::function<double(
const Vector2d&)> m_voronoi_split_fn =
nullptr;
268 size_t m_last_split_vertex = 0;
272 double optimization_stop_metric()
const override {
return 1.; }
273 bool optimization_stop_at_float()
const override {
return m_sim_params.stop_at_float; }
275 void write_smoothing_debug_output(
const std::string& path)
const override { write_vtu(path); }
277 bool collapse_quality_allowed(
size_t v1,
size_t fid,
double q,
double ring_max)
const override;
278 bool split_adjust_position(
size_t v_new,
const std::vector<Tuple>& children)
override;
279 void split_after_vertex(
size_t v_new)
override { m_last_split_vertex = v_new; }