1 /*$Id: aijsbaij.c,v 1.9 2001/08/07 03:02:55 balay Exp $*/ 2 3 #include "src/mat/impls/aij/seq/aij.h" 4 #include "src/mat/impls/sbaij/seq/sbaij.h" 5 6 EXTERN_C_BEGIN 7 #undef __FUNCT__ 8 #define __FUNCT__ "MatConvert_SeqAIJ_SeqSBAIJ" 9 int MatConvert_SeqAIJ_SeqSBAIJ(Mat A,MatType newtype,Mat *B) 10 { 11 Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 12 Mat_SeqSBAIJ *b; 13 int ierr,*ai=a->i,*aj,m=A->M,n=A->N,i,j, 14 *bi=b->i,*bj=b->j,*rowlengths; 15 PetscScalar *av,*bv; 16 17 PetscFunctionBegin; 18 if (n != m) SETERRQ(PETSC_ERR_SUP,"Matrix must be a square matrix"); 19 if (!a->diag){ 20 ierr = MatMarkDiagonal_SeqAIJ(A);CHKERRQ(ierr); 21 } 22 23 ierr = PetscMalloc(m*sizeof(int),&rowlengths);CHKERRQ(ierr); 24 for (i=0; i<m; i++) { 25 rowlengths[i] = ai[i+1] - a->diag[i]; 26 } 27 ierr = MatCreateSeqSBAIJ(PETSC_COMM_SELF,1,m,n,0,rowlengths,B);CHKERRQ(ierr); 28 29 ierr = MatSetOption(*B,MAT_ROW_ORIENTED);CHKERRQ(ierr); 30 ierr = MatSetOption(*B,MAT_ROWS_SORTED);CHKERRQ(ierr); 31 ierr = MatSetOption(*B,MAT_COLUMNS_SORTED);CHKERRQ(ierr); 32 33 b = (Mat_SeqSBAIJ*)(*B)->data; 34 bi = b->i; 35 bj = b->j; 36 bv = b->a; 37 38 bi[0] = 0; 39 for (i=0; i<m; i++) { 40 aj = a->j + a->diag[i]; 41 av = a->a + a->diag[i]; 42 for (j=0; j<rowlengths[i]; j++){ 43 *bj = *aj; bj++; aj++; 44 *bv = *av; bv++; av++; 45 } 46 bi[i+1] = bi[i] + rowlengths[i]; 47 b->ilen[i] = rowlengths[i]; 48 } 49 50 ierr = PetscFree(rowlengths);CHKERRQ(ierr); 51 ierr = MatAssemblyBegin(*B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 52 ierr = MatAssemblyEnd(*B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 53 PetscFunctionReturn(0); 54 } 55 EXTERN_C_END 56 57