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