public_contracts.cpp concepts utility serif/types.hpp serif/solver/nonlinear/result.hpp serif/solver/nonlinear/newton.hpp serif/solver/seed/polytrope.hpp #include<concepts> #include<utility> #include"serif/types.hpp" #include"serif/solver/nonlinear/result.hpp" #include"serif/solver/nonlinear/newton.hpp" #include"serif/solver/seed/polytrope.hpp" namespace{ namespacesolver=serif::solver; static_assert(std::same_as<serif::Vector,mfem::Vector>); static_assert(std::same_as<serif::DenseMatrix,mfem::DenseMatrix>); static_assert(std::same_as<serif::SparseMatrix,mfem::SparseMatrix>); static_assert(std::same_as<serif::LinearOperator,mfem::Operator>); structEquationDefinition{}; usingMassModel=decltype(serif::model::make_stellar_model(std::declval<serif::eos::models::Polytrope>(),EquationDefinition{}, std::declval<serif::model::FixedTotalMass>())); usingUnspecifiedMass=decltype(serif::model::make_stellar_model(std::declval<serif::eos::models::Polytrope>(),EquationDefinition{})); template<typenameModel> conceptDefaultRadialSeed=requires(constModel&model){solver::seed::make_polytropic_seed(model);}; static_assert(DefaultRadialSeed<MassModel>); static_assert(!DefaultRadialSeed<UnspecifiedMass>); static_assert(!DefaultRadialSeed<int>); structState{}; structSystem{}; structProblem{ usingVector=serif::Vector; std::expected<std::shared_ptr<constSystem>,std::string>prepare(constState&); }; structInvalidSolve:solver::StandardNewton{ solver::linear::Reportsolve(int); }; structDirectionOnly:solver::StandardNewton{ solver::DirectionAssessmentdirection(auto&,constauto&,constauto&,constauto&,auto&,constauto&){return{};} }; static_assert(solver::detail::NewtonStrategyFor<Problem,State,solver::SolverOptions<>>); static_assert(solver::detail::NewtonStrategyFor<Problem,State,solver::SolverOptions<solver::NormalizedResidualMetric,DirectionOnly>>); static_assert(!solver::detail::NewtonStrategyFor<Problem,State,solver::SolverOptions<solver::NormalizedResidualMetric,InvalidSolve>>); usingResult=solver::SolveResult<State,System>; static_assert(std::same_as<decltype(std::declval<Result&>().state()),constState&>); static_assert(std::same_as<decltype(std::declval<Result&>().system()),conststd::shared_ptr<constSystem>&>); static_assert(std::same_as<decltype(std::declval<Result&>().diagnostics()),constsolver::SolveDiagnostics&>); }