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: 19*0c0fd78eSBarry Smith The caller is responsible for destroying the input objects after matrix J has been destroyed. 20a7e14dcfSSatish Balay 21a7e14dcfSSatish Balay Level: developer 22a7e14dcfSSatish Balay 23a7e14dcfSSatish Balay .seealso: MatCreate() 24a7e14dcfSSatish Balay @*/ 25a7e14dcfSSatish Balay PetscErrorCode MatCreateSubMatrixFree(Mat mat,IS Rows, IS Cols, Mat *J) 26a7e14dcfSSatish Balay { 27367daffbSBarry Smith MPI_Comm comm=PetscObjectComm((PetscObject)mat); 28a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 29a7e14dcfSSatish Balay PetscErrorCode ierr; 30a7e14dcfSSatish Balay PetscInt mloc,nloc,m,n; 31a7e14dcfSSatish Balay 3287f595a5SBarry Smith PetscFunctionBegin; 333c9e27cfSGeoffrey Irving ierr = PetscNew(&ctx);CHKERRQ(ierr); 34a7e14dcfSSatish Balay ctx->A = mat; 35a7e14dcfSSatish Balay ierr = MatGetSize(mat,&m,&n);CHKERRQ(ierr); 36a7e14dcfSSatish Balay ierr = MatGetLocalSize(mat,&mloc,&nloc);CHKERRQ(ierr); 37*0c0fd78eSBarry Smith ierr = MatCreateVecs(mat,NULL,&ctx->VC);CHKERRQ(ierr); 38a7e14dcfSSatish Balay ctx->VR = ctx->VC; 39a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)mat);CHKERRQ(ierr); 40a7e14dcfSSatish Balay 41a7e14dcfSSatish Balay 42a7e14dcfSSatish Balay ctx->Rows = Rows; 43a7e14dcfSSatish Balay ctx->Cols = Cols; 44a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Rows);CHKERRQ(ierr); 45a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Cols);CHKERRQ(ierr); 46a7e14dcfSSatish Balay ierr = MatCreateShell(comm,mloc,nloc,m,n,ctx,J);CHKERRQ(ierr); 47*0c0fd78eSBarry Smith ierr = MatShellSetManageScalingShifts(*J);CHKERRQ(ierr); 48a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_MULT,(void(*)(void))MatMult_SMF);CHKERRQ(ierr); 49a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_DESTROY,(void(*)(void))MatDestroy_SMF);CHKERRQ(ierr); 50a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_VIEW,(void(*)(void))MatView_SMF);CHKERRQ(ierr); 51a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_MULT_TRANSPOSE,(void(*)(void))MatMultTranspose_SMF);CHKERRQ(ierr); 52a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_DIAGONAL_SET,(void(*)(void))MatDiagonalSet_SMF);CHKERRQ(ierr); 53a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_SHIFT,(void(*)(void))MatShift_SMF);CHKERRQ(ierr); 54a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_EQUAL,(void(*)(void))MatEqual_SMF);CHKERRQ(ierr); 55a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_SCALE,(void(*)(void))MatScale_SMF);CHKERRQ(ierr); 56a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_TRANSPOSE,(void(*)(void))MatTranspose_SMF);CHKERRQ(ierr); 57a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_GET_DIAGONAL,(void(*)(void))MatGetDiagonal_SMF);CHKERRQ(ierr); 587dae84e0SHong Zhang ierr = MatShellSetOperation(*J,MATOP_CREATE_SUBMATRICES,(void(*)(void))MatCreateSubMatrices_SMF);CHKERRQ(ierr); 59a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_NORM,(void(*)(void))MatNorm_SMF);CHKERRQ(ierr); 60a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_DUPLICATE,(void(*)(void))MatDuplicate_SMF);CHKERRQ(ierr); 617dae84e0SHong Zhang ierr = MatShellSetOperation(*J,MATOP_CREATE_SUBMATRIX,(void(*)(void))MatCreateSubMatrix_SMF);CHKERRQ(ierr); 62a7e14dcfSSatish Balay ierr = MatShellSetOperation(*J,MATOP_GET_ROW_MAX,(void(*)(void))MatDuplicate_SMF);CHKERRQ(ierr); 63a7e14dcfSSatish Balay 64a7e14dcfSSatish Balay ierr = PetscLogObjectParent((PetscObject)mat,(PetscObject)(*J));CHKERRQ(ierr); 65a7e14dcfSSatish Balay PetscFunctionReturn(0); 66a7e14dcfSSatish Balay } 67a7e14dcfSSatish Balay 68a7e14dcfSSatish Balay PetscErrorCode MatSMFResetRowColumn(Mat mat,IS Rows,IS Cols){ 69a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 70a7e14dcfSSatish Balay PetscErrorCode ierr; 71a7e14dcfSSatish Balay 72a7e14dcfSSatish Balay PetscFunctionBegin; 73a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 74a7e14dcfSSatish Balay ierr = ISDestroy(&ctx->Rows);CHKERRQ(ierr); 75a7e14dcfSSatish Balay ierr = ISDestroy(&ctx->Cols);CHKERRQ(ierr); 76a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Rows);CHKERRQ(ierr); 77a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Cols);CHKERRQ(ierr); 78a7e14dcfSSatish Balay ctx->Cols=Cols; 79a7e14dcfSSatish Balay ctx->Rows=Rows; 80a7e14dcfSSatish Balay PetscFunctionReturn(0); 81a7e14dcfSSatish Balay } 82a7e14dcfSSatish Balay 83a7e14dcfSSatish Balay PetscErrorCode MatMult_SMF(Mat mat,Vec a,Vec y) 84a7e14dcfSSatish Balay { 85a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 86a7e14dcfSSatish Balay PetscErrorCode ierr; 87a7e14dcfSSatish Balay 88a7e14dcfSSatish Balay PetscFunctionBegin; 89a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 90a7e14dcfSSatish Balay ierr = VecCopy(a,ctx->VR);CHKERRQ(ierr); 914473680cSBarry Smith ierr = VecISSet(ctx->VR,ctx->Cols,0.0);CHKERRQ(ierr); 92a7e14dcfSSatish Balay ierr = MatMult(ctx->A,ctx->VR,y);CHKERRQ(ierr); 934473680cSBarry Smith ierr = VecISSet(y,ctx->Rows,0.0);CHKERRQ(ierr); 94a7e14dcfSSatish Balay PetscFunctionReturn(0); 95a7e14dcfSSatish Balay } 96a7e14dcfSSatish Balay 97a7e14dcfSSatish Balay PetscErrorCode MatMultTranspose_SMF(Mat mat,Vec a,Vec y) 98a7e14dcfSSatish Balay { 99a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 100a7e14dcfSSatish Balay PetscErrorCode ierr; 101a7e14dcfSSatish Balay 102a7e14dcfSSatish Balay PetscFunctionBegin; 103a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 104a7e14dcfSSatish Balay ierr = VecCopy(a,ctx->VC);CHKERRQ(ierr); 1054473680cSBarry Smith ierr = VecISSet(ctx->VC,ctx->Rows,0.0);CHKERRQ(ierr); 106a7e14dcfSSatish Balay ierr = MatMultTranspose(ctx->A,ctx->VC,y);CHKERRQ(ierr); 1074473680cSBarry Smith ierr = VecISSet(y,ctx->Cols,0.0);CHKERRQ(ierr); 108a7e14dcfSSatish Balay PetscFunctionReturn(0); 109a7e14dcfSSatish Balay } 110a7e14dcfSSatish Balay 111a7e14dcfSSatish Balay PetscErrorCode MatDiagonalSet_SMF(Mat M, Vec D,InsertMode is) 112a7e14dcfSSatish Balay { 113a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 114a7e14dcfSSatish Balay PetscErrorCode ierr; 115a7e14dcfSSatish Balay 116a7e14dcfSSatish Balay PetscFunctionBegin; 117a7e14dcfSSatish Balay ierr = MatShellGetContext(M,(void **)&ctx);CHKERRQ(ierr); 118302440fdSBarry Smith ierr = MatDiagonalSet(ctx->A,D,is);CHKERRQ(ierr); 119a7e14dcfSSatish Balay PetscFunctionReturn(0); 120a7e14dcfSSatish Balay } 121a7e14dcfSSatish Balay 122a7e14dcfSSatish Balay PetscErrorCode MatDestroy_SMF(Mat mat) 123a7e14dcfSSatish Balay { 124a7e14dcfSSatish Balay PetscErrorCode ierr; 125a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 126a7e14dcfSSatish Balay 127a7e14dcfSSatish Balay PetscFunctionBegin; 128a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 129a7e14dcfSSatish Balay ierr = MatDestroy(&ctx->A);CHKERRQ(ierr); 130a7e14dcfSSatish Balay ierr = ISDestroy(&ctx->Rows);CHKERRQ(ierr); 131a7e14dcfSSatish Balay ierr = ISDestroy(&ctx->Cols);CHKERRQ(ierr); 132a7e14dcfSSatish Balay ierr = VecDestroy(&ctx->VC);CHKERRQ(ierr); 133a7e14dcfSSatish Balay ierr = PetscFree(ctx);CHKERRQ(ierr); 134a7e14dcfSSatish Balay PetscFunctionReturn(0); 135a7e14dcfSSatish Balay } 136a7e14dcfSSatish Balay 137a7e14dcfSSatish Balay 138a7e14dcfSSatish Balay 139a7e14dcfSSatish Balay PetscErrorCode MatView_SMF(Mat mat,PetscViewer viewer) 140a7e14dcfSSatish Balay { 141a7e14dcfSSatish Balay PetscErrorCode ierr; 142a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 143a7e14dcfSSatish Balay 144a7e14dcfSSatish Balay PetscFunctionBegin; 145a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 146a7e14dcfSSatish Balay ierr = MatView(ctx->A,viewer);CHKERRQ(ierr); 147a7e14dcfSSatish Balay PetscFunctionReturn(0); 148a7e14dcfSSatish Balay } 149a7e14dcfSSatish Balay 150a7e14dcfSSatish Balay PetscErrorCode MatShift_SMF(Mat Y, PetscReal a) 151a7e14dcfSSatish Balay { 152a7e14dcfSSatish Balay PetscErrorCode ierr; 153a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 154a7e14dcfSSatish Balay 155a7e14dcfSSatish Balay PetscFunctionBegin; 156a7e14dcfSSatish Balay ierr = MatShellGetContext(Y,(void **)&ctx);CHKERRQ(ierr); 157a7e14dcfSSatish Balay ierr = MatShift(ctx->A,a);CHKERRQ(ierr); 158a7e14dcfSSatish Balay PetscFunctionReturn(0); 159a7e14dcfSSatish Balay } 160a7e14dcfSSatish Balay 161a7e14dcfSSatish Balay PetscErrorCode MatDuplicate_SMF(Mat mat,MatDuplicateOption op,Mat *M) 162a7e14dcfSSatish Balay { 163a7e14dcfSSatish Balay PetscErrorCode ierr; 164a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 165a7e14dcfSSatish Balay 166a7e14dcfSSatish Balay PetscFunctionBegin; 167a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 168a7e14dcfSSatish Balay ierr = MatCreateSubMatrixFree(ctx->A,ctx->Rows,ctx->Cols,M);CHKERRQ(ierr); 169a7e14dcfSSatish Balay PetscFunctionReturn(0); 170a7e14dcfSSatish Balay } 171a7e14dcfSSatish Balay 172a7e14dcfSSatish Balay PetscErrorCode MatEqual_SMF(Mat A,Mat B,PetscBool *flg) 173a7e14dcfSSatish Balay { 174a7e14dcfSSatish Balay PetscErrorCode ierr; 175a7e14dcfSSatish Balay MatSubMatFreeCtx ctx1,ctx2; 176a7e14dcfSSatish Balay PetscBool flg1,flg2,flg3; 177a7e14dcfSSatish Balay 178a7e14dcfSSatish Balay PetscFunctionBegin; 179a7e14dcfSSatish Balay ierr = MatShellGetContext(A,(void **)&ctx1);CHKERRQ(ierr); 180a7e14dcfSSatish Balay ierr = MatShellGetContext(B,(void **)&ctx2);CHKERRQ(ierr); 181a7e14dcfSSatish Balay ierr = ISEqual(ctx1->Rows,ctx2->Rows,&flg2);CHKERRQ(ierr); 182a7e14dcfSSatish Balay ierr = ISEqual(ctx1->Cols,ctx2->Cols,&flg3);CHKERRQ(ierr); 183a7e14dcfSSatish Balay if (flg2==PETSC_FALSE || flg3==PETSC_FALSE){ 184a7e14dcfSSatish Balay *flg=PETSC_FALSE; 185a7e14dcfSSatish Balay } else { 186a7e14dcfSSatish Balay ierr = MatEqual(ctx1->A,ctx2->A,&flg1);CHKERRQ(ierr); 187a7e14dcfSSatish Balay if (flg1==PETSC_FALSE){ *flg=PETSC_FALSE;} 188a7e14dcfSSatish Balay else { *flg=PETSC_TRUE;} 189a7e14dcfSSatish Balay } 190a7e14dcfSSatish Balay PetscFunctionReturn(0); 191a7e14dcfSSatish Balay } 192a7e14dcfSSatish Balay 193a7e14dcfSSatish Balay PetscErrorCode MatScale_SMF(Mat mat, PetscReal a) 194a7e14dcfSSatish Balay { 195a7e14dcfSSatish Balay PetscErrorCode ierr; 196a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 197a7e14dcfSSatish Balay 198a7e14dcfSSatish Balay PetscFunctionBegin; 199a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 200a7e14dcfSSatish Balay ierr = MatScale(ctx->A,a);CHKERRQ(ierr); 201a7e14dcfSSatish Balay PetscFunctionReturn(0); 202a7e14dcfSSatish Balay } 203a7e14dcfSSatish Balay 204a7e14dcfSSatish Balay PetscErrorCode MatTranspose_SMF(Mat mat,Mat *B) 205a7e14dcfSSatish Balay { 206a7e14dcfSSatish Balay PetscFunctionBegin; 207a7e14dcfSSatish Balay PetscFunctionReturn(1); 208a7e14dcfSSatish Balay } 209a7e14dcfSSatish Balay 210a7e14dcfSSatish Balay PetscErrorCode MatGetDiagonal_SMF(Mat mat,Vec v) 211a7e14dcfSSatish Balay { 212a7e14dcfSSatish Balay PetscErrorCode ierr; 213a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 214a7e14dcfSSatish Balay 215a7e14dcfSSatish Balay PetscFunctionBegin; 216a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 217a7e14dcfSSatish Balay ierr = MatGetDiagonal(ctx->A,v);CHKERRQ(ierr); 218a7e14dcfSSatish Balay PetscFunctionReturn(0); 219a7e14dcfSSatish Balay } 220a7e14dcfSSatish Balay 221a7e14dcfSSatish Balay PetscErrorCode MatGetRowMax_SMF(Mat M, Vec D) 222a7e14dcfSSatish Balay { 223a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 224a7e14dcfSSatish Balay PetscErrorCode ierr; 225a7e14dcfSSatish Balay 226a7e14dcfSSatish Balay PetscFunctionBegin; 227a7e14dcfSSatish Balay ierr = MatShellGetContext(M,(void **)&ctx);CHKERRQ(ierr); 228302440fdSBarry Smith ierr = MatGetRowMax(ctx->A,D,NULL);CHKERRQ(ierr); 229a7e14dcfSSatish Balay PetscFunctionReturn(0); 230a7e14dcfSSatish Balay } 231a7e14dcfSSatish Balay 2327dae84e0SHong Zhang PetscErrorCode MatCreateSubMatrices_SMF(Mat A,PetscInt n, IS *irow,IS *icol,MatReuse scall,Mat **B) 233a7e14dcfSSatish Balay { 234a7e14dcfSSatish Balay PetscErrorCode ierr; 235a7e14dcfSSatish Balay PetscInt i; 236a7e14dcfSSatish Balay 237a7e14dcfSSatish Balay PetscFunctionBegin; 238a7e14dcfSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 239df750dc8SHong Zhang ierr = PetscCalloc1(n+1,B );CHKERRQ(ierr); 240a7e14dcfSSatish Balay } 241a7e14dcfSSatish Balay 242a7e14dcfSSatish Balay for ( i=0; i<n; i++ ) { 2437dae84e0SHong Zhang ierr = MatCreateSubMatrix_SMF(A,irow[i],icol[i],scall,&(*B)[i]);CHKERRQ(ierr); 244a7e14dcfSSatish Balay } 245a7e14dcfSSatish Balay PetscFunctionReturn(0); 246a7e14dcfSSatish Balay } 247a7e14dcfSSatish Balay 2487dae84e0SHong Zhang PetscErrorCode MatCreateSubMatrix_SMF(Mat mat,IS isrow,IS iscol,MatReuse cll, 249a7e14dcfSSatish Balay Mat *newmat) 250a7e14dcfSSatish Balay { 251a7e14dcfSSatish Balay PetscErrorCode ierr; 252a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 253a7e14dcfSSatish Balay 254a7e14dcfSSatish Balay PetscFunctionBegin; 255a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 256a7e14dcfSSatish Balay if (newmat){ 257a7e14dcfSSatish Balay ierr = MatDestroy(&*newmat);CHKERRQ(ierr); 258a7e14dcfSSatish Balay } 259a7e14dcfSSatish Balay ierr = MatCreateSubMatrixFree(ctx->A,isrow,iscol, newmat);CHKERRQ(ierr); 260a7e14dcfSSatish Balay PetscFunctionReturn(0); 261a7e14dcfSSatish Balay } 262a7e14dcfSSatish Balay 263a62a097fSLisandro Dalcin PetscErrorCode MatGetRow_SMF(Mat mat,PetscInt row,PetscInt *ncols,const PetscInt **cols,const PetscScalar **vals) 264a7e14dcfSSatish Balay { 265a7e14dcfSSatish Balay PetscErrorCode ierr; 266a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 267a7e14dcfSSatish Balay 268a7e14dcfSSatish Balay PetscFunctionBegin; 269a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 270a7e14dcfSSatish Balay ierr = MatGetRow(ctx->A,row,ncols,cols,vals);CHKERRQ(ierr); 271a7e14dcfSSatish Balay PetscFunctionReturn(0); 272a7e14dcfSSatish Balay } 273a7e14dcfSSatish Balay 274a62a097fSLisandro Dalcin PetscErrorCode MatRestoreRow_SMF(Mat mat,PetscInt row,PetscInt *ncols,const PetscInt **cols,const PetscScalar **vals) 275a7e14dcfSSatish Balay { 276a7e14dcfSSatish Balay PetscErrorCode ierr; 277a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 278a7e14dcfSSatish Balay 279a7e14dcfSSatish Balay PetscFunctionBegin; 280a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 281a7e14dcfSSatish Balay ierr = MatRestoreRow(ctx->A,row,ncols,cols,vals);CHKERRQ(ierr); 282a7e14dcfSSatish Balay PetscFunctionReturn(0); 283a7e14dcfSSatish Balay } 284a7e14dcfSSatish Balay 285a7e14dcfSSatish Balay PetscErrorCode MatGetColumnVector_SMF(Mat mat,Vec Y, PetscInt col) 286a7e14dcfSSatish Balay { 287a7e14dcfSSatish Balay PetscErrorCode ierr; 288a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 289a7e14dcfSSatish Balay 290a7e14dcfSSatish Balay PetscFunctionBegin; 291a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 292a7e14dcfSSatish Balay ierr = MatGetColumnVector(ctx->A,Y,col);CHKERRQ(ierr); 293a7e14dcfSSatish Balay PetscFunctionReturn(0); 294a7e14dcfSSatish Balay } 295a7e14dcfSSatish Balay 296a7e14dcfSSatish Balay PetscErrorCode MatNorm_SMF(Mat mat,NormType type,PetscReal *norm) 297a7e14dcfSSatish Balay { 298a7e14dcfSSatish Balay PetscErrorCode ierr; 299a7e14dcfSSatish Balay MatSubMatFreeCtx ctx; 300a7e14dcfSSatish Balay 301a7e14dcfSSatish Balay PetscFunctionBegin; 302a7e14dcfSSatish Balay ierr = MatShellGetContext(mat,(void **)&ctx);CHKERRQ(ierr); 303a7e14dcfSSatish Balay if (type == NORM_FROBENIUS) { 304a7e14dcfSSatish Balay *norm = 1.0; 305a7e14dcfSSatish Balay } else if (type == NORM_1 || type == NORM_INFINITY) { 306a7e14dcfSSatish Balay *norm = 1.0; 30787f595a5SBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 308a7e14dcfSSatish Balay PetscFunctionReturn(0); 309a7e14dcfSSatish Balay } 310a7e14dcfSSatish Balay 311