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