xref: /petsc/src/mat/impls/aij/seq/ij.c (revision 2205254efee3a00a594e5e2a3a70f74dcb40bc03)
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
142d9e4a2aSBarry Smith     at that row. Produces the ij for a symmetric matrix by only using
152d9e4a2aSBarry Smith     the lower triangular part of the matrix.
162d9e4a2aSBarry Smith 
172d9e4a2aSBarry Smith     Input Parameters:
182d9e4a2aSBarry Smith .   Matrix - matrix to convert
19bcd2baecSBarry Smith .   shiftin - the shift for the original matrix (0 or 1)
2091e9ee9fSBarry Smith .   shiftout - the shift required for the ordering routine (0 or 1)
212d9e4a2aSBarry Smith 
222d9e4a2aSBarry Smith     Output Parameters:
232d9e4a2aSBarry Smith .   ia     - ia part of IJ representation (row information)
242d9e4a2aSBarry Smith .   ja     - ja part (column indices)
252d9e4a2aSBarry Smith 
262d9e4a2aSBarry Smith     Notes:
27b833fc0dSLois Curfman McInnes     Both ia and ja may be freed with PetscFree();
28b833fc0dSLois Curfman McInnes     This routine is provided for ordering routines that require a
29b833fc0dSLois Curfman McInnes     symmetric structure.  It is required since those routines call
30b833fc0dSLois Curfman McInnes     SparsePak routines that expect a symmetric  matrix.
312d9e4a2aSBarry Smith */
3238baddfdSBarry Smith PetscErrorCode MatToSymmetricIJ_SeqAIJ(PetscInt m,PetscInt *ai,PetscInt *aj,PetscInt shiftin,PetscInt shiftout,PetscInt **iia,PetscInt **jja)
332d9e4a2aSBarry Smith {
346849ba73SBarry Smith   PetscErrorCode ierr;
3538baddfdSBarry Smith   PetscInt       *work,*ia,*ja,*j,i,nz,row,col;
362d9e4a2aSBarry Smith 
373a40ed3dSBarry Smith   PetscFunctionBegin;
382d9e4a2aSBarry Smith   /* allocate space for row pointers */
3938baddfdSBarry Smith   ierr = PetscMalloc((m+1)*sizeof(PetscInt),&ia);CHKERRQ(ierr);
40b0a32e0cSBarry Smith   *iia = ia;
4138baddfdSBarry Smith   ierr = PetscMemzero(ia,(m+1)*sizeof(PetscInt));CHKERRQ(ierr);
4238baddfdSBarry Smith   ierr = PetscMalloc((m+1)*sizeof(PetscInt),&work);CHKERRQ(ierr);
432d9e4a2aSBarry Smith 
442d9e4a2aSBarry Smith   /* determine the number of columns in each row */
453b2fbd54SBarry Smith   ia[0] = shiftout;
4631625ec5SSatish Balay   for (row = 0; row < m; row++) {
473439631bSBarry Smith     nz = ai[row+1] - ai[row];
480b6503f3SSatish Balay     j  = aj + ai[row] + shiftin;
492d9e4a2aSBarry Smith     while (nz--) {
5017603e33SSatish Balay       col = *j++ + shiftin;
51*2205254eSKarl Rupp       if (col > row) break;
522d9e4a2aSBarry Smith       if (col != row) ia[row+1]++;
532d9e4a2aSBarry Smith       ia[col+1]++;
542d9e4a2aSBarry Smith     }
552d9e4a2aSBarry Smith   }
562d9e4a2aSBarry Smith 
57bcd2baecSBarry Smith   /* shiftin ia[i] to point to next row */
5831625ec5SSatish Balay   for (i=1; i<m+1; i++) {
590b6503f3SSatish Balay     row       = ia[i-1];
602d9e4a2aSBarry Smith     ia[i]    += row;
610b6503f3SSatish Balay     work[i-1] = row - shiftout;
622d9e4a2aSBarry Smith   }
632d9e4a2aSBarry Smith 
642d9e4a2aSBarry Smith   /* allocate space for column pointers */
6531625ec5SSatish Balay   nz   = ia[m] + (!shiftin);
6638baddfdSBarry Smith   ierr = PetscMalloc(nz*sizeof(PetscInt),&ja);CHKERRQ(ierr);
67b0a32e0cSBarry Smith   *jja = ja;
682d9e4a2aSBarry Smith 
692d9e4a2aSBarry Smith   /* loop over lower triangular part putting into ja */
7031625ec5SSatish Balay   for (row = 0; row < m; row++) {
713439631bSBarry Smith     nz = ai[row+1] - ai[row];
720b6503f3SSatish Balay     j  = aj + ai[row] + shiftin;
732d9e4a2aSBarry Smith     while (nz--) {
7417603e33SSatish Balay       col = *j++ + shiftin;
75*2205254eSKarl Rupp       if (col > row) break;
76*2205254eSKarl Rupp       if (col != row) ja[work[col]++] = row + shiftout;
773b2fbd54SBarry Smith       ja[work[row]++] = col + shiftout;
782d9e4a2aSBarry Smith     }
792d9e4a2aSBarry Smith   }
80606d414cSSatish Balay   ierr = PetscFree(work);CHKERRQ(ierr);
813a40ed3dSBarry Smith   PetscFunctionReturn(0);
822d9e4a2aSBarry Smith }
832d9e4a2aSBarry Smith 
84d5d45c9bSBarry Smith 
85d5d45c9bSBarry Smith 
86