7 #include "smith/numerics/nonlinear_convergence.hpp"
12 #include "axom/fmt.hpp"
13 #include "axom/slic.hpp"
19 double residualNorm(
const mfem::Vector& residual, MPI_Comm comm)
22 return mfem::ParNormlp(residual, 2.0, comm);
24 static_cast<void>(comm);
25 return residual.Norml2();
35 std::vector<double> block_norms(residuals.size(), 0.0);
36 for (
size_t i = 0; i < residuals.size(); ++i) {
37 block_norms[i] = residualNorm(residuals[i], comm);
43 const std::vector<double>& block_norms,
49 double global_norm_squared = 0.0;
50 for (
double block_norm : block_norms) {
51 global_norm_squared += block_norm * block_norm;
65 : comm_(comm), abs_tol_(abs_tol), rel_tol_(rel_tol)
78 const mfem::Vector& residual)
const
void reset() const
Reset stored initial residual norms.
ConvergenceStatus evaluate(double tolerance_multiplier, const mfem::Vector &residual) const
Evaluate convergence for the current monolithic residual vector.
void setTolerances(double abs_tol, double rel_tol) const
Set scalar tolerances.
EquationSolverConvergenceManager(MPI_Comm comm, double abs_tol, double rel_tol)
Construct a convergence manager for one nonlinear solver.
Accelerator functionality.
SMITH_HOST_DEVICE auto sqrt(dual< gradient_type > x)
implementation of square root for dual numbers
SMITH_HOST_DEVICE auto max(dual< gradient_type > a, double b)
Implementation of max for dual numbers.
std::vector< double > computeResidualBlockNorms(const std::vector< mfem::Vector > &residuals, MPI_Comm comm)
Compute one L2 norm per residual block.
ConvergenceStatus evaluateResidualConvergence(double tolerance_multiplier, double abs_tol, double rel_tol, const std::vector< double > &block_norms, NonlinearConvergenceContext &context)
Evaluate scalar nonlinear residual convergence.
Detailed status from evaluating nonlinear residual convergence.
double global_norm
Current scalar global residual norm.
bool global_converged
True when the scalar global residual criterion passes.
bool converged
True when the scalar global residual criterion passes.
std::vector< double > block_norms
Residual norms used to form the scalar global norm.
double global_goal
Scalar convergence threshold used for the global check.
Stores initial residual norms used for relative nonlinear convergence checks.
void reset()
Clear all stored initial norms for a new solve. The next convergence evaluation seeds a fresh relativ...
double initial_global_norm
Initial scalar global residual norm for the current solve.