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