Wildmeshing Toolkit
Loading...
Searching...
No Matches
Parameters.h
1#pragma once
2
3#include <wmtk/OptimizerParameters.h>
4#include <nlohmann/json.hpp>
5#include <wmtk/Types.hpp>
6
7namespace wmtk::components::simwild {
10{
17 {
18 epsr = 2e-3; // tetwild/triwild: 1e-3
19 stop_energy = 10; // tetwild/triwild: 100
20 preserve_topology = true; // tetwild/triwild: false
21 w_envelope = 0; // derived as 1 - w_amips in the mesh constructor
22 }
23
24 std::string output_path;
25
26 // Allow the 3->2 edge swap to operate on surface edges (a surface diagonal
27 // flip) instead of forbidding them outright. Enabled by default; can be
28 // turned off to reproduce the old surface-frozen behavior for A/B testing.
29 bool allow_surface_swap = true;
30 // Expensive debug check: verify the global surface topology signature
31 // (connected components, Euler characteristic, boundary loops) is unchanged
32 // across each swap pass. Off by default (used by tests / debugging).
33 bool check_surface_topology = false;
34
35
36 double epsr_simplify = 2e-4; // relative error bound (wrt diagonal) for simplification
41 double eps_simplify = -1.; // absolute error bound for simplification
42 VectorXd box_min;
43 VectorXd box_max;
44 bool stop_at_float = false;
45
58
59 std::string operation = "remeshing";
60
61 bool skip_simplify = false;
62 bool use_sample_envelope = false;
63 int NUM_THREADS = 0;
64 bool write_vtu = false;
65 bool write_envelope = true;
66
67
68 Parameters(const nlohmann::json& json_params)
69 {
70 output_path = json_params["output"];
71 skip_simplify = json_params["skip_simplify"];
72 use_sample_envelope = json_params["use_sample_envelope"];
73 NUM_THREADS = json_params["num_threads"];
74 write_vtu = json_params["write_vtu"];
75 write_envelope = json_params["write_envelope"];
76
77 epsr = json_params["eps_rel"];
78 eps = json_params["eps"];
79 lr = json_params["length_rel"];
80 l = json_params["length"];
81 stop_energy = json_params["stop_energy"];
82 stop_at_float = json_params["stop_at_float"];
83 preserve_topology = json_params["preserve_topology"];
84 optimize_envelope_around_simplified = json_params["optimize_envelope_around_simplified"];
85
86 epsr_simplify = json_params["eps_simplify_rel"];
87 order2_envelope_ratio = json_params["order2_envelope_ratio"];
88 eps_simplify = json_params["eps_simplify"];
89
90 w_amips = json_params["w_amips"];
91 smoothing_mode = json_params["smoothing_mode"];
92 project_line_search_steps = json_params["project_line_search_steps"];
93 project_line_search_nested_steps = json_params["project_line_search_nested_steps"];
94 num_smoothing_passes = json_params["num_smoothing_passes"];
95 interleaved_smoothing = json_params["interleaved_smoothing"];
96 interleaved_smoothing_passes = json_params["interleaved_smoothing_passes"];
97
98 // Coarsening pass. Implemented on the shared 2D optimizer, so it applies to simwild's
99 // 2D mesh and is inert on its 3D one.
100 coarsen_pass = json_params["coarsen_pass"];
101 coarsen_unbounded = json_params["coarsen_unbounded"];
102 coarsen_local_smoothing_passes = json_params["coarsen_local_smoothing_passes"];
103 coarsen_smooth_ring = json_params["coarsen_smooth_ring"];
104 coarsen_global_smoothing_passes = json_params["coarsen_global_smoothing_passes"];
105 coarsen_max_rounds = json_params["coarsen_max_rounds"];
106 coarsen_max_inner_passes = json_params["coarsen_max_inner_passes"];
107
108 debug_output = json_params["DEBUG_output"];
109 perform_sanity_checks = json_params["DEBUG_sanity_checks"];
110 check_envelope_at_init = json_params["DEBUG_envelope_sanity_check"];
111
112 allow_surface_swap = json_params["allow_surface_swap"];
113 check_surface_topology = json_params["check_surface_topology"];
114
115 // Stuck-element sizing refinement.
116 stuck_refine_stall_eps = json_params["stuck_refine_stall_eps"];
117 stuck_refine_cooldown = json_params["stuck_refine_cooldown"];
118 stuck_refine_num_worst = json_params["stuck_refine_num_worst"];
119 stuck_refine_rings = json_params["stuck_refine_rings"];
120 stuck_refine_factor = json_params["stuck_refine_factor"];
121 stuck_refine_force_split = json_params["stuck_refine_force_split"];
122 stuck_refine_min_scalar = json_params["stuck_refine_min_scalar"];
123 stuck_refine_gradation = json_params["stuck_refine_gradation"];
124
125 // Skip good regions.
126 skip_good_regions = json_params["skip_good_regions"];
127 skip_good_regions_margin = json_params["skip_good_regions_margin"];
128
129 operation = json_params["operation"];
130 }
131
132 void init(const VectorXd& min_, const VectorXd& max_)
133 {
134 box_min = min_;
135 box_max = max_;
136 init_lengths_from_diagonal((box_max - box_min).norm());
137
138 if (eps_simplify > 0) {
139 epsr_simplify = eps_simplify / diag_l;
140 } else {
141 eps_simplify = epsr_simplify * diag_l;
142 }
143
144 l_min = 0.5 * eps;
145 }
146 void init(
147 const std::vector<Vector3d>& vertices,
148 const std::vector<std::array<size_t, 3>>& faces)
149 {
150 Vector3d min_, max_;
151 for (size_t i = 0; i < vertices.size(); i++) {
152 if (i == 0) {
153 min_ = vertices[i];
154 max_ = vertices[i];
155 continue;
156 }
157 for (int j = 0; j < 3; j++) {
158 if (vertices[i][j] < min_[j]) min_[j] = vertices[i][j];
159 if (vertices[i][j] > max_[j]) max_[j] = vertices[i][j];
160 }
161 }
162
163 init(min_, max_);
164 }
165};
166} // namespace wmtk::components::simwild
The parameters tetwild, triwild and simwild all share.
Definition OptimizerParameters.h:28
int project_line_search_nested_steps
Partial-projection bisections tried after it gives up; 0 disables that pass.
Definition OptimizerParameters.h:160
double w_amips
Definition OptimizerParameters.h:154
int coarsen_max_inner_passes
Definition OptimizerParameters.h:297
std::string smoothing_mode
"projected" or "exact"; see SmoothVertexOptions::SmoothingMode.
Definition OptimizerParameters.h:156
bool coarsen_pass
Definition OptimizerParameters.h:190
bool optimize_envelope_around_simplified
Definition OptimizerParameters.h:63
int coarsen_global_smoothing_passes
Definition OptimizerParameters.h:255
int coarsen_max_rounds
Definition OptimizerParameters.h:279
void init_lengths_from_diagonal(const double diag)
Derive the edge-length and envelope quantities from the bounding-box diagonal.
Definition OptimizerParameters.h:309
bool coarsen_unbounded
Definition OptimizerParameters.h:214
int coarsen_local_smoothing_passes
Definition OptimizerParameters.h:232
int project_line_search_steps
Bisections tried before the projected search gives up. See SmoothVertexOptions.
Definition OptimizerParameters.h:158
int coarsen_smooth_ring
Definition OptimizerParameters.h:248
int num_smoothing_passes
Number and placement of smoothing passes in the shared Wild optimization driver.
Definition OptimizerParameters.h:164
The fields shared with tetwild and triwild live in wmtk::OptimizerParameters.
Definition Parameters.h:10
Parameters()
Definition Parameters.h:16
double order2_envelope_ratio
Definition Parameters.h:40
bool check_envelope_at_init
Definition Parameters.h:57