1c6db04a5SJed Brown #include <../src/mat/impls/aij/seq/aij.h>
22d9e4a2aSBarry Smith
32d9e4a2aSBarry Smith /*
43b2fbd54SBarry Smith MatToSymmetricIJ_SeqAIJ - Convert a (generally nonsymmetric) sparse AIJ matrix
53b2fbd54SBarry Smith to IJ format (ignore the "A" part) Allocates the space needed. Uses only
6d5d45c9bSBarry Smith the lower triangular part of the matrix.
72d9e4a2aSBarry Smith
82d9e4a2aSBarry Smith Description:
92d9e4a2aSBarry Smith Take the data in the row-oriented sparse storage and build the
102d9e4a2aSBarry Smith IJ data for the Matrix. Return 0 on success,row + 1 on failure
112462f5fdSStefano Zampini at that row. Produces the ij for a symmetric matrix by using
122462f5fdSStefano Zampini the lower triangular part of the matrix if lower_triangular is PETSC_TRUE;
1313d4cfd3SStefano Zampini it uses the upper triangular otherwise.
142d9e4a2aSBarry Smith
152d9e4a2aSBarry Smith Input Parameters:
162d9e4a2aSBarry Smith . Matrix - matrix to convert
172462f5fdSStefano Zampini . lower_triangular - symmetrize the lower triangular part
18bcd2baecSBarry Smith . shiftin - the shift for the original matrix (0 or 1)
1991e9ee9fSBarry Smith . shiftout - the shift required for the ordering routine (0 or 1)
202d9e4a2aSBarry Smith
212d9e4a2aSBarry Smith Output Parameters:
222d9e4a2aSBarry Smith . ia - ia part of IJ representation (row information)
232d9e4a2aSBarry Smith . ja - ja part (column indices)
242d9e4a2aSBarry Smith
2511a5261eSBarry Smith Note:
26b833fc0dSLois Curfman McInnes Both ia and ja may be freed with PetscFree();
27b833fc0dSLois Curfman McInnes This routine is provided for ordering routines that require a
28b833fc0dSLois Curfman McInnes symmetric structure. It is required since those routines call
29b833fc0dSLois Curfman McInnes SparsePak routines that expect a symmetric matrix.
302d9e4a2aSBarry Smith */
MatToSymmetricIJ_SeqAIJ(PetscInt m,PetscInt * ai,PetscInt * aj,PetscBool lower_triangular,PetscInt shiftin,PetscInt shiftout,PetscInt ** iia,PetscInt ** jja)31d71ae5a4SJacob Faibussowitsch PetscErrorCode MatToSymmetricIJ_SeqAIJ(PetscInt m, PetscInt *ai, PetscInt *aj, PetscBool lower_triangular, PetscInt shiftin, PetscInt shiftout, PetscInt **iia, PetscInt **jja)
32d71ae5a4SJacob Faibussowitsch {
3338baddfdSBarry Smith PetscInt *work, *ia, *ja, *j, i, nz, row, col;
342d9e4a2aSBarry Smith
353a40ed3dSBarry Smith PetscFunctionBegin;
362d9e4a2aSBarry Smith /* allocate space for row pointers */
379566063dSJacob Faibussowitsch PetscCall(PetscCalloc1(m + 1, &ia));
38b0a32e0cSBarry Smith *iia = ia;
399566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(m + 1, &work));
402d9e4a2aSBarry Smith
412d9e4a2aSBarry Smith /* determine the number of columns in each row */
423b2fbd54SBarry Smith ia[0] = shiftout;
4331625ec5SSatish Balay for (row = 0; row < m; row++) {
443439631bSBarry Smith nz = ai[row + 1] - ai[row];
450b6503f3SSatish Balay j = aj + ai[row] + shiftin;
462d9e4a2aSBarry Smith while (nz--) {
4717603e33SSatish Balay col = *j++ + shiftin;
482462f5fdSStefano Zampini if (lower_triangular) {
492205254eSKarl Rupp if (col > row) break;
502462f5fdSStefano Zampini } else {
512462f5fdSStefano Zampini if (col < row) break;
522462f5fdSStefano Zampini }
532d9e4a2aSBarry Smith if (col != row) ia[row + 1]++;
542d9e4a2aSBarry Smith ia[col + 1]++;
552d9e4a2aSBarry Smith }
562d9e4a2aSBarry Smith }
572d9e4a2aSBarry Smith
58bcd2baecSBarry Smith /* shiftin ia[i] to point to next row */
5931625ec5SSatish Balay for (i = 1; i < m + 1; i++) {
600b6503f3SSatish Balay row = ia[i - 1];
612d9e4a2aSBarry Smith ia[i] += row;
620b6503f3SSatish Balay work[i - 1] = row - shiftout;
632d9e4a2aSBarry Smith }
642d9e4a2aSBarry Smith
652d9e4a2aSBarry Smith /* allocate space for column pointers */
6631625ec5SSatish Balay nz = ia[m] + (!shiftin);
679566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nz, &ja));
68b0a32e0cSBarry Smith *jja = ja;
692d9e4a2aSBarry Smith
702d9e4a2aSBarry Smith /* loop over lower triangular part putting into ja */
7131625ec5SSatish Balay for (row = 0; row < m; row++) {
723439631bSBarry Smith nz = ai[row + 1] - ai[row];
730b6503f3SSatish Balay j = aj + ai[row] + shiftin;
742d9e4a2aSBarry Smith while (nz--) {
7517603e33SSatish Balay col = *j++ + shiftin;
762462f5fdSStefano Zampini if (lower_triangular) {
772205254eSKarl Rupp if (col > row) break;
782462f5fdSStefano Zampini } else {
792462f5fdSStefano Zampini if (col < row) break;
802462f5fdSStefano Zampini }
812205254eSKarl Rupp if (col != row) ja[work[col]++] = row + shiftout;
823b2fbd54SBarry Smith ja[work[row]++] = col + shiftout;
832d9e4a2aSBarry Smith }
842d9e4a2aSBarry Smith }
859566063dSJacob Faibussowitsch PetscCall(PetscFree(work));
86*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
872d9e4a2aSBarry Smith }
88