xref: /petsc/src/mat/impls/aij/seq/ij.c (revision e8e8640d1cb9a3a2f50c0c0d7b26e5c4d521e2e4)
1c6db04a5SJed Brown #include <../src/mat/impls/aij/seq/aij.h>
22d9e4a2aSBarry Smith 
32d9e4a2aSBarry Smith /*
43b2fbd54SBarry Smith   MatToSymmetricIJ_SeqAIJ - Convert a (generally nonsymmetric) sparse AIJ matrix
53b2fbd54SBarry Smith            to IJ format (ignore the "A" part) Allocates the space needed. Uses only
6d5d45c9bSBarry Smith            the lower triangular part of the matrix.
72d9e4a2aSBarry Smith 
82d9e4a2aSBarry Smith     Description:
92d9e4a2aSBarry Smith     Take the data in the row-oriented sparse storage and build the
102d9e4a2aSBarry Smith     IJ data for the Matrix.  Return 0 on success,row + 1 on failure
112462f5fdSStefano Zampini     at that row. Produces the ij for a symmetric matrix by using
122462f5fdSStefano Zampini     the lower triangular part of the matrix if lower_triangular is PETSC_TRUE;
1313d4cfd3SStefano Zampini     it uses the upper triangular otherwise.
142d9e4a2aSBarry Smith 
152d9e4a2aSBarry Smith     Input Parameters:
162d9e4a2aSBarry Smith .   Matrix - matrix to convert
172462f5fdSStefano Zampini .   lower_triangular - symmetrize the lower triangular part
18bcd2baecSBarry Smith .   shiftin - the shift for the original matrix (0 or 1)
1991e9ee9fSBarry Smith .   shiftout - the shift required for the ordering routine (0 or 1)
202d9e4a2aSBarry Smith 
212d9e4a2aSBarry Smith     Output Parameters:
222d9e4a2aSBarry Smith .   ia     - ia part of IJ representation (row information)
232d9e4a2aSBarry Smith .   ja     - ja part (column indices)
242d9e4a2aSBarry Smith 
2511a5261eSBarry Smith     Note:
26b833fc0dSLois Curfman McInnes     Both ia and ja may be freed with PetscFree();
27b833fc0dSLois Curfman McInnes     This routine is provided for ordering routines that require a
28b833fc0dSLois Curfman McInnes     symmetric structure.  It is required since those routines call
29b833fc0dSLois Curfman McInnes     SparsePak routines that expect a symmetric  matrix.
302d9e4a2aSBarry Smith */
MatToSymmetricIJ_SeqAIJ(PetscInt m,PetscInt * ai,PetscInt * aj,PetscBool lower_triangular,PetscInt shiftin,PetscInt shiftout,PetscInt ** iia,PetscInt ** jja)31d71ae5a4SJacob Faibussowitsch PetscErrorCode MatToSymmetricIJ_SeqAIJ(PetscInt m, PetscInt *ai, PetscInt *aj, PetscBool lower_triangular, PetscInt shiftin, PetscInt shiftout, PetscInt **iia, PetscInt **jja)
32d71ae5a4SJacob Faibussowitsch {
3338baddfdSBarry Smith   PetscInt *work, *ia, *ja, *j, i, nz, row, col;
342d9e4a2aSBarry Smith 
353a40ed3dSBarry Smith   PetscFunctionBegin;
362d9e4a2aSBarry Smith   /* allocate space for row pointers */
379566063dSJacob Faibussowitsch   PetscCall(PetscCalloc1(m + 1, &ia));
38b0a32e0cSBarry Smith   *iia = ia;
399566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(m + 1, &work));
402d9e4a2aSBarry Smith 
412d9e4a2aSBarry Smith   /* determine the number of columns in each row */
423b2fbd54SBarry Smith   ia[0] = shiftout;
4331625ec5SSatish Balay   for (row = 0; row < m; row++) {
443439631bSBarry Smith     nz = ai[row + 1] - ai[row];
450b6503f3SSatish Balay     j  = aj + ai[row] + shiftin;
462d9e4a2aSBarry Smith     while (nz--) {
4717603e33SSatish Balay       col = *j++ + shiftin;
482462f5fdSStefano Zampini       if (lower_triangular) {
492205254eSKarl Rupp         if (col > row) break;
502462f5fdSStefano Zampini       } else {
512462f5fdSStefano Zampini         if (col < row) break;
522462f5fdSStefano Zampini       }
532d9e4a2aSBarry Smith       if (col != row) ia[row + 1]++;
542d9e4a2aSBarry Smith       ia[col + 1]++;
552d9e4a2aSBarry Smith     }
562d9e4a2aSBarry Smith   }
572d9e4a2aSBarry Smith 
58bcd2baecSBarry Smith   /* shiftin ia[i] to point to next row */
5931625ec5SSatish Balay   for (i = 1; i < m + 1; i++) {
600b6503f3SSatish Balay     row = ia[i - 1];
612d9e4a2aSBarry Smith     ia[i] += row;
620b6503f3SSatish Balay     work[i - 1] = row - shiftout;
632d9e4a2aSBarry Smith   }
642d9e4a2aSBarry Smith 
652d9e4a2aSBarry Smith   /* allocate space for column pointers */
6631625ec5SSatish Balay   nz = ia[m] + (!shiftin);
679566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(nz, &ja));
68b0a32e0cSBarry Smith   *jja = ja;
692d9e4a2aSBarry Smith 
702d9e4a2aSBarry Smith   /* loop over lower triangular part putting into ja */
7131625ec5SSatish Balay   for (row = 0; row < m; row++) {
723439631bSBarry Smith     nz = ai[row + 1] - ai[row];
730b6503f3SSatish Balay     j  = aj + ai[row] + shiftin;
742d9e4a2aSBarry Smith     while (nz--) {
7517603e33SSatish Balay       col = *j++ + shiftin;
762462f5fdSStefano Zampini       if (lower_triangular) {
772205254eSKarl Rupp         if (col > row) break;
782462f5fdSStefano Zampini       } else {
792462f5fdSStefano Zampini         if (col < row) break;
802462f5fdSStefano Zampini       }
812205254eSKarl Rupp       if (col != row) ja[work[col]++] = row + shiftout;
823b2fbd54SBarry Smith       ja[work[row]++] = col + shiftout;
832d9e4a2aSBarry Smith     }
842d9e4a2aSBarry Smith   }
859566063dSJacob Faibussowitsch   PetscCall(PetscFree(work));
86*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
872d9e4a2aSBarry Smith }
88