32 auto edges = get_edges();
34 auto &eps_h = edges.eps_h;
35 auto &is_converged = edges.is_converged;
37 Tscal local_min_eps_h = -1;
41 for (; iter_h < h_iter_per_subcycles; iter_h++) {
45 local_max_eps_h = shamrock::solvergraph::get_rank_max(eps_h);
47 shamlog_debug_ln(
"Smoothinglength",
"iteration :", iter_h,
"epsmax", local_max_eps_h);
50 if (local_max_eps_h < epsilon_h) {
55 local_min_eps_h = shamrock::solvergraph::get_rank_min(eps_h);
58 bool local_should_rerun_gz = local_min_eps_h < 0;
59 bool local_is_h_below_tol = local_max_eps_h < epsilon_h;
61 bool local_is_converged = local_is_h_below_tol && (!local_should_rerun_gz);
64 = shamalgs::collective::are_all_rank_true(local_is_converged, MPI_COMM_WORLD);
66 if (is_converged.value && print_info) {
68 Tscal min_eps_h = shamalgs::collective::allreduce_min(local_min_eps_h);
69 Tscal max_eps_h = shamalgs::collective::allreduce_max(local_max_eps_h);
73 log +=
"smoothing length iteration converged\n";
74 log += shambase::format(
75 " eps min = {}, max = {}\n iterations = {}", min_eps_h, max_eps_h, iter_h);
77 logger::info_ln(
"Smoothinglength", log);
T & get_check_ref(const std::unique_ptr< T > &ptr, SourceLocation loc=SourceLocation())
Takes a std::unique_ptr and returns a reference to the object it holds. It throws a std::runtime_erro...