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