1 /*$Id: matrix.c,v 1.414 2001/09/28 18:57:28 balay Exp $*/ 2 3 /* 4 This is where the abstract matrix operations are defined 5 */ 6 7 #include "src/mat/matimpl.h" /*I "petscmat.h" I*/ 8 #include "src/vec/vecimpl.h" 9 10 /* Logging support */ 11 int MAT_COOKIE; 12 int MATSNESMFCTX_COOKIE; 13 int MAT_Mult, MAT_MultMatrixFree, MAT_Mults, MAT_MultConstrained, MAT_MultAdd, MAT_MultTranspose; 14 int MAT_MultTransposeConstrained, MAT_MultTransposeAdd, MAT_Solve, MAT_Solves, MAT_SolveAdd, MAT_SolveTranspose; 15 int MAT_SolveTransposeAdd, MAT_Relax, MAT_ForwardSolve, MAT_BackwardSolve, MAT_LUFactor, MAT_LUFactorSymbolic; 16 int MAT_LUFactorNumeric, MAT_CholeskyFactor, MAT_CholeskyFactorSymbolic, MAT_CholeskyFactorNumeric, MAT_ILUFactor; 17 int MAT_ILUFactorSymbolic, MAT_ICCFactorSymbolic, MAT_Copy, MAT_Convert, MAT_Scale, MAT_AssemblyBegin; 18 int MAT_AssemblyEnd, MAT_SetValues, MAT_GetValues, MAT_GetRow, MAT_GetSubMatrices, MAT_GetColoring, MAT_GetOrdering; 19 int MAT_IncreaseOverlap, MAT_Partitioning, MAT_ZeroEntries, MAT_Load, MAT_View, MAT_AXPY, MAT_FDColoringCreate; 20 int MAT_FDColoringApply,MAT_Transpose; 21 22 #undef __FUNCT__ 23 #define __FUNCT__ "MatGetRow" 24 /*@C 25 MatGetRow - Gets a row of a matrix. You MUST call MatRestoreRow() 26 for each row that you get to ensure that your application does 27 not bleed memory. 28 29 Not Collective 30 31 Input Parameters: 32 + mat - the matrix 33 - row - the row to get 34 35 Output Parameters: 36 + ncols - the number of nonzeros in the row 37 . cols - if not NULL, the column numbers 38 - vals - if not NULL, the values 39 40 Notes: 41 This routine is provided for people who need to have direct access 42 to the structure of a matrix. We hope that we provide enough 43 high-level matrix routines that few users will need it. 44 45 MatGetRow() always returns 0-based column indices, regardless of 46 whether the internal representation is 0-based (default) or 1-based. 47 48 For better efficiency, set cols and/or vals to PETSC_NULL if you do 49 not wish to extract these quantities. 50 51 The user can only examine the values extracted with MatGetRow(); 52 the values cannot be altered. To change the matrix entries, one 53 must use MatSetValues(). 54 55 You can only have one call to MatGetRow() outstanding for a particular 56 matrix at a time, per processor. MatGetRow() can only obtained rows 57 associated with the given processor, it cannot get rows from the 58 other processors; for that we suggest using MatGetSubMatrices(), then 59 MatGetRow() on the submatrix. The row indix passed to MatGetRows() 60 is in the global number of rows. 61 62 Fortran Notes: 63 The calling sequence from Fortran is 64 .vb 65 MatGetRow(matrix,row,ncols,cols,values,ierr) 66 Mat matrix (input) 67 integer row (input) 68 integer ncols (output) 69 integer cols(maxcols) (output) 70 double precision (or double complex) values(maxcols) output 71 .ve 72 where maxcols >= maximum nonzeros in any row of the matrix. 73 74 Caution: 75 Do not try to change the contents of the output arrays (cols and vals). 76 In some cases, this may corrupt the matrix. 77 78 Level: advanced 79 80 Concepts: matrices^row access 81 82 .seealso: MatRestoreRow(), MatSetValues(), MatGetValues(), MatGetSubmatrices(), MatGetDiagonal() 83 @*/ 84 int MatGetRow(Mat mat,int row,int *ncols,int **cols,PetscScalar **vals) 85 { 86 int ierr; 87 88 PetscFunctionBegin; 89 PetscValidHeaderSpecific(mat,MAT_COOKIE); 90 PetscValidIntPointer(ncols); 91 PetscValidType(mat); 92 MatPreallocated(mat); 93 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 94 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 95 if (!mat->ops->getrow) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 96 ierr = PetscLogEventBegin(MAT_GetRow,mat,0,0,0);CHKERRQ(ierr); 97 ierr = (*mat->ops->getrow)(mat,row,ncols,cols,vals);CHKERRQ(ierr); 98 ierr = PetscLogEventEnd(MAT_GetRow,mat,0,0,0);CHKERRQ(ierr); 99 PetscFunctionReturn(0); 100 } 101 102 #undef __FUNCT__ 103 #define __FUNCT__ "MatRestoreRow" 104 /*@C 105 MatRestoreRow - Frees any temporary space allocated by MatGetRow(). 106 107 Not Collective 108 109 Input Parameters: 110 + mat - the matrix 111 . row - the row to get 112 . ncols, cols - the number of nonzeros and their columns 113 - vals - if nonzero the column values 114 115 Notes: 116 This routine should be called after you have finished examining the entries. 117 118 Fortran Notes: 119 The calling sequence from Fortran is 120 .vb 121 MatRestoreRow(matrix,row,ncols,cols,values,ierr) 122 Mat matrix (input) 123 integer row (input) 124 integer ncols (output) 125 integer cols(maxcols) (output) 126 double precision (or double complex) values(maxcols) output 127 .ve 128 Where maxcols >= maximum nonzeros in any row of the matrix. 129 130 In Fortran MatRestoreRow() MUST be called after MatGetRow() 131 before another call to MatGetRow() can be made. 132 133 Level: advanced 134 135 .seealso: MatGetRow() 136 @*/ 137 int MatRestoreRow(Mat mat,int row,int *ncols,int **cols,PetscScalar **vals) 138 { 139 int ierr; 140 141 PetscFunctionBegin; 142 PetscValidHeaderSpecific(mat,MAT_COOKIE); 143 PetscValidIntPointer(ncols); 144 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 145 if (!mat->ops->restorerow) PetscFunctionReturn(0); 146 ierr = (*mat->ops->restorerow)(mat,row,ncols,cols,vals);CHKERRQ(ierr); 147 PetscFunctionReturn(0); 148 } 149 150 #undef __FUNCT__ 151 #define __FUNCT__ "MatView" 152 /*@C 153 MatView - Visualizes a matrix object. 154 155 Collective on Mat 156 157 Input Parameters: 158 + mat - the matrix 159 - ptr - visualization context 160 161 Notes: 162 The available visualization contexts include 163 + PETSC_VIEWER_STDOUT_SELF - standard output (default) 164 . PETSC_VIEWER_STDOUT_WORLD - synchronized standard 165 output where only the first processor opens 166 the file. All other processors send their 167 data to the first processor to print. 168 - PETSC_VIEWER_DRAW_WORLD - graphical display of nonzero structure 169 170 The user can open alternative visualization contexts with 171 + PetscViewerASCIIOpen() - Outputs matrix to a specified file 172 . PetscViewerBinaryOpen() - Outputs matrix in binary to a 173 specified file; corresponding input uses MatLoad() 174 . PetscViewerDrawOpen() - Outputs nonzero matrix structure to 175 an X window display 176 - PetscViewerSocketOpen() - Outputs matrix to Socket viewer. 177 Currently only the sequential dense and AIJ 178 matrix types support the Socket viewer. 179 180 The user can call PetscViewerSetFormat() to specify the output 181 format of ASCII printed objects (when using PETSC_VIEWER_STDOUT_SELF, 182 PETSC_VIEWER_STDOUT_WORLD and PetscViewerASCIIOpen). Available formats include 183 + PETSC_VIEWER_ASCII_DEFAULT - default, prints matrix contents 184 . PETSC_VIEWER_ASCII_MATLAB - prints matrix contents in Matlab format 185 . PETSC_VIEWER_ASCII_DENSE - prints entire matrix including zeros 186 . PETSC_VIEWER_ASCII_COMMON - prints matrix contents, using a sparse 187 format common among all matrix types 188 . PETSC_VIEWER_ASCII_IMPL - prints matrix contents, using an implementation-specific 189 format (which is in many cases the same as the default) 190 . PETSC_VIEWER_ASCII_INFO - prints basic information about the matrix 191 size and structure (not the matrix entries) 192 . PETSC_VIEWER_ASCII_INFO_DETAIL - prints more detailed information about 193 the matrix structure 194 195 Options Database Keys: 196 + -mat_view_info - Prints info on matrix at conclusion of MatEndAssembly() 197 . -mat_view_info_detailed - Prints more detailed info 198 . -mat_view - Prints matrix in ASCII format 199 . -mat_view_matlab - Prints matrix in Matlab format 200 . -mat_view_draw - PetscDraws nonzero structure of matrix, using MatView() and PetscDrawOpenX(). 201 . -display <name> - Sets display name (default is host) 202 . -draw_pause <sec> - Sets number of seconds to pause after display 203 . -mat_view_socket - Sends matrix to socket, can be accessed from Matlab (see users manual) 204 . -viewer_socket_machine <machine> 205 . -viewer_socket_port <port> 206 . -mat_view_binary - save matrix to file in binary format 207 - -viewer_binary_filename <name> 208 Level: beginner 209 210 Concepts: matrices^viewing 211 Concepts: matrices^plotting 212 Concepts: matrices^printing 213 214 .seealso: PetscViewerSetFormat(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), 215 PetscViewerSocketOpen(), PetscViewerBinaryOpen(), MatLoad() 216 @*/ 217 int MatView(Mat mat,PetscViewer viewer) 218 { 219 int ierr,rows,cols; 220 PetscTruth isascii; 221 char *cstr; 222 PetscViewerFormat format; 223 224 PetscFunctionBegin; 225 PetscValidHeaderSpecific(mat,MAT_COOKIE); 226 PetscValidType(mat); 227 MatPreallocated(mat); 228 if (!viewer) viewer = PETSC_VIEWER_STDOUT_(mat->comm); 229 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE); 230 PetscCheckSameComm(mat,viewer); 231 if (!mat->assembled) SETERRQ(1,"Must call MatAssemblyBegin/End() before viewing matrix"); 232 233 ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);CHKERRQ(ierr); 234 if (isascii) { 235 ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 236 if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 237 if (mat->prefix) { 238 ierr = PetscViewerASCIIPrintf(viewer,"Matrix Object:(%s)\n",mat->prefix);CHKERRQ(ierr); 239 } else { 240 ierr = PetscViewerASCIIPrintf(viewer,"Matrix Object:\n");CHKERRQ(ierr); 241 } 242 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 243 ierr = MatGetType(mat,&cstr);CHKERRQ(ierr); 244 ierr = MatGetSize(mat,&rows,&cols);CHKERRQ(ierr); 245 ierr = PetscViewerASCIIPrintf(viewer,"type=%s, rows=%d, cols=%d\n",cstr,rows,cols);CHKERRQ(ierr); 246 if (mat->ops->getinfo) { 247 MatInfo info; 248 ierr = MatGetInfo(mat,MAT_GLOBAL_SUM,&info);CHKERRQ(ierr); 249 ierr = PetscViewerASCIIPrintf(viewer,"total: nonzeros=%d, allocated nonzeros=%d\n", 250 (int)info.nz_used,(int)info.nz_allocated);CHKERRQ(ierr); 251 } 252 } 253 } 254 if (mat->ops->view) { 255 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 256 ierr = (*mat->ops->view)(mat,viewer);CHKERRQ(ierr); 257 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 258 } else if (!isascii) { 259 SETERRQ1(1,"Viewer type %s not supported",((PetscObject)viewer)->type_name); 260 } 261 if (isascii) { 262 ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 263 if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 264 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 265 } 266 } 267 PetscFunctionReturn(0); 268 } 269 270 #undef __FUNCT__ 271 #define __FUNCT__ "MatScaleSystem" 272 /*@C 273 MatScaleSystem - Scale a vector solution and right hand side to 274 match the scaling of a scaled matrix. 275 276 Collective on Mat 277 278 Input Parameter: 279 + mat - the matrix 280 . x - solution vector (or PETSC_NULL) 281 - b - right hand side vector (or PETSC_NULL) 282 283 284 Notes: 285 For AIJ, BAIJ, and BDiag matrix formats, the matrices are not 286 internally scaled, so this does nothing. For MPIROWBS it 287 permutes and diagonally scales. 288 289 The SLES methods automatically call this routine when required 290 (via PCPreSolve()) so it is rarely used directly. 291 292 Level: Developer 293 294 Concepts: matrices^scaling 295 296 .seealso: MatUseScaledForm(), MatUnScaleSystem() 297 @*/ 298 int MatScaleSystem(Mat mat,Vec x,Vec b) 299 { 300 int ierr; 301 302 PetscFunctionBegin; 303 PetscValidHeaderSpecific(mat,MAT_COOKIE); 304 PetscValidType(mat); 305 MatPreallocated(mat); 306 if (x) {PetscValidHeaderSpecific(x,VEC_COOKIE);PetscCheckSameComm(mat,x);} 307 if (b) {PetscValidHeaderSpecific(b,VEC_COOKIE);PetscCheckSameComm(mat,b);} 308 309 if (mat->ops->scalesystem) { 310 ierr = (*mat->ops->scalesystem)(mat,x,b);CHKERRQ(ierr); 311 } 312 PetscFunctionReturn(0); 313 } 314 315 #undef __FUNCT__ 316 #define __FUNCT__ "MatUnScaleSystem" 317 /*@C 318 MatUnScaleSystem - Unscales a vector solution and right hand side to 319 match the original scaling of a scaled matrix. 320 321 Collective on Mat 322 323 Input Parameter: 324 + mat - the matrix 325 . x - solution vector (or PETSC_NULL) 326 - b - right hand side vector (or PETSC_NULL) 327 328 329 Notes: 330 For AIJ, BAIJ, and BDiag matrix formats, the matrices are not 331 internally scaled, so this does nothing. For MPIROWBS it 332 permutes and diagonally scales. 333 334 The SLES methods automatically call this routine when required 335 (via PCPreSolve()) so it is rarely used directly. 336 337 Level: Developer 338 339 .seealso: MatUseScaledForm(), MatScaleSystem() 340 @*/ 341 int MatUnScaleSystem(Mat mat,Vec x,Vec b) 342 { 343 int ierr; 344 345 PetscFunctionBegin; 346 PetscValidHeaderSpecific(mat,MAT_COOKIE); 347 PetscValidType(mat); 348 MatPreallocated(mat); 349 if (x) {PetscValidHeaderSpecific(x,VEC_COOKIE);PetscCheckSameComm(mat,x);} 350 if (b) {PetscValidHeaderSpecific(b,VEC_COOKIE);PetscCheckSameComm(mat,b);} 351 if (mat->ops->unscalesystem) { 352 ierr = (*mat->ops->unscalesystem)(mat,x,b);CHKERRQ(ierr); 353 } 354 PetscFunctionReturn(0); 355 } 356 357 #undef __FUNCT__ 358 #define __FUNCT__ "MatUseScaledForm" 359 /*@C 360 MatUseScaledForm - For matrix storage formats that scale the 361 matrix (for example MPIRowBS matrices are diagonally scaled on 362 assembly) indicates matrix operations (MatMult() etc) are 363 applied using the scaled matrix. 364 365 Collective on Mat 366 367 Input Parameter: 368 + mat - the matrix 369 - scaled - PETSC_TRUE for applying the scaled, PETSC_FALSE for 370 applying the original matrix 371 372 Notes: 373 For scaled matrix formats, applying the original, unscaled matrix 374 will be slightly more expensive 375 376 Level: Developer 377 378 .seealso: MatScaleSystem(), MatUnScaleSystem() 379 @*/ 380 int MatUseScaledForm(Mat mat,PetscTruth scaled) 381 { 382 int ierr; 383 384 PetscFunctionBegin; 385 PetscValidHeaderSpecific(mat,MAT_COOKIE); 386 PetscValidType(mat); 387 MatPreallocated(mat); 388 if (mat->ops->usescaledform) { 389 ierr = (*mat->ops->usescaledform)(mat,scaled);CHKERRQ(ierr); 390 } 391 PetscFunctionReturn(0); 392 } 393 394 #undef __FUNCT__ 395 #define __FUNCT__ "MatDestroy" 396 /*@C 397 MatDestroy - Frees space taken by a matrix. 398 399 Collective on Mat 400 401 Input Parameter: 402 . A - the matrix 403 404 Level: beginner 405 406 @*/ 407 int MatDestroy(Mat A) 408 { 409 int ierr; 410 411 PetscFunctionBegin; 412 PetscValidHeaderSpecific(A,MAT_COOKIE); 413 PetscValidType(A); 414 MatPreallocated(A); 415 if (--A->refct > 0) PetscFunctionReturn(0); 416 417 /* if memory was published with AMS then destroy it */ 418 ierr = PetscObjectDepublish(A);CHKERRQ(ierr); 419 if (A->mapping) { 420 ierr = ISLocalToGlobalMappingDestroy(A->mapping);CHKERRQ(ierr); 421 } 422 if (A->bmapping) { 423 ierr = ISLocalToGlobalMappingDestroy(A->bmapping);CHKERRQ(ierr); 424 } 425 if (A->rmap) { 426 ierr = PetscMapDestroy(A->rmap);CHKERRQ(ierr); 427 } 428 if (A->cmap) { 429 ierr = PetscMapDestroy(A->cmap);CHKERRQ(ierr); 430 } 431 432 ierr = (*A->ops->destroy)(A);CHKERRQ(ierr); 433 PetscLogObjectDestroy(A); 434 PetscHeaderDestroy(A); 435 PetscFunctionReturn(0); 436 } 437 438 #undef __FUNCT__ 439 #define __FUNCT__ "MatValid" 440 /*@ 441 MatValid - Checks whether a matrix object is valid. 442 443 Collective on Mat 444 445 Input Parameter: 446 . m - the matrix to check 447 448 Output Parameter: 449 flg - flag indicating matrix status, either 450 PETSC_TRUE if matrix is valid, or PETSC_FALSE otherwise. 451 452 Level: developer 453 454 Concepts: matrices^validity 455 @*/ 456 int MatValid(Mat m,PetscTruth *flg) 457 { 458 PetscFunctionBegin; 459 PetscValidIntPointer(flg); 460 if (!m) *flg = PETSC_FALSE; 461 else if (m->cookie != MAT_COOKIE) *flg = PETSC_FALSE; 462 else *flg = PETSC_TRUE; 463 PetscFunctionReturn(0); 464 } 465 466 #undef __FUNCT__ 467 #define __FUNCT__ "MatSetValues" 468 /*@ 469 MatSetValues - Inserts or adds a block of values into a matrix. 470 These values may be cached, so MatAssemblyBegin() and MatAssemblyEnd() 471 MUST be called after all calls to MatSetValues() have been completed. 472 473 Not Collective 474 475 Input Parameters: 476 + mat - the matrix 477 . v - a logically two-dimensional array of values 478 . m, idxm - the number of rows and their global indices 479 . n, idxn - the number of columns and their global indices 480 - addv - either ADD_VALUES or INSERT_VALUES, where 481 ADD_VALUES adds values to any existing entries, and 482 INSERT_VALUES replaces existing entries with new values 483 484 Notes: 485 By default the values, v, are row-oriented and unsorted. 486 See MatSetOption() for other options. 487 488 Calls to MatSetValues() with the INSERT_VALUES and ADD_VALUES 489 options cannot be mixed without intervening calls to the assembly 490 routines. 491 492 MatSetValues() uses 0-based row and column numbers in Fortran 493 as well as in C. 494 495 Negative indices may be passed in idxm and idxn, these rows and columns are 496 simply ignored. This allows easily inserting element stiffness matrices 497 with homogeneous Dirchlet boundary conditions that you don't want represented 498 in the matrix. 499 500 Efficiency Alert: 501 The routine MatSetValuesBlocked() may offer much better efficiency 502 for users of block sparse formats (MATSEQBAIJ and MATMPIBAIJ). 503 504 Level: beginner 505 506 Concepts: matrices^putting entries in 507 508 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal() 509 @*/ 510 int MatSetValues(Mat mat,int m,int *idxm,int n,int *idxn,PetscScalar *v,InsertMode addv) 511 { 512 int ierr; 513 514 PetscFunctionBegin; 515 if (!m || !n) PetscFunctionReturn(0); /* no values to insert */ 516 PetscValidHeaderSpecific(mat,MAT_COOKIE); 517 PetscValidType(mat); 518 MatPreallocated(mat); 519 PetscValidIntPointer(idxm); 520 PetscValidIntPointer(idxn); 521 PetscValidScalarPointer(v); 522 if (mat->insertmode == NOT_SET_VALUES) { 523 mat->insertmode = addv; 524 } 525 #if defined(PETSC_USE_BOPT_g) 526 else if (mat->insertmode != addv) { 527 SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Cannot mix add values and insert values"); 528 } 529 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 530 #endif 531 532 if (mat->assembled) { 533 mat->was_assembled = PETSC_TRUE; 534 mat->assembled = PETSC_FALSE; 535 } 536 ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 537 if (!mat->ops->setvalues) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 538 ierr = (*mat->ops->setvalues)(mat,m,idxm,n,idxn,v,addv);CHKERRQ(ierr); 539 ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 540 PetscFunctionReturn(0); 541 } 542 543 #undef __FUNCT__ 544 #define __FUNCT__ "MatSetValuesStencil" 545 /*@C 546 MatSetValuesStencil - Inserts or adds a block of values into a matrix. 547 Using structured grid indexing 548 549 Not Collective 550 551 Input Parameters: 552 + mat - the matrix 553 . v - a logically two-dimensional array of values 554 . m - number of rows being entered 555 . idxm - grid coordinates (and component number when dof > 1) for matrix rows being entered 556 . n - number of columns being entered 557 . idxn - grid coordinates (and component number when dof > 1) for matrix columns being entered 558 - addv - either ADD_VALUES or INSERT_VALUES, where 559 ADD_VALUES adds values to any existing entries, and 560 INSERT_VALUES replaces existing entries with new values 561 562 Notes: 563 By default the values, v, are row-oriented and unsorted. 564 See MatSetOption() for other options. 565 566 Calls to MatSetValuesStencil() with the INSERT_VALUES and ADD_VALUES 567 options cannot be mixed without intervening calls to the assembly 568 routines. 569 570 The grid coordinates are across the entire grid, not just the local portion 571 572 MatSetValuesStencil() uses 0-based row and column numbers in Fortran 573 as well as in C. 574 575 In order to use this routine you must either obtain the matrix with DAGetMatrix() 576 or call MatSetLocalToGlobalMapping() and MatSetStencil() first. 577 578 In Fortran idxm and idxn should be declared as 579 $ MatStencil idxm(4,m),idxn(4,n) 580 and the values inserted using 581 $ idxm(MatStencil_i,1) = i 582 $ idxm(MatStencil_j,1) = j 583 $ idxm(MatStencil_k,1) = k 584 $ idxm(MatStencil_c,1) = c 585 etc 586 587 Negative indices may be passed in idxm and idxn, these rows and columns are 588 simply ignored. This allows easily inserting element stiffness matrices 589 with homogeneous Dirchlet boundary conditions that you don't want represented 590 in the matrix. 591 592 Inspired by the structured grid interface to the HYPRE package 593 (http://www.llnl.gov/CASC/hypre) 594 595 Efficiency Alert: 596 The routine MatSetValuesBlockedStencil() may offer much better efficiency 597 for users of block sparse formats (MATSEQBAIJ and MATMPIBAIJ). 598 599 Level: beginner 600 601 Concepts: matrices^putting entries in 602 603 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal() 604 MatSetValues(), MatSetValuesBlockedStencil(), MatSetStencil(), DAGetMatrix() 605 @*/ 606 int MatSetValuesStencil(Mat mat,int m,MatStencil *idxm,int n,MatStencil *idxn,PetscScalar *v,InsertMode addv) 607 { 608 int j,i,ierr,jdxm[128],jdxn[256],dim = mat->stencil.dim,*dims = mat->stencil.dims+1,tmp; 609 int *starts = mat->stencil.starts,*dxm = (int*)idxm,*dxn = (int*)idxn,sdim = dim - (1 - (int)mat->stencil.noc); 610 611 PetscFunctionBegin; 612 if (!m || !n) PetscFunctionReturn(0); /* no values to insert */ 613 PetscValidHeaderSpecific(mat,MAT_COOKIE); 614 PetscValidType(mat); 615 PetscValidIntPointer(idxm); 616 PetscValidIntPointer(idxn); 617 PetscValidScalarPointer(v); 618 619 if (m > 128) SETERRQ1(1,"Can only set 128 rows at a time; trying to set %d",m); 620 if (n > 128) SETERRQ1(1,"Can only set 256 columns at a time; trying to set %d",n); 621 622 for (i=0; i<m; i++) { 623 for (j=0; j<3-sdim; j++) dxm++; 624 tmp = *dxm++ - starts[0]; 625 for (j=0; j<dim-1; j++) { 626 tmp = tmp*dims[j] + *dxm++ - starts[j+1]; 627 } 628 if (mat->stencil.noc) dxm++; 629 jdxm[i] = tmp; 630 } 631 for (i=0; i<n; i++) { 632 for (j=0; j<3-sdim; j++) dxn++; 633 tmp = *dxn++ - starts[0]; 634 for (j=0; j<dim-1; j++) { 635 tmp = tmp*dims[j] + *dxn++ - starts[j+1]; 636 } 637 if (mat->stencil.noc) dxn++; 638 jdxn[i] = tmp; 639 } 640 ierr = MatSetValuesLocal(mat,m,jdxm,n,jdxn,v,addv);CHKERRQ(ierr); 641 PetscFunctionReturn(0); 642 } 643 644 #undef __FUNCT__ 645 #define __FUNCT__ "MatSetStencil" 646 /*@ 647 MatSetStencil - Sets the grid information for setting values into a matrix via 648 MatSetStencil() 649 650 Not Collective 651 652 Input Parameters: 653 + mat - the matrix 654 . dim - dimension of the grid 1,2, or 3 655 . dims - number of grid points in x, y, and z direction, including ghost points on your processor 656 . starts - starting point of ghost nodes on your processor in x, y, and z direction 657 - dof - number of degrees of freedom per node 658 659 660 Inspired by the structured grid interface to the HYPRE package 661 (www.llnl.gov/CASC/hyper) 662 663 Level: beginner 664 665 Concepts: matrices^putting entries in 666 667 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal() 668 MatSetValues(), MatSetValuesBlockedStencil(), MatSetValuesStencil() 669 @*/ 670 int MatSetStencil(Mat mat,int dim,int *dims,int *starts,int dof) 671 { 672 int i; 673 674 PetscFunctionBegin; 675 PetscValidHeaderSpecific(mat,MAT_COOKIE); 676 PetscValidIntPointer(dims); 677 PetscValidIntPointer(starts); 678 679 mat->stencil.dim = dim + (dof > 1); 680 for (i=0; i<dim; i++) { 681 mat->stencil.dims[i] = dims[dim-i-1]; /* copy the values in backwards */ 682 mat->stencil.starts[i] = starts[dim-i-1]; 683 } 684 mat->stencil.dims[dim] = dof; 685 mat->stencil.starts[dim] = 0; 686 mat->stencil.noc = (PetscTruth)(dof == 1); 687 PetscFunctionReturn(0); 688 } 689 690 #undef __FUNCT__ 691 #define __FUNCT__ "MatSetValuesBlocked" 692 /*@ 693 MatSetValuesBlocked - Inserts or adds a block of values into a matrix. 694 695 Not Collective 696 697 Input Parameters: 698 + mat - the matrix 699 . v - a logically two-dimensional array of values 700 . m, idxm - the number of block rows and their global block indices 701 . n, idxn - the number of block columns and their global block indices 702 - addv - either ADD_VALUES or INSERT_VALUES, where 703 ADD_VALUES adds values to any existing entries, and 704 INSERT_VALUES replaces existing entries with new values 705 706 Notes: 707 By default the values, v, are row-oriented and unsorted. So the layout of 708 v is the same as for MatSetValues(). See MatSetOption() for other options. 709 710 Calls to MatSetValuesBlocked() with the INSERT_VALUES and ADD_VALUES 711 options cannot be mixed without intervening calls to the assembly 712 routines. 713 714 MatSetValuesBlocked() uses 0-based row and column numbers in Fortran 715 as well as in C. 716 717 Negative indices may be passed in idxm and idxn, these rows and columns are 718 simply ignored. This allows easily inserting element stiffness matrices 719 with homogeneous Dirchlet boundary conditions that you don't want represented 720 in the matrix. 721 722 Each time an entry is set within a sparse matrix via MatSetValues(), 723 internal searching must be done to determine where to place the the 724 data in the matrix storage space. By instead inserting blocks of 725 entries via MatSetValuesBlocked(), the overhead of matrix assembly is 726 reduced. 727 728 Restrictions: 729 MatSetValuesBlocked() is currently supported only for the block AIJ 730 matrix format (MATSEQBAIJ and MATMPIBAIJ, which are created via 731 MatCreateSeqBAIJ() and MatCreateMPIBAIJ()). 732 733 Level: intermediate 734 735 Concepts: matrices^putting entries in blocked 736 737 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValues(), MatSetValuesBlockedLocal() 738 @*/ 739 int MatSetValuesBlocked(Mat mat,int m,int *idxm,int n,int *idxn,PetscScalar *v,InsertMode addv) 740 { 741 int ierr; 742 743 PetscFunctionBegin; 744 if (!m || !n) PetscFunctionReturn(0); /* no values to insert */ 745 PetscValidHeaderSpecific(mat,MAT_COOKIE); 746 PetscValidType(mat); 747 MatPreallocated(mat); 748 PetscValidIntPointer(idxm); 749 PetscValidIntPointer(idxn); 750 PetscValidScalarPointer(v); 751 if (mat->insertmode == NOT_SET_VALUES) { 752 mat->insertmode = addv; 753 } 754 #if defined(PETSC_USE_BOPT_g) 755 else if (mat->insertmode != addv) { 756 SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Cannot mix add values and insert values"); 757 } 758 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 759 #endif 760 761 if (mat->assembled) { 762 mat->was_assembled = PETSC_TRUE; 763 mat->assembled = PETSC_FALSE; 764 } 765 ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 766 if (!mat->ops->setvaluesblocked) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 767 ierr = (*mat->ops->setvaluesblocked)(mat,m,idxm,n,idxn,v,addv);CHKERRQ(ierr); 768 ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 769 PetscFunctionReturn(0); 770 } 771 772 /*MC 773 MatSetValue - Set a single entry into a matrix. 774 775 Synopsis: 776 int MatSetValue(Mat m,int row,int col,PetscScalar value,InsertMode mode); 777 778 Not collective 779 780 Input Parameters: 781 + m - the matrix 782 . row - the row location of the entry 783 . col - the column location of the entry 784 . value - the value to insert 785 - mode - either INSERT_VALUES or ADD_VALUES 786 787 Notes: 788 For efficiency one should use MatSetValues() and set several or many 789 values simultaneously if possible. 790 791 Note that VecSetValue() does NOT return an error code (since this 792 is checked internally). 793 794 Level: beginner 795 796 .seealso: MatSetValues() 797 M*/ 798 799 #undef __FUNCT__ 800 #define __FUNCT__ "MatGetValues" 801 /*@ 802 MatGetValues - Gets a block of values from a matrix. 803 804 Not Collective; currently only returns a local block 805 806 Input Parameters: 807 + mat - the matrix 808 . v - a logically two-dimensional array for storing the values 809 . m, idxm - the number of rows and their global indices 810 - n, idxn - the number of columns and their global indices 811 812 Notes: 813 The user must allocate space (m*n PetscScalars) for the values, v. 814 The values, v, are then returned in a row-oriented format, 815 analogous to that used by default in MatSetValues(). 816 817 MatGetValues() uses 0-based row and column numbers in 818 Fortran as well as in C. 819 820 MatGetValues() requires that the matrix has been assembled 821 with MatAssemblyBegin()/MatAssemblyEnd(). Thus, calls to 822 MatSetValues() and MatGetValues() CANNOT be made in succession 823 without intermediate matrix assembly. 824 825 Level: advanced 826 827 Concepts: matrices^accessing values 828 829 .seealso: MatGetRow(), MatGetSubmatrices(), MatSetValues() 830 @*/ 831 int MatGetValues(Mat mat,int m,int *idxm,int n,int *idxn,PetscScalar *v) 832 { 833 int ierr; 834 835 PetscFunctionBegin; 836 PetscValidHeaderSpecific(mat,MAT_COOKIE); 837 PetscValidType(mat); 838 MatPreallocated(mat); 839 PetscValidIntPointer(idxm); 840 PetscValidIntPointer(idxn); 841 PetscValidScalarPointer(v); 842 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 843 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 844 if (!mat->ops->getvalues) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 845 846 ierr = PetscLogEventBegin(MAT_GetValues,mat,0,0,0);CHKERRQ(ierr); 847 ierr = (*mat->ops->getvalues)(mat,m,idxm,n,idxn,v);CHKERRQ(ierr); 848 ierr = PetscLogEventEnd(MAT_GetValues,mat,0,0,0);CHKERRQ(ierr); 849 PetscFunctionReturn(0); 850 } 851 852 #undef __FUNCT__ 853 #define __FUNCT__ "MatSetLocalToGlobalMapping" 854 /*@ 855 MatSetLocalToGlobalMapping - Sets a local-to-global numbering for use by 856 the routine MatSetValuesLocal() to allow users to insert matrix entries 857 using a local (per-processor) numbering. 858 859 Not Collective 860 861 Input Parameters: 862 + x - the matrix 863 - mapping - mapping created with ISLocalToGlobalMappingCreate() 864 or ISLocalToGlobalMappingCreateIS() 865 866 Level: intermediate 867 868 Concepts: matrices^local to global mapping 869 Concepts: local to global mapping^for matrices 870 871 .seealso: MatAssemblyBegin(), MatAssemblyEnd(), MatSetValues(), MatSetValuesLocal() 872 @*/ 873 int MatSetLocalToGlobalMapping(Mat x,ISLocalToGlobalMapping mapping) 874 { 875 int ierr; 876 PetscFunctionBegin; 877 PetscValidHeaderSpecific(x,MAT_COOKIE); 878 PetscValidType(x); 879 MatPreallocated(x); 880 PetscValidHeaderSpecific(mapping,IS_LTOGM_COOKIE); 881 if (x->mapping) { 882 SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Mapping already set for matrix"); 883 } 884 885 if (x->ops->setlocaltoglobalmapping) { 886 ierr = (*x->ops->setlocaltoglobalmapping)(x,mapping);CHKERRQ(ierr); 887 } else { 888 x->mapping = mapping; 889 ierr = PetscObjectReference((PetscObject)mapping);CHKERRQ(ierr); 890 } 891 PetscFunctionReturn(0); 892 } 893 894 #undef __FUNCT__ 895 #define __FUNCT__ "MatSetLocalToGlobalMappingBlock" 896 /*@ 897 MatSetLocalToGlobalMappingBlock - Sets a local-to-global numbering for use 898 by the routine MatSetValuesBlockedLocal() to allow users to insert matrix 899 entries using a local (per-processor) numbering. 900 901 Not Collective 902 903 Input Parameters: 904 + x - the matrix 905 - mapping - mapping created with ISLocalToGlobalMappingCreate() or 906 ISLocalToGlobalMappingCreateIS() 907 908 Level: intermediate 909 910 Concepts: matrices^local to global mapping blocked 911 Concepts: local to global mapping^for matrices, blocked 912 913 .seealso: MatAssemblyBegin(), MatAssemblyEnd(), MatSetValues(), MatSetValuesBlockedLocal(), 914 MatSetValuesBlocked(), MatSetValuesLocal() 915 @*/ 916 int MatSetLocalToGlobalMappingBlock(Mat x,ISLocalToGlobalMapping mapping) 917 { 918 int ierr; 919 PetscFunctionBegin; 920 PetscValidHeaderSpecific(x,MAT_COOKIE); 921 PetscValidType(x); 922 MatPreallocated(x); 923 PetscValidHeaderSpecific(mapping,IS_LTOGM_COOKIE); 924 if (x->bmapping) { 925 SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Mapping already set for matrix"); 926 } 927 928 x->bmapping = mapping; 929 ierr = PetscObjectReference((PetscObject)mapping);CHKERRQ(ierr); 930 PetscFunctionReturn(0); 931 } 932 933 #undef __FUNCT__ 934 #define __FUNCT__ "MatSetValuesLocal" 935 /*@ 936 MatSetValuesLocal - Inserts or adds values into certain locations of a matrix, 937 using a local ordering of the nodes. 938 939 Not Collective 940 941 Input Parameters: 942 + x - the matrix 943 . nrow, irow - number of rows and their local indices 944 . ncol, icol - number of columns and their local indices 945 . y - a logically two-dimensional array of values 946 - addv - either INSERT_VALUES or ADD_VALUES, where 947 ADD_VALUES adds values to any existing entries, and 948 INSERT_VALUES replaces existing entries with new values 949 950 Notes: 951 Before calling MatSetValuesLocal(), the user must first set the 952 local-to-global mapping by calling MatSetLocalToGlobalMapping(). 953 954 Calls to MatSetValuesLocal() with the INSERT_VALUES and ADD_VALUES 955 options cannot be mixed without intervening calls to the assembly 956 routines. 957 958 These values may be cached, so MatAssemblyBegin() and MatAssemblyEnd() 959 MUST be called after all calls to MatSetValuesLocal() have been completed. 960 961 Level: intermediate 962 963 Concepts: matrices^putting entries in with local numbering 964 965 .seealso: MatAssemblyBegin(), MatAssemblyEnd(), MatSetValues(), MatSetLocalToGlobalMapping(), 966 MatSetValueLocal() 967 @*/ 968 int MatSetValuesLocal(Mat mat,int nrow,int *irow,int ncol,int *icol,PetscScalar *y,InsertMode addv) 969 { 970 int ierr,irowm[2048],icolm[2048]; 971 972 PetscFunctionBegin; 973 PetscValidHeaderSpecific(mat,MAT_COOKIE); 974 PetscValidType(mat); 975 MatPreallocated(mat); 976 PetscValidIntPointer(irow); 977 PetscValidIntPointer(icol); 978 PetscValidScalarPointer(y); 979 980 if (mat->insertmode == NOT_SET_VALUES) { 981 mat->insertmode = addv; 982 } 983 #if defined(PETSC_USE_BOPT_g) 984 else if (mat->insertmode != addv) { 985 SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Cannot mix add values and insert values"); 986 } 987 if (!mat->ops->setvalueslocal && (nrow > 2048 || ncol > 2048)) { 988 SETERRQ2(PETSC_ERR_SUP,"Number column/row indices must be <= 2048: are %d %d",nrow,ncol); 989 } 990 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 991 #endif 992 993 if (mat->assembled) { 994 mat->was_assembled = PETSC_TRUE; 995 mat->assembled = PETSC_FALSE; 996 } 997 ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 998 if (!mat->ops->setvalueslocal) { 999 ierr = ISLocalToGlobalMappingApply(mat->mapping,nrow,irow,irowm);CHKERRQ(ierr); 1000 ierr = ISLocalToGlobalMappingApply(mat->mapping,ncol,icol,icolm);CHKERRQ(ierr); 1001 ierr = (*mat->ops->setvalues)(mat,nrow,irowm,ncol,icolm,y,addv);CHKERRQ(ierr); 1002 } else { 1003 ierr = (*mat->ops->setvalueslocal)(mat,nrow,irow,ncol,icol,y,addv);CHKERRQ(ierr); 1004 } 1005 ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 1006 PetscFunctionReturn(0); 1007 } 1008 1009 #undef __FUNCT__ 1010 #define __FUNCT__ "MatSetValuesBlockedLocal" 1011 /*@ 1012 MatSetValuesBlockedLocal - Inserts or adds values into certain locations of a matrix, 1013 using a local ordering of the nodes a block at a time. 1014 1015 Not Collective 1016 1017 Input Parameters: 1018 + x - the matrix 1019 . nrow, irow - number of rows and their local indices 1020 . ncol, icol - number of columns and their local indices 1021 . y - a logically two-dimensional array of values 1022 - addv - either INSERT_VALUES or ADD_VALUES, where 1023 ADD_VALUES adds values to any existing entries, and 1024 INSERT_VALUES replaces existing entries with new values 1025 1026 Notes: 1027 Before calling MatSetValuesBlockedLocal(), the user must first set the 1028 local-to-global mapping by calling MatSetLocalToGlobalMappingBlock(), 1029 where the mapping MUST be set for matrix blocks, not for matrix elements. 1030 1031 Calls to MatSetValuesBlockedLocal() with the INSERT_VALUES and ADD_VALUES 1032 options cannot be mixed without intervening calls to the assembly 1033 routines. 1034 1035 These values may be cached, so MatAssemblyBegin() and MatAssemblyEnd() 1036 MUST be called after all calls to MatSetValuesBlockedLocal() have been completed. 1037 1038 Level: intermediate 1039 1040 Concepts: matrices^putting blocked values in with local numbering 1041 1042 .seealso: MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesLocal(), MatSetLocalToGlobalMappingBlock(), MatSetValuesBlocked() 1043 @*/ 1044 int MatSetValuesBlockedLocal(Mat mat,int nrow,int *irow,int ncol,int *icol,PetscScalar *y,InsertMode addv) 1045 { 1046 int ierr,irowm[2048],icolm[2048]; 1047 1048 PetscFunctionBegin; 1049 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1050 PetscValidType(mat); 1051 MatPreallocated(mat); 1052 PetscValidIntPointer(irow); 1053 PetscValidIntPointer(icol); 1054 PetscValidScalarPointer(y); 1055 if (mat->insertmode == NOT_SET_VALUES) { 1056 mat->insertmode = addv; 1057 } 1058 #if defined(PETSC_USE_BOPT_g) 1059 else if (mat->insertmode != addv) { 1060 SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Cannot mix add values and insert values"); 1061 } 1062 if (!mat->bmapping) { 1063 SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Local to global never set with MatSetLocalToGlobalMappingBlock()"); 1064 } 1065 if (nrow > 2048 || ncol > 2048) { 1066 SETERRQ2(PETSC_ERR_SUP,"Number column/row indices must be <= 2048: are %d %d",nrow,ncol); 1067 } 1068 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1069 #endif 1070 1071 if (mat->assembled) { 1072 mat->was_assembled = PETSC_TRUE; 1073 mat->assembled = PETSC_FALSE; 1074 } 1075 ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 1076 ierr = ISLocalToGlobalMappingApply(mat->bmapping,nrow,irow,irowm);CHKERRQ(ierr); 1077 ierr = ISLocalToGlobalMappingApply(mat->bmapping,ncol,icol,icolm);CHKERRQ(ierr); 1078 ierr = (*mat->ops->setvaluesblocked)(mat,nrow,irowm,ncol,icolm,y,addv);CHKERRQ(ierr); 1079 ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 1080 PetscFunctionReturn(0); 1081 } 1082 1083 /* --------------------------------------------------------*/ 1084 #undef __FUNCT__ 1085 #define __FUNCT__ "MatMult" 1086 /*@ 1087 MatMult - Computes the matrix-vector product, y = Ax. 1088 1089 Collective on Mat and Vec 1090 1091 Input Parameters: 1092 + mat - the matrix 1093 - x - the vector to be multilplied 1094 1095 Output Parameters: 1096 . y - the result 1097 1098 Notes: 1099 The vectors x and y cannot be the same. I.e., one cannot 1100 call MatMult(A,y,y). 1101 1102 Level: beginner 1103 1104 Concepts: matrix-vector product 1105 1106 .seealso: MatMultTranspose(), MatMultAdd(), MatMultTransposeAdd() 1107 @*/ 1108 int MatMult(Mat mat,Vec x,Vec y) 1109 { 1110 int ierr; 1111 1112 PetscFunctionBegin; 1113 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1114 PetscValidType(mat); 1115 MatPreallocated(mat); 1116 PetscValidHeaderSpecific(x,VEC_COOKIE); 1117 PetscValidHeaderSpecific(y,VEC_COOKIE); 1118 1119 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1120 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1121 if (x == y) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"x and y must be different vectors"); 1122 #ifndef PETSC_HAVE_CONSTRAINTS 1123 if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N); 1124 if (mat->M != y->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %d %d",mat->M,y->N); 1125 if (mat->m != y->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: local dim %d %d",mat->m,y->n); 1126 #endif 1127 1128 if (mat->nullsp) { 1129 ierr = MatNullSpaceRemove(mat->nullsp,x,&x);CHKERRQ(ierr); 1130 } 1131 1132 ierr = PetscLogEventBegin(MAT_Mult,mat,x,y,0);CHKERRQ(ierr); 1133 ierr = (*mat->ops->mult)(mat,x,y);CHKERRQ(ierr); 1134 ierr = PetscLogEventEnd(MAT_Mult,mat,x,y,0);CHKERRQ(ierr); 1135 1136 if (mat->nullsp) { 1137 ierr = MatNullSpaceRemove(mat->nullsp,y,PETSC_NULL);CHKERRQ(ierr); 1138 } 1139 PetscFunctionReturn(0); 1140 } 1141 1142 #undef __FUNCT__ 1143 #define __FUNCT__ "MatMultTranspose" 1144 /*@ 1145 MatMultTranspose - Computes matrix transpose times a vector. 1146 1147 Collective on Mat and Vec 1148 1149 Input Parameters: 1150 + mat - the matrix 1151 - x - the vector to be multilplied 1152 1153 Output Parameters: 1154 . y - the result 1155 1156 Notes: 1157 The vectors x and y cannot be the same. I.e., one cannot 1158 call MatMultTranspose(A,y,y). 1159 1160 Level: beginner 1161 1162 Concepts: matrix vector product^transpose 1163 1164 .seealso: MatMult(), MatMultAdd(), MatMultTransposeAdd() 1165 @*/ 1166 int MatMultTranspose(Mat mat,Vec x,Vec y) 1167 { 1168 int ierr; 1169 PetscTruth flg1, flg2; 1170 1171 PetscFunctionBegin; 1172 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1173 PetscValidType(mat); 1174 MatPreallocated(mat); 1175 PetscValidHeaderSpecific(x,VEC_COOKIE); 1176 PetscValidHeaderSpecific(y,VEC_COOKIE); 1177 1178 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1179 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1180 if (x == y) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"x and y must be different vectors"); 1181 #ifndef PETSC_HAVE_CONSTRAINTS 1182 if (mat->M != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->M,x->N); 1183 if (mat->N != y->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %d %d",mat->N,y->N); 1184 #endif 1185 1186 if (!mat->ops->multtranspose) SETERRQ(PETSC_ERR_SUP, "Operation not supported"); 1187 ierr = PetscLogEventBegin(MAT_MultTranspose,mat,x,y,0);CHKERRQ(ierr); 1188 if (!mat->ops->multtranspose) SETERRQ(PETSC_ERR_SUP,"This matrix type does not have a multiply tranpose defined"); 1189 1190 ierr = PetscTypeCompare((PetscObject)mat,MATSEQSBAIJ,&flg1); 1191 ierr = PetscTypeCompare((PetscObject)mat,MATMPISBAIJ,&flg2); 1192 if (flg1 || flg2) { /* mat is in sbaij format */ 1193 ierr = (*mat->ops->mult)(mat,x,y);CHKERRQ(ierr); 1194 } else { 1195 ierr = (*mat->ops->multtranspose)(mat,x,y);CHKERRQ(ierr); 1196 } 1197 ierr = PetscLogEventEnd(MAT_MultTranspose,mat,x,y,0);CHKERRQ(ierr); 1198 PetscFunctionReturn(0); 1199 } 1200 1201 #undef __FUNCT__ 1202 #define __FUNCT__ "MatMultAdd" 1203 /*@ 1204 MatMultAdd - Computes v3 = v2 + A * v1. 1205 1206 Collective on Mat and Vec 1207 1208 Input Parameters: 1209 + mat - the matrix 1210 - v1, v2 - the vectors 1211 1212 Output Parameters: 1213 . v3 - the result 1214 1215 Notes: 1216 The vectors v1 and v3 cannot be the same. I.e., one cannot 1217 call MatMultAdd(A,v1,v2,v1). 1218 1219 Level: beginner 1220 1221 Concepts: matrix vector product^addition 1222 1223 .seealso: MatMultTranspose(), MatMult(), MatMultTransposeAdd() 1224 @*/ 1225 int MatMultAdd(Mat mat,Vec v1,Vec v2,Vec v3) 1226 { 1227 int ierr; 1228 1229 PetscFunctionBegin; 1230 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1231 PetscValidType(mat); 1232 MatPreallocated(mat); 1233 PetscValidHeaderSpecific(v1,VEC_COOKIE); 1234 PetscValidHeaderSpecific(v2,VEC_COOKIE); 1235 PetscValidHeaderSpecific(v3,VEC_COOKIE); 1236 1237 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1238 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1239 if (mat->N != v1->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v1: global dim %d %d",mat->N,v1->N); 1240 if (mat->M != v2->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v2: global dim %d %d",mat->M,v2->N); 1241 if (mat->M != v3->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v3: global dim %d %d",mat->M,v3->N); 1242 if (mat->m != v3->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v3: local dim %d %d",mat->m,v3->n); 1243 if (mat->m != v2->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v2: local dim %d %d",mat->m,v2->n); 1244 if (v1 == v3) SETERRQ(PETSC_ERR_ARG_IDN,"v1 and v3 must be different vectors"); 1245 1246 ierr = PetscLogEventBegin(MAT_MultAdd,mat,v1,v2,v3);CHKERRQ(ierr); 1247 ierr = (*mat->ops->multadd)(mat,v1,v2,v3);CHKERRQ(ierr); 1248 ierr = PetscLogEventEnd(MAT_MultAdd,mat,v1,v2,v3);CHKERRQ(ierr); 1249 PetscFunctionReturn(0); 1250 } 1251 1252 #undef __FUNCT__ 1253 #define __FUNCT__ "MatMultTransposeAdd" 1254 /*@ 1255 MatMultTransposeAdd - Computes v3 = v2 + A' * v1. 1256 1257 Collective on Mat and Vec 1258 1259 Input Parameters: 1260 + mat - the matrix 1261 - v1, v2 - the vectors 1262 1263 Output Parameters: 1264 . v3 - the result 1265 1266 Notes: 1267 The vectors v1 and v3 cannot be the same. I.e., one cannot 1268 call MatMultTransposeAdd(A,v1,v2,v1). 1269 1270 Level: beginner 1271 1272 Concepts: matrix vector product^transpose and addition 1273 1274 .seealso: MatMultTranspose(), MatMultAdd(), MatMult() 1275 @*/ 1276 int MatMultTransposeAdd(Mat mat,Vec v1,Vec v2,Vec v3) 1277 { 1278 int ierr; 1279 1280 PetscFunctionBegin; 1281 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1282 PetscValidType(mat); 1283 MatPreallocated(mat); 1284 PetscValidHeaderSpecific(v1,VEC_COOKIE); 1285 PetscValidHeaderSpecific(v2,VEC_COOKIE); 1286 PetscValidHeaderSpecific(v3,VEC_COOKIE); 1287 1288 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1289 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1290 if (!mat->ops->multtransposeadd) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 1291 if (v1 == v3) SETERRQ(PETSC_ERR_ARG_IDN,"v1 and v3 must be different vectors"); 1292 if (mat->M != v1->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v1: global dim %d %d",mat->M,v1->N); 1293 if (mat->N != v2->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v2: global dim %d %d",mat->N,v2->N); 1294 if (mat->N != v3->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v3: global dim %d %d",mat->N,v3->N); 1295 1296 ierr = PetscLogEventBegin(MAT_MultTransposeAdd,mat,v1,v2,v3);CHKERRQ(ierr); 1297 ierr = (*mat->ops->multtransposeadd)(mat,v1,v2,v3);CHKERRQ(ierr); 1298 ierr = PetscLogEventEnd(MAT_MultTransposeAdd,mat,v1,v2,v3);CHKERRQ(ierr); 1299 PetscFunctionReturn(0); 1300 } 1301 1302 #undef __FUNCT__ 1303 #define __FUNCT__ "MatMultConstrained" 1304 /*@ 1305 MatMultConstrained - The inner multiplication routine for a 1306 constrained matrix P^T A P. 1307 1308 Collective on Mat and Vec 1309 1310 Input Parameters: 1311 + mat - the matrix 1312 - x - the vector to be multilplied 1313 1314 Output Parameters: 1315 . y - the result 1316 1317 Notes: 1318 The vectors x and y cannot be the same. I.e., one cannot 1319 call MatMult(A,y,y). 1320 1321 Level: beginner 1322 1323 .keywords: matrix, multiply, matrix-vector product, constraint 1324 .seealso: MatMult(), MatMultTrans(), MatMultAdd(), MatMultTransAdd() 1325 @*/ 1326 int MatMultConstrained(Mat mat,Vec x,Vec y) 1327 { 1328 int ierr; 1329 1330 PetscFunctionBegin; 1331 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1332 PetscValidHeaderSpecific(x,VEC_COOKIE);PetscValidHeaderSpecific(y,VEC_COOKIE); 1333 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1334 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1335 if (x == y) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"x and y must be different vectors"); 1336 if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N); 1337 if (mat->M != y->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %d %d",mat->M,y->N); 1338 if (mat->m != y->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: local dim %d %d",mat->m,y->n); 1339 1340 ierr = PetscLogEventBegin(MAT_MultConstrained,mat,x,y,0);CHKERRQ(ierr); 1341 ierr = (*mat->ops->multconstrained)(mat,x,y); CHKERRQ(ierr); 1342 ierr = PetscLogEventEnd(MAT_MultConstrained,mat,x,y,0);CHKERRQ(ierr); 1343 1344 PetscFunctionReturn(0); 1345 } 1346 1347 #undef __FUNCT__ 1348 #define __FUNCT__ "MatMultTransposeConstrained" 1349 /*@ 1350 MatMultTransposeConstrained - The inner multiplication routine for a 1351 constrained matrix P^T A^T P. 1352 1353 Collective on Mat and Vec 1354 1355 Input Parameters: 1356 + mat - the matrix 1357 - x - the vector to be multilplied 1358 1359 Output Parameters: 1360 . y - the result 1361 1362 Notes: 1363 The vectors x and y cannot be the same. I.e., one cannot 1364 call MatMult(A,y,y). 1365 1366 Level: beginner 1367 1368 .keywords: matrix, multiply, matrix-vector product, constraint 1369 .seealso: MatMult(), MatMultTrans(), MatMultAdd(), MatMultTransAdd() 1370 @*/ 1371 int MatMultTransposeConstrained(Mat mat,Vec x,Vec y) 1372 { 1373 int ierr; 1374 1375 PetscFunctionBegin; 1376 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1377 PetscValidHeaderSpecific(x,VEC_COOKIE);PetscValidHeaderSpecific(y,VEC_COOKIE); 1378 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1379 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1380 if (x == y) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"x and y must be different vectors"); 1381 if (mat->M != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N); 1382 if (mat->N != y->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %d %d",mat->M,y->N); 1383 1384 ierr = PetscLogEventBegin(MAT_MultConstrained,mat,x,y,0);CHKERRQ(ierr); 1385 ierr = (*mat->ops->multtransposeconstrained)(mat,x,y);CHKERRQ(ierr); 1386 ierr = PetscLogEventEnd(MAT_MultConstrained,mat,x,y,0);CHKERRQ(ierr); 1387 1388 PetscFunctionReturn(0); 1389 } 1390 /* ------------------------------------------------------------*/ 1391 #undef __FUNCT__ 1392 #define __FUNCT__ "MatGetInfo" 1393 /*@C 1394 MatGetInfo - Returns information about matrix storage (number of 1395 nonzeros, memory, etc.). 1396 1397 Collective on Mat if MAT_GLOBAL_MAX or MAT_GLOBAL_SUM is used 1398 as the flag 1399 1400 Input Parameters: 1401 . mat - the matrix 1402 1403 Output Parameters: 1404 + flag - flag indicating the type of parameters to be returned 1405 (MAT_LOCAL - local matrix, MAT_GLOBAL_MAX - maximum over all processors, 1406 MAT_GLOBAL_SUM - sum over all processors) 1407 - info - matrix information context 1408 1409 Notes: 1410 The MatInfo context contains a variety of matrix data, including 1411 number of nonzeros allocated and used, number of mallocs during 1412 matrix assembly, etc. Additional information for factored matrices 1413 is provided (such as the fill ratio, number of mallocs during 1414 factorization, etc.). Much of this info is printed to STDOUT 1415 when using the runtime options 1416 $ -log_info -mat_view_info 1417 1418 Example for C/C++ Users: 1419 See the file ${PETSC_DIR}/include/petscmat.h for a complete list of 1420 data within the MatInfo context. For example, 1421 .vb 1422 MatInfo info; 1423 Mat A; 1424 double mal, nz_a, nz_u; 1425 1426 MatGetInfo(A,MAT_LOCAL,&info); 1427 mal = info.mallocs; 1428 nz_a = info.nz_allocated; 1429 .ve 1430 1431 Example for Fortran Users: 1432 Fortran users should declare info as a double precision 1433 array of dimension MAT_INFO_SIZE, and then extract the parameters 1434 of interest. See the file ${PETSC_DIR}/include/finclude/petscmat.h 1435 a complete list of parameter names. 1436 .vb 1437 double precision info(MAT_INFO_SIZE) 1438 double precision mal, nz_a 1439 Mat A 1440 integer ierr 1441 1442 call MatGetInfo(A,MAT_LOCAL,info,ierr) 1443 mal = info(MAT_INFO_MALLOCS) 1444 nz_a = info(MAT_INFO_NZ_ALLOCATED) 1445 .ve 1446 1447 Level: intermediate 1448 1449 Concepts: matrices^getting information on 1450 1451 @*/ 1452 int MatGetInfo(Mat mat,MatInfoType flag,MatInfo *info) 1453 { 1454 int ierr; 1455 1456 PetscFunctionBegin; 1457 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1458 PetscValidType(mat); 1459 MatPreallocated(mat); 1460 PetscValidPointer(info); 1461 if (!mat->ops->getinfo) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 1462 ierr = (*mat->ops->getinfo)(mat,flag,info);CHKERRQ(ierr); 1463 PetscFunctionReturn(0); 1464 } 1465 1466 /* ----------------------------------------------------------*/ 1467 #undef __FUNCT__ 1468 #define __FUNCT__ "MatILUDTFactor" 1469 /*@C 1470 MatILUDTFactor - Performs a drop tolerance ILU factorization. 1471 1472 Collective on Mat 1473 1474 Input Parameters: 1475 + mat - the matrix 1476 . info - information about the factorization to be done 1477 . row - row permutation 1478 - col - column permutation 1479 1480 Output Parameters: 1481 . fact - the factored matrix 1482 1483 Level: developer 1484 1485 Notes: 1486 Most users should employ the simplified SLES interface for linear solvers 1487 instead of working directly with matrix algebra routines such as this. 1488 See, e.g., SLESCreate(). 1489 1490 This is currently only supported for the SeqAIJ matrix format using code 1491 from Yousef Saad's SPARSEKIT2 package (translated to C with f2c) and/or 1492 Matlab. SPARSEKIT2 is copyrighted by Yousef Saad with the GNU copyright 1493 and thus can be distributed with PETSc. 1494 1495 Concepts: matrices^ILUDT factorization 1496 1497 .seealso: MatLUFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor(), MatILUInfo 1498 @*/ 1499 int MatILUDTFactor(Mat mat,MatILUInfo *info,IS row,IS col,Mat *fact) 1500 { 1501 int ierr; 1502 1503 PetscFunctionBegin; 1504 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1505 PetscValidType(mat); 1506 MatPreallocated(mat); 1507 PetscValidPointer(fact); 1508 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1509 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1510 if (!mat->ops->iludtfactor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 1511 1512 ierr = PetscLogEventBegin(MAT_ILUFactor,mat,row,col,0);CHKERRQ(ierr); 1513 ierr = (*mat->ops->iludtfactor)(mat,info,row,col,fact);CHKERRQ(ierr); 1514 ierr = PetscLogEventEnd(MAT_ILUFactor,mat,row,col,0);CHKERRQ(ierr); 1515 1516 PetscFunctionReturn(0); 1517 } 1518 1519 #undef __FUNCT__ 1520 #define __FUNCT__ "MatLUFactor" 1521 /*@ 1522 MatLUFactor - Performs in-place LU factorization of matrix. 1523 1524 Collective on Mat 1525 1526 Input Parameters: 1527 + mat - the matrix 1528 . row - row permutation 1529 . col - column permutation 1530 - info - options for factorization, includes 1531 $ fill - expected fill as ratio of original fill. 1532 $ dtcol - pivot tolerance (0 no pivot, 1 full column pivoting) 1533 $ Run with the option -log_info to determine an optimal value to use 1534 1535 Notes: 1536 Most users should employ the simplified SLES interface for linear solvers 1537 instead of working directly with matrix algebra routines such as this. 1538 See, e.g., SLESCreate(). 1539 1540 This changes the state of the matrix to a factored matrix; it cannot be used 1541 for example with MatSetValues() unless one first calls MatSetUnfactored(). 1542 1543 Level: developer 1544 1545 Concepts: matrices^LU factorization 1546 1547 .seealso: MatLUFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor(), 1548 MatGetOrdering(), MatSetUnfactored(), MatLUInfo 1549 1550 @*/ 1551 int MatLUFactor(Mat mat,IS row,IS col,MatLUInfo *info) 1552 { 1553 int ierr; 1554 1555 PetscFunctionBegin; 1556 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1557 PetscValidType(mat); 1558 MatPreallocated(mat); 1559 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1560 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1561 if (!mat->ops->lufactor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 1562 1563 ierr = PetscLogEventBegin(MAT_LUFactor,mat,row,col,0);CHKERRQ(ierr); 1564 ierr = (*mat->ops->lufactor)(mat,row,col,info);CHKERRQ(ierr); 1565 ierr = PetscLogEventEnd(MAT_LUFactor,mat,row,col,0);CHKERRQ(ierr); 1566 PetscFunctionReturn(0); 1567 } 1568 1569 #undef __FUNCT__ 1570 #define __FUNCT__ "MatILUFactor" 1571 /*@ 1572 MatILUFactor - Performs in-place ILU factorization of matrix. 1573 1574 Collective on Mat 1575 1576 Input Parameters: 1577 + mat - the matrix 1578 . row - row permutation 1579 . col - column permutation 1580 - info - structure containing 1581 $ levels - number of levels of fill. 1582 $ expected fill - as ratio of original fill. 1583 $ 1 or 0 - indicating force fill on diagonal (improves robustness for matrices 1584 missing diagonal entries) 1585 1586 Notes: 1587 Probably really in-place only when level of fill is zero, otherwise allocates 1588 new space to store factored matrix and deletes previous memory. 1589 1590 Most users should employ the simplified SLES interface for linear solvers 1591 instead of working directly with matrix algebra routines such as this. 1592 See, e.g., SLESCreate(). 1593 1594 Level: developer 1595 1596 Concepts: matrices^ILU factorization 1597 1598 .seealso: MatILUFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor(), MatILUInfo 1599 @*/ 1600 int MatILUFactor(Mat mat,IS row,IS col,MatILUInfo *info) 1601 { 1602 int ierr; 1603 1604 PetscFunctionBegin; 1605 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1606 PetscValidType(mat); 1607 MatPreallocated(mat); 1608 if (mat->M != mat->N) SETERRQ(PETSC_ERR_ARG_WRONG,"matrix must be square"); 1609 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1610 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1611 if (!mat->ops->ilufactor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 1612 1613 ierr = PetscLogEventBegin(MAT_ILUFactor,mat,row,col,0);CHKERRQ(ierr); 1614 ierr = (*mat->ops->ilufactor)(mat,row,col,info);CHKERRQ(ierr); 1615 ierr = PetscLogEventEnd(MAT_ILUFactor,mat,row,col,0);CHKERRQ(ierr); 1616 PetscFunctionReturn(0); 1617 } 1618 1619 #undef __FUNCT__ 1620 #define __FUNCT__ "MatLUFactorSymbolic" 1621 /*@ 1622 MatLUFactorSymbolic - Performs symbolic LU factorization of matrix. 1623 Call this routine before calling MatLUFactorNumeric(). 1624 1625 Collective on Mat 1626 1627 Input Parameters: 1628 + mat - the matrix 1629 . row, col - row and column permutations 1630 - info - options for factorization, includes 1631 $ fill - expected fill as ratio of original fill. 1632 $ dtcol - pivot tolerance (0 no pivot, 1 full column pivoting) 1633 $ Run with the option -log_info to determine an optimal value to use 1634 1635 Output Parameter: 1636 . fact - new matrix that has been symbolically factored 1637 1638 Notes: 1639 See the users manual for additional information about 1640 choosing the fill factor for better efficiency. 1641 1642 Most users should employ the simplified SLES interface for linear solvers 1643 instead of working directly with matrix algebra routines such as this. 1644 See, e.g., SLESCreate(). 1645 1646 Level: developer 1647 1648 Concepts: matrices^LU symbolic factorization 1649 1650 .seealso: MatLUFactor(), MatLUFactorNumeric(), MatCholeskyFactor(), MatLUInfo 1651 @*/ 1652 int MatLUFactorSymbolic(Mat mat,IS row,IS col,MatLUInfo *info,Mat *fact) 1653 { 1654 int ierr; 1655 1656 PetscFunctionBegin; 1657 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1658 PetscValidType(mat); 1659 MatPreallocated(mat); 1660 PetscValidPointer(fact); 1661 PetscValidHeaderSpecific(row,IS_COOKIE); 1662 PetscValidHeaderSpecific(col,IS_COOKIE); 1663 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1664 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1665 if (!mat->ops->lufactorsymbolic) SETERRQ1(PETSC_ERR_SUP,"Matrix type %s symbolic LU",mat->type_name); 1666 1667 ierr = PetscLogEventBegin(MAT_LUFactorSymbolic,mat,row,col,0);CHKERRQ(ierr); 1668 ierr = (*mat->ops->lufactorsymbolic)(mat,row,col,info,fact);CHKERRQ(ierr); 1669 ierr = PetscLogEventEnd(MAT_LUFactorSymbolic,mat,row,col,0);CHKERRQ(ierr); 1670 PetscFunctionReturn(0); 1671 } 1672 1673 #undef __FUNCT__ 1674 #define __FUNCT__ "MatLUFactorNumeric" 1675 /*@ 1676 MatLUFactorNumeric - Performs numeric LU factorization of a matrix. 1677 Call this routine after first calling MatLUFactorSymbolic(). 1678 1679 Collective on Mat 1680 1681 Input Parameters: 1682 + mat - the matrix 1683 - fact - the matrix generated for the factor, from MatLUFactorSymbolic() 1684 1685 Notes: 1686 See MatLUFactor() for in-place factorization. See 1687 MatCholeskyFactorNumeric() for the symmetric, positive definite case. 1688 1689 Most users should employ the simplified SLES interface for linear solvers 1690 instead of working directly with matrix algebra routines such as this. 1691 See, e.g., SLESCreate(). 1692 1693 Level: developer 1694 1695 Concepts: matrices^LU numeric factorization 1696 1697 .seealso: MatLUFactorSymbolic(), MatLUFactor(), MatCholeskyFactor() 1698 @*/ 1699 int MatLUFactorNumeric(Mat mat,Mat *fact) 1700 { 1701 int ierr; 1702 PetscTruth flg; 1703 1704 PetscFunctionBegin; 1705 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1706 PetscValidType(mat); 1707 MatPreallocated(mat); 1708 PetscValidPointer(fact); 1709 PetscValidHeaderSpecific(*fact,MAT_COOKIE); 1710 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1711 if (mat->M != (*fact)->M || mat->N != (*fact)->N) { 1712 SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat mat,Mat *fact: global dimensions are different %d should = %d %d should = %d", 1713 mat->M,(*fact)->M,mat->N,(*fact)->N); 1714 } 1715 if (!(*fact)->ops->lufactornumeric) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 1716 1717 ierr = PetscLogEventBegin(MAT_LUFactorNumeric,mat,*fact,0,0);CHKERRQ(ierr); 1718 ierr = (*(*fact)->ops->lufactornumeric)(mat,fact);CHKERRQ(ierr); 1719 ierr = PetscLogEventEnd(MAT_LUFactorNumeric,mat,*fact,0,0);CHKERRQ(ierr); 1720 1721 ierr = MatView_Private(*fact);CHKERRQ(ierr); 1722 PetscFunctionReturn(0); 1723 } 1724 1725 #undef __FUNCT__ 1726 #define __FUNCT__ "MatCholeskyFactor" 1727 /*@ 1728 MatCholeskyFactor - Performs in-place Cholesky factorization of a 1729 symmetric matrix. 1730 1731 Collective on Mat 1732 1733 Input Parameters: 1734 + mat - the matrix 1735 . perm - row and column permutations 1736 - f - expected fill as ratio of original fill 1737 1738 Notes: 1739 See MatLUFactor() for the nonsymmetric case. See also 1740 MatCholeskyFactorSymbolic(), and MatCholeskyFactorNumeric(). 1741 1742 Most users should employ the simplified SLES interface for linear solvers 1743 instead of working directly with matrix algebra routines such as this. 1744 See, e.g., SLESCreate(). 1745 1746 Level: developer 1747 1748 Concepts: matrices^Cholesky factorization 1749 1750 .seealso: MatLUFactor(), MatCholeskyFactorSymbolic(), MatCholeskyFactorNumeric() 1751 MatGetOrdering() 1752 1753 @*/ 1754 int MatCholeskyFactor(Mat mat,IS perm,PetscReal f) 1755 { 1756 int ierr; 1757 1758 PetscFunctionBegin; 1759 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1760 PetscValidType(mat); 1761 MatPreallocated(mat); 1762 PetscValidHeaderSpecific(perm,IS_COOKIE); 1763 if (mat->M != mat->N) SETERRQ(PETSC_ERR_ARG_WRONG,"Matrix must be square"); 1764 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1765 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1766 if (!mat->ops->choleskyfactor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 1767 1768 ierr = PetscLogEventBegin(MAT_CholeskyFactor,mat,perm,0,0);CHKERRQ(ierr); 1769 ierr = (*mat->ops->choleskyfactor)(mat,perm,f);CHKERRQ(ierr); 1770 ierr = PetscLogEventEnd(MAT_CholeskyFactor,mat,perm,0,0);CHKERRQ(ierr); 1771 PetscFunctionReturn(0); 1772 } 1773 1774 #undef __FUNCT__ 1775 #define __FUNCT__ "MatCholeskyFactorSymbolic" 1776 /*@ 1777 MatCholeskyFactorSymbolic - Performs symbolic Cholesky factorization 1778 of a symmetric matrix. 1779 1780 Collective on Mat 1781 1782 Input Parameters: 1783 + mat - the matrix 1784 . perm - row and column permutations 1785 - f - expected fill as ratio of original 1786 1787 Output Parameter: 1788 . fact - the factored matrix 1789 1790 Notes: 1791 See MatLUFactorSymbolic() for the nonsymmetric case. See also 1792 MatCholeskyFactor() and MatCholeskyFactorNumeric(). 1793 1794 Most users should employ the simplified SLES interface for linear solvers 1795 instead of working directly with matrix algebra routines such as this. 1796 See, e.g., SLESCreate(). 1797 1798 Level: developer 1799 1800 Concepts: matrices^Cholesky symbolic factorization 1801 1802 .seealso: MatLUFactorSymbolic(), MatCholeskyFactor(), MatCholeskyFactorNumeric() 1803 MatGetOrdering() 1804 1805 @*/ 1806 int MatCholeskyFactorSymbolic(Mat mat,IS perm,PetscReal f,Mat *fact) 1807 { 1808 int ierr; 1809 1810 PetscFunctionBegin; 1811 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1812 PetscValidType(mat); 1813 MatPreallocated(mat); 1814 PetscValidPointer(fact); 1815 if (mat->M != mat->N) SETERRQ(PETSC_ERR_ARG_WRONG,"Matrix must be square"); 1816 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1817 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1818 if (!mat->ops->choleskyfactorsymbolic) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 1819 1820 ierr = PetscLogEventBegin(MAT_CholeskyFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr); 1821 ierr = (*mat->ops->choleskyfactorsymbolic)(mat,perm,f,fact);CHKERRQ(ierr); 1822 ierr = PetscLogEventEnd(MAT_CholeskyFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr); 1823 PetscFunctionReturn(0); 1824 } 1825 1826 #undef __FUNCT__ 1827 #define __FUNCT__ "MatCholeskyFactorNumeric" 1828 /*@ 1829 MatCholeskyFactorNumeric - Performs numeric Cholesky factorization 1830 of a symmetric matrix. Call this routine after first calling 1831 MatCholeskyFactorSymbolic(). 1832 1833 Collective on Mat 1834 1835 Input Parameter: 1836 . mat - the initial matrix 1837 1838 Output Parameter: 1839 . fact - the factored matrix 1840 1841 Notes: 1842 Most users should employ the simplified SLES interface for linear solvers 1843 instead of working directly with matrix algebra routines such as this. 1844 See, e.g., SLESCreate(). 1845 1846 Level: developer 1847 1848 Concepts: matrices^Cholesky numeric factorization 1849 1850 .seealso: MatCholeskyFactorSymbolic(), MatCholeskyFactor(), MatLUFactorNumeric() 1851 @*/ 1852 int MatCholeskyFactorNumeric(Mat mat,Mat *fact) 1853 { 1854 int ierr; 1855 1856 PetscFunctionBegin; 1857 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1858 PetscValidType(mat); 1859 MatPreallocated(mat); 1860 PetscValidPointer(fact); 1861 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1862 if (!(*fact)->ops->choleskyfactornumeric) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 1863 if (mat->M != (*fact)->M || mat->N != (*fact)->N) { 1864 SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat mat,Mat *fact: global dim %d should = %d %d should = %d", 1865 mat->M,(*fact)->M,mat->N,(*fact)->N); 1866 } 1867 1868 ierr = PetscLogEventBegin(MAT_CholeskyFactorNumeric,mat,*fact,0,0);CHKERRQ(ierr); 1869 ierr = (*(*fact)->ops->choleskyfactornumeric)(mat,fact);CHKERRQ(ierr); 1870 ierr = PetscLogEventEnd(MAT_CholeskyFactorNumeric,mat,*fact,0,0);CHKERRQ(ierr); 1871 PetscFunctionReturn(0); 1872 } 1873 1874 /* ----------------------------------------------------------------*/ 1875 #undef __FUNCT__ 1876 #define __FUNCT__ "MatSolve" 1877 /*@ 1878 MatSolve - Solves A x = b, given a factored matrix. 1879 1880 Collective on Mat and Vec 1881 1882 Input Parameters: 1883 + mat - the factored matrix 1884 - b - the right-hand-side vector 1885 1886 Output Parameter: 1887 . x - the result vector 1888 1889 Notes: 1890 The vectors b and x cannot be the same. I.e., one cannot 1891 call MatSolve(A,x,x). 1892 1893 Notes: 1894 Most users should employ the simplified SLES interface for linear solvers 1895 instead of working directly with matrix algebra routines such as this. 1896 See, e.g., SLESCreate(). 1897 1898 Level: developer 1899 1900 Concepts: matrices^triangular solves 1901 1902 .seealso: MatSolveAdd(), MatSolveTranspose(), MatSolveTransposeAdd() 1903 @*/ 1904 int MatSolve(Mat mat,Vec b,Vec x) 1905 { 1906 int ierr; 1907 1908 PetscFunctionBegin; 1909 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1910 PetscValidType(mat); 1911 MatPreallocated(mat); 1912 PetscValidHeaderSpecific(b,VEC_COOKIE); 1913 PetscValidHeaderSpecific(x,VEC_COOKIE); 1914 PetscCheckSameComm(mat,b); 1915 PetscCheckSameComm(mat,x); 1916 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 1917 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 1918 if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N); 1919 if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N); 1920 if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n); 1921 if (mat->M == 0 && mat->N == 0) PetscFunctionReturn(0); 1922 1923 if (!mat->ops->solve) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 1924 ierr = PetscLogEventBegin(MAT_Solve,mat,b,x,0);CHKERRQ(ierr); 1925 ierr = (*mat->ops->solve)(mat,b,x);CHKERRQ(ierr); 1926 ierr = PetscLogEventEnd(MAT_Solve,mat,b,x,0);CHKERRQ(ierr); 1927 PetscFunctionReturn(0); 1928 } 1929 1930 #undef __FUNCT__ 1931 #define __FUNCT__ "MatForwardSolve" 1932 /* @ 1933 MatForwardSolve - Solves L x = b, given a factored matrix, A = LU. 1934 1935 Collective on Mat and Vec 1936 1937 Input Parameters: 1938 + mat - the factored matrix 1939 - b - the right-hand-side vector 1940 1941 Output Parameter: 1942 . x - the result vector 1943 1944 Notes: 1945 MatSolve() should be used for most applications, as it performs 1946 a forward solve followed by a backward solve. 1947 1948 The vectors b and x cannot be the same. I.e., one cannot 1949 call MatForwardSolve(A,x,x). 1950 1951 Most users should employ the simplified SLES interface for linear solvers 1952 instead of working directly with matrix algebra routines such as this. 1953 See, e.g., SLESCreate(). 1954 1955 Level: developer 1956 1957 Concepts: matrices^forward solves 1958 1959 .seealso: MatSolve(), MatBackwardSolve() 1960 @ */ 1961 int MatForwardSolve(Mat mat,Vec b,Vec x) 1962 { 1963 int ierr; 1964 1965 PetscFunctionBegin; 1966 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1967 PetscValidType(mat); 1968 MatPreallocated(mat); 1969 PetscValidHeaderSpecific(b,VEC_COOKIE); 1970 PetscValidHeaderSpecific(x,VEC_COOKIE); 1971 PetscCheckSameComm(mat,b); 1972 PetscCheckSameComm(mat,x); 1973 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 1974 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 1975 if (!mat->ops->forwardsolve) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 1976 if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N); 1977 if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N); 1978 if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n); 1979 1980 ierr = PetscLogEventBegin(MAT_ForwardSolve,mat,b,x,0);CHKERRQ(ierr); 1981 ierr = (*mat->ops->forwardsolve)(mat,b,x);CHKERRQ(ierr); 1982 ierr = PetscLogEventEnd(MAT_ForwardSolve,mat,b,x,0);CHKERRQ(ierr); 1983 PetscFunctionReturn(0); 1984 } 1985 1986 #undef __FUNCT__ 1987 #define __FUNCT__ "MatBackwardSolve" 1988 /* @ 1989 MatBackwardSolve - Solves U x = b, given a factored matrix, A = LU. 1990 1991 Collective on Mat and Vec 1992 1993 Input Parameters: 1994 + mat - the factored matrix 1995 - b - the right-hand-side vector 1996 1997 Output Parameter: 1998 . x - the result vector 1999 2000 Notes: 2001 MatSolve() should be used for most applications, as it performs 2002 a forward solve followed by a backward solve. 2003 2004 The vectors b and x cannot be the same. I.e., one cannot 2005 call MatBackwardSolve(A,x,x). 2006 2007 Most users should employ the simplified SLES interface for linear solvers 2008 instead of working directly with matrix algebra routines such as this. 2009 See, e.g., SLESCreate(). 2010 2011 Level: developer 2012 2013 Concepts: matrices^backward solves 2014 2015 .seealso: MatSolve(), MatForwardSolve() 2016 @ */ 2017 int MatBackwardSolve(Mat mat,Vec b,Vec x) 2018 { 2019 int ierr; 2020 2021 PetscFunctionBegin; 2022 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2023 PetscValidType(mat); 2024 MatPreallocated(mat); 2025 PetscValidHeaderSpecific(b,VEC_COOKIE); 2026 PetscValidHeaderSpecific(x,VEC_COOKIE); 2027 PetscCheckSameComm(mat,b); 2028 PetscCheckSameComm(mat,x); 2029 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 2030 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 2031 if (!mat->ops->backwardsolve) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 2032 if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N); 2033 if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N); 2034 if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n); 2035 2036 ierr = PetscLogEventBegin(MAT_BackwardSolve,mat,b,x,0);CHKERRQ(ierr); 2037 ierr = (*mat->ops->backwardsolve)(mat,b,x);CHKERRQ(ierr); 2038 ierr = PetscLogEventEnd(MAT_BackwardSolve,mat,b,x,0);CHKERRQ(ierr); 2039 PetscFunctionReturn(0); 2040 } 2041 2042 #undef __FUNCT__ 2043 #define __FUNCT__ "MatSolveAdd" 2044 /*@ 2045 MatSolveAdd - Computes x = y + inv(A)*b, given a factored matrix. 2046 2047 Collective on Mat and Vec 2048 2049 Input Parameters: 2050 + mat - the factored matrix 2051 . b - the right-hand-side vector 2052 - y - the vector to be added to 2053 2054 Output Parameter: 2055 . x - the result vector 2056 2057 Notes: 2058 The vectors b and x cannot be the same. I.e., one cannot 2059 call MatSolveAdd(A,x,y,x). 2060 2061 Most users should employ the simplified SLES interface for linear solvers 2062 instead of working directly with matrix algebra routines such as this. 2063 See, e.g., SLESCreate(). 2064 2065 Level: developer 2066 2067 Concepts: matrices^triangular solves 2068 2069 .seealso: MatSolve(), MatSolveTranspose(), MatSolveTransposeAdd() 2070 @*/ 2071 int MatSolveAdd(Mat mat,Vec b,Vec y,Vec x) 2072 { 2073 PetscScalar one = 1.0; 2074 Vec tmp; 2075 int ierr; 2076 2077 PetscFunctionBegin; 2078 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2079 PetscValidType(mat); 2080 MatPreallocated(mat); 2081 PetscValidHeaderSpecific(y,VEC_COOKIE); 2082 PetscValidHeaderSpecific(b,VEC_COOKIE); 2083 PetscValidHeaderSpecific(x,VEC_COOKIE); 2084 PetscCheckSameComm(mat,b); 2085 PetscCheckSameComm(mat,y); 2086 PetscCheckSameComm(mat,x); 2087 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 2088 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 2089 if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N); 2090 if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N); 2091 if (mat->M != y->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %d %d",mat->M,y->N); 2092 if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n); 2093 if (x->n != y->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Vec x,Vec y: local dim %d %d",x->n,y->n); 2094 2095 ierr = PetscLogEventBegin(MAT_SolveAdd,mat,b,x,y);CHKERRQ(ierr); 2096 if (mat->ops->solveadd) { 2097 ierr = (*mat->ops->solveadd)(mat,b,y,x);CHKERRQ(ierr); 2098 } else { 2099 /* do the solve then the add manually */ 2100 if (x != y) { 2101 ierr = MatSolve(mat,b,x);CHKERRQ(ierr); 2102 ierr = VecAXPY(&one,y,x);CHKERRQ(ierr); 2103 } else { 2104 ierr = VecDuplicate(x,&tmp);CHKERRQ(ierr); 2105 PetscLogObjectParent(mat,tmp); 2106 ierr = VecCopy(x,tmp);CHKERRQ(ierr); 2107 ierr = MatSolve(mat,b,x);CHKERRQ(ierr); 2108 ierr = VecAXPY(&one,tmp,x);CHKERRQ(ierr); 2109 ierr = VecDestroy(tmp);CHKERRQ(ierr); 2110 } 2111 } 2112 ierr = PetscLogEventEnd(MAT_SolveAdd,mat,b,x,y);CHKERRQ(ierr); 2113 PetscFunctionReturn(0); 2114 } 2115 2116 #undef __FUNCT__ 2117 #define __FUNCT__ "MatSolveTranspose" 2118 /*@ 2119 MatSolveTranspose - Solves A' x = b, given a factored matrix. 2120 2121 Collective on Mat and Vec 2122 2123 Input Parameters: 2124 + mat - the factored matrix 2125 - b - the right-hand-side vector 2126 2127 Output Parameter: 2128 . x - the result vector 2129 2130 Notes: 2131 The vectors b and x cannot be the same. I.e., one cannot 2132 call MatSolveTranspose(A,x,x). 2133 2134 Most users should employ the simplified SLES interface for linear solvers 2135 instead of working directly with matrix algebra routines such as this. 2136 See, e.g., SLESCreate(). 2137 2138 Level: developer 2139 2140 Concepts: matrices^triangular solves 2141 2142 .seealso: MatSolve(), MatSolveAdd(), MatSolveTransposeAdd() 2143 @*/ 2144 int MatSolveTranspose(Mat mat,Vec b,Vec x) 2145 { 2146 int ierr; 2147 2148 PetscFunctionBegin; 2149 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2150 PetscValidType(mat); 2151 MatPreallocated(mat); 2152 PetscValidHeaderSpecific(b,VEC_COOKIE); 2153 PetscValidHeaderSpecific(x,VEC_COOKIE); 2154 PetscCheckSameComm(mat,b); 2155 PetscCheckSameComm(mat,x); 2156 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 2157 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 2158 if (!mat->ops->solvetranspose) SETERRQ1(PETSC_ERR_SUP,"Matrix type %s",mat->type_name); 2159 if (mat->M != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->M,x->N); 2160 if (mat->N != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->N,b->N); 2161 2162 ierr = PetscLogEventBegin(MAT_SolveTranspose,mat,b,x,0);CHKERRQ(ierr); 2163 ierr = (*mat->ops->solvetranspose)(mat,b,x);CHKERRQ(ierr); 2164 ierr = PetscLogEventEnd(MAT_SolveTranspose,mat,b,x,0);CHKERRQ(ierr); 2165 PetscFunctionReturn(0); 2166 } 2167 2168 #undef __FUNCT__ 2169 #define __FUNCT__ "MatSolveTransposeAdd" 2170 /*@ 2171 MatSolveTransposeAdd - Computes x = y + inv(Transpose(A)) b, given a 2172 factored matrix. 2173 2174 Collective on Mat and Vec 2175 2176 Input Parameters: 2177 + mat - the factored matrix 2178 . b - the right-hand-side vector 2179 - y - the vector to be added to 2180 2181 Output Parameter: 2182 . x - the result vector 2183 2184 Notes: 2185 The vectors b and x cannot be the same. I.e., one cannot 2186 call MatSolveTransposeAdd(A,x,y,x). 2187 2188 Most users should employ the simplified SLES interface for linear solvers 2189 instead of working directly with matrix algebra routines such as this. 2190 See, e.g., SLESCreate(). 2191 2192 Level: developer 2193 2194 Concepts: matrices^triangular solves 2195 2196 .seealso: MatSolve(), MatSolveAdd(), MatSolveTranspose() 2197 @*/ 2198 int MatSolveTransposeAdd(Mat mat,Vec b,Vec y,Vec x) 2199 { 2200 PetscScalar one = 1.0; 2201 int ierr; 2202 Vec tmp; 2203 2204 PetscFunctionBegin; 2205 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2206 PetscValidType(mat); 2207 MatPreallocated(mat); 2208 PetscValidHeaderSpecific(y,VEC_COOKIE); 2209 PetscValidHeaderSpecific(b,VEC_COOKIE); 2210 PetscValidHeaderSpecific(x,VEC_COOKIE); 2211 PetscCheckSameComm(mat,b); 2212 PetscCheckSameComm(mat,y); 2213 PetscCheckSameComm(mat,x); 2214 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 2215 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 2216 if (mat->M != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->M,x->N); 2217 if (mat->N != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->N,b->N); 2218 if (mat->N != y->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %d %d",mat->N,y->N); 2219 if (x->n != y->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Vec x,Vec y: local dim %d %d",x->n,y->n); 2220 2221 ierr = PetscLogEventBegin(MAT_SolveTransposeAdd,mat,b,x,y);CHKERRQ(ierr); 2222 if (mat->ops->solvetransposeadd) { 2223 ierr = (*mat->ops->solvetransposeadd)(mat,b,y,x);CHKERRQ(ierr); 2224 } else { 2225 /* do the solve then the add manually */ 2226 if (x != y) { 2227 ierr = MatSolveTranspose(mat,b,x);CHKERRQ(ierr); 2228 ierr = VecAXPY(&one,y,x);CHKERRQ(ierr); 2229 } else { 2230 ierr = VecDuplicate(x,&tmp);CHKERRQ(ierr); 2231 PetscLogObjectParent(mat,tmp); 2232 ierr = VecCopy(x,tmp);CHKERRQ(ierr); 2233 ierr = MatSolveTranspose(mat,b,x);CHKERRQ(ierr); 2234 ierr = VecAXPY(&one,tmp,x);CHKERRQ(ierr); 2235 ierr = VecDestroy(tmp);CHKERRQ(ierr); 2236 } 2237 } 2238 ierr = PetscLogEventEnd(MAT_SolveTransposeAdd,mat,b,x,y);CHKERRQ(ierr); 2239 PetscFunctionReturn(0); 2240 } 2241 /* ----------------------------------------------------------------*/ 2242 2243 #undef __FUNCT__ 2244 #define __FUNCT__ "MatRelax" 2245 /*@ 2246 MatRelax - Computes one relaxation sweep. 2247 2248 Collective on Mat and Vec 2249 2250 Input Parameters: 2251 + mat - the matrix 2252 . b - the right hand side 2253 . omega - the relaxation factor 2254 . flag - flag indicating the type of SOR (see below) 2255 . shift - diagonal shift 2256 - its - the number of iterations 2257 - lits - the number of local iterations 2258 2259 Output Parameters: 2260 . x - the solution (can contain an initial guess) 2261 2262 SOR Flags: 2263 . SOR_FORWARD_SWEEP - forward SOR 2264 . SOR_BACKWARD_SWEEP - backward SOR 2265 . SOR_SYMMETRIC_SWEEP - SSOR (symmetric SOR) 2266 . SOR_LOCAL_FORWARD_SWEEP - local forward SOR 2267 . SOR_LOCAL_BACKWARD_SWEEP - local forward SOR 2268 . SOR_LOCAL_SYMMETRIC_SWEEP - local SSOR 2269 . SOR_APPLY_UPPER, SOR_APPLY_LOWER - applies 2270 upper/lower triangular part of matrix to 2271 vector (with omega) 2272 . SOR_ZERO_INITIAL_GUESS - zero initial guess 2273 2274 Notes: 2275 SOR_LOCAL_FORWARD_SWEEP, SOR_LOCAL_BACKWARD_SWEEP, and 2276 SOR_LOCAL_SYMMETRIC_SWEEP perform seperate independent smoothings 2277 on each processor. 2278 2279 Application programmers will not generally use MatRelax() directly, 2280 but instead will employ the SLES/PC interface. 2281 2282 Notes for Advanced Users: 2283 The flags are implemented as bitwise inclusive or operations. 2284 For example, use (SOR_ZERO_INITIAL_GUESS | SOR_SYMMETRIC_SWEEP) 2285 to specify a zero initial guess for SSOR. 2286 2287 Most users should employ the simplified SLES interface for linear solvers 2288 instead of working directly with matrix algebra routines such as this. 2289 See, e.g., SLESCreate(). 2290 2291 Level: developer 2292 2293 Concepts: matrices^relaxation 2294 Concepts: matrices^SOR 2295 Concepts: matrices^Gauss-Seidel 2296 2297 @*/ 2298 int MatRelax(Mat mat,Vec b,PetscReal omega,MatSORType flag,PetscReal shift,int its,int lits,Vec x) 2299 { 2300 int ierr; 2301 2302 PetscFunctionBegin; 2303 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2304 PetscValidType(mat); 2305 MatPreallocated(mat); 2306 PetscValidHeaderSpecific(b,VEC_COOKIE); 2307 PetscValidHeaderSpecific(x,VEC_COOKIE); 2308 PetscCheckSameComm(mat,b); 2309 PetscCheckSameComm(mat,x); 2310 if (!mat->ops->relax) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 2311 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2312 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2313 if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N); 2314 if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N); 2315 if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n); 2316 2317 ierr = PetscLogEventBegin(MAT_Relax,mat,b,x,0);CHKERRQ(ierr); 2318 ierr =(*mat->ops->relax)(mat,b,omega,flag,shift,its,lits,x);CHKERRQ(ierr); 2319 ierr = PetscLogEventEnd(MAT_Relax,mat,b,x,0);CHKERRQ(ierr); 2320 PetscFunctionReturn(0); 2321 } 2322 2323 #undef __FUNCT__ 2324 #define __FUNCT__ "MatCopy_Basic" 2325 /* 2326 Default matrix copy routine. 2327 */ 2328 int MatCopy_Basic(Mat A,Mat B,MatStructure str) 2329 { 2330 int ierr,i,rstart,rend,nz,*cwork; 2331 PetscScalar *vwork; 2332 2333 PetscFunctionBegin; 2334 ierr = MatZeroEntries(B);CHKERRQ(ierr); 2335 ierr = MatGetOwnershipRange(A,&rstart,&rend);CHKERRQ(ierr); 2336 for (i=rstart; i<rend; i++) { 2337 ierr = MatGetRow(A,i,&nz,&cwork,&vwork);CHKERRQ(ierr); 2338 ierr = MatSetValues(B,1,&i,nz,cwork,vwork,INSERT_VALUES);CHKERRQ(ierr); 2339 ierr = MatRestoreRow(A,i,&nz,&cwork,&vwork);CHKERRQ(ierr); 2340 } 2341 ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2342 ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2343 PetscFunctionReturn(0); 2344 } 2345 2346 #undef __FUNCT__ 2347 #define __FUNCT__ "MatCopy" 2348 /*@C 2349 MatCopy - Copys a matrix to another matrix. 2350 2351 Collective on Mat 2352 2353 Input Parameters: 2354 + A - the matrix 2355 - str - SAME_NONZERO_PATTERN or DIFFERENT_NONZERO_PATTERN 2356 2357 Output Parameter: 2358 . B - where the copy is put 2359 2360 Notes: 2361 If you use SAME_NONZERO_PATTERN then the two matrices had better have the 2362 same nonzero pattern or the routine will crash. 2363 2364 MatCopy() copies the matrix entries of a matrix to another existing 2365 matrix (after first zeroing the second matrix). A related routine is 2366 MatConvert(), which first creates a new matrix and then copies the data. 2367 2368 Level: intermediate 2369 2370 Concepts: matrices^copying 2371 2372 .seealso: MatConvert(), MatDuplicate() 2373 2374 @*/ 2375 int MatCopy(Mat A,Mat B,MatStructure str) 2376 { 2377 int ierr; 2378 2379 PetscFunctionBegin; 2380 PetscValidHeaderSpecific(A,MAT_COOKIE); 2381 PetscValidHeaderSpecific(B,MAT_COOKIE); 2382 PetscValidType(A); 2383 MatPreallocated(A); 2384 PetscValidType(B); 2385 MatPreallocated(B); 2386 PetscCheckSameComm(A,B); 2387 if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2388 if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2389 if (A->M != B->M || A->N != B->N) SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat A,Mat B: global dim (%d,%d) (%d,%d)",A->M,B->M, 2390 A->N,B->N); 2391 2392 ierr = PetscLogEventBegin(MAT_Copy,A,B,0,0);CHKERRQ(ierr); 2393 if (A->ops->copy) { 2394 ierr = (*A->ops->copy)(A,B,str);CHKERRQ(ierr); 2395 } else { /* generic conversion */ 2396 ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 2397 } 2398 if (A->mapping) { 2399 if (B->mapping) {ierr = ISLocalToGlobalMappingDestroy(B->mapping);CHKERRQ(ierr);B->mapping = 0;} 2400 ierr = MatSetLocalToGlobalMapping(B,A->mapping);CHKERRQ(ierr); 2401 } 2402 if (A->bmapping) { 2403 if (B->bmapping) {ierr = ISLocalToGlobalMappingDestroy(B->bmapping);CHKERRQ(ierr);B->bmapping = 0;} 2404 ierr = MatSetLocalToGlobalMappingBlock(B,A->mapping);CHKERRQ(ierr); 2405 } 2406 ierr = PetscLogEventEnd(MAT_Copy,A,B,0,0);CHKERRQ(ierr); 2407 PetscFunctionReturn(0); 2408 } 2409 2410 #include "petscsys.h" 2411 PetscTruth MatConvertRegisterAllCalled = PETSC_FALSE; 2412 PetscFList MatConvertList = 0; 2413 2414 #undef __FUNCT__ 2415 #define __FUNCT__ "MatConvertRegister" 2416 /*@C 2417 MatConvertRegister - Allows one to register a routine that converts a sparse matrix 2418 from one format to another. 2419 2420 Not Collective 2421 2422 Input Parameters: 2423 + type - the type of matrix (defined in include/petscmat.h), for example, MATSEQAIJ. 2424 - Converter - the function that reads the matrix from the binary file. 2425 2426 Level: developer 2427 2428 .seealso: MatConvertRegisterAll(), MatConvert() 2429 2430 @*/ 2431 int MatConvertRegister(char *sname,char *path,char *name,int (*function)(Mat,MatType,Mat*)) 2432 { 2433 int ierr; 2434 char fullname[PETSC_MAX_PATH_LEN]; 2435 2436 PetscFunctionBegin; 2437 ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 2438 ierr = PetscFListAdd(&MatConvertList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 2439 PetscFunctionReturn(0); 2440 } 2441 2442 #undef __FUNCT__ 2443 #define __FUNCT__ "MatConvert" 2444 /*@C 2445 MatConvert - Converts a matrix to another matrix, either of the same 2446 or different type. 2447 2448 Collective on Mat 2449 2450 Input Parameters: 2451 + mat - the matrix 2452 - newtype - new matrix type. Use MATSAME to create a new matrix of the 2453 same type as the original matrix. 2454 2455 Output Parameter: 2456 . M - pointer to place new matrix 2457 2458 Notes: 2459 MatConvert() first creates a new matrix and then copies the data from 2460 the first matrix. A related routine is MatCopy(), which copies the matrix 2461 entries of one matrix to another already existing matrix context. 2462 2463 Level: intermediate 2464 2465 Concepts: matrices^converting between storage formats 2466 2467 .seealso: MatCopy(), MatDuplicate() 2468 @*/ 2469 int MatConvert(Mat mat,MatType newtype,Mat *M) 2470 { 2471 int ierr; 2472 PetscTruth sametype,issame,flg; 2473 char convname[256],mtype[256]; 2474 2475 PetscFunctionBegin; 2476 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2477 PetscValidType(mat); 2478 MatPreallocated(mat); 2479 PetscValidPointer(M); 2480 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2481 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2482 2483 ierr = PetscOptionsGetString(PETSC_NULL,"-matconvert_type",mtype,256,&flg);CHKERRQ(ierr); 2484 if (flg) { 2485 newtype = mtype; 2486 } 2487 ierr = PetscLogEventBegin(MAT_Convert,mat,0,0,0);CHKERRQ(ierr); 2488 2489 ierr = PetscTypeCompare((PetscObject)mat,newtype,&sametype);CHKERRQ(ierr); 2490 ierr = PetscStrcmp(newtype,"same",&issame);CHKERRQ(ierr); 2491 if ((sametype || issame) && mat->ops->duplicate) { 2492 ierr = (*mat->ops->duplicate)(mat,MAT_COPY_VALUES,M);CHKERRQ(ierr); 2493 } else { 2494 int (*conv)(Mat,MatType,Mat*); 2495 if (!MatConvertRegisterAllCalled) { 2496 ierr = MatConvertRegisterAll(PETSC_NULL);CHKERRQ(ierr); 2497 } 2498 ierr = PetscFListFind(mat->comm,MatConvertList,newtype,(void(**)(void))&conv);CHKERRQ(ierr); 2499 if (conv) { 2500 ierr = (*conv)(mat,newtype,M);CHKERRQ(ierr); 2501 } else { 2502 ierr = PetscStrcpy(convname,"MatConvert_");CHKERRQ(ierr); 2503 ierr = PetscStrcat(convname,mat->type_name);CHKERRQ(ierr); 2504 ierr = PetscStrcat(convname,"_");CHKERRQ(ierr); 2505 ierr = PetscStrcat(convname,newtype);CHKERRQ(ierr); 2506 ierr = PetscStrcat(convname,"_C");CHKERRQ(ierr); 2507 ierr = PetscObjectQueryFunction((PetscObject)mat,convname,(void (**)(void))&conv);CHKERRQ(ierr); 2508 if (conv) { 2509 ierr = (*conv)(mat,newtype,M);CHKERRQ(ierr); 2510 } else { 2511 if (mat->ops->convert) { 2512 ierr = (*mat->ops->convert)(mat,newtype,M);CHKERRQ(ierr); 2513 } else { 2514 ierr = MatConvert_Basic(mat,newtype,M);CHKERRQ(ierr); 2515 } 2516 } 2517 } 2518 } 2519 ierr = PetscLogEventEnd(MAT_Convert,mat,0,0,0);CHKERRQ(ierr); 2520 PetscFunctionReturn(0); 2521 } 2522 2523 2524 #undef __FUNCT__ 2525 #define __FUNCT__ "MatDuplicate" 2526 /*@C 2527 MatDuplicate - Duplicates a matrix including the non-zero structure. 2528 2529 Collective on Mat 2530 2531 Input Parameters: 2532 + mat - the matrix 2533 - op - either MAT_DO_NOT_COPY_VALUES or MAT_COPY_VALUES, cause it to copy nonzero 2534 values as well or not 2535 2536 Output Parameter: 2537 . M - pointer to place new matrix 2538 2539 Level: intermediate 2540 2541 Concepts: matrices^duplicating 2542 2543 .seealso: MatCopy(), MatConvert() 2544 @*/ 2545 int MatDuplicate(Mat mat,MatDuplicateOption op,Mat *M) 2546 { 2547 int ierr; 2548 2549 PetscFunctionBegin; 2550 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2551 PetscValidType(mat); 2552 MatPreallocated(mat); 2553 PetscValidPointer(M); 2554 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2555 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2556 2557 *M = 0; 2558 ierr = PetscLogEventBegin(MAT_Convert,mat,0,0,0);CHKERRQ(ierr); 2559 if (!mat->ops->duplicate) { 2560 SETERRQ(PETSC_ERR_SUP,"Not written for this matrix type"); 2561 } 2562 ierr = (*mat->ops->duplicate)(mat,op,M);CHKERRQ(ierr); 2563 if (mat->mapping) { 2564 ierr = MatSetLocalToGlobalMapping(*M,mat->mapping);CHKERRQ(ierr); 2565 } 2566 if (mat->bmapping) { 2567 ierr = MatSetLocalToGlobalMappingBlock(*M,mat->mapping);CHKERRQ(ierr); 2568 } 2569 ierr = PetscLogEventEnd(MAT_Convert,mat,0,0,0);CHKERRQ(ierr); 2570 PetscFunctionReturn(0); 2571 } 2572 2573 #undef __FUNCT__ 2574 #define __FUNCT__ "MatGetDiagonal" 2575 /*@ 2576 MatGetDiagonal - Gets the diagonal of a matrix. 2577 2578 Collective on Mat and Vec 2579 2580 Input Parameters: 2581 + mat - the matrix 2582 - v - the vector for storing the diagonal 2583 2584 Output Parameter: 2585 . v - the diagonal of the matrix 2586 2587 Notes: 2588 For the SeqAIJ matrix format, this routine may also be called 2589 on a LU factored matrix; in that case it routines the reciprocal of 2590 the diagonal entries in U. It returns the entries permuted by the 2591 row and column permutation used during the symbolic factorization. 2592 2593 Level: intermediate 2594 2595 Concepts: matrices^accessing diagonals 2596 2597 .seealso: MatGetRow(), MatGetSubmatrices(), MatGetSubmatrix(), MatGetRowMax() 2598 @*/ 2599 int MatGetDiagonal(Mat mat,Vec v) 2600 { 2601 int ierr; 2602 2603 PetscFunctionBegin; 2604 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2605 PetscValidType(mat); 2606 MatPreallocated(mat); 2607 PetscValidHeaderSpecific(v,VEC_COOKIE); 2608 /* PetscCheckSameComm(mat,v); Could be MPI vector but Seq matrix cause of two submatrix storage */ 2609 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2610 if (!mat->ops->getdiagonal) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 2611 2612 ierr = (*mat->ops->getdiagonal)(mat,v);CHKERRQ(ierr); 2613 PetscFunctionReturn(0); 2614 } 2615 2616 #undef __FUNCT__ 2617 #define __FUNCT__ "MatGetRowMax" 2618 /*@ 2619 MatGetRowMax - Gets the maximum value (in absolute value) of each 2620 row of the matrix 2621 2622 Collective on Mat and Vec 2623 2624 Input Parameters: 2625 . mat - the matrix 2626 2627 Output Parameter: 2628 . v - the vector for storing the maximums 2629 2630 Level: intermediate 2631 2632 Concepts: matrices^getting row maximums 2633 2634 .seealso: MatGetDiagonal(), MatGetSubmatrices(), MatGetSubmatrix() 2635 @*/ 2636 int MatGetRowMax(Mat mat,Vec v) 2637 { 2638 int ierr; 2639 2640 PetscFunctionBegin; 2641 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2642 PetscValidType(mat); 2643 MatPreallocated(mat); 2644 PetscValidHeaderSpecific(v,VEC_COOKIE); 2645 /* PetscCheckSameComm(mat,v); Could be MPI vector but Seq matrix cause of two submatrix storage */ 2646 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2647 if (!mat->ops->getrowmax) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 2648 2649 ierr = (*mat->ops->getrowmax)(mat,v);CHKERRQ(ierr); 2650 PetscFunctionReturn(0); 2651 } 2652 2653 #undef __FUNCT__ 2654 #define __FUNCT__ "MatTranspose" 2655 /*@C 2656 MatTranspose - Computes an in-place or out-of-place transpose of a matrix. 2657 2658 Collective on Mat 2659 2660 Input Parameter: 2661 . mat - the matrix to transpose 2662 2663 Output Parameters: 2664 . B - the transpose (or pass in PETSC_NULL for an in-place transpose) 2665 2666 Level: intermediate 2667 2668 Concepts: matrices^transposing 2669 2670 .seealso: MatMultTranspose(), MatMultTransposeAdd() 2671 @*/ 2672 int MatTranspose(Mat mat,Mat *B) 2673 { 2674 int ierr; 2675 2676 PetscFunctionBegin; 2677 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2678 PetscValidType(mat); 2679 MatPreallocated(mat); 2680 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2681 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2682 if (!mat->ops->transpose) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 2683 2684 ierr = PetscLogEventBegin(MAT_Transpose,mat,0,0,0);CHKERRQ(ierr); 2685 ierr = (*mat->ops->transpose)(mat,B);CHKERRQ(ierr); 2686 ierr = PetscLogEventEnd(MAT_Transpose,mat,0,0,0);CHKERRQ(ierr); 2687 PetscFunctionReturn(0); 2688 } 2689 2690 #undef __FUNCT__ 2691 #define __FUNCT__ "MatPermute" 2692 /*@C 2693 MatPermute - Creates a new matrix with rows and columns permuted from the 2694 original. 2695 2696 Collective on Mat 2697 2698 Input Parameters: 2699 + mat - the matrix to permute 2700 . row - row permutation, each processor supplies only the permutation for its rows 2701 - col - column permutation, each processor needs the entire column permutation, that is 2702 this is the same size as the total number of columns in the matrix 2703 2704 Output Parameters: 2705 . B - the permuted matrix 2706 2707 Level: advanced 2708 2709 Concepts: matrices^permuting 2710 2711 .seealso: MatGetOrdering() 2712 @*/ 2713 int MatPermute(Mat mat,IS row,IS col,Mat *B) 2714 { 2715 int ierr; 2716 2717 PetscFunctionBegin; 2718 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2719 PetscValidType(mat); 2720 MatPreallocated(mat); 2721 PetscValidHeaderSpecific(row,IS_COOKIE); 2722 PetscValidHeaderSpecific(col,IS_COOKIE); 2723 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2724 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2725 if (!mat->ops->permute) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 2726 ierr = (*mat->ops->permute)(mat,row,col,B);CHKERRQ(ierr); 2727 PetscFunctionReturn(0); 2728 } 2729 2730 #undef __FUNCT__ 2731 #define __FUNCT__ "MatPermuteSparsify" 2732 /*@C 2733 MatPermuteSparsify - Creates a new matrix with rows and columns permuted from the 2734 original and sparsified to the prescribed tolerance. 2735 2736 Collective on Mat 2737 2738 Input Parameters: 2739 + A - The matrix to permute 2740 . band - The half-bandwidth of the sparsified matrix, or PETSC_DECIDE 2741 . frac - The half-bandwidth as a fraction of the total size, or 0.0 2742 . tol - The drop tolerance 2743 . rowp - The row permutation 2744 - colp - The column permutation 2745 2746 Output Parameter: 2747 . B - The permuted, sparsified matrix 2748 2749 Level: advanced 2750 2751 Note: 2752 The default behavior (band = PETSC_DECIDE and frac = 0.0) is to 2753 restrict the half-bandwidth of the resulting matrix to 5% of the 2754 total matrix size. 2755 2756 .keywords: matrix, permute, sparsify 2757 2758 .seealso: MatGetOrdering(), MatPermute() 2759 @*/ 2760 int MatPermuteSparsify(Mat A, int band, PetscReal frac, PetscReal tol, IS rowp, IS colp, Mat *B) 2761 { 2762 IS irowp, icolp; 2763 int *rows, *cols; 2764 int M, N, locRowStart, locRowEnd; 2765 int nz, newNz; 2766 int *cwork, *cnew; 2767 PetscScalar *vwork, *vnew; 2768 int bw, size; 2769 int row, locRow, newRow, col, newCol; 2770 int ierr; 2771 2772 PetscFunctionBegin; 2773 PetscValidHeaderSpecific(A, MAT_COOKIE); 2774 PetscValidHeaderSpecific(rowp, IS_COOKIE); 2775 PetscValidHeaderSpecific(colp, IS_COOKIE); 2776 if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE, "Not for unassembled matrix"); 2777 if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE, "Not for factored matrix"); 2778 if (!A->ops->permutesparsify) { 2779 ierr = MatGetSize(A, &M, &N); CHKERRQ(ierr); 2780 ierr = MatGetOwnershipRange(A, &locRowStart, &locRowEnd); CHKERRQ(ierr); 2781 ierr = ISGetSize(rowp, &size); CHKERRQ(ierr); 2782 if (size != M) SETERRQ2(PETSC_ERR_ARG_WRONG, "Wrong size %d for row permutation, should be %d", size, M); 2783 ierr = ISGetSize(colp, &size); CHKERRQ(ierr); 2784 if (size != N) SETERRQ2(PETSC_ERR_ARG_WRONG, "Wrong size %d for column permutation, should be %d", size, N); 2785 ierr = ISInvertPermutation(rowp, 0, &irowp); CHKERRQ(ierr); 2786 ierr = ISGetIndices(irowp, &rows); CHKERRQ(ierr); 2787 ierr = ISInvertPermutation(colp, 0, &icolp); CHKERRQ(ierr); 2788 ierr = ISGetIndices(icolp, &cols); CHKERRQ(ierr); 2789 ierr = PetscMalloc(N * sizeof(int), &cnew); CHKERRQ(ierr); 2790 ierr = PetscMalloc(N * sizeof(PetscScalar), &vnew); CHKERRQ(ierr); 2791 2792 /* Setup bandwidth to include */ 2793 if (band == PETSC_DECIDE) { 2794 if (frac <= 0.0) 2795 bw = (int) (M * 0.05); 2796 else 2797 bw = (int) (M * frac); 2798 } else { 2799 if (band <= 0) SETERRQ(PETSC_ERR_ARG_WRONG, "Bandwidth must be a positive integer"); 2800 bw = band; 2801 } 2802 2803 /* Put values into new matrix */ 2804 ierr = MatDuplicate(A, MAT_DO_NOT_COPY_VALUES, B); CHKERRQ(ierr); 2805 for(row = locRowStart, locRow = 0; row < locRowEnd; row++, locRow++) { 2806 ierr = MatGetRow(A, row, &nz, &cwork, &vwork); CHKERRQ(ierr); 2807 newRow = rows[locRow]+locRowStart; 2808 for(col = 0, newNz = 0; col < nz; col++) { 2809 newCol = cols[cwork[col]]; 2810 if ((newCol >= newRow - bw) && (newCol < newRow + bw) && (PetscAbsScalar(vwork[col]) >= tol)) { 2811 cnew[newNz] = newCol; 2812 vnew[newNz] = vwork[col]; 2813 newNz++; 2814 } 2815 } 2816 ierr = MatSetValues(*B, 1, &newRow, newNz, cnew, vnew, INSERT_VALUES); CHKERRQ(ierr); 2817 ierr = MatRestoreRow(A, row, &nz, &cwork, &vwork); CHKERRQ(ierr); 2818 } 2819 ierr = PetscFree(cnew); CHKERRQ(ierr); 2820 ierr = PetscFree(vnew); CHKERRQ(ierr); 2821 ierr = MatAssemblyBegin(*B, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); 2822 ierr = MatAssemblyEnd(*B, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); 2823 ierr = ISRestoreIndices(irowp, &rows); CHKERRQ(ierr); 2824 ierr = ISRestoreIndices(icolp, &cols); CHKERRQ(ierr); 2825 ierr = ISDestroy(irowp); CHKERRQ(ierr); 2826 ierr = ISDestroy(icolp); CHKERRQ(ierr); 2827 } else { 2828 ierr = (*A->ops->permutesparsify)(A, band, frac, tol, rowp, colp, B); CHKERRQ(ierr); 2829 } 2830 PetscFunctionReturn(0); 2831 } 2832 2833 #undef __FUNCT__ 2834 #define __FUNCT__ "MatEqual" 2835 /*@ 2836 MatEqual - Compares two matrices. 2837 2838 Collective on Mat 2839 2840 Input Parameters: 2841 + A - the first matrix 2842 - B - the second matrix 2843 2844 Output Parameter: 2845 . flg - PETSC_TRUE if the matrices are equal; PETSC_FALSE otherwise. 2846 2847 Level: intermediate 2848 2849 Concepts: matrices^equality between 2850 @*/ 2851 int MatEqual(Mat A,Mat B,PetscTruth *flg) 2852 { 2853 int ierr; 2854 2855 PetscFunctionBegin; 2856 PetscValidHeaderSpecific(A,MAT_COOKIE); 2857 PetscValidHeaderSpecific(B,MAT_COOKIE); 2858 PetscValidType(A); 2859 MatPreallocated(A); 2860 PetscValidType(B); 2861 MatPreallocated(B); 2862 PetscValidIntPointer(flg); 2863 PetscCheckSameComm(A,B); 2864 if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2865 if (!B->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2866 if (A->M != B->M || A->N != B->N) SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat A,Mat B: global dim %d %d %d %d",A->M,B->M,A->N,B->N); 2867 if (!A->ops->equal) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",A->type_name); 2868 ierr = (*A->ops->equal)(A,B,flg);CHKERRQ(ierr); 2869 PetscFunctionReturn(0); 2870 } 2871 2872 #undef __FUNCT__ 2873 #define __FUNCT__ "MatDiagonalScale" 2874 /*@ 2875 MatDiagonalScale - Scales a matrix on the left and right by diagonal 2876 matrices that are stored as vectors. Either of the two scaling 2877 matrices can be PETSC_NULL. 2878 2879 Collective on Mat 2880 2881 Input Parameters: 2882 + mat - the matrix to be scaled 2883 . l - the left scaling vector (or PETSC_NULL) 2884 - r - the right scaling vector (or PETSC_NULL) 2885 2886 Notes: 2887 MatDiagonalScale() computes A = LAR, where 2888 L = a diagonal matrix, R = a diagonal matrix 2889 2890 Level: intermediate 2891 2892 Concepts: matrices^diagonal scaling 2893 Concepts: diagonal scaling of matrices 2894 2895 .seealso: MatScale() 2896 @*/ 2897 int MatDiagonalScale(Mat mat,Vec l,Vec r) 2898 { 2899 int ierr; 2900 2901 PetscFunctionBegin; 2902 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2903 PetscValidType(mat); 2904 MatPreallocated(mat); 2905 if (!mat->ops->diagonalscale) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 2906 if (l) {PetscValidHeaderSpecific(l,VEC_COOKIE);PetscCheckSameComm(mat,l);} 2907 if (r) {PetscValidHeaderSpecific(r,VEC_COOKIE);PetscCheckSameComm(mat,r);} 2908 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2909 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2910 2911 ierr = PetscLogEventBegin(MAT_Scale,mat,0,0,0);CHKERRQ(ierr); 2912 ierr = (*mat->ops->diagonalscale)(mat,l,r);CHKERRQ(ierr); 2913 ierr = PetscLogEventEnd(MAT_Scale,mat,0,0,0);CHKERRQ(ierr); 2914 PetscFunctionReturn(0); 2915 } 2916 2917 #undef __FUNCT__ 2918 #define __FUNCT__ "MatScale" 2919 /*@ 2920 MatScale - Scales all elements of a matrix by a given number. 2921 2922 Collective on Mat 2923 2924 Input Parameters: 2925 + mat - the matrix to be scaled 2926 - a - the scaling value 2927 2928 Output Parameter: 2929 . mat - the scaled matrix 2930 2931 Level: intermediate 2932 2933 Concepts: matrices^scaling all entries 2934 2935 .seealso: MatDiagonalScale() 2936 @*/ 2937 int MatScale(PetscScalar *a,Mat mat) 2938 { 2939 int ierr; 2940 2941 PetscFunctionBegin; 2942 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2943 PetscValidType(mat); 2944 MatPreallocated(mat); 2945 PetscValidScalarPointer(a); 2946 if (!mat->ops->scale) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 2947 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2948 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2949 2950 ierr = PetscLogEventBegin(MAT_Scale,mat,0,0,0);CHKERRQ(ierr); 2951 ierr = (*mat->ops->scale)(a,mat);CHKERRQ(ierr); 2952 ierr = PetscLogEventEnd(MAT_Scale,mat,0,0,0);CHKERRQ(ierr); 2953 PetscFunctionReturn(0); 2954 } 2955 2956 #undef __FUNCT__ 2957 #define __FUNCT__ "MatNorm" 2958 /*@ 2959 MatNorm - Calculates various norms of a matrix. 2960 2961 Collective on Mat 2962 2963 Input Parameters: 2964 + mat - the matrix 2965 - type - the type of norm, NORM_1, NORM_FROBENIUS, NORM_INFINITY 2966 2967 Output Parameters: 2968 . nrm - the resulting norm 2969 2970 Level: intermediate 2971 2972 Concepts: matrices^norm 2973 Concepts: norm^of matrix 2974 @*/ 2975 int MatNorm(Mat mat,NormType type,PetscReal *nrm) 2976 { 2977 int ierr; 2978 2979 PetscFunctionBegin; 2980 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2981 PetscValidType(mat); 2982 MatPreallocated(mat); 2983 PetscValidScalarPointer(nrm); 2984 2985 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2986 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2987 if (!mat->ops->norm) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 2988 ierr = (*mat->ops->norm)(mat,type,nrm);CHKERRQ(ierr); 2989 PetscFunctionReturn(0); 2990 } 2991 2992 /* 2993 This variable is used to prevent counting of MatAssemblyBegin() that 2994 are called from within a MatAssemblyEnd(). 2995 */ 2996 static int MatAssemblyEnd_InUse = 0; 2997 #undef __FUNCT__ 2998 #define __FUNCT__ "MatAssemblyBegin" 2999 /*@ 3000 MatAssemblyBegin - Begins assembling the matrix. This routine should 3001 be called after completing all calls to MatSetValues(). 3002 3003 Collective on Mat 3004 3005 Input Parameters: 3006 + mat - the matrix 3007 - type - type of assembly, either MAT_FLUSH_ASSEMBLY or MAT_FINAL_ASSEMBLY 3008 3009 Notes: 3010 MatSetValues() generally caches the values. The matrix is ready to 3011 use only after MatAssemblyBegin() and MatAssemblyEnd() have been called. 3012 Use MAT_FLUSH_ASSEMBLY when switching between ADD_VALUES and INSERT_VALUES 3013 in MatSetValues(); use MAT_FINAL_ASSEMBLY for the final assembly before 3014 using the matrix. 3015 3016 Level: beginner 3017 3018 Concepts: matrices^assembling 3019 3020 .seealso: MatAssemblyEnd(), MatSetValues(), MatAssembled() 3021 @*/ 3022 int MatAssemblyBegin(Mat mat,MatAssemblyType type) 3023 { 3024 int ierr; 3025 3026 PetscFunctionBegin; 3027 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3028 PetscValidType(mat); 3029 MatPreallocated(mat); 3030 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix.\nDid you forget to call MatSetUnfactored()?"); 3031 if (mat->assembled) { 3032 mat->was_assembled = PETSC_TRUE; 3033 mat->assembled = PETSC_FALSE; 3034 } 3035 if (!MatAssemblyEnd_InUse) { 3036 ierr = PetscLogEventBegin(MAT_AssemblyBegin,mat,0,0,0);CHKERRQ(ierr); 3037 if (mat->ops->assemblybegin){ierr = (*mat->ops->assemblybegin)(mat,type);CHKERRQ(ierr);} 3038 ierr = PetscLogEventEnd(MAT_AssemblyBegin,mat,0,0,0);CHKERRQ(ierr); 3039 } else { 3040 if (mat->ops->assemblybegin){ierr = (*mat->ops->assemblybegin)(mat,type);CHKERRQ(ierr);} 3041 } 3042 PetscFunctionReturn(0); 3043 } 3044 3045 #undef __FUNCT__ 3046 #define __FUNCT__ "MatAssembed" 3047 /*@ 3048 MatAssembled - Indicates if a matrix has been assembled and is ready for 3049 use; for example, in matrix-vector product. 3050 3051 Collective on Mat 3052 3053 Input Parameter: 3054 . mat - the matrix 3055 3056 Output Parameter: 3057 . assembled - PETSC_TRUE or PETSC_FALSE 3058 3059 Level: advanced 3060 3061 Concepts: matrices^assembled? 3062 3063 .seealso: MatAssemblyEnd(), MatSetValues(), MatAssemblyBegin() 3064 @*/ 3065 int MatAssembled(Mat mat,PetscTruth *assembled) 3066 { 3067 PetscFunctionBegin; 3068 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3069 PetscValidType(mat); 3070 MatPreallocated(mat); 3071 *assembled = mat->assembled; 3072 PetscFunctionReturn(0); 3073 } 3074 3075 #undef __FUNCT__ 3076 #define __FUNCT__ "MatView_Private" 3077 /* 3078 Processes command line options to determine if/how a matrix 3079 is to be viewed. Called by MatAssemblyEnd() and MatLoad(). 3080 */ 3081 int MatView_Private(Mat mat) 3082 { 3083 int ierr; 3084 PetscTruth flg; 3085 static PetscTruth incall = PETSC_FALSE; 3086 3087 PetscFunctionBegin; 3088 if (incall) PetscFunctionReturn(0); 3089 incall = PETSC_TRUE; 3090 ierr = PetscOptionsBegin(mat->comm,mat->prefix,"Matrix Options","Mat");CHKERRQ(ierr); 3091 ierr = PetscOptionsName("-mat_view_info","Information on matrix size","MatView",&flg);CHKERRQ(ierr); 3092 if (flg) { 3093 ierr = PetscViewerPushFormat(PETSC_VIEWER_STDOUT_(mat->comm),PETSC_VIEWER_ASCII_INFO);CHKERRQ(ierr); 3094 ierr = MatView(mat,PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr); 3095 ierr = PetscViewerPopFormat(PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr); 3096 } 3097 ierr = PetscOptionsName("-mat_view_info_detailed","Nonzeros in the matrix","MatView",&flg);CHKERRQ(ierr); 3098 if (flg) { 3099 ierr = PetscViewerPushFormat(PETSC_VIEWER_STDOUT_(mat->comm),PETSC_VIEWER_ASCII_INFO_DETAIL);CHKERRQ(ierr); 3100 ierr = MatView(mat,PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr); 3101 ierr = PetscViewerPopFormat(PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr); 3102 } 3103 ierr = PetscOptionsName("-mat_view","Print matrix to stdout","MatView",&flg);CHKERRQ(ierr); 3104 if (flg) { 3105 ierr = MatView(mat,PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr); 3106 } 3107 ierr = PetscOptionsName("-mat_view_matlab","Print matrix to stdout in a format Matlab can read","MatView",&flg);CHKERRQ(ierr); 3108 if (flg) { 3109 ierr = PetscViewerPushFormat(PETSC_VIEWER_STDOUT_(mat->comm),PETSC_VIEWER_ASCII_MATLAB);CHKERRQ(ierr); 3110 ierr = MatView(mat,PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr); 3111 ierr = PetscViewerPopFormat(PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr); 3112 } 3113 ierr = PetscOptionsName("-mat_view_socket","Send matrix to socket (can be read from matlab)","MatView",&flg);CHKERRQ(ierr); 3114 if (flg) { 3115 ierr = MatView(mat,PETSC_VIEWER_SOCKET_(mat->comm));CHKERRQ(ierr); 3116 ierr = PetscViewerFlush(PETSC_VIEWER_SOCKET_(mat->comm));CHKERRQ(ierr); 3117 } 3118 ierr = PetscOptionsName("-mat_view_binary","Save matrix to file in binary format","MatView",&flg);CHKERRQ(ierr); 3119 if (flg) { 3120 ierr = MatView(mat,PETSC_VIEWER_BINARY_(mat->comm));CHKERRQ(ierr); 3121 ierr = PetscViewerFlush(PETSC_VIEWER_BINARY_(mat->comm));CHKERRQ(ierr); 3122 } 3123 ierr = PetscOptionsEnd();CHKERRQ(ierr); 3124 /* cannot have inside PetscOptionsBegin() because uses PetscOptionsBegin() */ 3125 ierr = PetscOptionsHasName(mat->prefix,"-mat_view_draw",&flg);CHKERRQ(ierr); 3126 if (flg) { 3127 ierr = PetscOptionsHasName(mat->prefix,"-mat_view_contour",&flg);CHKERRQ(ierr); 3128 if (flg) { 3129 PetscViewerPushFormat(PETSC_VIEWER_DRAW_(mat->comm),PETSC_VIEWER_DRAW_CONTOUR);CHKERRQ(ierr); 3130 } 3131 ierr = MatView(mat,PETSC_VIEWER_DRAW_(mat->comm));CHKERRQ(ierr); 3132 ierr = PetscViewerFlush(PETSC_VIEWER_DRAW_(mat->comm));CHKERRQ(ierr); 3133 if (flg) { 3134 PetscViewerPopFormat(PETSC_VIEWER_DRAW_(mat->comm));CHKERRQ(ierr); 3135 } 3136 } 3137 incall = PETSC_FALSE; 3138 PetscFunctionReturn(0); 3139 } 3140 3141 #undef __FUNCT__ 3142 #define __FUNCT__ "MatAssemblyEnd" 3143 /*@ 3144 MatAssemblyEnd - Completes assembling the matrix. This routine should 3145 be called after MatAssemblyBegin(). 3146 3147 Collective on Mat 3148 3149 Input Parameters: 3150 + mat - the matrix 3151 - type - type of assembly, either MAT_FLUSH_ASSEMBLY or MAT_FINAL_ASSEMBLY 3152 3153 Options Database Keys: 3154 + -mat_view_info - Prints info on matrix at conclusion of MatEndAssembly() 3155 . -mat_view_info_detailed - Prints more detailed info 3156 . -mat_view - Prints matrix in ASCII format 3157 . -mat_view_matlab - Prints matrix in Matlab format 3158 . -mat_view_draw - PetscDraws nonzero structure of matrix, using MatView() and PetscDrawOpenX(). 3159 . -display <name> - Sets display name (default is host) 3160 . -draw_pause <sec> - Sets number of seconds to pause after display 3161 . -mat_view_socket - Sends matrix to socket, can be accessed from Matlab (see users manual) 3162 . -viewer_socket_machine <machine> 3163 . -viewer_socket_port <port> 3164 . -mat_view_binary - save matrix to file in binary format 3165 - -viewer_binary_filename <name> 3166 3167 Notes: 3168 MatSetValues() generally caches the values. The matrix is ready to 3169 use only after MatAssemblyBegin() and MatAssemblyEnd() have been called. 3170 Use MAT_FLUSH_ASSEMBLY when switching between ADD_VALUES and INSERT_VALUES 3171 in MatSetValues(); use MAT_FINAL_ASSEMBLY for the final assembly before 3172 using the matrix. 3173 3174 Level: beginner 3175 3176 .seealso: MatAssemblyBegin(), MatSetValues(), PetscDrawOpenX(), MatView(), MatAssembled(), PetscViewerSocketOpen() 3177 @*/ 3178 int MatAssemblyEnd(Mat mat,MatAssemblyType type) 3179 { 3180 int ierr; 3181 static int inassm = 0; 3182 PetscTruth flg; 3183 3184 PetscFunctionBegin; 3185 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3186 PetscValidType(mat); 3187 MatPreallocated(mat); 3188 3189 inassm++; 3190 MatAssemblyEnd_InUse++; 3191 if (MatAssemblyEnd_InUse == 1) { /* Do the logging only the first time through */ 3192 ierr = PetscLogEventBegin(MAT_AssemblyEnd,mat,0,0,0);CHKERRQ(ierr); 3193 if (mat->ops->assemblyend) { 3194 ierr = (*mat->ops->assemblyend)(mat,type);CHKERRQ(ierr); 3195 } 3196 ierr = PetscLogEventEnd(MAT_AssemblyEnd,mat,0,0,0);CHKERRQ(ierr); 3197 } else { 3198 if (mat->ops->assemblyend) { 3199 ierr = (*mat->ops->assemblyend)(mat,type);CHKERRQ(ierr); 3200 } 3201 } 3202 3203 /* Flush assembly is not a true assembly */ 3204 if (type != MAT_FLUSH_ASSEMBLY) { 3205 mat->assembled = PETSC_TRUE; mat->num_ass++; 3206 } 3207 mat->insertmode = NOT_SET_VALUES; 3208 MatAssemblyEnd_InUse--; 3209 3210 if (inassm == 1 && type != MAT_FLUSH_ASSEMBLY) { 3211 ierr = MatView_Private(mat);CHKERRQ(ierr); 3212 } 3213 inassm--; 3214 ierr = PetscOptionsHasName(mat->prefix,"-help",&flg);CHKERRQ(ierr); 3215 if (flg) { 3216 ierr = MatPrintHelp(mat);CHKERRQ(ierr); 3217 } 3218 PetscFunctionReturn(0); 3219 } 3220 3221 3222 #undef __FUNCT__ 3223 #define __FUNCT__ "MatCompress" 3224 /*@ 3225 MatCompress - Tries to store the matrix in as little space as 3226 possible. May fail if memory is already fully used, since it 3227 tries to allocate new space. 3228 3229 Collective on Mat 3230 3231 Input Parameters: 3232 . mat - the matrix 3233 3234 Level: advanced 3235 3236 @*/ 3237 int MatCompress(Mat mat) 3238 { 3239 int ierr; 3240 3241 PetscFunctionBegin; 3242 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3243 PetscValidType(mat); 3244 MatPreallocated(mat); 3245 if (mat->ops->compress) {ierr = (*mat->ops->compress)(mat);CHKERRQ(ierr);} 3246 PetscFunctionReturn(0); 3247 } 3248 3249 #undef __FUNCT__ 3250 #define __FUNCT__ "MatSetOption" 3251 /*@ 3252 MatSetOption - Sets a parameter option for a matrix. Some options 3253 may be specific to certain storage formats. Some options 3254 determine how values will be inserted (or added). Sorted, 3255 row-oriented input will generally assemble the fastest. The default 3256 is row-oriented, nonsorted input. 3257 3258 Collective on Mat 3259 3260 Input Parameters: 3261 + mat - the matrix 3262 - option - the option, one of those listed below (and possibly others), 3263 e.g., MAT_ROWS_SORTED, MAT_NEW_NONZERO_LOCATION_ERR 3264 3265 Options Describing Matrix Structure: 3266 + MAT_SYMMETRIC - symmetric in terms of both structure and value 3267 - MAT_STRUCTURALLY_SYMMETRIC - symmetric nonzero structure 3268 3269 Options For Use with MatSetValues(): 3270 Insert a logically dense subblock, which can be 3271 + MAT_ROW_ORIENTED - row-oriented (default) 3272 . MAT_COLUMN_ORIENTED - column-oriented 3273 . MAT_ROWS_SORTED - sorted by row 3274 . MAT_ROWS_UNSORTED - not sorted by row (default) 3275 . MAT_COLUMNS_SORTED - sorted by column 3276 - MAT_COLUMNS_UNSORTED - not sorted by column (default) 3277 3278 Not these options reflect the data you pass in with MatSetValues(); it has 3279 nothing to do with how the data is stored internally in the matrix 3280 data structure. 3281 3282 When (re)assembling a matrix, we can restrict the input for 3283 efficiency/debugging purposes. These options include 3284 + MAT_NO_NEW_NONZERO_LOCATIONS - additional insertions will not be 3285 allowed if they generate a new nonzero 3286 . MAT_YES_NEW_NONZERO_LOCATIONS - additional insertions will be allowed 3287 . MAT_NO_NEW_DIAGONALS - additional insertions will not be allowed if 3288 they generate a nonzero in a new diagonal (for block diagonal format only) 3289 . MAT_YES_NEW_DIAGONALS - new diagonals will be allowed (for block diagonal format only) 3290 . MAT_IGNORE_OFF_PROC_ENTRIES - drops off-processor entries 3291 . MAT_NEW_NONZERO_LOCATION_ERR - generates an error for new matrix entry 3292 - MAT_USE_HASH_TABLE - uses a hash table to speed up matrix assembly 3293 3294 Notes: 3295 Some options are relevant only for particular matrix types and 3296 are thus ignored by others. Other options are not supported by 3297 certain matrix types and will generate an error message if set. 3298 3299 If using a Fortran 77 module to compute a matrix, one may need to 3300 use the column-oriented option (or convert to the row-oriented 3301 format). 3302 3303 MAT_NO_NEW_NONZERO_LOCATIONS indicates that any add or insertion 3304 that would generate a new entry in the nonzero structure is instead 3305 ignored. Thus, if memory has not alredy been allocated for this particular 3306 data, then the insertion is ignored. For dense matrices, in which 3307 the entire array is allocated, no entries are ever ignored. 3308 Set after the first MatAssemblyEnd() 3309 3310 MAT_NEW_NONZERO_LOCATION_ERR indicates that any add or insertion 3311 that would generate a new entry in the nonzero structure instead produces 3312 an error. (Currently supported for AIJ and BAIJ formats only.) 3313 This is a useful flag when using SAME_NONZERO_PATTERN in calling 3314 SLESSetOperators() to ensure that the nonzero pattern truely does 3315 remain unchanged. Set after the first MatAssemblyEnd() 3316 3317 MAT_NEW_NONZERO_ALLOCATION_ERR indicates that any add or insertion 3318 that would generate a new entry that has not been preallocated will 3319 instead produce an error. (Currently supported for AIJ and BAIJ formats 3320 only.) This is a useful flag when debugging matrix memory preallocation. 3321 3322 MAT_IGNORE_OFF_PROC_ENTRIES indicates entries destined for 3323 other processors should be dropped, rather than stashed. 3324 This is useful if you know that the "owning" processor is also 3325 always generating the correct matrix entries, so that PETSc need 3326 not transfer duplicate entries generated on another processor. 3327 3328 MAT_USE_HASH_TABLE indicates that a hash table be used to improve the 3329 searches during matrix assembly. When this flag is set, the hash table 3330 is created during the first Matrix Assembly. This hash table is 3331 used the next time through, during MatSetVaules()/MatSetVaulesBlocked() 3332 to improve the searching of indices. MAT_NO_NEW_NONZERO_LOCATIONS flag 3333 should be used with MAT_USE_HASH_TABLE flag. This option is currently 3334 supported by MATMPIBAIJ format only. 3335 3336 MAT_KEEP_ZEROED_ROWS indicates when MatZeroRows() is called the zeroed entries 3337 are kept in the nonzero structure 3338 3339 MAT_IGNORE_ZERO_ENTRIES - when using ADD_VALUES for AIJ matrices this will stop 3340 zero values from creating a zero location in the matrix 3341 3342 MAT_USE_INODES - indicates using inode version of the code - works with AIJ and 3343 ROWBS matrix types 3344 3345 MAT_DO_NOT_USE_INODES - indicates not using inode version of the code - works 3346 with AIJ and ROWBS matrix types 3347 3348 Level: intermediate 3349 3350 Concepts: matrices^setting options 3351 3352 @*/ 3353 int MatSetOption(Mat mat,MatOption op) 3354 { 3355 int ierr; 3356 3357 PetscFunctionBegin; 3358 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3359 PetscValidType(mat); 3360 MatPreallocated(mat); 3361 switch (op) { 3362 case MAT_SYMMETRIC: 3363 mat->symmetric = PETSC_TRUE; 3364 mat->structurally_symmetric = PETSC_TRUE; 3365 break; 3366 case MAT_STRUCTURALLY_SYMMETRIC: 3367 mat->structurally_symmetric = PETSC_TRUE; 3368 break; 3369 default: 3370 if (mat->ops->setoption) {ierr = (*mat->ops->setoption)(mat,op);CHKERRQ(ierr);} 3371 break; 3372 } 3373 PetscFunctionReturn(0); 3374 } 3375 3376 #undef __FUNCT__ 3377 #define __FUNCT__ "MatZeroEntries" 3378 /*@ 3379 MatZeroEntries - Zeros all entries of a matrix. For sparse matrices 3380 this routine retains the old nonzero structure. 3381 3382 Collective on Mat 3383 3384 Input Parameters: 3385 . mat - the matrix 3386 3387 Level: intermediate 3388 3389 Concepts: matrices^zeroing 3390 3391 .seealso: MatZeroRows() 3392 @*/ 3393 int MatZeroEntries(Mat mat) 3394 { 3395 int ierr; 3396 3397 PetscFunctionBegin; 3398 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3399 PetscValidType(mat); 3400 MatPreallocated(mat); 3401 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 3402 if (!mat->ops->zeroentries) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 3403 3404 ierr = PetscLogEventBegin(MAT_ZeroEntries,mat,0,0,0);CHKERRQ(ierr); 3405 ierr = (*mat->ops->zeroentries)(mat);CHKERRQ(ierr); 3406 ierr = PetscLogEventEnd(MAT_ZeroEntries,mat,0,0,0);CHKERRQ(ierr); 3407 PetscFunctionReturn(0); 3408 } 3409 3410 #undef __FUNCT__ 3411 #define __FUNCT__ "MatZeroRows" 3412 /*@C 3413 MatZeroRows - Zeros all entries (except possibly the main diagonal) 3414 of a set of rows of a matrix. 3415 3416 Collective on Mat 3417 3418 Input Parameters: 3419 + mat - the matrix 3420 . is - index set of rows to remove 3421 - diag - pointer to value put in all diagonals of eliminated rows. 3422 Note that diag is not a pointer to an array, but merely a 3423 pointer to a single value. 3424 3425 Notes: 3426 For the AIJ and BAIJ matrix formats this removes the old nonzero structure, 3427 but does not release memory. For the dense and block diagonal 3428 formats this does not alter the nonzero structure. 3429 3430 If the option MatSetOption(mat,MAT_KEEP_ZEROED_ROWS) the nonzero structure 3431 of the matrix is not changed (even for AIJ and BAIJ matrices) the values are 3432 merely zeroed. 3433 3434 The user can set a value in the diagonal entry (or for the AIJ and 3435 row formats can optionally remove the main diagonal entry from the 3436 nonzero structure as well, by passing a null pointer (PETSC_NULL 3437 in C or PETSC_NULL_SCALAR in Fortran) as the final argument). 3438 3439 For the parallel case, all processes that share the matrix (i.e., 3440 those in the communicator used for matrix creation) MUST call this 3441 routine, regardless of whether any rows being zeroed are owned by 3442 them. 3443 3444 For the SBAIJ matrix (since only the upper triangular half of the matrix 3445 is stored) the effect of this call is to also zero the corresponding 3446 column. 3447 3448 Level: intermediate 3449 3450 Concepts: matrices^zeroing rows 3451 3452 .seealso: MatZeroEntries(), MatZeroRowsLocal(), MatSetOption() 3453 @*/ 3454 int MatZeroRows(Mat mat,IS is,PetscScalar *diag) 3455 { 3456 int ierr; 3457 3458 PetscFunctionBegin; 3459 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3460 PetscValidType(mat); 3461 MatPreallocated(mat); 3462 PetscValidHeaderSpecific(is,IS_COOKIE); 3463 if (diag) PetscValidScalarPointer(diag); 3464 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3465 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 3466 if (!mat->ops->zerorows) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 3467 3468 ierr = (*mat->ops->zerorows)(mat,is,diag);CHKERRQ(ierr); 3469 ierr = MatView_Private(mat);CHKERRQ(ierr); 3470 PetscFunctionReturn(0); 3471 } 3472 3473 #undef __FUNCT__ 3474 #define __FUNCT__ "MatZeroRowsLocal" 3475 /*@C 3476 MatZeroRowsLocal - Zeros all entries (except possibly the main diagonal) 3477 of a set of rows of a matrix; using local numbering of rows. 3478 3479 Collective on Mat 3480 3481 Input Parameters: 3482 + mat - the matrix 3483 . is - index set of rows to remove 3484 - diag - pointer to value put in all diagonals of eliminated rows. 3485 Note that diag is not a pointer to an array, but merely a 3486 pointer to a single value. 3487 3488 Notes: 3489 Before calling MatZeroRowsLocal(), the user must first set the 3490 local-to-global mapping by calling MatSetLocalToGlobalMapping(). 3491 3492 For the AIJ matrix formats this removes the old nonzero structure, 3493 but does not release memory. For the dense and block diagonal 3494 formats this does not alter the nonzero structure. 3495 3496 If the option MatSetOption(mat,MAT_KEEP_ZEROED_ROWS) the nonzero structure 3497 of the matrix is not changed (even for AIJ and BAIJ matrices) the values are 3498 merely zeroed. 3499 3500 The user can set a value in the diagonal entry (or for the AIJ and 3501 row formats can optionally remove the main diagonal entry from the 3502 nonzero structure as well, by passing a null pointer (PETSC_NULL 3503 in C or PETSC_NULL_SCALAR in Fortran) as the final argument). 3504 3505 Level: intermediate 3506 3507 Concepts: matrices^zeroing 3508 3509 .seealso: MatZeroEntries(), MatZeroRows(), MatSetLocalToGlobalMapping 3510 @*/ 3511 int MatZeroRowsLocal(Mat mat,IS is,PetscScalar *diag) 3512 { 3513 int ierr; 3514 IS newis; 3515 3516 PetscFunctionBegin; 3517 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3518 PetscValidType(mat); 3519 MatPreallocated(mat); 3520 PetscValidHeaderSpecific(is,IS_COOKIE); 3521 if (diag) PetscValidScalarPointer(diag); 3522 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3523 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 3524 3525 if (mat->ops->zerorowslocal) { 3526 ierr = (*mat->ops->zerorowslocal)(mat,is,diag);CHKERRQ(ierr); 3527 } else { 3528 if (!mat->mapping) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Need to provide local to global mapping to matrix first"); 3529 ierr = ISLocalToGlobalMappingApplyIS(mat->mapping,is,&newis);CHKERRQ(ierr); 3530 ierr = (*mat->ops->zerorows)(mat,newis,diag);CHKERRQ(ierr); 3531 ierr = ISDestroy(newis);CHKERRQ(ierr); 3532 } 3533 PetscFunctionReturn(0); 3534 } 3535 3536 #undef __FUNCT__ 3537 #define __FUNCT__ "MatGetSize" 3538 /*@ 3539 MatGetSize - Returns the numbers of rows and columns in a matrix. 3540 3541 Not Collective 3542 3543 Input Parameter: 3544 . mat - the matrix 3545 3546 Output Parameters: 3547 + m - the number of global rows 3548 - n - the number of global columns 3549 3550 Level: beginner 3551 3552 Concepts: matrices^size 3553 3554 .seealso: MatGetLocalSize() 3555 @*/ 3556 int MatGetSize(Mat mat,int *m,int* n) 3557 { 3558 PetscFunctionBegin; 3559 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3560 if (m) *m = mat->M; 3561 if (n) *n = mat->N; 3562 PetscFunctionReturn(0); 3563 } 3564 3565 #undef __FUNCT__ 3566 #define __FUNCT__ "MatGetLocalSize" 3567 /*@ 3568 MatGetLocalSize - Returns the number of rows and columns in a matrix 3569 stored locally. This information may be implementation dependent, so 3570 use with care. 3571 3572 Not Collective 3573 3574 Input Parameters: 3575 . mat - the matrix 3576 3577 Output Parameters: 3578 + m - the number of local rows 3579 - n - the number of local columns 3580 3581 Level: beginner 3582 3583 Concepts: matrices^local size 3584 3585 .seealso: MatGetSize() 3586 @*/ 3587 int MatGetLocalSize(Mat mat,int *m,int* n) 3588 { 3589 PetscFunctionBegin; 3590 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3591 if (m) *m = mat->m; 3592 if (n) *n = mat->n; 3593 PetscFunctionReturn(0); 3594 } 3595 3596 #undef __FUNCT__ 3597 #define __FUNCT__ "MatGetOwnershipRange" 3598 /*@ 3599 MatGetOwnershipRange - Returns the range of matrix rows owned by 3600 this processor, assuming that the matrix is laid out with the first 3601 n1 rows on the first processor, the next n2 rows on the second, etc. 3602 For certain parallel layouts this range may not be well defined. 3603 3604 Not Collective 3605 3606 Input Parameters: 3607 . mat - the matrix 3608 3609 Output Parameters: 3610 + m - the global index of the first local row 3611 - n - one more than the global index of the last local row 3612 3613 Level: beginner 3614 3615 Concepts: matrices^row ownership 3616 @*/ 3617 int MatGetOwnershipRange(Mat mat,int *m,int* n) 3618 { 3619 int ierr; 3620 3621 PetscFunctionBegin; 3622 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3623 PetscValidType(mat); 3624 MatPreallocated(mat); 3625 if (m) PetscValidIntPointer(m); 3626 if (n) PetscValidIntPointer(n); 3627 ierr = PetscMapGetLocalRange(mat->rmap,m,n);CHKERRQ(ierr); 3628 PetscFunctionReturn(0); 3629 } 3630 3631 #undef __FUNCT__ 3632 #define __FUNCT__ "MatILUFactorSymbolic" 3633 /*@ 3634 MatILUFactorSymbolic - Performs symbolic ILU factorization of a matrix. 3635 Uses levels of fill only, not drop tolerance. Use MatLUFactorNumeric() 3636 to complete the factorization. 3637 3638 Collective on Mat 3639 3640 Input Parameters: 3641 + mat - the matrix 3642 . row - row permutation 3643 . column - column permutation 3644 - info - structure containing 3645 $ levels - number of levels of fill. 3646 $ expected fill - as ratio of original fill. 3647 $ 1 or 0 - indicating force fill on diagonal (improves robustness for matrices 3648 missing diagonal entries) 3649 3650 Output Parameters: 3651 . fact - new matrix that has been symbolically factored 3652 3653 Notes: 3654 See the users manual for additional information about 3655 choosing the fill factor for better efficiency. 3656 3657 Most users should employ the simplified SLES interface for linear solvers 3658 instead of working directly with matrix algebra routines such as this. 3659 See, e.g., SLESCreate(). 3660 3661 Level: developer 3662 3663 Concepts: matrices^symbolic LU factorization 3664 Concepts: matrices^factorization 3665 Concepts: LU^symbolic factorization 3666 3667 .seealso: MatLUFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor() 3668 MatGetOrdering(), MatILUInfo 3669 3670 @*/ 3671 int MatILUFactorSymbolic(Mat mat,IS row,IS col,MatILUInfo *info,Mat *fact) 3672 { 3673 int ierr; 3674 3675 PetscFunctionBegin; 3676 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3677 PetscValidType(mat); 3678 MatPreallocated(mat); 3679 PetscValidPointer(fact); 3680 PetscValidHeaderSpecific(row,IS_COOKIE); 3681 PetscValidHeaderSpecific(col,IS_COOKIE); 3682 if (info->levels < 0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Levels of fill negative %d",(int)info->levels); 3683 if (info->fill < 1.0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Expected fill less than 1.0 %g",info->fill); 3684 if (!mat->ops->ilufactorsymbolic) SETERRQ1(PETSC_ERR_SUP,"Matrix type %s symbolic ILU",mat->type_name); 3685 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3686 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 3687 3688 ierr = PetscLogEventBegin(MAT_ILUFactorSymbolic,mat,row,col,0);CHKERRQ(ierr); 3689 ierr = (*mat->ops->ilufactorsymbolic)(mat,row,col,info,fact);CHKERRQ(ierr); 3690 ierr = PetscLogEventEnd(MAT_ILUFactorSymbolic,mat,row,col,0);CHKERRQ(ierr); 3691 PetscFunctionReturn(0); 3692 } 3693 3694 #undef __FUNCT__ 3695 #define __FUNCT__ "MatICCFactorSymbolic" 3696 /*@ 3697 MatICCFactorSymbolic - Performs symbolic incomplete 3698 Cholesky factorization for a symmetric matrix. Use 3699 MatCholeskyFactorNumeric() to complete the factorization. 3700 3701 Collective on Mat 3702 3703 Input Parameters: 3704 + mat - the matrix 3705 . perm - row and column permutation 3706 . fill - levels of fill 3707 - f - expected fill as ratio of original fill 3708 3709 Output Parameter: 3710 . fact - the factored matrix 3711 3712 Notes: 3713 Currently only no-fill factorization is supported. 3714 3715 Most users should employ the simplified SLES interface for linear solvers 3716 instead of working directly with matrix algebra routines such as this. 3717 See, e.g., SLESCreate(). 3718 3719 Level: developer 3720 3721 Concepts: matrices^symbolic incomplete Cholesky factorization 3722 Concepts: matrices^factorization 3723 Concepts: Cholsky^symbolic factorization 3724 3725 .seealso: MatCholeskyFactorNumeric(), MatCholeskyFactor() 3726 @*/ 3727 int MatICCFactorSymbolic(Mat mat,IS perm,PetscReal f,int fill,Mat *fact) 3728 { 3729 int ierr; 3730 3731 PetscFunctionBegin; 3732 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3733 PetscValidType(mat); 3734 MatPreallocated(mat); 3735 PetscValidPointer(fact); 3736 PetscValidHeaderSpecific(perm,IS_COOKIE); 3737 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 3738 if (fill < 0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Fill negative %d",fill); 3739 if (f < 1.0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Expected fill less than 1.0 %g",f); 3740 if (!mat->ops->iccfactorsymbolic) SETERRQ1(PETSC_ERR_SUP,"Matrix type %s symbolic ICC",mat->type_name); 3741 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3742 3743 ierr = PetscLogEventBegin(MAT_ICCFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr); 3744 ierr = (*mat->ops->iccfactorsymbolic)(mat,perm,f,fill,fact);CHKERRQ(ierr); 3745 ierr = PetscLogEventEnd(MAT_ICCFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr); 3746 PetscFunctionReturn(0); 3747 } 3748 3749 #undef __FUNCT__ 3750 #define __FUNCT__ "MatGetArray" 3751 /*@C 3752 MatGetArray - Returns a pointer to the element values in the matrix. 3753 The result of this routine is dependent on the underlying matrix data 3754 structure, and may not even work for certain matrix types. You MUST 3755 call MatRestoreArray() when you no longer need to access the array. 3756 3757 Not Collective 3758 3759 Input Parameter: 3760 . mat - the matrix 3761 3762 Output Parameter: 3763 . v - the location of the values 3764 3765 3766 Fortran Note: 3767 This routine is used differently from Fortran, e.g., 3768 .vb 3769 Mat mat 3770 PetscScalar mat_array(1) 3771 PetscOffset i_mat 3772 int ierr 3773 call MatGetArray(mat,mat_array,i_mat,ierr) 3774 3775 C Access first local entry in matrix; note that array is 3776 C treated as one dimensional 3777 value = mat_array(i_mat + 1) 3778 3779 [... other code ...] 3780 call MatRestoreArray(mat,mat_array,i_mat,ierr) 3781 .ve 3782 3783 See the Fortran chapter of the users manual and 3784 petsc/src/mat/examples/tests for details. 3785 3786 Level: advanced 3787 3788 Concepts: matrices^access array 3789 3790 .seealso: MatRestoreArray(), MatGetArrayF90() 3791 @*/ 3792 int MatGetArray(Mat mat,PetscScalar **v) 3793 { 3794 int ierr; 3795 3796 PetscFunctionBegin; 3797 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3798 PetscValidType(mat); 3799 MatPreallocated(mat); 3800 PetscValidPointer(v); 3801 if (!mat->ops->getarray) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 3802 ierr = (*mat->ops->getarray)(mat,v);CHKERRQ(ierr); 3803 PetscFunctionReturn(0); 3804 } 3805 3806 #undef __FUNCT__ 3807 #define __FUNCT__ "MatRestoreArray" 3808 /*@C 3809 MatRestoreArray - Restores the matrix after MatGetArray() has been called. 3810 3811 Not Collective 3812 3813 Input Parameter: 3814 + mat - the matrix 3815 - v - the location of the values 3816 3817 Fortran Note: 3818 This routine is used differently from Fortran, e.g., 3819 .vb 3820 Mat mat 3821 PetscScalar mat_array(1) 3822 PetscOffset i_mat 3823 int ierr 3824 call MatGetArray(mat,mat_array,i_mat,ierr) 3825 3826 C Access first local entry in matrix; note that array is 3827 C treated as one dimensional 3828 value = mat_array(i_mat + 1) 3829 3830 [... other code ...] 3831 call MatRestoreArray(mat,mat_array,i_mat,ierr) 3832 .ve 3833 3834 See the Fortran chapter of the users manual and 3835 petsc/src/mat/examples/tests for details 3836 3837 Level: advanced 3838 3839 .seealso: MatGetArray(), MatRestoreArrayF90() 3840 @*/ 3841 int MatRestoreArray(Mat mat,PetscScalar **v) 3842 { 3843 int ierr; 3844 3845 PetscFunctionBegin; 3846 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3847 PetscValidType(mat); 3848 MatPreallocated(mat); 3849 PetscValidPointer(v); 3850 if (!mat->ops->restorearray) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 3851 ierr = (*mat->ops->restorearray)(mat,v);CHKERRQ(ierr); 3852 PetscFunctionReturn(0); 3853 } 3854 3855 #undef __FUNCT__ 3856 #define __FUNCT__ "MatGetSubMatrices" 3857 /*@C 3858 MatGetSubMatrices - Extracts several submatrices from a matrix. If submat 3859 points to an array of valid matrices, they may be reused to store the new 3860 submatrices. 3861 3862 Collective on Mat 3863 3864 Input Parameters: 3865 + mat - the matrix 3866 . n - the number of submatrixes to be extracted (on this processor, may be zero) 3867 . irow, icol - index sets of rows and columns to extract 3868 - scall - either MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX 3869 3870 Output Parameter: 3871 . submat - the array of submatrices 3872 3873 Notes: 3874 MatGetSubMatrices() can extract only sequential submatrices 3875 (from both sequential and parallel matrices). Use MatGetSubMatrix() 3876 to extract a parallel submatrix. 3877 3878 When extracting submatrices from a parallel matrix, each processor can 3879 form a different submatrix by setting the rows and columns of its 3880 individual index sets according to the local submatrix desired. 3881 3882 When finished using the submatrices, the user should destroy 3883 them with MatDestroyMatrices(). 3884 3885 MAT_REUSE_MATRIX can only be used when the nonzero structure of the 3886 original matrix has not changed from that last call to MatGetSubMatrices(). 3887 3888 This routine creates the matrices in submat; you should NOT create them before 3889 calling it. It also allocates the array of matrix pointers submat. 3890 3891 Fortran Note: 3892 The Fortran interface is slightly different from that given below; it 3893 requires one to pass in as submat a Mat (integer) array of size at least m. 3894 3895 Level: advanced 3896 3897 Concepts: matrices^accessing submatrices 3898 Concepts: submatrices 3899 3900 .seealso: MatDestroyMatrices(), MatGetSubMatrix(), MatGetRow(), MatGetDiagonal() 3901 @*/ 3902 int MatGetSubMatrices(Mat mat,int n,IS *irow,IS *icol,MatReuse scall,Mat **submat) 3903 { 3904 int ierr; 3905 3906 PetscFunctionBegin; 3907 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3908 PetscValidType(mat); 3909 MatPreallocated(mat); 3910 if (!mat->ops->getsubmatrices) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 3911 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3912 3913 ierr = PetscLogEventBegin(MAT_GetSubMatrices,mat,0,0,0);CHKERRQ(ierr); 3914 ierr = (*mat->ops->getsubmatrices)(mat,n,irow,icol,scall,submat);CHKERRQ(ierr); 3915 ierr = PetscLogEventEnd(MAT_GetSubMatrices,mat,0,0,0);CHKERRQ(ierr); 3916 PetscFunctionReturn(0); 3917 } 3918 3919 #undef __FUNCT__ 3920 #define __FUNCT__ "MatDestroyMatrices" 3921 /*@C 3922 MatDestroyMatrices - Destroys a set of matrices obtained with MatGetSubMatrices(). 3923 3924 Collective on Mat 3925 3926 Input Parameters: 3927 + n - the number of local matrices 3928 - mat - the matrices 3929 3930 Level: advanced 3931 3932 Notes: Frees not only the matrices, but also the array that contains the matrices 3933 3934 .seealso: MatGetSubMatrices() 3935 @*/ 3936 int MatDestroyMatrices(int n,Mat **mat) 3937 { 3938 int ierr,i; 3939 3940 PetscFunctionBegin; 3941 if (n < 0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Trying to destroy negative number of matrices %d",n); 3942 PetscValidPointer(mat); 3943 for (i=0; i<n; i++) { 3944 ierr = MatDestroy((*mat)[i]);CHKERRQ(ierr); 3945 } 3946 /* memory is allocated even if n = 0 */ 3947 ierr = PetscFree(*mat);CHKERRQ(ierr); 3948 PetscFunctionReturn(0); 3949 } 3950 3951 #undef __FUNCT__ 3952 #define __FUNCT__ "MatIncreaseOverlap" 3953 /*@ 3954 MatIncreaseOverlap - Given a set of submatrices indicated by index sets, 3955 replaces the index sets by larger ones that represent submatrices with 3956 additional overlap. 3957 3958 Collective on Mat 3959 3960 Input Parameters: 3961 + mat - the matrix 3962 . n - the number of index sets 3963 . is - the array of pointers to index sets 3964 - ov - the additional overlap requested 3965 3966 Level: developer 3967 3968 Concepts: overlap 3969 Concepts: ASM^computing overlap 3970 3971 .seealso: MatGetSubMatrices() 3972 @*/ 3973 int MatIncreaseOverlap(Mat mat,int n,IS *is,int ov) 3974 { 3975 int ierr; 3976 3977 PetscFunctionBegin; 3978 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3979 PetscValidType(mat); 3980 MatPreallocated(mat); 3981 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3982 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 3983 3984 if (!ov) PetscFunctionReturn(0); 3985 if (!mat->ops->increaseoverlap) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 3986 ierr = PetscLogEventBegin(MAT_IncreaseOverlap,mat,0,0,0);CHKERRQ(ierr); 3987 ierr = (*mat->ops->increaseoverlap)(mat,n,is,ov);CHKERRQ(ierr); 3988 ierr = PetscLogEventEnd(MAT_IncreaseOverlap,mat,0,0,0);CHKERRQ(ierr); 3989 PetscFunctionReturn(0); 3990 } 3991 3992 #undef __FUNCT__ 3993 #define __FUNCT__ "MatPrintHelp" 3994 /*@ 3995 MatPrintHelp - Prints all the options for the matrix. 3996 3997 Collective on Mat 3998 3999 Input Parameter: 4000 . mat - the matrix 4001 4002 Options Database Keys: 4003 + -help - Prints matrix options 4004 - -h - Prints matrix options 4005 4006 Level: developer 4007 4008 .seealso: MatCreate(), MatCreateXXX() 4009 @*/ 4010 int MatPrintHelp(Mat mat) 4011 { 4012 static PetscTruth called = PETSC_FALSE; 4013 int ierr; 4014 4015 PetscFunctionBegin; 4016 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4017 PetscValidType(mat); 4018 MatPreallocated(mat); 4019 4020 if (!called) { 4021 if (mat->ops->printhelp) { 4022 ierr = (*mat->ops->printhelp)(mat);CHKERRQ(ierr); 4023 } 4024 called = PETSC_TRUE; 4025 } 4026 PetscFunctionReturn(0); 4027 } 4028 4029 #undef __FUNCT__ 4030 #define __FUNCT__ "MatGetBlockSize" 4031 /*@ 4032 MatGetBlockSize - Returns the matrix block size; useful especially for the 4033 block row and block diagonal formats. 4034 4035 Not Collective 4036 4037 Input Parameter: 4038 . mat - the matrix 4039 4040 Output Parameter: 4041 . bs - block size 4042 4043 Notes: 4044 Block diagonal formats are MATSEQBDIAG, MATMPIBDIAG. 4045 Block row formats are MATSEQBAIJ, MATMPIBAIJ 4046 4047 Level: intermediate 4048 4049 Concepts: matrices^block size 4050 4051 .seealso: MatCreateSeqBAIJ(), MatCreateMPIBAIJ(), MatCreateSeqBDiag(), MatCreateMPIBDiag() 4052 @*/ 4053 int MatGetBlockSize(Mat mat,int *bs) 4054 { 4055 int ierr; 4056 4057 PetscFunctionBegin; 4058 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4059 PetscValidType(mat); 4060 MatPreallocated(mat); 4061 PetscValidIntPointer(bs); 4062 if (!mat->ops->getblocksize) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 4063 ierr = (*mat->ops->getblocksize)(mat,bs);CHKERRQ(ierr); 4064 PetscFunctionReturn(0); 4065 } 4066 4067 #undef __FUNCT__ 4068 #define __FUNCT__ "MatGetRowIJ" 4069 /*@C 4070 MatGetRowIJ - Returns the compressed row storage i and j indices for sequential matrices. 4071 4072 Collective on Mat 4073 4074 Input Parameters: 4075 + mat - the matrix 4076 . shift - 0 or 1 indicating we want the indices starting at 0 or 1 4077 - symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be 4078 symmetrized 4079 4080 Output Parameters: 4081 + n - number of rows in the (possibly compressed) matrix 4082 . ia - the row pointers 4083 . ja - the column indices 4084 - done - PETSC_TRUE or PETSC_FALSE, indicating whether the values have been returned 4085 4086 Level: developer 4087 4088 .seealso: MatGetColumnIJ(), MatRestoreRowIJ() 4089 @*/ 4090 int MatGetRowIJ(Mat mat,int shift,PetscTruth symmetric,int *n,int **ia,int** ja,PetscTruth *done) 4091 { 4092 int ierr; 4093 4094 PetscFunctionBegin; 4095 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4096 PetscValidType(mat); 4097 MatPreallocated(mat); 4098 if (ia) PetscValidIntPointer(ia); 4099 if (ja) PetscValidIntPointer(ja); 4100 PetscValidIntPointer(done); 4101 if (!mat->ops->getrowij) *done = PETSC_FALSE; 4102 else { 4103 *done = PETSC_TRUE; 4104 ierr = (*mat->ops->getrowij)(mat,shift,symmetric,n,ia,ja,done);CHKERRQ(ierr); 4105 } 4106 PetscFunctionReturn(0); 4107 } 4108 4109 #undef __FUNCT__ 4110 #define __FUNCT__ "MatGetColumnIJ" 4111 /*@C 4112 MatGetColumnIJ - Returns the compressed column storage i and j indices for sequential matrices. 4113 4114 Collective on Mat 4115 4116 Input Parameters: 4117 + mat - the matrix 4118 . shift - 1 or zero indicating we want the indices starting at 0 or 1 4119 - symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be 4120 symmetrized 4121 4122 Output Parameters: 4123 + n - number of columns in the (possibly compressed) matrix 4124 . ia - the column pointers 4125 . ja - the row indices 4126 - done - PETSC_TRUE or PETSC_FALSE, indicating whether the values have been returned 4127 4128 Level: developer 4129 4130 .seealso: MatGetRowIJ(), MatRestoreColumnIJ() 4131 @*/ 4132 int MatGetColumnIJ(Mat mat,int shift,PetscTruth symmetric,int *n,int **ia,int** ja,PetscTruth *done) 4133 { 4134 int ierr; 4135 4136 PetscFunctionBegin; 4137 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4138 PetscValidType(mat); 4139 MatPreallocated(mat); 4140 if (ia) PetscValidIntPointer(ia); 4141 if (ja) PetscValidIntPointer(ja); 4142 PetscValidIntPointer(done); 4143 4144 if (!mat->ops->getcolumnij) *done = PETSC_FALSE; 4145 else { 4146 *done = PETSC_TRUE; 4147 ierr = (*mat->ops->getcolumnij)(mat,shift,symmetric,n,ia,ja,done);CHKERRQ(ierr); 4148 } 4149 PetscFunctionReturn(0); 4150 } 4151 4152 #undef __FUNCT__ 4153 #define __FUNCT__ "MatRestoreRowIJ" 4154 /*@C 4155 MatRestoreRowIJ - Call after you are completed with the ia,ja indices obtained with 4156 MatGetRowIJ(). 4157 4158 Collective on Mat 4159 4160 Input Parameters: 4161 + mat - the matrix 4162 . shift - 1 or zero indicating we want the indices starting at 0 or 1 4163 - symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be 4164 symmetrized 4165 4166 Output Parameters: 4167 + n - size of (possibly compressed) matrix 4168 . ia - the row pointers 4169 . ja - the column indices 4170 - done - PETSC_TRUE or PETSC_FALSE indicated that the values have been returned 4171 4172 Level: developer 4173 4174 .seealso: MatGetRowIJ(), MatRestoreColumnIJ() 4175 @*/ 4176 int MatRestoreRowIJ(Mat mat,int shift,PetscTruth symmetric,int *n,int **ia,int** ja,PetscTruth *done) 4177 { 4178 int ierr; 4179 4180 PetscFunctionBegin; 4181 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4182 PetscValidType(mat); 4183 MatPreallocated(mat); 4184 if (ia) PetscValidIntPointer(ia); 4185 if (ja) PetscValidIntPointer(ja); 4186 PetscValidIntPointer(done); 4187 4188 if (!mat->ops->restorerowij) *done = PETSC_FALSE; 4189 else { 4190 *done = PETSC_TRUE; 4191 ierr = (*mat->ops->restorerowij)(mat,shift,symmetric,n,ia,ja,done);CHKERRQ(ierr); 4192 } 4193 PetscFunctionReturn(0); 4194 } 4195 4196 #undef __FUNCT__ 4197 #define __FUNCT__ "MatRestoreColumnIJ" 4198 /*@C 4199 MatRestoreColumnIJ - Call after you are completed with the ia,ja indices obtained with 4200 MatGetColumnIJ(). 4201 4202 Collective on Mat 4203 4204 Input Parameters: 4205 + mat - the matrix 4206 . shift - 1 or zero indicating we want the indices starting at 0 or 1 4207 - symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be 4208 symmetrized 4209 4210 Output Parameters: 4211 + n - size of (possibly compressed) matrix 4212 . ia - the column pointers 4213 . ja - the row indices 4214 - done - PETSC_TRUE or PETSC_FALSE indicated that the values have been returned 4215 4216 Level: developer 4217 4218 .seealso: MatGetColumnIJ(), MatRestoreRowIJ() 4219 @*/ 4220 int MatRestoreColumnIJ(Mat mat,int shift,PetscTruth symmetric,int *n,int **ia,int** ja,PetscTruth *done) 4221 { 4222 int ierr; 4223 4224 PetscFunctionBegin; 4225 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4226 PetscValidType(mat); 4227 MatPreallocated(mat); 4228 if (ia) PetscValidIntPointer(ia); 4229 if (ja) PetscValidIntPointer(ja); 4230 PetscValidIntPointer(done); 4231 4232 if (!mat->ops->restorecolumnij) *done = PETSC_FALSE; 4233 else { 4234 *done = PETSC_TRUE; 4235 ierr = (*mat->ops->restorecolumnij)(mat,shift,symmetric,n,ia,ja,done);CHKERRQ(ierr); 4236 } 4237 PetscFunctionReturn(0); 4238 } 4239 4240 #undef __FUNCT__ 4241 #define __FUNCT__ "MatColoringPatch" 4242 /*@C 4243 MatColoringPatch -Used inside matrix coloring routines that 4244 use MatGetRowIJ() and/or MatGetColumnIJ(). 4245 4246 Collective on Mat 4247 4248 Input Parameters: 4249 + mat - the matrix 4250 . n - number of colors 4251 - colorarray - array indicating color for each column 4252 4253 Output Parameters: 4254 . iscoloring - coloring generated using colorarray information 4255 4256 Level: developer 4257 4258 .seealso: MatGetRowIJ(), MatGetColumnIJ() 4259 4260 @*/ 4261 int MatColoringPatch(Mat mat,int n,int ncolors,int *colorarray,ISColoring *iscoloring) 4262 { 4263 int ierr; 4264 4265 PetscFunctionBegin; 4266 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4267 PetscValidType(mat); 4268 MatPreallocated(mat); 4269 PetscValidIntPointer(colorarray); 4270 4271 if (!mat->ops->coloringpatch){ 4272 ierr = ISColoringCreate(mat->comm,n,colorarray,iscoloring);CHKERRQ(ierr); 4273 } else { 4274 ierr = (*mat->ops->coloringpatch)(mat,n,ncolors,colorarray,iscoloring);CHKERRQ(ierr); 4275 } 4276 PetscFunctionReturn(0); 4277 } 4278 4279 4280 #undef __FUNCT__ 4281 #define __FUNCT__ "MatSetUnfactored" 4282 /*@ 4283 MatSetUnfactored - Resets a factored matrix to be treated as unfactored. 4284 4285 Collective on Mat 4286 4287 Input Parameter: 4288 . mat - the factored matrix to be reset 4289 4290 Notes: 4291 This routine should be used only with factored matrices formed by in-place 4292 factorization via ILU(0) (or by in-place LU factorization for the MATSEQDENSE 4293 format). This option can save memory, for example, when solving nonlinear 4294 systems with a matrix-free Newton-Krylov method and a matrix-based, in-place 4295 ILU(0) preconditioner. 4296 4297 Note that one can specify in-place ILU(0) factorization by calling 4298 .vb 4299 PCType(pc,PCILU); 4300 PCILUSeUseInPlace(pc); 4301 .ve 4302 or by using the options -pc_type ilu -pc_ilu_in_place 4303 4304 In-place factorization ILU(0) can also be used as a local 4305 solver for the blocks within the block Jacobi or additive Schwarz 4306 methods (runtime option: -sub_pc_ilu_in_place). See the discussion 4307 of these preconditioners in the users manual for details on setting 4308 local solver options. 4309 4310 Most users should employ the simplified SLES interface for linear solvers 4311 instead of working directly with matrix algebra routines such as this. 4312 See, e.g., SLESCreate(). 4313 4314 Level: developer 4315 4316 .seealso: PCILUSetUseInPlace(), PCLUSetUseInPlace() 4317 4318 Concepts: matrices^unfactored 4319 4320 @*/ 4321 int MatSetUnfactored(Mat mat) 4322 { 4323 int ierr; 4324 4325 PetscFunctionBegin; 4326 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4327 PetscValidType(mat); 4328 MatPreallocated(mat); 4329 mat->factor = 0; 4330 if (!mat->ops->setunfactored) PetscFunctionReturn(0); 4331 ierr = (*mat->ops->setunfactored)(mat);CHKERRQ(ierr); 4332 PetscFunctionReturn(0); 4333 } 4334 4335 /*MC 4336 MatGetArrayF90 - Accesses a matrix array from Fortran90. 4337 4338 Synopsis: 4339 MatGetArrayF90(Mat x,{Scalar, pointer :: xx_v(:)},integer ierr) 4340 4341 Not collective 4342 4343 Input Parameter: 4344 . x - matrix 4345 4346 Output Parameters: 4347 + xx_v - the Fortran90 pointer to the array 4348 - ierr - error code 4349 4350 Example of Usage: 4351 .vb 4352 PetscScalar, pointer xx_v(:) 4353 .... 4354 call MatGetArrayF90(x,xx_v,ierr) 4355 a = xx_v(3) 4356 call MatRestoreArrayF90(x,xx_v,ierr) 4357 .ve 4358 4359 Notes: 4360 Not yet supported for all F90 compilers 4361 4362 Level: advanced 4363 4364 .seealso: MatRestoreArrayF90(), MatGetArray(), MatRestoreArray() 4365 4366 Concepts: matrices^accessing array 4367 4368 M*/ 4369 4370 /*MC 4371 MatRestoreArrayF90 - Restores a matrix array that has been 4372 accessed with MatGetArrayF90(). 4373 4374 Synopsis: 4375 MatRestoreArrayF90(Mat x,{Scalar, pointer :: xx_v(:)},integer ierr) 4376 4377 Not collective 4378 4379 Input Parameters: 4380 + x - matrix 4381 - xx_v - the Fortran90 pointer to the array 4382 4383 Output Parameter: 4384 . ierr - error code 4385 4386 Example of Usage: 4387 .vb 4388 PetscScalar, pointer xx_v(:) 4389 .... 4390 call MatGetArrayF90(x,xx_v,ierr) 4391 a = xx_v(3) 4392 call MatRestoreArrayF90(x,xx_v,ierr) 4393 .ve 4394 4395 Notes: 4396 Not yet supported for all F90 compilers 4397 4398 Level: advanced 4399 4400 .seealso: MatGetArrayF90(), MatGetArray(), MatRestoreArray() 4401 4402 M*/ 4403 4404 4405 #undef __FUNCT__ 4406 #define __FUNCT__ "MatGetSubMatrix" 4407 /*@ 4408 MatGetSubMatrix - Gets a single submatrix on the same number of processors 4409 as the original matrix. 4410 4411 Collective on Mat 4412 4413 Input Parameters: 4414 + mat - the original matrix 4415 . isrow - rows this processor should obtain 4416 . iscol - columns for all processors you wish to keep 4417 . csize - number of columns "local" to this processor (does nothing for sequential 4418 matrices). This should match the result from VecGetLocalSize(x,...) if you 4419 plan to use the matrix in a A*x; alternatively, you can use PETSC_DECIDE 4420 - cll - either MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX 4421 4422 Output Parameter: 4423 . newmat - the new submatrix, of the same type as the old 4424 4425 Level: advanced 4426 4427 Notes: the iscol argument MUST be the same on each processor. You might be 4428 able to create the iscol argument with ISAllGather(). 4429 4430 The first time this is called you should use a cll of MAT_INITIAL_MATRIX, 4431 the MatGetSubMatrix() routine will create the newmat for you. Any additional calls 4432 to this routine with a mat of the same nonzero structure will reuse the matrix 4433 generated the first time. 4434 4435 Concepts: matrices^submatrices 4436 4437 .seealso: MatGetSubMatrices(), ISAllGather() 4438 @*/ 4439 int MatGetSubMatrix(Mat mat,IS isrow,IS iscol,int csize,MatReuse cll,Mat *newmat) 4440 { 4441 int ierr, size; 4442 Mat *local; 4443 4444 PetscFunctionBegin; 4445 PetscValidType(mat); 4446 MatPreallocated(mat); 4447 ierr = MPI_Comm_size(mat->comm,&size);CHKERRQ(ierr); 4448 4449 /* if original matrix is on just one processor then use submatrix generated */ 4450 if (!mat->ops->getsubmatrix && size == 1 && cll == MAT_REUSE_MATRIX) { 4451 ierr = MatGetSubMatrices(mat,1,&isrow,&iscol,MAT_REUSE_MATRIX,&newmat);CHKERRQ(ierr); 4452 PetscFunctionReturn(0); 4453 } else if (!mat->ops->getsubmatrix && size == 1) { 4454 ierr = MatGetSubMatrices(mat,1,&isrow,&iscol,MAT_INITIAL_MATRIX,&local);CHKERRQ(ierr); 4455 *newmat = *local; 4456 ierr = PetscFree(local);CHKERRQ(ierr); 4457 PetscFunctionReturn(0); 4458 } 4459 4460 if (!mat->ops->getsubmatrix) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 4461 ierr = (*mat->ops->getsubmatrix)(mat,isrow,iscol,csize,cll,newmat);CHKERRQ(ierr); 4462 PetscFunctionReturn(0); 4463 } 4464 4465 #undef __FUNCT__ 4466 #define __FUNCT__ "MatGetPetscMaps" 4467 /*@C 4468 MatGetPetscMaps - Returns the maps associated with the matrix. 4469 4470 Not Collective 4471 4472 Input Parameter: 4473 . mat - the matrix 4474 4475 Output Parameters: 4476 + rmap - the row (right) map 4477 - cmap - the column (left) map 4478 4479 Level: developer 4480 4481 Concepts: maps^getting from matrix 4482 4483 @*/ 4484 int MatGetPetscMaps(Mat mat,PetscMap *rmap,PetscMap *cmap) 4485 { 4486 int ierr; 4487 4488 PetscFunctionBegin; 4489 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4490 PetscValidType(mat); 4491 MatPreallocated(mat); 4492 ierr = (*mat->ops->getmaps)(mat,rmap,cmap);CHKERRQ(ierr); 4493 PetscFunctionReturn(0); 4494 } 4495 4496 /* 4497 Version that works for all PETSc matrices 4498 */ 4499 #undef __FUNCT__ 4500 #define __FUNCT__ "MatGetPetscMaps_Petsc" 4501 int MatGetPetscMaps_Petsc(Mat mat,PetscMap *rmap,PetscMap *cmap) 4502 { 4503 PetscFunctionBegin; 4504 if (rmap) *rmap = mat->rmap; 4505 if (cmap) *cmap = mat->cmap; 4506 PetscFunctionReturn(0); 4507 } 4508 4509 #undef __FUNCT__ 4510 #define __FUNCT__ "MatSetStashInitialSize" 4511 /*@ 4512 MatSetStashInitialSize - sets the sizes of the matrix stash, that is 4513 used during the assembly process to store values that belong to 4514 other processors. 4515 4516 Not Collective 4517 4518 Input Parameters: 4519 + mat - the matrix 4520 . size - the initial size of the stash. 4521 - bsize - the initial size of the block-stash(if used). 4522 4523 Options Database Keys: 4524 + -matstash_initial_size <size> or <size0,size1,...sizep-1> 4525 - -matstash_block_initial_size <bsize> or <bsize0,bsize1,...bsizep-1> 4526 4527 Level: intermediate 4528 4529 Notes: 4530 The block-stash is used for values set with VecSetValuesBlocked() while 4531 the stash is used for values set with VecSetValues() 4532 4533 Run with the option -log_info and look for output of the form 4534 MatAssemblyBegin_MPIXXX:Stash has MM entries, uses nn mallocs. 4535 to determine the appropriate value, MM, to use for size and 4536 MatAssemblyBegin_MPIXXX:Block-Stash has BMM entries, uses nn mallocs. 4537 to determine the value, BMM to use for bsize 4538 4539 Concepts: stash^setting matrix size 4540 Concepts: matrices^stash 4541 4542 @*/ 4543 int MatSetStashInitialSize(Mat mat,int size, int bsize) 4544 { 4545 int ierr; 4546 4547 PetscFunctionBegin; 4548 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4549 PetscValidType(mat); 4550 MatPreallocated(mat); 4551 ierr = MatStashSetInitialSize_Private(&mat->stash,size);CHKERRQ(ierr); 4552 ierr = MatStashSetInitialSize_Private(&mat->bstash,bsize);CHKERRQ(ierr); 4553 PetscFunctionReturn(0); 4554 } 4555 4556 #undef __FUNCT__ 4557 #define __FUNCT__ "MatInterpolateAdd" 4558 /*@ 4559 MatInterpolateAdd - w = y + A*x or A'*x depending on the shape of 4560 the matrix 4561 4562 Collective on Mat 4563 4564 Input Parameters: 4565 + mat - the matrix 4566 . x,y - the vectors 4567 - w - where the result is stored 4568 4569 Level: intermediate 4570 4571 Notes: 4572 w may be the same vector as y. 4573 4574 This allows one to use either the restriction or interpolation (its transpose) 4575 matrix to do the interpolation 4576 4577 Concepts: interpolation 4578 4579 .seealso: MatMultAdd(), MatMultTransposeAdd(), MatRestrict() 4580 4581 @*/ 4582 int MatInterpolateAdd(Mat A,Vec x,Vec y,Vec w) 4583 { 4584 int M,N,ierr; 4585 4586 PetscFunctionBegin; 4587 PetscValidType(A); 4588 MatPreallocated(A); 4589 ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr); 4590 if (N > M) { 4591 ierr = MatMultTransposeAdd(A,x,y,w);CHKERRQ(ierr); 4592 } else { 4593 ierr = MatMultAdd(A,x,y,w);CHKERRQ(ierr); 4594 } 4595 PetscFunctionReturn(0); 4596 } 4597 4598 #undef __FUNCT__ 4599 #define __FUNCT__ "MatInterpolate" 4600 /*@ 4601 MatInterpolate - y = A*x or A'*x depending on the shape of 4602 the matrix 4603 4604 Collective on Mat 4605 4606 Input Parameters: 4607 + mat - the matrix 4608 - x,y - the vectors 4609 4610 Level: intermediate 4611 4612 Notes: 4613 This allows one to use either the restriction or interpolation (its transpose) 4614 matrix to do the interpolation 4615 4616 Concepts: matrices^interpolation 4617 4618 .seealso: MatMultAdd(), MatMultTransposeAdd(), MatRestrict() 4619 4620 @*/ 4621 int MatInterpolate(Mat A,Vec x,Vec y) 4622 { 4623 int M,N,ierr; 4624 4625 PetscFunctionBegin; 4626 PetscValidType(A); 4627 MatPreallocated(A); 4628 ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr); 4629 if (N > M) { 4630 ierr = MatMultTranspose(A,x,y);CHKERRQ(ierr); 4631 } else { 4632 ierr = MatMult(A,x,y);CHKERRQ(ierr); 4633 } 4634 PetscFunctionReturn(0); 4635 } 4636 4637 #undef __FUNCT__ 4638 #define __FUNCT__ "MatRestrict" 4639 /*@ 4640 MatRestrict - y = A*x or A'*x 4641 4642 Collective on Mat 4643 4644 Input Parameters: 4645 + mat - the matrix 4646 - x,y - the vectors 4647 4648 Level: intermediate 4649 4650 Notes: 4651 This allows one to use either the restriction or interpolation (its transpose) 4652 matrix to do the restriction 4653 4654 Concepts: matrices^restriction 4655 4656 .seealso: MatMultAdd(), MatMultTransposeAdd(), MatInterpolate() 4657 4658 @*/ 4659 int MatRestrict(Mat A,Vec x,Vec y) 4660 { 4661 int M,N,ierr; 4662 4663 PetscFunctionBegin; 4664 PetscValidType(A); 4665 MatPreallocated(A); 4666 ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr); 4667 if (N > M) { 4668 ierr = MatMult(A,x,y);CHKERRQ(ierr); 4669 } else { 4670 ierr = MatMultTranspose(A,x,y);CHKERRQ(ierr); 4671 } 4672 PetscFunctionReturn(0); 4673 } 4674 4675 #undef __FUNCT__ 4676 #define __FUNCT__ "MatNullSpaceAttach" 4677 /*@C 4678 MatNullSpaceAttach - attaches a null space to a matrix. 4679 This null space will be removed from the resulting vector whenever 4680 MatMult() is called 4681 4682 Collective on Mat 4683 4684 Input Parameters: 4685 + mat - the matrix 4686 - nullsp - the null space object 4687 4688 Level: developer 4689 4690 Notes: 4691 Overwrites any previous null space that may have been attached 4692 4693 Concepts: null space^attaching to matrix 4694 4695 .seealso: MatCreate(), MatNullSpaceCreate() 4696 @*/ 4697 int MatNullSpaceAttach(Mat mat,MatNullSpace nullsp) 4698 { 4699 int ierr; 4700 4701 PetscFunctionBegin; 4702 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4703 PetscValidType(mat); 4704 MatPreallocated(mat); 4705 PetscValidHeaderSpecific(nullsp,MAT_NULLSPACE_COOKIE); 4706 4707 if (mat->nullsp) { 4708 ierr = MatNullSpaceDestroy(mat->nullsp);CHKERRQ(ierr); 4709 } 4710 mat->nullsp = nullsp; 4711 ierr = PetscObjectReference((PetscObject)nullsp);CHKERRQ(ierr); 4712 PetscFunctionReturn(0); 4713 } 4714 4715 #undef __FUNCT__ 4716 #define __FUNCT__ "MatICCFactor" 4717 /*@ 4718 MatICCFactor - Performs in-place incomplete Cholesky factorization of matrix. 4719 4720 Collective on Mat 4721 4722 Input Parameters: 4723 + mat - the matrix 4724 . row - row/column permutation 4725 . fill - expected fill factor >= 1.0 4726 - level - level of fill, for ICC(k) 4727 4728 Notes: 4729 Probably really in-place only when level of fill is zero, otherwise allocates 4730 new space to store factored matrix and deletes previous memory. 4731 4732 Most users should employ the simplified SLES interface for linear solvers 4733 instead of working directly with matrix algebra routines such as this. 4734 See, e.g., SLESCreate(). 4735 4736 Level: developer 4737 4738 Concepts: matrices^incomplete Cholesky factorization 4739 Concepts: Cholesky factorization 4740 4741 .seealso: MatICCFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor() 4742 @*/ 4743 int MatICCFactor(Mat mat,IS row,PetscReal fill,int level) 4744 { 4745 int ierr; 4746 4747 PetscFunctionBegin; 4748 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4749 PetscValidType(mat); 4750 MatPreallocated(mat); 4751 if (mat->M != mat->N) SETERRQ(PETSC_ERR_ARG_WRONG,"matrix must be square"); 4752 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 4753 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 4754 if (!mat->ops->iccfactor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 4755 ierr = (*mat->ops->iccfactor)(mat,row,fill,level);CHKERRQ(ierr); 4756 PetscFunctionReturn(0); 4757 } 4758 4759 #undef __FUNCT__ 4760 #define __FUNCT__ "MatSetValuesAdic" 4761 /*@ 4762 MatSetValuesAdic - Sets values computed with ADIC automatic differentiation into a matrix. 4763 4764 Not Collective 4765 4766 Input Parameters: 4767 + mat - the matrix 4768 - v - the values compute with ADIC 4769 4770 Level: developer 4771 4772 Notes: 4773 Must call MatSetColoring() before using this routine. Also this matrix must already 4774 have its nonzero pattern determined. 4775 4776 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal(), 4777 MatSetValues(), MatSetColoring(), MatSetValuesAdifor() 4778 @*/ 4779 int MatSetValuesAdic(Mat mat,void *v) 4780 { 4781 int ierr; 4782 4783 PetscFunctionBegin; 4784 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4785 PetscValidType(mat); 4786 4787 if (!mat->assembled) { 4788 SETERRQ(1,"Matrix must be already assembled"); 4789 } 4790 ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 4791 if (!mat->ops->setvaluesadic) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 4792 ierr = (*mat->ops->setvaluesadic)(mat,v);CHKERRQ(ierr); 4793 ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 4794 ierr = MatView_Private(mat);CHKERRQ(ierr); 4795 PetscFunctionReturn(0); 4796 } 4797 4798 4799 #undef __FUNCT__ 4800 #define __FUNCT__ "MatSetColoring" 4801 /*@ 4802 MatSetColoring - Sets a coloring used by calls to MatSetValuesAdic() 4803 4804 Not Collective 4805 4806 Input Parameters: 4807 + mat - the matrix 4808 - coloring - the coloring 4809 4810 Level: developer 4811 4812 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal(), 4813 MatSetValues(), MatSetValuesAdic() 4814 @*/ 4815 int MatSetColoring(Mat mat,ISColoring coloring) 4816 { 4817 int ierr; 4818 4819 PetscFunctionBegin; 4820 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4821 PetscValidType(mat); 4822 4823 if (!mat->assembled) { 4824 SETERRQ(1,"Matrix must be already assembled"); 4825 } 4826 if (!mat->ops->setcoloring) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 4827 ierr = (*mat->ops->setcoloring)(mat,coloring);CHKERRQ(ierr); 4828 PetscFunctionReturn(0); 4829 } 4830 4831 #undef __FUNCT__ 4832 #define __FUNCT__ "MatSetValuesAdifor" 4833 /*@ 4834 MatSetValuesAdifor - Sets values computed with automatic differentiation into a matrix. 4835 4836 Not Collective 4837 4838 Input Parameters: 4839 + mat - the matrix 4840 . nl - leading dimension of v 4841 - v - the values compute with ADIFOR 4842 4843 Level: developer 4844 4845 Notes: 4846 Must call MatSetColoring() before using this routine. Also this matrix must already 4847 have its nonzero pattern determined. 4848 4849 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal(), 4850 MatSetValues(), MatSetColoring() 4851 @*/ 4852 int MatSetValuesAdifor(Mat mat,int nl,void *v) 4853 { 4854 int ierr; 4855 4856 PetscFunctionBegin; 4857 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4858 PetscValidType(mat); 4859 4860 if (!mat->assembled) { 4861 SETERRQ(1,"Matrix must be already assembled"); 4862 } 4863 ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 4864 if (!mat->ops->setvaluesadifor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 4865 ierr = (*mat->ops->setvaluesadifor)(mat,nl,v);CHKERRQ(ierr); 4866 ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 4867 PetscFunctionReturn(0); 4868 } 4869 4870 EXTERN int MatMPIAIJDiagonalScaleLocal(Mat,Vec); 4871 EXTERN int MatMPIBAIJDiagonalScaleLocal(Mat,Vec); 4872 4873 #undef __FUNCT__ 4874 #define __FUNCT__ "MatDiagonalScaleLocal" 4875 /*@ 4876 MatDiagonalScaleLocal - Scales columns of a matrix given the scaling values including the 4877 ghosted ones. 4878 4879 Not Collective 4880 4881 Input Parameters: 4882 + mat - the matrix 4883 - diag = the diagonal values, including ghost ones 4884 4885 Level: developer 4886 4887 Notes: Works only for MPIAIJ and MPIBAIJ matrices 4888 4889 .seealso: MatDiagonalScale() 4890 @*/ 4891 int MatDiagonalScaleLocal(Mat mat,Vec diag) 4892 { 4893 int ierr; 4894 PetscTruth flag; 4895 4896 PetscFunctionBegin; 4897 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4898 PetscValidHeaderSpecific(diag,VEC_COOKIE); 4899 PetscValidType(mat); 4900 4901 if (!mat->assembled) { 4902 SETERRQ(1,"Matrix must be already assembled"); 4903 } 4904 ierr = PetscLogEventBegin(MAT_Scale,mat,0,0,0);CHKERRQ(ierr); 4905 ierr = PetscTypeCompare((PetscObject)mat,MATMPIAIJ,&flag);CHKERRQ(ierr); 4906 if (flag) { 4907 ierr = MatMPIAIJDiagonalScaleLocal(mat,diag);CHKERRQ(ierr); 4908 } else { 4909 ierr = PetscTypeCompare((PetscObject)mat,MATMPIBAIJ,&flag);CHKERRQ(ierr); 4910 if (flag) { 4911 ierr = MatMPIBAIJDiagonalScaleLocal(mat,diag);CHKERRQ(ierr); 4912 } else { 4913 int size; 4914 ierr = MPI_Comm_size(mat->comm,&size);CHKERRQ(ierr); 4915 if (size == 1) { 4916 int n,m; 4917 ierr = VecGetSize(diag,&n);CHKERRQ(ierr); 4918 ierr = MatGetSize(mat,0,&m);CHKERRQ(ierr); 4919 if (m == n) { 4920 ierr = MatDiagonalScale(mat,0,diag);CHKERRQ(ierr); 4921 } else { 4922 SETERRQ(1,"Only supprted for sequential matrices when no ghost points/periodic conditions"); 4923 } 4924 } else { 4925 SETERRQ(1,"Only supported for MPIAIJ and MPIBAIJ parallel matrices"); 4926 } 4927 } 4928 } 4929 ierr = PetscLogEventEnd(MAT_Scale,mat,0,0,0);CHKERRQ(ierr); 4930 PetscFunctionReturn(0); 4931 } 4932 4933 #undef __FUNCT__ 4934 #define __FUNCT__ "MatGetInertia" 4935 /*@ 4936 MatGetInertia - Gets the inertia from a factored matrix 4937 4938 Collective on Mat 4939 4940 Input Parameter: 4941 . mat - the matrix 4942 4943 Output Parameters: 4944 + nneg - number of negative eigenvalues 4945 . nzero - number of zero eigenvalues 4946 - npos - number of positive eigenvalues 4947 4948 Level: advanced 4949 4950 Notes: Matrix must have been factored by MatCholeskyFactor() 4951 4952 4953 @*/ 4954 int MatGetInertia(Mat mat,int *nneg,int *nzero,int *npos) 4955 { 4956 int ierr; 4957 4958 PetscFunctionBegin; 4959 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4960 PetscValidType(mat); 4961 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 4962 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Numeric factor mat is not assembled"); 4963 if (!mat->ops->getinertia) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 4964 ierr = (*mat->ops->getinertia)(mat,nneg,nzero,npos);CHKERRQ(ierr); 4965 PetscFunctionReturn(0); 4966 } 4967 4968 /* ----------------------------------------------------------------*/ 4969 #undef __FUNCT__ 4970 #define __FUNCT__ "MatSolves" 4971 /*@ 4972 MatSolves - Solves A x = b, given a factored matrix, for a collection of vectors 4973 4974 Collective on Mat and Vecs 4975 4976 Input Parameters: 4977 + mat - the factored matrix 4978 - b - the right-hand-side vectors 4979 4980 Output Parameter: 4981 . x - the result vectors 4982 4983 Notes: 4984 The vectors b and x cannot be the same. I.e., one cannot 4985 call MatSolves(A,x,x). 4986 4987 Notes: 4988 Most users should employ the simplified SLES interface for linear solvers 4989 instead of working directly with matrix algebra routines such as this. 4990 See, e.g., SLESCreate(). 4991 4992 Level: developer 4993 4994 Concepts: matrices^triangular solves 4995 4996 .seealso: MatSolveAdd(), MatSolveTranspose(), MatSolveTransposeAdd(), MatSolve() 4997 @*/ 4998 int MatSolves(Mat mat,Vecs b,Vecs x) 4999 { 5000 int ierr; 5001 5002 PetscFunctionBegin; 5003 PetscValidHeaderSpecific(mat,MAT_COOKIE); 5004 PetscValidType(mat); 5005 MatPreallocated(mat); 5006 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 5007 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 5008 if (mat->M == 0 && mat->N == 0) PetscFunctionReturn(0); 5009 5010 if (!mat->ops->solves) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 5011 ierr = PetscLogEventBegin(MAT_Solves,mat,0,0,0);CHKERRQ(ierr); 5012 ierr = (*mat->ops->solves)(mat,b,x);CHKERRQ(ierr); 5013 ierr = PetscLogEventEnd(MAT_Solves,mat,0,0,0);CHKERRQ(ierr); 5014 PetscFunctionReturn(0); 5015 } 5016