1d6dfbf8fSBarry Smith 270f55243SBarry Smith #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 */ 32dfbe8321SBarry Smith PetscErrorCode MatToSymmetricIJ_SeqAIJ(int m,int *ai,int *aj,int shiftin,int shiftout,int **iia,int **jja) 332d9e4a2aSBarry Smith { 34*6849ba73SBarry Smith PetscErrorCode ierr; 35*6849ba73SBarry Smith int *work,*ia,*ja,*j,i,nz,row,col; 362d9e4a2aSBarry Smith 373a40ed3dSBarry Smith PetscFunctionBegin; 382d9e4a2aSBarry Smith /* allocate space for row pointers */ 39b0a32e0cSBarry Smith ierr = PetscMalloc((m+1)*sizeof(int),&ia);CHKERRQ(ierr); 40b0a32e0cSBarry Smith *iia = ia; 41549d3d68SSatish Balay ierr = PetscMemzero(ia,(m+1)*sizeof(int));CHKERRQ(ierr); 42b0a32e0cSBarry Smith ierr = PetscMalloc((m+1)*sizeof(int),&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; 51416022c9SBarry Smith 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); 66b0a32e0cSBarry Smith ierr = PetscMalloc(nz*sizeof(int),&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; 75416022c9SBarry Smith if (col > row) { break;} 763b2fbd54SBarry Smith 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