xref: /petsc/src/mat/utils/convert.c (revision fcca9d3d5c45103cafcd0f6bc9babe194d935ced)
1 /*$Id: convert.c,v 1.76 2001/08/07 03:03:20 balay Exp $*/
2 
3 #include "src/mat/matimpl.h"
4 
5 #undef __FUNCT__
6 #define __FUNCT__ "MatConvert_Basic"
7 /*
8   MatConvert_Basic - Converts from any input format to another format. For
9   parallel formats, the new matrix distribution is determined by PETSc.
10 
11   Does not do preallocation so in general will be slow
12  */
13 int MatConvert_Basic(Mat mat,const MatType newtype,Mat *newmat) {
14   Mat          M;
15   PetscScalar  *vwork;
16   int          ierr,i,nz,m,n,*cwork,rstart,rend,lm,ln;
17 
18   PetscFunctionBegin;
19   ierr = MatGetSize(mat,&m,&n);CHKERRQ(ierr);
20   ierr = MatGetLocalSize(mat,&lm,&ln);CHKERRQ(ierr);
21 
22   if (ln == n) ln = PETSC_DECIDE; /* try to preserve column ownership */
23 
24   ierr = MatCreate(mat->comm,lm,ln,m,n,&M);CHKERRQ(ierr);
25   ierr = MatSetType(M,newtype);CHKERRQ(ierr);
26 
27   ierr = MatGetOwnershipRange(mat,&rstart,&rend);CHKERRQ(ierr);
28   for (i=rstart; i<rend; i++) {
29     ierr = MatGetRow(mat,i,&nz,&cwork,&vwork);CHKERRQ(ierr);
30     ierr = MatSetValues(M,1,&i,nz,cwork,vwork,INSERT_VALUES);CHKERRQ(ierr);
31     ierr = MatRestoreRow(mat,i,&nz,&cwork,&vwork);CHKERRQ(ierr);
32   }
33   ierr = MatAssemblyBegin(M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
34   ierr = MatAssemblyEnd(M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
35 
36   /* Fake support for "inplace" convert. */
37   if (*newmat == mat) {
38     ierr = MatDestroy(mat);CHKERRQ(ierr);
39   }
40   *newmat = M;
41   PetscFunctionReturn(0);
42 }
43