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