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