int fc2d_driver(FrictionContactProblem* problem, double *reaction , double *velocity, SolverOptions* options, NumericsOptions* global_options) { #ifdef DUMP_PROBLEM char fname[256]; sprintf(fname, "FrictionContactProblem%.5d.dat", fccounter++); printf("Dump of FrictionContactProblem%.5d.dat", fccounter); FILE * foutput = fopen(fname, "w"); frictionContact_printInFile(problem, foutput); fclose(foutput); #endif if (options == NULL || global_options == NULL) numericsError("fc2d_driver", "null input for solver and/or global options"); /* Set global options */ setNumericsOptions(global_options); /* Checks inputs */ if (problem == NULL || reaction == NULL || velocity == NULL) numericsError("fc2d_driver", "null input for FrictionContactProblem and/or unknowns (reaction,velocity)"); /* If the options for solver have not been set, read default values in .opt file */ int NoDefaultOptions = options->isSet; /* true(1) if the SolverOptions structure has been filled in else false(0) */ if (!NoDefaultOptions) readSolverOptions(3, options); if (verbose > 0) printSolverOptions(options); /* Solver name */ /*char * name = options->solverName;*/ int info = -1 ; if (problem->dimension != 2) numericsError("fc2d_driver", "Dimension of the problem : problem-> dimension is not compatible or is not set"); /* Non Smooth Gauss Seidel (NSGS) */ if (problem->M->storageType == 1) { if (options->solverId == SICONOS_FRICTION_2D_NSGS) { if (verbose) printf(" ======================= Call Sparse NSGS solver for Friction-Contact 2D problem ======================\n"); fc2d_sparse_nsgs(problem, reaction , velocity , &info , options); } else { fprintf(stderr, "fc2d_driver error: unknown solver named: %s\n", idToName(options->solverId)); exit(EXIT_FAILURE); } } else if (problem->M->storageType == 0) { switch (options->solverId) { /****** NLGS algorithm ******/ case SICONOS_FRICTION_2D_PGS: case SICONOS_FRICTION_2D_NSGS: { if (verbose) printf(" ========================== Call NLGS solver for Friction-Contact 2D problem ==========================\n"); fc2d_nsgs(problem, reaction, velocity, &info, options); break; } /****** CPG algorithm ******/ case SICONOS_FRICTION_2D_CPG: { if (verbose) printf(" ========================== Call CPG solver for Friction-Contact 2D problem ==========================\n"); fc2d_cpg(problem, reaction, velocity, &info, options); break; } /****** Latin algorithm ******/ case SICONOS_FRICTION_2D_LATIN: { if (verbose) printf(" ========================== Call Latin solver for Friction-Contact 2D problem ==========================\n"); fc2d_latin(problem, reaction, velocity, &info, options); break; } /****** Lexicolemke algorithm ******/ case SICONOS_FRICTION_2D_LEMKE: { if (verbose) printf(" ========================== Call Lemke solver for Friction-Contact 2D problem ==========================\n"); fc2d_lexicolemke(problem, reaction, velocity, &info, options, global_options); break; } /****** Enum algorithm ******/ case SICONOS_FRICTION_2D_ENUM: { if (verbose) printf(" ========================== Call Enumerative solver for Friction-Contact 2D problem ==========================\n"); fc2d_enum(problem, reaction, velocity, &info, options, global_options); break; } /*error */ default: { fprintf(stderr, "fc2d_driver error: unknown solver named: %s\n", idToName(options->solverId)); exit(EXIT_FAILURE); } } #ifdef DUMP_PROBLEM_IF_INFO if (info) { char fname[256]; sprintf(fname, "FrictionContactProblem%.5d.dat", fccounter++); printf("Dump of FrictionContactProblem%.5d.dat\n", fccounter); FILE * foutput = fopen(fname, "w"); frictionContact_printInFile(problem, foutput); fclose(foutput); } #endif } else { numericsError("fc2d_driver", " error: unknown storagetype named"); exit(EXIT_FAILURE); } return info; }
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; }