/*$Id: ij.c,v 1.35 2000/04/09 04:36:00 bsmith Exp bsmith $*/
#include "src/mat/impls/aij/seq/aij.h"
#undef __FUNC__
#define __FUNC__ /**/"MatToSymmetricIJ_SeqAIJ"
/*
MatToSymmetricIJ_SeqAIJ - Convert a (generally nonsymmetric) sparse AIJ matrix
to IJ format (ignore the "A" part) Allocates the space needed. Uses only
the lower triangular part of the matrix.
Description:
Take the data in the row-oriented sparse storage and build the
IJ data for the Matrix. Return 0 on success,row + 1 on failure
at that row. Produces the ij for a symmetric matrix by only using
the lower triangular part of the matrix.
Input Parameters:
. Matrix - matrix to convert
. shiftin - the shift for the original matrix (0 or 1)
. shiftout - the shift required for the ordering routine (0 or 1)
Output Parameters:
. ia - ia part of IJ representation (row information)
. ja - ja part (column indices)
Notes:
Both ia and ja may be freed with PetscFree();
This routine is provided for ordering routines that require a
symmetric structure. It is required since those routines call
SparsePak routines that expect a symmetric matrix.
*/
int MatToSymmetricIJ_SeqAIJ(int m,int *ai,int *aj,int shiftin,int shiftout,int **iia,int **jja)
{
int *work,*ia,*ja,*j,i,nz,row,col,ierr;
PetscFunctionBegin;
/* allocate space for row pointers */
*iia = ia = (int*)PetscMalloc((m+1)*sizeof(int));CHKPTRQ(ia);
ierr = PetscMemzero(ia,(m+1)*sizeof(int));CHKERRQ(ierr);
work = (int*)PetscMalloc((m+1)*sizeof(int));CHKPTRQ(work);
/* determine the number of columns in each row */
ia[0] = shiftout;
for (row = 0; row < m; row++) {
nz = ai[row+1] - ai[row];
j = aj + ai[row] + shiftin;
while (nz--) {
col = *j++ + shiftin;
if (col > row) { break;}
if (col != row) ia[row+1]++;
ia[col+1]++;
}
}
/* shiftin ia[i] to point to next row */
for (i=1; i row) { break;}
if (col != row) {ja[work[col]++] = row + shiftout; }
ja[work[row]++] = col + shiftout;
}
}
ierr = PetscFree(work);CHKERRQ(ierr);
PetscFunctionReturn(0);
}