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