Smith  0.1
Smith is an implicit thermal structural mechanics simulation code.
nonlinear_convergence.hpp
1 // Copyright (c) Lawrence Livermore National Security, LLC and
2 // other Smith Project Developers. See the top-level LICENSE file for
3 // details.
4 //
5 // SPDX-License-Identifier: (BSD-3-Clause)
6 
7 #pragma once
8 
9 #include <vector>
10 
11 #include "mpi.h"
12 #include "mfem.hpp"
13 
14 namespace smith {
15 
18  bool global_converged = false;
19  bool converged = false;
20  double global_norm = 0.0;
21  double global_goal = 0.0;
22  std::vector<double> block_norms = {};
23 };
24 
27  double initial_global_norm = -1.0;
28 
31  void reset();
32 };
33 
38 std::vector<double> computeResidualBlockNorms(const std::vector<mfem::Vector>& residuals, MPI_Comm comm);
39 
47 ConvergenceStatus evaluateResidualConvergence(double tolerance_multiplier, double abs_tol, double rel_tol,
48  const std::vector<double>& block_norms,
50 
53  public:
58  EquationSolverConvergenceManager(MPI_Comm comm, double abs_tol, double rel_tol);
59 
61  void reset() const;
62 
64  void setTolerances(double abs_tol, double rel_tol) const;
65 
67  ConvergenceStatus evaluate(double tolerance_multiplier, const mfem::Vector& residual) const;
68 
69  private:
70  MPI_Comm comm_;
71  mutable double abs_tol_;
72  mutable double rel_tol_;
73  mutable NonlinearConvergenceContext context_ = {};
74 };
75 
78  public:
79  virtual ~ConvergenceManagedNonlinearSolver() = default;
80 
82  virtual void setConvergenceManager(std::shared_ptr<EquationSolverConvergenceManager> convergence_manager) = 0;
83 };
84 
85 } // namespace smith
Small interface for nonlinear solvers that can accept Smith-managed convergence state.
virtual void setConvergenceManager(std::shared_ptr< EquationSolverConvergenceManager > convergence_manager)=0
Attach the shared convergence manager used to evaluate nonlinear stopping criteria.
Owns nonlinear convergence state for an inner EquationSolver solve.
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.
Definition: smith.cpp:36
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.