1*b0a32e0cSBarry Smith /*$Id: convert.c,v 1.70 2000/10/24 20:26:14 bsmith Exp bsmith $*/ 256fe5c5cSLois Curfman McInnes 394a9d846SBarry Smith #include "src/mat/matimpl.h" 48b6375c0SLois Curfman McInnes 55615d1e5SSatish Balay #undef __FUNC__ 6*b0a32e0cSBarry Smith #define __FUNC__ "MatConvert_Basic" 78b6375c0SLois Curfman McInnes /* 88b6375c0SLois Curfman McInnes MatConvert_Basic - Converts from any input format to another format. For 98b6375c0SLois Curfman McInnes parallel formats, the new matrix distribution is determined by PETSc. 10273d9f13SBarry Smith 11273d9f13SBarry Smith Does not do preallocation so in general will be slow 128b6375c0SLois Curfman McInnes */ 138b6375c0SLois Curfman McInnes int MatConvert_Basic(Mat mat,MatType newtype,Mat *M) 148b6375c0SLois Curfman McInnes { 158b6375c0SLois Curfman McInnes Scalar *vwork; 16f1af5d2fSBarry Smith int ierr,i,nz,m,n,*cwork,rstart,rend,lm,ln; 1725cdf11fSBarry Smith 183a40ed3dSBarry Smith PetscFunctionBegin; 198b6375c0SLois Curfman McInnes ierr = MatGetSize(mat,&m,&n);CHKERRQ(ierr); 20f1af5d2fSBarry Smith ierr = MatGetLocalSize(mat,&lm,&ln);CHKERRQ(ierr); 21273d9f13SBarry Smith 22273d9f13SBarry Smith ierr = MatCreate(mat->comm,lm,ln,m,n,M);CHKERRQ(ierr); 23273d9f13SBarry Smith ierr = MatSetType(*M,newtype);CHKERRQ(ierr); 24273d9f13SBarry Smith 25f1af5d2fSBarry Smith ierr = MatGetOwnershipRange(mat,&rstart,&rend);CHKERRQ(ierr); 268b6375c0SLois Curfman McInnes for (i=rstart; i<rend; i++) { 278b6375c0SLois Curfman McInnes ierr = MatGetRow(mat,i,&nz,&cwork,&vwork);CHKERRQ(ierr); 288b6375c0SLois Curfman McInnes ierr = MatSetValues(*M,1,&i,nz,cwork,vwork,INSERT_VALUES);CHKERRQ(ierr); 298b6375c0SLois Curfman McInnes ierr = MatRestoreRow(mat,i,&nz,&cwork,&vwork);CHKERRQ(ierr); 308b6375c0SLois Curfman McInnes } 316d4a8577SBarry Smith ierr = MatAssemblyBegin(*M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 326d4a8577SBarry Smith ierr = MatAssemblyEnd(*M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 333a40ed3dSBarry Smith PetscFunctionReturn(0); 348b6375c0SLois Curfman McInnes } 35