Actual source code: aijbaij.c

  1: /*$Id: aijbaij.c,v 1.9 2001/08/07 03:02:55 balay Exp $*/

 3:  #include src/mat/impls/baij/seq/baij.h

  5: EXTERN_C_BEGIN
  6: int MatConvert_SeqBAIJ_SeqAIJ(Mat A,MatType newtype,Mat *B)
  7: {
  8:   Mat_SeqBAIJ  *a = (Mat_SeqBAIJ*)A->data;
  9:   int          ierr,bs = a->bs,*ai = a->i,*aj = a->j,n = A->M/bs,i,j,k;
 10:   int          *rowlengths,*rows,*cols,maxlen = 0,ncols;
 11:   PetscScalar  *aa = a->a;

 14:   PetscMalloc(n*bs*sizeof(int),&rowlengths);
 15:   for (i=0; i<n; i++) {
 16:     maxlen = PetscMax(maxlen,(ai[i+1] - ai[i]));
 17:     for (j=0; j<bs; j++) {
 18:       rowlengths[i*bs+j] = bs*(ai[i+1] - ai[i]);
 19:     }
 20:   }
 21:   MatCreateSeqAIJ(PETSC_COMM_SELF,A->m,A->n,0,rowlengths,B);
 22:   MatSetOption(*B,MAT_COLUMN_ORIENTED);
 23:   MatSetOption(*B,MAT_ROWS_SORTED);
 24:   MatSetOption(*B,MAT_COLUMNS_SORTED);
 25:   PetscFree(rowlengths);

 27:   PetscMalloc(bs*sizeof(int),&rows);
 28:   PetscMalloc(bs*maxlen*sizeof(int),&cols);
 29:   for (i=0; i<n; i++) {
 30:     for (j=0; j<bs; j++) {
 31:       rows[j] = i*bs+j;
 32:     }
 33:     ncols = ai[i+1] - ai[i];
 34:     for (k=0; k<ncols; k++) {
 35:       for (j=0; j<bs; j++) {
 36:         cols[k*bs+j] = bs*(*aj) + j;
 37:       }
 38:       aj++;
 39:     }
 40:     ierr  = MatSetValues(*B,bs,rows,bs*ncols,cols,aa,INSERT_VALUES);
 41:     aa   += ncols*bs*bs;
 42:   }
 43:   PetscFree(cols);
 44:   PetscFree(rows);
 45:   MatAssemblyBegin(*B,MAT_FINAL_ASSEMBLY);
 46:   MatAssemblyEnd(*B,MAT_FINAL_ASSEMBLY);
 47:   return(0);
 48: }
 49: EXTERN_C_END