1 #define PETSCMAT_DLL 2 3 #include "include/private/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 PetscErrorCode MatConvert_Basic(Mat mat, MatType newtype,MatReuse reuse,Mat *newmat) 14 { 15 Mat M; 16 const PetscScalar *vwork; 17 PetscErrorCode ierr; 18 PetscInt i,nz,m,n,rstart,rend,lm,ln; 19 const PetscInt *cwork; 20 21 PetscFunctionBegin; 22 ierr = MatGetSize(mat,&m,&n);CHKERRQ(ierr); 23 ierr = MatGetLocalSize(mat,&lm,&ln);CHKERRQ(ierr); 24 25 if (ln == n) ln = PETSC_DECIDE; /* try to preserve column ownership */ 26 27 ierr = MatCreate(mat->comm,&M);CHKERRQ(ierr); 28 ierr = MatSetSizes(M,lm,ln,m,n);CHKERRQ(ierr); 29 ierr = MatSetType(M,newtype);CHKERRQ(ierr); 30 31 ierr = MatGetOwnershipRange(mat,&rstart,&rend);CHKERRQ(ierr); 32 for (i=rstart; i<rend; i++) { 33 ierr = MatGetRow(mat,i,&nz,&cwork,&vwork);CHKERRQ(ierr); 34 ierr = MatSetValues(M,1,&i,nz,cwork,vwork,INSERT_VALUES);CHKERRQ(ierr); 35 ierr = MatRestoreRow(mat,i,&nz,&cwork,&vwork);CHKERRQ(ierr); 36 } 37 ierr = MatAssemblyBegin(M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 38 ierr = MatAssemblyEnd(M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 39 40 if (reuse == MAT_REUSE_MATRIX) { 41 ierr = MatHeaderReplace(mat,M);CHKERRQ(ierr); 42 } else { 43 *newmat = M; 44 } 45 PetscFunctionReturn(0); 46 } 47