82 nl_solver->minimize(*(solve_data.
nl_problem), reduced_sol);
84 catch (
const std::runtime_error &e)
86 logger().set_level(level_before);
90 logger().set_level(level_before);
95 Eigen::VectorXd sol = solve_data.
nl_problem->reduced_to_full(reduced_sol);
101 const double local_energy_after = solve_data.
nl_problem->value(sol);
102 assert(std::isfinite(local_energy_before()));
103 assert(std::isfinite(local_energy_after));
104 const double abs_diff = local_energy_before() - local_energy_after;
114 const bool accept = abs_diff >= dt_sqr * acceptance_tolerance;
119 static int save_i = 0;
124 if (!is_converged_status(nl_solver->status()))
126 nl_solver->stop_criteria().iterations = 100;
128 const auto level_before =
logger().level();
129 logger().set_level(spdlog::level::warn);
134 nl_solver->minimize(*(solve_data.
nl_problem), reduced_sol);
136 catch (
const std::runtime_error &e)
138 logger().set_level(level_before);
142 logger().set_level(level_before);
147 sol = solve_data.
nl_problem->reduced_to_full(reduced_sol);
150 for (
const auto &[glob_vi, loc_vi] : local_mesh.global_to_local())
152 const auto u = sol.middleRows(this->
dim() * loc_vi, this->
dim());
153 const auto u_old = vertex_attrs[glob_vi].displacement();
154 vertex_attrs[glob_vi].position = vertex_attrs[glob_vi].rest_position + u;
161 static const std::string accept_str =
162 fmt::format(fmt::fg(fmt::terminal_color::green),
"accept");
163 static const std::string reject_str =
164 fmt::format(fmt::fg(fmt::terminal_color::yellow),
"reject");
166 "[{:s}] E0={:<10g} E1={:<10g} (E0-E1)={:<11g} tol={:g} local_ndof={:d} n_iters={:d}",
167 accept ? accept_str : reject_str, local_energy_before(),
168 local_energy_after, abs_diff, dt_sqr * acceptance_tolerance,
169 n_free_dof, nl_solver->current_criteria().iterations);