void fc3d_nsgs_initialize_local_solver(SolverPtr* solve, UpdatePtr* update, FreeSolverNSGSPtr* freeSolver, ComputeErrorPtr* computeError, FrictionContactProblem* problem, FrictionContactProblem* localproblem, SolverOptions * options, SolverOptions * localsolver_options) { /** Connect to local solver */ switch (localsolver_options->solverId) { /* Projection */ case SICONOS_FRICTION_3D_ONECONTACT_ProjectionOnConeWithDiagonalization: { *solve = &fc3d_projectionWithDiagonalization_solve; *update = &fc3d_projectionWithDiagonalization_update; *freeSolver = (FreeSolverNSGSPtr)&fc3d_projection_free; *computeError = (ComputeErrorPtr)&fc3d_compute_error; fc3d_projection_initialize(problem, localproblem); break; } case SICONOS_FRICTION_3D_ONECONTACT_ProjectionOnCone: { *solve = &fc3d_projectionOnCone_solve; *update = &fc3d_projection_update; *freeSolver = (FreeSolverNSGSPtr)&fc3d_projection_free; *computeError = (ComputeErrorPtr)&fc3d_compute_error; fc3d_projection_initialize(problem, localproblem); break; } case SICONOS_FRICTION_3D_ONECONTACT_ProjectionOnConeWithLocalIteration: { *solve = &fc3d_projectionOnConeWithLocalIteration_solve; *update = &fc3d_projection_update; *freeSolver = (FreeSolverNSGSPtr)&fc3d_projectionOnConeWithLocalIteration_free; *computeError = (ComputeErrorPtr)&fc3d_compute_error; fc3d_projectionOnConeWithLocalIteration_initialize(problem, localproblem,localsolver_options ); break; } case SICONOS_FRICTION_3D_ONECONTACT_ProjectionOnConeWithRegularization: { *solve = &fc3d_projectionOnCone_solve; *update = &fc3d_projection_update_with_regularization; *freeSolver = (FreeSolverNSGSPtr)&fc3d_projection_with_regularization_free; *computeError = (ComputeErrorPtr)&fc3d_compute_error; fc3d_projection_initialize_with_regularization(problem, localproblem); break; } /* Newton solver (Alart-Curnier) */ case SICONOS_FRICTION_3D_ONECONTACT_NSN: { *solve = &fc3d_onecontact_nonsmooth_Newton_solvers_solve; *update = &fc3d_onecontact_nonsmooth_Newton_AC_update; *freeSolver = (FreeSolverNSGSPtr)&fc3d_onecontact_nonsmooth_Newton_solvers_free; *computeError = (ComputeErrorPtr)&fc3d_compute_error; fc3d_onecontact_nonsmooth_Newton_solvers_initialize(problem, localproblem, localsolver_options); break; } case SICONOS_FRICTION_3D_ONECONTACT_NSN_GP: { *solve = &fc3d_onecontact_nonsmooth_Newton_solvers_solve; *update = &fc3d_onecontact_nonsmooth_Newton_AC_update; *freeSolver = (FreeSolverNSGSPtr)&fc3d_onecontact_nonsmooth_Newton_solvers_free; *computeError = (ComputeErrorPtr)&fc3d_compute_error; fc3d_onecontact_nonsmooth_Newton_solvers_initialize(problem, localproblem, localsolver_options); break; } case SICONOS_FRICTION_3D_ONECONTACT_NSN_GP_HYBRID: { *solve = &fc3d_onecontact_nonsmooth_Newton_solvers_solve; *update = &fc3d_onecontact_nonsmooth_Newton_AC_update; *freeSolver = (FreeSolverNSGSPtr)&fc3d_onecontact_nonsmooth_Newton_solvers_free; *computeError = (ComputeErrorPtr)&fc3d_compute_error; fc3d_onecontact_nonsmooth_Newton_solvers_initialize(problem, localproblem, localsolver_options); break; } /* Newton solver (Glocker-Fischer-Burmeister)*/ case SICONOS_FRICTION_3D_NCPGlockerFBNewton: { *solve = &fc3d_onecontact_nonsmooth_Newton_solvers_solve; *update = &NCPGlocker_update; *freeSolver = (FreeSolverNSGSPtr)&fc3d_onecontact_nonsmooth_Newton_solvers_free; *computeError = (ComputeErrorPtr)&fc3d_compute_error; // *computeError = &fake_compute_error; fc3d_onecontact_nonsmooth_Newton_solvers_initialize(problem, localproblem, localsolver_options); break; } /* Path solver (Glocker Formulation) */ case SICONOS_FRICTION_3D_NCPGlockerFBPATH: { *solve = &fc3d_Path_solve; *freeSolver = (FreeSolverNSGSPtr)&fc3d_Path_free; *update = &NCPGlocker_update; *computeError = (ComputeErrorPtr)&fc3d_compute_error; // *computeError = &fake_compute_error; fc3d_Path_initialize(problem, localproblem, localsolver_options); break; } /* Fixed Point solver (Glocker Formulation) */ case SICONOS_FRICTION_3D_NCPGlockerFBFixedPoint: { *solve = &fc3d_FixedP_solve; *update = &NCPGlocker_update; *freeSolver = (FreeSolverNSGSPtr)&fc3d_FixedP_free; /* *computeError = &fake_compute_error_nsgs; */ *computeError = (ComputeErrorPtr)&fc3d_compute_error; fc3d_FixedP_initialize(problem, localproblem, localsolver_options); break; } /*iparam[4] > 10 are reserved for Tresca resolution */ case SICONOS_FRICTION_3D_ONECONTACT_ProjectionOnCylinder: { *solve = &fc3d_projectionOnCylinder_solve; *update = &fc3d_projectionOnCylinder_update; *freeSolver = (FreeSolverNSGSPtr)&fc3d_projectionOnCylinder_free; *computeError = (ComputeErrorPtr)&fc3d_Tresca_compute_error; fc3d_projectionOnCylinder_initialize(problem, localproblem, options ); break; } /*iparam[4] > 10 are reserved for Tresca resolution */ case SICONOS_FRICTION_3D_ONECONTACT_ProjectionOnCylinderWithLocalIteration: { *solve = &fc3d_projectionOnCylinderWithLocalIteration_solve; *update = &fc3d_projectionOnCylinder_update; *freeSolver = (FreeSolverNSGSPtr)&fc3d_projectionOnCylinderWithLocalIteration_free; *computeError = (ComputeErrorPtr)&fc3d_Tresca_compute_error; fc3d_projectionOnCylinderWithLocalIteration_initialize(problem, localproblem, options, localsolver_options ); break; } case SICONOS_FRICTION_3D_ONECONTACT_QUARTIC: { *solve = &fc3d_unitary_enumerative_solve; *update = &fc3d_nsgs_update; *freeSolver = (FreeSolverNSGSPtr)&fc3d_unitary_enumerative_free; *computeError = (ComputeErrorPtr)&fc3d_compute_error; fc3d_unitary_enumerative_initialize(localproblem); break; } case SICONOS_FRICTION_3D_ONECONTACT_QUARTIC_NU: { *solve = &fc3d_unitary_enumerative_solve; *update = &fc3d_nsgs_update; *freeSolver = (FreeSolverNSGSPtr)&fc3d_unitary_enumerative_free; *computeError = (ComputeErrorPtr)&fc3d_compute_error; fc3d_unitary_enumerative_initialize(localproblem); break; } default: { fprintf(stderr, "Numerics, fc3d_nsgs failed. Unknown internal solver : %s.\n", solver_options_id_to_name(localsolver_options->solverId)); exit(EXIT_FAILURE); } } }
int fc3d_driver(FrictionContactProblem* problem, double *reaction, double *velocity, SolverOptions* options, NumericsOptions* global_options) { if (options == NULL) numericsError("fc3d_driver", "null input for solver and/or global options"); int setnumericsoptions=0; /* Set global options */ if (global_options) { setNumericsOptions(global_options); options->numericsOptions = (NumericsOptions*) malloc(sizeof(NumericsOptions)); options->numericsOptions->verboseMode = global_options->verboseMode; setnumericsoptions=1; } int NoDefaultOptions = options->isSet; /* true(1) if the SolverOptions structure has been filled in else false(0) */ if (!NoDefaultOptions) readSolverOptions(3, options); if (verbose > 0) printSolverOptions(options); /* Solver name */ /*char * name = options->solverName;*/ int info = -1 ; if (problem->dimension != 3) numericsError("fc3d_driver", "Dimension of the problem : problem-> dimension is not compatible or is not set"); /* Check for trivial case */ info = checkTrivialCase(problem, velocity, reaction, options); if (info == 0) goto exit; switch (options->solverId) { /* Non Smooth Gauss Seidel (NSGS) */ case SICONOS_FRICTION_3D_NSGS: { snPrintf(1, options, " ========================== Call NSGS solver for Friction-Contact 3D problem ==========================\n"); fc3d_nsgs(problem, reaction , velocity , &info , options); break; } case SICONOS_FRICTION_3D_NSGSV: { snPrintf(1, options, " ========================== Call NSGSV solver for Friction-Contact 3D problem ==========================\n"); fc3d_nsgs_velocity(problem, reaction , velocity , &info , options); break; } /* Proximal point algorithm */ case SICONOS_FRICTION_3D_PROX: { snPrintf(1, options, " ========================== Call PROX (Proximal Point) solver for Friction-Contact 3D problem ==========================\n"); fc3d_proximal(problem, reaction , velocity , &info , options); break; } /* Tresca Fixed point algorithm */ case SICONOS_FRICTION_3D_TFP: { snPrintf(1, options, " ========================== Call TFP (Tresca Fixed Point) solver for Friction-Contact 3D problem ==========================\n"); fc3d_TrescaFixedPoint(problem, reaction , velocity , &info , options); break; } /* ACLM Fixed point algorithm */ case SICONOS_FRICTION_3D_ACLMFP: { snPrintf(1, options, " ========================== Call ACLM (Acary Cadoux Lemarechal Malick Fixed Point) solver for Friction-Contact 3D problem ==========================\n"); fc3d_ACLMFixedPoint(problem, reaction , velocity , &info , options); break; } /* SOCLCP Fixed point algorithm */ case SICONOS_FRICTION_3D_SOCLCP: { snPrintf(1, options, " ========================== Call SOCLCP solver for Friction-Contact 3D problem (Associated one) ==========================\n"); fc3d_SOCLCP(problem, reaction , velocity , &info , options); break; } /* De Saxce Fixed point algorithm */ case SICONOS_FRICTION_3D_DSFP: { snPrintf(1, options, " ========================== Call DeSaxce Fixed Point (DSFP) solver for Friction-Contact 3D problem ==========================\n"); fc3d_DeSaxceFixedPoint(problem, reaction , velocity , &info , options); break; } /* Fixed point projection algorithm */ case SICONOS_FRICTION_3D_FPP: { snPrintf(1, options, " ========================== Call Fixed Point Projection (FPP) solver for Friction-Contact 3D problem ==========================\n"); fc3d_fixedPointProjection(problem, reaction , velocity , &info , options); break; } /* Extra Gradient algorithm */ case SICONOS_FRICTION_3D_EG: { snPrintf(1, options, " ========================== Call ExtraGradient (EG) solver for Friction-Contact 3D problem ==========================\n"); fc3d_ExtraGradient(problem, reaction , velocity , &info , options); break; } /* VI Fixed Point Projection algorithm */ case SICONOS_FRICTION_3D_VI_FPP: { snPrintf(1, options, " ========================== Call VI_FixedPointProjection (VI_FPP) solver for Friction-Contact 3D problem ==========================\n"); fc3d_VI_FixedPointProjection(problem, reaction , velocity , &info , options); break; } /* VI Extra Gradient algorithm */ case SICONOS_FRICTION_3D_VI_EG: { snPrintf(1, options, " ========================== Call VI_ExtraGradient (VI_EG) solver for Friction-Contact 3D problem ==========================\n"); fc3d_VI_ExtraGradient(problem, reaction , velocity , &info , options); break; } /* Hyperplane Projection algorithm */ case SICONOS_FRICTION_3D_HP: { snPrintf(1, options, " ========================== Call Hyperplane Projection (HP) solver for Friction-Contact 3D problem ==========================\n"); fc3d_HyperplaneProjection(problem, reaction , velocity , &info , options); break; } /* Alart Curnier in local coordinates */ case SICONOS_FRICTION_3D_NSN_AC: { snPrintf(1, options, " ========================== Call Alart Curnier solver for Friction-Contact 3D problem ==========================\n"); if (problem->M->matrix0) { fc3d_nonsmooth_Newton_AlartCurnier(problem, reaction , velocity , &info , options); } else { fc3d_nonsmooth_Newton_AlartCurnier(problem, reaction , velocity , &info , options); } break; } /* Fischer Burmeister in local coordinates */ case SICONOS_FRICTION_3D_NSN_FB: { snPrintf(1, options, " ========================== Call Fischer Burmeister solver for Friction-Contact 3D problem ==========================\n"); fc3d_nonsmooth_Newton_FischerBurmeister(problem, reaction , velocity , &info , options); break; } case SICONOS_FRICTION_3D_NSN_NM: { snPrintf(1, options, " ========================== Call natural map solver for Friction-Contact 3D problem ==========================\n"); fc3d_nonsmooth_Newton_NaturalMap(problem, reaction , velocity , &info , options); break; } case SICONOS_FRICTION_3D_ONECONTACT_QUARTIC_NU: case SICONOS_FRICTION_3D_ONECONTACT_QUARTIC: { snPrintf(1, options, " ========================== Call Quartic solver for Friction-Contact 3D problem ==========================\n"); fc3d_unitary_enumerative(problem, reaction , velocity , &info , options); break; } case SICONOS_FRICTION_3D_ONECONTACT_NSN_AC: case SICONOS_FRICTION_3D_ONECONTACT_NSN_AC_GP: { snPrintf(1, options, " ========================== Call Newton-based solver for one contact Friction-Contact 3D problem ==========================\n"); fc3d_onecontact_nonsmooth_Newton_solvers_initialize(problem, problem, options); info = fc3d_onecontact_nonsmooth_Newton_solvers_solve(problem, reaction , options); break; } case SICONOS_FRICTION_3D_ONECONTACT_ProjectionOnConeWithLocalIteration: { snPrintf(1, options, " ========================== Call Projection on cone solver for one contact Friction-Contact 3D problem ==========================\n"); fc3d_projectionOnConeWithLocalIteration_initialize(problem, problem, options); info = fc3d_projectionOnConeWithLocalIteration_solve(problem, reaction , options); fc3d_projectionOnConeWithLocalIteration_free(problem, problem, options); break; } case SICONOS_FRICTION_3D_GAMS_PATH: { snPrintf(1, options, " ========================== Call PATH solver via GAMS for an AVI Friction-Contact 3D problem ==========================\n"); fc3d_AVI_gams_path(problem, reaction , velocity, &info, options); break; } case SICONOS_FRICTION_3D_GAMS_PATHVI: { snPrintf(1, options, " ========================== Call PATHVI solver via GAMS for an AVI Friction-Contact 3D problem ==========================\n"); fc3d_AVI_gams_pathvi(problem, reaction , velocity, &info, options); break; } case SICONOS_FRICTION_3D_GAMS_LCP_PATH: { snPrintf(1, options, " ========================== Call PATH solver via GAMS for an LCP-based reformulation of the AVI Friction-Contact 3D problem ==========================\n"); fc3d_lcp_gams_path(problem, reaction , velocity, &info, options); break; } case SICONOS_FRICTION_3D_GAMS_LCP_PATHVI: { snPrintf(1, options, " ========================== Call PATHVI solver via GAMS for an LCP-based reformulation of the AVI Friction-Contact 3D problem ==========================\n"); fc3d_lcp_gams_pathvi(problem, reaction , velocity, &info, options); break; } default: { fprintf(stderr, "Numerics, fc3d_driver failed. Unknown solver.\n"); exit(EXIT_FAILURE); } } exit: if (setnumericsoptions) { free(options->numericsOptions); options->numericsOptions = NULL; } return info; }
int fc3d_driver(FrictionContactProblem* problem, double *reaction, double *velocity, SolverOptions* options) { if (options == NULL) numerics_error("fc3d_driver", "null input for solver options"); assert(options->isSet); /* true(1) if the SolverOptions structure has been filled in else false(0) */ if (verbose > 1) solver_options_print(options); int info = -1 ; if (problem->dimension != 3) numerics_error("fc3d_driver", "Dimension of the problem : problem-> dimension is not compatible or is not set"); /* Check for trivial case */ info = checkTrivialCase(problem, velocity, reaction, options); if (info == 0) { /* If a trivial solution is found, we set the number of iterations to 0 and the reached acuracy to 0.0 . Since the indexing of parameters is non uniform, this may have side effects for some solvers. The two main return parameters iparam[7] and dparam[1] have to be defined and protected by means of enum*/ options->iparam[7] = 0; options->dparam[1] = 0.0; goto exit; } switch (options->solverId) { /* Non Smooth Gauss Seidel (NSGS) */ case SICONOS_FRICTION_3D_NSGS: { numerics_printf(" ========================== Call NSGS solver for Friction-Contact 3D problem ==========================\n"); fc3d_nsgs(problem, reaction , velocity , &info , options); break; } case SICONOS_FRICTION_3D_NSGSV: { numerics_printf(" ========================== Call NSGSV solver for Friction-Contact 3D problem ==========================\n"); fc3d_nsgs_velocity(problem, reaction , velocity , &info , options); break; } /* Proximal point algorithm */ case SICONOS_FRICTION_3D_PROX: { numerics_printf(" ========================== Call PROX (Proximal Point) solver for Friction-Contact 3D problem ==========================\n"); fc3d_proximal(problem, reaction , velocity , &info , options); break; } /* Tresca Fixed point algorithm */ case SICONOS_FRICTION_3D_TFP: { numerics_printf(" ========================== Call TFP (Tresca Fixed Point) solver for Friction-Contact 3D problem ==========================\n"); fc3d_TrescaFixedPoint(problem, reaction , velocity , &info , options); break; } /* ACLM Fixed point algorithm */ case SICONOS_FRICTION_3D_ACLMFP: { numerics_printf(" ========================== Call ACLM (Acary Cadoux Lemarechal Malick Fixed Point) solver for Friction-Contact 3D problem ==========================\n"); fc3d_ACLMFixedPoint(problem, reaction , velocity , &info , options); break; } /* SOCLCP Fixed point algorithm */ case SICONOS_FRICTION_3D_SOCLCP: { numerics_printf(" ========================== Call SOCLCP solver for Friction-Contact 3D problem (Associated one) ==========================\n"); fc3d_SOCLCP(problem, reaction , velocity , &info , options); break; } /* De Saxce Fixed point algorithm */ case SICONOS_FRICTION_3D_DSFP: { numerics_printf(" ========================== Call DeSaxce Fixed Point (DSFP) solver for Friction-Contact 3D problem ==========================\n"); fc3d_DeSaxceFixedPoint(problem, reaction , velocity , &info , options); break; } /* Fixed point projection algorithm */ case SICONOS_FRICTION_3D_FPP: { numerics_printf(" ========================== Call Fixed Point Projection (FPP) solver for Friction-Contact 3D problem ==========================\n"); fc3d_fixedPointProjection(problem, reaction , velocity , &info , options); break; } /* Extra Gradient algorithm */ case SICONOS_FRICTION_3D_EG: { numerics_printf(" ========================== Call ExtraGradient (EG) solver for Friction-Contact 3D problem ==========================\n"); fc3d_ExtraGradient(problem, reaction , velocity , &info , options); break; } /* VI Fixed Point Projection algorithm */ case SICONOS_FRICTION_3D_VI_FPP: { numerics_printf(" ========================== Call VI_FixedPointProjection (VI_FPP) solver for Friction-Contact 3D problem ==========================\n"); fc3d_VI_FixedPointProjection(problem, reaction , velocity , &info , options); break; } /* VI Extra Gradient algorithm */ case SICONOS_FRICTION_3D_VI_EG: { numerics_printf(" ========================== Call VI_ExtraGradient (VI_EG) solver for Friction-Contact 3D problem ==========================\n"); fc3d_VI_ExtraGradient(problem, reaction , velocity , &info , options); break; } /* Hyperplane Projection algorithm */ case SICONOS_FRICTION_3D_HP: { numerics_printf(" ========================== Call Hyperplane Projection (HP) solver for Friction-Contact 3D problem ==========================\n"); fc3d_HyperplaneProjection(problem, reaction , velocity , &info , options); break; } /* Alart Curnier in local coordinates */ case SICONOS_FRICTION_3D_NSN_AC: { numerics_printf(" ========================== Call Alart Curnier solver for Friction-Contact 3D problem ==========================\n"); if (problem->M->matrix0) { fc3d_nonsmooth_Newton_AlartCurnier(problem, reaction , velocity , &info , options); } else { fc3d_nonsmooth_Newton_AlartCurnier(problem, reaction , velocity , &info , options); } break; } /* Fischer Burmeister in local coordinates */ case SICONOS_FRICTION_3D_NSN_FB: { numerics_printf(" ========================== Call Fischer Burmeister solver for Friction-Contact 3D problem ==========================\n"); fc3d_nonsmooth_Newton_FischerBurmeister(problem, reaction , velocity , &info , options); break; } case SICONOS_FRICTION_3D_NSN_NM: { numerics_printf(" ========================== Call natural map solver for Friction-Contact 3D problem ==========================\n"); fc3d_nonsmooth_Newton_NaturalMap(problem, reaction , velocity , &info , options); break; } case SICONOS_FRICTION_3D_ONECONTACT_QUARTIC_NU: case SICONOS_FRICTION_3D_ONECONTACT_QUARTIC: { numerics_printf(" ========================== Call Quartic solver for Friction-Contact 3D problem ==========================\n"); fc3d_unitary_enumerative(problem, reaction , velocity , &info , options); break; } case SICONOS_FRICTION_3D_ONECONTACT_NSN: case SICONOS_FRICTION_3D_ONECONTACT_NSN_GP: { numerics_printf(" ========================== Call Newton-based solver for one contact Friction-Contact 3D problem ==========================\n"); fc3d_onecontact_nonsmooth_Newton_solvers_initialize(problem, problem, options); info = fc3d_onecontact_nonsmooth_Newton_solvers_solve(problem, reaction , options); break; } case SICONOS_FRICTION_3D_ONECONTACT_ProjectionOnConeWithLocalIteration: { numerics_printf(" ========================== Call Projection on cone solver for one contact Friction-Contact 3D problem ==========================\n"); fc3d_projectionOnConeWithLocalIteration_initialize(problem, problem, options); info = fc3d_projectionOnConeWithLocalIteration_solve(problem, reaction , options); fc3d_projectionOnConeWithLocalIteration_free(problem, problem, options); break; } case SICONOS_FRICTION_3D_GAMS_PATH: { numerics_printf(" ========================== Call PATH solver via GAMS for an AVI Friction-Contact 3D problem ==========================\n"); fc3d_AVI_gams_path(problem, reaction , velocity, &info, options); break; } case SICONOS_FRICTION_3D_GAMS_PATHVI: { numerics_printf(" ========================== Call PATHVI solver via GAMS for an AVI Friction-Contact 3D problem ==========================\n"); fc3d_AVI_gams_pathvi(problem, reaction , velocity, &info, options); break; } case SICONOS_FRICTION_3D_GAMS_LCP_PATH: { numerics_printf(" ========================== Call PATH solver via GAMS for an LCP-based reformulation of the AVI Friction-Contact 3D problem ==========================\n"); fc3d_lcp_gams_path(problem, reaction , velocity, &info, options); break; } case SICONOS_FRICTION_3D_GAMS_LCP_PATHVI: { numerics_printf(" ========================== Call PATHVI solver via GAMS for an LCP-based reformulation of the AVI Friction-Contact 3D problem ==========================\n"); fc3d_lcp_gams_pathvi(problem, reaction , velocity, &info, options); break; } default: { fprintf(stderr, "Numerics, fc3d_driver failed. Unknown solver.\n"); exit(EXIT_FAILURE); } } exit: return info; }