void printInFileForScilab(const NumericsMatrix* const m, FILE* file) { if (! m) { fprintf(stderr, "Numerics, NumericsMatrix printInFile failed, NULL input.\n"); exit(EXIT_FAILURE); } int storageType = m->storageType; fprintf(file, "storageType = %d ; \n", m->storageType); fprintf(file, "size0 = %d; \n", m->size0); fprintf(file, "size1 = %d; \n", m->size1); if (storageType == 0) { fprintf(file, "data= ["); for (int i = 0; i < m->size0; i++) { fprintf(file, "["); for (int j = 0; j < m->size1; j++) { fprintf(file, "%32.24e,\t ", m->matrix0[i + j * m->size0]); } fprintf(file, "];\n"); } fprintf(file, "]"); } else if (storageType == 1) { printInFileSBMForScilab(m->matrix1, file); /* fprintf(stderr,"Numerics, NumericsMatrix printInFileForScilab. Not yet implemented fo storageType = %i.\n", storageType); */ /* exit(EXIT_FAILURE); */ } }
/*mem loc done */ void buildReducedGMP(GenericMechanicalProblem* pInProblem, double * Me, double * Mi, double * Qe, double * Qi, int * Me_Size, int* Mi_Size) { assert(pInProblem->M->storageType); //#ifdef TYTYFCRR SparseBlockStructuredMatrix* m = pInProblem->M->matrix1; #ifdef GMP_DEBUG_REDUCED FILE * titi = fopen("buildReducedGMP_input.txt", "w"); printInFileSBMForScilab(m, titi); fclose(titi); #endif int curSize = 0; // int *newIndexOfBlockI; // int NbCol=pInProblem->size; int nbBlockCol = m->blocknumber1; unsigned int * newIndexOfCol = (unsigned int*) malloc(nbBlockCol * sizeof(unsigned int)); /*Me building*/ int MeRow = 0; int MiRow = 0; /**size of Me */ listNumericsProblem * curProblem = 0; int nbBlockRowE = 0; int nbBlockRowI = 0; int numBlockRow = 0; curProblem = pInProblem->firstListElem; while (curProblem) { if (numBlockRow) curSize = m->blocksize0[numBlockRow] - m->blocksize0[numBlockRow - 1]; else curSize = m->blocksize0[numBlockRow]; if (curProblem->type == SICONOS_NUMERICS_PROBLEM_EQUALITY) { nbBlockRowE++; MeRow += curSize; } else { nbBlockRowI++; MiRow += curSize; } curProblem = curProblem->nextProblem; numBlockRow++; } numBlockRow = 0; int numRowE = 0; int numRowI = 0; int numRow = 0; curProblem = pInProblem->firstListElem; while (curProblem) { if (curProblem->type == SICONOS_NUMERICS_PROBLEM_EQUALITY) { newIndexOfCol[numRow] = numRowE; numRowE++; } else { newIndexOfCol[numRow] = numRowI + nbBlockRowE; numRowI++; } numRow++; curProblem = curProblem->nextProblem; } #ifdef GMP_DEBUG_REDUCED printf("buildReducedGMP nb of block of eq=%i. nb of iq=%i\n", numRowE, numRowI); #endif /*building of the permutation matrices*/ SparseBlockStructuredMatrix Maux; ColPermutationSBM(newIndexOfCol, m, &Maux); SparseBlockStructuredMatrix Morder; RowPermutationSBM(newIndexOfCol, &Maux, &Morder); SBMfree(&Maux, 0); /* get the permutation indices of col (and row). */ curProblem = pInProblem->firstListElem; /**mem alloc for Me and Mi*/ //int nbCol=MeRow+MiRow; *Me_Size = MeRow; *Mi_Size = MiRow; /* Me=(double *) malloc(MeRow*nbCol*sizeof(double)); Qe=(double *) malloc(MeRow*sizeof(double)); Mi=(double *) malloc(MiRow*nbCol*sizeof(double)); Qi=(double *) malloc(MiRow*sizeof(double));*/ /** copi in Me*/ int curPos = 0; for (int numBlockRow = 0; numBlockRow < nbBlockRowE; numBlockRow++) { SBMRowToDense(&Morder, numBlockRow, Me, curPos, MeRow); curPos = Morder.blocksize1[numBlockRow]; } curPos = 0; int firtMiLine = 0; if (nbBlockRowI > 0) firtMiLine = Morder.blocksize1[nbBlockRowE]; for (int numBlockRow = nbBlockRowE; numBlockRow < nbBlockRowE + nbBlockRowI; numBlockRow++) { curPos = Morder.blocksize1[numBlockRow] - firtMiLine; SBMRowToDense(&Morder, numBlockRow, Mi, curPos, MiRow); } SBMfree(&Morder, 0); curProblem = pInProblem->firstListElem; int curBlock = 0; int curPosIq = 0; int curPosEq = 0; double *curQ = pInProblem->q; double *curQe = Qe; double *curQi = Qi; curBlock = 0; while (curProblem) { if (curBlock) { curSize = m->blocksize0[curBlock] - m->blocksize0[curBlock - 1]; } else { curSize = m->blocksize0[curBlock]; } switch (curProblem->type) { case SICONOS_NUMERICS_PROBLEM_EQUALITY: { /** copy the current line block in Me*/ memcpy(curQe, curQ, curSize * sizeof(double)); curPosEq += curSize; curQe += curSize; break; } case SICONOS_NUMERICS_PROBLEM_LCP: case SICONOS_NUMERICS_PROBLEM_FC3D: { memcpy(curQi, curQ, curSize * sizeof(double)); curPosIq += curSize; curQi += curSize; break; } default: printf("GMPReduced buildReducedGMP: problemType unknown: %d . \n", curProblem->type); } curProblem = curProblem->nextProblem; curQ += curSize; curBlock++; } #ifdef GMP_DEBUG_REDUCED int nbCol = MeRow + MiRow; printf("\\The Me matrix is:\n"); printf("Me=[ \n"); for (int i = 0; i < MeRow; i++) { printf("["); for (int j = 0; j < nbCol; j++) { printf("%e\t ", Me[i + j * MeRow]); } printf("];\n"); } printf("];\n"); printf("Qe= [ \n"); for (int i = 0; i < MeRow; i++) printf("%e\t ", Qe[i]); printf("];\n"); printf("\\The Mi matrix is:\n"); printf("Mi=[ \n"); for (int i = 0; i < MiRow; i++) { printf("["); for (int j = 0; j < nbCol; j++) { printf("%e\t ", Mi[i + j * MiRow]); } printf("];\n"); } printf("];\n"); printf("Qi= [ \n"); for (int i = 0; i < MiRow; i++) printf("%e\t ", Qi[i]); printf("];\n"); #endif free(newIndexOfCol); //#endif }