int main(void) { NumericsOptions NO; setDefaultNumericsOptions(&NO); NO.verboseMode = 1; // turn verbose mode to off by default int total_info = 0; double q[] = { -1, 1, 3, -1, 1, 3, -1, 1, 3}; double mu[] = {0.1, 0.1, 0.1}; double Wdata[81] = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; NumericsMatrix* tmpM = createNumericsMatrixFromData(NM_DENSE, 9, 9, Wdata); NumericsMatrix* W = createNumericsMatrix(NM_SPARSE, 9, 9); NM_copy_to_sparse(tmpM, W); int solvers_to_test[] = {SICONOS_FRICTION_3D_NSGS, SICONOS_FRICTION_3D_NSN_AC, SICONOS_FRICTION_3D_NSN_FB, SICONOS_FRICTION_3D_NSN_NM, SICONOS_FRICTION_3D_SOCLCP, SICONOS_FRICTION_3D_PROX}; for (size_t s = 0; s < sizeof(solvers_to_test); ++s) { int solver_id = solvers_to_test[s]; FrictionContactProblem* FC = frictionContactProblem_new(3, 3, W, q, mu); double r[9] = {0.}; double u[9] = {0.}; SolverOptions SO;; fc3d_setDefaultSolverOptions(&SO, solver_id); int info = fc3d_driver(FC, r, u, &SO, &NO); if (info) { fprintf(stderr, "Solver %s failed with error %d\n", idToName(solver_id), info); total_info = 1; } FC->M = NULL; FC->q = NULL; FC->mu = NULL; deleteSolverOptions(&SO); freeFrictionContactProblem(FC); free(FC); } freeNumericsMatrix(W); tmpM->matrix0 = NULL; freeNumericsMatrix(tmpM); free(W); free(tmpM); return total_info; }
static int globalFrictionContact3D_AVI_gams_base(GlobalFrictionContactProblem* problem, double *reaction, double *velocity, SolverOptions* options, const char* solverName) { assert(problem); assert(problem->numberOfContacts > 0); assert(problem->M); assert(problem->q); /* Handles to the GAMSX, GDX, and Option objects */ gamsxHandle_t Gptr = NULL; idxHandle_t Xptr = NULL; optHandle_t Optr = NULL; optHandle_t solverOptPtr = NULL; int status; char sysdir[GMS_SSSIZE], model[GMS_SSSIZE], msg[GMS_SSSIZE]; const char defModel[] = SPACE_CONC(GAMS_MODELS_SHARE_DIR, "/fc_vi.gms"); const char defGAMSdir[] = GAMS_DIR; int size = problem->dimension*problem->numberOfContacts; NumericsMatrix Htmat; fillNumericsMatrix(&Htmat, NM_SPARSE, problem->H->size0, problem->H->size1, NULL); SN_Gams_set_dirs(options->solverParameters, defModel, defGAMSdir, model, sysdir, "/fc_vi.gms"); /* Create objects */ if (! gamsxCreateD (&Gptr, sysdir, msg, sizeof(msg))) { printf("Could not create gamsx object: %s\n", msg); return 1; } if (! idxCreateD (&Xptr, sysdir, msg, sizeof(msg))) { printf("Could not create gdx object: %s\n", msg); return 1; } if (! optCreateD (&Optr, sysdir, msg, sizeof(msg))) { printf("Could not create opt object: %s\n", msg); return 1; } if (! optCreateD (&solverOptPtr, sysdir, msg, sizeof(msg))) { printf("Could not create opt object: %s\n", msg); return 1; } getGamsSolverOpt(solverOptPtr, sysdir, solverName); optSetDblStr(solverOptPtr, "convergence_tolerance", options->dparam[0]); // strncpy(msg, "./", sizeof(deffile)); strncpy(msg, solverName, sizeof(msg)); strncat(msg, ".opt", sizeof(msg)); optWriteParameterFile(solverOptPtr, msg); FILE* f = fopen("jams.opt", "w"); if (f) { char contents[] = "subsolveropt 1"; fprintf(f, contents); fclose(f); } else { printf("Failed to create jams.opt!\n"); } getGamsOpt(Optr, sysdir); if (strcmp(solverName, "path")) { optSetStrStr(Optr, "emp", solverName); } idxOpenWrite(Xptr, "fc3d_avi.gdx", "Siconos/Numerics NM_to_GDX", &status); if (status) idxerrorR(status, "idxOpenWrite"); DEBUG_PRINT("GFC3D_AVI_GAMS :: fc3d_avi.gdx opened"); if ((status=NM_to_GDX(Xptr, "M", "M matrix", problem->M))) { printf("Model data not written\n"); goto TERMINATE; } DEBUG_PRINT("FC3D_AVI_GAMS :: M matrix written"); if ((status=NM_to_GDX(Xptr, "H", "H matrix", problem->H))) { printf("Model data not written\n"); goto TERMINATE; } DEBUG_PRINT("FC3D_AVI_GAMS :: H matrix written"); NM_copy_to_sparse(problem->H, &Htmat); cs_fkeep(NM_csc(&Htmat), &SN_rm_normal_part, NULL); cblas_dcopy(size, problem->b, 1, reaction, 1); for (unsigned i = 0; i < size; i += 3) { reaction[i] = 0.; } if ((status=NM_to_GDX(Xptr, "Ht", "Ht matrix", &Htmat))) { printf("Model data not written\n"); goto TERMINATE; } if ((status=NV_to_GDX(Xptr, "q", "q vector", problem->q, size))) { printf("Model data not written\n"); goto TERMINATE; } if ((status=NV_to_GDX(Xptr, "b", "b vector", problem->b, size))) { printf("Model data not written\n"); goto TERMINATE; } if ((status=NV_to_GDX(Xptr, "bt", "bt vector", reaction, size))) { printf("Model data not written\n"); goto TERMINATE; } if (idxClose(Xptr)) idxerrorR(idxGetLastError(Xptr), "idxClose"); if ((status=CallGams(Gptr, Optr, sysdir, model))) { printf("Call to GAMS failed\n"); goto TERMINATE; } /************************************************ * Read back solution ************************************************/ idxOpenRead(Xptr, "fc3d_avi_sol.gdx", &status); if (status) idxerrorR(status, "idxOpenRead"); if ((status=GDX_to_NV(Xptr, "reaction", reaction, size))) { printf("Model data not read\n"); goto TERMINATE; } if ((status=GDX_to_NV(Xptr, "velocities", reaction, size))) { printf("Model data not read\n"); goto TERMINATE; } if (idxClose(Xptr)) idxerrorR(idxGetLastError(Xptr), "idxClose"); TERMINATE: optFree(&Optr); optFree(&solverOptPtr); idxFree(&Xptr); gamsxFree(&Gptr); freeNumericsMatrix(&Htmat); return status; }