options.hpp cmath span optional string tuple utility serif/solver/linear/linear.hpp src/include/serif/backend/mfem/solver/admissibility/geometry.hpp src/include/serif/backend/mfem/solver/nonlinear/stellar_problem.hpp src/include/serif/solver/nonlinear/result.hpp src/include/serif/utils/serialize/numerics.hpp src/lib/serif/solver/nonlinear/options.cpp serif::solver::Newton serif::solver::Backtracking serif::solver::MetricEvaluation serif::solver::NormalizedResidualMetric serif::solver::DirectionAssessment serif::solver::TrialAssessment serif::solver::StandardNewton serif::solver::SolverOptions serif serif::solver #pragmaonce #include<cmath> #include<span> #include<optional> #include<string> #include<tuple> #include<utility> #include"serif/solver/linear/linear.hpp" namespaceserif::solver{ structNewton{ doublerelative_tolerance{1.0e-8}; doubleabsolute_tolerance{0.0}; intmaximum_iterations{50}; //InexactNewtonneedsareliabledirection,notanover-solvedearlycorrection. linear::Controllinear_solve{.relative_tolerance=0.03,.maximum_iterations=200}; voidvalidate()const; [[nodiscard]]doubleconvergence_threshold(doubleinitial_norm)const; }; structBacktracking{ doubleinitial_step{1.0}; doublecontraction{0.5}; doublefraction_to_boundary{0.9}; doublesufficient_decrease{1.0e-4}; doubleminimum_step{1.0e-8}; intmaximum_trials{20}; boolgeometry_preflight{true}; voidvalidate()const; }; structMetricEvaluation{ doubleresidual_norm{0.0}; doublemerit{0.0}; [[nodiscard]]boolvalid()constnoexcept{ returnstd::isfinite(residual_norm)&&residual_norm>=0.0&&std::isfinite(merit)&&merit>=0.0; } }; structNormalizedResidualMetric{ [[nodiscard]]MetricEvaluationoperator()(std::span<constdouble>residual)const; }; structDirectionAssessment{ boolusable{true}; std::optional<double>merit_slope; std::stringmessage; }; structTrialAssessment{ boolusable{true}; std::stringmessage; }; structSolveDiagnostics; structStandardNewton{ staticautocomputations(constauto&,constauto&,auto,constauto&){returnstd::pair{std::tuple{},std::tuple{}};} TrialAssessmentinitialize(auto&,auto&,auto&,constauto&){return{};} TrialAssessmentadmissible(auto&,constauto&){return{};} linear::Reportsolve(auto&problem,constauto&,constauto&prepared,constauto&rhs,auto&correction,constauto&options){ returnproblem.solve_linear(prepared,rhs,correction,options); } DirectionAssessmentdirection(auto&,constauto&,constauto&,constauto&,auto&,constauto&){return{};} TrialAssessmenttrial(auto&,constauto&,constauto&,constauto&,double,auto&,auto&,constauto&,double){return{};} voidcontribute_diagnostics(SolveDiagnostics&)const{} }; template<typenameMetric=NormalizedResidualMetric,typenameStrategies=StandardNewton,typenameLinearSolver=linear::FGMRES> structSolverOptions{ Newtonmethod{}; LinearSolverlinear_solver{}; Backtrackingline_search{}; Metricmetric{}; Strategiesstrategies{}; }; [[nodiscard]]doublenext_backtracking_step(doublerejected_step,doubleaccepted_determinant, doublerejected_determinant,boolinverted,constBacktracking&options)noexcept; }