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,MAT_FDColoringFunction; 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 1703 PetscFunctionBegin; 1704 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1705 PetscValidType(mat); 1706 MatPreallocated(mat); 1707 PetscValidPointer(fact); 1708 PetscValidHeaderSpecific(*fact,MAT_COOKIE); 1709 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1710 if (mat->M != (*fact)->M || mat->N != (*fact)->N) { 1711 SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat mat,Mat *fact: global dimensions are different %d should = %d %d should = %d", 1712 mat->M,(*fact)->M,mat->N,(*fact)->N); 1713 } 1714 if (!(*fact)->ops->lufactornumeric) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 1715 1716 ierr = PetscLogEventBegin(MAT_LUFactorNumeric,mat,*fact,0,0);CHKERRQ(ierr); 1717 ierr = (*(*fact)->ops->lufactornumeric)(mat,fact);CHKERRQ(ierr); 1718 ierr = PetscLogEventEnd(MAT_LUFactorNumeric,mat,*fact,0,0);CHKERRQ(ierr); 1719 1720 ierr = MatView_Private(*fact);CHKERRQ(ierr); 1721 PetscFunctionReturn(0); 1722 } 1723 1724 #undef __FUNCT__ 1725 #define __FUNCT__ "MatCholeskyFactor" 1726 /*@ 1727 MatCholeskyFactor - Performs in-place Cholesky factorization of a 1728 symmetric matrix. 1729 1730 Collective on Mat 1731 1732 Input Parameters: 1733 + mat - the matrix 1734 . perm - row and column permutations 1735 - f - expected fill as ratio of original fill 1736 1737 Notes: 1738 See MatLUFactor() for the nonsymmetric case. See also 1739 MatCholeskyFactorSymbolic(), and MatCholeskyFactorNumeric(). 1740 1741 Most users should employ the simplified SLES interface for linear solvers 1742 instead of working directly with matrix algebra routines such as this. 1743 See, e.g., SLESCreate(). 1744 1745 Level: developer 1746 1747 Concepts: matrices^Cholesky factorization 1748 1749 .seealso: MatLUFactor(), MatCholeskyFactorSymbolic(), MatCholeskyFactorNumeric() 1750 MatGetOrdering() 1751 1752 @*/ 1753 int MatCholeskyFactor(Mat mat,IS perm,PetscReal f) 1754 { 1755 int ierr; 1756 1757 PetscFunctionBegin; 1758 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1759 PetscValidType(mat); 1760 MatPreallocated(mat); 1761 PetscValidHeaderSpecific(perm,IS_COOKIE); 1762 if (mat->M != mat->N) SETERRQ(PETSC_ERR_ARG_WRONG,"Matrix must be square"); 1763 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1764 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1765 if (!mat->ops->choleskyfactor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 1766 1767 ierr = PetscLogEventBegin(MAT_CholeskyFactor,mat,perm,0,0);CHKERRQ(ierr); 1768 ierr = (*mat->ops->choleskyfactor)(mat,perm,f);CHKERRQ(ierr); 1769 ierr = PetscLogEventEnd(MAT_CholeskyFactor,mat,perm,0,0);CHKERRQ(ierr); 1770 PetscFunctionReturn(0); 1771 } 1772 1773 #undef __FUNCT__ 1774 #define __FUNCT__ "MatCholeskyFactorSymbolic" 1775 /*@ 1776 MatCholeskyFactorSymbolic - Performs symbolic Cholesky factorization 1777 of a symmetric matrix. 1778 1779 Collective on Mat 1780 1781 Input Parameters: 1782 + mat - the matrix 1783 . perm - row and column permutations 1784 - f - expected fill as ratio of original 1785 1786 Output Parameter: 1787 . fact - the factored matrix 1788 1789 Notes: 1790 See MatLUFactorSymbolic() for the nonsymmetric case. See also 1791 MatCholeskyFactor() and MatCholeskyFactorNumeric(). 1792 1793 Most users should employ the simplified SLES interface for linear solvers 1794 instead of working directly with matrix algebra routines such as this. 1795 See, e.g., SLESCreate(). 1796 1797 Level: developer 1798 1799 Concepts: matrices^Cholesky symbolic factorization 1800 1801 .seealso: MatLUFactorSymbolic(), MatCholeskyFactor(), MatCholeskyFactorNumeric() 1802 MatGetOrdering() 1803 1804 @*/ 1805 int MatCholeskyFactorSymbolic(Mat mat,IS perm,PetscReal f,Mat *fact) 1806 { 1807 int ierr; 1808 1809 PetscFunctionBegin; 1810 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1811 PetscValidType(mat); 1812 MatPreallocated(mat); 1813 PetscValidPointer(fact); 1814 if (mat->M != mat->N) SETERRQ(PETSC_ERR_ARG_WRONG,"Matrix must be square"); 1815 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1816 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1817 if (!mat->ops->choleskyfactorsymbolic) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 1818 1819 ierr = PetscLogEventBegin(MAT_CholeskyFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr); 1820 ierr = (*mat->ops->choleskyfactorsymbolic)(mat,perm,f,fact);CHKERRQ(ierr); 1821 ierr = PetscLogEventEnd(MAT_CholeskyFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr); 1822 PetscFunctionReturn(0); 1823 } 1824 1825 #undef __FUNCT__ 1826 #define __FUNCT__ "MatCholeskyFactorNumeric" 1827 /*@ 1828 MatCholeskyFactorNumeric - Performs numeric Cholesky factorization 1829 of a symmetric matrix. Call this routine after first calling 1830 MatCholeskyFactorSymbolic(). 1831 1832 Collective on Mat 1833 1834 Input Parameter: 1835 . mat - the initial matrix 1836 1837 Output Parameter: 1838 . fact - the factored matrix 1839 1840 Notes: 1841 Most users should employ the simplified SLES interface for linear solvers 1842 instead of working directly with matrix algebra routines such as this. 1843 See, e.g., SLESCreate(). 1844 1845 Level: developer 1846 1847 Concepts: matrices^Cholesky numeric factorization 1848 1849 .seealso: MatCholeskyFactorSymbolic(), MatCholeskyFactor(), MatLUFactorNumeric() 1850 @*/ 1851 int MatCholeskyFactorNumeric(Mat mat,Mat *fact) 1852 { 1853 int ierr; 1854 1855 PetscFunctionBegin; 1856 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1857 PetscValidType(mat); 1858 MatPreallocated(mat); 1859 PetscValidPointer(fact); 1860 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1861 if (!(*fact)->ops->choleskyfactornumeric) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 1862 if (mat->M != (*fact)->M || mat->N != (*fact)->N) { 1863 SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat mat,Mat *fact: global dim %d should = %d %d should = %d", 1864 mat->M,(*fact)->M,mat->N,(*fact)->N); 1865 } 1866 1867 ierr = PetscLogEventBegin(MAT_CholeskyFactorNumeric,mat,*fact,0,0);CHKERRQ(ierr); 1868 ierr = (*(*fact)->ops->choleskyfactornumeric)(mat,fact);CHKERRQ(ierr); 1869 ierr = PetscLogEventEnd(MAT_CholeskyFactorNumeric,mat,*fact,0,0);CHKERRQ(ierr); 1870 PetscFunctionReturn(0); 1871 } 1872 1873 /* ----------------------------------------------------------------*/ 1874 #undef __FUNCT__ 1875 #define __FUNCT__ "MatSolve" 1876 /*@ 1877 MatSolve - Solves A x = b, given a factored matrix. 1878 1879 Collective on Mat and Vec 1880 1881 Input Parameters: 1882 + mat - the factored matrix 1883 - b - the right-hand-side vector 1884 1885 Output Parameter: 1886 . x - the result vector 1887 1888 Notes: 1889 The vectors b and x cannot be the same. I.e., one cannot 1890 call MatSolve(A,x,x). 1891 1892 Notes: 1893 Most users should employ the simplified SLES interface for linear solvers 1894 instead of working directly with matrix algebra routines such as this. 1895 See, e.g., SLESCreate(). 1896 1897 Level: developer 1898 1899 Concepts: matrices^triangular solves 1900 1901 .seealso: MatSolveAdd(), MatSolveTranspose(), MatSolveTransposeAdd() 1902 @*/ 1903 int MatSolve(Mat mat,Vec b,Vec x) 1904 { 1905 int ierr; 1906 1907 PetscFunctionBegin; 1908 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1909 PetscValidType(mat); 1910 MatPreallocated(mat); 1911 PetscValidHeaderSpecific(b,VEC_COOKIE); 1912 PetscValidHeaderSpecific(x,VEC_COOKIE); 1913 PetscCheckSameComm(mat,b); 1914 PetscCheckSameComm(mat,x); 1915 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 1916 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 1917 if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N); 1918 if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N); 1919 if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n); 1920 if (mat->M == 0 && mat->N == 0) PetscFunctionReturn(0); 1921 1922 if (!mat->ops->solve) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 1923 ierr = PetscLogEventBegin(MAT_Solve,mat,b,x,0);CHKERRQ(ierr); 1924 ierr = (*mat->ops->solve)(mat,b,x);CHKERRQ(ierr); 1925 ierr = PetscLogEventEnd(MAT_Solve,mat,b,x,0);CHKERRQ(ierr); 1926 PetscFunctionReturn(0); 1927 } 1928 1929 #undef __FUNCT__ 1930 #define __FUNCT__ "MatForwardSolve" 1931 /* @ 1932 MatForwardSolve - Solves L x = b, given a factored matrix, A = LU. 1933 1934 Collective on Mat and Vec 1935 1936 Input Parameters: 1937 + mat - the factored matrix 1938 - b - the right-hand-side vector 1939 1940 Output Parameter: 1941 . x - the result vector 1942 1943 Notes: 1944 MatSolve() should be used for most applications, as it performs 1945 a forward solve followed by a backward solve. 1946 1947 The vectors b and x cannot be the same. I.e., one cannot 1948 call MatForwardSolve(A,x,x). 1949 1950 Most users should employ the simplified SLES interface for linear solvers 1951 instead of working directly with matrix algebra routines such as this. 1952 See, e.g., SLESCreate(). 1953 1954 Level: developer 1955 1956 Concepts: matrices^forward solves 1957 1958 .seealso: MatSolve(), MatBackwardSolve() 1959 @ */ 1960 int MatForwardSolve(Mat mat,Vec b,Vec x) 1961 { 1962 int ierr; 1963 1964 PetscFunctionBegin; 1965 PetscValidHeaderSpecific(mat,MAT_COOKIE); 1966 PetscValidType(mat); 1967 MatPreallocated(mat); 1968 PetscValidHeaderSpecific(b,VEC_COOKIE); 1969 PetscValidHeaderSpecific(x,VEC_COOKIE); 1970 PetscCheckSameComm(mat,b); 1971 PetscCheckSameComm(mat,x); 1972 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 1973 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 1974 if (!mat->ops->forwardsolve) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 1975 if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N); 1976 if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N); 1977 if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n); 1978 1979 ierr = PetscLogEventBegin(MAT_ForwardSolve,mat,b,x,0);CHKERRQ(ierr); 1980 ierr = (*mat->ops->forwardsolve)(mat,b,x);CHKERRQ(ierr); 1981 ierr = PetscLogEventEnd(MAT_ForwardSolve,mat,b,x,0);CHKERRQ(ierr); 1982 PetscFunctionReturn(0); 1983 } 1984 1985 #undef __FUNCT__ 1986 #define __FUNCT__ "MatBackwardSolve" 1987 /* @ 1988 MatBackwardSolve - Solves U x = b, given a factored matrix, A = LU. 1989 1990 Collective on Mat and Vec 1991 1992 Input Parameters: 1993 + mat - the factored matrix 1994 - b - the right-hand-side vector 1995 1996 Output Parameter: 1997 . x - the result vector 1998 1999 Notes: 2000 MatSolve() should be used for most applications, as it performs 2001 a forward solve followed by a backward solve. 2002 2003 The vectors b and x cannot be the same. I.e., one cannot 2004 call MatBackwardSolve(A,x,x). 2005 2006 Most users should employ the simplified SLES interface for linear solvers 2007 instead of working directly with matrix algebra routines such as this. 2008 See, e.g., SLESCreate(). 2009 2010 Level: developer 2011 2012 Concepts: matrices^backward solves 2013 2014 .seealso: MatSolve(), MatForwardSolve() 2015 @ */ 2016 int MatBackwardSolve(Mat mat,Vec b,Vec x) 2017 { 2018 int ierr; 2019 2020 PetscFunctionBegin; 2021 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2022 PetscValidType(mat); 2023 MatPreallocated(mat); 2024 PetscValidHeaderSpecific(b,VEC_COOKIE); 2025 PetscValidHeaderSpecific(x,VEC_COOKIE); 2026 PetscCheckSameComm(mat,b); 2027 PetscCheckSameComm(mat,x); 2028 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 2029 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 2030 if (!mat->ops->backwardsolve) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 2031 if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N); 2032 if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N); 2033 if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n); 2034 2035 ierr = PetscLogEventBegin(MAT_BackwardSolve,mat,b,x,0);CHKERRQ(ierr); 2036 ierr = (*mat->ops->backwardsolve)(mat,b,x);CHKERRQ(ierr); 2037 ierr = PetscLogEventEnd(MAT_BackwardSolve,mat,b,x,0);CHKERRQ(ierr); 2038 PetscFunctionReturn(0); 2039 } 2040 2041 #undef __FUNCT__ 2042 #define __FUNCT__ "MatSolveAdd" 2043 /*@ 2044 MatSolveAdd - Computes x = y + inv(A)*b, given a factored matrix. 2045 2046 Collective on Mat and Vec 2047 2048 Input Parameters: 2049 + mat - the factored matrix 2050 . b - the right-hand-side vector 2051 - y - the vector to be added to 2052 2053 Output Parameter: 2054 . x - the result vector 2055 2056 Notes: 2057 The vectors b and x cannot be the same. I.e., one cannot 2058 call MatSolveAdd(A,x,y,x). 2059 2060 Most users should employ the simplified SLES interface for linear solvers 2061 instead of working directly with matrix algebra routines such as this. 2062 See, e.g., SLESCreate(). 2063 2064 Level: developer 2065 2066 Concepts: matrices^triangular solves 2067 2068 .seealso: MatSolve(), MatSolveTranspose(), MatSolveTransposeAdd() 2069 @*/ 2070 int MatSolveAdd(Mat mat,Vec b,Vec y,Vec x) 2071 { 2072 PetscScalar one = 1.0; 2073 Vec tmp; 2074 int ierr; 2075 2076 PetscFunctionBegin; 2077 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2078 PetscValidType(mat); 2079 MatPreallocated(mat); 2080 PetscValidHeaderSpecific(y,VEC_COOKIE); 2081 PetscValidHeaderSpecific(b,VEC_COOKIE); 2082 PetscValidHeaderSpecific(x,VEC_COOKIE); 2083 PetscCheckSameComm(mat,b); 2084 PetscCheckSameComm(mat,y); 2085 PetscCheckSameComm(mat,x); 2086 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 2087 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 2088 if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N); 2089 if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N); 2090 if (mat->M != y->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %d %d",mat->M,y->N); 2091 if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n); 2092 if (x->n != y->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Vec x,Vec y: local dim %d %d",x->n,y->n); 2093 2094 ierr = PetscLogEventBegin(MAT_SolveAdd,mat,b,x,y);CHKERRQ(ierr); 2095 if (mat->ops->solveadd) { 2096 ierr = (*mat->ops->solveadd)(mat,b,y,x);CHKERRQ(ierr); 2097 } else { 2098 /* do the solve then the add manually */ 2099 if (x != y) { 2100 ierr = MatSolve(mat,b,x);CHKERRQ(ierr); 2101 ierr = VecAXPY(&one,y,x);CHKERRQ(ierr); 2102 } else { 2103 ierr = VecDuplicate(x,&tmp);CHKERRQ(ierr); 2104 PetscLogObjectParent(mat,tmp); 2105 ierr = VecCopy(x,tmp);CHKERRQ(ierr); 2106 ierr = MatSolve(mat,b,x);CHKERRQ(ierr); 2107 ierr = VecAXPY(&one,tmp,x);CHKERRQ(ierr); 2108 ierr = VecDestroy(tmp);CHKERRQ(ierr); 2109 } 2110 } 2111 ierr = PetscLogEventEnd(MAT_SolveAdd,mat,b,x,y);CHKERRQ(ierr); 2112 PetscFunctionReturn(0); 2113 } 2114 2115 #undef __FUNCT__ 2116 #define __FUNCT__ "MatSolveTranspose" 2117 /*@ 2118 MatSolveTranspose - Solves A' x = b, given a factored matrix. 2119 2120 Collective on Mat and Vec 2121 2122 Input Parameters: 2123 + mat - the factored matrix 2124 - b - the right-hand-side vector 2125 2126 Output Parameter: 2127 . x - the result vector 2128 2129 Notes: 2130 The vectors b and x cannot be the same. I.e., one cannot 2131 call MatSolveTranspose(A,x,x). 2132 2133 Most users should employ the simplified SLES interface for linear solvers 2134 instead of working directly with matrix algebra routines such as this. 2135 See, e.g., SLESCreate(). 2136 2137 Level: developer 2138 2139 Concepts: matrices^triangular solves 2140 2141 .seealso: MatSolve(), MatSolveAdd(), MatSolveTransposeAdd() 2142 @*/ 2143 int MatSolveTranspose(Mat mat,Vec b,Vec x) 2144 { 2145 int ierr; 2146 2147 PetscFunctionBegin; 2148 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2149 PetscValidType(mat); 2150 MatPreallocated(mat); 2151 PetscValidHeaderSpecific(b,VEC_COOKIE); 2152 PetscValidHeaderSpecific(x,VEC_COOKIE); 2153 PetscCheckSameComm(mat,b); 2154 PetscCheckSameComm(mat,x); 2155 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 2156 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 2157 if (!mat->ops->solvetranspose) SETERRQ1(PETSC_ERR_SUP,"Matrix type %s",mat->type_name); 2158 if (mat->M != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->M,x->N); 2159 if (mat->N != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->N,b->N); 2160 2161 ierr = PetscLogEventBegin(MAT_SolveTranspose,mat,b,x,0);CHKERRQ(ierr); 2162 ierr = (*mat->ops->solvetranspose)(mat,b,x);CHKERRQ(ierr); 2163 ierr = PetscLogEventEnd(MAT_SolveTranspose,mat,b,x,0);CHKERRQ(ierr); 2164 PetscFunctionReturn(0); 2165 } 2166 2167 #undef __FUNCT__ 2168 #define __FUNCT__ "MatSolveTransposeAdd" 2169 /*@ 2170 MatSolveTransposeAdd - Computes x = y + inv(Transpose(A)) b, given a 2171 factored matrix. 2172 2173 Collective on Mat and Vec 2174 2175 Input Parameters: 2176 + mat - the factored matrix 2177 . b - the right-hand-side vector 2178 - y - the vector to be added to 2179 2180 Output Parameter: 2181 . x - the result vector 2182 2183 Notes: 2184 The vectors b and x cannot be the same. I.e., one cannot 2185 call MatSolveTransposeAdd(A,x,y,x). 2186 2187 Most users should employ the simplified SLES interface for linear solvers 2188 instead of working directly with matrix algebra routines such as this. 2189 See, e.g., SLESCreate(). 2190 2191 Level: developer 2192 2193 Concepts: matrices^triangular solves 2194 2195 .seealso: MatSolve(), MatSolveAdd(), MatSolveTranspose() 2196 @*/ 2197 int MatSolveTransposeAdd(Mat mat,Vec b,Vec y,Vec x) 2198 { 2199 PetscScalar one = 1.0; 2200 int ierr; 2201 Vec tmp; 2202 2203 PetscFunctionBegin; 2204 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2205 PetscValidType(mat); 2206 MatPreallocated(mat); 2207 PetscValidHeaderSpecific(y,VEC_COOKIE); 2208 PetscValidHeaderSpecific(b,VEC_COOKIE); 2209 PetscValidHeaderSpecific(x,VEC_COOKIE); 2210 PetscCheckSameComm(mat,b); 2211 PetscCheckSameComm(mat,y); 2212 PetscCheckSameComm(mat,x); 2213 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 2214 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 2215 if (mat->M != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->M,x->N); 2216 if (mat->N != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->N,b->N); 2217 if (mat->N != y->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %d %d",mat->N,y->N); 2218 if (x->n != y->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Vec x,Vec y: local dim %d %d",x->n,y->n); 2219 2220 ierr = PetscLogEventBegin(MAT_SolveTransposeAdd,mat,b,x,y);CHKERRQ(ierr); 2221 if (mat->ops->solvetransposeadd) { 2222 ierr = (*mat->ops->solvetransposeadd)(mat,b,y,x);CHKERRQ(ierr); 2223 } else { 2224 /* do the solve then the add manually */ 2225 if (x != y) { 2226 ierr = MatSolveTranspose(mat,b,x);CHKERRQ(ierr); 2227 ierr = VecAXPY(&one,y,x);CHKERRQ(ierr); 2228 } else { 2229 ierr = VecDuplicate(x,&tmp);CHKERRQ(ierr); 2230 PetscLogObjectParent(mat,tmp); 2231 ierr = VecCopy(x,tmp);CHKERRQ(ierr); 2232 ierr = MatSolveTranspose(mat,b,x);CHKERRQ(ierr); 2233 ierr = VecAXPY(&one,tmp,x);CHKERRQ(ierr); 2234 ierr = VecDestroy(tmp);CHKERRQ(ierr); 2235 } 2236 } 2237 ierr = PetscLogEventEnd(MAT_SolveTransposeAdd,mat,b,x,y);CHKERRQ(ierr); 2238 PetscFunctionReturn(0); 2239 } 2240 /* ----------------------------------------------------------------*/ 2241 2242 #undef __FUNCT__ 2243 #define __FUNCT__ "MatRelax" 2244 /*@ 2245 MatRelax - Computes one relaxation sweep. 2246 2247 Collective on Mat and Vec 2248 2249 Input Parameters: 2250 + mat - the matrix 2251 . b - the right hand side 2252 . omega - the relaxation factor 2253 . flag - flag indicating the type of SOR (see below) 2254 . shift - diagonal shift 2255 - its - the number of iterations 2256 - lits - the number of local iterations 2257 2258 Output Parameters: 2259 . x - the solution (can contain an initial guess) 2260 2261 SOR Flags: 2262 . SOR_FORWARD_SWEEP - forward SOR 2263 . SOR_BACKWARD_SWEEP - backward SOR 2264 . SOR_SYMMETRIC_SWEEP - SSOR (symmetric SOR) 2265 . SOR_LOCAL_FORWARD_SWEEP - local forward SOR 2266 . SOR_LOCAL_BACKWARD_SWEEP - local forward SOR 2267 . SOR_LOCAL_SYMMETRIC_SWEEP - local SSOR 2268 . SOR_APPLY_UPPER, SOR_APPLY_LOWER - applies 2269 upper/lower triangular part of matrix to 2270 vector (with omega) 2271 . SOR_ZERO_INITIAL_GUESS - zero initial guess 2272 2273 Notes: 2274 SOR_LOCAL_FORWARD_SWEEP, SOR_LOCAL_BACKWARD_SWEEP, and 2275 SOR_LOCAL_SYMMETRIC_SWEEP perform seperate independent smoothings 2276 on each processor. 2277 2278 Application programmers will not generally use MatRelax() directly, 2279 but instead will employ the SLES/PC interface. 2280 2281 Notes for Advanced Users: 2282 The flags are implemented as bitwise inclusive or operations. 2283 For example, use (SOR_ZERO_INITIAL_GUESS | SOR_SYMMETRIC_SWEEP) 2284 to specify a zero initial guess for SSOR. 2285 2286 Most users should employ the simplified SLES interface for linear solvers 2287 instead of working directly with matrix algebra routines such as this. 2288 See, e.g., SLESCreate(). 2289 2290 Level: developer 2291 2292 Concepts: matrices^relaxation 2293 Concepts: matrices^SOR 2294 Concepts: matrices^Gauss-Seidel 2295 2296 @*/ 2297 int MatRelax(Mat mat,Vec b,PetscReal omega,MatSORType flag,PetscReal shift,int its,int lits,Vec x) 2298 { 2299 int ierr; 2300 2301 PetscFunctionBegin; 2302 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2303 PetscValidType(mat); 2304 MatPreallocated(mat); 2305 PetscValidHeaderSpecific(b,VEC_COOKIE); 2306 PetscValidHeaderSpecific(x,VEC_COOKIE); 2307 PetscCheckSameComm(mat,b); 2308 PetscCheckSameComm(mat,x); 2309 if (!mat->ops->relax) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 2310 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2311 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2312 if (mat->N != x->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %d %d",mat->N,x->N); 2313 if (mat->M != b->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %d %d",mat->M,b->N); 2314 if (mat->m != b->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %d %d",mat->m,b->n); 2315 2316 ierr = PetscLogEventBegin(MAT_Relax,mat,b,x,0);CHKERRQ(ierr); 2317 ierr =(*mat->ops->relax)(mat,b,omega,flag,shift,its,lits,x);CHKERRQ(ierr); 2318 ierr = PetscLogEventEnd(MAT_Relax,mat,b,x,0);CHKERRQ(ierr); 2319 PetscFunctionReturn(0); 2320 } 2321 2322 #undef __FUNCT__ 2323 #define __FUNCT__ "MatCopy_Basic" 2324 /* 2325 Default matrix copy routine. 2326 */ 2327 int MatCopy_Basic(Mat A,Mat B,MatStructure str) 2328 { 2329 int ierr,i,rstart,rend,nz,*cwork; 2330 PetscScalar *vwork; 2331 2332 PetscFunctionBegin; 2333 ierr = MatZeroEntries(B);CHKERRQ(ierr); 2334 ierr = MatGetOwnershipRange(A,&rstart,&rend);CHKERRQ(ierr); 2335 for (i=rstart; i<rend; i++) { 2336 ierr = MatGetRow(A,i,&nz,&cwork,&vwork);CHKERRQ(ierr); 2337 ierr = MatSetValues(B,1,&i,nz,cwork,vwork,INSERT_VALUES);CHKERRQ(ierr); 2338 ierr = MatRestoreRow(A,i,&nz,&cwork,&vwork);CHKERRQ(ierr); 2339 } 2340 ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2341 ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2342 PetscFunctionReturn(0); 2343 } 2344 2345 #undef __FUNCT__ 2346 #define __FUNCT__ "MatCopy" 2347 /*@C 2348 MatCopy - Copys a matrix to another matrix. 2349 2350 Collective on Mat 2351 2352 Input Parameters: 2353 + A - the matrix 2354 - str - SAME_NONZERO_PATTERN or DIFFERENT_NONZERO_PATTERN 2355 2356 Output Parameter: 2357 . B - where the copy is put 2358 2359 Notes: 2360 If you use SAME_NONZERO_PATTERN then the two matrices had better have the 2361 same nonzero pattern or the routine will crash. 2362 2363 MatCopy() copies the matrix entries of a matrix to another existing 2364 matrix (after first zeroing the second matrix). A related routine is 2365 MatConvert(), which first creates a new matrix and then copies the data. 2366 2367 Level: intermediate 2368 2369 Concepts: matrices^copying 2370 2371 .seealso: MatConvert(), MatDuplicate() 2372 2373 @*/ 2374 int MatCopy(Mat A,Mat B,MatStructure str) 2375 { 2376 int ierr; 2377 2378 PetscFunctionBegin; 2379 PetscValidHeaderSpecific(A,MAT_COOKIE); 2380 PetscValidHeaderSpecific(B,MAT_COOKIE); 2381 PetscValidType(A); 2382 MatPreallocated(A); 2383 PetscValidType(B); 2384 MatPreallocated(B); 2385 PetscCheckSameComm(A,B); 2386 if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2387 if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2388 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, 2389 A->N,B->N); 2390 2391 ierr = PetscLogEventBegin(MAT_Copy,A,B,0,0);CHKERRQ(ierr); 2392 if (A->ops->copy) { 2393 ierr = (*A->ops->copy)(A,B,str);CHKERRQ(ierr); 2394 } else { /* generic conversion */ 2395 ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 2396 } 2397 if (A->mapping) { 2398 if (B->mapping) {ierr = ISLocalToGlobalMappingDestroy(B->mapping);CHKERRQ(ierr);B->mapping = 0;} 2399 ierr = MatSetLocalToGlobalMapping(B,A->mapping);CHKERRQ(ierr); 2400 } 2401 if (A->bmapping) { 2402 if (B->bmapping) {ierr = ISLocalToGlobalMappingDestroy(B->bmapping);CHKERRQ(ierr);B->bmapping = 0;} 2403 ierr = MatSetLocalToGlobalMappingBlock(B,A->mapping);CHKERRQ(ierr); 2404 } 2405 ierr = PetscLogEventEnd(MAT_Copy,A,B,0,0);CHKERRQ(ierr); 2406 PetscFunctionReturn(0); 2407 } 2408 2409 #include "petscsys.h" 2410 PetscTruth MatConvertRegisterAllCalled = PETSC_FALSE; 2411 PetscFList MatConvertList = 0; 2412 2413 #undef __FUNCT__ 2414 #define __FUNCT__ "MatConvertRegister" 2415 /*@C 2416 MatConvertRegister - Allows one to register a routine that converts a sparse matrix 2417 from one format to another. 2418 2419 Not Collective 2420 2421 Input Parameters: 2422 + type - the type of matrix (defined in include/petscmat.h), for example, MATSEQAIJ. 2423 - Converter - the function that reads the matrix from the binary file. 2424 2425 Level: developer 2426 2427 .seealso: MatConvertRegisterAll(), MatConvert() 2428 2429 @*/ 2430 int MatConvertRegister(char *sname,char *path,char *name,int (*function)(Mat,MatType,Mat*)) 2431 { 2432 int ierr; 2433 char fullname[PETSC_MAX_PATH_LEN]; 2434 2435 PetscFunctionBegin; 2436 ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 2437 ierr = PetscFListAdd(&MatConvertList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 2438 PetscFunctionReturn(0); 2439 } 2440 2441 #undef __FUNCT__ 2442 #define __FUNCT__ "MatConvert" 2443 /*@C 2444 MatConvert - Converts a matrix to another matrix, either of the same 2445 or different type. 2446 2447 Collective on Mat 2448 2449 Input Parameters: 2450 + mat - the matrix 2451 - newtype - new matrix type. Use MATSAME to create a new matrix of the 2452 same type as the original matrix. 2453 2454 Output Parameter: 2455 . M - pointer to place new matrix 2456 2457 Notes: 2458 MatConvert() first creates a new matrix and then copies the data from 2459 the first matrix. A related routine is MatCopy(), which copies the matrix 2460 entries of one matrix to another already existing matrix context. 2461 2462 Level: intermediate 2463 2464 Concepts: matrices^converting between storage formats 2465 2466 .seealso: MatCopy(), MatDuplicate() 2467 @*/ 2468 int MatConvert(Mat mat,MatType newtype,Mat *M) 2469 { 2470 int ierr; 2471 PetscTruth sametype,issame,flg; 2472 char convname[256],mtype[256]; 2473 2474 PetscFunctionBegin; 2475 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2476 PetscValidType(mat); 2477 MatPreallocated(mat); 2478 PetscValidPointer(M); 2479 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2480 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2481 2482 ierr = PetscOptionsGetString(PETSC_NULL,"-matconvert_type",mtype,256,&flg);CHKERRQ(ierr); 2483 if (flg) { 2484 newtype = mtype; 2485 } 2486 ierr = PetscLogEventBegin(MAT_Convert,mat,0,0,0);CHKERRQ(ierr); 2487 2488 ierr = PetscTypeCompare((PetscObject)mat,newtype,&sametype);CHKERRQ(ierr); 2489 ierr = PetscStrcmp(newtype,"same",&issame);CHKERRQ(ierr); 2490 if ((sametype || issame) && mat->ops->duplicate) { 2491 ierr = (*mat->ops->duplicate)(mat,MAT_COPY_VALUES,M);CHKERRQ(ierr); 2492 } else { 2493 int (*conv)(Mat,MatType,Mat*); 2494 if (!MatConvertRegisterAllCalled) { 2495 ierr = MatConvertRegisterAll(PETSC_NULL);CHKERRQ(ierr); 2496 } 2497 ierr = PetscFListFind(mat->comm,MatConvertList,newtype,(void(**)(void))&conv);CHKERRQ(ierr); 2498 if (conv) { 2499 ierr = (*conv)(mat,newtype,M);CHKERRQ(ierr); 2500 } else { 2501 ierr = PetscStrcpy(convname,"MatConvert_");CHKERRQ(ierr); 2502 ierr = PetscStrcat(convname,mat->type_name);CHKERRQ(ierr); 2503 ierr = PetscStrcat(convname,"_");CHKERRQ(ierr); 2504 ierr = PetscStrcat(convname,newtype);CHKERRQ(ierr); 2505 ierr = PetscStrcat(convname,"_C");CHKERRQ(ierr); 2506 ierr = PetscObjectQueryFunction((PetscObject)mat,convname,(void (**)(void))&conv);CHKERRQ(ierr); 2507 if (conv) { 2508 ierr = (*conv)(mat,newtype,M);CHKERRQ(ierr); 2509 } else { 2510 if (mat->ops->convert) { 2511 ierr = (*mat->ops->convert)(mat,newtype,M);CHKERRQ(ierr); 2512 } else { 2513 ierr = MatConvert_Basic(mat,newtype,M);CHKERRQ(ierr); 2514 } 2515 } 2516 } 2517 } 2518 ierr = PetscLogEventEnd(MAT_Convert,mat,0,0,0);CHKERRQ(ierr); 2519 PetscFunctionReturn(0); 2520 } 2521 2522 2523 #undef __FUNCT__ 2524 #define __FUNCT__ "MatDuplicate" 2525 /*@C 2526 MatDuplicate - Duplicates a matrix including the non-zero structure. 2527 2528 Collective on Mat 2529 2530 Input Parameters: 2531 + mat - the matrix 2532 - op - either MAT_DO_NOT_COPY_VALUES or MAT_COPY_VALUES, cause it to copy nonzero 2533 values as well or not 2534 2535 Output Parameter: 2536 . M - pointer to place new matrix 2537 2538 Level: intermediate 2539 2540 Concepts: matrices^duplicating 2541 2542 .seealso: MatCopy(), MatConvert() 2543 @*/ 2544 int MatDuplicate(Mat mat,MatDuplicateOption op,Mat *M) 2545 { 2546 int ierr; 2547 2548 PetscFunctionBegin; 2549 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2550 PetscValidType(mat); 2551 MatPreallocated(mat); 2552 PetscValidPointer(M); 2553 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2554 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2555 2556 *M = 0; 2557 ierr = PetscLogEventBegin(MAT_Convert,mat,0,0,0);CHKERRQ(ierr); 2558 if (!mat->ops->duplicate) { 2559 SETERRQ(PETSC_ERR_SUP,"Not written for this matrix type"); 2560 } 2561 ierr = (*mat->ops->duplicate)(mat,op,M);CHKERRQ(ierr); 2562 if (mat->mapping) { 2563 ierr = MatSetLocalToGlobalMapping(*M,mat->mapping);CHKERRQ(ierr); 2564 } 2565 if (mat->bmapping) { 2566 ierr = MatSetLocalToGlobalMappingBlock(*M,mat->mapping);CHKERRQ(ierr); 2567 } 2568 ierr = PetscLogEventEnd(MAT_Convert,mat,0,0,0);CHKERRQ(ierr); 2569 PetscFunctionReturn(0); 2570 } 2571 2572 #undef __FUNCT__ 2573 #define __FUNCT__ "MatGetDiagonal" 2574 /*@ 2575 MatGetDiagonal - Gets the diagonal of a matrix. 2576 2577 Collective on Mat and Vec 2578 2579 Input Parameters: 2580 + mat - the matrix 2581 - v - the vector for storing the diagonal 2582 2583 Output Parameter: 2584 . v - the diagonal of the matrix 2585 2586 Notes: 2587 For the SeqAIJ matrix format, this routine may also be called 2588 on a LU factored matrix; in that case it routines the reciprocal of 2589 the diagonal entries in U. It returns the entries permuted by the 2590 row and column permutation used during the symbolic factorization. 2591 2592 Level: intermediate 2593 2594 Concepts: matrices^accessing diagonals 2595 2596 .seealso: MatGetRow(), MatGetSubmatrices(), MatGetSubmatrix(), MatGetRowMax() 2597 @*/ 2598 int MatGetDiagonal(Mat mat,Vec v) 2599 { 2600 int ierr; 2601 2602 PetscFunctionBegin; 2603 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2604 PetscValidType(mat); 2605 MatPreallocated(mat); 2606 PetscValidHeaderSpecific(v,VEC_COOKIE); 2607 /* PetscCheckSameComm(mat,v); Could be MPI vector but Seq matrix cause of two submatrix storage */ 2608 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2609 if (!mat->ops->getdiagonal) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 2610 2611 ierr = (*mat->ops->getdiagonal)(mat,v);CHKERRQ(ierr); 2612 PetscFunctionReturn(0); 2613 } 2614 2615 #undef __FUNCT__ 2616 #define __FUNCT__ "MatGetRowMax" 2617 /*@ 2618 MatGetRowMax - Gets the maximum value (in absolute value) of each 2619 row of the matrix 2620 2621 Collective on Mat and Vec 2622 2623 Input Parameters: 2624 . mat - the matrix 2625 2626 Output Parameter: 2627 . v - the vector for storing the maximums 2628 2629 Level: intermediate 2630 2631 Concepts: matrices^getting row maximums 2632 2633 .seealso: MatGetDiagonal(), MatGetSubmatrices(), MatGetSubmatrix() 2634 @*/ 2635 int MatGetRowMax(Mat mat,Vec v) 2636 { 2637 int ierr; 2638 2639 PetscFunctionBegin; 2640 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2641 PetscValidType(mat); 2642 MatPreallocated(mat); 2643 PetscValidHeaderSpecific(v,VEC_COOKIE); 2644 /* PetscCheckSameComm(mat,v); Could be MPI vector but Seq matrix cause of two submatrix storage */ 2645 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2646 if (!mat->ops->getrowmax) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 2647 2648 ierr = (*mat->ops->getrowmax)(mat,v);CHKERRQ(ierr); 2649 PetscFunctionReturn(0); 2650 } 2651 2652 #undef __FUNCT__ 2653 #define __FUNCT__ "MatTranspose" 2654 /*@C 2655 MatTranspose - Computes an in-place or out-of-place transpose of a matrix. 2656 2657 Collective on Mat 2658 2659 Input Parameter: 2660 . mat - the matrix to transpose 2661 2662 Output Parameters: 2663 . B - the transpose (or pass in PETSC_NULL for an in-place transpose) 2664 2665 Level: intermediate 2666 2667 Concepts: matrices^transposing 2668 2669 .seealso: MatMultTranspose(), MatMultTransposeAdd() 2670 @*/ 2671 int MatTranspose(Mat mat,Mat *B) 2672 { 2673 int ierr; 2674 2675 PetscFunctionBegin; 2676 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2677 PetscValidType(mat); 2678 MatPreallocated(mat); 2679 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2680 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2681 if (!mat->ops->transpose) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 2682 2683 ierr = PetscLogEventBegin(MAT_Transpose,mat,0,0,0);CHKERRQ(ierr); 2684 ierr = (*mat->ops->transpose)(mat,B);CHKERRQ(ierr); 2685 ierr = PetscLogEventEnd(MAT_Transpose,mat,0,0,0);CHKERRQ(ierr); 2686 PetscFunctionReturn(0); 2687 } 2688 2689 #undef __FUNCT__ 2690 #define __FUNCT__ "MatPermute" 2691 /*@C 2692 MatPermute - Creates a new matrix with rows and columns permuted from the 2693 original. 2694 2695 Collective on Mat 2696 2697 Input Parameters: 2698 + mat - the matrix to permute 2699 . row - row permutation, each processor supplies only the permutation for its rows 2700 - col - column permutation, each processor needs the entire column permutation, that is 2701 this is the same size as the total number of columns in the matrix 2702 2703 Output Parameters: 2704 . B - the permuted matrix 2705 2706 Level: advanced 2707 2708 Concepts: matrices^permuting 2709 2710 .seealso: MatGetOrdering() 2711 @*/ 2712 int MatPermute(Mat mat,IS row,IS col,Mat *B) 2713 { 2714 int ierr; 2715 2716 PetscFunctionBegin; 2717 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2718 PetscValidType(mat); 2719 MatPreallocated(mat); 2720 PetscValidHeaderSpecific(row,IS_COOKIE); 2721 PetscValidHeaderSpecific(col,IS_COOKIE); 2722 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2723 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2724 if (!mat->ops->permute) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 2725 ierr = (*mat->ops->permute)(mat,row,col,B);CHKERRQ(ierr); 2726 PetscFunctionReturn(0); 2727 } 2728 2729 #undef __FUNCT__ 2730 #define __FUNCT__ "MatPermuteSparsify" 2731 /*@C 2732 MatPermuteSparsify - Creates a new matrix with rows and columns permuted from the 2733 original and sparsified to the prescribed tolerance. 2734 2735 Collective on Mat 2736 2737 Input Parameters: 2738 + A - The matrix to permute 2739 . band - The half-bandwidth of the sparsified matrix, or PETSC_DECIDE 2740 . frac - The half-bandwidth as a fraction of the total size, or 0.0 2741 . tol - The drop tolerance 2742 . rowp - The row permutation 2743 - colp - The column permutation 2744 2745 Output Parameter: 2746 . B - The permuted, sparsified matrix 2747 2748 Level: advanced 2749 2750 Note: 2751 The default behavior (band = PETSC_DECIDE and frac = 0.0) is to 2752 restrict the half-bandwidth of the resulting matrix to 5% of the 2753 total matrix size. 2754 2755 .keywords: matrix, permute, sparsify 2756 2757 .seealso: MatGetOrdering(), MatPermute() 2758 @*/ 2759 int MatPermuteSparsify(Mat A, int band, PetscReal frac, PetscReal tol, IS rowp, IS colp, Mat *B) 2760 { 2761 IS irowp, icolp; 2762 int *rows, *cols; 2763 int M, N, locRowStart, locRowEnd; 2764 int nz, newNz; 2765 int *cwork, *cnew; 2766 PetscScalar *vwork, *vnew; 2767 int bw, size; 2768 int row, locRow, newRow, col, newCol; 2769 int ierr; 2770 2771 PetscFunctionBegin; 2772 PetscValidHeaderSpecific(A, MAT_COOKIE); 2773 PetscValidHeaderSpecific(rowp, IS_COOKIE); 2774 PetscValidHeaderSpecific(colp, IS_COOKIE); 2775 if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE, "Not for unassembled matrix"); 2776 if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE, "Not for factored matrix"); 2777 if (!A->ops->permutesparsify) { 2778 ierr = MatGetSize(A, &M, &N); CHKERRQ(ierr); 2779 ierr = MatGetOwnershipRange(A, &locRowStart, &locRowEnd); CHKERRQ(ierr); 2780 ierr = ISGetSize(rowp, &size); CHKERRQ(ierr); 2781 if (size != M) SETERRQ2(PETSC_ERR_ARG_WRONG, "Wrong size %d for row permutation, should be %d", size, M); 2782 ierr = ISGetSize(colp, &size); CHKERRQ(ierr); 2783 if (size != N) SETERRQ2(PETSC_ERR_ARG_WRONG, "Wrong size %d for column permutation, should be %d", size, N); 2784 ierr = ISInvertPermutation(rowp, 0, &irowp); CHKERRQ(ierr); 2785 ierr = ISGetIndices(irowp, &rows); CHKERRQ(ierr); 2786 ierr = ISInvertPermutation(colp, 0, &icolp); CHKERRQ(ierr); 2787 ierr = ISGetIndices(icolp, &cols); CHKERRQ(ierr); 2788 ierr = PetscMalloc(N * sizeof(int), &cnew); CHKERRQ(ierr); 2789 ierr = PetscMalloc(N * sizeof(PetscScalar), &vnew); CHKERRQ(ierr); 2790 2791 /* Setup bandwidth to include */ 2792 if (band == PETSC_DECIDE) { 2793 if (frac <= 0.0) 2794 bw = (int) (M * 0.05); 2795 else 2796 bw = (int) (M * frac); 2797 } else { 2798 if (band <= 0) SETERRQ(PETSC_ERR_ARG_WRONG, "Bandwidth must be a positive integer"); 2799 bw = band; 2800 } 2801 2802 /* Put values into new matrix */ 2803 ierr = MatDuplicate(A, MAT_DO_NOT_COPY_VALUES, B); CHKERRQ(ierr); 2804 for(row = locRowStart, locRow = 0; row < locRowEnd; row++, locRow++) { 2805 ierr = MatGetRow(A, row, &nz, &cwork, &vwork); CHKERRQ(ierr); 2806 newRow = rows[locRow]+locRowStart; 2807 for(col = 0, newNz = 0; col < nz; col++) { 2808 newCol = cols[cwork[col]]; 2809 if ((newCol >= newRow - bw) && (newCol < newRow + bw) && (PetscAbsScalar(vwork[col]) >= tol)) { 2810 cnew[newNz] = newCol; 2811 vnew[newNz] = vwork[col]; 2812 newNz++; 2813 } 2814 } 2815 ierr = MatSetValues(*B, 1, &newRow, newNz, cnew, vnew, INSERT_VALUES); CHKERRQ(ierr); 2816 ierr = MatRestoreRow(A, row, &nz, &cwork, &vwork); CHKERRQ(ierr); 2817 } 2818 ierr = PetscFree(cnew); CHKERRQ(ierr); 2819 ierr = PetscFree(vnew); CHKERRQ(ierr); 2820 ierr = MatAssemblyBegin(*B, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); 2821 ierr = MatAssemblyEnd(*B, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); 2822 ierr = ISRestoreIndices(irowp, &rows); CHKERRQ(ierr); 2823 ierr = ISRestoreIndices(icolp, &cols); CHKERRQ(ierr); 2824 ierr = ISDestroy(irowp); CHKERRQ(ierr); 2825 ierr = ISDestroy(icolp); CHKERRQ(ierr); 2826 } else { 2827 ierr = (*A->ops->permutesparsify)(A, band, frac, tol, rowp, colp, B); CHKERRQ(ierr); 2828 } 2829 PetscFunctionReturn(0); 2830 } 2831 2832 #undef __FUNCT__ 2833 #define __FUNCT__ "MatEqual" 2834 /*@ 2835 MatEqual - Compares two matrices. 2836 2837 Collective on Mat 2838 2839 Input Parameters: 2840 + A - the first matrix 2841 - B - the second matrix 2842 2843 Output Parameter: 2844 . flg - PETSC_TRUE if the matrices are equal; PETSC_FALSE otherwise. 2845 2846 Level: intermediate 2847 2848 Concepts: matrices^equality between 2849 @*/ 2850 int MatEqual(Mat A,Mat B,PetscTruth *flg) 2851 { 2852 int ierr; 2853 2854 PetscFunctionBegin; 2855 PetscValidHeaderSpecific(A,MAT_COOKIE); 2856 PetscValidHeaderSpecific(B,MAT_COOKIE); 2857 PetscValidType(A); 2858 MatPreallocated(A); 2859 PetscValidType(B); 2860 MatPreallocated(B); 2861 PetscValidIntPointer(flg); 2862 PetscCheckSameComm(A,B); 2863 if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2864 if (!B->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2865 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); 2866 if (!A->ops->equal) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",A->type_name); 2867 ierr = (*A->ops->equal)(A,B,flg);CHKERRQ(ierr); 2868 PetscFunctionReturn(0); 2869 } 2870 2871 #undef __FUNCT__ 2872 #define __FUNCT__ "MatDiagonalScale" 2873 /*@ 2874 MatDiagonalScale - Scales a matrix on the left and right by diagonal 2875 matrices that are stored as vectors. Either of the two scaling 2876 matrices can be PETSC_NULL. 2877 2878 Collective on Mat 2879 2880 Input Parameters: 2881 + mat - the matrix to be scaled 2882 . l - the left scaling vector (or PETSC_NULL) 2883 - r - the right scaling vector (or PETSC_NULL) 2884 2885 Notes: 2886 MatDiagonalScale() computes A = LAR, where 2887 L = a diagonal matrix, R = a diagonal matrix 2888 2889 Level: intermediate 2890 2891 Concepts: matrices^diagonal scaling 2892 Concepts: diagonal scaling of matrices 2893 2894 .seealso: MatScale() 2895 @*/ 2896 int MatDiagonalScale(Mat mat,Vec l,Vec r) 2897 { 2898 int ierr; 2899 2900 PetscFunctionBegin; 2901 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2902 PetscValidType(mat); 2903 MatPreallocated(mat); 2904 if (!mat->ops->diagonalscale) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 2905 if (l) {PetscValidHeaderSpecific(l,VEC_COOKIE);PetscCheckSameComm(mat,l);} 2906 if (r) {PetscValidHeaderSpecific(r,VEC_COOKIE);PetscCheckSameComm(mat,r);} 2907 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2908 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2909 2910 ierr = PetscLogEventBegin(MAT_Scale,mat,0,0,0);CHKERRQ(ierr); 2911 ierr = (*mat->ops->diagonalscale)(mat,l,r);CHKERRQ(ierr); 2912 ierr = PetscLogEventEnd(MAT_Scale,mat,0,0,0);CHKERRQ(ierr); 2913 PetscFunctionReturn(0); 2914 } 2915 2916 #undef __FUNCT__ 2917 #define __FUNCT__ "MatScale" 2918 /*@ 2919 MatScale - Scales all elements of a matrix by a given number. 2920 2921 Collective on Mat 2922 2923 Input Parameters: 2924 + mat - the matrix to be scaled 2925 - a - the scaling value 2926 2927 Output Parameter: 2928 . mat - the scaled matrix 2929 2930 Level: intermediate 2931 2932 Concepts: matrices^scaling all entries 2933 2934 .seealso: MatDiagonalScale() 2935 @*/ 2936 int MatScale(PetscScalar *a,Mat mat) 2937 { 2938 int ierr; 2939 2940 PetscFunctionBegin; 2941 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2942 PetscValidType(mat); 2943 MatPreallocated(mat); 2944 PetscValidScalarPointer(a); 2945 if (!mat->ops->scale) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 2946 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2947 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2948 2949 ierr = PetscLogEventBegin(MAT_Scale,mat,0,0,0);CHKERRQ(ierr); 2950 ierr = (*mat->ops->scale)(a,mat);CHKERRQ(ierr); 2951 ierr = PetscLogEventEnd(MAT_Scale,mat,0,0,0);CHKERRQ(ierr); 2952 PetscFunctionReturn(0); 2953 } 2954 2955 #undef __FUNCT__ 2956 #define __FUNCT__ "MatNorm" 2957 /*@ 2958 MatNorm - Calculates various norms of a matrix. 2959 2960 Collective on Mat 2961 2962 Input Parameters: 2963 + mat - the matrix 2964 - type - the type of norm, NORM_1, NORM_FROBENIUS, NORM_INFINITY 2965 2966 Output Parameters: 2967 . nrm - the resulting norm 2968 2969 Level: intermediate 2970 2971 Concepts: matrices^norm 2972 Concepts: norm^of matrix 2973 @*/ 2974 int MatNorm(Mat mat,NormType type,PetscReal *nrm) 2975 { 2976 int ierr; 2977 2978 PetscFunctionBegin; 2979 PetscValidHeaderSpecific(mat,MAT_COOKIE); 2980 PetscValidType(mat); 2981 MatPreallocated(mat); 2982 PetscValidScalarPointer(nrm); 2983 2984 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2985 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2986 if (!mat->ops->norm) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 2987 ierr = (*mat->ops->norm)(mat,type,nrm);CHKERRQ(ierr); 2988 PetscFunctionReturn(0); 2989 } 2990 2991 /* 2992 This variable is used to prevent counting of MatAssemblyBegin() that 2993 are called from within a MatAssemblyEnd(). 2994 */ 2995 static int MatAssemblyEnd_InUse = 0; 2996 #undef __FUNCT__ 2997 #define __FUNCT__ "MatAssemblyBegin" 2998 /*@ 2999 MatAssemblyBegin - Begins assembling the matrix. This routine should 3000 be called after completing all calls to MatSetValues(). 3001 3002 Collective on Mat 3003 3004 Input Parameters: 3005 + mat - the matrix 3006 - type - type of assembly, either MAT_FLUSH_ASSEMBLY or MAT_FINAL_ASSEMBLY 3007 3008 Notes: 3009 MatSetValues() generally caches the values. The matrix is ready to 3010 use only after MatAssemblyBegin() and MatAssemblyEnd() have been called. 3011 Use MAT_FLUSH_ASSEMBLY when switching between ADD_VALUES and INSERT_VALUES 3012 in MatSetValues(); use MAT_FINAL_ASSEMBLY for the final assembly before 3013 using the matrix. 3014 3015 Level: beginner 3016 3017 Concepts: matrices^assembling 3018 3019 .seealso: MatAssemblyEnd(), MatSetValues(), MatAssembled() 3020 @*/ 3021 int MatAssemblyBegin(Mat mat,MatAssemblyType type) 3022 { 3023 int ierr; 3024 3025 PetscFunctionBegin; 3026 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3027 PetscValidType(mat); 3028 MatPreallocated(mat); 3029 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix.\nDid you forget to call MatSetUnfactored()?"); 3030 if (mat->assembled) { 3031 mat->was_assembled = PETSC_TRUE; 3032 mat->assembled = PETSC_FALSE; 3033 } 3034 if (!MatAssemblyEnd_InUse) { 3035 ierr = PetscLogEventBegin(MAT_AssemblyBegin,mat,0,0,0);CHKERRQ(ierr); 3036 if (mat->ops->assemblybegin){ierr = (*mat->ops->assemblybegin)(mat,type);CHKERRQ(ierr);} 3037 ierr = PetscLogEventEnd(MAT_AssemblyBegin,mat,0,0,0);CHKERRQ(ierr); 3038 } else { 3039 if (mat->ops->assemblybegin){ierr = (*mat->ops->assemblybegin)(mat,type);CHKERRQ(ierr);} 3040 } 3041 PetscFunctionReturn(0); 3042 } 3043 3044 #undef __FUNCT__ 3045 #define __FUNCT__ "MatAssembed" 3046 /*@ 3047 MatAssembled - Indicates if a matrix has been assembled and is ready for 3048 use; for example, in matrix-vector product. 3049 3050 Collective on Mat 3051 3052 Input Parameter: 3053 . mat - the matrix 3054 3055 Output Parameter: 3056 . assembled - PETSC_TRUE or PETSC_FALSE 3057 3058 Level: advanced 3059 3060 Concepts: matrices^assembled? 3061 3062 .seealso: MatAssemblyEnd(), MatSetValues(), MatAssemblyBegin() 3063 @*/ 3064 int MatAssembled(Mat mat,PetscTruth *assembled) 3065 { 3066 PetscFunctionBegin; 3067 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3068 PetscValidType(mat); 3069 MatPreallocated(mat); 3070 *assembled = mat->assembled; 3071 PetscFunctionReturn(0); 3072 } 3073 3074 #undef __FUNCT__ 3075 #define __FUNCT__ "MatView_Private" 3076 /* 3077 Processes command line options to determine if/how a matrix 3078 is to be viewed. Called by MatAssemblyEnd() and MatLoad(). 3079 */ 3080 int MatView_Private(Mat mat) 3081 { 3082 int ierr; 3083 PetscTruth flg; 3084 static PetscTruth incall = PETSC_FALSE; 3085 3086 PetscFunctionBegin; 3087 if (incall) PetscFunctionReturn(0); 3088 incall = PETSC_TRUE; 3089 ierr = PetscOptionsBegin(mat->comm,mat->prefix,"Matrix Options","Mat");CHKERRQ(ierr); 3090 ierr = PetscOptionsName("-mat_view_info","Information on matrix size","MatView",&flg);CHKERRQ(ierr); 3091 if (flg) { 3092 ierr = PetscViewerPushFormat(PETSC_VIEWER_STDOUT_(mat->comm),PETSC_VIEWER_ASCII_INFO);CHKERRQ(ierr); 3093 ierr = MatView(mat,PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr); 3094 ierr = PetscViewerPopFormat(PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr); 3095 } 3096 ierr = PetscOptionsName("-mat_view_info_detailed","Nonzeros in the matrix","MatView",&flg);CHKERRQ(ierr); 3097 if (flg) { 3098 ierr = PetscViewerPushFormat(PETSC_VIEWER_STDOUT_(mat->comm),PETSC_VIEWER_ASCII_INFO_DETAIL);CHKERRQ(ierr); 3099 ierr = MatView(mat,PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr); 3100 ierr = PetscViewerPopFormat(PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr); 3101 } 3102 ierr = PetscOptionsName("-mat_view","Print matrix to stdout","MatView",&flg);CHKERRQ(ierr); 3103 if (flg) { 3104 ierr = MatView(mat,PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr); 3105 } 3106 ierr = PetscOptionsName("-mat_view_matlab","Print matrix to stdout in a format Matlab can read","MatView",&flg);CHKERRQ(ierr); 3107 if (flg) { 3108 ierr = PetscViewerPushFormat(PETSC_VIEWER_STDOUT_(mat->comm),PETSC_VIEWER_ASCII_MATLAB);CHKERRQ(ierr); 3109 ierr = MatView(mat,PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr); 3110 ierr = PetscViewerPopFormat(PETSC_VIEWER_STDOUT_(mat->comm));CHKERRQ(ierr); 3111 } 3112 ierr = PetscOptionsName("-mat_view_socket","Send matrix to socket (can be read from matlab)","MatView",&flg);CHKERRQ(ierr); 3113 if (flg) { 3114 ierr = MatView(mat,PETSC_VIEWER_SOCKET_(mat->comm));CHKERRQ(ierr); 3115 ierr = PetscViewerFlush(PETSC_VIEWER_SOCKET_(mat->comm));CHKERRQ(ierr); 3116 } 3117 ierr = PetscOptionsName("-mat_view_binary","Save matrix to file in binary format","MatView",&flg);CHKERRQ(ierr); 3118 if (flg) { 3119 ierr = MatView(mat,PETSC_VIEWER_BINARY_(mat->comm));CHKERRQ(ierr); 3120 ierr = PetscViewerFlush(PETSC_VIEWER_BINARY_(mat->comm));CHKERRQ(ierr); 3121 } 3122 ierr = PetscOptionsEnd();CHKERRQ(ierr); 3123 /* cannot have inside PetscOptionsBegin() because uses PetscOptionsBegin() */ 3124 ierr = PetscOptionsHasName(mat->prefix,"-mat_view_draw",&flg);CHKERRQ(ierr); 3125 if (flg) { 3126 ierr = PetscOptionsHasName(mat->prefix,"-mat_view_contour",&flg);CHKERRQ(ierr); 3127 if (flg) { 3128 PetscViewerPushFormat(PETSC_VIEWER_DRAW_(mat->comm),PETSC_VIEWER_DRAW_CONTOUR);CHKERRQ(ierr); 3129 } 3130 ierr = MatView(mat,PETSC_VIEWER_DRAW_(mat->comm));CHKERRQ(ierr); 3131 ierr = PetscViewerFlush(PETSC_VIEWER_DRAW_(mat->comm));CHKERRQ(ierr); 3132 if (flg) { 3133 PetscViewerPopFormat(PETSC_VIEWER_DRAW_(mat->comm));CHKERRQ(ierr); 3134 } 3135 } 3136 incall = PETSC_FALSE; 3137 PetscFunctionReturn(0); 3138 } 3139 3140 #undef __FUNCT__ 3141 #define __FUNCT__ "MatAssemblyEnd" 3142 /*@ 3143 MatAssemblyEnd - Completes assembling the matrix. This routine should 3144 be called after MatAssemblyBegin(). 3145 3146 Collective on Mat 3147 3148 Input Parameters: 3149 + mat - the matrix 3150 - type - type of assembly, either MAT_FLUSH_ASSEMBLY or MAT_FINAL_ASSEMBLY 3151 3152 Options Database Keys: 3153 + -mat_view_info - Prints info on matrix at conclusion of MatEndAssembly() 3154 . -mat_view_info_detailed - Prints more detailed info 3155 . -mat_view - Prints matrix in ASCII format 3156 . -mat_view_matlab - Prints matrix in Matlab format 3157 . -mat_view_draw - PetscDraws nonzero structure of matrix, using MatView() and PetscDrawOpenX(). 3158 . -display <name> - Sets display name (default is host) 3159 . -draw_pause <sec> - Sets number of seconds to pause after display 3160 . -mat_view_socket - Sends matrix to socket, can be accessed from Matlab (see users manual) 3161 . -viewer_socket_machine <machine> 3162 . -viewer_socket_port <port> 3163 . -mat_view_binary - save matrix to file in binary format 3164 - -viewer_binary_filename <name> 3165 3166 Notes: 3167 MatSetValues() generally caches the values. The matrix is ready to 3168 use only after MatAssemblyBegin() and MatAssemblyEnd() have been called. 3169 Use MAT_FLUSH_ASSEMBLY when switching between ADD_VALUES and INSERT_VALUES 3170 in MatSetValues(); use MAT_FINAL_ASSEMBLY for the final assembly before 3171 using the matrix. 3172 3173 Level: beginner 3174 3175 .seealso: MatAssemblyBegin(), MatSetValues(), PetscDrawOpenX(), MatView(), MatAssembled(), PetscViewerSocketOpen() 3176 @*/ 3177 int MatAssemblyEnd(Mat mat,MatAssemblyType type) 3178 { 3179 int ierr; 3180 static int inassm = 0; 3181 PetscTruth flg; 3182 3183 PetscFunctionBegin; 3184 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3185 PetscValidType(mat); 3186 MatPreallocated(mat); 3187 3188 inassm++; 3189 MatAssemblyEnd_InUse++; 3190 if (MatAssemblyEnd_InUse == 1) { /* Do the logging only the first time through */ 3191 ierr = PetscLogEventBegin(MAT_AssemblyEnd,mat,0,0,0);CHKERRQ(ierr); 3192 if (mat->ops->assemblyend) { 3193 ierr = (*mat->ops->assemblyend)(mat,type);CHKERRQ(ierr); 3194 } 3195 ierr = PetscLogEventEnd(MAT_AssemblyEnd,mat,0,0,0);CHKERRQ(ierr); 3196 } else { 3197 if (mat->ops->assemblyend) { 3198 ierr = (*mat->ops->assemblyend)(mat,type);CHKERRQ(ierr); 3199 } 3200 } 3201 3202 /* Flush assembly is not a true assembly */ 3203 if (type != MAT_FLUSH_ASSEMBLY) { 3204 mat->assembled = PETSC_TRUE; mat->num_ass++; 3205 } 3206 mat->insertmode = NOT_SET_VALUES; 3207 MatAssemblyEnd_InUse--; 3208 3209 if (inassm == 1 && type != MAT_FLUSH_ASSEMBLY) { 3210 ierr = MatView_Private(mat);CHKERRQ(ierr); 3211 } 3212 inassm--; 3213 ierr = PetscOptionsHasName(mat->prefix,"-help",&flg);CHKERRQ(ierr); 3214 if (flg) { 3215 ierr = MatPrintHelp(mat);CHKERRQ(ierr); 3216 } 3217 PetscFunctionReturn(0); 3218 } 3219 3220 3221 #undef __FUNCT__ 3222 #define __FUNCT__ "MatCompress" 3223 /*@ 3224 MatCompress - Tries to store the matrix in as little space as 3225 possible. May fail if memory is already fully used, since it 3226 tries to allocate new space. 3227 3228 Collective on Mat 3229 3230 Input Parameters: 3231 . mat - the matrix 3232 3233 Level: advanced 3234 3235 @*/ 3236 int MatCompress(Mat mat) 3237 { 3238 int ierr; 3239 3240 PetscFunctionBegin; 3241 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3242 PetscValidType(mat); 3243 MatPreallocated(mat); 3244 if (mat->ops->compress) {ierr = (*mat->ops->compress)(mat);CHKERRQ(ierr);} 3245 PetscFunctionReturn(0); 3246 } 3247 3248 #undef __FUNCT__ 3249 #define __FUNCT__ "MatSetOption" 3250 /*@ 3251 MatSetOption - Sets a parameter option for a matrix. Some options 3252 may be specific to certain storage formats. Some options 3253 determine how values will be inserted (or added). Sorted, 3254 row-oriented input will generally assemble the fastest. The default 3255 is row-oriented, nonsorted input. 3256 3257 Collective on Mat 3258 3259 Input Parameters: 3260 + mat - the matrix 3261 - option - the option, one of those listed below (and possibly others), 3262 e.g., MAT_ROWS_SORTED, MAT_NEW_NONZERO_LOCATION_ERR 3263 3264 Options Describing Matrix Structure: 3265 + MAT_SYMMETRIC - symmetric in terms of both structure and value 3266 - MAT_STRUCTURALLY_SYMMETRIC - symmetric nonzero structure 3267 3268 Options For Use with MatSetValues(): 3269 Insert a logically dense subblock, which can be 3270 + MAT_ROW_ORIENTED - row-oriented (default) 3271 . MAT_COLUMN_ORIENTED - column-oriented 3272 . MAT_ROWS_SORTED - sorted by row 3273 . MAT_ROWS_UNSORTED - not sorted by row (default) 3274 . MAT_COLUMNS_SORTED - sorted by column 3275 - MAT_COLUMNS_UNSORTED - not sorted by column (default) 3276 3277 Not these options reflect the data you pass in with MatSetValues(); it has 3278 nothing to do with how the data is stored internally in the matrix 3279 data structure. 3280 3281 When (re)assembling a matrix, we can restrict the input for 3282 efficiency/debugging purposes. These options include 3283 + MAT_NO_NEW_NONZERO_LOCATIONS - additional insertions will not be 3284 allowed if they generate a new nonzero 3285 . MAT_YES_NEW_NONZERO_LOCATIONS - additional insertions will be allowed 3286 . MAT_NO_NEW_DIAGONALS - additional insertions will not be allowed if 3287 they generate a nonzero in a new diagonal (for block diagonal format only) 3288 . MAT_YES_NEW_DIAGONALS - new diagonals will be allowed (for block diagonal format only) 3289 . MAT_IGNORE_OFF_PROC_ENTRIES - drops off-processor entries 3290 . MAT_NEW_NONZERO_LOCATION_ERR - generates an error for new matrix entry 3291 - MAT_USE_HASH_TABLE - uses a hash table to speed up matrix assembly 3292 3293 Notes: 3294 Some options are relevant only for particular matrix types and 3295 are thus ignored by others. Other options are not supported by 3296 certain matrix types and will generate an error message if set. 3297 3298 If using a Fortran 77 module to compute a matrix, one may need to 3299 use the column-oriented option (or convert to the row-oriented 3300 format). 3301 3302 MAT_NO_NEW_NONZERO_LOCATIONS indicates that any add or insertion 3303 that would generate a new entry in the nonzero structure is instead 3304 ignored. Thus, if memory has not alredy been allocated for this particular 3305 data, then the insertion is ignored. For dense matrices, in which 3306 the entire array is allocated, no entries are ever ignored. 3307 Set after the first MatAssemblyEnd() 3308 3309 MAT_NEW_NONZERO_LOCATION_ERR indicates that any add or insertion 3310 that would generate a new entry in the nonzero structure instead produces 3311 an error. (Currently supported for AIJ and BAIJ formats only.) 3312 This is a useful flag when using SAME_NONZERO_PATTERN in calling 3313 SLESSetOperators() to ensure that the nonzero pattern truely does 3314 remain unchanged. Set after the first MatAssemblyEnd() 3315 3316 MAT_NEW_NONZERO_ALLOCATION_ERR indicates that any add or insertion 3317 that would generate a new entry that has not been preallocated will 3318 instead produce an error. (Currently supported for AIJ and BAIJ formats 3319 only.) This is a useful flag when debugging matrix memory preallocation. 3320 3321 MAT_IGNORE_OFF_PROC_ENTRIES indicates entries destined for 3322 other processors should be dropped, rather than stashed. 3323 This is useful if you know that the "owning" processor is also 3324 always generating the correct matrix entries, so that PETSc need 3325 not transfer duplicate entries generated on another processor. 3326 3327 MAT_USE_HASH_TABLE indicates that a hash table be used to improve the 3328 searches during matrix assembly. When this flag is set, the hash table 3329 is created during the first Matrix Assembly. This hash table is 3330 used the next time through, during MatSetVaules()/MatSetVaulesBlocked() 3331 to improve the searching of indices. MAT_NO_NEW_NONZERO_LOCATIONS flag 3332 should be used with MAT_USE_HASH_TABLE flag. This option is currently 3333 supported by MATMPIBAIJ format only. 3334 3335 MAT_KEEP_ZEROED_ROWS indicates when MatZeroRows() is called the zeroed entries 3336 are kept in the nonzero structure 3337 3338 MAT_IGNORE_ZERO_ENTRIES - when using ADD_VALUES for AIJ matrices this will stop 3339 zero values from creating a zero location in the matrix 3340 3341 MAT_USE_INODES - indicates using inode version of the code - works with AIJ and 3342 ROWBS matrix types 3343 3344 MAT_DO_NOT_USE_INODES - indicates not using inode version of the code - works 3345 with AIJ and ROWBS matrix types 3346 3347 Level: intermediate 3348 3349 Concepts: matrices^setting options 3350 3351 @*/ 3352 int MatSetOption(Mat mat,MatOption op) 3353 { 3354 int ierr; 3355 3356 PetscFunctionBegin; 3357 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3358 PetscValidType(mat); 3359 MatPreallocated(mat); 3360 switch (op) { 3361 case MAT_SYMMETRIC: 3362 mat->symmetric = PETSC_TRUE; 3363 mat->structurally_symmetric = PETSC_TRUE; 3364 break; 3365 case MAT_STRUCTURALLY_SYMMETRIC: 3366 mat->structurally_symmetric = PETSC_TRUE; 3367 break; 3368 default: 3369 if (mat->ops->setoption) {ierr = (*mat->ops->setoption)(mat,op);CHKERRQ(ierr);} 3370 break; 3371 } 3372 PetscFunctionReturn(0); 3373 } 3374 3375 #undef __FUNCT__ 3376 #define __FUNCT__ "MatZeroEntries" 3377 /*@ 3378 MatZeroEntries - Zeros all entries of a matrix. For sparse matrices 3379 this routine retains the old nonzero structure. 3380 3381 Collective on Mat 3382 3383 Input Parameters: 3384 . mat - the matrix 3385 3386 Level: intermediate 3387 3388 Concepts: matrices^zeroing 3389 3390 .seealso: MatZeroRows() 3391 @*/ 3392 int MatZeroEntries(Mat mat) 3393 { 3394 int ierr; 3395 3396 PetscFunctionBegin; 3397 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3398 PetscValidType(mat); 3399 MatPreallocated(mat); 3400 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 3401 if (!mat->ops->zeroentries) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 3402 3403 ierr = PetscLogEventBegin(MAT_ZeroEntries,mat,0,0,0);CHKERRQ(ierr); 3404 ierr = (*mat->ops->zeroentries)(mat);CHKERRQ(ierr); 3405 ierr = PetscLogEventEnd(MAT_ZeroEntries,mat,0,0,0);CHKERRQ(ierr); 3406 PetscFunctionReturn(0); 3407 } 3408 3409 #undef __FUNCT__ 3410 #define __FUNCT__ "MatZeroRows" 3411 /*@C 3412 MatZeroRows - Zeros all entries (except possibly the main diagonal) 3413 of a set of rows of a matrix. 3414 3415 Collective on Mat 3416 3417 Input Parameters: 3418 + mat - the matrix 3419 . is - index set of rows to remove 3420 - diag - pointer to value put in all diagonals of eliminated rows. 3421 Note that diag is not a pointer to an array, but merely a 3422 pointer to a single value. 3423 3424 Notes: 3425 For the AIJ and BAIJ matrix formats this removes the old nonzero structure, 3426 but does not release memory. For the dense and block diagonal 3427 formats this does not alter the nonzero structure. 3428 3429 If the option MatSetOption(mat,MAT_KEEP_ZEROED_ROWS) the nonzero structure 3430 of the matrix is not changed (even for AIJ and BAIJ matrices) the values are 3431 merely zeroed. 3432 3433 The user can set a value in the diagonal entry (or for the AIJ and 3434 row formats can optionally remove the main diagonal entry from the 3435 nonzero structure as well, by passing a null pointer (PETSC_NULL 3436 in C or PETSC_NULL_SCALAR in Fortran) as the final argument). 3437 3438 For the parallel case, all processes that share the matrix (i.e., 3439 those in the communicator used for matrix creation) MUST call this 3440 routine, regardless of whether any rows being zeroed are owned by 3441 them. 3442 3443 For the SBAIJ matrix (since only the upper triangular half of the matrix 3444 is stored) the effect of this call is to also zero the corresponding 3445 column. 3446 3447 Level: intermediate 3448 3449 Concepts: matrices^zeroing rows 3450 3451 .seealso: MatZeroEntries(), MatZeroRowsLocal(), MatSetOption() 3452 @*/ 3453 int MatZeroRows(Mat mat,IS is,PetscScalar *diag) 3454 { 3455 int ierr; 3456 3457 PetscFunctionBegin; 3458 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3459 PetscValidType(mat); 3460 MatPreallocated(mat); 3461 PetscValidHeaderSpecific(is,IS_COOKIE); 3462 if (diag) PetscValidScalarPointer(diag); 3463 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3464 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 3465 if (!mat->ops->zerorows) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 3466 3467 ierr = (*mat->ops->zerorows)(mat,is,diag);CHKERRQ(ierr); 3468 ierr = MatView_Private(mat);CHKERRQ(ierr); 3469 PetscFunctionReturn(0); 3470 } 3471 3472 #undef __FUNCT__ 3473 #define __FUNCT__ "MatZeroRowsLocal" 3474 /*@C 3475 MatZeroRowsLocal - Zeros all entries (except possibly the main diagonal) 3476 of a set of rows of a matrix; using local numbering of rows. 3477 3478 Collective on Mat 3479 3480 Input Parameters: 3481 + mat - the matrix 3482 . is - index set of rows to remove 3483 - diag - pointer to value put in all diagonals of eliminated rows. 3484 Note that diag is not a pointer to an array, but merely a 3485 pointer to a single value. 3486 3487 Notes: 3488 Before calling MatZeroRowsLocal(), the user must first set the 3489 local-to-global mapping by calling MatSetLocalToGlobalMapping(). 3490 3491 For the AIJ matrix formats this removes the old nonzero structure, 3492 but does not release memory. For the dense and block diagonal 3493 formats this does not alter the nonzero structure. 3494 3495 If the option MatSetOption(mat,MAT_KEEP_ZEROED_ROWS) the nonzero structure 3496 of the matrix is not changed (even for AIJ and BAIJ matrices) the values are 3497 merely zeroed. 3498 3499 The user can set a value in the diagonal entry (or for the AIJ and 3500 row formats can optionally remove the main diagonal entry from the 3501 nonzero structure as well, by passing a null pointer (PETSC_NULL 3502 in C or PETSC_NULL_SCALAR in Fortran) as the final argument). 3503 3504 Level: intermediate 3505 3506 Concepts: matrices^zeroing 3507 3508 .seealso: MatZeroEntries(), MatZeroRows(), MatSetLocalToGlobalMapping 3509 @*/ 3510 int MatZeroRowsLocal(Mat mat,IS is,PetscScalar *diag) 3511 { 3512 int ierr; 3513 IS newis; 3514 3515 PetscFunctionBegin; 3516 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3517 PetscValidType(mat); 3518 MatPreallocated(mat); 3519 PetscValidHeaderSpecific(is,IS_COOKIE); 3520 if (diag) PetscValidScalarPointer(diag); 3521 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3522 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 3523 3524 if (mat->ops->zerorowslocal) { 3525 ierr = (*mat->ops->zerorowslocal)(mat,is,diag);CHKERRQ(ierr); 3526 } else { 3527 if (!mat->mapping) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Need to provide local to global mapping to matrix first"); 3528 ierr = ISLocalToGlobalMappingApplyIS(mat->mapping,is,&newis);CHKERRQ(ierr); 3529 ierr = (*mat->ops->zerorows)(mat,newis,diag);CHKERRQ(ierr); 3530 ierr = ISDestroy(newis);CHKERRQ(ierr); 3531 } 3532 PetscFunctionReturn(0); 3533 } 3534 3535 #undef __FUNCT__ 3536 #define __FUNCT__ "MatGetSize" 3537 /*@ 3538 MatGetSize - Returns the numbers of rows and columns in a matrix. 3539 3540 Not Collective 3541 3542 Input Parameter: 3543 . mat - the matrix 3544 3545 Output Parameters: 3546 + m - the number of global rows 3547 - n - the number of global columns 3548 3549 Level: beginner 3550 3551 Concepts: matrices^size 3552 3553 .seealso: MatGetLocalSize() 3554 @*/ 3555 int MatGetSize(Mat mat,int *m,int* n) 3556 { 3557 PetscFunctionBegin; 3558 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3559 if (m) *m = mat->M; 3560 if (n) *n = mat->N; 3561 PetscFunctionReturn(0); 3562 } 3563 3564 #undef __FUNCT__ 3565 #define __FUNCT__ "MatGetLocalSize" 3566 /*@ 3567 MatGetLocalSize - Returns the number of rows and columns in a matrix 3568 stored locally. This information may be implementation dependent, so 3569 use with care. 3570 3571 Not Collective 3572 3573 Input Parameters: 3574 . mat - the matrix 3575 3576 Output Parameters: 3577 + m - the number of local rows 3578 - n - the number of local columns 3579 3580 Level: beginner 3581 3582 Concepts: matrices^local size 3583 3584 .seealso: MatGetSize() 3585 @*/ 3586 int MatGetLocalSize(Mat mat,int *m,int* n) 3587 { 3588 PetscFunctionBegin; 3589 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3590 if (m) *m = mat->m; 3591 if (n) *n = mat->n; 3592 PetscFunctionReturn(0); 3593 } 3594 3595 #undef __FUNCT__ 3596 #define __FUNCT__ "MatGetOwnershipRange" 3597 /*@ 3598 MatGetOwnershipRange - Returns the range of matrix rows owned by 3599 this processor, assuming that the matrix is laid out with the first 3600 n1 rows on the first processor, the next n2 rows on the second, etc. 3601 For certain parallel layouts this range may not be well defined. 3602 3603 Not Collective 3604 3605 Input Parameters: 3606 . mat - the matrix 3607 3608 Output Parameters: 3609 + m - the global index of the first local row 3610 - n - one more than the global index of the last local row 3611 3612 Level: beginner 3613 3614 Concepts: matrices^row ownership 3615 @*/ 3616 int MatGetOwnershipRange(Mat mat,int *m,int* n) 3617 { 3618 int ierr; 3619 3620 PetscFunctionBegin; 3621 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3622 PetscValidType(mat); 3623 MatPreallocated(mat); 3624 if (m) PetscValidIntPointer(m); 3625 if (n) PetscValidIntPointer(n); 3626 ierr = PetscMapGetLocalRange(mat->rmap,m,n);CHKERRQ(ierr); 3627 PetscFunctionReturn(0); 3628 } 3629 3630 #undef __FUNCT__ 3631 #define __FUNCT__ "MatILUFactorSymbolic" 3632 /*@ 3633 MatILUFactorSymbolic - Performs symbolic ILU factorization of a matrix. 3634 Uses levels of fill only, not drop tolerance. Use MatLUFactorNumeric() 3635 to complete the factorization. 3636 3637 Collective on Mat 3638 3639 Input Parameters: 3640 + mat - the matrix 3641 . row - row permutation 3642 . column - column permutation 3643 - info - structure containing 3644 $ levels - number of levels of fill. 3645 $ expected fill - as ratio of original fill. 3646 $ 1 or 0 - indicating force fill on diagonal (improves robustness for matrices 3647 missing diagonal entries) 3648 3649 Output Parameters: 3650 . fact - new matrix that has been symbolically factored 3651 3652 Notes: 3653 See the users manual for additional information about 3654 choosing the fill factor for better efficiency. 3655 3656 Most users should employ the simplified SLES interface for linear solvers 3657 instead of working directly with matrix algebra routines such as this. 3658 See, e.g., SLESCreate(). 3659 3660 Level: developer 3661 3662 Concepts: matrices^symbolic LU factorization 3663 Concepts: matrices^factorization 3664 Concepts: LU^symbolic factorization 3665 3666 .seealso: MatLUFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor() 3667 MatGetOrdering(), MatILUInfo 3668 3669 @*/ 3670 int MatILUFactorSymbolic(Mat mat,IS row,IS col,MatILUInfo *info,Mat *fact) 3671 { 3672 int ierr; 3673 3674 PetscFunctionBegin; 3675 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3676 PetscValidType(mat); 3677 MatPreallocated(mat); 3678 PetscValidPointer(fact); 3679 PetscValidHeaderSpecific(row,IS_COOKIE); 3680 PetscValidHeaderSpecific(col,IS_COOKIE); 3681 if (info->levels < 0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Levels of fill negative %d",(int)info->levels); 3682 if (info->fill < 1.0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Expected fill less than 1.0 %g",info->fill); 3683 if (!mat->ops->ilufactorsymbolic) SETERRQ1(PETSC_ERR_SUP,"Matrix type %s symbolic ILU",mat->type_name); 3684 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3685 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 3686 3687 ierr = PetscLogEventBegin(MAT_ILUFactorSymbolic,mat,row,col,0);CHKERRQ(ierr); 3688 ierr = (*mat->ops->ilufactorsymbolic)(mat,row,col,info,fact);CHKERRQ(ierr); 3689 ierr = PetscLogEventEnd(MAT_ILUFactorSymbolic,mat,row,col,0);CHKERRQ(ierr); 3690 PetscFunctionReturn(0); 3691 } 3692 3693 #undef __FUNCT__ 3694 #define __FUNCT__ "MatICCFactorSymbolic" 3695 /*@ 3696 MatICCFactorSymbolic - Performs symbolic incomplete 3697 Cholesky factorization for a symmetric matrix. Use 3698 MatCholeskyFactorNumeric() to complete the factorization. 3699 3700 Collective on Mat 3701 3702 Input Parameters: 3703 + mat - the matrix 3704 . perm - row and column permutation 3705 . fill - levels of fill 3706 - f - expected fill as ratio of original fill 3707 3708 Output Parameter: 3709 . fact - the factored matrix 3710 3711 Notes: 3712 Currently only no-fill factorization is supported. 3713 3714 Most users should employ the simplified SLES interface for linear solvers 3715 instead of working directly with matrix algebra routines such as this. 3716 See, e.g., SLESCreate(). 3717 3718 Level: developer 3719 3720 Concepts: matrices^symbolic incomplete Cholesky factorization 3721 Concepts: matrices^factorization 3722 Concepts: Cholsky^symbolic factorization 3723 3724 .seealso: MatCholeskyFactorNumeric(), MatCholeskyFactor() 3725 @*/ 3726 int MatICCFactorSymbolic(Mat mat,IS perm,PetscReal f,int fill,Mat *fact) 3727 { 3728 int ierr; 3729 3730 PetscFunctionBegin; 3731 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3732 PetscValidType(mat); 3733 MatPreallocated(mat); 3734 PetscValidPointer(fact); 3735 PetscValidHeaderSpecific(perm,IS_COOKIE); 3736 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 3737 if (fill < 0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Fill negative %d",fill); 3738 if (f < 1.0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Expected fill less than 1.0 %g",f); 3739 if (!mat->ops->iccfactorsymbolic) SETERRQ1(PETSC_ERR_SUP,"Matrix type %s symbolic ICC",mat->type_name); 3740 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3741 3742 ierr = PetscLogEventBegin(MAT_ICCFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr); 3743 ierr = (*mat->ops->iccfactorsymbolic)(mat,perm,f,fill,fact);CHKERRQ(ierr); 3744 ierr = PetscLogEventEnd(MAT_ICCFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr); 3745 PetscFunctionReturn(0); 3746 } 3747 3748 #undef __FUNCT__ 3749 #define __FUNCT__ "MatGetArray" 3750 /*@C 3751 MatGetArray - Returns a pointer to the element values in the matrix. 3752 The result of this routine is dependent on the underlying matrix data 3753 structure, and may not even work for certain matrix types. You MUST 3754 call MatRestoreArray() when you no longer need to access the array. 3755 3756 Not Collective 3757 3758 Input Parameter: 3759 . mat - the matrix 3760 3761 Output Parameter: 3762 . v - the location of the values 3763 3764 3765 Fortran Note: 3766 This routine is used differently from Fortran, e.g., 3767 .vb 3768 Mat mat 3769 PetscScalar mat_array(1) 3770 PetscOffset i_mat 3771 int ierr 3772 call MatGetArray(mat,mat_array,i_mat,ierr) 3773 3774 C Access first local entry in matrix; note that array is 3775 C treated as one dimensional 3776 value = mat_array(i_mat + 1) 3777 3778 [... other code ...] 3779 call MatRestoreArray(mat,mat_array,i_mat,ierr) 3780 .ve 3781 3782 See the Fortran chapter of the users manual and 3783 petsc/src/mat/examples/tests for details. 3784 3785 Level: advanced 3786 3787 Concepts: matrices^access array 3788 3789 .seealso: MatRestoreArray(), MatGetArrayF90() 3790 @*/ 3791 int MatGetArray(Mat mat,PetscScalar **v) 3792 { 3793 int ierr; 3794 3795 PetscFunctionBegin; 3796 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3797 PetscValidType(mat); 3798 MatPreallocated(mat); 3799 PetscValidPointer(v); 3800 if (!mat->ops->getarray) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 3801 ierr = (*mat->ops->getarray)(mat,v);CHKERRQ(ierr); 3802 PetscFunctionReturn(0); 3803 } 3804 3805 #undef __FUNCT__ 3806 #define __FUNCT__ "MatRestoreArray" 3807 /*@C 3808 MatRestoreArray - Restores the matrix after MatGetArray() has been called. 3809 3810 Not Collective 3811 3812 Input Parameter: 3813 + mat - the matrix 3814 - v - the location of the values 3815 3816 Fortran Note: 3817 This routine is used differently from Fortran, e.g., 3818 .vb 3819 Mat mat 3820 PetscScalar mat_array(1) 3821 PetscOffset i_mat 3822 int ierr 3823 call MatGetArray(mat,mat_array,i_mat,ierr) 3824 3825 C Access first local entry in matrix; note that array is 3826 C treated as one dimensional 3827 value = mat_array(i_mat + 1) 3828 3829 [... other code ...] 3830 call MatRestoreArray(mat,mat_array,i_mat,ierr) 3831 .ve 3832 3833 See the Fortran chapter of the users manual and 3834 petsc/src/mat/examples/tests for details 3835 3836 Level: advanced 3837 3838 .seealso: MatGetArray(), MatRestoreArrayF90() 3839 @*/ 3840 int MatRestoreArray(Mat mat,PetscScalar **v) 3841 { 3842 int ierr; 3843 3844 PetscFunctionBegin; 3845 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3846 PetscValidType(mat); 3847 MatPreallocated(mat); 3848 PetscValidPointer(v); 3849 if (!mat->ops->restorearray) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 3850 ierr = (*mat->ops->restorearray)(mat,v);CHKERRQ(ierr); 3851 PetscFunctionReturn(0); 3852 } 3853 3854 #undef __FUNCT__ 3855 #define __FUNCT__ "MatGetSubMatrices" 3856 /*@C 3857 MatGetSubMatrices - Extracts several submatrices from a matrix. If submat 3858 points to an array of valid matrices, they may be reused to store the new 3859 submatrices. 3860 3861 Collective on Mat 3862 3863 Input Parameters: 3864 + mat - the matrix 3865 . n - the number of submatrixes to be extracted (on this processor, may be zero) 3866 . irow, icol - index sets of rows and columns to extract 3867 - scall - either MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX 3868 3869 Output Parameter: 3870 . submat - the array of submatrices 3871 3872 Notes: 3873 MatGetSubMatrices() can extract only sequential submatrices 3874 (from both sequential and parallel matrices). Use MatGetSubMatrix() 3875 to extract a parallel submatrix. 3876 3877 When extracting submatrices from a parallel matrix, each processor can 3878 form a different submatrix by setting the rows and columns of its 3879 individual index sets according to the local submatrix desired. 3880 3881 When finished using the submatrices, the user should destroy 3882 them with MatDestroyMatrices(). 3883 3884 MAT_REUSE_MATRIX can only be used when the nonzero structure of the 3885 original matrix has not changed from that last call to MatGetSubMatrices(). 3886 3887 This routine creates the matrices in submat; you should NOT create them before 3888 calling it. It also allocates the array of matrix pointers submat. 3889 3890 Fortran Note: 3891 The Fortran interface is slightly different from that given below; it 3892 requires one to pass in as submat a Mat (integer) array of size at least m. 3893 3894 Level: advanced 3895 3896 Concepts: matrices^accessing submatrices 3897 Concepts: submatrices 3898 3899 .seealso: MatDestroyMatrices(), MatGetSubMatrix(), MatGetRow(), MatGetDiagonal() 3900 @*/ 3901 int MatGetSubMatrices(Mat mat,int n,IS *irow,IS *icol,MatReuse scall,Mat **submat) 3902 { 3903 int ierr; 3904 3905 PetscFunctionBegin; 3906 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3907 PetscValidType(mat); 3908 MatPreallocated(mat); 3909 if (!mat->ops->getsubmatrices) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 3910 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3911 3912 ierr = PetscLogEventBegin(MAT_GetSubMatrices,mat,0,0,0);CHKERRQ(ierr); 3913 ierr = (*mat->ops->getsubmatrices)(mat,n,irow,icol,scall,submat);CHKERRQ(ierr); 3914 ierr = PetscLogEventEnd(MAT_GetSubMatrices,mat,0,0,0);CHKERRQ(ierr); 3915 PetscFunctionReturn(0); 3916 } 3917 3918 #undef __FUNCT__ 3919 #define __FUNCT__ "MatDestroyMatrices" 3920 /*@C 3921 MatDestroyMatrices - Destroys a set of matrices obtained with MatGetSubMatrices(). 3922 3923 Collective on Mat 3924 3925 Input Parameters: 3926 + n - the number of local matrices 3927 - mat - the matrices 3928 3929 Level: advanced 3930 3931 Notes: Frees not only the matrices, but also the array that contains the matrices 3932 3933 .seealso: MatGetSubMatrices() 3934 @*/ 3935 int MatDestroyMatrices(int n,Mat **mat) 3936 { 3937 int ierr,i; 3938 3939 PetscFunctionBegin; 3940 if (n < 0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Trying to destroy negative number of matrices %d",n); 3941 PetscValidPointer(mat); 3942 for (i=0; i<n; i++) { 3943 ierr = MatDestroy((*mat)[i]);CHKERRQ(ierr); 3944 } 3945 /* memory is allocated even if n = 0 */ 3946 ierr = PetscFree(*mat);CHKERRQ(ierr); 3947 PetscFunctionReturn(0); 3948 } 3949 3950 #undef __FUNCT__ 3951 #define __FUNCT__ "MatIncreaseOverlap" 3952 /*@ 3953 MatIncreaseOverlap - Given a set of submatrices indicated by index sets, 3954 replaces the index sets by larger ones that represent submatrices with 3955 additional overlap. 3956 3957 Collective on Mat 3958 3959 Input Parameters: 3960 + mat - the matrix 3961 . n - the number of index sets 3962 . is - the array of pointers to index sets 3963 - ov - the additional overlap requested 3964 3965 Level: developer 3966 3967 Concepts: overlap 3968 Concepts: ASM^computing overlap 3969 3970 .seealso: MatGetSubMatrices() 3971 @*/ 3972 int MatIncreaseOverlap(Mat mat,int n,IS *is,int ov) 3973 { 3974 int ierr; 3975 3976 PetscFunctionBegin; 3977 PetscValidHeaderSpecific(mat,MAT_COOKIE); 3978 PetscValidType(mat); 3979 MatPreallocated(mat); 3980 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3981 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 3982 3983 if (!ov) PetscFunctionReturn(0); 3984 if (!mat->ops->increaseoverlap) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 3985 ierr = PetscLogEventBegin(MAT_IncreaseOverlap,mat,0,0,0);CHKERRQ(ierr); 3986 ierr = (*mat->ops->increaseoverlap)(mat,n,is,ov);CHKERRQ(ierr); 3987 ierr = PetscLogEventEnd(MAT_IncreaseOverlap,mat,0,0,0);CHKERRQ(ierr); 3988 PetscFunctionReturn(0); 3989 } 3990 3991 #undef __FUNCT__ 3992 #define __FUNCT__ "MatPrintHelp" 3993 /*@ 3994 MatPrintHelp - Prints all the options for the matrix. 3995 3996 Collective on Mat 3997 3998 Input Parameter: 3999 . mat - the matrix 4000 4001 Options Database Keys: 4002 + -help - Prints matrix options 4003 - -h - Prints matrix options 4004 4005 Level: developer 4006 4007 .seealso: MatCreate(), MatCreateXXX() 4008 @*/ 4009 int MatPrintHelp(Mat mat) 4010 { 4011 static PetscTruth called = PETSC_FALSE; 4012 int ierr; 4013 4014 PetscFunctionBegin; 4015 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4016 PetscValidType(mat); 4017 MatPreallocated(mat); 4018 4019 if (!called) { 4020 if (mat->ops->printhelp) { 4021 ierr = (*mat->ops->printhelp)(mat);CHKERRQ(ierr); 4022 } 4023 called = PETSC_TRUE; 4024 } 4025 PetscFunctionReturn(0); 4026 } 4027 4028 #undef __FUNCT__ 4029 #define __FUNCT__ "MatGetBlockSize" 4030 /*@ 4031 MatGetBlockSize - Returns the matrix block size; useful especially for the 4032 block row and block diagonal formats. 4033 4034 Not Collective 4035 4036 Input Parameter: 4037 . mat - the matrix 4038 4039 Output Parameter: 4040 . bs - block size 4041 4042 Notes: 4043 Block diagonal formats are MATSEQBDIAG, MATMPIBDIAG. 4044 Block row formats are MATSEQBAIJ, MATMPIBAIJ 4045 4046 Level: intermediate 4047 4048 Concepts: matrices^block size 4049 4050 .seealso: MatCreateSeqBAIJ(), MatCreateMPIBAIJ(), MatCreateSeqBDiag(), MatCreateMPIBDiag() 4051 @*/ 4052 int MatGetBlockSize(Mat mat,int *bs) 4053 { 4054 int ierr; 4055 4056 PetscFunctionBegin; 4057 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4058 PetscValidType(mat); 4059 MatPreallocated(mat); 4060 PetscValidIntPointer(bs); 4061 if (!mat->ops->getblocksize) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 4062 ierr = (*mat->ops->getblocksize)(mat,bs);CHKERRQ(ierr); 4063 PetscFunctionReturn(0); 4064 } 4065 4066 #undef __FUNCT__ 4067 #define __FUNCT__ "MatGetRowIJ" 4068 /*@C 4069 MatGetRowIJ - Returns the compressed row storage i and j indices for sequential matrices. 4070 4071 Collective on Mat 4072 4073 Input Parameters: 4074 + mat - the matrix 4075 . shift - 0 or 1 indicating we want the indices starting at 0 or 1 4076 - symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be 4077 symmetrized 4078 4079 Output Parameters: 4080 + n - number of rows in the (possibly compressed) matrix 4081 . ia - the row pointers 4082 . ja - the column indices 4083 - done - PETSC_TRUE or PETSC_FALSE, indicating whether the values have been returned 4084 4085 Level: developer 4086 4087 .seealso: MatGetColumnIJ(), MatRestoreRowIJ() 4088 @*/ 4089 int MatGetRowIJ(Mat mat,int shift,PetscTruth symmetric,int *n,int **ia,int** ja,PetscTruth *done) 4090 { 4091 int ierr; 4092 4093 PetscFunctionBegin; 4094 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4095 PetscValidType(mat); 4096 MatPreallocated(mat); 4097 if (ia) PetscValidIntPointer(ia); 4098 if (ja) PetscValidIntPointer(ja); 4099 PetscValidIntPointer(done); 4100 if (!mat->ops->getrowij) *done = PETSC_FALSE; 4101 else { 4102 *done = PETSC_TRUE; 4103 ierr = (*mat->ops->getrowij)(mat,shift,symmetric,n,ia,ja,done);CHKERRQ(ierr); 4104 } 4105 PetscFunctionReturn(0); 4106 } 4107 4108 #undef __FUNCT__ 4109 #define __FUNCT__ "MatGetColumnIJ" 4110 /*@C 4111 MatGetColumnIJ - Returns the compressed column storage i and j indices for sequential matrices. 4112 4113 Collective on Mat 4114 4115 Input Parameters: 4116 + mat - the matrix 4117 . shift - 1 or zero indicating we want the indices starting at 0 or 1 4118 - symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be 4119 symmetrized 4120 4121 Output Parameters: 4122 + n - number of columns in the (possibly compressed) matrix 4123 . ia - the column pointers 4124 . ja - the row indices 4125 - done - PETSC_TRUE or PETSC_FALSE, indicating whether the values have been returned 4126 4127 Level: developer 4128 4129 .seealso: MatGetRowIJ(), MatRestoreColumnIJ() 4130 @*/ 4131 int MatGetColumnIJ(Mat mat,int shift,PetscTruth symmetric,int *n,int **ia,int** ja,PetscTruth *done) 4132 { 4133 int ierr; 4134 4135 PetscFunctionBegin; 4136 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4137 PetscValidType(mat); 4138 MatPreallocated(mat); 4139 if (ia) PetscValidIntPointer(ia); 4140 if (ja) PetscValidIntPointer(ja); 4141 PetscValidIntPointer(done); 4142 4143 if (!mat->ops->getcolumnij) *done = PETSC_FALSE; 4144 else { 4145 *done = PETSC_TRUE; 4146 ierr = (*mat->ops->getcolumnij)(mat,shift,symmetric,n,ia,ja,done);CHKERRQ(ierr); 4147 } 4148 PetscFunctionReturn(0); 4149 } 4150 4151 #undef __FUNCT__ 4152 #define __FUNCT__ "MatRestoreRowIJ" 4153 /*@C 4154 MatRestoreRowIJ - Call after you are completed with the ia,ja indices obtained with 4155 MatGetRowIJ(). 4156 4157 Collective on Mat 4158 4159 Input Parameters: 4160 + mat - the matrix 4161 . shift - 1 or zero indicating we want the indices starting at 0 or 1 4162 - symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be 4163 symmetrized 4164 4165 Output Parameters: 4166 + n - size of (possibly compressed) matrix 4167 . ia - the row pointers 4168 . ja - the column indices 4169 - done - PETSC_TRUE or PETSC_FALSE indicated that the values have been returned 4170 4171 Level: developer 4172 4173 .seealso: MatGetRowIJ(), MatRestoreColumnIJ() 4174 @*/ 4175 int MatRestoreRowIJ(Mat mat,int shift,PetscTruth symmetric,int *n,int **ia,int** ja,PetscTruth *done) 4176 { 4177 int ierr; 4178 4179 PetscFunctionBegin; 4180 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4181 PetscValidType(mat); 4182 MatPreallocated(mat); 4183 if (ia) PetscValidIntPointer(ia); 4184 if (ja) PetscValidIntPointer(ja); 4185 PetscValidIntPointer(done); 4186 4187 if (!mat->ops->restorerowij) *done = PETSC_FALSE; 4188 else { 4189 *done = PETSC_TRUE; 4190 ierr = (*mat->ops->restorerowij)(mat,shift,symmetric,n,ia,ja,done);CHKERRQ(ierr); 4191 } 4192 PetscFunctionReturn(0); 4193 } 4194 4195 #undef __FUNCT__ 4196 #define __FUNCT__ "MatRestoreColumnIJ" 4197 /*@C 4198 MatRestoreColumnIJ - Call after you are completed with the ia,ja indices obtained with 4199 MatGetColumnIJ(). 4200 4201 Collective on Mat 4202 4203 Input Parameters: 4204 + mat - the matrix 4205 . shift - 1 or zero indicating we want the indices starting at 0 or 1 4206 - symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be 4207 symmetrized 4208 4209 Output Parameters: 4210 + n - size of (possibly compressed) matrix 4211 . ia - the column pointers 4212 . ja - the row indices 4213 - done - PETSC_TRUE or PETSC_FALSE indicated that the values have been returned 4214 4215 Level: developer 4216 4217 .seealso: MatGetColumnIJ(), MatRestoreRowIJ() 4218 @*/ 4219 int MatRestoreColumnIJ(Mat mat,int shift,PetscTruth symmetric,int *n,int **ia,int** ja,PetscTruth *done) 4220 { 4221 int ierr; 4222 4223 PetscFunctionBegin; 4224 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4225 PetscValidType(mat); 4226 MatPreallocated(mat); 4227 if (ia) PetscValidIntPointer(ia); 4228 if (ja) PetscValidIntPointer(ja); 4229 PetscValidIntPointer(done); 4230 4231 if (!mat->ops->restorecolumnij) *done = PETSC_FALSE; 4232 else { 4233 *done = PETSC_TRUE; 4234 ierr = (*mat->ops->restorecolumnij)(mat,shift,symmetric,n,ia,ja,done);CHKERRQ(ierr); 4235 } 4236 PetscFunctionReturn(0); 4237 } 4238 4239 #undef __FUNCT__ 4240 #define __FUNCT__ "MatColoringPatch" 4241 /*@C 4242 MatColoringPatch -Used inside matrix coloring routines that 4243 use MatGetRowIJ() and/or MatGetColumnIJ(). 4244 4245 Collective on Mat 4246 4247 Input Parameters: 4248 + mat - the matrix 4249 . n - number of colors 4250 - colorarray - array indicating color for each column 4251 4252 Output Parameters: 4253 . iscoloring - coloring generated using colorarray information 4254 4255 Level: developer 4256 4257 .seealso: MatGetRowIJ(), MatGetColumnIJ() 4258 4259 @*/ 4260 int MatColoringPatch(Mat mat,int n,int ncolors,ISColoringValue *colorarray,ISColoring *iscoloring) 4261 { 4262 int ierr; 4263 4264 PetscFunctionBegin; 4265 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4266 PetscValidType(mat); 4267 MatPreallocated(mat); 4268 PetscValidIntPointer(colorarray); 4269 4270 if (!mat->ops->coloringpatch){ 4271 ierr = ISColoringCreate(mat->comm,n,colorarray,iscoloring);CHKERRQ(ierr); 4272 } else { 4273 ierr = (*mat->ops->coloringpatch)(mat,n,ncolors,colorarray,iscoloring);CHKERRQ(ierr); 4274 } 4275 PetscFunctionReturn(0); 4276 } 4277 4278 4279 #undef __FUNCT__ 4280 #define __FUNCT__ "MatSetUnfactored" 4281 /*@ 4282 MatSetUnfactored - Resets a factored matrix to be treated as unfactored. 4283 4284 Collective on Mat 4285 4286 Input Parameter: 4287 . mat - the factored matrix to be reset 4288 4289 Notes: 4290 This routine should be used only with factored matrices formed by in-place 4291 factorization via ILU(0) (or by in-place LU factorization for the MATSEQDENSE 4292 format). This option can save memory, for example, when solving nonlinear 4293 systems with a matrix-free Newton-Krylov method and a matrix-based, in-place 4294 ILU(0) preconditioner. 4295 4296 Note that one can specify in-place ILU(0) factorization by calling 4297 .vb 4298 PCType(pc,PCILU); 4299 PCILUSeUseInPlace(pc); 4300 .ve 4301 or by using the options -pc_type ilu -pc_ilu_in_place 4302 4303 In-place factorization ILU(0) can also be used as a local 4304 solver for the blocks within the block Jacobi or additive Schwarz 4305 methods (runtime option: -sub_pc_ilu_in_place). See the discussion 4306 of these preconditioners in the users manual for details on setting 4307 local solver options. 4308 4309 Most users should employ the simplified SLES interface for linear solvers 4310 instead of working directly with matrix algebra routines such as this. 4311 See, e.g., SLESCreate(). 4312 4313 Level: developer 4314 4315 .seealso: PCILUSetUseInPlace(), PCLUSetUseInPlace() 4316 4317 Concepts: matrices^unfactored 4318 4319 @*/ 4320 int MatSetUnfactored(Mat mat) 4321 { 4322 int ierr; 4323 4324 PetscFunctionBegin; 4325 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4326 PetscValidType(mat); 4327 MatPreallocated(mat); 4328 mat->factor = 0; 4329 if (!mat->ops->setunfactored) PetscFunctionReturn(0); 4330 ierr = (*mat->ops->setunfactored)(mat);CHKERRQ(ierr); 4331 PetscFunctionReturn(0); 4332 } 4333 4334 /*MC 4335 MatGetArrayF90 - Accesses a matrix array from Fortran90. 4336 4337 Synopsis: 4338 MatGetArrayF90(Mat x,{Scalar, pointer :: xx_v(:)},integer ierr) 4339 4340 Not collective 4341 4342 Input Parameter: 4343 . x - matrix 4344 4345 Output Parameters: 4346 + xx_v - the Fortran90 pointer to the array 4347 - ierr - error code 4348 4349 Example of Usage: 4350 .vb 4351 PetscScalar, pointer xx_v(:) 4352 .... 4353 call MatGetArrayF90(x,xx_v,ierr) 4354 a = xx_v(3) 4355 call MatRestoreArrayF90(x,xx_v,ierr) 4356 .ve 4357 4358 Notes: 4359 Not yet supported for all F90 compilers 4360 4361 Level: advanced 4362 4363 .seealso: MatRestoreArrayF90(), MatGetArray(), MatRestoreArray() 4364 4365 Concepts: matrices^accessing array 4366 4367 M*/ 4368 4369 /*MC 4370 MatRestoreArrayF90 - Restores a matrix array that has been 4371 accessed with MatGetArrayF90(). 4372 4373 Synopsis: 4374 MatRestoreArrayF90(Mat x,{Scalar, pointer :: xx_v(:)},integer ierr) 4375 4376 Not collective 4377 4378 Input Parameters: 4379 + x - matrix 4380 - xx_v - the Fortran90 pointer to the array 4381 4382 Output Parameter: 4383 . ierr - error code 4384 4385 Example of Usage: 4386 .vb 4387 PetscScalar, pointer xx_v(:) 4388 .... 4389 call MatGetArrayF90(x,xx_v,ierr) 4390 a = xx_v(3) 4391 call MatRestoreArrayF90(x,xx_v,ierr) 4392 .ve 4393 4394 Notes: 4395 Not yet supported for all F90 compilers 4396 4397 Level: advanced 4398 4399 .seealso: MatGetArrayF90(), MatGetArray(), MatRestoreArray() 4400 4401 M*/ 4402 4403 4404 #undef __FUNCT__ 4405 #define __FUNCT__ "MatGetSubMatrix" 4406 /*@ 4407 MatGetSubMatrix - Gets a single submatrix on the same number of processors 4408 as the original matrix. 4409 4410 Collective on Mat 4411 4412 Input Parameters: 4413 + mat - the original matrix 4414 . isrow - rows this processor should obtain 4415 . iscol - columns for all processors you wish to keep 4416 . csize - number of columns "local" to this processor (does nothing for sequential 4417 matrices). This should match the result from VecGetLocalSize(x,...) if you 4418 plan to use the matrix in a A*x; alternatively, you can use PETSC_DECIDE 4419 - cll - either MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX 4420 4421 Output Parameter: 4422 . newmat - the new submatrix, of the same type as the old 4423 4424 Level: advanced 4425 4426 Notes: the iscol argument MUST be the same on each processor. You might be 4427 able to create the iscol argument with ISAllGather(). 4428 4429 The first time this is called you should use a cll of MAT_INITIAL_MATRIX, 4430 the MatGetSubMatrix() routine will create the newmat for you. Any additional calls 4431 to this routine with a mat of the same nonzero structure will reuse the matrix 4432 generated the first time. 4433 4434 Concepts: matrices^submatrices 4435 4436 .seealso: MatGetSubMatrices(), ISAllGather() 4437 @*/ 4438 int MatGetSubMatrix(Mat mat,IS isrow,IS iscol,int csize,MatReuse cll,Mat *newmat) 4439 { 4440 int ierr, size; 4441 Mat *local; 4442 4443 PetscFunctionBegin; 4444 PetscValidType(mat); 4445 MatPreallocated(mat); 4446 ierr = MPI_Comm_size(mat->comm,&size);CHKERRQ(ierr); 4447 4448 /* if original matrix is on just one processor then use submatrix generated */ 4449 if (!mat->ops->getsubmatrix && size == 1 && cll == MAT_REUSE_MATRIX) { 4450 ierr = MatGetSubMatrices(mat,1,&isrow,&iscol,MAT_REUSE_MATRIX,&newmat);CHKERRQ(ierr); 4451 PetscFunctionReturn(0); 4452 } else if (!mat->ops->getsubmatrix && size == 1) { 4453 ierr = MatGetSubMatrices(mat,1,&isrow,&iscol,MAT_INITIAL_MATRIX,&local);CHKERRQ(ierr); 4454 *newmat = *local; 4455 ierr = PetscFree(local);CHKERRQ(ierr); 4456 PetscFunctionReturn(0); 4457 } 4458 4459 if (!mat->ops->getsubmatrix) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 4460 ierr = (*mat->ops->getsubmatrix)(mat,isrow,iscol,csize,cll,newmat);CHKERRQ(ierr); 4461 PetscFunctionReturn(0); 4462 } 4463 4464 #undef __FUNCT__ 4465 #define __FUNCT__ "MatGetPetscMaps" 4466 /*@C 4467 MatGetPetscMaps - Returns the maps associated with the matrix. 4468 4469 Not Collective 4470 4471 Input Parameter: 4472 . mat - the matrix 4473 4474 Output Parameters: 4475 + rmap - the row (right) map 4476 - cmap - the column (left) map 4477 4478 Level: developer 4479 4480 Concepts: maps^getting from matrix 4481 4482 @*/ 4483 int MatGetPetscMaps(Mat mat,PetscMap *rmap,PetscMap *cmap) 4484 { 4485 int ierr; 4486 4487 PetscFunctionBegin; 4488 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4489 PetscValidType(mat); 4490 MatPreallocated(mat); 4491 ierr = (*mat->ops->getmaps)(mat,rmap,cmap);CHKERRQ(ierr); 4492 PetscFunctionReturn(0); 4493 } 4494 4495 /* 4496 Version that works for all PETSc matrices 4497 */ 4498 #undef __FUNCT__ 4499 #define __FUNCT__ "MatGetPetscMaps_Petsc" 4500 int MatGetPetscMaps_Petsc(Mat mat,PetscMap *rmap,PetscMap *cmap) 4501 { 4502 PetscFunctionBegin; 4503 if (rmap) *rmap = mat->rmap; 4504 if (cmap) *cmap = mat->cmap; 4505 PetscFunctionReturn(0); 4506 } 4507 4508 #undef __FUNCT__ 4509 #define __FUNCT__ "MatSetStashInitialSize" 4510 /*@ 4511 MatSetStashInitialSize - sets the sizes of the matrix stash, that is 4512 used during the assembly process to store values that belong to 4513 other processors. 4514 4515 Not Collective 4516 4517 Input Parameters: 4518 + mat - the matrix 4519 . size - the initial size of the stash. 4520 - bsize - the initial size of the block-stash(if used). 4521 4522 Options Database Keys: 4523 + -matstash_initial_size <size> or <size0,size1,...sizep-1> 4524 - -matstash_block_initial_size <bsize> or <bsize0,bsize1,...bsizep-1> 4525 4526 Level: intermediate 4527 4528 Notes: 4529 The block-stash is used for values set with VecSetValuesBlocked() while 4530 the stash is used for values set with VecSetValues() 4531 4532 Run with the option -log_info and look for output of the form 4533 MatAssemblyBegin_MPIXXX:Stash has MM entries, uses nn mallocs. 4534 to determine the appropriate value, MM, to use for size and 4535 MatAssemblyBegin_MPIXXX:Block-Stash has BMM entries, uses nn mallocs. 4536 to determine the value, BMM to use for bsize 4537 4538 Concepts: stash^setting matrix size 4539 Concepts: matrices^stash 4540 4541 @*/ 4542 int MatSetStashInitialSize(Mat mat,int size, int bsize) 4543 { 4544 int ierr; 4545 4546 PetscFunctionBegin; 4547 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4548 PetscValidType(mat); 4549 MatPreallocated(mat); 4550 ierr = MatStashSetInitialSize_Private(&mat->stash,size);CHKERRQ(ierr); 4551 ierr = MatStashSetInitialSize_Private(&mat->bstash,bsize);CHKERRQ(ierr); 4552 PetscFunctionReturn(0); 4553 } 4554 4555 #undef __FUNCT__ 4556 #define __FUNCT__ "MatInterpolateAdd" 4557 /*@ 4558 MatInterpolateAdd - w = y + A*x or A'*x depending on the shape of 4559 the matrix 4560 4561 Collective on Mat 4562 4563 Input Parameters: 4564 + mat - the matrix 4565 . x,y - the vectors 4566 - w - where the result is stored 4567 4568 Level: intermediate 4569 4570 Notes: 4571 w may be the same vector as y. 4572 4573 This allows one to use either the restriction or interpolation (its transpose) 4574 matrix to do the interpolation 4575 4576 Concepts: interpolation 4577 4578 .seealso: MatMultAdd(), MatMultTransposeAdd(), MatRestrict() 4579 4580 @*/ 4581 int MatInterpolateAdd(Mat A,Vec x,Vec y,Vec w) 4582 { 4583 int M,N,ierr; 4584 4585 PetscFunctionBegin; 4586 PetscValidType(A); 4587 MatPreallocated(A); 4588 ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr); 4589 if (N > M) { 4590 ierr = MatMultTransposeAdd(A,x,y,w);CHKERRQ(ierr); 4591 } else { 4592 ierr = MatMultAdd(A,x,y,w);CHKERRQ(ierr); 4593 } 4594 PetscFunctionReturn(0); 4595 } 4596 4597 #undef __FUNCT__ 4598 #define __FUNCT__ "MatInterpolate" 4599 /*@ 4600 MatInterpolate - y = A*x or A'*x depending on the shape of 4601 the matrix 4602 4603 Collective on Mat 4604 4605 Input Parameters: 4606 + mat - the matrix 4607 - x,y - the vectors 4608 4609 Level: intermediate 4610 4611 Notes: 4612 This allows one to use either the restriction or interpolation (its transpose) 4613 matrix to do the interpolation 4614 4615 Concepts: matrices^interpolation 4616 4617 .seealso: MatMultAdd(), MatMultTransposeAdd(), MatRestrict() 4618 4619 @*/ 4620 int MatInterpolate(Mat A,Vec x,Vec y) 4621 { 4622 int M,N,ierr; 4623 4624 PetscFunctionBegin; 4625 PetscValidType(A); 4626 MatPreallocated(A); 4627 ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr); 4628 if (N > M) { 4629 ierr = MatMultTranspose(A,x,y);CHKERRQ(ierr); 4630 } else { 4631 ierr = MatMult(A,x,y);CHKERRQ(ierr); 4632 } 4633 PetscFunctionReturn(0); 4634 } 4635 4636 #undef __FUNCT__ 4637 #define __FUNCT__ "MatRestrict" 4638 /*@ 4639 MatRestrict - y = A*x or A'*x 4640 4641 Collective on Mat 4642 4643 Input Parameters: 4644 + mat - the matrix 4645 - x,y - the vectors 4646 4647 Level: intermediate 4648 4649 Notes: 4650 This allows one to use either the restriction or interpolation (its transpose) 4651 matrix to do the restriction 4652 4653 Concepts: matrices^restriction 4654 4655 .seealso: MatMultAdd(), MatMultTransposeAdd(), MatInterpolate() 4656 4657 @*/ 4658 int MatRestrict(Mat A,Vec x,Vec y) 4659 { 4660 int M,N,ierr; 4661 4662 PetscFunctionBegin; 4663 PetscValidType(A); 4664 MatPreallocated(A); 4665 ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr); 4666 if (N > M) { 4667 ierr = MatMult(A,x,y);CHKERRQ(ierr); 4668 } else { 4669 ierr = MatMultTranspose(A,x,y);CHKERRQ(ierr); 4670 } 4671 PetscFunctionReturn(0); 4672 } 4673 4674 #undef __FUNCT__ 4675 #define __FUNCT__ "MatNullSpaceAttach" 4676 /*@C 4677 MatNullSpaceAttach - attaches a null space to a matrix. 4678 This null space will be removed from the resulting vector whenever 4679 MatMult() is called 4680 4681 Collective on Mat 4682 4683 Input Parameters: 4684 + mat - the matrix 4685 - nullsp - the null space object 4686 4687 Level: developer 4688 4689 Notes: 4690 Overwrites any previous null space that may have been attached 4691 4692 Concepts: null space^attaching to matrix 4693 4694 .seealso: MatCreate(), MatNullSpaceCreate() 4695 @*/ 4696 int MatNullSpaceAttach(Mat mat,MatNullSpace nullsp) 4697 { 4698 int ierr; 4699 4700 PetscFunctionBegin; 4701 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4702 PetscValidType(mat); 4703 MatPreallocated(mat); 4704 PetscValidHeaderSpecific(nullsp,MAT_NULLSPACE_COOKIE); 4705 4706 if (mat->nullsp) { 4707 ierr = MatNullSpaceDestroy(mat->nullsp);CHKERRQ(ierr); 4708 } 4709 mat->nullsp = nullsp; 4710 ierr = PetscObjectReference((PetscObject)nullsp);CHKERRQ(ierr); 4711 PetscFunctionReturn(0); 4712 } 4713 4714 #undef __FUNCT__ 4715 #define __FUNCT__ "MatICCFactor" 4716 /*@ 4717 MatICCFactor - Performs in-place incomplete Cholesky factorization of matrix. 4718 4719 Collective on Mat 4720 4721 Input Parameters: 4722 + mat - the matrix 4723 . row - row/column permutation 4724 . fill - expected fill factor >= 1.0 4725 - level - level of fill, for ICC(k) 4726 4727 Notes: 4728 Probably really in-place only when level of fill is zero, otherwise allocates 4729 new space to store factored matrix and deletes previous memory. 4730 4731 Most users should employ the simplified SLES interface for linear solvers 4732 instead of working directly with matrix algebra routines such as this. 4733 See, e.g., SLESCreate(). 4734 4735 Level: developer 4736 4737 Concepts: matrices^incomplete Cholesky factorization 4738 Concepts: Cholesky factorization 4739 4740 .seealso: MatICCFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor() 4741 @*/ 4742 int MatICCFactor(Mat mat,IS row,PetscReal fill,int level) 4743 { 4744 int ierr; 4745 4746 PetscFunctionBegin; 4747 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4748 PetscValidType(mat); 4749 MatPreallocated(mat); 4750 if (mat->M != mat->N) SETERRQ(PETSC_ERR_ARG_WRONG,"matrix must be square"); 4751 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 4752 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 4753 if (!mat->ops->iccfactor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 4754 ierr = (*mat->ops->iccfactor)(mat,row,fill,level);CHKERRQ(ierr); 4755 PetscFunctionReturn(0); 4756 } 4757 4758 #undef __FUNCT__ 4759 #define __FUNCT__ "MatSetValuesAdic" 4760 /*@ 4761 MatSetValuesAdic - Sets values computed with ADIC automatic differentiation into a matrix. 4762 4763 Not Collective 4764 4765 Input Parameters: 4766 + mat - the matrix 4767 - v - the values compute with ADIC 4768 4769 Level: developer 4770 4771 Notes: 4772 Must call MatSetColoring() before using this routine. Also this matrix must already 4773 have its nonzero pattern determined. 4774 4775 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal(), 4776 MatSetValues(), MatSetColoring(), MatSetValuesAdifor() 4777 @*/ 4778 int MatSetValuesAdic(Mat mat,void *v) 4779 { 4780 int ierr; 4781 4782 PetscFunctionBegin; 4783 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4784 PetscValidType(mat); 4785 4786 if (!mat->assembled) { 4787 SETERRQ(1,"Matrix must be already assembled"); 4788 } 4789 ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 4790 if (!mat->ops->setvaluesadic) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 4791 ierr = (*mat->ops->setvaluesadic)(mat,v);CHKERRQ(ierr); 4792 ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 4793 ierr = MatView_Private(mat);CHKERRQ(ierr); 4794 PetscFunctionReturn(0); 4795 } 4796 4797 4798 #undef __FUNCT__ 4799 #define __FUNCT__ "MatSetColoring" 4800 /*@ 4801 MatSetColoring - Sets a coloring used by calls to MatSetValuesAdic() 4802 4803 Not Collective 4804 4805 Input Parameters: 4806 + mat - the matrix 4807 - coloring - the coloring 4808 4809 Level: developer 4810 4811 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal(), 4812 MatSetValues(), MatSetValuesAdic() 4813 @*/ 4814 int MatSetColoring(Mat mat,ISColoring coloring) 4815 { 4816 int ierr; 4817 4818 PetscFunctionBegin; 4819 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4820 PetscValidType(mat); 4821 4822 if (!mat->assembled) { 4823 SETERRQ(1,"Matrix must be already assembled"); 4824 } 4825 if (!mat->ops->setcoloring) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 4826 ierr = (*mat->ops->setcoloring)(mat,coloring);CHKERRQ(ierr); 4827 PetscFunctionReturn(0); 4828 } 4829 4830 #undef __FUNCT__ 4831 #define __FUNCT__ "MatSetValuesAdifor" 4832 /*@ 4833 MatSetValuesAdifor - Sets values computed with automatic differentiation into a matrix. 4834 4835 Not Collective 4836 4837 Input Parameters: 4838 + mat - the matrix 4839 . nl - leading dimension of v 4840 - v - the values compute with ADIFOR 4841 4842 Level: developer 4843 4844 Notes: 4845 Must call MatSetColoring() before using this routine. Also this matrix must already 4846 have its nonzero pattern determined. 4847 4848 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal(), 4849 MatSetValues(), MatSetColoring() 4850 @*/ 4851 int MatSetValuesAdifor(Mat mat,int nl,void *v) 4852 { 4853 int ierr; 4854 4855 PetscFunctionBegin; 4856 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4857 PetscValidType(mat); 4858 4859 if (!mat->assembled) { 4860 SETERRQ(1,"Matrix must be already assembled"); 4861 } 4862 ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 4863 if (!mat->ops->setvaluesadifor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 4864 ierr = (*mat->ops->setvaluesadifor)(mat,nl,v);CHKERRQ(ierr); 4865 ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 4866 PetscFunctionReturn(0); 4867 } 4868 4869 EXTERN int MatMPIAIJDiagonalScaleLocal(Mat,Vec); 4870 EXTERN int MatMPIBAIJDiagonalScaleLocal(Mat,Vec); 4871 4872 #undef __FUNCT__ 4873 #define __FUNCT__ "MatDiagonalScaleLocal" 4874 /*@ 4875 MatDiagonalScaleLocal - Scales columns of a matrix given the scaling values including the 4876 ghosted ones. 4877 4878 Not Collective 4879 4880 Input Parameters: 4881 + mat - the matrix 4882 - diag = the diagonal values, including ghost ones 4883 4884 Level: developer 4885 4886 Notes: Works only for MPIAIJ and MPIBAIJ matrices 4887 4888 .seealso: MatDiagonalScale() 4889 @*/ 4890 int MatDiagonalScaleLocal(Mat mat,Vec diag) 4891 { 4892 int ierr; 4893 PetscTruth flag; 4894 4895 PetscFunctionBegin; 4896 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4897 PetscValidHeaderSpecific(diag,VEC_COOKIE); 4898 PetscValidType(mat); 4899 4900 if (!mat->assembled) { 4901 SETERRQ(1,"Matrix must be already assembled"); 4902 } 4903 ierr = PetscLogEventBegin(MAT_Scale,mat,0,0,0);CHKERRQ(ierr); 4904 ierr = PetscTypeCompare((PetscObject)mat,MATMPIAIJ,&flag);CHKERRQ(ierr); 4905 if (flag) { 4906 ierr = MatMPIAIJDiagonalScaleLocal(mat,diag);CHKERRQ(ierr); 4907 } else { 4908 ierr = PetscTypeCompare((PetscObject)mat,MATMPIBAIJ,&flag);CHKERRQ(ierr); 4909 if (flag) { 4910 ierr = MatMPIBAIJDiagonalScaleLocal(mat,diag);CHKERRQ(ierr); 4911 } else { 4912 int size; 4913 ierr = MPI_Comm_size(mat->comm,&size);CHKERRQ(ierr); 4914 if (size == 1) { 4915 int n,m; 4916 ierr = VecGetSize(diag,&n);CHKERRQ(ierr); 4917 ierr = MatGetSize(mat,0,&m);CHKERRQ(ierr); 4918 if (m == n) { 4919 ierr = MatDiagonalScale(mat,0,diag);CHKERRQ(ierr); 4920 } else { 4921 SETERRQ(1,"Only supprted for sequential matrices when no ghost points/periodic conditions"); 4922 } 4923 } else { 4924 SETERRQ(1,"Only supported for MPIAIJ and MPIBAIJ parallel matrices"); 4925 } 4926 } 4927 } 4928 ierr = PetscLogEventEnd(MAT_Scale,mat,0,0,0);CHKERRQ(ierr); 4929 PetscFunctionReturn(0); 4930 } 4931 4932 #undef __FUNCT__ 4933 #define __FUNCT__ "MatGetInertia" 4934 /*@ 4935 MatGetInertia - Gets the inertia from a factored matrix 4936 4937 Collective on Mat 4938 4939 Input Parameter: 4940 . mat - the matrix 4941 4942 Output Parameters: 4943 + nneg - number of negative eigenvalues 4944 . nzero - number of zero eigenvalues 4945 - npos - number of positive eigenvalues 4946 4947 Level: advanced 4948 4949 Notes: Matrix must have been factored by MatCholeskyFactor() 4950 4951 4952 @*/ 4953 int MatGetInertia(Mat mat,int *nneg,int *nzero,int *npos) 4954 { 4955 int ierr; 4956 4957 PetscFunctionBegin; 4958 PetscValidHeaderSpecific(mat,MAT_COOKIE); 4959 PetscValidType(mat); 4960 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 4961 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Numeric factor mat is not assembled"); 4962 if (!mat->ops->getinertia) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 4963 ierr = (*mat->ops->getinertia)(mat,nneg,nzero,npos);CHKERRQ(ierr); 4964 PetscFunctionReturn(0); 4965 } 4966 4967 /* ----------------------------------------------------------------*/ 4968 #undef __FUNCT__ 4969 #define __FUNCT__ "MatSolves" 4970 /*@ 4971 MatSolves - Solves A x = b, given a factored matrix, for a collection of vectors 4972 4973 Collective on Mat and Vecs 4974 4975 Input Parameters: 4976 + mat - the factored matrix 4977 - b - the right-hand-side vectors 4978 4979 Output Parameter: 4980 . x - the result vectors 4981 4982 Notes: 4983 The vectors b and x cannot be the same. I.e., one cannot 4984 call MatSolves(A,x,x). 4985 4986 Notes: 4987 Most users should employ the simplified SLES interface for linear solvers 4988 instead of working directly with matrix algebra routines such as this. 4989 See, e.g., SLESCreate(). 4990 4991 Level: developer 4992 4993 Concepts: matrices^triangular solves 4994 4995 .seealso: MatSolveAdd(), MatSolveTranspose(), MatSolveTransposeAdd(), MatSolve() 4996 @*/ 4997 int MatSolves(Mat mat,Vecs b,Vecs x) 4998 { 4999 int ierr; 5000 5001 PetscFunctionBegin; 5002 PetscValidHeaderSpecific(mat,MAT_COOKIE); 5003 PetscValidType(mat); 5004 MatPreallocated(mat); 5005 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 5006 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 5007 if (mat->M == 0 && mat->N == 0) PetscFunctionReturn(0); 5008 5009 if (!mat->ops->solves) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",mat->type_name); 5010 ierr = PetscLogEventBegin(MAT_Solves,mat,0,0,0);CHKERRQ(ierr); 5011 ierr = (*mat->ops->solves)(mat,b,x);CHKERRQ(ierr); 5012 ierr = PetscLogEventEnd(MAT_Solves,mat,0,0,0);CHKERRQ(ierr); 5013 PetscFunctionReturn(0); 5014 } 5015