void freeGlobalFrictionContactProblem(GlobalFrictionContactProblem* problem) { if (problem->M) { freeNumericsMatrix(problem->M); free(problem->M); problem->M = NULL; } if (problem->H) { freeNumericsMatrix(problem->H); free(problem->H); problem->H = NULL; } if (problem->mu) { free(problem->mu); problem->mu = NULL; } if (problem->q) { free(problem->q); problem->q = NULL; } if (problem->b) { free(problem->b); problem->b = NULL; } if (problem->env) assert(0 && "freeGlobalFrictionContactProblem :: problem->env != NULL, don't know what to do"); gfc3d_free_workspace(problem); free(problem); }
int main(int argc, char* argv[]) { // Problem Definition int info = -1; int NC = 1;//Number of contacts int Ndof = 9;//Number of DOF // Problem Definition double M11[9] = {1, 0, 0, 0, 1, 0, 0, 0, 1}; // Warning Fortran Storage double M22[9] = {1, 0, 0, 0, 1, 0, 0, 0, 1}; // Warning Fortran Storage double M33[9] = {1, 0, 0, 0, 1, 0, 0, 0, 1}; // Warning Fortran Storage /* double M[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}; */ double H00[9] = {1, 0, 0, 0, 1, 0, 0, 0, 1}; double H20[9] = { -1, 0, 0, 0, -1, 0, 0, 0, -1}; /* double H[27] = {1, 0, 0, 0, 0, 0, -1, 0, 0, */ /* 0, 1, 0, 0, 0, 0, 0, -1, 0, */ /* 0, 0, 1, 0, 0, 0, 0, 0, -1}; */ double q[9] = { -3, -3, -3, -1, 1, 3, -1, 1, 3}; double b[3] = {0, 0, 0}; double mu[1] = {0.1}; /* DSCAL(9,-1.0,q,1); */ /* int NC = 3;//Number of contacts */ /* int Ndof = 9;//Number of DOF */ /* double M[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}; */ /* double H[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}; */ /* double q[9] = {-1, 1, 3, -1, 1, 3, -1, 1, 3}; */ /* double b[9] = {0, 0, 0,0, 0, 0,0, 0, 0 }; */ /* double mu[3] = {0.1,0.1,0.1}; */ int k; int m = 3 * NC; int n = Ndof; GlobalFrictionContactProblem numericsProblem; globalFrictionContact_null(&numericsProblem); numericsProblem.numberOfContacts = NC; numericsProblem.dimension = 3; numericsProblem.mu = mu; numericsProblem.q = q; numericsProblem.b = b; numericsProblem.M = newNumericsMatrix(); NumericsMatrix *MM = numericsProblem.M; MM->storageType = NM_SPARSE_BLOCK; MM->size0 = Ndof; MM->size1 = Ndof; MM->matrix1 = newSBM(); SparseBlockStructuredMatrix *MBlockMatrix = MM->matrix1; MBlockMatrix->nbblocks = 3; double * block[3] = {M11, M22, M33}; MBlockMatrix->block = block; MBlockMatrix->blocknumber0 = 3; MBlockMatrix->blocknumber1 = 3; unsigned int blocksize[3] = {3, 6, 9} ; MBlockMatrix->blocksize0 = blocksize; MBlockMatrix->blocksize1 = blocksize; MBlockMatrix->filled1 = 4; MBlockMatrix->filled2 = 3; size_t index1_data[4] = {0, 1, 2, 3} ; size_t index2_data[3] = {0, 1, 2} ; MBlockMatrix->index1_data = index1_data; MBlockMatrix->index2_data = index2_data; numericsProblem.H = newNumericsMatrix(); NumericsMatrix *HH = numericsProblem.H; HH->storageType = 1; HH->size0 = Ndof; HH->size1 = 3 * NC; HH->matrix1 = (SparseBlockStructuredMatrix*)malloc(sizeof(SparseBlockStructuredMatrix)); SparseBlockStructuredMatrix *HBlockMatrix = HH->matrix1; HBlockMatrix->nbblocks = 2; double * hblock[3] = {H00, H20}; HBlockMatrix->block = hblock; HBlockMatrix->blocknumber0 = 3; HBlockMatrix->blocknumber1 = 1; unsigned int blocksize0[3] = {3, 6, 9} ; unsigned int blocksize1[1] = {3} ; HBlockMatrix->blocksize0 = blocksize0; HBlockMatrix->blocksize1 = blocksize1; HBlockMatrix->filled1 = 4; HBlockMatrix->filled2 = 2; size_t hindex1_data[4] = {0, 1, 1, 2} ; size_t hindex2_data[3] = {0, 0} ; HBlockMatrix->index1_data = hindex1_data; HBlockMatrix->index2_data = hindex2_data; FILE * foutput = fopen("Example_GlobalFrictionContact_SBM.dat", "w"); globalFrictionContact_printInFile(&numericsProblem, foutput); fclose(foutput); // Unknown Declaration double *reaction = (double*)calloc(m, sizeof(double)); double *velocity = (double*)calloc(m, sizeof(double)); double *globalVelocity = (double*)calloc(n, sizeof(double)); // Solver Options SolverOptions * numerics_solver_options = (SolverOptions *)malloc(sizeof(SolverOptions)); // char solvername[10]= "NSGS"; /*\warning Must be adpated for future globalFrictionContact3D_setDefaultSolverOptions*/ gfc3d_setDefaultSolverOptions(numerics_solver_options, SICONOS_GLOBAL_FRICTION_3D_NSGS); numerics_solver_options->dparam[0] = 1e-14; numerics_solver_options->iparam[0] = 100000; //Driver call info = gfc3d_driver(&numericsProblem, reaction , velocity, globalVelocity, numerics_solver_options); solver_options_delete(numerics_solver_options); free(numerics_solver_options); // Solver output printf("\n"); for (k = 0 ; k < m; k++) printf("velocity[%i] = %12.8e \t \t reaction[%i] = %12.8e \n ", k, velocity[k], k , reaction[k]); for (k = 0 ; k < n; k++) printf("globalVelocity[%i] = %12.8e \t \n ", k, globalVelocity[k]); printf("\n"); free(reaction); free(velocity); free(globalVelocity); // freeSBM(MM->matrix1); // freeSBM(HH->matrix1); free(MM->matrix1); MM->matrix1 = NULL; free(HH->matrix1); HH->matrix1 = NULL; freeNumericsMatrix(MM); freeNumericsMatrix(HH); free(MM); free(HH); gfc3d_free_workspace(&numericsProblem); /* while (1) sleep(60); */ return info; }
int main(int argc, char* argv[]) { // Problem Definition int info = -1; int NC = 1;//Number of contacts int m = 3; int n = 9; double M[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 }; double H[27] = {1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, -1 }; double q[9] = { -3, -3, -3, -1, 1, 3, -1, 1, 3}; double b[3] = {0, 0, 0}; double mu[1] = {0.1}; /* int NC = 3;//Number of contacts */ /* int Ndof = 9;//Number of DOF */ /* double M[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}; */ /* double H[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}; */ /* double q[9] = {-1, 1, 3, -1, 1, 3, -1, 1, 3}; */ /* double b[9] = {0, 0, 0,0, 0, 0,0, 0, 0 }; */ /* double mu[3] = {0.1,0.1,0.1}; */ int i = 0, k = 0; GlobalFrictionContactProblem numericsProblem; globalFrictionContact_null(&numericsProblem); numericsProblem.numberOfContacts = NC; numericsProblem.dimension = 3; numericsProblem.mu = mu; numericsProblem.q = q; numericsProblem.b = b; numericsProblem.M = newNumericsMatrix(); NumericsMatrix *MM = numericsProblem.M ; MM->storageType = NM_DENSE; MM->matrix0 = M; MM->size0 = n; MM->size1 = n; numericsProblem.H = newNumericsMatrix(); NumericsMatrix *HH = numericsProblem.H; HH->storageType = NM_DENSE; HH->matrix0 = H; HH->size0 = n; HH->size1 = m; /* FILE * foutput = fopen("Example_GlobalFrictionContact.dat", "w"); */ /* globalFrictionContact_printInFile(&numericsProblem, foutput ); */ /* fclose(foutput); */ // Unknown Declaration double *reaction = (double*)calloc(m, sizeof(double)); double *velocity = (double*)calloc(m, sizeof(double)); double *globalVelocity = (double*)calloc(n, sizeof(double)); // Numerics and Solver Options NumericsOptions numerics_options; numerics_options.verboseMode = 1; // turn verbose mode to off by default SolverOptions * numerics_solver_options = (SolverOptions *)malloc(sizeof(SolverOptions)) ; //char solvername[10]= "NSGS"; /*\warning Must be adpated for future globalFrictionContact3D_setDefaultSolverOptions*/ gfc3d_setDefaultSolverOptions(numerics_solver_options, SICONOS_GLOBAL_FRICTION_3D_NSGS); numerics_solver_options->dparam[0] = 1e-14; numerics_solver_options->iparam[0] = 100000; //Driver call i = 0; info = gfc3d_driver(&numericsProblem, reaction , velocity, globalVelocity, numerics_solver_options, &numerics_options); deleteSolverOptions(numerics_solver_options); // Solver output printf("\n"); for (k = 0 ; k < m; k++) printf("velocity[%i] = %12.8e \t \t reaction[%i] = %12.8e \n ", k, velocity[k], k , reaction[k]); for (k = 0 ; k < n; k++) printf("globalVelocity[%i] = %12.8e \t \n ", k, globalVelocity[k]); printf("\n"); free(numerics_solver_options); free(reaction); free(velocity); free(globalVelocity); free(numericsProblem.M); free(numericsProblem.H); gfc3d_free_workspace(&numericsProblem); return info; }