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: #undef __FUNCT__  
  8: int MatConvert_SeqBAIJ_SeqAIJ(Mat A,MatType newtype,Mat *B)
  9: {
 10:   Mat_SeqBAIJ  *a = (Mat_SeqBAIJ*)A->data;
 11:   int          ierr,bs = a->bs,*ai = a->i,*aj = a->j,n = A->M/bs,i,j,k;
 12:   int          *rowlengths,*rows,*cols,maxlen = 0,ncols;
 13:   PetscScalar  *aa = a->a;

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

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