1 #ifndef lint 2 static char vcid[] = "$Id: matrix.c,v 1.138 1996/02/09 15:58:29 curfman Exp bsmith $"; 3 #endif 4 5 /* 6 This is where the abstract matrix operations are defined 7 */ 8 9 #include "petsc.h" 10 #include "matimpl.h" /*I "mat.h" I*/ 11 #include "vec/vecimpl.h" 12 #include "pinclude/pviewer.h" 13 #include "draw.h" 14 15 /*@C 16 MatGetReordering - Gets a reordering for a matrix to reduce fill or to 17 improve numerical stability of LU factorization. 18 19 Input Parameters: 20 . mat - the matrix 21 . type - type of reordering, one of the following: 22 $ ORDER_NATURAL - Natural 23 $ ORDER_ND - Nested Dissection 24 $ ORDER_1WD - One-way Dissection 25 $ ORDER_RCM - Reverse Cuthill-McGee 26 $ ORDER_QMD - Quotient Minimum Degree 27 28 Output Parameters: 29 . rperm - row permutation indices 30 . cperm - column permutation indices 31 32 Options Database Keys: 33 To specify the ordering through the options database, use one of 34 the following 35 $ -mat_order natural, -mat_order nd, -mat_order 1wd, 36 $ -mat_order rcm, -mat_order qmd 37 38 Notes: 39 If the column permutations and row permutations are the same, 40 then MatGetReordering() returns 0 in cperm. 41 42 The user can define additional orderings; see MatReorderingRegister(). 43 44 .keywords: matrix, set, ordering, factorization, direct, ILU, LU, 45 fill, reordering, natural, Nested Dissection, 46 One-way Dissection, Cholesky, Reverse Cuthill-McGee, 47 Quotient Minimum Degree 48 49 .seealso: MatGetReorderingTypeFromOptions(), MatReorderingRegister() 50 @*/ 51 int MatGetReordering(Mat mat,MatOrdering type,IS *rperm,IS *cperm) 52 { 53 int ierr; 54 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 55 if (!mat->assembled) SETERRQ(1,"MatGetReordering:Not for unassembled matrix"); 56 57 if (!mat->ops.getreordering) {*rperm = 0; *cperm = 0; return 0;} 58 PLogEventBegin(MAT_GetReordering,mat,0,0,0); 59 ierr = MatGetReorderingTypeFromOptions(0,&type); CHKERRQ(ierr); 60 ierr = (*mat->ops.getreordering)(mat,type,rperm,cperm); CHKERRQ(ierr); 61 PLogEventEnd(MAT_GetReordering,mat,0,0,0); 62 return 0; 63 } 64 65 /*@C 66 MatGetRow - Gets a row of a matrix. You MUST call MatRestoreRow() 67 for each row that you get to ensure that your application does 68 not bleed memory. 69 70 Input Parameters: 71 . mat - the matrix 72 . row - the row to get 73 74 Output Parameters: 75 . ncols - the number of nonzeros in the row 76 . cols - if nonzero, the column numbers 77 . vals - if nonzero, the values 78 79 Notes: 80 This routine is provided for people who need to have direct access 81 to the structure of a matrix. We hope that we provide enough 82 high-level matrix routines that few users will need it. 83 84 For better efficiency, set cols and/or vals to zero if you do not 85 wish to extract these quantities. 86 87 .keywords: matrix, row, get, extract 88 89 .seealso: MatRestoreRow() 90 @*/ 91 int MatGetRow(Mat mat,int row,int *ncols,int **cols,Scalar **vals) 92 { 93 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 94 if (!mat->assembled) SETERRQ(1,"MatGetRow:Not for unassembled matrix"); 95 return (*mat->ops.getrow)(mat,row,ncols,cols,vals); 96 } 97 98 /*@C 99 MatRestoreRow - Frees any temporary space allocated by MatGetRow(). 100 101 Input Parameters: 102 . mat - the matrix 103 . row - the row to get 104 . ncols, cols - the number of nonzeros and their columns 105 . vals - if nonzero the column values 106 107 .keywords: matrix, row, restore 108 109 .seealso: MatGetRow() 110 @*/ 111 int MatRestoreRow(Mat mat,int row,int *ncols,int **cols,Scalar **vals) 112 { 113 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 114 if (!mat->assembled) SETERRQ(1,"MatRestoreRow:Not for unassembled matrix"); 115 if (!mat->ops.restorerow) return 0; 116 return (*mat->ops.restorerow)(mat,row,ncols,cols,vals); 117 } 118 /*@ 119 MatView - Visualizes a matrix object. 120 121 Input Parameters: 122 . mat - the matrix 123 . ptr - visualization context 124 125 Notes: 126 The available visualization contexts include 127 $ STDOUT_VIEWER_SELF - standard output (default) 128 $ STDOUT_VIEWER_WORLD - synchronized standard 129 $ output where only the first processor opens 130 $ the file. All other processors send their 131 $ data to the first processor to print. 132 133 The user can open alternative vistualization contexts with 134 $ ViewerFileOpenASCII() - output to a specified file 135 $ ViewerFileOpenBinary() - output in binary to a 136 $ specified file; corresponding input uses MatLoad() 137 $ DrawOpenX() - output nonzero matrix structure to 138 $ an X window display 139 $ ViewerMatlabOpen() - output matrix to Matlab viewer. 140 $ Currently only the sequential dense and AIJ 141 $ matrix types support the Matlab viewer. 142 143 The user can call ViewerFileSetFormat() to specify the output 144 format of ASCII printed objects (when using STDOUT_VIEWER_SELF, 145 STDOUT_VIEWER_WORLD and ViewerFileOpenASCII). Available formats include 146 $ FILE_FORMAT_DEFAULT - default, prints matrix contents 147 $ FILE_FORMAT_MATLAB - Matlab format 148 $ FILE_FORMAT_IMPL - implementation-specific format 149 $ (which is in many cases the same as the default) 150 $ FILE_FORMAT_INFO - basic information about the matrix 151 $ size and structure (not the matrix entries) 152 $ FILE_FORMAT_INFO_DETAILED - more detailed information about the 153 $ matrix structure 154 155 .keywords: matrix, view, visualize, output, print, write, draw 156 157 .seealso: ViewerFileSetFormat(), ViewerFileOpenASCII(), DrawOpenX(), 158 ViewerMatlabOpen(), ViewerFileOpenBinary(), MatLoad() 159 @*/ 160 int MatView(Mat mat,Viewer ptr) 161 { 162 int format, ierr, rows, cols,nz, nzalloc, mem; 163 FILE *fd; 164 char *cstring; 165 PetscObject vobj = (PetscObject) ptr; 166 167 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 168 if (!mat->assembled) SETERRQ(1,"MatView:Not for unassembled matrix"); 169 170 if (!ptr) { /* so that viewers may be used from debuggers */ 171 ptr = STDOUT_VIEWER_SELF; vobj = (PetscObject) ptr; 172 } 173 ierr = ViewerFileGetFormat_Private(ptr,&format); CHKERRQ(ierr); 174 ierr = ViewerFileGetPointer(ptr,&fd); CHKERRQ(ierr); 175 if (vobj->cookie == VIEWER_COOKIE && 176 (format == FILE_FORMAT_INFO || format == FILE_FORMAT_INFO_DETAILED) && 177 (vobj->type == ASCII_FILE_VIEWER || vobj->type == ASCII_FILES_VIEWER)) { 178 MPIU_fprintf(mat->comm,fd,"Matrix Object:\n"); 179 ierr = MatGetType(mat,PETSC_NULL,&cstring); CHKERRQ(ierr); 180 ierr = MatGetSize(mat,&rows,&cols); CHKERRQ(ierr); 181 MPIU_fprintf(mat->comm,fd," type=%s, rows=%d, cols=%d\n",cstring,rows,cols); 182 if (mat->ops.getinfo) { 183 ierr = MatGetInfo(mat,MAT_GLOBAL_SUM,&nz,&nzalloc,&mem); CHKERRQ(ierr); 184 MPIU_fprintf(mat->comm,fd," total: nonzeros=%d, allocated nonzeros=%d\n",nz,nzalloc); 185 } 186 } 187 if (mat->view) {ierr = (*mat->view)((PetscObject)mat,ptr); CHKERRQ(ierr);} 188 return 0; 189 } 190 /*@C 191 MatDestroy - Frees space taken by a matrix. 192 193 Input Parameter: 194 . mat - the matrix 195 196 .keywords: matrix, destroy 197 @*/ 198 int MatDestroy(Mat mat) 199 { 200 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 201 return (*mat->destroy)((PetscObject)mat); 202 } 203 /*@ 204 MatValidMatrix - Returns 1 if a valid matrix else 0. 205 206 Input Parameter: 207 . m - the matrix to check 208 209 .keywords: matrix, valid 210 @*/ 211 int MatValidMatrix(Mat m) 212 { 213 if (!m) return 0; 214 if (m->cookie != MAT_COOKIE) return 0; 215 return 1; 216 } 217 218 /*@ 219 MatSetValues - Inserts or adds a block of values into a matrix. 220 These values may be cached, so MatAssemblyBegin() and MatAssemblyEnd() 221 MUST be called after all calls to MatSetValues() have been completed. 222 223 Input Parameters: 224 . mat - the matrix 225 . v - a logically two-dimensional array of values 226 . m, indexm - the number of rows and their global indices 227 . n, indexn - the number of columns and their global indices 228 . addv - either ADD_VALUES or INSERT_VALUES, where 229 $ ADD_VALUES - adds values to any existing entries 230 $ INSERT_VALUES - replaces existing entries with new values 231 232 Notes: 233 By default the values, v, are row-oriented and unsorted. 234 See MatSetOptions() for other options. 235 236 Calls to MatSetValues() with the INSERT_VALUES and ADD_VALUES 237 options cannot be mixed without intervening calls to the assembly 238 routines. 239 240 .keywords: matrix, insert, add, set, values 241 242 .seealso: MatSetOptions(), MatAssemblyBegin(), MatAssemblyEnd() 243 @*/ 244 int MatSetValues(Mat mat,int m,int *idxm,int n,int *idxn,Scalar *v, 245 InsertMode addv) 246 { 247 int ierr; 248 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 249 250 if (mat->assembled) { 251 mat->was_assembled = PETSC_TRUE; 252 mat->assembled = PETSC_FALSE; 253 mat->same_nonzero = PETSC_TRUE; 254 } 255 256 PLogEventBegin(MAT_SetValues,mat,0,0,0); 257 ierr = (*mat->ops.setvalues)(mat,m,idxm,n,idxn,v,addv);CHKERRQ(ierr); 258 PLogEventEnd(MAT_SetValues,mat,0,0,0); 259 return 0; 260 } 261 262 /*@ 263 MatGetValues - Gets a block of values from a matrix. 264 265 Input Parameters: 266 . mat - the matrix 267 . v - a logically two-dimensional array for storing the values 268 . m, indexm - the number of rows and their global indices 269 . n, indexn - the number of columns and their global indices 270 271 Notes: 272 The user must allocate space (m*n Scalars) for the values, v. 273 The values, v, are then returned in a row-oriented format, 274 analogous to that used by default in MatSetValues(). 275 276 .keywords: matrix, get, values 277 278 .seealso: MatGetRow(), MatGetSubmatrix(), MatGetSubmatrices(), MatSetValues() 279 @*/ 280 int MatGetValues(Mat mat,int m,int *idxm,int n,int *idxn,Scalar *v) 281 { 282 int ierr; 283 284 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 285 if (!mat->assembled) SETERRQ(1,"MatGetValues:Not for unassembled matrix"); 286 287 PLogEventBegin(MAT_GetValues,mat,0,0,0); 288 ierr = (*mat->ops.getvalues)(mat,m,idxm,n,idxn,v); CHKERRQ(ierr); 289 PLogEventEnd(MAT_GetValues,mat,0,0,0); 290 return 0; 291 } 292 293 /* --------------------------------------------------------*/ 294 /*@ 295 MatMult - Computes matrix-vector product. 296 297 Input Parameters: 298 . mat - the matrix 299 . x - the vector to be multilplied 300 301 Output Parameters: 302 . y - the result 303 304 .keywords: matrix, multiply, matrix-vector product 305 306 .seealso: MatMultTrans(), MatMultAdd(), MatMultTransAdd() 307 @*/ 308 int MatMult(Mat mat,Vec x,Vec y) 309 { 310 int ierr; 311 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 312 PETSCVALIDHEADERSPECIFIC(x,VEC_COOKIE);PETSCVALIDHEADERSPECIFIC(y,VEC_COOKIE); 313 if (!mat->assembled) SETERRQ(1,"MatMult:Not for unassembled matrix"); 314 if (x == y) SETERRQ(1,"MatMult:x and y must be different vectors"); 315 316 PLogEventBegin(MAT_Mult,mat,x,y,0); 317 ierr = (*mat->ops.mult)(mat,x,y); CHKERRQ(ierr); 318 PLogEventEnd(MAT_Mult,mat,x,y,0); 319 return 0; 320 } 321 /*@ 322 MatMultTrans - Computes matrix transpose times a vector. 323 324 Input Parameters: 325 . mat - the matrix 326 . x - the vector to be multilplied 327 328 Output Parameters: 329 . y - the result 330 331 .keywords: matrix, multiply, matrix-vector product, transpose 332 333 .seealso: MatMult(), MatMultAdd(), MatMultTransAdd() 334 @*/ 335 int MatMultTrans(Mat mat,Vec x,Vec y) 336 { 337 int ierr; 338 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 339 PETSCVALIDHEADERSPECIFIC(x,VEC_COOKIE); PETSCVALIDHEADERSPECIFIC(y,VEC_COOKIE); 340 if (!mat->assembled) SETERRQ(1,"MatMultTrans:Not for unassembled matrix"); 341 if (x == y) SETERRQ(1,"MatMultTrans:x and y must be different vectors"); 342 343 PLogEventBegin(MAT_MultTrans,mat,x,y,0); 344 ierr = (*mat->ops.multtrans)(mat,x,y); CHKERRQ(ierr); 345 PLogEventEnd(MAT_MultTrans,mat,x,y,0); 346 return 0; 347 } 348 /*@ 349 MatMultAdd - Computes v3 = v2 + A * v1. 350 351 Input Parameters: 352 . mat - the matrix 353 . v1, v2 - the vectors 354 355 Output Parameters: 356 . v3 - the result 357 358 .keywords: matrix, multiply, matrix-vector product, add 359 360 .seealso: MatMultTrans(), MatMult(), MatMultTransAdd() 361 @*/ 362 int MatMultAdd(Mat mat,Vec v1,Vec v2,Vec v3) 363 { 364 int ierr; 365 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);PETSCVALIDHEADERSPECIFIC(v1,VEC_COOKIE); 366 PETSCVALIDHEADERSPECIFIC(v2,VEC_COOKIE); PETSCVALIDHEADERSPECIFIC(v3,VEC_COOKIE); 367 if (!mat->assembled) SETERRQ(1,"MatMultAdd:Not for unassembled matrix"); 368 369 PLogEventBegin(MAT_MultAdd,mat,v1,v2,v3); 370 if (v1 == v3) SETERRQ(1,"MatMultAdd:v1 and v3 must be different vectors"); 371 ierr = (*mat->ops.multadd)(mat,v1,v2,v3); CHKERRQ(ierr); 372 PLogEventEnd(MAT_MultAdd,mat,v1,v2,v3); 373 return 0; 374 } 375 /*@ 376 MatMultTransAdd - Computes v3 = v2 + A' * v1. 377 378 Input Parameters: 379 . mat - the matrix 380 . v1, v2 - the vectors 381 382 Output Parameters: 383 . v3 - the result 384 385 .keywords: matrix, multiply, matrix-vector product, transpose, add 386 387 .seealso: MatMultTrans(), MatMultAdd(), MatMult() 388 @*/ 389 int MatMultTransAdd(Mat mat,Vec v1,Vec v2,Vec v3) 390 { 391 int ierr; 392 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); PETSCVALIDHEADERSPECIFIC(v1,VEC_COOKIE); 393 PETSCVALIDHEADERSPECIFIC(v2,VEC_COOKIE); PETSCVALIDHEADERSPECIFIC(v3,VEC_COOKIE); 394 if (!mat->assembled) SETERRQ(1,"MatMultTransAdd:Not for unassembled matrix"); 395 if (!mat->ops.multtransadd) SETERRQ(PETSC_ERR_SUP,"MatMultTransAdd"); 396 if (v1 == v3) SETERRQ(1,"MatMultTransAdd:v1 and v2 must be different vectors"); 397 398 PLogEventBegin(MAT_MultTransAdd,mat,v1,v2,v3); 399 ierr = (*mat->ops.multtransadd)(mat,v1,v2,v3); CHKERRQ(ierr); 400 PLogEventEnd(MAT_MultTransAdd,mat,v1,v2,v3); 401 return 0; 402 } 403 /* ------------------------------------------------------------*/ 404 /*@ 405 MatGetInfo - Returns information about matrix storage (number of 406 nonzeros, memory). 407 408 Input Parameters: 409 . mat - the matrix 410 411 Output Parameters: 412 . flag - flag indicating the type of parameters to be returned 413 $ flag = MAT_LOCAL: local matrix 414 $ flag = MAT_GLOBAL_MAX: maximum over all processors 415 $ flag = MAT_GLOBAL_SUM: sum over all processors 416 . nz - the number of nonzeros 417 . nzalloc - the number of allocated nonzeros 418 . mem - the memory used (in bytes) 419 420 .keywords: matrix, get, info, storage, nonzeros, memory 421 @*/ 422 int MatGetInfo(Mat mat,MatInfoType flag,int *nz,int *nzalloc,int *mem) 423 { 424 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 425 if (!mat->ops.getinfo) SETERRQ(PETSC_ERR_SUP,"MatGetInfo"); 426 return (*mat->ops.getinfo)(mat,flag,nz,nzalloc,mem); 427 } 428 /* ----------------------------------------------------------*/ 429 /*@ 430 MatLUFactor - Performs in-place LU factorization of matrix. 431 432 Input Parameters: 433 . mat - the matrix 434 . row - row permutation 435 . col - column permutation 436 . f - expected fill as ratio of original fill. 437 438 .keywords: matrix, factor, LU, in-place 439 440 .seealso: MatLUFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor() 441 @*/ 442 int MatLUFactor(Mat mat,IS row,IS col,double f) 443 { 444 int ierr; 445 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 446 if (!mat->ops.lufactor) SETERRQ(PETSC_ERR_SUP,"MatLUFactor"); 447 if (!mat->assembled) SETERRQ(1,"MatLUFactor:Not for unassembled matrix"); 448 449 PLogEventBegin(MAT_LUFactor,mat,row,col,0); 450 ierr = (*mat->ops.lufactor)(mat,row,col,f); CHKERRQ(ierr); 451 PLogEventEnd(MAT_LUFactor,mat,row,col,0); 452 return 0; 453 } 454 /*@ 455 MatILUFactor - Performs in-place ILU factorization of matrix. 456 457 Input Parameters: 458 . mat - the matrix 459 . row - row permutation 460 . col - column permutation 461 . f - expected fill as ratio of original fill. 462 . level - number of levels of fill. 463 464 Note: probably really only in-place when level is zero. 465 .keywords: matrix, factor, ILU, in-place 466 467 .seealso: MatILUFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor() 468 @*/ 469 int MatILUFactor(Mat mat,IS row,IS col,double f,int level) 470 { 471 int ierr; 472 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 473 if (!mat->ops.ilufactor) SETERRQ(PETSC_ERR_SUP,"MatILUFactor"); 474 if (!mat->assembled) SETERRQ(1,"MatILUFactor:Not for unassembled matrix"); 475 476 PLogEventBegin(MAT_ILUFactor,mat,row,col,0); 477 ierr = (*mat->ops.ilufactor)(mat,row,col,f,level); CHKERRQ(ierr); 478 PLogEventEnd(MAT_ILUFactor,mat,row,col,0); 479 return 0; 480 } 481 482 /*@ 483 MatLUFactorSymbolic - Performs symbolic LU factorization of matrix. 484 Call this routine before calling MatLUFactorNumeric(). 485 486 Input Parameters: 487 . mat - the matrix 488 . row, col - row and column permutations 489 . f - expected fill as ratio of the original number of nonzeros, 490 for example 3.0; choosing this parameter well can result in 491 more efficient use of time and space. 492 493 Output Parameter: 494 . fact - new matrix that has been symbolically factored 495 496 Options Database Key: 497 $ -mat_lu_fill <f>, where f is the fill ratio 498 499 Notes: 500 See the file $(PETSC_DIR)/Performace for additional information about 501 choosing the fill factor for better efficiency. 502 503 .keywords: matrix, factor, LU, symbolic, fill 504 505 .seealso: MatLUFactor(), MatLUFactorNumeric(), MatCholeskyFactor() 506 @*/ 507 int MatLUFactorSymbolic(Mat mat,IS row,IS col,double f,Mat *fact) 508 { 509 int ierr,flg; 510 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 511 if (!fact) SETERRQ(1,"MatLUFactorSymbolic:Missing factor matrix argument"); 512 if (!mat->ops.lufactorsymbolic) SETERRQ(PETSC_ERR_SUP,"MatLUFactorSymbolic"); 513 if (!mat->assembled) SETERRQ(1,"MatLUFactorSymbolic:Not for unassembled matrix"); 514 515 ierr = OptionsGetDouble(PETSC_NULL,"-mat_lu_fill",&f,&flg); CHKERRQ(ierr); 516 PLogEventBegin(MAT_LUFactorSymbolic,mat,row,col,0); 517 ierr = (*mat->ops.lufactorsymbolic)(mat,row,col,f,fact); CHKERRQ(ierr); 518 PLogEventEnd(MAT_LUFactorSymbolic,mat,row,col,0); 519 return 0; 520 } 521 /*@ 522 MatLUFactorNumeric - Performs numeric LU factorization of a matrix. 523 Call this routine after first calling MatLUFactorSymbolic(). 524 525 Input Parameters: 526 . mat - the matrix 527 . row, col - row and column permutations 528 529 Output Parameters: 530 . fact - symbolically factored matrix that must have been generated 531 by MatLUFactorSymbolic() 532 533 Notes: 534 See MatLUFactor() for in-place factorization. See 535 MatCholeskyFactorNumeric() for the symmetric, positive definite case. 536 537 .keywords: matrix, factor, LU, numeric 538 539 .seealso: MatLUFactorSymbolic(), MatLUFactor(), MatCholeskyFactor() 540 @*/ 541 int MatLUFactorNumeric(Mat mat,Mat *fact) 542 { 543 int ierr,flg; 544 545 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 546 if (!fact) SETERRQ(1,"MatLUFactorNumeric:Missing factor matrix argument"); 547 if (!mat->ops.lufactornumeric) SETERRQ(PETSC_ERR_SUP,"MatLUFactorNumeric"); 548 if (!mat->assembled) SETERRQ(1,"MatLUFactorNumeric:Not for unassembled matrix"); 549 550 PLogEventBegin(MAT_LUFactorNumeric,mat,*fact,0,0); 551 ierr = (*mat->ops.lufactornumeric)(mat,fact); CHKERRQ(ierr); 552 PLogEventEnd(MAT_LUFactorNumeric,mat,*fact,0,0); 553 ierr = OptionsHasName(PETSC_NULL,"-mat_view_draw",&flg); CHKERRQ(ierr); 554 if (flg) { 555 Draw win; 556 ierr = DrawOpenX((*fact)->comm,0,0,0,0,300,300,&win); CHKERRQ(ierr); 557 ierr = MatView(*fact,(Viewer)win); CHKERRQ(ierr); 558 ierr = DrawSyncFlush(win); CHKERRQ(ierr); 559 ierr = DrawDestroy(win); CHKERRQ(ierr); 560 } 561 return 0; 562 } 563 /*@ 564 MatCholeskyFactor - Performs in-place Cholesky factorization of a 565 symmetric matrix. 566 567 Input Parameters: 568 . mat - the matrix 569 . perm - row and column permutations 570 . f - expected fill as ratio of original fill 571 572 Notes: 573 See MatLUFactor() for the nonsymmetric case. See also 574 MatCholeskyFactorSymbolic(), and MatCholeskyFactorNumeric(). 575 576 .keywords: matrix, factor, in-place, Cholesky 577 578 .seealso: MatLUFactor(), MatCholeskyFactorSymbolic(), MatCholeskyFactorNumeric() 579 @*/ 580 int MatCholeskyFactor(Mat mat,IS perm,double f) 581 { 582 int ierr; 583 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 584 if (!mat->ops.choleskyfactor) SETERRQ(PETSC_ERR_SUP,"MatCholeskyFactor"); 585 if (!mat->assembled) SETERRQ(1,"MatCholeskyFactor:Not for unassembled matrix"); 586 587 PLogEventBegin(MAT_CholeskyFactor,mat,perm,0,0); 588 ierr = (*mat->ops.choleskyfactor)(mat,perm,f); CHKERRQ(ierr); 589 PLogEventEnd(MAT_CholeskyFactor,mat,perm,0,0); 590 return 0; 591 } 592 /*@ 593 MatCholeskyFactorSymbolic - Performs symbolic Cholesky factorization 594 of a symmetric matrix. 595 596 Input Parameters: 597 . mat - the matrix 598 . perm - row and column permutations 599 . f - expected fill as ratio of original 600 601 Output Parameter: 602 . fact - the factored matrix 603 604 Notes: 605 See MatLUFactorSymbolic() for the nonsymmetric case. See also 606 MatCholeskyFactor() and MatCholeskyFactorNumeric(). 607 608 .keywords: matrix, factor, factorization, symbolic, Cholesky 609 610 .seealso: MatLUFactorSymbolic(), MatCholeskyFactor(), MatCholeskyFactorNumeric() 611 @*/ 612 int MatCholeskyFactorSymbolic(Mat mat,IS perm,double f,Mat *fact) 613 { 614 int ierr; 615 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 616 if (!fact) SETERRQ(1,"MatCholeskyFactorSymbolic:Missing factor matrix argument"); 617 if (!mat->ops.choleskyfactorsymbolic)SETERRQ(PETSC_ERR_SUP,"MatCholeskyFactorSymbolic"); 618 if (!mat->assembled) SETERRQ(1,"MatCholeskyFactorSymbolic:Not for unassembled matrix"); 619 620 PLogEventBegin(MAT_CholeskyFactorSymbolic,mat,perm,0,0); 621 ierr = (*mat->ops.choleskyfactorsymbolic)(mat,perm,f,fact); CHKERRQ(ierr); 622 PLogEventEnd(MAT_CholeskyFactorSymbolic,mat,perm,0,0); 623 return 0; 624 } 625 /*@ 626 MatCholeskyFactorNumeric - Performs numeric Cholesky factorization 627 of a symmetric matrix. Call this routine after first calling 628 MatCholeskyFactorSymbolic(). 629 630 Input Parameter: 631 . mat - the initial matrix 632 633 Output Parameter: 634 . fact - the factored matrix 635 636 .keywords: matrix, factor, numeric, Cholesky 637 638 .seealso: MatCholeskyFactorSymbolic(), MatCholeskyFactor(), MatLUFactorNumeric() 639 @*/ 640 int MatCholeskyFactorNumeric(Mat mat,Mat *fact) 641 { 642 int ierr; 643 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 644 if (!fact) SETERRQ(1,"MatCholeskyFactorNumeric:Missing factor matrix argument"); 645 if (!mat->ops.choleskyfactornumeric) SETERRQ(PETSC_ERR_SUP,"MatCholeskyFactorNumeric"); 646 if (!mat->assembled) SETERRQ(1,"MatCholeskyFactorNumeric:Not for unassembled matrix"); 647 648 PLogEventBegin(MAT_CholeskyFactorNumeric,mat,*fact,0,0); 649 ierr = (*mat->ops.choleskyfactornumeric)(mat,fact); CHKERRQ(ierr); 650 PLogEventEnd(MAT_CholeskyFactorNumeric,mat,*fact,0,0); 651 return 0; 652 } 653 /* ----------------------------------------------------------------*/ 654 /*@ 655 MatSolve - Solves A x = b, given a factored matrix. 656 657 Input Parameters: 658 . mat - the factored matrix 659 . b - the right-hand-side vector 660 661 Output Parameter: 662 . x - the result vector 663 664 .keywords: matrix, linear system, solve, LU, Cholesky, triangular solve 665 666 .seealso: MatSolveAdd(), MatSolveTrans(), MatSolveTransAdd() 667 @*/ 668 int MatSolve(Mat mat,Vec b,Vec x) 669 { 670 int ierr; 671 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 672 PETSCVALIDHEADERSPECIFIC(b,VEC_COOKIE); PETSCVALIDHEADERSPECIFIC(x,VEC_COOKIE); 673 if (x == b) SETERRQ(1,"MatSolve:x and y must be different vectors"); 674 if (!mat->factor) SETERRQ(1,"MatSolve:Unfactored matrix"); 675 676 if (!mat->ops.solve) SETERRQ(PETSC_ERR_SUP,"MatSolve"); 677 PLogEventBegin(MAT_Solve,mat,b,x,0); 678 ierr = (*mat->ops.solve)(mat,b,x); CHKERRQ(ierr); 679 PLogEventEnd(MAT_Solve,mat,b,x,0); 680 return 0; 681 } 682 683 /* @ 684 MatForwardSolve - Solves L x = b, given a factored matrix, A = LU. 685 686 Input Parameters: 687 . mat - the factored matrix 688 . b - the right-hand-side vector 689 690 Output Parameter: 691 . x - the result vector 692 693 Notes: 694 MatSolve() should be used for most applications, as it performs 695 a forward solve followed by a backward solve. 696 697 .keywords: matrix, forward, LU, Cholesky, triangular solve 698 699 .seealso: MatSolve(), MatBackwardSolve() 700 @ */ 701 int MatForwardSolve(Mat mat,Vec b,Vec x) 702 { 703 int ierr; 704 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 705 PETSCVALIDHEADERSPECIFIC(b,VEC_COOKIE); PETSCVALIDHEADERSPECIFIC(x,VEC_COOKIE); 706 if (x == b) SETERRQ(1,"MatForwardSolve:x and y must be different vectors"); 707 if (!mat->factor) SETERRQ(1,"MatForwardSolve:Unfactored matrix"); 708 if (!mat->ops.forwardsolve) SETERRQ(PETSC_ERR_SUP,"MatForwardSolve"); 709 710 PLogEventBegin(MAT_ForwardSolve,mat,b,x,0); 711 ierr = (*mat->ops.forwardsolve)(mat,b,x); CHKERRQ(ierr); 712 PLogEventEnd(MAT_ForwardSolve,mat,b,x,0); 713 return 0; 714 } 715 716 /* @ 717 MatBackwardSolve - Solves U x = b, given a factored matrix, A = LU. 718 719 Input Parameters: 720 . mat - the factored matrix 721 . b - the right-hand-side vector 722 723 Output Parameter: 724 . x - the result vector 725 726 Notes: 727 MatSolve() should be used for most applications, as it performs 728 a forward solve followed by a backward solve. 729 730 .keywords: matrix, backward, LU, Cholesky, triangular solve 731 732 .seealso: MatSolve(), MatForwardSolve() 733 @ */ 734 int MatBackwardSolve(Mat mat,Vec b,Vec x) 735 { 736 int ierr; 737 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 738 PETSCVALIDHEADERSPECIFIC(b,VEC_COOKIE); PETSCVALIDHEADERSPECIFIC(x,VEC_COOKIE); 739 if (x == b) SETERRQ(1,"MatBackwardSolve:x and b must be different vectors"); 740 if (!mat->factor) SETERRQ(1,"MatBackwardSolve:Unfactored matrix"); 741 if (!mat->ops.backwardsolve) SETERRQ(PETSC_ERR_SUP,"MatBackwardSolve"); 742 743 PLogEventBegin(MAT_BackwardSolve,mat,b,x,0); 744 ierr = (*mat->ops.backwardsolve)(mat,b,x); CHKERRQ(ierr); 745 PLogEventEnd(MAT_BackwardSolve,mat,b,x,0); 746 return 0; 747 } 748 749 /*@ 750 MatSolveAdd - Computes x = y + inv(A)*b, given a factored matrix. 751 752 Input Parameters: 753 . mat - the factored matrix 754 . b - the right-hand-side vector 755 . y - the vector to be added to 756 757 Output Parameter: 758 . x - the result vector 759 760 .keywords: matrix, linear system, solve, LU, Cholesky, add 761 762 .seealso: MatSolve(), MatSolveTrans(), MatSolveTransAdd() 763 @*/ 764 int MatSolveAdd(Mat mat,Vec b,Vec y,Vec x) 765 { 766 Scalar one = 1.0; 767 Vec tmp; 768 int ierr; 769 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);PETSCVALIDHEADERSPECIFIC(y,VEC_COOKIE); 770 PETSCVALIDHEADERSPECIFIC(b,VEC_COOKIE); PETSCVALIDHEADERSPECIFIC(x,VEC_COOKIE); 771 if (x == b) SETERRQ(1,"MatSolveAdd:x and b must be different vectors"); 772 if (!mat->factor) SETERRQ(1,"MatSolveAdd:Unfactored matrix"); 773 774 PLogEventBegin(MAT_SolveAdd,mat,b,x,y); 775 if (mat->ops.solveadd) { 776 ierr = (*mat->ops.solveadd)(mat,b,y,x); CHKERRQ(ierr); 777 } 778 else { 779 /* do the solve then the add manually */ 780 if (x != y) { 781 ierr = MatSolve(mat,b,x); CHKERRQ(ierr); 782 ierr = VecAXPY(&one,y,x); CHKERRQ(ierr); 783 } 784 else { 785 ierr = VecDuplicate(x,&tmp); CHKERRQ(ierr); 786 PLogObjectParent(mat,tmp); 787 ierr = VecCopy(x,tmp); CHKERRQ(ierr); 788 ierr = MatSolve(mat,b,x); CHKERRQ(ierr); 789 ierr = VecAXPY(&one,tmp,x); CHKERRQ(ierr); 790 ierr = VecDestroy(tmp); CHKERRQ(ierr); 791 } 792 } 793 PLogEventEnd(MAT_SolveAdd,mat,b,x,y); 794 return 0; 795 } 796 /*@ 797 MatSolveTrans - Solves A' x = b, given a factored matrix. 798 799 Input Parameters: 800 . mat - the factored matrix 801 . b - the right-hand-side vector 802 803 Output Parameter: 804 . x - the result vector 805 806 .keywords: matrix, linear system, solve, LU, Cholesky, transpose 807 808 .seealso: MatSolve(), MatSolveAdd(), MatSolveTransAdd() 809 @*/ 810 int MatSolveTrans(Mat mat,Vec b,Vec x) 811 { 812 int ierr; 813 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 814 PETSCVALIDHEADERSPECIFIC(b,VEC_COOKIE); PETSCVALIDHEADERSPECIFIC(x,VEC_COOKIE); 815 if (!mat->factor) SETERRQ(1,"MatSolveTrans:Unfactored matrix"); 816 if (x == b) SETERRQ(1,"MatSolveTrans:x and b must be different vectors"); 817 if (!mat->ops.solvetrans) SETERRQ(PETSC_ERR_SUP,"MatSolveTrans"); 818 819 PLogEventBegin(MAT_SolveTrans,mat,b,x,0); 820 ierr = (*mat->ops.solvetrans)(mat,b,x); CHKERRQ(ierr); 821 PLogEventEnd(MAT_SolveTrans,mat,b,x,0); 822 return 0; 823 } 824 /*@ 825 MatSolveTransAdd - Computes x = y + inv(trans(A)) b, given a 826 factored matrix. 827 828 Input Parameters: 829 . mat - the factored matrix 830 . b - the right-hand-side vector 831 . y - the vector to be added to 832 833 Output Parameter: 834 . x - the result vector 835 836 .keywords: matrix, linear system, solve, LU, Cholesky, transpose, add 837 838 .seealso: MatSolve(), MatSolveAdd(), MatSolveTrans() 839 @*/ 840 int MatSolveTransAdd(Mat mat,Vec b,Vec y,Vec x) 841 { 842 Scalar one = 1.0; 843 int ierr; 844 Vec tmp; 845 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);PETSCVALIDHEADERSPECIFIC(y,VEC_COOKIE); 846 PETSCVALIDHEADERSPECIFIC(b,VEC_COOKIE); PETSCVALIDHEADERSPECIFIC(x,VEC_COOKIE); 847 if (x == b) SETERRQ(1,"MatSolveTransAdd:x and b must be different vectors"); 848 if (!mat->factor) SETERRQ(1,"MatSolveTransAdd:Unfactored matrix"); 849 850 PLogEventBegin(MAT_SolveTransAdd,mat,b,x,y); 851 if (mat->ops.solvetransadd) { 852 ierr = (*mat->ops.solvetransadd)(mat,b,y,x); CHKERRQ(ierr); 853 } 854 else { 855 /* do the solve then the add manually */ 856 if (x != y) { 857 ierr = MatSolveTrans(mat,b,x); CHKERRQ(ierr); 858 ierr = VecAXPY(&one,y,x); CHKERRQ(ierr); 859 } 860 else { 861 ierr = VecDuplicate(x,&tmp); CHKERRQ(ierr); 862 PLogObjectParent(mat,tmp); 863 ierr = VecCopy(x,tmp); CHKERRQ(ierr); 864 ierr = MatSolveTrans(mat,b,x); CHKERRQ(ierr); 865 ierr = VecAXPY(&one,tmp,x); CHKERRQ(ierr); 866 ierr = VecDestroy(tmp); CHKERRQ(ierr); 867 } 868 } 869 PLogEventEnd(MAT_SolveTransAdd,mat,b,x,y); 870 return 0; 871 } 872 /* ----------------------------------------------------------------*/ 873 874 /*@ 875 MatRelax - Computes one relaxation sweep. 876 877 Input Parameters: 878 . mat - the matrix 879 . b - the right hand side 880 . omega - the relaxation factor 881 . flag - flag indicating the type of SOR, one of 882 $ SOR_FORWARD_SWEEP 883 $ SOR_BACKWARD_SWEEP 884 $ SOR_SYMMETRIC_SWEEP (SSOR method) 885 $ SOR_LOCAL_FORWARD_SWEEP 886 $ SOR_LOCAL_BACKWARD_SWEEP 887 $ SOR_LOCAL_SYMMETRIC_SWEEP (local SSOR) 888 $ SOR_APPLY_UPPER, SOR_APPLY_LOWER - applies 889 $ upper/lower triangular part of matrix to 890 $ vector (with omega) 891 $ SOR_ZERO_INITIAL_GUESS - zero initial guess 892 . shift - diagonal shift 893 . its - the number of iterations 894 895 Output Parameters: 896 . x - the solution (can contain an initial guess) 897 898 Notes: 899 SOR_LOCAL_FORWARD_SWEEP, SOR_LOCAL_BACKWARD_SWEEP, and 900 SOR_LOCAL_SYMMETRIC_SWEEP perform seperate independent smoothings 901 on each processor. 902 903 Application programmers will not generally use MatRelax() directly, 904 but instead will employ the SLES/PC interface. 905 906 Notes for Advanced Users: 907 The flags are implemented as bitwise inclusive or operations. 908 For example, use (SOR_ZERO_INITIAL_GUESS | SOR_SYMMETRIC_SWEEP) 909 to specify a zero initial guess for SSOR. 910 911 .keywords: matrix, relax, relaxation, sweep 912 @*/ 913 int MatRelax(Mat mat,Vec b,double omega,MatSORType flag,double shift, 914 int its,Vec x) 915 { 916 int ierr; 917 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 918 PETSCVALIDHEADERSPECIFIC(b,VEC_COOKIE); PETSCVALIDHEADERSPECIFIC(x,VEC_COOKIE); 919 if (!mat->ops.relax) SETERRQ(PETSC_ERR_SUP,"MatRelax"); 920 if (!mat->assembled) SETERRQ(1,"MatRelax:Not for unassembled matrix"); 921 922 PLogEventBegin(MAT_Relax,mat,b,x,0); 923 ierr =(*mat->ops.relax)(mat,b,omega,flag,shift,its,x); CHKERRQ(ierr); 924 PLogEventEnd(MAT_Relax,mat,b,x,0); 925 return 0; 926 } 927 928 /* 929 Default matrix copy routine. 930 */ 931 int MatCopy_Basic(Mat A,Mat B) 932 { 933 int ierr,i,rstart,rend,nz,*cwork; 934 Scalar *vwork; 935 936 ierr = MatZeroEntries(B); CHKERRQ(ierr); 937 ierr = MatGetOwnershipRange(A,&rstart,&rend); CHKERRQ(ierr); 938 for (i=rstart; i<rend; i++) { 939 ierr = MatGetRow(A,i,&nz,&cwork,&vwork); CHKERRQ(ierr); 940 ierr = MatSetValues(B,1,&i,nz,cwork,vwork,INSERT_VALUES); CHKERRQ(ierr); 941 ierr = MatRestoreRow(A,i,&nz,&cwork,&vwork); CHKERRQ(ierr); 942 } 943 ierr = MatAssemblyBegin(B,FINAL_ASSEMBLY); CHKERRQ(ierr); 944 ierr = MatAssemblyEnd(B,FINAL_ASSEMBLY); CHKERRQ(ierr); 945 return 0; 946 } 947 948 /*@C 949 MatCopy - Copys a matrix to another matrix. 950 951 Input Parameters: 952 . A - the matrix 953 954 Output Parameter: 955 . B - where the copy is put 956 957 Notes: 958 MatCopy() copies the matrix entries of a matrix to another existing 959 matrix (after first zeroing the second matrix). A related routine is 960 MatConvert(), which first creates a new matrix and then copies the data. 961 962 .keywords: matrix, copy, convert 963 964 .seealso: MatConvert() 965 @*/ 966 int MatCopy(Mat A,Mat B) 967 { 968 int ierr; 969 PETSCVALIDHEADERSPECIFIC(A,MAT_COOKIE);PETSCVALIDHEADERSPECIFIC(B,MAT_COOKIE); 970 if (!A->assembled) SETERRQ(1,"MatCopy:Not for unassembled matrix"); 971 972 PLogEventBegin(MAT_Copy,A,B,0,0); 973 if (A->ops.copy) { 974 ierr = (*A->ops.copy)(A,B); CHKERRQ(ierr); 975 } 976 else { /* generic conversion */ 977 ierr = MatCopy_Basic(A,B); CHKERRQ(ierr); 978 } 979 PLogEventEnd(MAT_Copy,A,B,0,0); 980 return 0; 981 } 982 983 /*@C 984 MatConvert - Converts a matrix to another matrix, either of the same 985 or different type. 986 987 Input Parameters: 988 . mat - the matrix 989 . newtype - new matrix type. Use MATSAME to create a new matrix of the 990 same type as the original matrix. 991 992 Output Parameter: 993 . M - pointer to place new matrix 994 995 Notes: 996 MatConvert() first creates a new matrix and then copies the data from 997 the first matrix. A related routine is MatCopy(), which copies the matrix 998 entries of one matrix to another already existing matrix context. 999 1000 .keywords: matrix, copy, convert 1001 1002 .seealso: MatCopy() 1003 @*/ 1004 int MatConvert(Mat mat,MatType newtype,Mat *M) 1005 { 1006 int ierr; 1007 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1008 if (!M) SETERRQ(1,"MatConvert:Bad new matrix address"); 1009 if (!mat->assembled) SETERRQ(1,"MatConvert:Not for unassembled matrix"); 1010 1011 PLogEventBegin(MAT_Convert,mat,0,0,0); 1012 if (newtype == mat->type || newtype == MATSAME) { 1013 if (mat->ops.convertsametype) { /* customized copy */ 1014 ierr = (*mat->ops.convertsametype)(mat,M,COPY_VALUES); CHKERRQ(ierr); 1015 } 1016 } 1017 else if (mat->ops.convert) { /* customized conversion */ 1018 ierr = (*mat->ops.convert)(mat,newtype,M); CHKERRQ(ierr); 1019 } 1020 else { /* generic conversion */ 1021 ierr = MatConvert_Basic(mat,newtype,M); CHKERRQ(ierr); 1022 } 1023 PLogEventEnd(MAT_Convert,mat,0,0,0); 1024 return 0; 1025 } 1026 1027 /*@ 1028 MatGetDiagonal - Gets the diagonal of a matrix. 1029 1030 Input Parameters: 1031 . mat - the matrix 1032 1033 Output Parameters: 1034 . v - the vector for storing the diagonal 1035 1036 .keywords: matrix, get, diagonal 1037 @*/ 1038 int MatGetDiagonal(Mat mat,Vec v) 1039 { 1040 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE);PETSCVALIDHEADERSPECIFIC(v,VEC_COOKIE); 1041 if (!mat->assembled) SETERRQ(1,"MatGetDiagonal:Not for unassembled matrix"); 1042 if (mat->ops.getdiagonal) return (*mat->ops.getdiagonal)(mat,v); 1043 SETERRQ(PETSC_ERR_SUP,"MatGetDiagonal"); 1044 } 1045 1046 /*@C 1047 MatTranspose - Computes an in-place or out-of-place transpose of a matrix. 1048 1049 Input Parameters: 1050 . mat - the matrix to transpose 1051 1052 Output Parameters: 1053 . B - the transpose (or pass in PETSC_NULL for an in-place transpose) 1054 1055 .keywords: matrix, transpose 1056 @*/ 1057 int MatTranspose(Mat mat,Mat *B) 1058 { 1059 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1060 if (!mat->assembled) SETERRQ(1,"MatTranspose:Not for unassembled matrix"); 1061 if (mat->ops.transpose) return (*mat->ops.transpose)(mat,B); 1062 SETERRQ(PETSC_ERR_SUP,"MatTranspose"); 1063 } 1064 1065 /*@ 1066 MatEqual - Compares two matrices. Returns 1 if two matrices are equal. 1067 1068 Input Parameters: 1069 . mat1 - the first matrix 1070 . mat2 - the second matrix 1071 1072 Returns: 1073 Returns 1 if the matrices are equal; returns 0 otherwise. 1074 1075 .keywords: matrix, equal, equivalent 1076 @*/ 1077 int MatEqual(Mat mat1,Mat mat2) 1078 { 1079 PETSCVALIDHEADERSPECIFIC(mat1,MAT_COOKIE); PETSCVALIDHEADERSPECIFIC(mat2,MAT_COOKIE); 1080 if (!mat1->assembled) SETERRQ(1,"MatEqual:Not for unassembled matrix"); 1081 if (!mat2->assembled) SETERRQ(1,"MatEqual:Not for unassembled matrix"); 1082 if (mat1->ops.equal) return (*mat1->ops.equal)(mat1,mat2); 1083 SETERRQ(PETSC_ERR_SUP,"MatEqual"); 1084 } 1085 1086 /*@ 1087 MatDiagonalScale - Scales a matrix on the left and right by diagonal 1088 matrices that are stored as vectors. Either of the two scaling 1089 matrices can be null. 1090 1091 Input Parameters: 1092 . mat - the matrix to be scaled 1093 . l - the left scaling vector 1094 . r - the right scaling vector 1095 1096 .keywords: matrix, scale 1097 @*/ 1098 int MatDiagonalScale(Mat mat,Vec l,Vec r) 1099 { 1100 int ierr; 1101 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1102 if (!mat->ops.scale) SETERRQ(PETSC_ERR_SUP,"MatDiagonalScale"); 1103 if (l) PETSCVALIDHEADERSPECIFIC(l,VEC_COOKIE); 1104 if (r) PETSCVALIDHEADERSPECIFIC(r,VEC_COOKIE); 1105 if (!mat->assembled) SETERRQ(1,"MatDiagonalScale:Not for unassembled matrix"); 1106 1107 PLogEventBegin(MAT_Scale,mat,0,0,0); 1108 ierr = (*mat->ops.diagonalscale)(mat,l,r); CHKERRQ(ierr); 1109 PLogEventEnd(MAT_Scale,mat,0,0,0); 1110 return 0; 1111 } 1112 1113 /*@ 1114 MatScale - Scales a matrix by a number. 1115 1116 Input Parameters: 1117 . mat - the matrix to be scaled 1118 . a - the number 1119 1120 Note: the name of this routine MUST change. 1121 .keywords: matrix, scale 1122 @*/ 1123 int MatScale(Scalar *a,Mat mat) 1124 { 1125 int ierr; 1126 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1127 if (!mat->ops.scale) SETERRQ(PETSC_ERR_SUP,"MatScale"); 1128 if (!mat->assembled) SETERRQ(1,"MatScale:Not for unassembled matrix"); 1129 1130 PLogEventBegin(MAT_Scale,mat,0,0,0); 1131 ierr = (*mat->ops.scale)(a,mat); CHKERRQ(ierr); 1132 PLogEventEnd(MAT_Scale,mat,0,0,0); 1133 return 0; 1134 } 1135 1136 /*@ 1137 MatNorm - Calculates various norms of a matrix. 1138 1139 Input Parameters: 1140 . mat - the matrix 1141 . type - the type of norm, NORM_1, NORM_2, NORM_FROBENIUS, NORM_INFINITY 1142 1143 Output Parameters: 1144 . norm - the resulting norm 1145 1146 .keywords: matrix, norm, Frobenius 1147 @*/ 1148 int MatNorm(Mat mat,NormType type,double *norm) 1149 { 1150 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1151 if (!norm) SETERRQ(1,"MatNorm:bad addess for value"); 1152 if (!mat->assembled) SETERRQ(1,"MatNorm:Not for unassembled matrix"); 1153 if (mat->ops.norm) return (*mat->ops.norm)(mat,type,norm); 1154 SETERRQ(PETSC_ERR_SUP,"MatNorm:Not for this matrix type"); 1155 } 1156 1157 /*@ 1158 MatAssemblyBegin - Begins assembling the matrix. This routine should 1159 be called after completing all calls to MatSetValues(). 1160 1161 Input Parameters: 1162 . mat - the matrix 1163 . type - type of assembly, either FLUSH_ASSEMBLY or FINAL_ASSEMBLY 1164 1165 Notes: 1166 MatSetValues() generally caches the values. The matrix is ready to 1167 use only after MatAssemblyBegin() and MatAssemblyEnd() have been called. 1168 Use FLUSH_ASSEMBLY when switching between ADD_VALUES and SetValues; use 1169 FINAL_ASSEMBLY for the final assembly before the matrix is used. 1170 1171 .keywords: matrix, assembly, assemble, begin 1172 1173 .seealso: MatAssemblyEnd(), MatSetValues() 1174 @*/ 1175 int MatAssemblyBegin(Mat mat,MatAssemblyType type) 1176 { 1177 int ierr; 1178 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1179 PLogEventBegin(MAT_AssemblyBegin,mat,0,0,0); 1180 if (mat->ops.assemblybegin){ierr = (*mat->ops.assemblybegin)(mat,type);CHKERRQ(ierr);} 1181 PLogEventEnd(MAT_AssemblyBegin,mat,0,0,0); 1182 return 0; 1183 } 1184 1185 /*@ 1186 MatAssemblyEnd - Completes assembling the matrix. This routine should 1187 be called after all calls to MatSetValues() and after MatAssemblyBegin(). 1188 1189 Input Parameters: 1190 . mat - the matrix 1191 . type - type of assembly, either FLUSH_ASSEMBLY or FINAL_ASSEMBLY 1192 1193 Options Database Keys: 1194 $ -mat_view_draw : Draw nonzero structure of matrix at conclusion of MatEndAssembly(), 1195 using MatView() and DrawOpenX(). 1196 $ -mat_view_info : Prints info on matrix. 1197 $ -mat_view_info_detailed: More detailed information. 1198 $ -mat_view_ascii : Prints matrix out in ascii. 1199 $ -display <name> : Set display name (default is host) 1200 $ -draw_pause <sec> : Set number of seconds to pause after display 1201 1202 Note: 1203 MatSetValues() generally caches the values. The matrix is ready to 1204 use only after MatAssemblyBegin() and MatAssemblyEnd() have been called. 1205 Use FLUSH_ASSEMBLY when switching between ADD_VALUES and SetValues; use 1206 FINAL_ASSEMBLY for the final assembly before the matrix is used. 1207 1208 .keywords: matrix, assembly, assemble, end 1209 1210 .seealso: MatAssemblyBegin(), MatSetValues() 1211 @*/ 1212 int MatAssemblyEnd(Mat mat,MatAssemblyType type) 1213 { 1214 int ierr,flg; 1215 static int inassm = 0; 1216 1217 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1218 inassm++; 1219 PLogEventBegin(MAT_AssemblyEnd,mat,0,0,0); 1220 if (mat->ops.assemblyend) {ierr = (*mat->ops.assemblyend)(mat,type); CHKERRQ(ierr);} 1221 mat->assembled = PETSC_TRUE; mat->num_ass++; 1222 PLogEventEnd(MAT_AssemblyEnd,mat,0,0,0); 1223 1224 if (inassm == 1) { 1225 ierr = OptionsHasName(PETSC_NULL,"-mat_view_info",&flg); CHKERRQ(ierr); 1226 if (flg) { 1227 Viewer viewer; 1228 ierr = ViewerFileOpenASCII(mat->comm,"stdout",&viewer);CHKERRQ(ierr); 1229 ierr = ViewerFileSetFormat(viewer,FILE_FORMAT_INFO,0);CHKERRQ(ierr); 1230 ierr = MatView(mat,viewer); CHKERRQ(ierr); 1231 ierr = ViewerDestroy(viewer); CHKERRQ(ierr); 1232 } 1233 ierr = OptionsHasName(PETSC_NULL,"-mat_view_info_detailed",&flg); CHKERRQ(ierr); 1234 if (flg) { 1235 Viewer viewer; 1236 ierr = ViewerFileOpenASCII(mat->comm,"stdout",&viewer);CHKERRQ(ierr); 1237 ierr = ViewerFileSetFormat(viewer,FILE_FORMAT_INFO_DETAILED,0);CHKERRQ(ierr); 1238 ierr = MatView(mat,viewer); CHKERRQ(ierr); 1239 ierr = ViewerDestroy(viewer); CHKERRQ(ierr); 1240 } 1241 ierr = OptionsHasName(PETSC_NULL,"-mat_view",&flg); CHKERRQ(ierr); 1242 if (flg) { 1243 Viewer viewer; 1244 ierr = ViewerFileOpenASCII(mat->comm,"stdout",&viewer);CHKERRQ(ierr); 1245 ierr = MatView(mat,viewer); CHKERRQ(ierr); 1246 ierr = ViewerDestroy(viewer); CHKERRQ(ierr); 1247 } 1248 ierr = OptionsHasName(PETSC_NULL,"-mat_view_draw",&flg); CHKERRQ(ierr); 1249 if (flg) { 1250 Draw win; 1251 ierr = DrawOpenX(mat->comm,0,0,0,0,300,300,&win); CHKERRQ(ierr); 1252 ierr = MatView(mat,(Viewer)win); CHKERRQ(ierr); 1253 ierr = DrawSyncFlush(win); CHKERRQ(ierr); 1254 ierr = DrawDestroy(win); CHKERRQ(ierr); 1255 } 1256 } 1257 inassm--; 1258 return 0; 1259 } 1260 1261 /*@ 1262 MatCompress - Tries to store the matrix in as little space as 1263 possible. May fail if memory is already fully used, since it 1264 tries to allocate new space. 1265 1266 Input Parameters: 1267 . mat - the matrix 1268 1269 .keywords: matrix, compress 1270 @*/ 1271 int MatCompress(Mat mat) 1272 { 1273 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1274 if (mat->ops.compress) return (*mat->ops.compress)(mat); 1275 return 0; 1276 } 1277 /*@ 1278 MatSetOption - Sets a parameter option for a matrix. Some options 1279 may be specific to certain storage formats. Some options 1280 determine how values will be inserted (or added). Sorted, 1281 row-oriented input will generally assemble the fastest. The default 1282 is row-oriented, nonsorted input. 1283 1284 Input Parameters: 1285 . mat - the matrix 1286 . option - the option, one of the following: 1287 $ ROW_ORIENTED 1288 $ COLUMN_ORIENTED, 1289 $ ROWS_SORTED, 1290 $ COLUMNS_SORTED, 1291 $ NO_NEW_NONZERO_LOCATIONS, 1292 $ YES_NEW_NONZERO_LOCATIONS, 1293 $ SYMMETRIC_MATRIX, 1294 $ STRUCTURALLY_SYMMETRIC_MATRIX, 1295 $ NO_NEW_DIAGONALS, 1296 $ YES_NEW_DIAGONALS, 1297 $ and possibly others. 1298 1299 Notes: 1300 Some options are relevant only for particular matrix types and 1301 are thus ignored by others. Other options are not supported by 1302 certain matrix types and will generate an error message if set. 1303 1304 If using a Fortran 77 module to compute a matrix, one may need to 1305 use the column-oriented option (or convert to the row-oriented 1306 format). 1307 1308 NO_NEW_NONZERO_LOCATIONS indicates that any add or insertion 1309 that will generate a new entry in the nonzero structure is ignored. 1310 What this means is if memory is not allocated for this particular 1311 lot, then the insertion is ignored. For dense matrices, where 1312 the entire array is allocated, no entries are ever ignored. 1313 1314 .keywords: matrix, option, row-oriented, column-oriented, sorted, nonzero 1315 @*/ 1316 int MatSetOption(Mat mat,MatOption op) 1317 { 1318 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1319 if (mat->ops.setoption) return (*mat->ops.setoption)(mat,op); 1320 return 0; 1321 } 1322 1323 /*@ 1324 MatZeroEntries - Zeros all entries of a matrix. For sparse matrices 1325 this routine retains the old nonzero structure. 1326 1327 Input Parameters: 1328 . mat - the matrix 1329 1330 .keywords: matrix, zero, entries 1331 1332 .seealso: MatZeroRows() 1333 @*/ 1334 int MatZeroEntries(Mat mat) 1335 { 1336 int ierr; 1337 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1338 if (!mat->ops.zeroentries) SETERRQ(PETSC_ERR_SUP,"MatZeroEntries"); 1339 1340 PLogEventBegin(MAT_ZeroEntries,mat,0,0,0); 1341 ierr = (*mat->ops.zeroentries)(mat); CHKERRQ(ierr); 1342 PLogEventEnd(MAT_ZeroEntries,mat,0,0,0); 1343 return 0; 1344 } 1345 1346 /*@ 1347 MatZeroRows - Zeros all entries (except possibly the main diagonal) 1348 of a set of rows of a matrix. 1349 1350 Input Parameters: 1351 . mat - the matrix 1352 . is - index set of rows to remove 1353 . diag - pointer to value put in all diagonals of eliminated rows. 1354 Note that diag is not a pointer to an array, but merely a 1355 pointer to a single value. 1356 1357 Notes: 1358 For the AIJ matrix formats this removes the old nonzero structure, 1359 but does not release memory. For the dense and block diagonal 1360 formats this does not alter the nonzero structure. 1361 1362 The user can set a value in the diagonal entry (or for the AIJ and 1363 row formats can optionally remove the main diagonal entry from the 1364 nonzero structure as well, by passing a null pointer as the final 1365 argument). 1366 1367 .keywords: matrix, zero, rows, boundary conditions 1368 1369 .seealso: MatZeroEntries(), MatGetSubMatrix(), MatGetSubMatrixInPlace() 1370 @*/ 1371 int MatZeroRows(Mat mat,IS is, Scalar *diag) 1372 { 1373 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1374 if (!mat->assembled) SETERRQ(1,"MatZeroRows:Not for unassembled matrix"); 1375 if (mat->ops.zerorows) return (*mat->ops.zerorows)(mat,is,diag); 1376 SETERRQ(PETSC_ERR_SUP,"MatZeroRows"); 1377 } 1378 1379 /*@ 1380 MatGetSize - Returns the numbers of rows and columns in a matrix. 1381 1382 Input Parameter: 1383 . mat - the matrix 1384 1385 Output Parameters: 1386 . m - the number of global rows 1387 . n - the number of global columns 1388 1389 .keywords: matrix, dimension, size, rows, columns, global, get 1390 1391 .seealso: MatGetLocalSize() 1392 @*/ 1393 int MatGetSize(Mat mat,int *m,int* n) 1394 { 1395 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1396 if (!m || !n) SETERRQ(1,"MatGetSize:Bad address for result"); 1397 return (*mat->ops.getsize)(mat,m,n); 1398 } 1399 1400 /*@ 1401 MatGetLocalSize - Returns the number of rows and columns in a matrix 1402 stored locally. This information may be implementation dependent, so 1403 use with care. 1404 1405 Input Parameters: 1406 . mat - the matrix 1407 1408 Output Parameters: 1409 . m - the number of local rows 1410 . n - the number of local columns 1411 1412 .keywords: matrix, dimension, size, local, rows, columns, get 1413 1414 .seealso: MatGetSize() 1415 @*/ 1416 int MatGetLocalSize(Mat mat,int *m,int* n) 1417 { 1418 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1419 if (!m || !n) SETERRQ(1,"MatGetLocalSize:Bad address for result"); 1420 return (*mat->ops.getlocalsize)(mat,m,n); 1421 } 1422 1423 /*@ 1424 MatGetOwnershipRange - Returns the range of matrix rows owned by 1425 this processor, assuming that the matrix is laid out with the first 1426 n1 rows on the first processor, the next n2 rows on the second, etc. 1427 For certain parallel layouts this range may not be well-defined. 1428 1429 Input Parameters: 1430 . mat - the matrix 1431 1432 Output Parameters: 1433 . m - the first local row 1434 . n - one more then the last local row 1435 1436 .keywords: matrix, get, range, ownership 1437 @*/ 1438 int MatGetOwnershipRange(Mat mat,int *m,int* n) 1439 { 1440 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1441 if (!m || !n) SETERRQ(1,"MatGetOwnershipRange:Bad address for result"); 1442 if (mat->ops.getownershiprange) return (*mat->ops.getownershiprange)(mat,m,n); 1443 SETERRQ(PETSC_ERR_SUP,"MatGetOwnershipRange"); 1444 } 1445 1446 /*@ 1447 MatILUFactorSymbolic - Performs symbolic ILU factorization of a matrix. 1448 Uses levels of fill only, not drop tolerance. Use MatLUFactorNumeric() 1449 to complete the factorization. 1450 1451 Input Parameters: 1452 . mat - the matrix 1453 . row - row permutation 1454 . column - column permutation 1455 . fill - number of levels of fill 1456 . f - expected fill as ratio of the original number of nonzeros, 1457 for example 3.0; choosing this parameter well can result in 1458 more efficient use of time and space. 1459 1460 Output Parameters: 1461 . fact - new matrix that has been symbolically factored 1462 1463 Options Database Key: 1464 $ -mat_ilu_fill <f>, where f is the fill ratio 1465 1466 Notes: 1467 See the file $(PETSC_DIR)/Performace for additional information about 1468 choosing the fill factor for better efficiency. 1469 1470 .keywords: matrix, factor, incomplete, ILU, symbolic, fill 1471 1472 .seealso: MatLUFactorSymbolic(), MatLUFactorNumeric() 1473 @*/ 1474 int MatILUFactorSymbolic(Mat mat,IS row,IS col,double f,int fill,Mat *fact) 1475 { 1476 int ierr,flg; 1477 1478 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1479 if (fill < 0) SETERRQ(1,"MatILUFactorSymbolic:Levels of fill negative"); 1480 if (!fact) SETERRQ(1,"MatILUFactorSymbolic:Fact argument is missing"); 1481 if (!mat->ops.ilufactorsymbolic) SETERRQ(PETSC_ERR_SUP,"MatILUFactorSymbolic"); 1482 if (!mat->assembled) SETERRQ(1,"MatILUFactorSymbolic:Not for unassembled matrix"); 1483 1484 ierr = OptionsGetDouble(PETSC_NULL,"-mat_ilu_fill",&f,&flg); CHKERRQ(ierr); 1485 PLogEventBegin(MAT_ILUFactorSymbolic,mat,row,col,0); 1486 ierr = (*mat->ops.ilufactorsymbolic)(mat,row,col,f,fill,fact); CHKERRQ(ierr); 1487 PLogEventEnd(MAT_ILUFactorSymbolic,mat,row,col,0); 1488 return 0; 1489 } 1490 1491 /*@ 1492 MatIncompleteCholeskyFactorSymbolic - Performs symbolic incomplete 1493 Cholesky factorization for a symmetric matrix. Use 1494 MatCholeskyFactorNumeric() to complete the factorization. 1495 1496 Input Parameters: 1497 . mat - the matrix 1498 . perm - row and column permutation 1499 . fill - levels of fill 1500 . f - expected fill as ratio of original fill 1501 1502 Output Parameter: 1503 . fact - the factored matrix 1504 1505 Note: Currently only no-fill factorization is supported. 1506 1507 .keywords: matrix, factor, incomplete, ICC, Cholesky, symbolic, fill 1508 1509 .seealso: MatCholeskyFactorNumeric(), MatCholeskyFactor() 1510 @*/ 1511 int MatIncompleteCholeskyFactorSymbolic(Mat mat,IS perm,double f,int fill, 1512 Mat *fact) 1513 { 1514 int ierr; 1515 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1516 if (fill < 0) SETERRQ(1,"MatIncompleteCholeskyFactorSymbolic:Fill negative"); 1517 if (!fact) SETERRQ(1,"MatIncompleteCholeskyFactorSymbolic:Missing fact argument"); 1518 if (!mat->ops.incompletecholeskyfactorsymbolic) 1519 SETERRQ(PETSC_ERR_SUP,"MatIncompleteCholeskyFactorSymbolic"); 1520 if (!mat->assembled) 1521 SETERRQ(1,"MatIncompleteCholeskyFactorSymbolic:Not for unassembled matrix"); 1522 1523 PLogEventBegin(MAT_IncompleteCholeskyFactorSymbolic,mat,perm,0,0); 1524 ierr = (*mat->ops.incompletecholeskyfactorsymbolic)(mat,perm,f,fill,fact);CHKERRQ(ierr); 1525 PLogEventEnd(MAT_IncompleteCholeskyFactorSymbolic,mat,perm,0,0); 1526 return 0; 1527 } 1528 1529 /*@C 1530 MatGetArray - Returns a pointer to the element values in the matrix. 1531 This routine is implementation dependent, and may not even work for 1532 certain matrix types. 1533 1534 Input Parameter: 1535 . mat - the matrix 1536 1537 Output Parameter: 1538 . v - the location of the values 1539 1540 Fortran Note: 1541 The Fortran interface is slightly different from that given below. 1542 See the users manual and petsc/src/mat/examples for details. 1543 1544 .keywords: matrix, array, elements, values 1545 @*/ 1546 int MatGetArray(Mat mat,Scalar **v) 1547 { 1548 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1549 if (!v) SETERRQ(1,"MatGetArray:Bad input, array pointer location"); 1550 if (!mat->ops.getarray) SETERRQ(PETSC_ERR_SUP,"MatGetArraye"); 1551 return (*mat->ops.getarray)(mat,v); 1552 } 1553 1554 /*@C 1555 MatGetSubMatrix - Extracts a submatrix from a matrix. If submat points 1556 to a valid matrix, it may be reused. 1557 1558 Input Parameters: 1559 . mat - the matrix 1560 . irow, icol - index sets of rows and columns to extract 1561 . scall - either MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX 1562 1563 Output Parameter: 1564 . submat - the submatrix 1565 1566 Notes: 1567 MatGetSubMatrix() can be useful in setting boundary conditions. 1568 1569 Use MatGetSubMatrices() to extract multiple submatrices. 1570 1571 .keywords: matrix, get, submatrix, boundary conditions 1572 1573 .seealso: MatZeroRows(), MatGetSubMatrixInPlace(), MatGetSubMatrices() 1574 @*/ 1575 int MatGetSubMatrix(Mat mat,IS irow,IS icol,MatGetSubMatrixCall scall,Mat *submat) 1576 { 1577 int ierr; 1578 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1579 if (scall == MAT_REUSE_MATRIX) { 1580 PETSCVALIDHEADERSPECIFIC(*submat,MAT_COOKIE); 1581 } 1582 if (!mat->ops.getsubmatrix) SETERRQ(PETSC_ERR_SUP,"MatGetSubMatrix"); 1583 if (!mat->assembled) SETERRQ(1,"MatGetSubMatrix:Not for unassembled matrix"); 1584 1585 PLogEventBegin(MAT_GetSubMatrix,mat,irow,icol,0); 1586 ierr = (*mat->ops.getsubmatrix)(mat,irow,icol,scall,submat); CHKERRQ(ierr); 1587 PLogEventEnd(MAT_GetSubMatrix,mat,irow,icol,0); 1588 return 0; 1589 } 1590 1591 /*@C 1592 MatGetSubMatrices - Extracts several submatrices from a matrix. If submat 1593 points to an array of valid matrices, it may be reused. 1594 1595 Input Parameters: 1596 . mat - the matrix 1597 . irow, icol - index sets of rows and columns to extract 1598 1599 Output Parameter: 1600 . submat - the submatrices 1601 1602 Note: 1603 Use MatGetSubMatrix() for extracting a sinble submatrix. 1604 1605 .keywords: matrix, get, submatrix, submatrices 1606 1607 .seealso: MatGetSubMatrix() 1608 @*/ 1609 int MatGetSubMatrices(Mat mat,int n, IS *irow,IS *icol,MatGetSubMatrixCall scall, 1610 Mat **submat) 1611 { 1612 int ierr; 1613 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1614 if (!mat->ops.getsubmatrices) SETERRQ(PETSC_ERR_SUP,"MatGetSubMatrices"); 1615 if (!mat->assembled) SETERRQ(1,"MatGetSubMatrices:Not for unassembled matrix"); 1616 1617 PLogEventBegin(MAT_GetSubMatrices,mat,0,0,0); 1618 ierr = (*mat->ops.getsubmatrices)(mat,n,irow,icol,scall,submat); CHKERRQ(ierr); 1619 PLogEventEnd(MAT_GetSubMatrices,mat,0,0,0); 1620 return 0; 1621 } 1622 1623 /*@ 1624 MatGetSubMatrixInPlace - Extracts a submatrix from a matrix, returning 1625 the submatrix in place of the original matrix. 1626 1627 Input Parameters: 1628 . mat - the matrix 1629 . irow, icol - index sets of rows and columns to extract 1630 1631 .keywords: matrix, get, submatrix, boundary conditions, in-place 1632 1633 .seealso: MatZeroRows(), MatGetSubMatrix() 1634 @*/ 1635 int MatGetSubMatrixInPlace(Mat mat,IS irow,IS icol) 1636 { 1637 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1638 if (!mat->assembled) SETERRQ(1,"MatGetSubMatrixInPlace:Not for unassembled matrix"); 1639 1640 if (!mat->ops.getsubmatrixinplace) SETERRQ(PETSC_ERR_SUP,"MatGetSubmatrixInPlace"); 1641 return (*mat->ops.getsubmatrixinplace)(mat,irow,icol); 1642 } 1643 1644 /*@ 1645 MatIncreaseOverlap - Given a set of submatrices indicated by index sets, 1646 replaces the index by larger ones that represent submatrices with more 1647 overlap. 1648 1649 Input Parameters: 1650 . mat - the matrix 1651 . n - the number of index sets 1652 . is - the array of pointers to index sets 1653 . ov - the additional overlap requested 1654 1655 .keywords: matrix, overlap, Schwarz 1656 1657 .seealso: MatGetSubMatrices() 1658 @*/ 1659 int MatIncreaseOverlap(Mat mat,int n, IS *is, int ov) 1660 { 1661 int ierr; 1662 PETSCVALIDHEADERSPECIFIC(mat,MAT_COOKIE); 1663 if (!mat->assembled) SETERRQ(1,"MatIncreaseOverlap:Not for unassembled matrix"); 1664 1665 if (ov == 0) return 0; 1666 if (!mat->ops.increaseoverlap) SETERRQ(PETSC_ERR_SUP,"MatIncreaseOverlap"); 1667 PLogEventBegin(MAT_IncreaseOverlap,mat,0,0,0); 1668 ierr = (*mat->ops.increaseoverlap)(mat,n,is,ov); CHKERRQ(ierr); 1669 PLogEventEnd(MAT_IncreaseOverlap,mat,0,0,0); 1670 return 0; 1671 } 1672 1673 /*@ 1674 MatPrintHelp - Prints all the options for the matrix. 1675 1676 Input Parameter: 1677 . mat - the matrix 1678 1679 Options Database Keys: 1680 $ -help, -h 1681 1682 .keywords: mat, help 1683 1684 .seealso: MatCreate(), MatCreateXXX() 1685 @*/ 1686 int MatPrintHelp(Mat mat) 1687 { 1688 static int called = 0; 1689 MPI_Comm comm = mat->comm; 1690 1691 if (!called) { 1692 MPIU_printf(comm,"General matrix options:\n"); 1693 MPIU_printf(comm," -mat_view_info : view basic matrix info during MatAssemblyEnd()\n"); 1694 MPIU_printf(comm," -mat_view_info_detailed : view detailed matrix info during MatAssemblyEnd()\n"); 1695 MPIU_printf(comm," -mat_view_draw : draw nonzero matrix structure during MatAssemblyEnd()\n"); 1696 MPIU_printf(comm," -draw_pause <sec> : set seconds of display pause\n"); 1697 MPIU_printf(comm," -display <name> : set alternate display\n"); 1698 called = 1; 1699 } 1700 if (mat->ops.printhelp) (*mat->ops.printhelp)(mat); 1701 return 0; 1702 } 1703 1704