xref: /petsc/src/mat/utils/convert.c (revision 28b400f66ebc7ae0049166a2294dfcd3df27e64b)
156fe5c5cSLois Curfman McInnes 
2af0996ceSBarry Smith #include <petsc/private/matimpl.h>
38b6375c0SLois Curfman McInnes 
48b6375c0SLois Curfman McInnes /*
58af18dd8SStefano Zampini   MatConvert_Basic - Converts from any input format to another format.
6273d9f13SBarry Smith   Does not do preallocation so in general will be slow
78b6375c0SLois Curfman McInnes  */
8cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_Basic(Mat mat,MatType newtype,MatReuse reuse,Mat *newmat)
9b3cc6726SBarry Smith {
10676c34cdSKris Buschelman   Mat               M;
11b3cc6726SBarry Smith   const PetscScalar *vwork;
122c0366f6SLisandro Dalcin   PetscInt          i,rstart,rend,nz;
13c1ac3661SBarry Smith   const PetscInt    *cwork;
1498e916f6SBarry Smith   PetscBool         isSBAIJ;
1525cdf11fSBarry Smith 
163a40ed3dSBarry Smith   PetscFunctionBegin;
178af18dd8SStefano Zampini   if (!mat->ops->getrow) { /* missing get row, use matvecs */
185f80ce2aSJacob Faibussowitsch     CHKERRQ(MatConvert_Shell(mat,newtype,reuse,newmat));
198af18dd8SStefano Zampini     PetscFunctionReturn(0);
208af18dd8SStefano Zampini   }
215f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)mat,MATSEQSBAIJ,&isSBAIJ));
2298e916f6SBarry Smith   if (!isSBAIJ) {
235f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectTypeCompare((PetscObject)mat,MATMPISBAIJ,&isSBAIJ));
2498e916f6SBarry Smith   }
25*28b400f6SJacob Faibussowitsch   PetscCheck(!isSBAIJ,PetscObjectComm((PetscObject)mat),PETSC_ERR_SUP,"Cannot convert from SBAIJ matrix since cannot obtain entire rows of matrix");
2698e916f6SBarry Smith 
272c0366f6SLisandro Dalcin   if (reuse == MAT_REUSE_MATRIX) {
282c0366f6SLisandro Dalcin     M = *newmat;
292c0366f6SLisandro Dalcin   } else {
302c0366f6SLisandro Dalcin     PetscInt m,n,lm,ln;
315f80ce2aSJacob Faibussowitsch     CHKERRQ(MatGetSize(mat,&m,&n));
325f80ce2aSJacob Faibussowitsch     CHKERRQ(MatGetLocalSize(mat,&lm,&ln));
335f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCreate(PetscObjectComm((PetscObject)mat),&M));
345f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetSizes(M,lm,ln,m,n));
355f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetBlockSizesFromMats(M,mat,mat));
365f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetType(M,newtype));
375f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetUp(M));
382c0366f6SLisandro Dalcin 
395f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetOption(M,MAT_NEW_NONZERO_LOCATION_ERR,PETSC_FALSE));
405f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetOption(M,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_FALSE));
415f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectTypeCompare((PetscObject)M,MATSEQSBAIJ,&isSBAIJ));
4298e916f6SBarry Smith     if (!isSBAIJ) {
435f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscObjectTypeCompare((PetscObject)M,MATMPISBAIJ,&isSBAIJ));
441a0cae60SJed Brown     }
4598e916f6SBarry Smith     if (isSBAIJ) {
465f80ce2aSJacob Faibussowitsch       CHKERRQ(MatSetOption(M,MAT_IGNORE_LOWER_TRIANGULAR,PETSC_TRUE));
47d3bf5c86SHong Zhang     }
482c0366f6SLisandro Dalcin   }
491a0cae60SJed Brown 
505f80ce2aSJacob Faibussowitsch   CHKERRQ(MatGetOwnershipRange(mat,&rstart,&rend));
518b6375c0SLois Curfman McInnes   for (i=rstart; i<rend; i++) {
525f80ce2aSJacob Faibussowitsch     CHKERRQ(MatGetRow(mat,i,&nz,&cwork,&vwork));
535f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetValues(M,1,&i,nz,cwork,vwork,INSERT_VALUES));
545f80ce2aSJacob Faibussowitsch     CHKERRQ(MatRestoreRow(mat,i,&nz,&cwork,&vwork));
558b6375c0SLois Curfman McInnes   }
565f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyBegin(M,MAT_FINAL_ASSEMBLY));
575f80ce2aSJacob Faibussowitsch   CHKERRQ(MatAssemblyEnd(M,MAT_FINAL_ASSEMBLY));
58676c34cdSKris Buschelman 
59511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
605f80ce2aSJacob Faibussowitsch     CHKERRQ(MatHeaderReplace(mat,&M));
61c3d102feSKris Buschelman   } else {
6218f87311SHong Zhang     *newmat = M;
63c3d102feSKris Buschelman   }
643a40ed3dSBarry Smith   PetscFunctionReturn(0);
658b6375c0SLois Curfman McInnes }
66