void fc3d_nonsmooth_Newton_AlartCurnier2( FrictionContactProblem* problem, double *reaction, double *velocity, int *info, SolverOptions *options) { assert(problem); assert(reaction); assert(velocity); assert(info); assert(options); assert(problem->dimension == 3); assert(options->iparam); assert(options->dparam); assert(problem->q); assert(problem->mu); assert(problem->M); assert(!options->iparam[4]); // only host AlartCurnierParams acparams; switch (options->iparam[10]) { case 0: { acparams.computeACFun3x3 = &computeAlartCurnierSTD; break; } case 1: { acparams.computeACFun3x3 = &computeAlartCurnierJeanMoreau; break; }; case 2: { acparams.computeACFun3x3 = &fc3d_AlartCurnierFunctionGenerated; break; } case 3: { acparams.computeACFun3x3 = &fc3d_AlartCurnierJeanMoreauFunctionGenerated; break; } } fc3d_nonsmooth_Newton_solvers equation; equation.problem = problem; equation.data = (void *) &acparams; equation.function = &nonsmoothEqnAlartCurnierFun; /************************************************************************* * START NEW STUFF */ size_t problemSize = problem->M->size0; size_t _3problemSize = problemSize + problemSize + problemSize; FC3D_Newton_data opaque_data; opaque_data.problem = problem; opaque_data.equation = &equation; opaque_data.rho = (double*)calloc(problemSize, sizeof(double)); for (size_t i = 0; i < problemSize; ++i) opaque_data.rho[i] = 1.; opaque_data.Ax = (double*)calloc(_3problemSize, sizeof(double)); opaque_data.Bx = (double*)calloc(_3problemSize, sizeof(double)); opaque_data.normq = cblas_dnrm2(problemSize, problem->q, 1); opaque_data.AwpB_data_computed = false; functions_LSA functions_AC; init_lsa_functions(&functions_AC, &FC3D_compute_F, &FC3D_compute_F_merit); functions_AC.compute_H = &FC3D_compute_AWpB; functions_AC.compute_error = &FC3D_compute_error; functions_AC.get_set_from_problem_data = NULL; set_lsa_params_data(options, problem->M); newton_LSA_param* params = (newton_LSA_param*) options->solverParameters; params->check_dir_quality = false; options->iparam[SICONOS_IPARAM_LSA_SEARCH_CRITERION] = SICONOS_LSA_GOLDSTEIN; // options->iparam[SICONOS_IPARAM_LSA_SEARCH_CRITERION] = SICONOS_LSA_ARMIJO; /************************************************************************* * END NEW STUFF */ if(options->iparam[SICONOS_FRICTION_3D_NSN_HYBRID_STRATEGY] == SICONOS_FRICTION_3D_NSN_HYBRID_STRATEGY_VI_EG_NSN) { SolverOptions * options_vi_eg =(SolverOptions *)malloc(sizeof(SolverOptions)); fc3d_VI_ExtraGradient_setDefaultSolverOptions(options_vi_eg); options_vi_eg->iparam[0] = 50; options_vi_eg->dparam[0] = sqrt(options->dparam[0]); options_vi_eg->iparam[SICONOS_VI_IPARAM_ERROR_EVALUATION] = SICONOS_VI_ERROR_EVALUATION_LIGHT; fc3d_VI_ExtraGradient(problem, reaction , velocity , info , options_vi_eg); solver_options_delete(options_vi_eg); free(options_vi_eg); newton_LSA(problemSize, reaction, velocity, info, (void *)&opaque_data, options, &functions_AC); } else if (options->iparam[SICONOS_FRICTION_3D_NSN_HYBRID_STRATEGY] == SICONOS_FRICTION_3D_NSN_HYBRID_STRATEGY_NO) { newton_LSA(problemSize, reaction, velocity, info, (void *)&opaque_data, options, &functions_AC); } else { numerics_error("fc3d_nonsmooth_Newton_AlartCurnier","Unknown nsn hybrid solver"); } free(opaque_data.rho); free(opaque_data.Ax); free(opaque_data.Bx); }
int fc3d_setDefaultSolverOptions(SolverOptions* options, int solverId) { solver_options_nullify(options); int info = -1; switch (solverId) { case SICONOS_FRICTION_3D_NSGS: { info = fc3d_nsgs_setDefaultSolverOptions(options); break; } case SICONOS_FRICTION_3D_NSGSV: { info = fc3d_nsgs_velocity_setDefaultSolverOptions(options); break; } case SICONOS_FRICTION_3D_PROX: { info = fc3d_proximal_setDefaultSolverOptions(options); break; } case SICONOS_FRICTION_3D_TFP: { info = fc3d_TrescaFixedPoint_setDefaultSolverOptions(options); break; } case SICONOS_FRICTION_3D_ACLMFP: { info = fc3d_ACLMFixedPoint_setDefaultSolverOptions(options); break; } case SICONOS_FRICTION_3D_SOCLCP: { info = fc3d_SOCLCP_setDefaultSolverOptions(options); break; } case SICONOS_FRICTION_3D_DSFP: { info = fc3d_DeSaxceFixedPoint_setDefaultSolverOptions(options); break; } case SICONOS_FRICTION_3D_FPP: { info = fc3d_fixedPointProjection_setDefaultSolverOptions(options); break; } case SICONOS_FRICTION_3D_EG: { info = fc3d_ExtraGradient_setDefaultSolverOptions(options); break; } case SICONOS_FRICTION_3D_VI_FPP: { info = fc3d_VI_FixedPointProjection_setDefaultSolverOptions(options); break; } case SICONOS_FRICTION_3D_VI_EG: { info = fc3d_VI_ExtraGradient_setDefaultSolverOptions(options); break; } case SICONOS_FRICTION_3D_HP: { info = fc3d_HyperplaneProjection_setDefaultSolverOptions(options); break; } case SICONOS_FRICTION_3D_NSN_AC: { info = fc3d_nonsmooth_Newton_AlartCurnier_setDefaultSolverOptions(options); break; } case SICONOS_FRICTION_3D_NSN_FB: { info = fc3d_nonsmooth_Newton_FischerBurmeister_setDefaultSolverOptions(options); break; } case SICONOS_FRICTION_3D_NSN_NM: { info = fc3d_nonsmooth_Newton_NaturalMap_setDefaultSolverOptions(options); break; } case SICONOS_FRICTION_3D_ONECONTACT_QUARTIC: { info = fc3d_unitary_enumerative_setDefaultSolverOptions(options); break; } case SICONOS_FRICTION_3D_ONECONTACT_QUARTIC_NU: { info = fc3d_unitary_enumerative_setDefaultSolverOptions(options); options->solverId = SICONOS_FRICTION_3D_ONECONTACT_QUARTIC_NU; break; } default: { solver_options_set(options, solverId); } } return info; }
void fc3d_nonsmooth_Newton_AlartCurnier( FrictionContactProblem* problem, double *reaction, double *velocity, int *info, SolverOptions *options) { /* verbose=1; */ assert(problem); assert(reaction); assert(velocity); assert(info); assert(options); assert(problem->dimension == 3); assert(options->iparam); assert(options->dparam); assert(problem->q); assert(problem->mu); assert(problem->M); assert(!options->iparam[4]); // only host AlartCurnierParams acparams; switch (options->iparam[SICONOS_FRICTION_3D_NSN_FORMULATION]) { case 0: { acparams.computeACFun3x3 = &computeAlartCurnierSTD; break; } case 1: { acparams.computeACFun3x3 = &computeAlartCurnierJeanMoreau; break; }; case 2: { acparams.computeACFun3x3 = &fc3d_AlartCurnierFunctionGenerated; break; } case 3: { acparams.computeACFun3x3 = &fc3d_AlartCurnierJeanMoreauFunctionGenerated; break; } } fc3d_nonsmooth_Newton_solvers equation; equation.problem = problem; equation.data = (void *) &acparams; equation.function = &nonsmoothEqnAlartCurnierFun; if(options->iparam[SICONOS_FRICTION_3D_NSN_HYBRID_STRATEGY] == SICONOS_FRICTION_3D_NSN_HYBRID_STRATEGY_VI_EG_NSN) { SolverOptions * options_vi_eg =(SolverOptions *)malloc(sizeof(SolverOptions)); fc3d_VI_ExtraGradient_setDefaultSolverOptions(options_vi_eg); options_vi_eg->iparam[SICONOS_IPARAM_MAX_ITER] = 50; options_vi_eg->dparam[SICONOS_DPARAM_TOL] = sqrt(options->dparam[0]); options_vi_eg->iparam[SICONOS_VI_IPARAM_ERROR_EVALUATION] = SICONOS_VI_ERROR_EVALUATION_LIGHT; fc3d_VI_ExtraGradient(problem, reaction , velocity , info , options_vi_eg); fc3d_nonsmooth_Newton_solvers_solve(&equation, reaction, velocity, info, options); solver_options_delete(options_vi_eg); free(options_vi_eg); } else if (options->iparam[SICONOS_FRICTION_3D_NSN_HYBRID_STRATEGY] == SICONOS_FRICTION_3D_NSN_HYBRID_STRATEGY_NO) { fc3d_nonsmooth_Newton_solvers_solve(&equation, reaction, velocity, info, options); } else { numerics_error("fc3d_nonsmooth_Newton_AlartCurnier","Unknown nsn hybrid solver"); } }