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 */ 18*9566063dSJacob Faibussowitsch PetscCall(MatConvert_Shell(mat,newtype,reuse,newmat)); 198af18dd8SStefano Zampini PetscFunctionReturn(0); 208af18dd8SStefano Zampini } 21*9566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)mat,MATSEQSBAIJ,&isSBAIJ)); 2298e916f6SBarry Smith if (!isSBAIJ) { 23*9566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)mat,MATMPISBAIJ,&isSBAIJ)); 2498e916f6SBarry Smith } 2528b400f6SJacob 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; 31*9566063dSJacob Faibussowitsch PetscCall(MatGetSize(mat,&m,&n)); 32*9566063dSJacob Faibussowitsch PetscCall(MatGetLocalSize(mat,&lm,&ln)); 33*9566063dSJacob Faibussowitsch PetscCall(MatCreate(PetscObjectComm((PetscObject)mat),&M)); 34*9566063dSJacob Faibussowitsch PetscCall(MatSetSizes(M,lm,ln,m,n)); 35*9566063dSJacob Faibussowitsch PetscCall(MatSetBlockSizesFromMats(M,mat,mat)); 36*9566063dSJacob Faibussowitsch PetscCall(MatSetType(M,newtype)); 37*9566063dSJacob Faibussowitsch PetscCall(MatSetUp(M)); 382c0366f6SLisandro Dalcin 39*9566063dSJacob Faibussowitsch PetscCall(MatSetOption(M,MAT_NEW_NONZERO_LOCATION_ERR,PETSC_FALSE)); 40*9566063dSJacob Faibussowitsch PetscCall(MatSetOption(M,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_FALSE)); 41*9566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)M,MATSEQSBAIJ,&isSBAIJ)); 4298e916f6SBarry Smith if (!isSBAIJ) { 43*9566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)M,MATMPISBAIJ,&isSBAIJ)); 441a0cae60SJed Brown } 4598e916f6SBarry Smith if (isSBAIJ) { 46*9566063dSJacob Faibussowitsch PetscCall(MatSetOption(M,MAT_IGNORE_LOWER_TRIANGULAR,PETSC_TRUE)); 47d3bf5c86SHong Zhang } 482c0366f6SLisandro Dalcin } 491a0cae60SJed Brown 50*9566063dSJacob Faibussowitsch PetscCall(MatGetOwnershipRange(mat,&rstart,&rend)); 518b6375c0SLois Curfman McInnes for (i=rstart; i<rend; i++) { 52*9566063dSJacob Faibussowitsch PetscCall(MatGetRow(mat,i,&nz,&cwork,&vwork)); 53*9566063dSJacob Faibussowitsch PetscCall(MatSetValues(M,1,&i,nz,cwork,vwork,INSERT_VALUES)); 54*9566063dSJacob Faibussowitsch PetscCall(MatRestoreRow(mat,i,&nz,&cwork,&vwork)); 558b6375c0SLois Curfman McInnes } 56*9566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(M,MAT_FINAL_ASSEMBLY)); 57*9566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(M,MAT_FINAL_ASSEMBLY)); 58676c34cdSKris Buschelman 59511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 60*9566063dSJacob Faibussowitsch PetscCall(MatHeaderReplace(mat,&M)); 61c3d102feSKris Buschelman } else { 6218f87311SHong Zhang *newmat = M; 63c3d102feSKris Buschelman } 643a40ed3dSBarry Smith PetscFunctionReturn(0); 658b6375c0SLois Curfman McInnes } 66