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 void freeLocalProblem(FrictionContactProblem* localproblem, FrictionContactProblem* problem) { if (problem->M->storageType == NM_DENSE && localproblem->M->matrix0) { free(localproblem->M->matrix0); } localproblem->M->matrix0 = NULL; freeFrictionContactProblem(localproblem); }
int frictionContact_test_function(FILE * f, SolverOptions * options) { int k, info = -1 ; FrictionContactProblem* problem = (FrictionContactProblem *)malloc(sizeof(FrictionContactProblem)); info = frictionContact_newFromFile(problem, f); FILE * foutput = fopen("checkinput.dat", "w"); info = frictionContact_printInFile(problem, foutput); NumericsOptions global_options; setDefaultNumericsOptions(&global_options); global_options.verboseMode = 1; // turn verbose mode to off by default int NC = problem->numberOfContacts; int dim = problem->dimension; //int dim = problem->numberOfContacts; double *reaction = (double*)calloc(dim * NC, sizeof(double)); double *velocity = (double*)calloc(dim * NC, sizeof(double)); if (dim == 2) { info = frictionContact2D_driver(problem, reaction , velocity, options, &global_options); } else if (dim == 3) { info = frictionContact3D_driver(problem, reaction , velocity, options, &global_options); } else { info = 1; } printf("\n"); int print_size =10; if (dim * NC >= print_size) { printf("First values (%i)\n", print_size); for (k = 0 ; k < print_size; k++) { printf("Velocity[%i] = %12.8e \t \t Reaction[%i] = %12.8e\n", k, velocity[k], k , reaction[k]); } printf(" ..... \n"); } else { for (k = 0 ; k < dim * NC; k++) { printf("Velocity[%i] = %12.8e \t \t Reaction[%i] = %12.8e\n", k, velocity[k], k , reaction[k]); } printf("\n"); } /* for (k = 0 ; k < dim * NC; k++) */ /* { */ /* printf("Velocity[%i] = %12.8e \t \t Reaction[%i] = %12.8e\n", k, velocity[k], k , reaction[k]); */ /* } */ /* printf("\n"); */ if (!info) { printf("test successful, residual = %g\n", options->dparam[1]); } else { printf("test unsuccessful, residual = %g\n", options->dparam[1]); } free(reaction); free(velocity); freeFrictionContactProblem(problem); fclose(foutput); return info; }