#include "BoundaryConstraint.h" #include "DartConstraint.h" #include "Mesh.h" void BoundaryConstraint::add_to_queue(std::vector> &queue, std::vector &constraints, size_t dart_constraint) { if (UniformDiscretization) { for (size_t dc : DartConstraints) { size_t dart = constraints[dc].dart(); queue.push_back(std::make_unique(dart)); } } else { size_t dart = constraints[dart_constraint].dart(); queue.push_back(std::make_unique(dart)); } } void BoundaryConstraint::refine(Mesh &m, double_t tol) { double_t err_max{DBL_MAX}; while (err_max > tol) { err_max = 0.0; for (size_t i : DartConstraints) { DartConstraint const &dc = m.dart_constraint(i); double_t len_c = ConstraintCurve->length(dc.S0, dc.S1); double_t len_e = m.edge(dc.dart()).length(m); double_t err_i = std::abs(len_c - len_e) / len_c; if (err_i > tol) { m.add_to_queue(std::make_unique(dc.dart())); err_max = std::max(err_max, err_i); } } m.insert_from_queue(); } } void BoundaryConstraint::make_uniform(Mesh &m) { double_t delta_min{DBL_MAX}; for (size_t i : DartConstraints) { DartConstraint const &dc = m.dart_constraint(i); delta_min = std::min(delta_min, std::abs(dc.S1 - dc.S0)); } delta_min *= (1 + FLT_EPSILON); double_t delta_max{DBL_MAX}; while (delta_max > delta_min) { delta_max = delta_min; for(size_t i : DartConstraints) { DartConstraint const &dc = m.dart_constraint(i); double_t delta = std::abs(dc.S1 - dc.S0); if (delta > delta_min) { m.add_to_queue(std::make_unique(dc.dart())); delta_max = std::max(delta_max, delta); } } m.insert_from_queue(); } }