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