1ba92ff59SBarry Smith #include <petsctao.h> /*I "petsctao.h" I*/ 2aaa7dc30SBarry Smith #include <../src/tao/matrix/submatfree.h> /*I "submatfree.h" I*/ 3a7e14dcfSSatish Balay 4a7e14dcfSSatish Balay /*@C 5a7e14dcfSSatish Balay MatCreateSubMatrixFree - Creates a reduced matrix by masking a 6a7e14dcfSSatish Balay full matrix. 7a7e14dcfSSatish Balay 8a7e14dcfSSatish Balay Collective on matrix 9a7e14dcfSSatish Balay 10a7e14dcfSSatish Balay Input Parameters: 11a7e14dcfSSatish Balay + mat - matrix of arbitrary type 12a7e14dcfSSatish Balay . Rows - the rows that will be in the submatrix 13a7e14dcfSSatish Balay - Cols - the columns that will be in the submatrix 14a7e14dcfSSatish Balay 15a7e14dcfSSatish Balay Output Parameters: 16a7e14dcfSSatish Balay . J - New matrix 17a7e14dcfSSatish Balay 18a7e14dcfSSatish Balay Notes: 19a7e14dcfSSatish Balay The user provides the input data and is responsible for destroying 20a7e14dcfSSatish Balay this data after matrix J has been destroyed. 21a7e14dcfSSatish Balay 22a7e14dcfSSatish Balay Level: developer 23a7e14dcfSSatish Balay 24a7e14dcfSSatish Balay .seealso: MatCreate() 25a7e14dcfSSatish Balay @*/ 26a7e14dcfSSatish Balay PetscErrorCode MatCreateSubMatrixFree(Mat mat,IS Rows, IS Cols, Mat *J) 27a7e14dcfSSatish Balay { 28367daffbSBarry Smith MPI_Comm comm=PetscObjectComm((PetscObject)mat); 29a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 30a7e14dcfSSatish Balay PetscErrorCode ierr; 31a7e14dcfSSatish Balay PetscMPIInt size; 32a7e14dcfSSatish Balay PetscInt mloc,nloc,m,n; 33a7e14dcfSSatish Balay 3487f595a5SBarry Smith PetscFunctionBegin; 353c9e27cfSGeoffrey Irving ierr = PetscNew(&ctx);CHKERRQ(ierr); 36a7e14dcfSSatish Balay ctx->A=mat; 37a7e14dcfSSatish Balay ierr = MatGetSize(mat,&m,&n);CHKERRQ(ierr); 38a7e14dcfSSatish Balay ierr = MatGetLocalSize(mat,&mloc,&nloc);CHKERRQ(ierr); 39302440fdSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 40a7e14dcfSSatish Balay if (size == 1) { 41a7e14dcfSSatish Balay ierr = VecCreateSeq(comm,n,&ctx->VC);CHKERRQ(ierr); 42a7e14dcfSSatish Balay } else { 43a7e14dcfSSatish Balay ierr = VecCreateMPI(comm,nloc,n,&ctx->VC);CHKERRQ(ierr); 44a7e14dcfSSatish Balay } 45a7e14dcfSSatish Balay ctx->VR=ctx->VC; 46a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)mat);CHKERRQ(ierr); 47a7e14dcfSSatish Balay 48a7e14dcfSSatish Balay 49a7e14dcfSSatish Balay ctx->Rows = Rows; 50a7e14dcfSSatish Balay ctx->Cols = Cols; 51a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Rows);CHKERRQ(ierr); 52a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Cols);CHKERRQ(ierr); 53a7e14dcfSSatish Balay ierr = MatCreateShell(comm,mloc,nloc,m,n,ctx,J);CHKERRQ(ierr); 54a7e14dcfSSatish Balay 55a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_MULT,(void(*)(void))MatMult_SMF);CHKERRQ(ierr); 56a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_DESTROY,(void(*)(void))MatDestroy_SMF);CHKERRQ(ierr); 57a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_VIEW,(void(*)(void))MatView_SMF);CHKERRQ(ierr); 58a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_MULT_TRANSPOSE,(void(*)(void))MatMultTranspose_SMF);CHKERRQ(ierr); 59a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_DIAGONAL_SET,(void(*)(void))MatDiagonalSet_SMF);CHKERRQ(ierr); 60a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_SHIFT,(void(*)(void))MatShift_SMF);CHKERRQ(ierr); 61a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_EQUAL,(void(*)(void))MatEqual_SMF);CHKERRQ(ierr); 62a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_SCALE,(void(*)(void))MatScale_SMF);CHKERRQ(ierr); 63a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_TRANSPOSE,(void(*)(void))MatTranspose_SMF);CHKERRQ(ierr); 64a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_GET_DIAGONAL,(void(*)(void))MatGetDiagonal_SMF);CHKERRQ(ierr); 65*7dae84e0SHong Zhang ierr = MatShellSetOperation(*J,MATOP_CREATE_SUBMATRICES,(void(*)(void))MatCreateSubMatrices_SMF);CHKERRQ(ierr); 66a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_NORM,(void(*)(void))MatNorm_SMF);CHKERRQ(ierr); 67a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_DUPLICATE,(void(*)(void))MatDuplicate_SMF);CHKERRQ(ierr); 68*7dae84e0SHong Zhang ierr = MatShellSetOperation(*J,MATOP_CREATE_SUBMATRIX,(void(*)(void))MatCreateSubMatrix_SMF);CHKERRQ(ierr); 69a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_GET_ROW_MAX,(void(*)(void))MatDuplicate_SMF);CHKERRQ(ierr); 70a7e14dcfSSatish Balay 71a7e14dcfSSatish Balay ierr = PetscLogObjectParent((PetscObject)mat,(PetscObject)(*J));CHKERRQ(ierr); 72a7e14dcfSSatish Balay PetscFunctionReturn(0); 73a7e14dcfSSatish Balay } 74a7e14dcfSSatish Balay 75a7e14dcfSSatish Balay PetscErrorCode MatSMFResetRowColumn(Mat mat,IS Rows,IS Cols){ 76a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 77a7e14dcfSSatish Balay PetscErrorCode ierr; 78a7e14dcfSSatish Balay 79a7e14dcfSSatish Balay PetscFunctionBegin; 80a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 81a7e14dcfSSatish Balay ierr = ISDestroy(&ctx->Rows);CHKERRQ(ierr); 82a7e14dcfSSatish Balay ierr = ISDestroy(&ctx->Cols);CHKERRQ(ierr); 83a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Rows);CHKERRQ(ierr); 84a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Cols);CHKERRQ(ierr); 85a7e14dcfSSatish Balay ctx->Cols=Cols; 86a7e14dcfSSatish Balay ctx->Rows=Rows; 87a7e14dcfSSatish Balay PetscFunctionReturn(0); 88a7e14dcfSSatish Balay } 89a7e14dcfSSatish Balay 90a7e14dcfSSatish Balay PetscErrorCode MatMult_SMF(Mat mat,Vec a,Vec y) 91a7e14dcfSSatish Balay { 92a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 93a7e14dcfSSatish Balay PetscErrorCode ierr; 94a7e14dcfSSatish Balay 95a7e14dcfSSatish Balay PetscFunctionBegin; 96a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 97a7e14dcfSSatish Balay ierr = VecCopy(a,ctx->VR);CHKERRQ(ierr); 984473680cSBarry Smith ierr = VecISSet(ctx->VR,ctx->Cols,0.0);CHKERRQ(ierr); 99a7e14dcfSSatish Balay ierr = MatMult(ctx->A,ctx->VR,y);CHKERRQ(ierr); 1004473680cSBarry Smith ierr = VecISSet(y,ctx->Rows,0.0);CHKERRQ(ierr); 101a7e14dcfSSatish Balay PetscFunctionReturn(0); 102a7e14dcfSSatish Balay } 103a7e14dcfSSatish Balay 104a7e14dcfSSatish Balay PetscErrorCode MatMultTranspose_SMF(Mat mat,Vec a,Vec y) 105a7e14dcfSSatish Balay { 106a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 107a7e14dcfSSatish Balay PetscErrorCode ierr; 108a7e14dcfSSatish Balay 109a7e14dcfSSatish Balay PetscFunctionBegin; 110a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 111a7e14dcfSSatish Balay ierr = VecCopy(a,ctx->VC);CHKERRQ(ierr); 1124473680cSBarry Smith ierr = VecISSet(ctx->VC,ctx->Rows,0.0);CHKERRQ(ierr); 113a7e14dcfSSatish Balay ierr = MatMultTranspose(ctx->A,ctx->VC,y);CHKERRQ(ierr); 1144473680cSBarry Smith ierr = VecISSet(y,ctx->Cols,0.0);CHKERRQ(ierr); 115a7e14dcfSSatish Balay PetscFunctionReturn(0); 116a7e14dcfSSatish Balay } 117a7e14dcfSSatish Balay 118a7e14dcfSSatish Balay PetscErrorCode MatDiagonalSet_SMF(Mat M, Vec D,InsertMode is) 119a7e14dcfSSatish Balay { 120a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 121a7e14dcfSSatish Balay PetscErrorCode ierr; 122a7e14dcfSSatish Balay 123a7e14dcfSSatish Balay PetscFunctionBegin; 124a7e14dcfSSatish Balay ierr = MatShellGetContext(M,(void **)&ctx);CHKERRQ(ierr); 125302440fdSBarry Smith ierr = MatDiagonalSet(ctx->A,D,is);CHKERRQ(ierr); 126a7e14dcfSSatish Balay PetscFunctionReturn(0); 127a7e14dcfSSatish Balay } 128a7e14dcfSSatish Balay 129a7e14dcfSSatish Balay PetscErrorCode MatDestroy_SMF(Mat mat) 130a7e14dcfSSatish Balay { 131a7e14dcfSSatish Balay PetscErrorCode ierr; 132a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 133a7e14dcfSSatish Balay 134a7e14dcfSSatish Balay PetscFunctionBegin; 135a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 136a7e14dcfSSatish Balay ierr = MatDestroy(&ctx->A);CHKERRQ(ierr); 137a7e14dcfSSatish Balay ierr = ISDestroy(&ctx->Rows);CHKERRQ(ierr); 138a7e14dcfSSatish Balay ierr = ISDestroy(&ctx->Cols);CHKERRQ(ierr); 139a7e14dcfSSatish Balay ierr = VecDestroy(&ctx->VC);CHKERRQ(ierr); 140a7e14dcfSSatish Balay ierr = PetscFree(ctx);CHKERRQ(ierr); 141a7e14dcfSSatish Balay PetscFunctionReturn(0); 142a7e14dcfSSatish Balay } 143a7e14dcfSSatish Balay 144a7e14dcfSSatish Balay 145a7e14dcfSSatish Balay 146a7e14dcfSSatish Balay PetscErrorCode MatView_SMF(Mat mat,PetscViewer viewer) 147a7e14dcfSSatish Balay { 148a7e14dcfSSatish Balay PetscErrorCode ierr; 149a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 150a7e14dcfSSatish Balay 151a7e14dcfSSatish Balay PetscFunctionBegin; 152a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 153a7e14dcfSSatish Balay ierr = MatView(ctx->A,viewer);CHKERRQ(ierr); 154a7e14dcfSSatish Balay PetscFunctionReturn(0); 155a7e14dcfSSatish Balay } 156a7e14dcfSSatish Balay 157a7e14dcfSSatish Balay PetscErrorCode MatShift_SMF(Mat Y, PetscReal a) 158a7e14dcfSSatish Balay { 159a7e14dcfSSatish Balay PetscErrorCode ierr; 160a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 161a7e14dcfSSatish Balay 162a7e14dcfSSatish Balay PetscFunctionBegin; 163a7e14dcfSSatish Balay ierr = MatShellGetContext(Y,(void **)&ctx);CHKERRQ(ierr); 164a7e14dcfSSatish Balay ierr = MatShift(ctx->A,a);CHKERRQ(ierr); 165a7e14dcfSSatish Balay PetscFunctionReturn(0); 166a7e14dcfSSatish Balay } 167a7e14dcfSSatish Balay 168a7e14dcfSSatish Balay PetscErrorCode MatDuplicate_SMF(Mat mat,MatDuplicateOption op,Mat *M) 169a7e14dcfSSatish Balay { 170a7e14dcfSSatish Balay PetscErrorCode ierr; 171a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 172a7e14dcfSSatish Balay 173a7e14dcfSSatish Balay PetscFunctionBegin; 174a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 175a7e14dcfSSatish Balay ierr = MatCreateSubMatrixFree(ctx->A,ctx->Rows,ctx->Cols,M);CHKERRQ(ierr); 176a7e14dcfSSatish Balay PetscFunctionReturn(0); 177a7e14dcfSSatish Balay } 178a7e14dcfSSatish Balay 179a7e14dcfSSatish Balay PetscErrorCode MatEqual_SMF(Mat A,Mat B,PetscBool *flg) 180a7e14dcfSSatish Balay { 181a7e14dcfSSatish Balay PetscErrorCode ierr; 182a7e14dcfSSatish Balay MatSubMatFreeCtx ctx1,ctx2; 183a7e14dcfSSatish Balay PetscBool flg1,flg2,flg3; 184a7e14dcfSSatish Balay 185a7e14dcfSSatish Balay PetscFunctionBegin; 186a7e14dcfSSatish Balay ierr = MatShellGetContext(A,(void **)&ctx1);CHKERRQ(ierr); 187a7e14dcfSSatish Balay ierr = MatShellGetContext(B,(void **)&ctx2);CHKERRQ(ierr); 188a7e14dcfSSatish Balay ierr = ISEqual(ctx1->Rows,ctx2->Rows,&flg2);CHKERRQ(ierr); 189a7e14dcfSSatish Balay ierr = ISEqual(ctx1->Cols,ctx2->Cols,&flg3);CHKERRQ(ierr); 190a7e14dcfSSatish Balay if (flg2==PETSC_FALSE || flg3==PETSC_FALSE){ 191a7e14dcfSSatish Balay *flg=PETSC_FALSE; 192a7e14dcfSSatish Balay } else { 193a7e14dcfSSatish Balay ierr = MatEqual(ctx1->A,ctx2->A,&flg1);CHKERRQ(ierr); 194a7e14dcfSSatish Balay if (flg1==PETSC_FALSE){ *flg=PETSC_FALSE;} 195a7e14dcfSSatish Balay else { *flg=PETSC_TRUE;} 196a7e14dcfSSatish Balay } 197a7e14dcfSSatish Balay PetscFunctionReturn(0); 198a7e14dcfSSatish Balay } 199a7e14dcfSSatish Balay 200a7e14dcfSSatish Balay PetscErrorCode MatScale_SMF(Mat mat, PetscReal a) 201a7e14dcfSSatish Balay { 202a7e14dcfSSatish Balay PetscErrorCode ierr; 203a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 204a7e14dcfSSatish Balay 205a7e14dcfSSatish Balay PetscFunctionBegin; 206a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 207a7e14dcfSSatish Balay ierr = MatScale(ctx->A,a);CHKERRQ(ierr); 208a7e14dcfSSatish Balay PetscFunctionReturn(0); 209a7e14dcfSSatish Balay } 210a7e14dcfSSatish Balay 211a7e14dcfSSatish Balay PetscErrorCode MatTranspose_SMF(Mat mat,Mat *B) 212a7e14dcfSSatish Balay { 213a7e14dcfSSatish Balay PetscFunctionBegin; 214a7e14dcfSSatish Balay PetscFunctionReturn(1); 215a7e14dcfSSatish Balay } 216a7e14dcfSSatish Balay 217a7e14dcfSSatish Balay PetscErrorCode MatGetDiagonal_SMF(Mat mat,Vec v) 218a7e14dcfSSatish Balay { 219a7e14dcfSSatish Balay PetscErrorCode ierr; 220a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 221a7e14dcfSSatish Balay 222a7e14dcfSSatish Balay PetscFunctionBegin; 223a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 224a7e14dcfSSatish Balay ierr = MatGetDiagonal(ctx->A,v);CHKERRQ(ierr); 225a7e14dcfSSatish Balay PetscFunctionReturn(0); 226a7e14dcfSSatish Balay } 227a7e14dcfSSatish Balay 228a7e14dcfSSatish Balay PetscErrorCode MatGetRowMax_SMF(Mat M, Vec D) 229a7e14dcfSSatish Balay { 230a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 231a7e14dcfSSatish Balay PetscErrorCode ierr; 232a7e14dcfSSatish Balay 233a7e14dcfSSatish Balay PetscFunctionBegin; 234a7e14dcfSSatish Balay ierr = MatShellGetContext(M,(void **)&ctx);CHKERRQ(ierr); 235302440fdSBarry Smith ierr = MatGetRowMax(ctx->A,D,NULL);CHKERRQ(ierr); 236a7e14dcfSSatish Balay PetscFunctionReturn(0); 237a7e14dcfSSatish Balay } 238a7e14dcfSSatish Balay 239*7dae84e0SHong Zhang PetscErrorCode MatCreateSubMatrices_SMF(Mat A,PetscInt n, IS *irow,IS *icol,MatReuse scall,Mat **B) 240a7e14dcfSSatish Balay { 241a7e14dcfSSatish Balay PetscErrorCode ierr; 242a7e14dcfSSatish Balay PetscInt i; 243a7e14dcfSSatish Balay 244a7e14dcfSSatish Balay PetscFunctionBegin; 245a7e14dcfSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 246df750dc8SHong Zhang ierr = PetscCalloc1(n+1,B );CHKERRQ(ierr); 247a7e14dcfSSatish Balay } 248a7e14dcfSSatish Balay 249a7e14dcfSSatish Balay for ( i=0; i<n; i++ ) { 250*7dae84e0SHong Zhang ierr = MatCreateSubMatrix_SMF(A,irow[i],icol[i],scall,&(*B)[i]);CHKERRQ(ierr); 251a7e14dcfSSatish Balay } 252a7e14dcfSSatish Balay PetscFunctionReturn(0); 253a7e14dcfSSatish Balay } 254a7e14dcfSSatish Balay 255*7dae84e0SHong Zhang PetscErrorCode MatCreateSubMatrix_SMF(Mat mat,IS isrow,IS iscol,MatReuse cll, 256a7e14dcfSSatish Balay Mat *newmat) 257a7e14dcfSSatish Balay { 258a7e14dcfSSatish Balay PetscErrorCode ierr; 259a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 260a7e14dcfSSatish Balay 261a7e14dcfSSatish Balay PetscFunctionBegin; 262a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 263a7e14dcfSSatish Balay if (newmat){ 264a7e14dcfSSatish Balay ierr = MatDestroy(&*newmat);CHKERRQ(ierr); 265a7e14dcfSSatish Balay } 266a7e14dcfSSatish Balay ierr = MatCreateSubMatrixFree(ctx->A,isrow,iscol, newmat);CHKERRQ(ierr); 267a7e14dcfSSatish Balay PetscFunctionReturn(0); 268a7e14dcfSSatish Balay } 269a7e14dcfSSatish Balay 270a62a097fSLisandro Dalcin PetscErrorCode MatGetRow_SMF(Mat mat,PetscInt row,PetscInt *ncols,const PetscInt **cols,const PetscScalar **vals) 271a7e14dcfSSatish Balay { 272a7e14dcfSSatish Balay PetscErrorCode ierr; 273a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 274a7e14dcfSSatish Balay 275a7e14dcfSSatish Balay PetscFunctionBegin; 276a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 277a7e14dcfSSatish Balay ierr = MatGetRow(ctx->A,row,ncols,cols,vals);CHKERRQ(ierr); 278a7e14dcfSSatish Balay PetscFunctionReturn(0); 279a7e14dcfSSatish Balay } 280a7e14dcfSSatish Balay 281a62a097fSLisandro Dalcin PetscErrorCode MatRestoreRow_SMF(Mat mat,PetscInt row,PetscInt *ncols,const PetscInt **cols,const PetscScalar **vals) 282a7e14dcfSSatish Balay { 283a7e14dcfSSatish Balay PetscErrorCode ierr; 284a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 285a7e14dcfSSatish Balay 286a7e14dcfSSatish Balay PetscFunctionBegin; 287a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 288a7e14dcfSSatish Balay ierr = MatRestoreRow(ctx->A,row,ncols,cols,vals);CHKERRQ(ierr); 289a7e14dcfSSatish Balay PetscFunctionReturn(0); 290a7e14dcfSSatish Balay } 291a7e14dcfSSatish Balay 292a7e14dcfSSatish Balay PetscErrorCode MatGetColumnVector_SMF(Mat mat,Vec Y, PetscInt col) 293a7e14dcfSSatish Balay { 294a7e14dcfSSatish Balay PetscErrorCode ierr; 295a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 296a7e14dcfSSatish Balay 297a7e14dcfSSatish Balay PetscFunctionBegin; 298a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 299a7e14dcfSSatish Balay ierr = MatGetColumnVector(ctx->A,Y,col);CHKERRQ(ierr); 300a7e14dcfSSatish Balay PetscFunctionReturn(0); 301a7e14dcfSSatish Balay } 302a7e14dcfSSatish Balay 303a7e14dcfSSatish Balay PetscErrorCode MatConvert_SMF(Mat mat,MatType newtype,Mat *NewMat) 304a7e14dcfSSatish Balay { 305a7e14dcfSSatish Balay PetscErrorCode ierr; 306a7e14dcfSSatish Balay PetscMPIInt size; 307a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 308a7e14dcfSSatish Balay 309a7e14dcfSSatish Balay PetscFunctionBegin; 310a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 311367daffbSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)mat),&size);CHKERRQ(ierr); 312a7e14dcfSSatish Balay PetscFunctionReturn(1); 313a7e14dcfSSatish Balay } 314a7e14dcfSSatish Balay 315a7e14dcfSSatish Balay PetscErrorCode MatNorm_SMF(Mat mat,NormType type,PetscReal *norm) 316a7e14dcfSSatish Balay { 317a7e14dcfSSatish Balay PetscErrorCode ierr; 318a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 319a7e14dcfSSatish Balay 320a7e14dcfSSatish Balay PetscFunctionBegin; 321a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 322a7e14dcfSSatish Balay if (type == NORM_FROBENIUS) { 323a7e14dcfSSatish Balay *norm = 1.0; 324a7e14dcfSSatish Balay } else if (type == NORM_1 || type == NORM_INFINITY) { 325a7e14dcfSSatish Balay *norm = 1.0; 32687f595a5SBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 327a7e14dcfSSatish Balay PetscFunctionReturn(0); 328a7e14dcfSSatish Balay } 329a7e14dcfSSatish Balay 330