void fc3d_nonsmooth_Newton_FischerBurmeister( 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(problem->M->matrix0 || problem->M->matrix1); assert(!options->iparam[4]); // only host FischerBurmeisterParams acparams; switch (options->iparam[10]) { case 0: { acparams.computeACFun3x3 = &fc3d_FischerBurmeisterFunctionGenerated; break; } } fc3d_nonsmooth_Newton_solvers equation; equation.problem = problem; equation.data = (void *) &acparams; equation.function = &nonsmoothEqnFischerBurmeisterFun; fc3d_nonsmooth_Newton_solvers_solve(&equation, reaction, velocity, info, options); }
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"); } }