xref: /petsc/src/mat/impls/aij/seq/ij.c (revision 13d4cfd3a3c248bd75ab57fc41ba5d3dcc2094f5)
1d6dfbf8fSBarry Smith 
2c6db04a5SJed Brown #include <../src/mat/impls/aij/seq/aij.h>
32d9e4a2aSBarry Smith 
44a2ae208SSatish Balay #undef __FUNCT__
54a2ae208SSatish Balay #define __FUNCT__ "MatToSymmetricIJ_SeqAIJ"
62d9e4a2aSBarry Smith /*
73b2fbd54SBarry Smith   MatToSymmetricIJ_SeqAIJ - Convert a (generally nonsymmetric) sparse AIJ matrix
83b2fbd54SBarry Smith            to IJ format (ignore the "A" part) Allocates the space needed. Uses only
9d5d45c9bSBarry Smith            the lower triangular part of the matrix.
102d9e4a2aSBarry Smith 
112d9e4a2aSBarry Smith     Description:
122d9e4a2aSBarry Smith     Take the data in the row-oriented sparse storage and build the
132d9e4a2aSBarry Smith     IJ data for the Matrix.  Return 0 on success,row + 1 on failure
142462f5fdSStefano Zampini     at that row. Produces the ij for a symmetric matrix by using
152462f5fdSStefano Zampini     the lower triangular part of the matrix if lower_triangular is PETSC_TRUE;
16*13d4cfd3SStefano Zampini     it uses the upper triangular otherwise.
172d9e4a2aSBarry Smith 
182d9e4a2aSBarry Smith     Input Parameters:
192d9e4a2aSBarry Smith .   Matrix - matrix to convert
202462f5fdSStefano Zampini .   lower_triangular - symmetrize the lower triangular part
21bcd2baecSBarry Smith .   shiftin - the shift for the original matrix (0 or 1)
2291e9ee9fSBarry Smith .   shiftout - the shift required for the ordering routine (0 or 1)
232d9e4a2aSBarry Smith 
242d9e4a2aSBarry Smith     Output Parameters:
252d9e4a2aSBarry Smith .   ia     - ia part of IJ representation (row information)
262d9e4a2aSBarry Smith .   ja     - ja part (column indices)
272d9e4a2aSBarry Smith 
282d9e4a2aSBarry Smith     Notes:
29b833fc0dSLois Curfman McInnes     Both ia and ja may be freed with PetscFree();
30b833fc0dSLois Curfman McInnes     This routine is provided for ordering routines that require a
31b833fc0dSLois Curfman McInnes     symmetric structure.  It is required since those routines call
32b833fc0dSLois Curfman McInnes     SparsePak routines that expect a symmetric  matrix.
332d9e4a2aSBarry Smith */
342462f5fdSStefano Zampini PetscErrorCode MatToSymmetricIJ_SeqAIJ(PetscInt m,PetscInt *ai,PetscInt *aj,PetscBool lower_triangular,PetscInt shiftin,PetscInt shiftout,PetscInt **iia,PetscInt **jja)
352d9e4a2aSBarry Smith {
366849ba73SBarry Smith   PetscErrorCode ierr;
3738baddfdSBarry Smith   PetscInt       *work,*ia,*ja,*j,i,nz,row,col;
382d9e4a2aSBarry Smith 
393a40ed3dSBarry Smith   PetscFunctionBegin;
402d9e4a2aSBarry Smith   /* allocate space for row pointers */
41854ce69bSBarry Smith   ierr = PetscMalloc1(m+1,&ia);CHKERRQ(ierr);
42b0a32e0cSBarry Smith   *iia = ia;
4338baddfdSBarry Smith   ierr = PetscMemzero(ia,(m+1)*sizeof(PetscInt));CHKERRQ(ierr);
44854ce69bSBarry Smith   ierr = PetscMalloc1(m+1,&work);CHKERRQ(ierr);
452d9e4a2aSBarry Smith 
462d9e4a2aSBarry Smith   /* determine the number of columns in each row */
473b2fbd54SBarry Smith   ia[0] = shiftout;
4831625ec5SSatish Balay   for (row = 0; row < m; row++) {
493439631bSBarry Smith     nz = ai[row+1] - ai[row];
500b6503f3SSatish Balay     j  = aj + ai[row] + shiftin;
512d9e4a2aSBarry Smith     while (nz--) {
5217603e33SSatish Balay       col = *j++ + shiftin;
532462f5fdSStefano Zampini       if (lower_triangular) {
542205254eSKarl Rupp         if (col > row) break;
552462f5fdSStefano Zampini       } else {
562462f5fdSStefano Zampini         if (col < row) break;
572462f5fdSStefano Zampini       }
582d9e4a2aSBarry Smith       if (col != row) ia[row+1]++;
592d9e4a2aSBarry Smith       ia[col+1]++;
602d9e4a2aSBarry Smith     }
612d9e4a2aSBarry Smith   }
622d9e4a2aSBarry Smith 
63bcd2baecSBarry Smith   /* shiftin ia[i] to point to next row */
6431625ec5SSatish Balay   for (i=1; i<m+1; i++) {
650b6503f3SSatish Balay     row       = ia[i-1];
662d9e4a2aSBarry Smith     ia[i]    += row;
670b6503f3SSatish Balay     work[i-1] = row - shiftout;
682d9e4a2aSBarry Smith   }
692d9e4a2aSBarry Smith 
702d9e4a2aSBarry Smith   /* allocate space for column pointers */
7131625ec5SSatish Balay   nz   = ia[m] + (!shiftin);
72785e854fSJed Brown   ierr = PetscMalloc1(nz,&ja);CHKERRQ(ierr);
73b0a32e0cSBarry Smith   *jja = ja;
742d9e4a2aSBarry Smith 
752d9e4a2aSBarry Smith   /* loop over lower triangular part putting into ja */
7631625ec5SSatish Balay   for (row = 0; row < m; row++) {
773439631bSBarry Smith     nz = ai[row+1] - ai[row];
780b6503f3SSatish Balay     j  = aj + ai[row] + shiftin;
792d9e4a2aSBarry Smith     while (nz--) {
8017603e33SSatish Balay       col = *j++ + shiftin;
812462f5fdSStefano Zampini       if (lower_triangular) {
822205254eSKarl Rupp         if (col > row) break;
832462f5fdSStefano Zampini       } else {
842462f5fdSStefano Zampini         if (col < row) break;
852462f5fdSStefano Zampini       }
862205254eSKarl Rupp       if (col != row) ja[work[col]++] = row + shiftout;
873b2fbd54SBarry Smith       ja[work[row]++] = col + shiftout;
882d9e4a2aSBarry Smith     }
892d9e4a2aSBarry Smith   }
90606d414cSSatish Balay   ierr = PetscFree(work);CHKERRQ(ierr);
913a40ed3dSBarry Smith   PetscFunctionReturn(0);
922d9e4a2aSBarry Smith }
932d9e4a2aSBarry Smith 
94d5d45c9bSBarry Smith 
95d5d45c9bSBarry Smith 
96