xref: /petsc/src/mat/utils/convert.c (revision b3cc6726fbddf13cd805f591b2b0fc9b163819ab)
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