diff --git a/src/mesh/MeshSmootherEscobar.cpp b/src/mesh/MeshSmootherEscobar.cpp index eb54ae8fd5e5ba5432e6b0e5bfa88e799d1e4bac..5f608eb2e668d4a7c0d6914d40ca813c589fde69 100644 --- a/src/mesh/MeshSmootherEscobar.cpp +++ b/src/mesh/MeshSmootherEscobar.cpp @@ -263,8 +263,8 @@ class MeshSmootherEscobarHandler::MeshSmootherEscobar if (current_sigma_min < sigma_min) { sigma_min = current_sigma_min; delta = (sigma_min < eps) - ? std::max(std::sqrt(eps * (eps - sigma_min)), std::sqrt(eps) * std::abs(sigma_min)) - : 0; + ? std::max(std::sqrt(eps * (eps - sigma_min)), std::sqrt(eps) * std::abs(sigma_min)) + : 0; } } @@ -460,7 +460,7 @@ class MeshSmootherEscobarHandler::MeshSmootherEscobar void _getNewPositions(const NodeValue<const Rd>& old_xr, NodeValue<Rd>& new_xr) const { - constexpr bool multi_connection = true; + constexpr bool multi_connection = false; const ConnectivityType& connectivity = m_given_mesh.connectivity(); @@ -479,7 +479,9 @@ class MeshSmootherEscobarHandler::MeshSmootherEscobar constexpr double eps = 1E-14; quality.fill(2); - auto smooth = [=](const NodeId node_id, TinyVector<Dimension>& x) -> double { + size_t maxiter = 0; + + auto smooth = [=, &maxiter](const NodeId node_id, TinyVector<Dimension>& x) -> double { const bool print = (node_id == 4); auto cell_list = node_to_cell_matrix[node_id]; @@ -513,7 +515,11 @@ class MeshSmootherEscobarHandler::MeshSmootherEscobar std::cout.precision(15); - for (size_t i_iter = 0; i_iter < 1; ++i_iter) { + for (size_t i_iter = 0; i_iter < 5; ++i_iter) { + double sigma_min = std::numeric_limits<double>::max(); + delta = sigma_min; + + maxiter = std::max(i_iter + 1, maxiter); if (print) { std::cout << "------------------------------\n"; std::cout << "iter = " << i_iter << '\n'; @@ -554,7 +560,7 @@ class MeshSmootherEscobarHandler::MeshSmootherEscobar } { - double current_sigma_min = min(sigma_list); + double current_sigma_min = std::min(min(sigma_list), delta); if constexpr (multi_connection) { size_t nb_medium_range_simplices = 0; @@ -633,8 +639,8 @@ class MeshSmootherEscobarHandler::MeshSmootherEscobar if (current_sigma_min < sigma_min) { sigma_min = current_sigma_min; delta = (sigma_min < eps) - ? std::max(std::sqrt(eps * (eps - sigma_min)), std::sqrt(eps) * std::abs(sigma_min)) - : 0; + ? std::max(std::sqrt(eps * (eps - sigma_min)), std::sqrt(eps) * std::abs(sigma_min)) + : 0; } if (print) { @@ -857,19 +863,26 @@ class MeshSmootherEscobarHandler::MeshSmootherEscobar TinyVector<Dimension> mr_sigma_gradient{trace(mr_Sigma * mr_S_gradient[0]), // trace(mr_Sigma * mr_S_gradient[1])}; - const std::array<TinyMatrix<Dimension>, Dimension> // - mr_Sigma_gradient{TinyMatrix<Dimension>{0, +1, // - 0, -1}, - TinyMatrix<Dimension>{-mr_inv_sin_alpha, -mr_inv_tan_alpha, // - +mr_inv_sin_alpha, +mr_inv_tan_alpha}}; + const std::array<TinyMatrix<Dimension>, Dimension> // + mr_Sigma_gradient{TinyMatrix<Dimension>{+0, (1 - mr_cos_alpha) / mr_sin_alpha, // + +0, -1}, + TinyMatrix<Dimension>{(mr_cos_alpha - 1) / mr_sin_alpha, +0, // + +1, +0}}; if (print) { std::cout << "=== MC triangle 2 ===\n"; std::cout << " A = " << mr_A << '\n'; std::cout << " W = " << mr_W << '\n'; std::cout << " inv(W) = " << mr_inv_W << '\n'; + + std::cout << " A * inv(W) = " << mr_A * mr_inv_W << '\n'; + std::cout << " mr_S = " << mr_S << '\n'; std::cout << " mr_Sigma = " << mr_Sigma << '\n'; + + std::cout << " mr_S_gradient = " << mr_S_gradient[0] << " || " << mr_S_gradient[1] << '\n'; + std::cout << " mr_Sigma_gradient = " << mr_Sigma_gradient[0] << " || " << mr_Sigma_gradient[1] + << '\n'; } escobar(mr_sigma, mr_S, mr_sigma_gradient, mr_S_gradient, mr_Sigma_gradient, f, f_gradient, f_hessian); @@ -897,19 +910,24 @@ class MeshSmootherEscobarHandler::MeshSmootherEscobar const double delta_x_norm = l2Norm(delta_x_candidate); - double factor = 1; - if (delta_x_norm > 0.3 * max_edge_lenght) { - factor = (0.3 * max_edge_lenght / delta_x_norm); - } - x += factor * delta_x_candidate; - if (print) { std::cout << "==============\n"; + std::cout << "i_iter = " << i_iter << '\n'; std::cout << "f_gradient = " << f_gradient << '\n'; std::cout << "f_hessian = " << f_hessian << '\n'; std::cout << "inv(f_hes) = " << inverse(f_hessian) << '\n'; + std::cout << "delta_x_candidate= " << delta_x_candidate << '\n'; + } + + double factor = 1; + if (delta_x_norm > 0.2 * max_edge_lenght) { + factor *= (0.2 * max_edge_lenght / delta_x_norm); + } + x += factor * delta_x_candidate; + + if (print) { std::cout << "factor = " << factor << '\n'; - std::cout << "delta_x= " << delta_x_candidate << '\n'; + std::cout << "delta_x = " << factor * delta_x_candidate << '\n'; } if (l2Norm(f_gradient) < 1E-12) { break; @@ -940,6 +958,7 @@ class MeshSmootherEscobarHandler::MeshSmootherEscobar } } std::cout << "nb smoothed = " << count << '\n'; + std::cout << "maxiter = " << maxiter << '\n'; } else { throw NotImplementedError("Dimension != 2"); } @@ -964,7 +983,7 @@ class MeshSmootherEscobarHandler::MeshSmootherEscobar if (nb_non_convex_cells > 0) { m_is_smoothed_node = _getSmoothedNode(non_convex_cell_tag, m_is_fixed_node); } - } while ((nb_non_convex_cells > 0) and (i_convexify < 10)); + } while ((nb_non_convex_cells > 0) and (i_convexify < 0)); return std::make_shared<MeshType>(m_given_mesh.shared_connectivity(), xr); }