#include "petscsys.h" #include "src/mat/impls/baij/seq/baij.h" #include "src/vec/vecimpl.h" #include "src/inline/spops.h" #include "sbaij.h" /* Symmetric reordering the index of sparse symmetric matrix A so that P*A*P^T is also stored symmetrically. The permutation needs to be symmetric, i.e., P = P^T = inv(P). -- modified from sor.f of YSMP -- idea: reorder (ai, aj, a) (not A!) to ensure that all nonzero A_(p(i),isp(k)) are stored in the upper triangle of P*A*P^T */ #undef __FUNC__ #define __FUNC__ "MatReordering_SeqSBAIJ" int MatReordering_SeqSBAIJ(Mat A,IS isp) { Mat_SeqSBAIJ *a=(Mat_SeqSBAIJ *)A->data; int *r,ierr,i,mbs=a->mbs,*ai=a->i,*aj=a->j,*rip,*riip; MatScalar *aa=a->a; Scalar ak; int *nzr,nz,jmin,jmax,j,k,ajk; IS isip; /* inverse of isp */ PetscFunctionBegin; if (!mbs) PetscFunctionReturn(0); ierr = ISGetIndices(isp,&rip);CHKERRQ(ierr); ierr = ISInvertPermutation(isp,PETSC_DECIDE,&isip);CHKERRQ(ierr); ierr = ISGetIndices(isip,&riip);CHKERRQ(ierr); for (i=0; irow = isp; a->col = isp; a->icol = isp; ierr = PetscObjectReference((PetscObject)isp); CHKERRQ(ierr); PetscFunctionReturn(0); }