int fc3d_Panagiotopoulos_FixedPoint_setDefaultSolverOptions(SolverOptions* options) { numerics_printf("fc3d_Panagiotopoulos_FixedPoint_setDefaultSolverOptions", "set default options"); options->solverId = SICONOS_FRICTION_3D_PFP; options->numberOfInternalSolvers = 1; options->isSet = 1; options->filterOn = 1; options->iSize = 8; options->dSize = 8; options->iparam = (int *)calloc(options->iSize, sizeof(int)); options->dparam = (double *)calloc(options->dSize, sizeof(double)); solver_options_nullify(options); options->iparam[SICONOS_IPARAM_MAX_ITER] = 1000; options->iparam[SICONOS_FRICTION_3D_IPARAM_INTERNAL_ERROR_STRATEGY] = SICONOS_FRICTION_3D_INTERNAL_ERROR_STRATEGY_ADAPTIVE; options->dparam[SICONOS_DPARAM_TOL] = 1e-4; options->dparam[SICONOS_FRICTION_3D_DPARAM_INTERNAL_ERROR_RATIO] =10.0; options->numberOfInternalSolvers=2; options->internalSolvers = (SolverOptions *)malloc(options->numberOfInternalSolvers*sizeof(SolverOptions)); linearComplementarity_pgs_setDefaultSolverOptions(&options->internalSolvers[0]); options->internalSolvers[0].iparam[SICONOS_IPARAM_MAX_ITER] =1000; convexQP_VI_solver_setDefaultSolverOptions(&options->internalSolvers[1]); options->internalSolvers[1].iparam[SICONOS_IPARAM_MAX_ITER] =1000; /* convexQP_ProjectedGradient_setDefaultSolverOptions(&options->internalSolvers[1]); */ /* options->internalSolvers[1].iparam[SICONOS_IPARAM_MAX_ITER] =1000; */ return 0; }
int soclcp_driver(SecondOrderConeLinearComplementarityProblem* problem, double *r, double *v, SolverOptions* options) { if(options == NULL) numerics_error("soclcp_driver", "null input for solver and/or global options"); assert(options->isSet); if(verbose > 0) solver_options_print(options); /* Solver name */ /*const char* const name = options->solverName;*/ int info = -1 ; /* Check for trivial case */ info = soclcp_checkTrivialCase(problem, v, r, options); if(info == 0) return info; switch(options->solverId) { /* Non Smooth Gauss Seidel (NSGS) */ case SICONOS_SOCLCP_NSGS: { numerics_printf(" ========================== Call NSGS solver for Second Order Cone LCP problem ==========================\n"); soclcp_nsgs(problem, r , v , &info , options); break; } /* case SICONOS_SOCLCP_NSGSV: */ /* { */ /* numerics_printf(numerics_printf(" ========================== Call NSGSV solver for Second Order Cone LCP problem ==========================\n"); */ /* soclcp_nsgs_v(problem, r , v , &info , options); */ /* break; */ /* } */ /* /\* Proximal point algorithm *\/ */ /* case SICONOS_SOCLCP_PROX: */ /* { */ /* numerics_printf(numerics_printf(" ========================== Call PROX (Proximal Point) solver for Second Order Cone LCP problem ==========================\n"); */ /* soclcp_proximal(problem, r , v , &info , options); */ /* break; */ /* } */ /* /\* Tresca Fixed point algorithm *\/ */ /* case SICONOS_SOCLCP_TFP: */ /* { */ /* numerics_printf(" ========================== Call TFP (Tresca Fixed Point) solver for Second Order Cone LCP problem ==========================\n"); */ /* soclcp_TrescaFixedPoint(problem, r , v , &info , options); */ /* break; */ /* } */ case SICONOS_SOCLCP_VI_FPP: { numerics_printf(" ========================== Call VI_FixedPointProjection (VI_FPP) solver for Second Order Cone LCP problem ==========================\n"); soclcp_VI_FixedPointProjection(problem, r , v , &info , options); break; } /* VI Extra Gradient algorithm */ case SICONOS_SOCLCP_VI_EG: { numerics_printf(" ========================== Call VI_ExtraGradient (VI_EG) solver for Second Order Cone LCP problem ==========================\n"); soclcp_VI_ExtraGradient(problem, r , v , &info , options); break; } /* /\* Hyperplane Projection algorithm *\/ */ /* case SICONOS_SOCLCP_HP: */ /* { */ /* numerics_printf(" ========================== Call Hyperplane Projection (HP) solver for Second Order Cone LCP problem ==========================\n"); */ /* soclcp_HyperplaneProjection(problem, r , v , &info , options); */ /* break; */ /* } */ /* /\* Alart Curnier in local coordinates *\/ */ /* case SICONOS_SOCLCP_NSN_AC: */ /* { */ /* numerics_printf(" ========================== Call Alart Curnier solver for Second Order Cone LCP problem ==========================\n"); */ /* if (problem->M->matrix0) */ /* { */ /* soclcp_nonsmooth_Newton_AlartCurnier(problem, r , v , &info , options); */ /* } */ /* else */ /* { */ /* soclcp_nonsmooth_Newton_AlartCurnier(problem, r , v , &info , options); */ /* } */ /* break; */ /* } */ /* /\* Fischer Burmeister in local coordinates *\/ */ /* case SICONOS_SOCLCP_NSN_FB: */ /* { */ /* numerics_printf(" ========================== Call Fischer Burmeister solver for Second Order Cone LCP problem ==========================\n"); */ /* soclcp_nonsmooth_Newton_FischerBurmeister(problem, r , v , &info , options); */ /* break; */ /* } */ /* case SICONOS_SOCLCP_QUARTIC_NU: */ /* case SICONOS_SOCLCP_QUARTIC: */ /* { */ /* numerics_printf(" ========================== Call Quartic solver for Second Order Cone LCP problem ==========================\n"); */ /* soclcp_unitary_enumerative(problem, r , v , &info , options); */ /* break; */ /* } */ /* case SICONOS_SOCLCP_AlartCurnierNewton: */ /* case SICONOS_SOCLCP_DampedAlartCurnierNewton: */ /* { */ /* numerics_printf(" ========================== Call Quartic solver for Second Order Cone LCP problem ==========================\n"); */ /* info =soclcp_Newton_solve(problem, r , options); */ /* break; */ /* } */ default: { fprintf(stderr, "Numerics, SecondOrderConeLinearComplementarity_driver failed. Unknown solver.\n"); exit(EXIT_FAILURE); } } return info; }
static void fc3d_AC_initialize(FrictionContactProblem* problem, FrictionContactProblem* localproblem, SolverOptions * options) { /** In initialize, these operators are "connected" to their corresponding static variables, * that will be used to build local problem for each considered contact. * Local problem is built during call to update (which depends on the storage type for M). */ DEBUG_PRINTF("fc3d_AC_initialize starts with options->iparam[10] = %i\n", options->iparam[SICONOS_FRICTION_3D_NSN_FORMULATION]); if (options->iparam[SICONOS_FRICTION_3D_NSN_FORMULATION] == SICONOS_FRICTION_3D_NSN_FORMULATION_ALARTCURNIER_STD ) { Function = &(computeAlartCurnierSTD); } else if (options->iparam[SICONOS_FRICTION_3D_NSN_FORMULATION] == SICONOS_FRICTION_3D_NSN_FORMULATION_JEANMOREAU_STD ) { Function = &(computeAlartCurnierJeanMoreau); } else if (options->iparam[SICONOS_FRICTION_3D_NSN_FORMULATION] == SICONOS_FRICTION_3D_NSN_FORMULATION_ALARTCURNIER_GENERATED ) { Function = &(fc3d_AlartCurnierFunctionGenerated); } else if (options->iparam[SICONOS_FRICTION_3D_NSN_FORMULATION] == SICONOS_FRICTION_3D_NSN_FORMULATION_JEANMOREAU_GENERATED ) { Function = &fc3d_AlartCurnierJeanMoreauFunctionGenerated;; } else if (options->iparam[SICONOS_FRICTION_3D_NSN_FORMULATION] == SICONOS_FRICTION_3D_NSN_FORMULATION_NULL) { Function = NULL; } /* Compute and store default value of rho value */ int nc = problem->numberOfContacts; double avg_rho[3] = {0.0, 0.0, 0.0}; if (options->solverId == SICONOS_FRICTION_3D_ONECONTACT_NSN || options->solverId == SICONOS_FRICTION_3D_ONECONTACT_NSN_GP) { if (!options->dWork || options->dWorkSize < 3*nc) { options->dWork = (double *)realloc(options->dWork, 3*nc * sizeof(double)); options->dWorkSize = 3*nc ; } } else if (options->solverId == SICONOS_FRICTION_3D_ONECONTACT_NSN_GP_HYBRID) { if (!options->dWork || options->dWorkSize < 4*nc) { options->dWork = (double *)realloc(options->dWork, 4*nc * sizeof(double)); options->dWorkSize = 4*nc ; } } double * rho; for (int contact =0; contact <nc ; contact++) { if (options->solverId == SICONOS_FRICTION_3D_ONECONTACT_NSN || options->solverId == SICONOS_FRICTION_3D_ONECONTACT_NSN_GP) { rho = &options->dWork[3*contact]; } else if (options->solverId == SICONOS_FRICTION_3D_ONECONTACT_NSN_GP_HYBRID) { options->dWork[contact] = 1.0; // for PLI algorithm. rho = &options->dWork[3*contact+nc]; } numerics_printf("fc3d_AC_initialize "" compute rho for contact = %i",contact); if (options->iparam[SICONOS_FRICTION_3D_NSN_RHO_STRATEGY] == SICONOS_FRICTION_3D_NSN_FORMULATION_RHO_STRATEGY_SPLIT_SPECTRAL_NORM_COND) { fc3d_local_problem_fill_M(problem, localproblem, contact); compute_rho_split_spectral_norm_cond(localproblem, rho); } else if (options->iparam[SICONOS_FRICTION_3D_NSN_RHO_STRATEGY] == SICONOS_FRICTION_3D_NSN_FORMULATION_RHO_STRATEGY_SPLIT_SPECTRAL_NORM) { fc3d_local_problem_fill_M(problem, localproblem, contact); compute_rho_split_spectral_norm(localproblem, rho); } else if (options->iparam[SICONOS_FRICTION_3D_NSN_RHO_STRATEGY] == SICONOS_FRICTION_3D_NSN_FORMULATION_RHO_STRATEGY_SPECTRAL_NORM) { fc3d_local_problem_fill_M(problem, localproblem, contact); compute_rho_spectral_norm(localproblem, rho); } else if (options->iparam[SICONOS_FRICTION_3D_NSN_RHO_STRATEGY] == SICONOS_FRICTION_3D_NSN_FORMULATION_RHO_STRATEGY_CONSTANT) { rho[0]=options->dparam[SICONOS_FRICTION_3D_NSN_RHO]; rho[1]=options->dparam[SICONOS_FRICTION_3D_NSN_RHO]; rho[2]=options->dparam[SICONOS_FRICTION_3D_NSN_RHO]; } else if (options->iparam[SICONOS_FRICTION_3D_NSN_RHO_STRATEGY] == SICONOS_FRICTION_3D_NSN_FORMULATION_RHO_STRATEGY_ADAPTIVE) { numerics_error("fc3d_AC_initialize", "Adaptive strategy for computing rho not yet implemented"); } else numerics_error("fc3d_AC_initialize", "unknown strategy for computing rho"); if (verbose >0) { avg_rho[0] += rho[0]; avg_rho[1] += rho[1]; avg_rho[2] += rho[2]; } numerics_printf("fc3d_AC_initialize""contact = %i, rho[0] = %4.2e, rho[1] = %4.2e, rho[2] = %4.2e", contact, rho[0], rho[1], rho[2]); fc3d_local_problem_fill_M(problem, localproblem, contact); double m_row_norm = 0.0, sum; for (int i =0; i<3; i++ ) { sum =0.0; for (int j =0; j<3; j++ ) { sum += fabs(localproblem->M->matrix0[i+j*3]); } m_row_norm = max(sum, m_row_norm); } numerics_printf("fc3d_AC_initialize" " inverse of norm of M = %e", 1.0/hypot9(localproblem->M->matrix0) ); numerics_printf("fc3d_AC_initialize" " inverse of row norm of M = %e", 1.0/m_row_norm ); DEBUG_EXPR(NM_display(localproblem->M);); }
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; }