From fe2f12be3d6c9a7f6113b258df1ed43771689c6f Mon Sep 17 00:00:00 2001 From: Pepijn de Vos Date: Mon, 9 Oct 2023 11:15:08 +0200 Subject: [PATCH] move stats here as DEStats --- src/solutions/ode_solutions.jl | 73 ++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/src/solutions/ode_solutions.jl b/src/solutions/ode_solutions.jl index 1b65b8e3a..0335004e3 100644 --- a/src/solutions/ode_solutions.jl +++ b/src/solutions/ode_solutions.jl @@ -1,6 +1,79 @@ """ $(TYPEDEF) +Statistics from the differential equation solver about the solution process. + +## Fields + +- nf: Number of function evaluations. If the differential equation is a split function, + such as a `SplitFunction` for implicit-explicit (IMEX) integration, then `nf` is the + number of function evaluations for the first function (the implicit function) +- nf2: If the differential equation is a split function, such as a `SplitFunction` + for implicit-explicit (IMEX) integration, then `nf2` is the number of function + evaluations for the second function, i.e. the function treated explicitly. Otherwise + it is zero. +- nw: The number of W=I-gamma*J (or W=I/gamma-J) matrices constructed during the solving + process. +- nsolve: The number of linear solves `W\b` required for the integration. +- njacs: Number of Jacobians calculated during the integration. +- nnonliniter: Total number of iterations for the nonlinear solvers. +- nnonlinconvfail: Number of nonlinear solver convergence failures. +- ncondition: Number of calls to the condition function for callbacks. +- naccept: Number of accepted steps. +- nreject: Number of rejected steps. +- maxeig: Maximum eigenvalue over the solution. This is only computed if the + method is an auto-switching algorithm. +""" +mutable struct DEStats + nf::Int + nf2::Int + nw::Int + nsolve::Int + njacs::Int + nnonliniter::Int + nnonlinconvfail::Int + ncondition::Int + naccept::Int + nreject::Int + maxeig::Float64 +end + +DEStats(x::Int = -1) = DEStats(x, x, x, x, x, x, x, x, x, x, 0.0) + +function Base.show(io::IO, s::DEStats) + println(io, summary(s)) + @printf io "%-50s %-d\n" "Number of function 1 evaluations:" s.nf + @printf io "%-50s %-d\n" "Number of function 2 evaluations:" s.nf2 + @printf io "%-50s %-d\n" "Number of W matrix evaluations:" s.nw + @printf io "%-50s %-d\n" "Number of linear solves:" s.nsolve + @printf io "%-50s %-d\n" "Number of Jacobians created:" s.njacs + @printf io "%-50s %-d\n" "Number of nonlinear solver iterations:" s.nnonliniter + @printf io "%-50s %-d\n" "Number of nonlinear solver convergence failures:" s.nnonlinconvfail + @printf io "%-50s %-d\n" "Number of rootfind condition calls:" s.ncondition + @printf io "%-50s %-d\n" "Number of accepted steps:" s.naccept + @printf io "%-50s %-d" "Number of rejected steps:" s.nreject + iszero(s.maxeig) || @printf io "\n%-50s %-d" "Maximum eigenvalue recorded:" s.maxeig +end + +function Base.merge(a::DEStats, b::DEStats) + DEStats( + a.nf + b.nf, + a.nf2 + b.nf2, + a.nw + b.nw, + a.nsolve + b.nsolve, + a.njacs + b.njacs, + a.nnonliniter + b.nnonliniter, + a.nnonlinconvfail + b.nnonlinconvfail, + a.ncondition + b.ncondition, + a.naccept + b.naccept, + a.nreject + b.nreject, + max(a.maxeig, b.maxeig), + ) +end + +""" +$(TYPEDEF) + Representation of the solution to an ordinary differential equation defined by an ODEProblem. ## DESolution Interface