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 142462f5fdSStefano Zampini at that row. Produces the ij for a symmetric matrix by using 152462f5fdSStefano Zampini the lower triangular part of the matrix if lower_triangular is PETSC_TRUE; 16*13d4cfd3SStefano Zampini it uses the upper triangular otherwise. 172d9e4a2aSBarry Smith 182d9e4a2aSBarry Smith Input Parameters: 192d9e4a2aSBarry Smith . Matrix - matrix to convert 202462f5fdSStefano Zampini . lower_triangular - symmetrize the lower triangular part 21bcd2baecSBarry Smith . shiftin - the shift for the original matrix (0 or 1) 2291e9ee9fSBarry Smith . shiftout - the shift required for the ordering routine (0 or 1) 232d9e4a2aSBarry Smith 242d9e4a2aSBarry Smith Output Parameters: 252d9e4a2aSBarry Smith . ia - ia part of IJ representation (row information) 262d9e4a2aSBarry Smith . ja - ja part (column indices) 272d9e4a2aSBarry Smith 282d9e4a2aSBarry Smith Notes: 29b833fc0dSLois Curfman McInnes Both ia and ja may be freed with PetscFree(); 30b833fc0dSLois Curfman McInnes This routine is provided for ordering routines that require a 31b833fc0dSLois Curfman McInnes symmetric structure. It is required since those routines call 32b833fc0dSLois Curfman McInnes SparsePak routines that expect a symmetric matrix. 332d9e4a2aSBarry Smith */ 342462f5fdSStefano Zampini PetscErrorCode MatToSymmetricIJ_SeqAIJ(PetscInt m,PetscInt *ai,PetscInt *aj,PetscBool lower_triangular,PetscInt shiftin,PetscInt shiftout,PetscInt **iia,PetscInt **jja) 352d9e4a2aSBarry Smith { 366849ba73SBarry Smith PetscErrorCode ierr; 3738baddfdSBarry Smith PetscInt *work,*ia,*ja,*j,i,nz,row,col; 382d9e4a2aSBarry Smith 393a40ed3dSBarry Smith PetscFunctionBegin; 402d9e4a2aSBarry Smith /* allocate space for row pointers */ 41854ce69bSBarry Smith ierr = PetscMalloc1(m+1,&ia);CHKERRQ(ierr); 42b0a32e0cSBarry Smith *iia = ia; 4338baddfdSBarry Smith ierr = PetscMemzero(ia,(m+1)*sizeof(PetscInt));CHKERRQ(ierr); 44854ce69bSBarry Smith ierr = PetscMalloc1(m+1,&work);CHKERRQ(ierr); 452d9e4a2aSBarry Smith 462d9e4a2aSBarry Smith /* determine the number of columns in each row */ 473b2fbd54SBarry Smith ia[0] = shiftout; 4831625ec5SSatish Balay for (row = 0; row < m; row++) { 493439631bSBarry Smith nz = ai[row+1] - ai[row]; 500b6503f3SSatish Balay j = aj + ai[row] + shiftin; 512d9e4a2aSBarry Smith while (nz--) { 5217603e33SSatish Balay col = *j++ + shiftin; 532462f5fdSStefano Zampini if (lower_triangular) { 542205254eSKarl Rupp if (col > row) break; 552462f5fdSStefano Zampini } else { 562462f5fdSStefano Zampini if (col < row) break; 572462f5fdSStefano Zampini } 582d9e4a2aSBarry Smith if (col != row) ia[row+1]++; 592d9e4a2aSBarry Smith ia[col+1]++; 602d9e4a2aSBarry Smith } 612d9e4a2aSBarry Smith } 622d9e4a2aSBarry Smith 63bcd2baecSBarry Smith /* shiftin ia[i] to point to next row */ 6431625ec5SSatish Balay for (i=1; i<m+1; i++) { 650b6503f3SSatish Balay row = ia[i-1]; 662d9e4a2aSBarry Smith ia[i] += row; 670b6503f3SSatish Balay work[i-1] = row - shiftout; 682d9e4a2aSBarry Smith } 692d9e4a2aSBarry Smith 702d9e4a2aSBarry Smith /* allocate space for column pointers */ 7131625ec5SSatish Balay nz = ia[m] + (!shiftin); 72785e854fSJed Brown ierr = PetscMalloc1(nz,&ja);CHKERRQ(ierr); 73b0a32e0cSBarry Smith *jja = ja; 742d9e4a2aSBarry Smith 752d9e4a2aSBarry Smith /* loop over lower triangular part putting into ja */ 7631625ec5SSatish Balay for (row = 0; row < m; row++) { 773439631bSBarry Smith nz = ai[row+1] - ai[row]; 780b6503f3SSatish Balay j = aj + ai[row] + shiftin; 792d9e4a2aSBarry Smith while (nz--) { 8017603e33SSatish Balay col = *j++ + shiftin; 812462f5fdSStefano Zampini if (lower_triangular) { 822205254eSKarl Rupp if (col > row) break; 832462f5fdSStefano Zampini } else { 842462f5fdSStefano Zampini if (col < row) break; 852462f5fdSStefano Zampini } 862205254eSKarl Rupp if (col != row) ja[work[col]++] = row + shiftout; 873b2fbd54SBarry Smith ja[work[row]++] = col + shiftout; 882d9e4a2aSBarry Smith } 892d9e4a2aSBarry Smith } 90606d414cSSatish Balay ierr = PetscFree(work);CHKERRQ(ierr); 913a40ed3dSBarry Smith PetscFunctionReturn(0); 922d9e4a2aSBarry Smith } 932d9e4a2aSBarry Smith 94d5d45c9bSBarry Smith 95d5d45c9bSBarry Smith 96