xref: /petsc/src/mat/utils/convert.c (revision 1111b64dd641ff9b0189bccba1c2a1ee10f9b8d6)
1 /*$Id: convert.c,v 1.71 2001/01/15 21:46:25 bsmith Exp bsmith $*/
2 
3 #include "src/mat/matimpl.h"
4 
5 #undef __FUNC__
6 #define __FUNC__ "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,MatType newtype,Mat *M)
14 {
15   Scalar     *vwork;
16   int        ierr,i,nz,m,n,*cwork,rstart,rend,lm;
17 
18   PetscFunctionBegin;
19   ierr = MatGetSize(mat,&m,&n);CHKERRQ(ierr);
20   ierr = MatGetLocalSize(mat,&lm,PETSC_NULL);CHKERRQ(ierr);
21 
22   ierr = MatCreate(mat->comm,lm,PETSC_DECIDE,m,n,M);CHKERRQ(ierr);
23   ierr = MatSetType(*M,newtype);CHKERRQ(ierr);
24 
25   ierr = MatGetOwnershipRange(mat,&rstart,&rend);CHKERRQ(ierr);
26   for (i=rstart; i<rend; i++) {
27     ierr = MatGetRow(mat,i,&nz,&cwork,&vwork);CHKERRQ(ierr);
28     ierr = MatSetValues(*M,1,&i,nz,cwork,vwork,INSERT_VALUES);CHKERRQ(ierr);
29     ierr = MatRestoreRow(mat,i,&nz,&cwork,&vwork);CHKERRQ(ierr);
30   }
31   ierr = MatAssemblyBegin(*M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
32   ierr = MatAssemblyEnd(*M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
33   PetscFunctionReturn(0);
34 }
35