Adding a new solver in numerics#
A solver must be associated to a problem formulation.
Write the corresponding documentation in :
docs/sphinx/users_guide/<formulation>.rst: describe solver and all its parameters
Choose an id and complete the corresponding enum:
id must be: SICONOS_<formulation>_<solver_name> (all upper-case), e.g. SICONOS_LCP_ENUM.
in <formulation>_cst.h, append solver id to SICONOS_<formulation>_SOLVER enum.
Write a driver function for the solver, named <formulation>_<solver_name> in <formulation>_<solver_name>.c
void <formulation>_<solver_name>(<NonSmooth problem type>*problem, double * unknonw_1, ..., int * info, SolverOptions* options)
If the solver needs some specific values for iparam and dparam, write <formulation>_<solver_name>_set_default function in <formulation>_<solver_name>.c file
This function must set all solver specific values of iparam and dparam. e.g. :
void lcp_lexicolemke_set_default(SolverOptions* options) { options->iparam[SICONOS_LCP_IPARAM_PIVOTING_METHOD_TYPE] = SICONOS_LCP_PIVOT_LEMKE; }
Use enum values for all indices in iparam and dparam (if required, create or append some new value in <formulation>_cst.h variables).
Add a case in solver_options_create function (SolverOptions.c) to deal with the minimal setup for the solver:
select default values for tolerance and maxiter and add a line to call
solver_options_initialize(options, solverId, iter_max, tol)
and a line to call <formulation>_<solver_name>_set_default(options) if (and only if) some specific values are required.
// Use default setup :
int id = SICONOS_LCP_ENUM
SolverOptions * options = solver_options_create(id);
// optional : set parameters
options->iparam[SICONOS_LCP_IPARAM_ENUM_USE_DGELS] = 1;
// ...
// call driver
lcp_enum(problem, z, w, info, options);
// ...
// clear memory
solver_options_delete(&options);