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