diff --git a/src/polysolve/linear/Solver.cpp b/src/polysolve/linear/Solver.cpp index 19369c04..9b9bff10 100644 --- a/src/polysolve/linear/Solver.cpp +++ b/src/polysolve/linear/Solver.cpp @@ -47,22 +47,8 @@ namespace polysolve::linear { using polysolve::StiffnessMatrix; - std::unique_ptr Solver::create(const json ¶ms_in, spdlog::logger &logger, const bool strict_validation) + void Solver::patch_input_json(json &rules, json ¶ms, spdlog::logger &logger) { - json params = params_in; // mutable copy - - json rules; - jse::JSE jse; - - jse.strict = strict_validation; - const std::string input_spec = POLYSOLVE_LINEAR_SPEC; - std::ifstream file(input_spec); - - if (file.is_open()) - file >> rules; - else - log_and_throw_error(logger, "unable to open {} rules", input_spec); - // set default wrt availability for (int i = 0; i < rules.size(); i++) { @@ -118,6 +104,25 @@ namespace polysolve::linear params[lin_solver_ptr] = Solver::default_solver(); } } + } + + std::unique_ptr Solver::create(const json ¶ms_in, spdlog::logger &logger, const bool strict_validation) + { + json params = params_in; // mutable copy + + json rules; + jse::JSE jse; + + jse.strict = strict_validation; + const std::string input_spec = POLYSOLVE_LINEAR_SPEC; + std::ifstream file(input_spec); + + if (file.is_open()) + file >> rules; + else + log_and_throw_error(logger, "unable to open {} rules", input_spec); + + patch_input_json(rules, params, logger); const bool valid_input = jse.verify_json(params, rules); diff --git a/src/polysolve/linear/Solver.hpp b/src/polysolve/linear/Solver.hpp index a02c7f28..9b820dd6 100644 --- a/src/polysolve/linear/Solver.hpp +++ b/src/polysolve/linear/Solver.hpp @@ -45,6 +45,17 @@ namespace polysolve::linear // Virtual destructor virtual ~Solver() = default; + // Sets the default paramters to the rules (solver and precond are cmake dependent) + // and selects the correct solver based on params using the fallback or the list of solvers if necessary + static void patch_input_json(json &rules, json ¶ms, spdlog::logger &logger); + + // Static constructor + // + // @param[in] params Parameter of the solver, including name and preconditioner + // @param[in] logger Logger used for error + // @param[in] strict_validation strict validation of the input paraams + // @param[out] a pointer to a linear solver + // static std::unique_ptr create(const json ¶ms, spdlog::logger &logger, const bool strict_validation = true);