/*$Id: aijbaij.c,v 1.9 2001/08/07 03:02:55 balay Exp $*/ #include "src/mat/impls/baij/seq/baij.h" EXTERN_C_BEGIN #undef __FUNCT__ #define __FUNCT__ "MatConvert_SeqBAI_SeqAIJ" int MatConvert_SeqBAIJ_SeqAIJ(Mat A,const MatType newtype,Mat *newmat) { Mat B; Mat_SeqBAIJ *a = (Mat_SeqBAIJ*)A->data; int ierr,bs = a->bs,*ai = a->i,*aj = a->j,n = A->M/bs,i,j,k; int *rowlengths,*rows,*cols,maxlen = 0,ncols; PetscScalar *aa = a->a; PetscFunctionBegin; ierr = PetscMalloc(n*bs*sizeof(int),&rowlengths);CHKERRQ(ierr); for (i=0; im,A->n,0,rowlengths,&B);CHKERRQ(ierr); ierr = MatSetOption(B,MAT_COLUMN_ORIENTED);CHKERRQ(ierr); ierr = MatSetOption(B,MAT_ROWS_SORTED);CHKERRQ(ierr); ierr = MatSetOption(B,MAT_COLUMNS_SORTED);CHKERRQ(ierr); ierr = PetscFree(rowlengths);CHKERRQ(ierr); ierr = PetscMalloc(bs*sizeof(int),&rows);CHKERRQ(ierr); ierr = PetscMalloc(bs*maxlen*sizeof(int),&cols);CHKERRQ(ierr); for (i=0; idata; Mat_SeqBAIJ *b; int ierr,*ai=a->i,m=A->M,n=A->N,i,*rowlengths; PetscFunctionBegin; if (n != m) SETERRQ(PETSC_ERR_ARG_WRONG,"Matrix must be square"); ierr = PetscMalloc(m*sizeof(int),&rowlengths);CHKERRQ(ierr); for (i=0; idata); ierr = PetscMemcpy(b->i,a->i,(m+1)*sizeof(int));CHKERRQ(ierr); ierr = PetscMemcpy(b->ilen,a->ilen,m*sizeof(int));CHKERRQ(ierr); ierr = PetscMemcpy(b->j,a->j,a->nz*sizeof(int));CHKERRQ(ierr); ierr = PetscMemcpy(b->a,a->a,a->nz*sizeof(MatScalar));CHKERRQ(ierr); ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); /* Fake support for "inplace" convert. */ if (*newmat == A) { ierr = MatDestroy(A);CHKERRQ(ierr); } *newmat = B; PetscFunctionReturn(0); } EXTERN_C_END