156fe5c5cSLois Curfman McInnes 294a9d846SBarry Smith #include "src/mat/matimpl.h" 38b6375c0SLois Curfman McInnes 44a2ae208SSatish Balay #undef __FUNCT__ 54a2ae208SSatish Balay #define __FUNCT__ "MatConvert_Basic" 68b6375c0SLois Curfman McInnes /* 78b6375c0SLois Curfman McInnes MatConvert_Basic - Converts from any input format to another format. For 88b6375c0SLois Curfman McInnes parallel formats, the new matrix distribution is determined by PETSc. 9273d9f13SBarry Smith 10273d9f13SBarry Smith Does not do preallocation so in general will be slow 118b6375c0SLois Curfman McInnes */ 12*b3cc6726SBarry Smith int MatConvert_Basic(Mat mat,const MatType newtype,Mat *newmat)\ 13*b3cc6726SBarry Smith { 14676c34cdSKris Buschelman Mat M; 15*b3cc6726SBarry Smith const PetscScalar *vwork; 16*b3cc6726SBarry Smith int ierr,i,nz,m,n,rstart,rend,lm,ln; 17*b3cc6726SBarry Smith const int *cwork; 1825cdf11fSBarry Smith 193a40ed3dSBarry Smith PetscFunctionBegin; 208b6375c0SLois Curfman McInnes ierr = MatGetSize(mat,&m,&n);CHKERRQ(ierr); 21435da068SBarry Smith ierr = MatGetLocalSize(mat,&lm,&ln);CHKERRQ(ierr); 22273d9f13SBarry Smith 23435da068SBarry Smith if (ln == n) ln = PETSC_DECIDE; /* try to preserve column ownership */ 24435da068SBarry Smith 25676c34cdSKris Buschelman ierr = MatCreate(mat->comm,lm,ln,m,n,&M);CHKERRQ(ierr); 26676c34cdSKris Buschelman ierr = MatSetType(M,newtype);CHKERRQ(ierr); 27273d9f13SBarry Smith 28f1af5d2fSBarry Smith ierr = MatGetOwnershipRange(mat,&rstart,&rend);CHKERRQ(ierr); 298b6375c0SLois Curfman McInnes for (i=rstart; i<rend; i++) { 308b6375c0SLois Curfman McInnes ierr = MatGetRow(mat,i,&nz,&cwork,&vwork);CHKERRQ(ierr); 31676c34cdSKris Buschelman ierr = MatSetValues(M,1,&i,nz,cwork,vwork,INSERT_VALUES);CHKERRQ(ierr); 328b6375c0SLois Curfman McInnes ierr = MatRestoreRow(mat,i,&nz,&cwork,&vwork);CHKERRQ(ierr); 338b6375c0SLois Curfman McInnes } 34676c34cdSKris Buschelman ierr = MatAssemblyBegin(M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 35676c34cdSKris Buschelman ierr = MatAssemblyEnd(M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 36676c34cdSKris Buschelman 37676c34cdSKris Buschelman /* Fake support for "inplace" convert. */ 38efe6450aSKris Buschelman if (*newmat == mat) { 39efe6450aSKris Buschelman ierr = MatDestroy(mat);CHKERRQ(ierr); 40676c34cdSKris Buschelman } 41676c34cdSKris Buschelman *newmat = M; 423a40ed3dSBarry Smith PetscFunctionReturn(0); 438b6375c0SLois Curfman McInnes } 44