xref: /petsc/src/mat/impls/aij/seq/ij.c (revision ee0de897fec99be7c10c7637bbd068d61b2ce625)
1 #ifndef lint
2 static char vcid[] = "$Id: ij.c,v 1.14 1995/11/02 04:28:29 bsmith Exp bsmith $";
3 #endif
4 
5 #include "aij.h"
6 
7 /*
8   MatToSymmetricIJ_SeqAIJ - Convert a sparse AIJ matrix to IJ format
9            (ignore the "A" part) Allocates the space needed. Uses only
10            the lower triangular part of the matrix.
11 
12     Description:
13     Take the data in the row-oriented sparse storage and build the
14     IJ data for the Matrix.  Return 0 on success, row + 1 on failure
15     at that row. Produces the ij for a symmetric matrix by only using
16     the lower triangular part of the matrix.
17 
18     Input Parameters:
19 .   Matrix - matrix to convert
20 
21     Output Parameters:
22 .   ia     - ia part of IJ representation (row information)
23 .   ja     - ja part (column indices)
24 
25     Notes:
26 $    Both ia and ja may be freed with PetscFree();
27 $    This routine is provided for ordering routines that require a
28 $    symmetric structure.  It is used in SpOrder (and derivatives) since
29 $    those routines call SparsePak routines that expect a symmetric
30 $    matrix.
31 */
32 int MatToSymmetricIJ_SeqAIJ( Mat_SeqAIJ *A, int **iia, int **jja )
33 {
34   int *work,*ia,*ja,*j,i, nz, n = A->m, row, col, shift = A->indexshift;
35   int *ai = A->i, *aj = A->j + shift;
36 
37   /* allocate space for row pointers */
38   *iia = ia = (int *) PetscMalloc( (n+1)*sizeof(int) ); CHKPTRQ(ia);
39   PetscMemzero(ia,(n+1)*sizeof(int));
40   work = (int *) PetscMalloc( (n+1)*sizeof(int) ); CHKPTRQ(work);
41 
42   /* determine the number of columns in each row */
43   ia[0] = 1;
44   for (row = 0; row < n; row++) {
45     nz = ai[row+1] - ai[row];
46     j  = aj + ai[row];
47     while (nz--) {
48        col = *j++ + shift;
49        if (col > row) { break;}
50        if (col != row) ia[row+1]++;
51        ia[col+1]++;
52     }
53   }
54 
55   /* shift ia[i] to point to next row */
56   for ( i=1; i<n+1; i++ ) {
57     row       = ia[i-1];
58     ia[i]     += row;
59     work[i-1] = row - 1;
60   }
61 
62   /* allocate space for column pointers */
63   nz = ia[n] + (!shift);
64   *jja = ja = (int *) PetscMalloc( nz*sizeof(int) ); CHKPTRQ(ja);
65 
66   /* loop over lower triangular part putting into ja */
67   for (row = 0; row < n; row++) {
68     nz = ai[row+1] - ai[row];
69     j  = aj + ai[row];
70     while (nz--) {
71       col = *j++ + shift;
72       if (col > row) { break;}
73       if (col != row) {ja[work[col]++] = row + 1; }
74       ja[work[row]++] = col + 1;
75     }
76   }
77   PetscFree(work);
78   return 0;
79 }
80 
81 
82 
83