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