xref: /petsc/src/mat/impls/aij/seq/ij.c (revision 3b2fbd549e90270c527c9a23f7b62c8352190f78)
1cb512458SBarry Smith #ifndef lint
2*3b2fbd54SBarry Smith static char vcid[] = "$Id: ij.c,v 1.18 1996/08/08 14:42:46 bsmith Exp bsmith $";
3cb512458SBarry Smith #endif
4d6dfbf8fSBarry Smith 
570f55243SBarry Smith #include "src/mat/impls/aij/seq/aij.h"
62d9e4a2aSBarry Smith 
72d9e4a2aSBarry Smith /*
8*3b2fbd54SBarry Smith   MatToSymmetricIJ_SeqAIJ - Convert a (generally nonsymmetric) sparse AIJ matrix
9*3b2fbd54SBarry Smith            to IJ format (ignore the "A" part) Allocates the space needed. Uses only
10d5d45c9bSBarry Smith            the lower triangular part of the matrix.
112d9e4a2aSBarry Smith 
122d9e4a2aSBarry Smith     Description:
132d9e4a2aSBarry Smith     Take the data in the row-oriented sparse storage and build the
142d9e4a2aSBarry Smith     IJ data for the Matrix.  Return 0 on success, row + 1 on failure
152d9e4a2aSBarry Smith     at that row. Produces the ij for a symmetric matrix by only using
162d9e4a2aSBarry Smith     the lower triangular part of the matrix.
172d9e4a2aSBarry Smith 
182d9e4a2aSBarry Smith     Input Parameters:
192d9e4a2aSBarry Smith .   Matrix - matrix to convert
20bcd2baecSBarry Smith .   shiftin - the shift for the original matrix (0 or 1)
21bcd2baecSBarry Smith .   shiftout - the shift required for the reordering routine (0 or 1)
222d9e4a2aSBarry Smith 
232d9e4a2aSBarry Smith     Output Parameters:
242d9e4a2aSBarry Smith .   ia     - ia part of IJ representation (row information)
252d9e4a2aSBarry Smith .   ja     - ja part (column indices)
262d9e4a2aSBarry Smith 
272d9e4a2aSBarry Smith     Notes:
280452661fSBarry Smith $    Both ia and ja may be freed with PetscFree();
29464493b3SBarry Smith $    This routine is provided for ordering routines that require a
30bcd2baecSBarry Smith $    symmetric structure.  It is required since those routines call
31bcd2baecSBarry Smith $    SparsePak routines that expect a symmetric  matrix.
322d9e4a2aSBarry Smith */
33bcd2baecSBarry Smith int MatToSymmetricIJ_SeqAIJ(int n,int *ai,int *aj,int shiftin, int shiftout,
34bcd2baecSBarry Smith                             int **iia, int **jja )
352d9e4a2aSBarry Smith {
3635aab85fSBarry Smith   int *work,*ia,*ja,*j,i, nz, row, col;
372d9e4a2aSBarry Smith 
382d9e4a2aSBarry Smith   /* allocate space for row pointers */
390452661fSBarry Smith   *iia = ia = (int *) PetscMalloc( (n+1)*sizeof(int) ); CHKPTRQ(ia);
40cddf8d76SBarry Smith   PetscMemzero(ia,(n+1)*sizeof(int));
410452661fSBarry Smith   work = (int *) PetscMalloc( (n+1)*sizeof(int) ); CHKPTRQ(work);
422d9e4a2aSBarry Smith 
432d9e4a2aSBarry Smith   /* determine the number of columns in each row */
44*3b2fbd54SBarry Smith   ia[0] = shiftout;
452d9e4a2aSBarry Smith   for (row = 0; row < n; row++) {
463439631bSBarry Smith     nz = ai[row+1] - ai[row];
473439631bSBarry Smith     j  = aj + ai[row];
482d9e4a2aSBarry Smith     while (nz--) {
49bcd2baecSBarry Smith        col = *j++ + shiftin;
50416022c9SBarry Smith        if (col > row) { break;}
512d9e4a2aSBarry Smith        if (col != row) ia[row+1]++;
522d9e4a2aSBarry Smith        ia[col+1]++;
532d9e4a2aSBarry Smith     }
542d9e4a2aSBarry Smith   }
552d9e4a2aSBarry Smith 
56bcd2baecSBarry Smith   /* shiftin ia[i] to point to next row */
572d9e4a2aSBarry Smith   for ( i=1; i<n+1; i++ ) {
582d9e4a2aSBarry Smith     row       = ia[i-1];
592d9e4a2aSBarry Smith     ia[i]     += row;
602d9e4a2aSBarry Smith     work[i-1] = row - 1;
612d9e4a2aSBarry Smith   }
622d9e4a2aSBarry Smith 
632d9e4a2aSBarry Smith   /* allocate space for column pointers */
64bcd2baecSBarry Smith   nz = ia[n] + (!shiftin);
650452661fSBarry Smith   *jja = ja = (int *) PetscMalloc( nz*sizeof(int) ); CHKPTRQ(ja);
662d9e4a2aSBarry Smith 
672d9e4a2aSBarry Smith   /* loop over lower triangular part putting into ja */
682d9e4a2aSBarry Smith   for (row = 0; row < n; row++) {
693439631bSBarry Smith     nz = ai[row+1] - ai[row];
703439631bSBarry Smith     j  = aj + ai[row];
712d9e4a2aSBarry Smith     while (nz--) {
72bcd2baecSBarry Smith       col = *j++ + shiftin;
73416022c9SBarry Smith       if (col > row) { break;}
74*3b2fbd54SBarry Smith       if (col != row) {ja[work[col]++] = row + shiftout; }
75*3b2fbd54SBarry Smith       ja[work[row]++] = col + shiftout;
762d9e4a2aSBarry Smith     }
772d9e4a2aSBarry Smith   }
780452661fSBarry Smith   PetscFree(work);
792d9e4a2aSBarry Smith   return 0;
802d9e4a2aSBarry Smith }
812d9e4a2aSBarry Smith 
82d5d45c9bSBarry Smith 
83d5d45c9bSBarry Smith 
84