1 #define PETSCMAT_DLL 2 3 /* 4 This is where the abstract matrix operations are defined 5 */ 6 7 #include "private/matimpl.h" /*I "petscmat.h" I*/ 8 #include "private/vecimpl.h" 9 10 /* Logging support */ 11 PetscCookie PETSCMAT_DLLEXPORT MAT_COOKIE; 12 PetscCookie PETSCMAT_DLLEXPORT MAT_FDCOLORING_COOKIE; 13 14 PetscLogEvent MAT_Mult, MAT_Mults, MAT_MultConstrained, MAT_MultAdd, MAT_MultTranspose; 15 PetscLogEvent MAT_MultTransposeConstrained, MAT_MultTransposeAdd, MAT_Solve, MAT_Solves, MAT_SolveAdd, MAT_SolveTranspose, MAT_MatSolve; 16 PetscLogEvent MAT_SolveTransposeAdd, MAT_SOR, MAT_ForwardSolve, MAT_BackwardSolve, MAT_LUFactor, MAT_LUFactorSymbolic; 17 PetscLogEvent MAT_LUFactorNumeric, MAT_CholeskyFactor, MAT_CholeskyFactorSymbolic, MAT_CholeskyFactorNumeric, MAT_ILUFactor; 18 PetscLogEvent MAT_ILUFactorSymbolic, MAT_ICCFactorSymbolic, MAT_Copy, MAT_Convert, MAT_Scale, MAT_AssemblyBegin; 19 PetscLogEvent MAT_AssemblyEnd, MAT_SetValues, MAT_GetValues, MAT_GetRow, MAT_GetRowIJ, MAT_GetSubMatrices, MAT_GetColoring, MAT_GetOrdering, MAT_GetRedundantMatrix, MAT_GetSeqNonzeroStructure; 20 PetscLogEvent MAT_IncreaseOverlap, MAT_Partitioning, MAT_ZeroEntries, MAT_Load, MAT_View, MAT_AXPY, MAT_FDColoringCreate; 21 PetscLogEvent MAT_FDColoringApply,MAT_Transpose,MAT_FDColoringFunction; 22 PetscLogEvent MAT_MatMult, MAT_MatMultSymbolic, MAT_MatMultNumeric; 23 PetscLogEvent MAT_PtAP, MAT_PtAPSymbolic, MAT_PtAPNumeric; 24 PetscLogEvent MAT_MatMultTranspose, MAT_MatMultTransposeSymbolic, MAT_MatMultTransposeNumeric; 25 PetscLogEvent MAT_Getsymtranspose, MAT_Getsymtransreduced, MAT_Transpose_SeqAIJ, MAT_GetBrowsOfAcols; 26 PetscLogEvent MAT_GetBrowsOfAocols, MAT_Getlocalmat, MAT_Getlocalmatcondensed, MAT_Seqstompi, MAT_Seqstompinum, MAT_Seqstompisym; 27 PetscLogEvent MAT_Applypapt, MAT_Applypapt_numeric, MAT_Applypapt_symbolic, MAT_GetSequentialNonzeroStructure; 28 PetscLogEvent MAT_ILUDTFactorSymbolic, MAT_ILUDTFactorNumeric; 29 30 /* nasty global values for MatSetValue() */ 31 PetscInt PETSCMAT_DLLEXPORT MatSetValue_Row = 0; 32 PetscInt PETSCMAT_DLLEXPORT MatSetValue_Column = 0; 33 PetscScalar PETSCMAT_DLLEXPORT MatSetValue_Value = 0.0; 34 35 #undef __FUNCT__ 36 #define __FUNCT__ "MatGetDiagonalBlock" 37 /*@ 38 MatGetDiagonalBlock - Returns the part of the matrix associated with the on-process coupling 39 40 Not Collective 41 42 Input Parameters: 43 + mat - the matrix 44 - reuse - indicates you are passing in the a matrix and want it reused 45 46 Output Parameters: 47 + iscopy - indicates a copy of the diagonal matrix was created and you should use MatDestroy() on it 48 - a - the diagonal part (which is a SEQUENTIAL matrix) 49 50 Notes: see the manual page for MatCreateMPIAIJ() for more information on the "diagonal part" of the matrix 51 52 Level: advanced 53 54 @*/ 55 PetscErrorCode PETSCMAT_DLLEXPORT MatGetDiagonalBlock(Mat A,PetscTruth *iscopy,MatReuse reuse,Mat *a) 56 { 57 PetscErrorCode ierr,(*f)(Mat,PetscTruth*,MatReuse,Mat*); 58 PetscMPIInt size; 59 60 PetscFunctionBegin; 61 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 62 PetscValidType(A,1); 63 PetscValidPointer(iscopy,2); 64 PetscValidPointer(a,3); 65 if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 66 if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 67 ierr = MPI_Comm_size(((PetscObject)A)->comm,&size);CHKERRQ(ierr); 68 ierr = PetscObjectQueryFunction((PetscObject)A,"MatGetDiagonalBlock_C",(void (**)(void))&f);CHKERRQ(ierr); 69 if (f) { 70 ierr = (*f)(A,iscopy,reuse,a);CHKERRQ(ierr); 71 } else if (size == 1) { 72 *a = A; 73 *iscopy = PETSC_FALSE; 74 } else { 75 SETERRQ(PETSC_ERR_SUP,"Cannot get diagonal part for this matrix"); 76 } 77 PetscFunctionReturn(0); 78 } 79 80 #undef __FUNCT__ 81 #define __FUNCT__ "MatRealPart" 82 /*@ 83 MatRealPart - Zeros out the imaginary part of the matrix 84 85 Collective on Mat 86 87 Input Parameters: 88 . mat - the matrix 89 90 Level: advanced 91 92 93 .seealso: MatImaginaryPart() 94 @*/ 95 PetscErrorCode PETSCMAT_DLLEXPORT MatRealPart(Mat mat) 96 { 97 PetscErrorCode ierr; 98 99 PetscFunctionBegin; 100 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 101 PetscValidType(mat,1); 102 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 103 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 104 if (!mat->ops->realpart) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 105 ierr = MatPreallocated(mat);CHKERRQ(ierr); 106 ierr = (*mat->ops->realpart)(mat);CHKERRQ(ierr); 107 PetscFunctionReturn(0); 108 } 109 110 #undef __FUNCT__ 111 #define __FUNCT__ "MatGetGhosts" 112 /*@C 113 MatGetGhosts - Get the global index of all ghost nodes defined by the sparse matrix 114 115 Collective on Mat 116 117 Input Parameter: 118 . mat - the matrix 119 120 Output Parameters: 121 + nghosts - number of ghosts (note for BAIJ matrices there is one ghost for each block) 122 - ghosts - the global indices of the ghost points 123 124 Notes: the nghosts and ghosts are suitable to pass into VecCreateGhost() 125 126 Level: advanced 127 128 @*/ 129 PetscErrorCode PETSCMAT_DLLEXPORT MatGetGhosts(Mat mat,PetscInt *nghosts,const PetscInt *ghosts[]) 130 { 131 PetscErrorCode ierr; 132 133 PetscFunctionBegin; 134 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 135 PetscValidType(mat,1); 136 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 137 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 138 if (!mat->ops->getghosts) { 139 if (nghosts) *nghosts = 0; 140 if (ghosts) *ghosts = 0; 141 } else { 142 ierr = (*mat->ops->getghosts)(mat,nghosts,ghosts);CHKERRQ(ierr); 143 } 144 PetscFunctionReturn(0); 145 } 146 147 148 #undef __FUNCT__ 149 #define __FUNCT__ "MatImaginaryPart" 150 /*@ 151 MatImaginaryPart - Moves the imaginary part of the matrix to the real part and zeros the imaginary part 152 153 Collective on Mat 154 155 Input Parameters: 156 . mat - the matrix 157 158 Level: advanced 159 160 161 .seealso: MatRealPart() 162 @*/ 163 PetscErrorCode PETSCMAT_DLLEXPORT MatImaginaryPart(Mat mat) 164 { 165 PetscErrorCode ierr; 166 167 PetscFunctionBegin; 168 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 169 PetscValidType(mat,1); 170 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 171 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 172 if (!mat->ops->imaginarypart) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 173 ierr = MatPreallocated(mat);CHKERRQ(ierr); 174 ierr = (*mat->ops->imaginarypart)(mat);CHKERRQ(ierr); 175 PetscFunctionReturn(0); 176 } 177 178 #undef __FUNCT__ 179 #define __FUNCT__ "MatMissingDiagonal" 180 /*@ 181 MatMissingDiagonal - Determine if sparse matrix is missing a diagonal entry (or block entry for BAIJ matrices) 182 183 Collective on Mat 184 185 Input Parameter: 186 . mat - the matrix 187 188 Output Parameters: 189 + missing - is any diagonal missing 190 - dd - first diagonal entry that is missing (optional) 191 192 Level: advanced 193 194 195 .seealso: MatRealPart() 196 @*/ 197 PetscErrorCode PETSCMAT_DLLEXPORT MatMissingDiagonal(Mat mat,PetscTruth *missing,PetscInt *dd) 198 { 199 PetscErrorCode ierr; 200 201 PetscFunctionBegin; 202 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 203 PetscValidType(mat,1); 204 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 205 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 206 if (!mat->ops->missingdiagonal) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 207 ierr = (*mat->ops->missingdiagonal)(mat,missing,dd);CHKERRQ(ierr); 208 PetscFunctionReturn(0); 209 } 210 211 #undef __FUNCT__ 212 #define __FUNCT__ "MatGetRow" 213 /*@C 214 MatGetRow - Gets a row of a matrix. You MUST call MatRestoreRow() 215 for each row that you get to ensure that your application does 216 not bleed memory. 217 218 Not Collective 219 220 Input Parameters: 221 + mat - the matrix 222 - row - the row to get 223 224 Output Parameters: 225 + ncols - if not NULL, the number of nonzeros in the row 226 . cols - if not NULL, the column numbers 227 - vals - if not NULL, the values 228 229 Notes: 230 This routine is provided for people who need to have direct access 231 to the structure of a matrix. We hope that we provide enough 232 high-level matrix routines that few users will need it. 233 234 MatGetRow() always returns 0-based column indices, regardless of 235 whether the internal representation is 0-based (default) or 1-based. 236 237 For better efficiency, set cols and/or vals to PETSC_NULL if you do 238 not wish to extract these quantities. 239 240 The user can only examine the values extracted with MatGetRow(); 241 the values cannot be altered. To change the matrix entries, one 242 must use MatSetValues(). 243 244 You can only have one call to MatGetRow() outstanding for a particular 245 matrix at a time, per processor. MatGetRow() can only obtain rows 246 associated with the given processor, it cannot get rows from the 247 other processors; for that we suggest using MatGetSubMatrices(), then 248 MatGetRow() on the submatrix. The row indix passed to MatGetRows() 249 is in the global number of rows. 250 251 Fortran Notes: 252 The calling sequence from Fortran is 253 .vb 254 MatGetRow(matrix,row,ncols,cols,values,ierr) 255 Mat matrix (input) 256 integer row (input) 257 integer ncols (output) 258 integer cols(maxcols) (output) 259 double precision (or double complex) values(maxcols) output 260 .ve 261 where maxcols >= maximum nonzeros in any row of the matrix. 262 263 264 Caution: 265 Do not try to change the contents of the output arrays (cols and vals). 266 In some cases, this may corrupt the matrix. 267 268 Level: advanced 269 270 Concepts: matrices^row access 271 272 .seealso: MatRestoreRow(), MatSetValues(), MatGetValues(), MatGetSubMatrices(), MatGetDiagonal() 273 @*/ 274 PetscErrorCode PETSCMAT_DLLEXPORT MatGetRow(Mat mat,PetscInt row,PetscInt *ncols,const PetscInt *cols[],const PetscScalar *vals[]) 275 { 276 PetscErrorCode ierr; 277 PetscInt incols; 278 279 PetscFunctionBegin; 280 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 281 PetscValidType(mat,1); 282 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 283 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 284 if (!mat->ops->getrow) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 285 ierr = MatPreallocated(mat);CHKERRQ(ierr); 286 ierr = PetscLogEventBegin(MAT_GetRow,mat,0,0,0);CHKERRQ(ierr); 287 ierr = (*mat->ops->getrow)(mat,row,&incols,(PetscInt **)cols,(PetscScalar **)vals);CHKERRQ(ierr); 288 if (ncols) *ncols = incols; 289 ierr = PetscLogEventEnd(MAT_GetRow,mat,0,0,0);CHKERRQ(ierr); 290 PetscFunctionReturn(0); 291 } 292 293 #undef __FUNCT__ 294 #define __FUNCT__ "MatConjugate" 295 /*@ 296 MatConjugate - replaces the matrix values with their complex conjugates 297 298 Collective on Mat 299 300 Input Parameters: 301 . mat - the matrix 302 303 Level: advanced 304 305 .seealso: VecConjugate() 306 @*/ 307 PetscErrorCode PETSCMAT_DLLEXPORT MatConjugate(Mat mat) 308 { 309 PetscErrorCode ierr; 310 311 PetscFunctionBegin; 312 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 313 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 314 if (!mat->ops->conjugate) SETERRQ(PETSC_ERR_SUP,"Not provided for this matrix format, send email to petsc-maint@mcs.anl.gov"); 315 ierr = (*mat->ops->conjugate)(mat);CHKERRQ(ierr); 316 PetscFunctionReturn(0); 317 } 318 319 #undef __FUNCT__ 320 #define __FUNCT__ "MatRestoreRow" 321 /*@C 322 MatRestoreRow - Frees any temporary space allocated by MatGetRow(). 323 324 Not Collective 325 326 Input Parameters: 327 + mat - the matrix 328 . row - the row to get 329 . ncols, cols - the number of nonzeros and their columns 330 - vals - if nonzero the column values 331 332 Notes: 333 This routine should be called after you have finished examining the entries. 334 335 Fortran Notes: 336 The calling sequence from Fortran is 337 .vb 338 MatRestoreRow(matrix,row,ncols,cols,values,ierr) 339 Mat matrix (input) 340 integer row (input) 341 integer ncols (output) 342 integer cols(maxcols) (output) 343 double precision (or double complex) values(maxcols) output 344 .ve 345 Where maxcols >= maximum nonzeros in any row of the matrix. 346 347 In Fortran MatRestoreRow() MUST be called after MatGetRow() 348 before another call to MatGetRow() can be made. 349 350 Level: advanced 351 352 .seealso: MatGetRow() 353 @*/ 354 PetscErrorCode PETSCMAT_DLLEXPORT MatRestoreRow(Mat mat,PetscInt row,PetscInt *ncols,const PetscInt *cols[],const PetscScalar *vals[]) 355 { 356 PetscErrorCode ierr; 357 358 PetscFunctionBegin; 359 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 360 PetscValidIntPointer(ncols,3); 361 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 362 if (!mat->ops->restorerow) PetscFunctionReturn(0); 363 ierr = (*mat->ops->restorerow)(mat,row,ncols,(PetscInt **)cols,(PetscScalar **)vals);CHKERRQ(ierr); 364 PetscFunctionReturn(0); 365 } 366 367 #undef __FUNCT__ 368 #define __FUNCT__ "MatGetRowUpperTriangular" 369 /*@ 370 MatGetRowUpperTriangular - Sets a flag to enable calls to MatGetRow() for matrix in MATSBAIJ format. 371 You should call MatRestoreRowUpperTriangular() after calling MatGetRow/MatRestoreRow() to disable the flag. 372 373 Not Collective 374 375 Input Parameters: 376 + mat - the matrix 377 378 Notes: 379 The flag is to ensure that users are aware of MatGetRow() only provides the upper trianglular part of the row for the matrices in MATSBAIJ format. 380 381 Level: advanced 382 383 Concepts: matrices^row access 384 385 .seealso: MatRestoreRowRowUpperTriangular() 386 @*/ 387 PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowUpperTriangular(Mat mat) 388 { 389 PetscErrorCode ierr; 390 391 PetscFunctionBegin; 392 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 393 PetscValidType(mat,1); 394 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 395 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 396 if (!mat->ops->getrowuppertriangular) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 397 ierr = MatPreallocated(mat);CHKERRQ(ierr); 398 ierr = (*mat->ops->getrowuppertriangular)(mat);CHKERRQ(ierr); 399 PetscFunctionReturn(0); 400 } 401 402 #undef __FUNCT__ 403 #define __FUNCT__ "MatRestoreRowUpperTriangular" 404 /*@ 405 MatRestoreRowUpperTriangular - Disable calls to MatGetRow() for matrix in MATSBAIJ format. 406 407 Not Collective 408 409 Input Parameters: 410 + mat - the matrix 411 412 Notes: 413 This routine should be called after you have finished MatGetRow/MatRestoreRow(). 414 415 416 Level: advanced 417 418 .seealso: MatGetRowUpperTriangular() 419 @*/ 420 PetscErrorCode PETSCMAT_DLLEXPORT MatRestoreRowUpperTriangular(Mat mat) 421 { 422 PetscErrorCode ierr; 423 424 PetscFunctionBegin; 425 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 426 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 427 if (!mat->ops->restorerowuppertriangular) PetscFunctionReturn(0); 428 ierr = (*mat->ops->restorerowuppertriangular)(mat);CHKERRQ(ierr); 429 PetscFunctionReturn(0); 430 } 431 432 #undef __FUNCT__ 433 #define __FUNCT__ "MatSetOptionsPrefix" 434 /*@C 435 MatSetOptionsPrefix - Sets the prefix used for searching for all 436 Mat options in the database. 437 438 Collective on Mat 439 440 Input Parameter: 441 + A - the Mat context 442 - prefix - the prefix to prepend to all option names 443 444 Notes: 445 A hyphen (-) must NOT be given at the beginning of the prefix name. 446 The first character of all runtime options is AUTOMATICALLY the hyphen. 447 448 Level: advanced 449 450 .keywords: Mat, set, options, prefix, database 451 452 .seealso: MatSetFromOptions() 453 @*/ 454 PetscErrorCode PETSCMAT_DLLEXPORT MatSetOptionsPrefix(Mat A,const char prefix[]) 455 { 456 PetscErrorCode ierr; 457 458 PetscFunctionBegin; 459 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 460 ierr = PetscObjectSetOptionsPrefix((PetscObject)A,prefix);CHKERRQ(ierr); 461 PetscFunctionReturn(0); 462 } 463 464 #undef __FUNCT__ 465 #define __FUNCT__ "MatAppendOptionsPrefix" 466 /*@C 467 MatAppendOptionsPrefix - Appends to the prefix used for searching for all 468 Mat options in the database. 469 470 Collective on Mat 471 472 Input Parameters: 473 + A - the Mat context 474 - prefix - the prefix to prepend to all option names 475 476 Notes: 477 A hyphen (-) must NOT be given at the beginning of the prefix name. 478 The first character of all runtime options is AUTOMATICALLY the hyphen. 479 480 Level: advanced 481 482 .keywords: Mat, append, options, prefix, database 483 484 .seealso: MatGetOptionsPrefix() 485 @*/ 486 PetscErrorCode PETSCMAT_DLLEXPORT MatAppendOptionsPrefix(Mat A,const char prefix[]) 487 { 488 PetscErrorCode ierr; 489 490 PetscFunctionBegin; 491 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 492 ierr = PetscObjectAppendOptionsPrefix((PetscObject)A,prefix);CHKERRQ(ierr); 493 PetscFunctionReturn(0); 494 } 495 496 #undef __FUNCT__ 497 #define __FUNCT__ "MatGetOptionsPrefix" 498 /*@C 499 MatGetOptionsPrefix - Sets the prefix used for searching for all 500 Mat options in the database. 501 502 Not Collective 503 504 Input Parameter: 505 . A - the Mat context 506 507 Output Parameter: 508 . prefix - pointer to the prefix string used 509 510 Notes: On the fortran side, the user should pass in a string 'prefix' of 511 sufficient length to hold the prefix. 512 513 Level: advanced 514 515 .keywords: Mat, get, options, prefix, database 516 517 .seealso: MatAppendOptionsPrefix() 518 @*/ 519 PetscErrorCode PETSCMAT_DLLEXPORT MatGetOptionsPrefix(Mat A,const char *prefix[]) 520 { 521 PetscErrorCode ierr; 522 523 PetscFunctionBegin; 524 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 525 ierr = PetscObjectGetOptionsPrefix((PetscObject)A,prefix);CHKERRQ(ierr); 526 PetscFunctionReturn(0); 527 } 528 529 #undef __FUNCT__ 530 #define __FUNCT__ "MatSetUp" 531 /*@ 532 MatSetUp - Sets up the internal matrix data structures for the later use. 533 534 Collective on Mat 535 536 Input Parameters: 537 . A - the Mat context 538 539 Notes: 540 For basic use of the Mat classes the user need not explicitly call 541 MatSetUp(), since these actions will happen automatically. 542 543 Level: advanced 544 545 .keywords: Mat, setup 546 547 .seealso: MatCreate(), MatDestroy() 548 @*/ 549 PetscErrorCode PETSCMAT_DLLEXPORT MatSetUp(Mat A) 550 { 551 PetscMPIInt size; 552 PetscErrorCode ierr; 553 554 PetscFunctionBegin; 555 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 556 if (!((PetscObject)A)->type_name) { 557 ierr = MPI_Comm_size(((PetscObject)A)->comm, &size);CHKERRQ(ierr); 558 if (size == 1) { 559 ierr = MatSetType(A, MATSEQAIJ);CHKERRQ(ierr); 560 } else { 561 ierr = MatSetType(A, MATMPIAIJ);CHKERRQ(ierr); 562 } 563 } 564 ierr = MatSetUpPreallocation(A);CHKERRQ(ierr); 565 PetscFunctionReturn(0); 566 } 567 568 #undef __FUNCT__ 569 #define __FUNCT__ "MatView" 570 /*@C 571 MatView - Visualizes a matrix object. 572 573 Collective on Mat 574 575 Input Parameters: 576 + mat - the matrix 577 - viewer - visualization context 578 579 Notes: 580 The available visualization contexts include 581 + PETSC_VIEWER_STDOUT_SELF - standard output (default) 582 . PETSC_VIEWER_STDOUT_WORLD - synchronized standard 583 output where only the first processor opens 584 the file. All other processors send their 585 data to the first processor to print. 586 - PETSC_VIEWER_DRAW_WORLD - graphical display of nonzero structure 587 588 The user can open alternative visualization contexts with 589 + PetscViewerASCIIOpen() - Outputs matrix to a specified file 590 . PetscViewerBinaryOpen() - Outputs matrix in binary to a 591 specified file; corresponding input uses MatLoad() 592 . PetscViewerDrawOpen() - Outputs nonzero matrix structure to 593 an X window display 594 - PetscViewerSocketOpen() - Outputs matrix to Socket viewer. 595 Currently only the sequential dense and AIJ 596 matrix types support the Socket viewer. 597 598 The user can call PetscViewerSetFormat() to specify the output 599 format of ASCII printed objects (when using PETSC_VIEWER_STDOUT_SELF, 600 PETSC_VIEWER_STDOUT_WORLD and PetscViewerASCIIOpen). Available formats include 601 + PETSC_VIEWER_DEFAULT - default, prints matrix contents 602 . PETSC_VIEWER_ASCII_MATLAB - prints matrix contents in Matlab format 603 . PETSC_VIEWER_ASCII_DENSE - prints entire matrix including zeros 604 . PETSC_VIEWER_ASCII_COMMON - prints matrix contents, using a sparse 605 format common among all matrix types 606 . PETSC_VIEWER_ASCII_IMPL - prints matrix contents, using an implementation-specific 607 format (which is in many cases the same as the default) 608 . PETSC_VIEWER_ASCII_INFO - prints basic information about the matrix 609 size and structure (not the matrix entries) 610 . PETSC_VIEWER_ASCII_INFO_DETAIL - prints more detailed information about 611 the matrix structure 612 613 Options Database Keys: 614 + -mat_view_info - Prints info on matrix at conclusion of MatEndAssembly() 615 . -mat_view_info_detailed - Prints more detailed info 616 . -mat_view - Prints matrix in ASCII format 617 . -mat_view_matlab - Prints matrix in Matlab format 618 . -mat_view_draw - PetscDraws nonzero structure of matrix, using MatView() and PetscDrawOpenX(). 619 . -display <name> - Sets display name (default is host) 620 . -draw_pause <sec> - Sets number of seconds to pause after display 621 . -mat_view_socket - Sends matrix to socket, can be accessed from Matlab (see users manual) 622 . -viewer_socket_machine <machine> 623 . -viewer_socket_port <port> 624 . -mat_view_binary - save matrix to file in binary format 625 - -viewer_binary_filename <name> 626 Level: beginner 627 628 Notes: see the manual page for MatLoad() for the exact format of the binary file when the binary 629 viewer is used. 630 631 See bin/matlab/PetscBinaryRead.m for a Matlab code that can read in the binary file when the binary 632 viewer is used. 633 634 Concepts: matrices^viewing 635 Concepts: matrices^plotting 636 Concepts: matrices^printing 637 638 .seealso: PetscViewerSetFormat(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), 639 PetscViewerSocketOpen(), PetscViewerBinaryOpen(), MatLoad() 640 @*/ 641 PetscErrorCode PETSCMAT_DLLEXPORT MatView(Mat mat,PetscViewer viewer) 642 { 643 PetscErrorCode ierr; 644 PetscInt rows,cols; 645 PetscTruth iascii; 646 const MatType cstr; 647 PetscViewerFormat format; 648 649 PetscFunctionBegin; 650 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 651 PetscValidType(mat,1); 652 if (!viewer) { 653 ierr = PetscViewerASCIIGetStdout(((PetscObject)mat)->comm,&viewer);CHKERRQ(ierr); 654 } 655 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE,2); 656 PetscCheckSameComm(mat,1,viewer,2); 657 if (!mat->assembled) SETERRQ(PETSC_ERR_ORDER,"Must call MatAssemblyBegin/End() before viewing matrix"); 658 ierr = MatPreallocated(mat);CHKERRQ(ierr); 659 660 ierr = PetscLogEventBegin(MAT_View,mat,viewer,0,0);CHKERRQ(ierr); 661 ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 662 if (iascii) { 663 ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 664 if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 665 if (((PetscObject)mat)->prefix) { 666 ierr = PetscViewerASCIIPrintf(viewer,"Matrix Object:(%s)\n",((PetscObject)mat)->prefix);CHKERRQ(ierr); 667 } else { 668 ierr = PetscViewerASCIIPrintf(viewer,"Matrix Object:\n");CHKERRQ(ierr); 669 } 670 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 671 ierr = MatGetType(mat,&cstr);CHKERRQ(ierr); 672 ierr = MatGetSize(mat,&rows,&cols);CHKERRQ(ierr); 673 ierr = PetscViewerASCIIPrintf(viewer,"type=%s, rows=%D, cols=%D\n",cstr,rows,cols);CHKERRQ(ierr); 674 if (mat->factor) { 675 const MatSolverPackage solver; 676 ierr = MatFactorGetSolverPackage(mat,&solver);CHKERRQ(ierr); 677 ierr = PetscViewerASCIIPrintf(viewer,"package used to perform factorization: %s\n",solver);CHKERRQ(ierr); 678 } 679 if (mat->ops->getinfo) { 680 MatInfo info; 681 ierr = MatGetInfo(mat,MAT_GLOBAL_SUM,&info);CHKERRQ(ierr); 682 ierr = PetscViewerASCIIPrintf(viewer,"total: nonzeros=%D, allocated nonzeros=%D\n",(PetscInt)info.nz_used,(PetscInt)info.nz_allocated);CHKERRQ(ierr); 683 } 684 } 685 } 686 if (mat->ops->view) { 687 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 688 ierr = (*mat->ops->view)(mat,viewer);CHKERRQ(ierr); 689 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 690 } else if (!iascii) { 691 SETERRQ1(PETSC_ERR_SUP,"Viewer type %s not supported",((PetscObject)viewer)->type_name); 692 } 693 if (iascii) { 694 ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 695 if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 696 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 697 } 698 } 699 ierr = PetscLogEventEnd(MAT_View,mat,viewer,0,0);CHKERRQ(ierr); 700 PetscFunctionReturn(0); 701 } 702 703 #undef __FUNCT__ 704 #define __FUNCT__ "MatScaleSystem" 705 /*@ 706 MatScaleSystem - Scale a vector solution and right hand side to 707 match the scaling of a scaled matrix. 708 709 Collective on Mat 710 711 Input Parameter: 712 + mat - the matrix 713 . b - right hand side vector (or PETSC_NULL) 714 - x - solution vector (or PETSC_NULL) 715 716 717 Notes: 718 For AIJ, and BAIJ matrix formats, the matrices are not 719 internally scaled, so this does nothing. For MPIROWBS it 720 permutes and diagonally scales. 721 722 The KSP methods automatically call this routine when required 723 (via PCPreSolve()) so it is rarely used directly. 724 725 Level: Developer 726 727 Concepts: matrices^scaling 728 729 .seealso: MatUseScaledForm(), MatUnScaleSystem() 730 @*/ 731 PetscErrorCode PETSCMAT_DLLEXPORT MatScaleSystem(Mat mat,Vec b,Vec x) 732 { 733 PetscErrorCode ierr; 734 735 PetscFunctionBegin; 736 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 737 PetscValidType(mat,1); 738 ierr = MatPreallocated(mat);CHKERRQ(ierr); 739 if (x) {PetscValidHeaderSpecific(x,VEC_COOKIE,2);PetscCheckSameComm(mat,1,x,2);} 740 if (b) {PetscValidHeaderSpecific(b,VEC_COOKIE,3);PetscCheckSameComm(mat,1,b,3);} 741 742 if (mat->ops->scalesystem) { 743 ierr = (*mat->ops->scalesystem)(mat,b,x);CHKERRQ(ierr); 744 } 745 PetscFunctionReturn(0); 746 } 747 748 #undef __FUNCT__ 749 #define __FUNCT__ "MatUnScaleSystem" 750 /*@ 751 MatUnScaleSystem - Unscales a vector solution and right hand side to 752 match the original scaling of a scaled matrix. 753 754 Collective on Mat 755 756 Input Parameter: 757 + mat - the matrix 758 . b - right hand side vector (or PETSC_NULL) 759 - x - solution vector (or PETSC_NULL) 760 761 762 Notes: 763 For AIJ and BAIJ matrix formats, the matrices are not 764 internally scaled, so this does nothing. For MPIROWBS it 765 permutes and diagonally scales. 766 767 The KSP methods automatically call this routine when required 768 (via PCPreSolve()) so it is rarely used directly. 769 770 Level: Developer 771 772 .seealso: MatUseScaledForm(), MatScaleSystem() 773 @*/ 774 PetscErrorCode PETSCMAT_DLLEXPORT MatUnScaleSystem(Mat mat,Vec b,Vec x) 775 { 776 PetscErrorCode ierr; 777 778 PetscFunctionBegin; 779 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 780 PetscValidType(mat,1); 781 ierr = MatPreallocated(mat);CHKERRQ(ierr); 782 if (x) {PetscValidHeaderSpecific(x,VEC_COOKIE,2);PetscCheckSameComm(mat,1,x,2);} 783 if (b) {PetscValidHeaderSpecific(b,VEC_COOKIE,3);PetscCheckSameComm(mat,1,b,3);} 784 if (mat->ops->unscalesystem) { 785 ierr = (*mat->ops->unscalesystem)(mat,b,x);CHKERRQ(ierr); 786 } 787 PetscFunctionReturn(0); 788 } 789 790 #undef __FUNCT__ 791 #define __FUNCT__ "MatUseScaledForm" 792 /*@ 793 MatUseScaledForm - For matrix storage formats that scale the 794 matrix (for example MPIRowBS matrices are diagonally scaled on 795 assembly) indicates matrix operations (MatMult() etc) are 796 applied using the scaled matrix. 797 798 Collective on Mat 799 800 Input Parameter: 801 + mat - the matrix 802 - scaled - PETSC_TRUE for applying the scaled, PETSC_FALSE for 803 applying the original matrix 804 805 Notes: 806 For scaled matrix formats, applying the original, unscaled matrix 807 will be slightly more expensive 808 809 Level: Developer 810 811 .seealso: MatScaleSystem(), MatUnScaleSystem() 812 @*/ 813 PetscErrorCode PETSCMAT_DLLEXPORT MatUseScaledForm(Mat mat,PetscTruth scaled) 814 { 815 PetscErrorCode ierr; 816 817 PetscFunctionBegin; 818 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 819 PetscValidType(mat,1); 820 ierr = MatPreallocated(mat);CHKERRQ(ierr); 821 if (mat->ops->usescaledform) { 822 ierr = (*mat->ops->usescaledform)(mat,scaled);CHKERRQ(ierr); 823 } 824 PetscFunctionReturn(0); 825 } 826 827 #undef __FUNCT__ 828 #define __FUNCT__ "MatDestroy" 829 /*@ 830 MatDestroy - Frees space taken by a matrix. 831 832 Collective on Mat 833 834 Input Parameter: 835 . A - the matrix 836 837 Level: beginner 838 839 @*/ 840 PetscErrorCode PETSCMAT_DLLEXPORT MatDestroy(Mat A) 841 { 842 PetscErrorCode ierr; 843 PetscFunctionBegin; 844 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 845 if (--((PetscObject)A)->refct > 0) PetscFunctionReturn(0); 846 ierr = MatPreallocated(A);CHKERRQ(ierr); 847 /* if memory was published with AMS then destroy it */ 848 ierr = PetscObjectDepublish(A);CHKERRQ(ierr); 849 if (A->ops->destroy) { 850 ierr = (*A->ops->destroy)(A);CHKERRQ(ierr); 851 } 852 if (A->mapping) { 853 ierr = ISLocalToGlobalMappingDestroy(A->mapping);CHKERRQ(ierr); 854 } 855 if (A->bmapping) { 856 ierr = ISLocalToGlobalMappingDestroy(A->bmapping);CHKERRQ(ierr); 857 } 858 859 if (A->spptr){ierr = PetscFree(A->spptr);CHKERRQ(ierr);} 860 ierr = PetscLayoutDestroy(A->rmap);CHKERRQ(ierr); 861 ierr = PetscLayoutDestroy(A->cmap);CHKERRQ(ierr); 862 ierr = PetscHeaderDestroy(A);CHKERRQ(ierr); 863 PetscFunctionReturn(0); 864 } 865 866 #undef __FUNCT__ 867 #define __FUNCT__ "MatValid" 868 /*@ 869 MatValid - Checks whether a matrix object is valid. 870 871 Collective on Mat 872 873 Input Parameter: 874 . m - the matrix to check 875 876 Output Parameter: 877 flg - flag indicating matrix status, either 878 PETSC_TRUE if matrix is valid, or PETSC_FALSE otherwise. 879 880 Level: developer 881 882 Concepts: matrices^validity 883 @*/ 884 PetscErrorCode PETSCMAT_DLLEXPORT MatValid(Mat m,PetscTruth *flg) 885 { 886 PetscFunctionBegin; 887 PetscValidIntPointer(flg,1); 888 if (!m) *flg = PETSC_FALSE; 889 else if (((PetscObject)m)->cookie != MAT_COOKIE) *flg = PETSC_FALSE; 890 else *flg = PETSC_TRUE; 891 PetscFunctionReturn(0); 892 } 893 894 #undef __FUNCT__ 895 #define __FUNCT__ "MatSetValues" 896 /*@ 897 MatSetValues - Inserts or adds a block of values into a matrix. 898 These values may be cached, so MatAssemblyBegin() and MatAssemblyEnd() 899 MUST be called after all calls to MatSetValues() have been completed. 900 901 Not Collective 902 903 Input Parameters: 904 + mat - the matrix 905 . v - a logically two-dimensional array of values 906 . m, idxm - the number of rows and their global indices 907 . n, idxn - the number of columns and their global indices 908 - addv - either ADD_VALUES or INSERT_VALUES, where 909 ADD_VALUES adds values to any existing entries, and 910 INSERT_VALUES replaces existing entries with new values 911 912 Notes: 913 By default the values, v, are row-oriented and unsorted. 914 See MatSetOption() for other options. 915 916 Calls to MatSetValues() with the INSERT_VALUES and ADD_VALUES 917 options cannot be mixed without intervening calls to the assembly 918 routines. 919 920 MatSetValues() uses 0-based row and column numbers in Fortran 921 as well as in C. 922 923 Negative indices may be passed in idxm and idxn, these rows and columns are 924 simply ignored. This allows easily inserting element stiffness matrices 925 with homogeneous Dirchlet boundary conditions that you don't want represented 926 in the matrix. 927 928 Efficiency Alert: 929 The routine MatSetValuesBlocked() may offer much better efficiency 930 for users of block sparse formats (MATSEQBAIJ and MATMPIBAIJ). 931 932 Level: beginner 933 934 Concepts: matrices^putting entries in 935 936 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal(), 937 InsertMode, INSERT_VALUES, ADD_VALUES 938 @*/ 939 PetscErrorCode PETSCMAT_DLLEXPORT MatSetValues(Mat mat,PetscInt m,const PetscInt idxm[],PetscInt n,const PetscInt idxn[],const PetscScalar v[],InsertMode addv) 940 { 941 PetscErrorCode ierr; 942 943 PetscFunctionBegin; 944 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 945 PetscValidType(mat,1); 946 if (!m || !n) PetscFunctionReturn(0); /* no values to insert */ 947 PetscValidIntPointer(idxm,3); 948 PetscValidIntPointer(idxn,5); 949 ierr = MatPreallocated(mat);CHKERRQ(ierr); 950 if (mat->insertmode == NOT_SET_VALUES) { 951 mat->insertmode = addv; 952 } 953 #if defined(PETSC_USE_DEBUG) 954 else if (mat->insertmode != addv) { 955 SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Cannot mix add values and insert values"); 956 } 957 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 958 #endif 959 960 if (mat->assembled) { 961 mat->was_assembled = PETSC_TRUE; 962 mat->assembled = PETSC_FALSE; 963 } 964 ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 965 if (!mat->ops->setvalues) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 966 ierr = (*mat->ops->setvalues)(mat,m,idxm,n,idxn,v,addv);CHKERRQ(ierr); 967 ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 968 PetscFunctionReturn(0); 969 } 970 971 972 #undef __FUNCT__ 973 #define __FUNCT__ "MatSetValuesRowLocal" 974 /*@ 975 MatSetValuesRowLocal - Inserts a row (block row for BAIJ matrices) of nonzero 976 values into a matrix 977 978 Not Collective 979 980 Input Parameters: 981 + mat - the matrix 982 . row - the (block) row to set 983 - v - a logically two-dimensional array of values 984 985 Notes: 986 By the values, v, are column-oriented (for the block version) and sorted 987 988 All the nonzeros in the row must be provided 989 990 The matrix must have previously had its column indices set 991 992 The row must belong to this process 993 994 Level: intermediate 995 996 Concepts: matrices^putting entries in 997 998 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal(), 999 InsertMode, INSERT_VALUES, ADD_VALUES, MatSetValues(), MatSetValuesRow(), MatSetLocalToGlobalMapping() 1000 @*/ 1001 PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesRowLocal(Mat mat,PetscInt row,const PetscScalar v[]) 1002 { 1003 PetscErrorCode ierr; 1004 1005 PetscFunctionBegin; 1006 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 1007 PetscValidType(mat,1); 1008 PetscValidScalarPointer(v,2); 1009 ierr = MatSetValuesRow(mat, mat->mapping->indices[row],v);CHKERRQ(ierr); 1010 PetscFunctionReturn(0); 1011 } 1012 1013 #undef __FUNCT__ 1014 #define __FUNCT__ "MatSetValuesRow" 1015 /*@ 1016 MatSetValuesRow - Inserts a row (block row for BAIJ matrices) of nonzero 1017 values into a matrix 1018 1019 Not Collective 1020 1021 Input Parameters: 1022 + mat - the matrix 1023 . row - the (block) row to set 1024 - v - a logically two-dimensional array of values 1025 1026 Notes: 1027 By the values, v, are column-oriented (for the block version) and sorted 1028 1029 All the nonzeros in the row must be provided 1030 1031 The matrix must have previously had its column indices set 1032 1033 The row must belong to this process 1034 1035 Level: intermediate 1036 1037 Concepts: matrices^putting entries in 1038 1039 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal(), 1040 InsertMode, INSERT_VALUES, ADD_VALUES, MatSetValues() 1041 @*/ 1042 PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesRow(Mat mat,PetscInt row,const PetscScalar v[]) 1043 { 1044 PetscErrorCode ierr; 1045 1046 PetscFunctionBegin; 1047 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 1048 PetscValidType(mat,1); 1049 PetscValidScalarPointer(v,2); 1050 #if defined(PETSC_USE_DEBUG) 1051 if (mat->insertmode == ADD_VALUES) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Cannot mix add and insert values"); 1052 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1053 #endif 1054 mat->insertmode = INSERT_VALUES; 1055 1056 if (mat->assembled) { 1057 mat->was_assembled = PETSC_TRUE; 1058 mat->assembled = PETSC_FALSE; 1059 } 1060 ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 1061 if (!mat->ops->setvaluesrow) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 1062 ierr = (*mat->ops->setvaluesrow)(mat,row,v);CHKERRQ(ierr); 1063 ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 1064 PetscFunctionReturn(0); 1065 } 1066 1067 #undef __FUNCT__ 1068 #define __FUNCT__ "MatSetValuesStencil" 1069 /*@ 1070 MatSetValuesStencil - Inserts or adds a block of values into a matrix. 1071 Using structured grid indexing 1072 1073 Not Collective 1074 1075 Input Parameters: 1076 + mat - the matrix 1077 . m - number of rows being entered 1078 . idxm - grid coordinates (and component number when dof > 1) for matrix rows being entered 1079 . n - number of columns being entered 1080 . idxn - grid coordinates (and component number when dof > 1) for matrix columns being entered 1081 . v - a logically two-dimensional array of values 1082 - addv - either ADD_VALUES or INSERT_VALUES, where 1083 ADD_VALUES adds values to any existing entries, and 1084 INSERT_VALUES replaces existing entries with new values 1085 1086 Notes: 1087 By default the values, v, are row-oriented. See MatSetOption() for other options. 1088 1089 Calls to MatSetValuesStencil() with the INSERT_VALUES and ADD_VALUES 1090 options cannot be mixed without intervening calls to the assembly 1091 routines. 1092 1093 The grid coordinates are across the entire grid, not just the local portion 1094 1095 MatSetValuesStencil() uses 0-based row and column numbers in Fortran 1096 as well as in C. 1097 1098 For setting/accessing vector values via array coordinates you can use the DAVecGetArray() routine 1099 1100 In order to use this routine you must either obtain the matrix with DAGetMatrix() 1101 or call MatSetLocalToGlobalMapping() and MatSetStencil() first. 1102 1103 The columns and rows in the stencil passed in MUST be contained within the 1104 ghost region of the given process as set with DACreateXXX() or MatSetStencil(). For example, 1105 if you create a DA with an overlap of one grid level and on a particular process its first 1106 local nonghost x logical coordinate is 6 (so its first ghost x logical coordinate is 5) the 1107 first i index you can use in your column and row indices in MatSetStencil() is 5. 1108 1109 In Fortran idxm and idxn should be declared as 1110 $ MatStencil idxm(4,m),idxn(4,n) 1111 and the values inserted using 1112 $ idxm(MatStencil_i,1) = i 1113 $ idxm(MatStencil_j,1) = j 1114 $ idxm(MatStencil_k,1) = k 1115 $ idxm(MatStencil_c,1) = c 1116 etc 1117 1118 For periodic boundary conditions use negative indices for values to the left (below 0; that are to be 1119 obtained by wrapping values from right edge). For values to the right of the last entry using that index plus one 1120 etc to obtain values that obtained by wrapping the values from the left edge. This does not work for the DA_NONPERIODIC 1121 wrap. 1122 1123 For indices that don't mean anything for your case (like the k index when working in 2d) or the c index when you have 1124 a single value per point) you can skip filling those indices. 1125 1126 Inspired by the structured grid interface to the HYPRE package 1127 (http://www.llnl.gov/CASC/hypre) 1128 1129 Efficiency Alert: 1130 The routine MatSetValuesBlockedStencil() may offer much better efficiency 1131 for users of block sparse formats (MATSEQBAIJ and MATMPIBAIJ). 1132 1133 Level: beginner 1134 1135 Concepts: matrices^putting entries in 1136 1137 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal() 1138 MatSetValues(), MatSetValuesBlockedStencil(), MatSetStencil(), DAGetMatrix(), DAVecGetArray(), MatStencil 1139 @*/ 1140 PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesStencil(Mat mat,PetscInt m,const MatStencil idxm[],PetscInt n,const MatStencil idxn[],const PetscScalar v[],InsertMode addv) 1141 { 1142 PetscErrorCode ierr; 1143 PetscInt j,i,jdxm[128],jdxn[256],dim = mat->stencil.dim,*dims = mat->stencil.dims+1,tmp; 1144 PetscInt *starts = mat->stencil.starts,*dxm = (PetscInt*)idxm,*dxn = (PetscInt*)idxn,sdim = dim - (1 - (PetscInt)mat->stencil.noc); 1145 1146 PetscFunctionBegin; 1147 if (!m || !n) PetscFunctionReturn(0); /* no values to insert */ 1148 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 1149 PetscValidType(mat,1); 1150 PetscValidIntPointer(idxm,3); 1151 PetscValidIntPointer(idxn,5); 1152 PetscValidScalarPointer(v,6); 1153 1154 if (m > 128) SETERRQ1(PETSC_ERR_SUP,"Can only set 128 rows at a time; trying to set %D",m); 1155 if (n > 256) SETERRQ1(PETSC_ERR_SUP,"Can only set 256 columns at a time; trying to set %D",n); 1156 1157 for (i=0; i<m; i++) { 1158 for (j=0; j<3-sdim; j++) dxm++; 1159 tmp = *dxm++ - starts[0]; 1160 for (j=0; j<dim-1; j++) { 1161 if ((*dxm++ - starts[j+1]) < 0 || tmp < 0) tmp = PETSC_MIN_INT; 1162 else tmp = tmp*dims[j] + *(dxm-1) - starts[j+1]; 1163 } 1164 if (mat->stencil.noc) dxm++; 1165 jdxm[i] = tmp; 1166 } 1167 for (i=0; i<n; i++) { 1168 for (j=0; j<3-sdim; j++) dxn++; 1169 tmp = *dxn++ - starts[0]; 1170 for (j=0; j<dim-1; j++) { 1171 if ((*dxn++ - starts[j+1]) < 0 || tmp < 0) tmp = PETSC_MIN_INT; 1172 else tmp = tmp*dims[j] + *(dxn-1) - starts[j+1]; 1173 } 1174 if (mat->stencil.noc) dxn++; 1175 jdxn[i] = tmp; 1176 } 1177 ierr = MatSetValuesLocal(mat,m,jdxm,n,jdxn,v,addv);CHKERRQ(ierr); 1178 PetscFunctionReturn(0); 1179 } 1180 1181 #undef __FUNCT__ 1182 #define __FUNCT__ "MatSetValuesBlockedStencil" 1183 /*@C 1184 MatSetValuesBlockedStencil - Inserts or adds a block of values into a matrix. 1185 Using structured grid indexing 1186 1187 Not Collective 1188 1189 Input Parameters: 1190 + mat - the matrix 1191 . m - number of rows being entered 1192 . idxm - grid coordinates for matrix rows being entered 1193 . n - number of columns being entered 1194 . idxn - grid coordinates for matrix columns being entered 1195 . v - a logically two-dimensional array of values 1196 - addv - either ADD_VALUES or INSERT_VALUES, where 1197 ADD_VALUES adds values to any existing entries, and 1198 INSERT_VALUES replaces existing entries with new values 1199 1200 Notes: 1201 By default the values, v, are row-oriented and unsorted. 1202 See MatSetOption() for other options. 1203 1204 Calls to MatSetValuesBlockedStencil() with the INSERT_VALUES and ADD_VALUES 1205 options cannot be mixed without intervening calls to the assembly 1206 routines. 1207 1208 The grid coordinates are across the entire grid, not just the local portion 1209 1210 MatSetValuesBlockedStencil() uses 0-based row and column numbers in Fortran 1211 as well as in C. 1212 1213 For setting/accessing vector values via array coordinates you can use the DAVecGetArray() routine 1214 1215 In order to use this routine you must either obtain the matrix with DAGetMatrix() 1216 or call MatSetBlockSize(), MatSetLocalToGlobalMapping() and MatSetStencil() first. 1217 1218 The columns and rows in the stencil passed in MUST be contained within the 1219 ghost region of the given process as set with DACreateXXX() or MatSetStencil(). For example, 1220 if you create a DA with an overlap of one grid level and on a particular process its first 1221 local nonghost x logical coordinate is 6 (so its first ghost x logical coordinate is 5) the 1222 first i index you can use in your column and row indices in MatSetStencil() is 5. 1223 1224 In Fortran idxm and idxn should be declared as 1225 $ MatStencil idxm(4,m),idxn(4,n) 1226 and the values inserted using 1227 $ idxm(MatStencil_i,1) = i 1228 $ idxm(MatStencil_j,1) = j 1229 $ idxm(MatStencil_k,1) = k 1230 etc 1231 1232 Negative indices may be passed in idxm and idxn, these rows and columns are 1233 simply ignored. This allows easily inserting element stiffness matrices 1234 with homogeneous Dirchlet boundary conditions that you don't want represented 1235 in the matrix. 1236 1237 Inspired by the structured grid interface to the HYPRE package 1238 (http://www.llnl.gov/CASC/hypre) 1239 1240 Level: beginner 1241 1242 Concepts: matrices^putting entries in 1243 1244 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal() 1245 MatSetValues(), MatSetValuesStencil(), MatSetStencil(), DAGetMatrix(), DAVecGetArray(), MatStencil, 1246 MatSetBlockSize(), MatSetLocalToGlobalMapping() 1247 @*/ 1248 PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesBlockedStencil(Mat mat,PetscInt m,const MatStencil idxm[],PetscInt n,const MatStencil idxn[],const PetscScalar v[],InsertMode addv) 1249 { 1250 PetscErrorCode ierr; 1251 PetscInt j,i,jdxm[128],jdxn[256],dim = mat->stencil.dim,*dims = mat->stencil.dims+1,tmp; 1252 PetscInt *starts = mat->stencil.starts,*dxm = (PetscInt*)idxm,*dxn = (PetscInt*)idxn,sdim = dim - (1 - (PetscInt)mat->stencil.noc); 1253 1254 PetscFunctionBegin; 1255 if (!m || !n) PetscFunctionReturn(0); /* no values to insert */ 1256 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 1257 PetscValidType(mat,1); 1258 PetscValidIntPointer(idxm,3); 1259 PetscValidIntPointer(idxn,5); 1260 PetscValidScalarPointer(v,6); 1261 1262 if (m > 128) SETERRQ1(PETSC_ERR_SUP,"Can only set 128 rows at a time; trying to set %D",m); 1263 if (n > 128) SETERRQ1(PETSC_ERR_SUP,"Can only set 256 columns at a time; trying to set %D",n); 1264 1265 for (i=0; i<m; i++) { 1266 for (j=0; j<3-sdim; j++) dxm++; 1267 tmp = *dxm++ - starts[0]; 1268 for (j=0; j<sdim-1; j++) { 1269 if ((*dxm++ - starts[j+1]) < 0 || tmp < 0) tmp = PETSC_MIN_INT; 1270 else tmp = tmp*dims[j] + *(dxm-1) - starts[j+1]; 1271 } 1272 dxm++; 1273 jdxm[i] = tmp; 1274 } 1275 for (i=0; i<n; i++) { 1276 for (j=0; j<3-sdim; j++) dxn++; 1277 tmp = *dxn++ - starts[0]; 1278 for (j=0; j<sdim-1; j++) { 1279 if ((*dxn++ - starts[j+1]) < 0 || tmp < 0) tmp = PETSC_MIN_INT; 1280 else tmp = tmp*dims[j] + *(dxn-1) - starts[j+1]; 1281 } 1282 dxn++; 1283 jdxn[i] = tmp; 1284 } 1285 ierr = MatSetValuesBlockedLocal(mat,m,jdxm,n,jdxn,v,addv);CHKERRQ(ierr); 1286 PetscFunctionReturn(0); 1287 } 1288 1289 #undef __FUNCT__ 1290 #define __FUNCT__ "MatSetStencil" 1291 /*@ 1292 MatSetStencil - Sets the grid information for setting values into a matrix via 1293 MatSetValuesStencil() 1294 1295 Not Collective 1296 1297 Input Parameters: 1298 + mat - the matrix 1299 . dim - dimension of the grid 1, 2, or 3 1300 . dims - number of grid points in x, y, and z direction, including ghost points on your processor 1301 . starts - starting point of ghost nodes on your processor in x, y, and z direction 1302 - dof - number of degrees of freedom per node 1303 1304 1305 Inspired by the structured grid interface to the HYPRE package 1306 (www.llnl.gov/CASC/hyper) 1307 1308 For matrices generated with DAGetMatrix() this routine is automatically called and so not needed by the 1309 user. 1310 1311 Level: beginner 1312 1313 Concepts: matrices^putting entries in 1314 1315 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal() 1316 MatSetValues(), MatSetValuesBlockedStencil(), MatSetValuesStencil() 1317 @*/ 1318 PetscErrorCode PETSCMAT_DLLEXPORT MatSetStencil(Mat mat,PetscInt dim,const PetscInt dims[],const PetscInt starts[],PetscInt dof) 1319 { 1320 PetscInt i; 1321 1322 PetscFunctionBegin; 1323 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 1324 PetscValidIntPointer(dims,3); 1325 PetscValidIntPointer(starts,4); 1326 1327 mat->stencil.dim = dim + (dof > 1); 1328 for (i=0; i<dim; i++) { 1329 mat->stencil.dims[i] = dims[dim-i-1]; /* copy the values in backwards */ 1330 mat->stencil.starts[i] = starts[dim-i-1]; 1331 } 1332 mat->stencil.dims[dim] = dof; 1333 mat->stencil.starts[dim] = 0; 1334 mat->stencil.noc = (PetscTruth)(dof == 1); 1335 PetscFunctionReturn(0); 1336 } 1337 1338 #undef __FUNCT__ 1339 #define __FUNCT__ "MatSetValuesBlocked" 1340 /*@ 1341 MatSetValuesBlocked - Inserts or adds a block of values into a matrix. 1342 1343 Not Collective 1344 1345 Input Parameters: 1346 + mat - the matrix 1347 . v - a logically two-dimensional array of values 1348 . m, idxm - the number of block rows and their global block indices 1349 . n, idxn - the number of block columns and their global block indices 1350 - addv - either ADD_VALUES or INSERT_VALUES, where 1351 ADD_VALUES adds values to any existing entries, and 1352 INSERT_VALUES replaces existing entries with new values 1353 1354 Notes: 1355 The m and n count the NUMBER of blocks in the row direction and column direction, 1356 NOT the total number of rows/columns; for example, if the block size is 2 and 1357 you are passing in values for rows 2,3,4,5 then m would be 2 (not 4). 1358 The values in idxm would be 1 2; that is the first index for each block divided by 1359 the block size. 1360 1361 Note that you must call MatSetBlockSize() when constructing this matrix (and before 1362 preallocating it). 1363 1364 By default the values, v, are row-oriented and unsorted. So the layout of 1365 v is the same as for MatSetValues(). See MatSetOption() for other options. 1366 1367 Calls to MatSetValuesBlocked() with the INSERT_VALUES and ADD_VALUES 1368 options cannot be mixed without intervening calls to the assembly 1369 routines. 1370 1371 MatSetValuesBlocked() uses 0-based row and column numbers in Fortran 1372 as well as in C. 1373 1374 Negative indices may be passed in idxm and idxn, these rows and columns are 1375 simply ignored. This allows easily inserting element stiffness matrices 1376 with homogeneous Dirchlet boundary conditions that you don't want represented 1377 in the matrix. 1378 1379 Each time an entry is set within a sparse matrix via MatSetValues(), 1380 internal searching must be done to determine where to place the the 1381 data in the matrix storage space. By instead inserting blocks of 1382 entries via MatSetValuesBlocked(), the overhead of matrix assembly is 1383 reduced. 1384 1385 Example: 1386 $ Suppose m=n=2 and block size(bs) = 2 The array is 1387 $ 1388 $ 1 2 | 3 4 1389 $ 5 6 | 7 8 1390 $ - - - | - - - 1391 $ 9 10 | 11 12 1392 $ 13 14 | 15 16 1393 $ 1394 $ v[] should be passed in like 1395 $ v[] = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] 1396 $ 1397 $ If you are not using row oriented storage of v (that is you called MatSetOption(mat,MAT_ROW_ORIENTED,PETSC_FALSE)) then 1398 $ v[] = [1,5,9,13,2,6,10,14,3,7,11,15,4,8,12,16] 1399 1400 Level: intermediate 1401 1402 Concepts: matrices^putting entries in blocked 1403 1404 .seealso: MatSetBlockSize(), MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValues(), MatSetValuesBlockedLocal() 1405 @*/ 1406 PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesBlocked(Mat mat,PetscInt m,const PetscInt idxm[],PetscInt n,const PetscInt idxn[],const PetscScalar v[],InsertMode addv) 1407 { 1408 PetscErrorCode ierr; 1409 1410 PetscFunctionBegin; 1411 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 1412 PetscValidType(mat,1); 1413 if (!m || !n) PetscFunctionReturn(0); /* no values to insert */ 1414 PetscValidIntPointer(idxm,3); 1415 PetscValidIntPointer(idxn,5); 1416 PetscValidScalarPointer(v,6); 1417 ierr = MatPreallocated(mat);CHKERRQ(ierr); 1418 if (mat->insertmode == NOT_SET_VALUES) { 1419 mat->insertmode = addv; 1420 } 1421 #if defined(PETSC_USE_DEBUG) 1422 else if (mat->insertmode != addv) { 1423 SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Cannot mix add values and insert values"); 1424 } 1425 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1426 #endif 1427 1428 if (mat->assembled) { 1429 mat->was_assembled = PETSC_TRUE; 1430 mat->assembled = PETSC_FALSE; 1431 } 1432 ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 1433 if (mat->ops->setvaluesblocked) { 1434 ierr = (*mat->ops->setvaluesblocked)(mat,m,idxm,n,idxn,v,addv);CHKERRQ(ierr); 1435 } else { 1436 PetscInt buf[4096],*ibufm=0,*ibufn=0; 1437 PetscInt i,j,*iidxm,*iidxn,bs=mat->rmap->bs; 1438 if ((m+n)*bs <= 4096) { 1439 iidxm = buf; iidxn = buf + m*bs; 1440 } else { 1441 ierr = PetscMalloc2(m*bs,PetscInt,&ibufm,n*bs,PetscInt,&ibufn);CHKERRQ(ierr); 1442 iidxm = ibufm; iidxn = ibufn; 1443 } 1444 for (i=0; i<m; i++) { 1445 for (j=0; j<bs; j++) { 1446 iidxm[i*bs+j] = bs*idxm[i] + j; 1447 } 1448 } 1449 for (i=0; i<n; i++) { 1450 for (j=0; j<bs; j++) { 1451 iidxn[i*bs+j] = bs*idxn[i] + j; 1452 } 1453 } 1454 ierr = MatSetValues(mat,bs*m,iidxm,bs*n,iidxn,v,addv);CHKERRQ(ierr); 1455 ierr = PetscFree2(ibufm,ibufn);CHKERRQ(ierr); 1456 } 1457 ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 1458 PetscFunctionReturn(0); 1459 } 1460 1461 #undef __FUNCT__ 1462 #define __FUNCT__ "MatGetValues" 1463 /*@ 1464 MatGetValues - Gets a block of values from a matrix. 1465 1466 Not Collective; currently only returns a local block 1467 1468 Input Parameters: 1469 + mat - the matrix 1470 . v - a logically two-dimensional array for storing the values 1471 . m, idxm - the number of rows and their global indices 1472 - n, idxn - the number of columns and their global indices 1473 1474 Notes: 1475 The user must allocate space (m*n PetscScalars) for the values, v. 1476 The values, v, are then returned in a row-oriented format, 1477 analogous to that used by default in MatSetValues(). 1478 1479 MatGetValues() uses 0-based row and column numbers in 1480 Fortran as well as in C. 1481 1482 MatGetValues() requires that the matrix has been assembled 1483 with MatAssemblyBegin()/MatAssemblyEnd(). Thus, calls to 1484 MatSetValues() and MatGetValues() CANNOT be made in succession 1485 without intermediate matrix assembly. 1486 1487 Negative row or column indices will be ignored and those locations in v[] will be 1488 left unchanged. 1489 1490 Level: advanced 1491 1492 Concepts: matrices^accessing values 1493 1494 .seealso: MatGetRow(), MatGetSubMatrices(), MatSetValues() 1495 @*/ 1496 PetscErrorCode PETSCMAT_DLLEXPORT MatGetValues(Mat mat,PetscInt m,const PetscInt idxm[],PetscInt n,const PetscInt idxn[],PetscScalar v[]) 1497 { 1498 PetscErrorCode ierr; 1499 1500 PetscFunctionBegin; 1501 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 1502 PetscValidType(mat,1); 1503 PetscValidIntPointer(idxm,3); 1504 PetscValidIntPointer(idxn,5); 1505 PetscValidScalarPointer(v,6); 1506 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1507 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1508 if (!mat->ops->getvalues) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 1509 ierr = MatPreallocated(mat);CHKERRQ(ierr); 1510 1511 ierr = PetscLogEventBegin(MAT_GetValues,mat,0,0,0);CHKERRQ(ierr); 1512 ierr = (*mat->ops->getvalues)(mat,m,idxm,n,idxn,v);CHKERRQ(ierr); 1513 ierr = PetscLogEventEnd(MAT_GetValues,mat,0,0,0);CHKERRQ(ierr); 1514 PetscFunctionReturn(0); 1515 } 1516 1517 #undef __FUNCT__ 1518 #define __FUNCT__ "MatSetLocalToGlobalMapping" 1519 /*@ 1520 MatSetLocalToGlobalMapping - Sets a local-to-global numbering for use by 1521 the routine MatSetValuesLocal() to allow users to insert matrix entries 1522 using a local (per-processor) numbering. 1523 1524 Not Collective 1525 1526 Input Parameters: 1527 + x - the matrix 1528 - mapping - mapping created with ISLocalToGlobalMappingCreate() 1529 or ISLocalToGlobalMappingCreateIS() 1530 1531 Level: intermediate 1532 1533 Concepts: matrices^local to global mapping 1534 Concepts: local to global mapping^for matrices 1535 1536 .seealso: MatAssemblyBegin(), MatAssemblyEnd(), MatSetValues(), MatSetValuesLocal() 1537 @*/ 1538 PetscErrorCode PETSCMAT_DLLEXPORT MatSetLocalToGlobalMapping(Mat x,ISLocalToGlobalMapping mapping) 1539 { 1540 PetscErrorCode ierr; 1541 PetscFunctionBegin; 1542 PetscValidHeaderSpecific(x,MAT_COOKIE,1); 1543 PetscValidType(x,1); 1544 PetscValidHeaderSpecific(mapping,IS_LTOGM_COOKIE,2); 1545 if (x->mapping) { 1546 SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Mapping already set for matrix"); 1547 } 1548 ierr = MatPreallocated(x);CHKERRQ(ierr); 1549 1550 if (x->ops->setlocaltoglobalmapping) { 1551 ierr = (*x->ops->setlocaltoglobalmapping)(x,mapping);CHKERRQ(ierr); 1552 } else { 1553 ierr = PetscObjectReference((PetscObject)mapping);CHKERRQ(ierr); 1554 if (x->mapping) { ierr = ISLocalToGlobalMappingDestroy(x->mapping);CHKERRQ(ierr); } 1555 x->mapping = mapping; 1556 } 1557 PetscFunctionReturn(0); 1558 } 1559 1560 #undef __FUNCT__ 1561 #define __FUNCT__ "MatSetLocalToGlobalMappingBlock" 1562 /*@ 1563 MatSetLocalToGlobalMappingBlock - Sets a local-to-global numbering for use 1564 by the routine MatSetValuesBlockedLocal() to allow users to insert matrix 1565 entries using a local (per-processor) numbering. 1566 1567 Not Collective 1568 1569 Input Parameters: 1570 + x - the matrix 1571 - mapping - mapping created with ISLocalToGlobalMappingCreate() or 1572 ISLocalToGlobalMappingCreateIS() 1573 1574 Level: intermediate 1575 1576 Concepts: matrices^local to global mapping blocked 1577 Concepts: local to global mapping^for matrices, blocked 1578 1579 .seealso: MatAssemblyBegin(), MatAssemblyEnd(), MatSetValues(), MatSetValuesBlockedLocal(), 1580 MatSetValuesBlocked(), MatSetValuesLocal() 1581 @*/ 1582 PetscErrorCode PETSCMAT_DLLEXPORT MatSetLocalToGlobalMappingBlock(Mat x,ISLocalToGlobalMapping mapping) 1583 { 1584 PetscErrorCode ierr; 1585 PetscFunctionBegin; 1586 PetscValidHeaderSpecific(x,MAT_COOKIE,1); 1587 PetscValidType(x,1); 1588 PetscValidHeaderSpecific(mapping,IS_LTOGM_COOKIE,2); 1589 if (x->bmapping) { 1590 SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Mapping already set for matrix"); 1591 } 1592 ierr = PetscObjectReference((PetscObject)mapping);CHKERRQ(ierr); 1593 if (x->bmapping) { ierr = ISLocalToGlobalMappingDestroy(x->bmapping);CHKERRQ(ierr); } 1594 x->bmapping = mapping; 1595 PetscFunctionReturn(0); 1596 } 1597 1598 #undef __FUNCT__ 1599 #define __FUNCT__ "MatSetValuesLocal" 1600 /*@ 1601 MatSetValuesLocal - Inserts or adds values into certain locations of a matrix, 1602 using a local ordering of the nodes. 1603 1604 Not Collective 1605 1606 Input Parameters: 1607 + x - the matrix 1608 . nrow, irow - number of rows and their local indices 1609 . ncol, icol - number of columns and their local indices 1610 . y - a logically two-dimensional array of values 1611 - addv - either INSERT_VALUES or ADD_VALUES, where 1612 ADD_VALUES adds values to any existing entries, and 1613 INSERT_VALUES replaces existing entries with new values 1614 1615 Notes: 1616 Before calling MatSetValuesLocal(), the user must first set the 1617 local-to-global mapping by calling MatSetLocalToGlobalMapping(). 1618 1619 Calls to MatSetValuesLocal() with the INSERT_VALUES and ADD_VALUES 1620 options cannot be mixed without intervening calls to the assembly 1621 routines. 1622 1623 These values may be cached, so MatAssemblyBegin() and MatAssemblyEnd() 1624 MUST be called after all calls to MatSetValuesLocal() have been completed. 1625 1626 Level: intermediate 1627 1628 Concepts: matrices^putting entries in with local numbering 1629 1630 .seealso: MatAssemblyBegin(), MatAssemblyEnd(), MatSetValues(), MatSetLocalToGlobalMapping(), 1631 MatSetValueLocal() 1632 @*/ 1633 PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesLocal(Mat mat,PetscInt nrow,const PetscInt irow[],PetscInt ncol,const PetscInt icol[],const PetscScalar y[],InsertMode addv) 1634 { 1635 PetscErrorCode ierr; 1636 PetscInt irowm[2048],icolm[2048]; 1637 1638 PetscFunctionBegin; 1639 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 1640 PetscValidType(mat,1); 1641 if (!nrow || !ncol) PetscFunctionReturn(0); /* no values to insert */ 1642 PetscValidIntPointer(irow,3); 1643 PetscValidIntPointer(icol,5); 1644 PetscValidScalarPointer(y,6); 1645 ierr = MatPreallocated(mat);CHKERRQ(ierr); 1646 if (mat->insertmode == NOT_SET_VALUES) { 1647 mat->insertmode = addv; 1648 } 1649 #if defined(PETSC_USE_DEBUG) 1650 else if (mat->insertmode != addv) { 1651 SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Cannot mix add values and insert values"); 1652 } 1653 if (!mat->ops->setvalueslocal && (nrow > 2048 || ncol > 2048)) { 1654 SETERRQ2(PETSC_ERR_SUP,"Number column/row indices must be <= 2048: are %D %D",nrow,ncol); 1655 } 1656 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1657 #endif 1658 1659 if (mat->assembled) { 1660 mat->was_assembled = PETSC_TRUE; 1661 mat->assembled = PETSC_FALSE; 1662 } 1663 ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 1664 if (!mat->ops->setvalueslocal) { 1665 ierr = ISLocalToGlobalMappingApply(mat->mapping,nrow,irow,irowm);CHKERRQ(ierr); 1666 ierr = ISLocalToGlobalMappingApply(mat->mapping,ncol,icol,icolm);CHKERRQ(ierr); 1667 ierr = (*mat->ops->setvalues)(mat,nrow,irowm,ncol,icolm,y,addv);CHKERRQ(ierr); 1668 } else { 1669 ierr = (*mat->ops->setvalueslocal)(mat,nrow,irow,ncol,icol,y,addv);CHKERRQ(ierr); 1670 } 1671 mat->same_nonzero = PETSC_FALSE; 1672 ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 1673 PetscFunctionReturn(0); 1674 } 1675 1676 #undef __FUNCT__ 1677 #define __FUNCT__ "MatSetValuesBlockedLocal" 1678 /*@ 1679 MatSetValuesBlockedLocal - Inserts or adds values into certain locations of a matrix, 1680 using a local ordering of the nodes a block at a time. 1681 1682 Not Collective 1683 1684 Input Parameters: 1685 + x - the matrix 1686 . nrow, irow - number of rows and their local indices 1687 . ncol, icol - number of columns and their local indices 1688 . y - a logically two-dimensional array of values 1689 - addv - either INSERT_VALUES or ADD_VALUES, where 1690 ADD_VALUES adds values to any existing entries, and 1691 INSERT_VALUES replaces existing entries with new values 1692 1693 Notes: 1694 Before calling MatSetValuesBlockedLocal(), the user must first set the 1695 block size using MatSetBlockSize(), and the local-to-global mapping by 1696 calling MatSetLocalToGlobalMappingBlock(), where the mapping MUST be 1697 set for matrix blocks, not for matrix elements. 1698 1699 Calls to MatSetValuesBlockedLocal() with the INSERT_VALUES and ADD_VALUES 1700 options cannot be mixed without intervening calls to the assembly 1701 routines. 1702 1703 These values may be cached, so MatAssemblyBegin() and MatAssemblyEnd() 1704 MUST be called after all calls to MatSetValuesBlockedLocal() have been completed. 1705 1706 Level: intermediate 1707 1708 Concepts: matrices^putting blocked values in with local numbering 1709 1710 .seealso: MatSetBlockSize(), MatSetLocalToGlobalMappingBlock(), MatAssemblyBegin(), MatAssemblyEnd(), 1711 MatSetValuesLocal(), MatSetLocalToGlobalMappingBlock(), MatSetValuesBlocked() 1712 @*/ 1713 PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesBlockedLocal(Mat mat,PetscInt nrow,const PetscInt irow[],PetscInt ncol,const PetscInt icol[],const PetscScalar y[],InsertMode addv) 1714 { 1715 PetscErrorCode ierr; 1716 PetscInt irowm[2048],icolm[2048]; 1717 1718 PetscFunctionBegin; 1719 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 1720 PetscValidType(mat,1); 1721 if (!nrow || !ncol) PetscFunctionReturn(0); /* no values to insert */ 1722 PetscValidIntPointer(irow,3); 1723 PetscValidIntPointer(icol,5); 1724 PetscValidScalarPointer(y,6); 1725 ierr = MatPreallocated(mat);CHKERRQ(ierr); 1726 if (mat->insertmode == NOT_SET_VALUES) { 1727 mat->insertmode = addv; 1728 } 1729 #if defined(PETSC_USE_DEBUG) 1730 else if (mat->insertmode != addv) { 1731 SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Cannot mix add values and insert values"); 1732 } 1733 if (!mat->bmapping) { 1734 SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Local to global never set with MatSetLocalToGlobalMappingBlock()"); 1735 } 1736 if (nrow > 2048 || ncol > 2048) { 1737 SETERRQ2(PETSC_ERR_SUP,"Number column/row indices must be <= 2048: are %D %D",nrow,ncol); 1738 } 1739 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1740 #endif 1741 1742 if (mat->assembled) { 1743 mat->was_assembled = PETSC_TRUE; 1744 mat->assembled = PETSC_FALSE; 1745 } 1746 ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 1747 ierr = ISLocalToGlobalMappingApply(mat->bmapping,nrow,irow,irowm);CHKERRQ(ierr); 1748 ierr = ISLocalToGlobalMappingApply(mat->bmapping,ncol,icol,icolm);CHKERRQ(ierr); 1749 if (mat->ops->setvaluesblocked) { 1750 ierr = (*mat->ops->setvaluesblocked)(mat,nrow,irowm,ncol,icolm,y,addv);CHKERRQ(ierr); 1751 } else { 1752 PetscInt buf[4096],*ibufm=0,*ibufn=0; 1753 PetscInt i,j,*iirowm,*iicolm,bs=mat->rmap->bs; 1754 if ((nrow+ncol)*bs <= 4096) { 1755 iirowm = buf; iicolm = buf + nrow*bs; 1756 } else { 1757 ierr = PetscMalloc2(nrow*bs,PetscInt,&ibufm,ncol*bs,PetscInt,&ibufn);CHKERRQ(ierr); 1758 iirowm = ibufm; iicolm = ibufn; 1759 } 1760 for (i=0; i<nrow; i++) { 1761 for (j=0; j<bs; j++) { 1762 iirowm[i*bs+j] = bs*irowm[i] + j; 1763 } 1764 } 1765 for (i=0; i<ncol; i++) { 1766 for (j=0; j<bs; j++) { 1767 iicolm[i*bs+j] = bs*icolm[i] + j; 1768 } 1769 } 1770 ierr = MatSetValues(mat,bs*nrow,iirowm,bs*ncol,iicolm,y,addv);CHKERRQ(ierr); 1771 ierr = PetscFree2(ibufm,ibufn);CHKERRQ(ierr); 1772 } 1773 ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 1774 PetscFunctionReturn(0); 1775 } 1776 1777 #undef __FUNCT__ 1778 #define __FUNCT__ "MatMultDiagonalBlock" 1779 /*@ 1780 MatMultDiagonalBlock - Computes the matrix-vector product, y = Dx. Where D is defined by the inode or block structure of the diagonal 1781 1782 Collective on Mat and Vec 1783 1784 Input Parameters: 1785 + mat - the matrix 1786 - x - the vector to be multiplied 1787 1788 Output Parameters: 1789 . y - the result 1790 1791 Notes: 1792 The vectors x and y cannot be the same. I.e., one cannot 1793 call MatMult(A,y,y). 1794 1795 Level: developer 1796 1797 Concepts: matrix-vector product 1798 1799 .seealso: MatMultTranspose(), MatMultAdd(), MatMultTransposeAdd() 1800 @*/ 1801 PetscErrorCode PETSCMAT_DLLEXPORT MatMultDiagonalBlock(Mat mat,Vec x,Vec y) 1802 { 1803 PetscErrorCode ierr; 1804 1805 PetscFunctionBegin; 1806 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 1807 PetscValidType(mat,1); 1808 PetscValidHeaderSpecific(x,VEC_COOKIE,2); 1809 PetscValidHeaderSpecific(y,VEC_COOKIE,3); 1810 1811 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1812 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1813 if (x == y) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"x and y must be different vectors"); 1814 ierr = MatPreallocated(mat);CHKERRQ(ierr); 1815 1816 if (!mat->ops->multdiagonalblock) SETERRQ(PETSC_ERR_SUP,"This matrix type does not have a multiply defined"); 1817 ierr = (*mat->ops->multdiagonalblock)(mat,x,y);CHKERRQ(ierr); 1818 ierr = PetscObjectStateIncrease((PetscObject)y);CHKERRQ(ierr); 1819 PetscFunctionReturn(0); 1820 } 1821 1822 /* --------------------------------------------------------*/ 1823 #undef __FUNCT__ 1824 #define __FUNCT__ "MatMult" 1825 /*@ 1826 MatMult - Computes the matrix-vector product, y = Ax. 1827 1828 Collective on Mat and Vec 1829 1830 Input Parameters: 1831 + mat - the matrix 1832 - x - the vector to be multiplied 1833 1834 Output Parameters: 1835 . y - the result 1836 1837 Notes: 1838 The vectors x and y cannot be the same. I.e., one cannot 1839 call MatMult(A,y,y). 1840 1841 Level: beginner 1842 1843 Concepts: matrix-vector product 1844 1845 .seealso: MatMultTranspose(), MatMultAdd(), MatMultTransposeAdd() 1846 @*/ 1847 PetscErrorCode PETSCMAT_DLLEXPORT MatMult(Mat mat,Vec x,Vec y) 1848 { 1849 PetscErrorCode ierr; 1850 1851 PetscFunctionBegin; 1852 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 1853 PetscValidType(mat,1); 1854 PetscValidHeaderSpecific(x,VEC_COOKIE,2); 1855 PetscValidHeaderSpecific(y,VEC_COOKIE,3); 1856 1857 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1858 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1859 if (x == y) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"x and y must be different vectors"); 1860 #ifndef PETSC_HAVE_CONSTRAINTS 1861 if (mat->cmap->N != x->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %D %D",mat->cmap->N,x->map->N); 1862 if (mat->rmap->N != y->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %D %D",mat->rmap->N,y->map->N); 1863 if (mat->rmap->n != y->map->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: local dim %D %D",mat->rmap->n,y->map->n); 1864 #endif 1865 ierr = MatPreallocated(mat);CHKERRQ(ierr); 1866 1867 if (mat->nullsp) { 1868 ierr = MatNullSpaceRemove(mat->nullsp,x,&x);CHKERRQ(ierr); 1869 } 1870 1871 if (!mat->ops->mult) SETERRQ(PETSC_ERR_SUP,"This matrix type does not have a multiply defined"); 1872 ierr = PetscLogEventBegin(MAT_Mult,mat,x,y,0);CHKERRQ(ierr); 1873 ierr = (*mat->ops->mult)(mat,x,y);CHKERRQ(ierr); 1874 ierr = PetscLogEventEnd(MAT_Mult,mat,x,y,0);CHKERRQ(ierr); 1875 1876 if (mat->nullsp) { 1877 ierr = MatNullSpaceRemove(mat->nullsp,y,PETSC_NULL);CHKERRQ(ierr); 1878 } 1879 ierr = PetscObjectStateIncrease((PetscObject)y);CHKERRQ(ierr); 1880 PetscFunctionReturn(0); 1881 } 1882 1883 #undef __FUNCT__ 1884 #define __FUNCT__ "MatMultTranspose" 1885 /*@ 1886 MatMultTranspose - Computes matrix transpose times a vector. 1887 1888 Collective on Mat and Vec 1889 1890 Input Parameters: 1891 + mat - the matrix 1892 - x - the vector to be multilplied 1893 1894 Output Parameters: 1895 . y - the result 1896 1897 Notes: 1898 The vectors x and y cannot be the same. I.e., one cannot 1899 call MatMultTranspose(A,y,y). 1900 1901 Level: beginner 1902 1903 Concepts: matrix vector product^transpose 1904 1905 .seealso: MatMult(), MatMultAdd(), MatMultTransposeAdd() 1906 @*/ 1907 PetscErrorCode PETSCMAT_DLLEXPORT MatMultTranspose(Mat mat,Vec x,Vec y) 1908 { 1909 PetscErrorCode ierr; 1910 1911 PetscFunctionBegin; 1912 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 1913 PetscValidType(mat,1); 1914 PetscValidHeaderSpecific(x,VEC_COOKIE,2); 1915 PetscValidHeaderSpecific(y,VEC_COOKIE,3); 1916 1917 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1918 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1919 if (x == y) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"x and y must be different vectors"); 1920 #ifndef PETSC_HAVE_CONSTRAINTS 1921 if (mat->rmap->N != x->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %D %D",mat->rmap->N,x->map->N); 1922 if (mat->cmap->N != y->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %D %D",mat->cmap->N,y->map->N); 1923 #endif 1924 ierr = MatPreallocated(mat);CHKERRQ(ierr); 1925 1926 if (!mat->ops->multtranspose) SETERRQ(PETSC_ERR_SUP,"This matrix type does not have a multiply tranpose defined"); 1927 ierr = PetscLogEventBegin(MAT_MultTranspose,mat,x,y,0);CHKERRQ(ierr); 1928 ierr = (*mat->ops->multtranspose)(mat,x,y);CHKERRQ(ierr); 1929 ierr = PetscLogEventEnd(MAT_MultTranspose,mat,x,y,0);CHKERRQ(ierr); 1930 ierr = PetscObjectStateIncrease((PetscObject)y);CHKERRQ(ierr); 1931 PetscFunctionReturn(0); 1932 } 1933 1934 #undef __FUNCT__ 1935 #define __FUNCT__ "MatMultAdd" 1936 /*@ 1937 MatMultAdd - Computes v3 = v2 + A * v1. 1938 1939 Collective on Mat and Vec 1940 1941 Input Parameters: 1942 + mat - the matrix 1943 - v1, v2 - the vectors 1944 1945 Output Parameters: 1946 . v3 - the result 1947 1948 Notes: 1949 The vectors v1 and v3 cannot be the same. I.e., one cannot 1950 call MatMultAdd(A,v1,v2,v1). 1951 1952 Level: beginner 1953 1954 Concepts: matrix vector product^addition 1955 1956 .seealso: MatMultTranspose(), MatMult(), MatMultTransposeAdd() 1957 @*/ 1958 PetscErrorCode PETSCMAT_DLLEXPORT MatMultAdd(Mat mat,Vec v1,Vec v2,Vec v3) 1959 { 1960 PetscErrorCode ierr; 1961 1962 PetscFunctionBegin; 1963 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 1964 PetscValidType(mat,1); 1965 PetscValidHeaderSpecific(v1,VEC_COOKIE,2); 1966 PetscValidHeaderSpecific(v2,VEC_COOKIE,3); 1967 PetscValidHeaderSpecific(v3,VEC_COOKIE,4); 1968 1969 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 1970 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1971 if (mat->cmap->N != v1->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v1: global dim %D %D",mat->cmap->N,v1->map->N); 1972 /* if (mat->rmap->N != v2->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v2: global dim %D %D",mat->rmap->N,v2->map->N); 1973 if (mat->rmap->N != v3->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v3: global dim %D %D",mat->rmap->N,v3->map->N); */ 1974 if (mat->rmap->n != v3->map->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v3: local dim %D %D",mat->rmap->n,v3->map->n); 1975 if (mat->rmap->n != v2->map->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v2: local dim %D %D",mat->rmap->n,v2->map->n); 1976 if (v1 == v3) SETERRQ(PETSC_ERR_ARG_IDN,"v1 and v3 must be different vectors"); 1977 ierr = MatPreallocated(mat);CHKERRQ(ierr); 1978 1979 ierr = PetscLogEventBegin(MAT_MultAdd,mat,v1,v2,v3);CHKERRQ(ierr); 1980 ierr = (*mat->ops->multadd)(mat,v1,v2,v3);CHKERRQ(ierr); 1981 ierr = PetscLogEventEnd(MAT_MultAdd,mat,v1,v2,v3);CHKERRQ(ierr); 1982 ierr = PetscObjectStateIncrease((PetscObject)v3);CHKERRQ(ierr); 1983 PetscFunctionReturn(0); 1984 } 1985 1986 #undef __FUNCT__ 1987 #define __FUNCT__ "MatMultTransposeAdd" 1988 /*@ 1989 MatMultTransposeAdd - Computes v3 = v2 + A' * v1. 1990 1991 Collective on Mat and Vec 1992 1993 Input Parameters: 1994 + mat - the matrix 1995 - v1, v2 - the vectors 1996 1997 Output Parameters: 1998 . v3 - the result 1999 2000 Notes: 2001 The vectors v1 and v3 cannot be the same. I.e., one cannot 2002 call MatMultTransposeAdd(A,v1,v2,v1). 2003 2004 Level: beginner 2005 2006 Concepts: matrix vector product^transpose and addition 2007 2008 .seealso: MatMultTranspose(), MatMultAdd(), MatMult() 2009 @*/ 2010 PetscErrorCode PETSCMAT_DLLEXPORT MatMultTransposeAdd(Mat mat,Vec v1,Vec v2,Vec v3) 2011 { 2012 PetscErrorCode ierr; 2013 2014 PetscFunctionBegin; 2015 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 2016 PetscValidType(mat,1); 2017 PetscValidHeaderSpecific(v1,VEC_COOKIE,2); 2018 PetscValidHeaderSpecific(v2,VEC_COOKIE,3); 2019 PetscValidHeaderSpecific(v3,VEC_COOKIE,4); 2020 2021 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2022 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2023 if (!mat->ops->multtransposeadd) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 2024 if (v1 == v3) SETERRQ(PETSC_ERR_ARG_IDN,"v1 and v3 must be different vectors"); 2025 if (mat->rmap->N != v1->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v1: global dim %D %D",mat->rmap->N,v1->map->N); 2026 if (mat->cmap->N != v2->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v2: global dim %D %D",mat->cmap->N,v2->map->N); 2027 if (mat->cmap->N != v3->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec v3: global dim %D %D",mat->cmap->N,v3->map->N); 2028 ierr = MatPreallocated(mat);CHKERRQ(ierr); 2029 2030 ierr = PetscLogEventBegin(MAT_MultTransposeAdd,mat,v1,v2,v3);CHKERRQ(ierr); 2031 ierr = (*mat->ops->multtransposeadd)(mat,v1,v2,v3);CHKERRQ(ierr); 2032 ierr = PetscLogEventEnd(MAT_MultTransposeAdd,mat,v1,v2,v3);CHKERRQ(ierr); 2033 ierr = PetscObjectStateIncrease((PetscObject)v3);CHKERRQ(ierr); 2034 PetscFunctionReturn(0); 2035 } 2036 2037 #undef __FUNCT__ 2038 #define __FUNCT__ "MatMultConstrained" 2039 /*@ 2040 MatMultConstrained - The inner multiplication routine for a 2041 constrained matrix P^T A P. 2042 2043 Collective on Mat and Vec 2044 2045 Input Parameters: 2046 + mat - the matrix 2047 - x - the vector to be multilplied 2048 2049 Output Parameters: 2050 . y - the result 2051 2052 Notes: 2053 The vectors x and y cannot be the same. I.e., one cannot 2054 call MatMult(A,y,y). 2055 2056 Level: beginner 2057 2058 .keywords: matrix, multiply, matrix-vector product, constraint 2059 .seealso: MatMult(), MatMultTranspose(), MatMultAdd(), MatMultTransposeAdd() 2060 @*/ 2061 PetscErrorCode PETSCMAT_DLLEXPORT MatMultConstrained(Mat mat,Vec x,Vec y) 2062 { 2063 PetscErrorCode ierr; 2064 2065 PetscFunctionBegin; 2066 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 2067 PetscValidHeaderSpecific(x,VEC_COOKIE,2); 2068 PetscValidHeaderSpecific(y,VEC_COOKIE,3); 2069 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2070 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2071 if (x == y) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"x and y must be different vectors"); 2072 if (mat->cmap->N != x->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %D %D",mat->cmap->N,x->map->N); 2073 if (mat->rmap->N != y->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %D %D",mat->rmap->N,y->map->N); 2074 if (mat->rmap->n != y->map->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: local dim %D %D",mat->rmap->n,y->map->n); 2075 2076 ierr = PetscLogEventBegin(MAT_MultConstrained,mat,x,y,0);CHKERRQ(ierr); 2077 ierr = (*mat->ops->multconstrained)(mat,x,y);CHKERRQ(ierr); 2078 ierr = PetscLogEventEnd(MAT_MultConstrained,mat,x,y,0);CHKERRQ(ierr); 2079 ierr = PetscObjectStateIncrease((PetscObject)y);CHKERRQ(ierr); 2080 2081 PetscFunctionReturn(0); 2082 } 2083 2084 #undef __FUNCT__ 2085 #define __FUNCT__ "MatMultTransposeConstrained" 2086 /*@ 2087 MatMultTransposeConstrained - The inner multiplication routine for a 2088 constrained matrix P^T A^T P. 2089 2090 Collective on Mat and Vec 2091 2092 Input Parameters: 2093 + mat - the matrix 2094 - x - the vector to be multilplied 2095 2096 Output Parameters: 2097 . y - the result 2098 2099 Notes: 2100 The vectors x and y cannot be the same. I.e., one cannot 2101 call MatMult(A,y,y). 2102 2103 Level: beginner 2104 2105 .keywords: matrix, multiply, matrix-vector product, constraint 2106 .seealso: MatMult(), MatMultTranspose(), MatMultAdd(), MatMultTransposeAdd() 2107 @*/ 2108 PetscErrorCode PETSCMAT_DLLEXPORT MatMultTransposeConstrained(Mat mat,Vec x,Vec y) 2109 { 2110 PetscErrorCode ierr; 2111 2112 PetscFunctionBegin; 2113 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 2114 PetscValidHeaderSpecific(x,VEC_COOKIE,2); 2115 PetscValidHeaderSpecific(y,VEC_COOKIE,3); 2116 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2117 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2118 if (x == y) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"x and y must be different vectors"); 2119 if (mat->rmap->N != x->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %D %D",mat->cmap->N,x->map->N); 2120 if (mat->cmap->N != y->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %D %D",mat->rmap->N,y->map->N); 2121 2122 ierr = PetscLogEventBegin(MAT_MultConstrained,mat,x,y,0);CHKERRQ(ierr); 2123 ierr = (*mat->ops->multtransposeconstrained)(mat,x,y);CHKERRQ(ierr); 2124 ierr = PetscLogEventEnd(MAT_MultConstrained,mat,x,y,0);CHKERRQ(ierr); 2125 ierr = PetscObjectStateIncrease((PetscObject)y);CHKERRQ(ierr); 2126 2127 PetscFunctionReturn(0); 2128 } 2129 /* ------------------------------------------------------------*/ 2130 #undef __FUNCT__ 2131 #define __FUNCT__ "MatGetInfo" 2132 /*@C 2133 MatGetInfo - Returns information about matrix storage (number of 2134 nonzeros, memory, etc.). 2135 2136 Collective on Mat if MAT_GLOBAL_MAX or MAT_GLOBAL_SUM is used 2137 as the flag 2138 2139 Input Parameters: 2140 . mat - the matrix 2141 2142 Output Parameters: 2143 + flag - flag indicating the type of parameters to be returned 2144 (MAT_LOCAL - local matrix, MAT_GLOBAL_MAX - maximum over all processors, 2145 MAT_GLOBAL_SUM - sum over all processors) 2146 - info - matrix information context 2147 2148 Notes: 2149 The MatInfo context contains a variety of matrix data, including 2150 number of nonzeros allocated and used, number of mallocs during 2151 matrix assembly, etc. Additional information for factored matrices 2152 is provided (such as the fill ratio, number of mallocs during 2153 factorization, etc.). Much of this info is printed to PETSC_STDOUT 2154 when using the runtime options 2155 $ -info -mat_view_info 2156 2157 Example for C/C++ Users: 2158 See the file ${PETSC_DIR}/include/petscmat.h for a complete list of 2159 data within the MatInfo context. For example, 2160 .vb 2161 MatInfo info; 2162 Mat A; 2163 double mal, nz_a, nz_u; 2164 2165 MatGetInfo(A,MAT_LOCAL,&info); 2166 mal = info.mallocs; 2167 nz_a = info.nz_allocated; 2168 .ve 2169 2170 Example for Fortran Users: 2171 Fortran users should declare info as a double precision 2172 array of dimension MAT_INFO_SIZE, and then extract the parameters 2173 of interest. See the file ${PETSC_DIR}/include/finclude/petscmat.h 2174 a complete list of parameter names. 2175 .vb 2176 double precision info(MAT_INFO_SIZE) 2177 double precision mal, nz_a 2178 Mat A 2179 integer ierr 2180 2181 call MatGetInfo(A,MAT_LOCAL,info,ierr) 2182 mal = info(MAT_INFO_MALLOCS) 2183 nz_a = info(MAT_INFO_NZ_ALLOCATED) 2184 .ve 2185 2186 Level: intermediate 2187 2188 Concepts: matrices^getting information on 2189 2190 Developer Note: fortran interface is not autogenerated as the f90 2191 interface defintion cannot be generated correctly [due to MatInfo] 2192 2193 @*/ 2194 PetscErrorCode PETSCMAT_DLLEXPORT MatGetInfo(Mat mat,MatInfoType flag,MatInfo *info) 2195 { 2196 PetscErrorCode ierr; 2197 2198 PetscFunctionBegin; 2199 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 2200 PetscValidType(mat,1); 2201 PetscValidPointer(info,3); 2202 if (!mat->ops->getinfo) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 2203 ierr = MatPreallocated(mat);CHKERRQ(ierr); 2204 ierr = (*mat->ops->getinfo)(mat,flag,info);CHKERRQ(ierr); 2205 PetscFunctionReturn(0); 2206 } 2207 2208 /* ----------------------------------------------------------*/ 2209 #undef __FUNCT__ 2210 #define __FUNCT__ "MatILUDTFactor" 2211 /*@C 2212 MatILUDTFactor - Performs a drop tolerance ILU factorization. 2213 2214 Collective on Mat 2215 2216 Input Parameters: 2217 + mat - the matrix 2218 . row - row permutation 2219 . col - column permutation 2220 - info - information about the factorization to be done 2221 2222 Output Parameters: 2223 . fact - the factored matrix 2224 2225 Level: developer 2226 2227 Notes: 2228 Most users should employ the simplified KSP interface for linear solvers 2229 instead of working directly with matrix algebra routines such as this. 2230 See, e.g., KSPCreate(). 2231 2232 Concepts: matrices^ILUDT factorization 2233 2234 .seealso: MatLUFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor(), MatFactorInfo 2235 @*/ 2236 PetscErrorCode PETSCMAT_DLLEXPORT MatILUDTFactor(Mat mat,IS row,IS col,const MatFactorInfo *info,Mat *fact) 2237 { 2238 PetscErrorCode ierr; 2239 2240 PetscFunctionBegin; 2241 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 2242 PetscValidType(mat,1); 2243 if (row) PetscValidHeaderSpecific(row,IS_COOKIE,2); 2244 if (col) PetscValidHeaderSpecific(col,IS_COOKIE,3); 2245 PetscValidPointer(info,4); 2246 PetscValidPointer(fact,5); 2247 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2248 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2249 if (!mat->ops->iludtfactor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 2250 if (mat->rmap->N != mat->cmap->N) SETERRQ(PETSC_ERR_ARG_WRONG,"matrix must be square"); 2251 ierr = MatPreallocated(mat);CHKERRQ(ierr); 2252 ierr = PetscLogEventBegin(MAT_ILUFactor,mat,row,col,0);CHKERRQ(ierr); 2253 ierr = (*mat->ops->iludtfactor)(mat,row,col,info,fact);CHKERRQ(ierr); 2254 ierr = PetscLogEventEnd(MAT_ILUFactor,mat,row,col,0);CHKERRQ(ierr); 2255 ierr = PetscObjectStateIncrease((PetscObject)*fact);CHKERRQ(ierr); 2256 2257 PetscFunctionReturn(0); 2258 } 2259 2260 #undef __FUNCT__ 2261 #define __FUNCT__ "MatLUFactor" 2262 /*@C 2263 MatLUFactor - Performs in-place LU factorization of matrix. 2264 2265 Collective on Mat 2266 2267 Input Parameters: 2268 + mat - the matrix 2269 . row - row permutation 2270 . col - column permutation 2271 - info - options for factorization, includes 2272 $ fill - expected fill as ratio of original fill. 2273 $ dtcol - pivot tolerance (0 no pivot, 1 full column pivoting) 2274 $ Run with the option -info to determine an optimal value to use 2275 2276 Notes: 2277 Most users should employ the simplified KSP interface for linear solvers 2278 instead of working directly with matrix algebra routines such as this. 2279 See, e.g., KSPCreate(). 2280 2281 This changes the state of the matrix to a factored matrix; it cannot be used 2282 for example with MatSetValues() unless one first calls MatSetUnfactored(). 2283 2284 Level: developer 2285 2286 Concepts: matrices^LU factorization 2287 2288 .seealso: MatLUFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor(), 2289 MatGetOrdering(), MatSetUnfactored(), MatFactorInfo 2290 2291 Developer Note: fortran interface is not autogenerated as the f90 2292 interface defintion cannot be generated correctly [due to MatFactorInfo] 2293 2294 @*/ 2295 PetscErrorCode PETSCMAT_DLLEXPORT MatLUFactor(Mat mat,IS row,IS col,const MatFactorInfo *info) 2296 { 2297 PetscErrorCode ierr; 2298 2299 PetscFunctionBegin; 2300 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 2301 if (row) PetscValidHeaderSpecific(row,IS_COOKIE,2); 2302 if (col) PetscValidHeaderSpecific(col,IS_COOKIE,3); 2303 PetscValidPointer(info,4); 2304 PetscValidType(mat,1); 2305 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2306 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2307 if (!mat->ops->lufactor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 2308 ierr = MatPreallocated(mat);CHKERRQ(ierr); 2309 2310 ierr = PetscLogEventBegin(MAT_LUFactor,mat,row,col,0);CHKERRQ(ierr); 2311 ierr = (*mat->ops->lufactor)(mat,row,col,info);CHKERRQ(ierr); 2312 ierr = PetscLogEventEnd(MAT_LUFactor,mat,row,col,0);CHKERRQ(ierr); 2313 ierr = PetscObjectStateIncrease((PetscObject)mat);CHKERRQ(ierr); 2314 PetscFunctionReturn(0); 2315 } 2316 2317 #undef __FUNCT__ 2318 #define __FUNCT__ "MatILUFactor" 2319 /*@C 2320 MatILUFactor - Performs in-place ILU factorization of matrix. 2321 2322 Collective on Mat 2323 2324 Input Parameters: 2325 + mat - the matrix 2326 . row - row permutation 2327 . col - column permutation 2328 - info - structure containing 2329 $ levels - number of levels of fill. 2330 $ expected fill - as ratio of original fill. 2331 $ 1 or 0 - indicating force fill on diagonal (improves robustness for matrices 2332 missing diagonal entries) 2333 2334 Notes: 2335 Probably really in-place only when level of fill is zero, otherwise allocates 2336 new space to store factored matrix and deletes previous memory. 2337 2338 Most users should employ the simplified KSP interface for linear solvers 2339 instead of working directly with matrix algebra routines such as this. 2340 See, e.g., KSPCreate(). 2341 2342 Level: developer 2343 2344 Concepts: matrices^ILU factorization 2345 2346 .seealso: MatILUFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor(), MatFactorInfo 2347 2348 Developer Note: fortran interface is not autogenerated as the f90 2349 interface defintion cannot be generated correctly [due to MatFactorInfo] 2350 2351 @*/ 2352 PetscErrorCode PETSCMAT_DLLEXPORT MatILUFactor(Mat mat,IS row,IS col,const MatFactorInfo *info) 2353 { 2354 PetscErrorCode ierr; 2355 2356 PetscFunctionBegin; 2357 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 2358 if (row) PetscValidHeaderSpecific(row,IS_COOKIE,2); 2359 if (col) PetscValidHeaderSpecific(col,IS_COOKIE,3); 2360 PetscValidPointer(info,4); 2361 PetscValidType(mat,1); 2362 if (mat->rmap->N != mat->cmap->N) SETERRQ(PETSC_ERR_ARG_WRONG,"matrix must be square"); 2363 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2364 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2365 if (!mat->ops->ilufactor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 2366 ierr = MatPreallocated(mat);CHKERRQ(ierr); 2367 2368 ierr = PetscLogEventBegin(MAT_ILUFactor,mat,row,col,0);CHKERRQ(ierr); 2369 ierr = (*mat->ops->ilufactor)(mat,row,col,info);CHKERRQ(ierr); 2370 ierr = PetscLogEventEnd(MAT_ILUFactor,mat,row,col,0);CHKERRQ(ierr); 2371 ierr = PetscObjectStateIncrease((PetscObject)mat);CHKERRQ(ierr); 2372 PetscFunctionReturn(0); 2373 } 2374 2375 #undef __FUNCT__ 2376 #define __FUNCT__ "MatLUFactorSymbolic" 2377 /*@C 2378 MatLUFactorSymbolic - Performs symbolic LU factorization of matrix. 2379 Call this routine before calling MatLUFactorNumeric(). 2380 2381 Collective on Mat 2382 2383 Input Parameters: 2384 + fact - the factor matrix obtained with MatGetFactor() 2385 . mat - the matrix 2386 . row, col - row and column permutations 2387 - info - options for factorization, includes 2388 $ fill - expected fill as ratio of original fill. 2389 $ dtcol - pivot tolerance (0 no pivot, 1 full column pivoting) 2390 $ Run with the option -info to determine an optimal value to use 2391 2392 2393 Notes: 2394 See the users manual for additional information about 2395 choosing the fill factor for better efficiency. 2396 2397 Most users should employ the simplified KSP interface for linear solvers 2398 instead of working directly with matrix algebra routines such as this. 2399 See, e.g., KSPCreate(). 2400 2401 Level: developer 2402 2403 Concepts: matrices^LU symbolic factorization 2404 2405 .seealso: MatLUFactor(), MatLUFactorNumeric(), MatCholeskyFactor(), MatFactorInfo 2406 2407 Developer Note: fortran interface is not autogenerated as the f90 2408 interface defintion cannot be generated correctly [due to MatFactorInfo] 2409 2410 @*/ 2411 PetscErrorCode PETSCMAT_DLLEXPORT MatLUFactorSymbolic(Mat fact,Mat mat,IS row,IS col,const MatFactorInfo *info) 2412 { 2413 PetscErrorCode ierr; 2414 2415 PetscFunctionBegin; 2416 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 2417 if (row) PetscValidHeaderSpecific(row,IS_COOKIE,2); 2418 if (col) PetscValidHeaderSpecific(col,IS_COOKIE,3); 2419 PetscValidPointer(info,4); 2420 PetscValidType(mat,1); 2421 PetscValidPointer(fact,5); 2422 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2423 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2424 if (!(fact)->ops->lufactorsymbolic) SETERRQ1(PETSC_ERR_SUP,"Matrix type %s symbolic LU",((PetscObject)mat)->type_name); 2425 ierr = MatPreallocated(mat);CHKERRQ(ierr); 2426 2427 ierr = PetscLogEventBegin(MAT_LUFactorSymbolic,mat,row,col,0);CHKERRQ(ierr); 2428 ierr = (fact->ops->lufactorsymbolic)(fact,mat,row,col,info);CHKERRQ(ierr); 2429 ierr = PetscLogEventEnd(MAT_LUFactorSymbolic,mat,row,col,0);CHKERRQ(ierr); 2430 ierr = PetscObjectStateIncrease((PetscObject)fact);CHKERRQ(ierr); 2431 PetscFunctionReturn(0); 2432 } 2433 2434 #undef __FUNCT__ 2435 #define __FUNCT__ "MatLUFactorNumeric" 2436 /*@C 2437 MatLUFactorNumeric - Performs numeric LU factorization of a matrix. 2438 Call this routine after first calling MatLUFactorSymbolic(). 2439 2440 Collective on Mat 2441 2442 Input Parameters: 2443 + fact - the factor matrix obtained with MatGetFactor() 2444 . mat - the matrix 2445 - info - options for factorization 2446 2447 Notes: 2448 See MatLUFactor() for in-place factorization. See 2449 MatCholeskyFactorNumeric() for the symmetric, positive definite case. 2450 2451 Most users should employ the simplified KSP interface for linear solvers 2452 instead of working directly with matrix algebra routines such as this. 2453 See, e.g., KSPCreate(). 2454 2455 Level: developer 2456 2457 Concepts: matrices^LU numeric factorization 2458 2459 .seealso: MatLUFactorSymbolic(), MatLUFactor(), MatCholeskyFactor() 2460 2461 Developer Note: fortran interface is not autogenerated as the f90 2462 interface defintion cannot be generated correctly [due to MatFactorInfo] 2463 2464 @*/ 2465 PetscErrorCode PETSCMAT_DLLEXPORT MatLUFactorNumeric(Mat fact,Mat mat,const MatFactorInfo *info) 2466 { 2467 PetscErrorCode ierr; 2468 2469 PetscFunctionBegin; 2470 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 2471 PetscValidType(mat,1); 2472 PetscValidPointer(fact,2); 2473 PetscValidHeaderSpecific(fact,MAT_COOKIE,2); 2474 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2475 if (mat->rmap->N != (fact)->rmap->N || mat->cmap->N != (fact)->cmap->N) { 2476 SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat mat,Mat fact: global dimensions are different %D should = %D %D should = %D",mat->rmap->N,(fact)->rmap->N,mat->cmap->N,(fact)->cmap->N); 2477 } 2478 if (!(fact)->ops->lufactornumeric) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 2479 ierr = MatPreallocated(mat);CHKERRQ(ierr); 2480 ierr = PetscLogEventBegin(MAT_LUFactorNumeric,mat,fact,0,0);CHKERRQ(ierr); 2481 ierr = (fact->ops->lufactornumeric)(fact,mat,info);CHKERRQ(ierr); 2482 ierr = PetscLogEventEnd(MAT_LUFactorNumeric,mat,fact,0,0);CHKERRQ(ierr); 2483 2484 ierr = MatView_Private(fact);CHKERRQ(ierr); 2485 ierr = PetscObjectStateIncrease((PetscObject)fact);CHKERRQ(ierr); 2486 PetscFunctionReturn(0); 2487 } 2488 2489 #undef __FUNCT__ 2490 #define __FUNCT__ "MatCholeskyFactor" 2491 /*@C 2492 MatCholeskyFactor - Performs in-place Cholesky factorization of a 2493 symmetric matrix. 2494 2495 Collective on Mat 2496 2497 Input Parameters: 2498 + mat - the matrix 2499 . perm - row and column permutations 2500 - f - expected fill as ratio of original fill 2501 2502 Notes: 2503 See MatLUFactor() for the nonsymmetric case. See also 2504 MatCholeskyFactorSymbolic(), and MatCholeskyFactorNumeric(). 2505 2506 Most users should employ the simplified KSP interface for linear solvers 2507 instead of working directly with matrix algebra routines such as this. 2508 See, e.g., KSPCreate(). 2509 2510 Level: developer 2511 2512 Concepts: matrices^Cholesky factorization 2513 2514 .seealso: MatLUFactor(), MatCholeskyFactorSymbolic(), MatCholeskyFactorNumeric() 2515 MatGetOrdering() 2516 2517 Developer Note: fortran interface is not autogenerated as the f90 2518 interface defintion cannot be generated correctly [due to MatFactorInfo] 2519 2520 @*/ 2521 PetscErrorCode PETSCMAT_DLLEXPORT MatCholeskyFactor(Mat mat,IS perm,const MatFactorInfo *info) 2522 { 2523 PetscErrorCode ierr; 2524 2525 PetscFunctionBegin; 2526 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 2527 PetscValidType(mat,1); 2528 PetscValidHeaderSpecific(perm,IS_COOKIE,2); 2529 PetscValidPointer(info,3); 2530 if (mat->rmap->N != mat->cmap->N) SETERRQ(PETSC_ERR_ARG_WRONG,"Matrix must be square"); 2531 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2532 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2533 if (!mat->ops->choleskyfactor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 2534 ierr = MatPreallocated(mat);CHKERRQ(ierr); 2535 2536 ierr = PetscLogEventBegin(MAT_CholeskyFactor,mat,perm,0,0);CHKERRQ(ierr); 2537 ierr = (*mat->ops->choleskyfactor)(mat,perm,info);CHKERRQ(ierr); 2538 ierr = PetscLogEventEnd(MAT_CholeskyFactor,mat,perm,0,0);CHKERRQ(ierr); 2539 ierr = PetscObjectStateIncrease((PetscObject)mat);CHKERRQ(ierr); 2540 PetscFunctionReturn(0); 2541 } 2542 2543 #undef __FUNCT__ 2544 #define __FUNCT__ "MatCholeskyFactorSymbolic" 2545 /*@C 2546 MatCholeskyFactorSymbolic - Performs symbolic Cholesky factorization 2547 of a symmetric matrix. 2548 2549 Collective on Mat 2550 2551 Input Parameters: 2552 + fact - the factor matrix obtained with MatGetFactor() 2553 . mat - the matrix 2554 . perm - row and column permutations 2555 - info - options for factorization, includes 2556 $ fill - expected fill as ratio of original fill. 2557 $ dtcol - pivot tolerance (0 no pivot, 1 full column pivoting) 2558 $ Run with the option -info to determine an optimal value to use 2559 2560 Notes: 2561 See MatLUFactorSymbolic() for the nonsymmetric case. See also 2562 MatCholeskyFactor() and MatCholeskyFactorNumeric(). 2563 2564 Most users should employ the simplified KSP interface for linear solvers 2565 instead of working directly with matrix algebra routines such as this. 2566 See, e.g., KSPCreate(). 2567 2568 Level: developer 2569 2570 Concepts: matrices^Cholesky symbolic factorization 2571 2572 .seealso: MatLUFactorSymbolic(), MatCholeskyFactor(), MatCholeskyFactorNumeric() 2573 MatGetOrdering() 2574 2575 Developer Note: fortran interface is not autogenerated as the f90 2576 interface defintion cannot be generated correctly [due to MatFactorInfo] 2577 2578 @*/ 2579 PetscErrorCode PETSCMAT_DLLEXPORT MatCholeskyFactorSymbolic(Mat fact,Mat mat,IS perm,const MatFactorInfo *info) 2580 { 2581 PetscErrorCode ierr; 2582 2583 PetscFunctionBegin; 2584 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 2585 PetscValidType(mat,1); 2586 if (perm) PetscValidHeaderSpecific(perm,IS_COOKIE,2); 2587 PetscValidPointer(info,3); 2588 PetscValidPointer(fact,4); 2589 if (mat->rmap->N != mat->cmap->N) SETERRQ(PETSC_ERR_ARG_WRONG,"Matrix must be square"); 2590 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2591 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2592 if (!(fact)->ops->choleskyfactorsymbolic) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 2593 ierr = MatPreallocated(mat);CHKERRQ(ierr); 2594 2595 ierr = PetscLogEventBegin(MAT_CholeskyFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr); 2596 ierr = (fact->ops->choleskyfactorsymbolic)(fact,mat,perm,info);CHKERRQ(ierr); 2597 ierr = PetscLogEventEnd(MAT_CholeskyFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr); 2598 ierr = PetscObjectStateIncrease((PetscObject)fact);CHKERRQ(ierr); 2599 PetscFunctionReturn(0); 2600 } 2601 2602 #undef __FUNCT__ 2603 #define __FUNCT__ "MatCholeskyFactorNumeric" 2604 /*@C 2605 MatCholeskyFactorNumeric - Performs numeric Cholesky factorization 2606 of a symmetric matrix. Call this routine after first calling 2607 MatCholeskyFactorSymbolic(). 2608 2609 Collective on Mat 2610 2611 Input Parameters: 2612 + fact - the factor matrix obtained with MatGetFactor() 2613 . mat - the initial matrix 2614 . info - options for factorization 2615 - fact - the symbolic factor of mat 2616 2617 2618 Notes: 2619 Most users should employ the simplified KSP interface for linear solvers 2620 instead of working directly with matrix algebra routines such as this. 2621 See, e.g., KSPCreate(). 2622 2623 Level: developer 2624 2625 Concepts: matrices^Cholesky numeric factorization 2626 2627 .seealso: MatCholeskyFactorSymbolic(), MatCholeskyFactor(), MatLUFactorNumeric() 2628 2629 Developer Note: fortran interface is not autogenerated as the f90 2630 interface defintion cannot be generated correctly [due to MatFactorInfo] 2631 2632 @*/ 2633 PetscErrorCode PETSCMAT_DLLEXPORT MatCholeskyFactorNumeric(Mat fact,Mat mat,const MatFactorInfo *info) 2634 { 2635 PetscErrorCode ierr; 2636 2637 PetscFunctionBegin; 2638 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 2639 PetscValidType(mat,1); 2640 PetscValidPointer(fact,2); 2641 PetscValidHeaderSpecific(fact,MAT_COOKIE,2); 2642 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 2643 if (!(fact)->ops->choleskyfactornumeric) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 2644 if (mat->rmap->N != (fact)->rmap->N || mat->cmap->N != (fact)->cmap->N) { 2645 SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat mat,Mat fact: global dim %D should = %D %D should = %D",mat->rmap->N,(fact)->rmap->N,mat->cmap->N,(fact)->cmap->N); 2646 } 2647 ierr = MatPreallocated(mat);CHKERRQ(ierr); 2648 2649 ierr = PetscLogEventBegin(MAT_CholeskyFactorNumeric,mat,fact,0,0);CHKERRQ(ierr); 2650 ierr = (fact->ops->choleskyfactornumeric)(fact,mat,info);CHKERRQ(ierr); 2651 ierr = PetscLogEventEnd(MAT_CholeskyFactorNumeric,mat,fact,0,0);CHKERRQ(ierr); 2652 2653 ierr = MatView_Private(fact);CHKERRQ(ierr); 2654 ierr = PetscObjectStateIncrease((PetscObject)fact);CHKERRQ(ierr); 2655 PetscFunctionReturn(0); 2656 } 2657 2658 /* ----------------------------------------------------------------*/ 2659 #undef __FUNCT__ 2660 #define __FUNCT__ "MatSolve" 2661 /*@ 2662 MatSolve - Solves A x = b, given a factored matrix. 2663 2664 Collective on Mat and Vec 2665 2666 Input Parameters: 2667 + mat - the factored matrix 2668 - b - the right-hand-side vector 2669 2670 Output Parameter: 2671 . x - the result vector 2672 2673 Notes: 2674 The vectors b and x cannot be the same. I.e., one cannot 2675 call MatSolve(A,x,x). 2676 2677 Notes: 2678 Most users should employ the simplified KSP interface for linear solvers 2679 instead of working directly with matrix algebra routines such as this. 2680 See, e.g., KSPCreate(). 2681 2682 Level: developer 2683 2684 Concepts: matrices^triangular solves 2685 2686 .seealso: MatSolveAdd(), MatSolveTranspose(), MatSolveTransposeAdd() 2687 @*/ 2688 PetscErrorCode PETSCMAT_DLLEXPORT MatSolve(Mat mat,Vec b,Vec x) 2689 { 2690 PetscErrorCode ierr; 2691 2692 PetscFunctionBegin; 2693 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 2694 PetscValidType(mat,1); 2695 PetscValidHeaderSpecific(b,VEC_COOKIE,2); 2696 PetscValidHeaderSpecific(x,VEC_COOKIE,3); 2697 PetscCheckSameComm(mat,1,b,2); 2698 PetscCheckSameComm(mat,1,x,3); 2699 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 2700 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 2701 if (mat->cmap->N != x->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %D %D",mat->cmap->N,x->map->N); 2702 if (mat->rmap->N != b->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %D %D",mat->rmap->N,b->map->N); 2703 if (mat->rmap->n != b->map->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %D %D",mat->rmap->n,b->map->n); 2704 if (!mat->rmap->N && !mat->cmap->N) PetscFunctionReturn(0); 2705 if (!mat->ops->solve) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 2706 ierr = MatPreallocated(mat);CHKERRQ(ierr); 2707 2708 ierr = PetscLogEventBegin(MAT_Solve,mat,b,x,0);CHKERRQ(ierr); 2709 ierr = (*mat->ops->solve)(mat,b,x);CHKERRQ(ierr); 2710 ierr = PetscLogEventEnd(MAT_Solve,mat,b,x,0);CHKERRQ(ierr); 2711 ierr = PetscObjectStateIncrease((PetscObject)x);CHKERRQ(ierr); 2712 PetscFunctionReturn(0); 2713 } 2714 2715 #undef __FUNCT__ 2716 #define __FUNCT__ "MatMatSolve_Basic" 2717 PetscErrorCode PETSCMAT_DLLEXPORT MatMatSolve_Basic(Mat A,Mat B,Mat X) 2718 { 2719 PetscErrorCode ierr; 2720 Vec b,x; 2721 PetscInt m,N,i; 2722 PetscScalar *bb,*xx; 2723 2724 PetscFunctionBegin; 2725 ierr = MatGetArray(B,&bb);CHKERRQ(ierr); 2726 ierr = MatGetArray(X,&xx);CHKERRQ(ierr); 2727 ierr = MatGetLocalSize(B,&m,PETSC_NULL);CHKERRQ(ierr); /* number local rows */ 2728 ierr = MatGetSize(B,PETSC_NULL,&N);CHKERRQ(ierr); /* total columns in dense matrix */ 2729 ierr = MatGetVecs(B,&x,&b);CHKERRQ(ierr); 2730 for (i=0; i<N; i++) { 2731 ierr = VecPlaceArray(b,bb + i*m);CHKERRQ(ierr); 2732 ierr = VecPlaceArray(x,xx + i*m);CHKERRQ(ierr); 2733 ierr = MatSolve(A,b,x);CHKERRQ(ierr); 2734 ierr = VecResetArray(x);CHKERRQ(ierr); 2735 ierr = VecResetArray(b);CHKERRQ(ierr); 2736 } 2737 ierr = VecDestroy(b);CHKERRQ(ierr); 2738 ierr = VecDestroy(x);CHKERRQ(ierr); 2739 ierr = MatRestoreArray(B,&bb);CHKERRQ(ierr); 2740 ierr = MatRestoreArray(X,&xx);CHKERRQ(ierr); 2741 PetscFunctionReturn(0); 2742 } 2743 2744 #undef __FUNCT__ 2745 #define __FUNCT__ "MatMatSolve" 2746 /*@ 2747 MatMatSolve - Solves A X = B, given a factored matrix. 2748 2749 Collective on Mat 2750 2751 Input Parameters: 2752 + mat - the factored matrix 2753 - B - the right-hand-side matrix (dense matrix) 2754 2755 Output Parameter: 2756 . X - the result matrix (dense matrix) 2757 2758 Notes: 2759 The matrices b and x cannot be the same. I.e., one cannot 2760 call MatMatSolve(A,x,x). 2761 2762 Notes: 2763 Most users should usually employ the simplified KSP interface for linear solvers 2764 instead of working directly with matrix algebra routines such as this. 2765 See, e.g., KSPCreate(). However KSP can only solve for one vector (column of X) 2766 at a time. 2767 2768 Level: developer 2769 2770 Concepts: matrices^triangular solves 2771 2772 .seealso: MatMatSolveAdd(), MatMatSolveTranspose(), MatMatSolveTransposeAdd(), MatLUFactor(), MatCholeskyFactor() 2773 @*/ 2774 PetscErrorCode PETSCMAT_DLLEXPORT MatMatSolve(Mat A,Mat B,Mat X) 2775 { 2776 PetscErrorCode ierr; 2777 2778 PetscFunctionBegin; 2779 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 2780 PetscValidType(A,1); 2781 PetscValidHeaderSpecific(B,MAT_COOKIE,2); 2782 PetscValidHeaderSpecific(X,MAT_COOKIE,3); 2783 PetscCheckSameComm(A,1,B,2); 2784 PetscCheckSameComm(A,1,X,3); 2785 if (X == B) SETERRQ(PETSC_ERR_ARG_IDN,"X and B must be different matrices"); 2786 if (!A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 2787 if (A->cmap->N != X->rmap->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat A,Mat X: global dim %D %D",A->cmap->N,X->rmap->N); 2788 if (A->rmap->N != B->rmap->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat A,Mat B: global dim %D %D",A->rmap->N,B->rmap->N); 2789 if (A->rmap->n != B->rmap->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat A,Mat B: local dim %D %D",A->rmap->n,B->rmap->n); 2790 if (!A->rmap->N && !A->cmap->N) PetscFunctionReturn(0); 2791 ierr = MatPreallocated(A);CHKERRQ(ierr); 2792 2793 ierr = PetscLogEventBegin(MAT_MatSolve,A,B,X,0);CHKERRQ(ierr); 2794 if (!A->ops->matsolve) { 2795 ierr = PetscInfo1(A,"Mat type %s using basic MatMatSolve",((PetscObject)A)->type_name);CHKERRQ(ierr); 2796 ierr = MatMatSolve_Basic(A,B,X);CHKERRQ(ierr); 2797 } else { 2798 ierr = (*A->ops->matsolve)(A,B,X);CHKERRQ(ierr); 2799 } 2800 ierr = PetscLogEventEnd(MAT_MatSolve,A,B,X,0);CHKERRQ(ierr); 2801 ierr = PetscObjectStateIncrease((PetscObject)X);CHKERRQ(ierr); 2802 PetscFunctionReturn(0); 2803 } 2804 2805 2806 #undef __FUNCT__ 2807 #define __FUNCT__ "MatForwardSolve" 2808 /*@ 2809 MatForwardSolve - Solves L x = b, given a factored matrix, A = LU, or 2810 U^T*D^(1/2) x = b, given a factored symmetric matrix, A = U^T*D*U, 2811 2812 Collective on Mat and Vec 2813 2814 Input Parameters: 2815 + mat - the factored matrix 2816 - b - the right-hand-side vector 2817 2818 Output Parameter: 2819 . x - the result vector 2820 2821 Notes: 2822 MatSolve() should be used for most applications, as it performs 2823 a forward solve followed by a backward solve. 2824 2825 The vectors b and x cannot be the same, i.e., one cannot 2826 call MatForwardSolve(A,x,x). 2827 2828 For matrix in seqsbaij format with block size larger than 1, 2829 the diagonal blocks are not implemented as D = D^(1/2) * D^(1/2) yet. 2830 MatForwardSolve() solves U^T*D y = b, and 2831 MatBackwardSolve() solves U x = y. 2832 Thus they do not provide a symmetric preconditioner. 2833 2834 Most users should employ the simplified KSP interface for linear solvers 2835 instead of working directly with matrix algebra routines such as this. 2836 See, e.g., KSPCreate(). 2837 2838 Level: developer 2839 2840 Concepts: matrices^forward solves 2841 2842 .seealso: MatSolve(), MatBackwardSolve() 2843 @*/ 2844 PetscErrorCode PETSCMAT_DLLEXPORT MatForwardSolve(Mat mat,Vec b,Vec x) 2845 { 2846 PetscErrorCode ierr; 2847 2848 PetscFunctionBegin; 2849 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 2850 PetscValidType(mat,1); 2851 PetscValidHeaderSpecific(b,VEC_COOKIE,2); 2852 PetscValidHeaderSpecific(x,VEC_COOKIE,3); 2853 PetscCheckSameComm(mat,1,b,2); 2854 PetscCheckSameComm(mat,1,x,3); 2855 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 2856 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 2857 if (!mat->ops->forwardsolve) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 2858 if (mat->cmap->N != x->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %D %D",mat->cmap->N,x->map->N); 2859 if (mat->rmap->N != b->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %D %D",mat->rmap->N,b->map->N); 2860 if (mat->rmap->n != b->map->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %D %D",mat->rmap->n,b->map->n); 2861 ierr = MatPreallocated(mat);CHKERRQ(ierr); 2862 ierr = PetscLogEventBegin(MAT_ForwardSolve,mat,b,x,0);CHKERRQ(ierr); 2863 ierr = (*mat->ops->forwardsolve)(mat,b,x);CHKERRQ(ierr); 2864 ierr = PetscLogEventEnd(MAT_ForwardSolve,mat,b,x,0);CHKERRQ(ierr); 2865 ierr = PetscObjectStateIncrease((PetscObject)x);CHKERRQ(ierr); 2866 PetscFunctionReturn(0); 2867 } 2868 2869 #undef __FUNCT__ 2870 #define __FUNCT__ "MatBackwardSolve" 2871 /*@ 2872 MatBackwardSolve - Solves U x = b, given a factored matrix, A = LU. 2873 D^(1/2) U x = b, given a factored symmetric matrix, A = U^T*D*U, 2874 2875 Collective on Mat and Vec 2876 2877 Input Parameters: 2878 + mat - the factored matrix 2879 - b - the right-hand-side vector 2880 2881 Output Parameter: 2882 . x - the result vector 2883 2884 Notes: 2885 MatSolve() should be used for most applications, as it performs 2886 a forward solve followed by a backward solve. 2887 2888 The vectors b and x cannot be the same. I.e., one cannot 2889 call MatBackwardSolve(A,x,x). 2890 2891 For matrix in seqsbaij format with block size larger than 1, 2892 the diagonal blocks are not implemented as D = D^(1/2) * D^(1/2) yet. 2893 MatForwardSolve() solves U^T*D y = b, and 2894 MatBackwardSolve() solves U x = y. 2895 Thus they do not provide a symmetric preconditioner. 2896 2897 Most users should employ the simplified KSP interface for linear solvers 2898 instead of working directly with matrix algebra routines such as this. 2899 See, e.g., KSPCreate(). 2900 2901 Level: developer 2902 2903 Concepts: matrices^backward solves 2904 2905 .seealso: MatSolve(), MatForwardSolve() 2906 @*/ 2907 PetscErrorCode PETSCMAT_DLLEXPORT MatBackwardSolve(Mat mat,Vec b,Vec x) 2908 { 2909 PetscErrorCode ierr; 2910 2911 PetscFunctionBegin; 2912 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 2913 PetscValidType(mat,1); 2914 PetscValidHeaderSpecific(b,VEC_COOKIE,2); 2915 PetscValidHeaderSpecific(x,VEC_COOKIE,3); 2916 PetscCheckSameComm(mat,1,b,2); 2917 PetscCheckSameComm(mat,1,x,3); 2918 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 2919 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 2920 if (!mat->ops->backwardsolve) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 2921 if (mat->cmap->N != x->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %D %D",mat->cmap->N,x->map->N); 2922 if (mat->rmap->N != b->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %D %D",mat->rmap->N,b->map->N); 2923 if (mat->rmap->n != b->map->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %D %D",mat->rmap->n,b->map->n); 2924 ierr = MatPreallocated(mat);CHKERRQ(ierr); 2925 2926 ierr = PetscLogEventBegin(MAT_BackwardSolve,mat,b,x,0);CHKERRQ(ierr); 2927 ierr = (*mat->ops->backwardsolve)(mat,b,x);CHKERRQ(ierr); 2928 ierr = PetscLogEventEnd(MAT_BackwardSolve,mat,b,x,0);CHKERRQ(ierr); 2929 ierr = PetscObjectStateIncrease((PetscObject)x);CHKERRQ(ierr); 2930 PetscFunctionReturn(0); 2931 } 2932 2933 #undef __FUNCT__ 2934 #define __FUNCT__ "MatSolveAdd" 2935 /*@ 2936 MatSolveAdd - Computes x = y + inv(A)*b, given a factored matrix. 2937 2938 Collective on Mat and Vec 2939 2940 Input Parameters: 2941 + mat - the factored matrix 2942 . b - the right-hand-side vector 2943 - y - the vector to be added to 2944 2945 Output Parameter: 2946 . x - the result vector 2947 2948 Notes: 2949 The vectors b and x cannot be the same. I.e., one cannot 2950 call MatSolveAdd(A,x,y,x). 2951 2952 Most users should employ the simplified KSP interface for linear solvers 2953 instead of working directly with matrix algebra routines such as this. 2954 See, e.g., KSPCreate(). 2955 2956 Level: developer 2957 2958 Concepts: matrices^triangular solves 2959 2960 .seealso: MatSolve(), MatSolveTranspose(), MatSolveTransposeAdd() 2961 @*/ 2962 PetscErrorCode PETSCMAT_DLLEXPORT MatSolveAdd(Mat mat,Vec b,Vec y,Vec x) 2963 { 2964 PetscScalar one = 1.0; 2965 Vec tmp; 2966 PetscErrorCode ierr; 2967 2968 PetscFunctionBegin; 2969 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 2970 PetscValidType(mat,1); 2971 PetscValidHeaderSpecific(y,VEC_COOKIE,2); 2972 PetscValidHeaderSpecific(b,VEC_COOKIE,3); 2973 PetscValidHeaderSpecific(x,VEC_COOKIE,4); 2974 PetscCheckSameComm(mat,1,b,2); 2975 PetscCheckSameComm(mat,1,y,2); 2976 PetscCheckSameComm(mat,1,x,3); 2977 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 2978 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 2979 if (mat->cmap->N != x->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %D %D",mat->cmap->N,x->map->N); 2980 if (mat->rmap->N != b->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %D %D",mat->rmap->N,b->map->N); 2981 if (mat->rmap->N != y->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %D %D",mat->rmap->N,y->map->N); 2982 if (mat->rmap->n != b->map->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %D %D",mat->rmap->n,b->map->n); 2983 if (x->map->n != y->map->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Vec x,Vec y: local dim %D %D",x->map->n,y->map->n); 2984 ierr = MatPreallocated(mat);CHKERRQ(ierr); 2985 2986 ierr = PetscLogEventBegin(MAT_SolveAdd,mat,b,x,y);CHKERRQ(ierr); 2987 if (mat->ops->solveadd) { 2988 ierr = (*mat->ops->solveadd)(mat,b,y,x);CHKERRQ(ierr); 2989 } else { 2990 /* do the solve then the add manually */ 2991 if (x != y) { 2992 ierr = MatSolve(mat,b,x);CHKERRQ(ierr); 2993 ierr = VecAXPY(x,one,y);CHKERRQ(ierr); 2994 } else { 2995 ierr = VecDuplicate(x,&tmp);CHKERRQ(ierr); 2996 ierr = PetscLogObjectParent(mat,tmp);CHKERRQ(ierr); 2997 ierr = VecCopy(x,tmp);CHKERRQ(ierr); 2998 ierr = MatSolve(mat,b,x);CHKERRQ(ierr); 2999 ierr = VecAXPY(x,one,tmp);CHKERRQ(ierr); 3000 ierr = VecDestroy(tmp);CHKERRQ(ierr); 3001 } 3002 } 3003 ierr = PetscLogEventEnd(MAT_SolveAdd,mat,b,x,y);CHKERRQ(ierr); 3004 ierr = PetscObjectStateIncrease((PetscObject)x);CHKERRQ(ierr); 3005 PetscFunctionReturn(0); 3006 } 3007 3008 #undef __FUNCT__ 3009 #define __FUNCT__ "MatSolveTranspose" 3010 /*@ 3011 MatSolveTranspose - Solves A' x = b, given a factored matrix. 3012 3013 Collective on Mat and Vec 3014 3015 Input Parameters: 3016 + mat - the factored matrix 3017 - b - the right-hand-side vector 3018 3019 Output Parameter: 3020 . x - the result vector 3021 3022 Notes: 3023 The vectors b and x cannot be the same. I.e., one cannot 3024 call MatSolveTranspose(A,x,x). 3025 3026 Most users should employ the simplified KSP interface for linear solvers 3027 instead of working directly with matrix algebra routines such as this. 3028 See, e.g., KSPCreate(). 3029 3030 Level: developer 3031 3032 Concepts: matrices^triangular solves 3033 3034 .seealso: MatSolve(), MatSolveAdd(), MatSolveTransposeAdd() 3035 @*/ 3036 PetscErrorCode PETSCMAT_DLLEXPORT MatSolveTranspose(Mat mat,Vec b,Vec x) 3037 { 3038 PetscErrorCode ierr; 3039 3040 PetscFunctionBegin; 3041 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 3042 PetscValidType(mat,1); 3043 PetscValidHeaderSpecific(b,VEC_COOKIE,2); 3044 PetscValidHeaderSpecific(x,VEC_COOKIE,3); 3045 PetscCheckSameComm(mat,1,b,2); 3046 PetscCheckSameComm(mat,1,x,3); 3047 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 3048 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 3049 if (!mat->ops->solvetranspose) SETERRQ1(PETSC_ERR_SUP,"Matrix type %s",((PetscObject)mat)->type_name); 3050 if (mat->rmap->N != x->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %D %D",mat->rmap->N,x->map->N); 3051 if (mat->cmap->N != b->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %D %D",mat->cmap->N,b->map->N); 3052 ierr = MatPreallocated(mat);CHKERRQ(ierr); 3053 ierr = PetscLogEventBegin(MAT_SolveTranspose,mat,b,x,0);CHKERRQ(ierr); 3054 ierr = (*mat->ops->solvetranspose)(mat,b,x);CHKERRQ(ierr); 3055 ierr = PetscLogEventEnd(MAT_SolveTranspose,mat,b,x,0);CHKERRQ(ierr); 3056 ierr = PetscObjectStateIncrease((PetscObject)x);CHKERRQ(ierr); 3057 PetscFunctionReturn(0); 3058 } 3059 3060 #undef __FUNCT__ 3061 #define __FUNCT__ "MatSolveTransposeAdd" 3062 /*@ 3063 MatSolveTransposeAdd - Computes x = y + inv(Transpose(A)) b, given a 3064 factored matrix. 3065 3066 Collective on Mat and Vec 3067 3068 Input Parameters: 3069 + mat - the factored matrix 3070 . b - the right-hand-side vector 3071 - y - the vector to be added to 3072 3073 Output Parameter: 3074 . x - the result vector 3075 3076 Notes: 3077 The vectors b and x cannot be the same. I.e., one cannot 3078 call MatSolveTransposeAdd(A,x,y,x). 3079 3080 Most users should employ the simplified KSP interface for linear solvers 3081 instead of working directly with matrix algebra routines such as this. 3082 See, e.g., KSPCreate(). 3083 3084 Level: developer 3085 3086 Concepts: matrices^triangular solves 3087 3088 .seealso: MatSolve(), MatSolveAdd(), MatSolveTranspose() 3089 @*/ 3090 PetscErrorCode PETSCMAT_DLLEXPORT MatSolveTransposeAdd(Mat mat,Vec b,Vec y,Vec x) 3091 { 3092 PetscScalar one = 1.0; 3093 PetscErrorCode ierr; 3094 Vec tmp; 3095 3096 PetscFunctionBegin; 3097 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 3098 PetscValidType(mat,1); 3099 PetscValidHeaderSpecific(y,VEC_COOKIE,2); 3100 PetscValidHeaderSpecific(b,VEC_COOKIE,3); 3101 PetscValidHeaderSpecific(x,VEC_COOKIE,4); 3102 PetscCheckSameComm(mat,1,b,2); 3103 PetscCheckSameComm(mat,1,y,3); 3104 PetscCheckSameComm(mat,1,x,4); 3105 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 3106 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 3107 if (mat->rmap->N != x->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %D %D",mat->rmap->N,x->map->N); 3108 if (mat->cmap->N != b->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %D %D",mat->cmap->N,b->map->N); 3109 if (mat->cmap->N != y->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec y: global dim %D %D",mat->cmap->N,y->map->N); 3110 if (x->map->n != y->map->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Vec x,Vec y: local dim %D %D",x->map->n,y->map->n); 3111 ierr = MatPreallocated(mat);CHKERRQ(ierr); 3112 3113 ierr = PetscLogEventBegin(MAT_SolveTransposeAdd,mat,b,x,y);CHKERRQ(ierr); 3114 if (mat->ops->solvetransposeadd) { 3115 ierr = (*mat->ops->solvetransposeadd)(mat,b,y,x);CHKERRQ(ierr); 3116 } else { 3117 /* do the solve then the add manually */ 3118 if (x != y) { 3119 ierr = MatSolveTranspose(mat,b,x);CHKERRQ(ierr); 3120 ierr = VecAXPY(x,one,y);CHKERRQ(ierr); 3121 } else { 3122 ierr = VecDuplicate(x,&tmp);CHKERRQ(ierr); 3123 ierr = PetscLogObjectParent(mat,tmp);CHKERRQ(ierr); 3124 ierr = VecCopy(x,tmp);CHKERRQ(ierr); 3125 ierr = MatSolveTranspose(mat,b,x);CHKERRQ(ierr); 3126 ierr = VecAXPY(x,one,tmp);CHKERRQ(ierr); 3127 ierr = VecDestroy(tmp);CHKERRQ(ierr); 3128 } 3129 } 3130 ierr = PetscLogEventEnd(MAT_SolveTransposeAdd,mat,b,x,y);CHKERRQ(ierr); 3131 ierr = PetscObjectStateIncrease((PetscObject)x);CHKERRQ(ierr); 3132 PetscFunctionReturn(0); 3133 } 3134 /* ----------------------------------------------------------------*/ 3135 3136 #undef __FUNCT__ 3137 #define __FUNCT__ "MatSOR" 3138 /*@ 3139 MatSOR - Computes relaxation (SOR, Gauss-Seidel) sweeps. 3140 3141 Collective on Mat and Vec 3142 3143 Input Parameters: 3144 + mat - the matrix 3145 . b - the right hand side 3146 . omega - the relaxation factor 3147 . flag - flag indicating the type of SOR (see below) 3148 . shift - diagonal shift 3149 . its - the number of iterations 3150 - lits - the number of local iterations 3151 3152 Output Parameters: 3153 . x - the solution (can contain an initial guess) 3154 3155 SOR Flags: 3156 . SOR_FORWARD_SWEEP - forward SOR 3157 . SOR_BACKWARD_SWEEP - backward SOR 3158 . SOR_SYMMETRIC_SWEEP - SSOR (symmetric SOR) 3159 . SOR_LOCAL_FORWARD_SWEEP - local forward SOR 3160 . SOR_LOCAL_BACKWARD_SWEEP - local forward SOR 3161 . SOR_LOCAL_SYMMETRIC_SWEEP - local SSOR 3162 . SOR_APPLY_UPPER, SOR_APPLY_LOWER - applies 3163 upper/lower triangular part of matrix to 3164 vector (with omega) 3165 . SOR_ZERO_INITIAL_GUESS - zero initial guess 3166 3167 Notes: 3168 SOR_LOCAL_FORWARD_SWEEP, SOR_LOCAL_BACKWARD_SWEEP, and 3169 SOR_LOCAL_SYMMETRIC_SWEEP perform separate independent smoothings 3170 on each processor. 3171 3172 Application programmers will not generally use MatSOR() directly, 3173 but instead will employ the KSP/PC interface. 3174 3175 Notes for Advanced Users: 3176 The flags are implemented as bitwise inclusive or operations. 3177 For example, use (SOR_ZERO_INITIAL_GUESS | SOR_SYMMETRIC_SWEEP) 3178 to specify a zero initial guess for SSOR. 3179 3180 Most users should employ the simplified KSP interface for linear solvers 3181 instead of working directly with matrix algebra routines such as this. 3182 See, e.g., KSPCreate(). 3183 3184 3185 Level: developer 3186 3187 Concepts: matrices^relaxation 3188 Concepts: matrices^SOR 3189 Concepts: matrices^Gauss-Seidel 3190 3191 @*/ 3192 PetscErrorCode PETSCMAT_DLLEXPORT MatSOR(Mat mat,Vec b,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec x) 3193 { 3194 PetscErrorCode ierr; 3195 3196 PetscFunctionBegin; 3197 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 3198 PetscValidType(mat,1); 3199 PetscValidHeaderSpecific(b,VEC_COOKIE,2); 3200 PetscValidHeaderSpecific(x,VEC_COOKIE,8); 3201 PetscCheckSameComm(mat,1,b,2); 3202 PetscCheckSameComm(mat,1,x,8); 3203 if (!mat->ops->sor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 3204 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3205 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 3206 if (mat->cmap->N != x->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec x: global dim %D %D",mat->cmap->N,x->map->N); 3207 if (mat->rmap->N != b->map->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: global dim %D %D",mat->rmap->N,b->map->N); 3208 if (mat->rmap->n != b->map->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"Mat mat,Vec b: local dim %D %D",mat->rmap->n,b->map->n); 3209 if (its <= 0) SETERRQ1(PETSC_ERR_ARG_WRONG,"Relaxation requires global its %D positive",its); 3210 if (lits <= 0) SETERRQ1(PETSC_ERR_ARG_WRONG,"Relaxation requires local its %D positive",lits); 3211 3212 ierr = MatPreallocated(mat);CHKERRQ(ierr); 3213 ierr = PetscLogEventBegin(MAT_SOR,mat,b,x,0);CHKERRQ(ierr); 3214 ierr =(*mat->ops->sor)(mat,b,omega,flag,shift,its,lits,x);CHKERRQ(ierr); 3215 ierr = PetscLogEventEnd(MAT_SOR,mat,b,x,0);CHKERRQ(ierr); 3216 ierr = PetscObjectStateIncrease((PetscObject)x);CHKERRQ(ierr); 3217 PetscFunctionReturn(0); 3218 } 3219 3220 #undef __FUNCT__ 3221 #define __FUNCT__ "MatCopy_Basic" 3222 /* 3223 Default matrix copy routine. 3224 */ 3225 PetscErrorCode MatCopy_Basic(Mat A,Mat B,MatStructure str) 3226 { 3227 PetscErrorCode ierr; 3228 PetscInt i,rstart,rend,nz; 3229 const PetscInt *cwork; 3230 const PetscScalar *vwork; 3231 3232 PetscFunctionBegin; 3233 if (B->assembled) { 3234 ierr = MatZeroEntries(B);CHKERRQ(ierr); 3235 } 3236 ierr = MatGetOwnershipRange(A,&rstart,&rend);CHKERRQ(ierr); 3237 for (i=rstart; i<rend; i++) { 3238 ierr = MatGetRow(A,i,&nz,&cwork,&vwork);CHKERRQ(ierr); 3239 ierr = MatSetValues(B,1,&i,nz,cwork,vwork,INSERT_VALUES);CHKERRQ(ierr); 3240 ierr = MatRestoreRow(A,i,&nz,&cwork,&vwork);CHKERRQ(ierr); 3241 } 3242 ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 3243 ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 3244 ierr = PetscObjectStateIncrease((PetscObject)B);CHKERRQ(ierr); 3245 PetscFunctionReturn(0); 3246 } 3247 3248 #undef __FUNCT__ 3249 #define __FUNCT__ "MatCopy" 3250 /*@ 3251 MatCopy - Copys a matrix to another matrix. 3252 3253 Collective on Mat 3254 3255 Input Parameters: 3256 + A - the matrix 3257 - str - SAME_NONZERO_PATTERN or DIFFERENT_NONZERO_PATTERN 3258 3259 Output Parameter: 3260 . B - where the copy is put 3261 3262 Notes: 3263 If you use SAME_NONZERO_PATTERN then the two matrices had better have the 3264 same nonzero pattern or the routine will crash. 3265 3266 MatCopy() copies the matrix entries of a matrix to another existing 3267 matrix (after first zeroing the second matrix). A related routine is 3268 MatConvert(), which first creates a new matrix and then copies the data. 3269 3270 Level: intermediate 3271 3272 Concepts: matrices^copying 3273 3274 .seealso: MatConvert(), MatDuplicate() 3275 3276 @*/ 3277 PetscErrorCode PETSCMAT_DLLEXPORT MatCopy(Mat A,Mat B,MatStructure str) 3278 { 3279 PetscErrorCode ierr; 3280 PetscInt i; 3281 3282 PetscFunctionBegin; 3283 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 3284 PetscValidHeaderSpecific(B,MAT_COOKIE,2); 3285 PetscValidType(A,1); 3286 PetscValidType(B,2); 3287 PetscCheckSameComm(A,1,B,2); 3288 ierr = MatPreallocated(B);CHKERRQ(ierr); 3289 if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3290 if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 3291 if (A->rmap->N != B->rmap->N || A->cmap->N != B->cmap->N) SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat A,Mat B: global dim (%D,%D) (%D,%D)",A->rmap->N,B->rmap->N,A->cmap->N,B->cmap->N); 3292 ierr = MatPreallocated(A);CHKERRQ(ierr); 3293 3294 ierr = PetscLogEventBegin(MAT_Copy,A,B,0,0);CHKERRQ(ierr); 3295 if (A->ops->copy) { 3296 ierr = (*A->ops->copy)(A,B,str);CHKERRQ(ierr); 3297 } else { /* generic conversion */ 3298 ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 3299 } 3300 if (A->mapping) { 3301 if (B->mapping) {ierr = ISLocalToGlobalMappingDestroy(B->mapping);CHKERRQ(ierr);B->mapping = 0;} 3302 ierr = MatSetLocalToGlobalMapping(B,A->mapping);CHKERRQ(ierr); 3303 } 3304 if (A->bmapping) { 3305 if (B->bmapping) {ierr = ISLocalToGlobalMappingDestroy(B->bmapping);CHKERRQ(ierr);B->bmapping = 0;} 3306 ierr = MatSetLocalToGlobalMappingBlock(B,A->mapping);CHKERRQ(ierr); 3307 } 3308 3309 B->stencil.dim = A->stencil.dim; 3310 B->stencil.noc = A->stencil.noc; 3311 for (i=0; i<=A->stencil.dim; i++) { 3312 B->stencil.dims[i] = A->stencil.dims[i]; 3313 B->stencil.starts[i] = A->stencil.starts[i]; 3314 } 3315 3316 ierr = PetscLogEventEnd(MAT_Copy,A,B,0,0);CHKERRQ(ierr); 3317 ierr = PetscObjectStateIncrease((PetscObject)B);CHKERRQ(ierr); 3318 PetscFunctionReturn(0); 3319 } 3320 3321 #undef __FUNCT__ 3322 #define __FUNCT__ "MatConvert" 3323 /*@C 3324 MatConvert - Converts a matrix to another matrix, either of the same 3325 or different type. 3326 3327 Collective on Mat 3328 3329 Input Parameters: 3330 + mat - the matrix 3331 . newtype - new matrix type. Use MATSAME to create a new matrix of the 3332 same type as the original matrix. 3333 - reuse - denotes if the destination matrix is to be created or reused. Currently 3334 MAT_REUSE_MATRIX is only supported for inplace conversion, otherwise use 3335 MAT_INITIAL_MATRIX. 3336 3337 Output Parameter: 3338 . M - pointer to place new matrix 3339 3340 Notes: 3341 MatConvert() first creates a new matrix and then copies the data from 3342 the first matrix. A related routine is MatCopy(), which copies the matrix 3343 entries of one matrix to another already existing matrix context. 3344 3345 Cannot be used to convert a sequential matrix to parallel or parallel to sequential, 3346 the MPI communicator of the generated matrix is always the same as the communicator 3347 of the input matrix. 3348 3349 Level: intermediate 3350 3351 Concepts: matrices^converting between storage formats 3352 3353 .seealso: MatCopy(), MatDuplicate() 3354 @*/ 3355 PetscErrorCode PETSCMAT_DLLEXPORT MatConvert(Mat mat, const MatType newtype,MatReuse reuse,Mat *M) 3356 { 3357 PetscErrorCode ierr; 3358 PetscTruth sametype,issame,flg; 3359 char convname[256],mtype[256]; 3360 Mat B; 3361 3362 PetscFunctionBegin; 3363 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 3364 PetscValidType(mat,1); 3365 PetscValidPointer(M,3); 3366 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3367 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 3368 ierr = MatPreallocated(mat);CHKERRQ(ierr); 3369 3370 ierr = PetscOptionsGetString(((PetscObject)mat)->prefix,"-matconvert_type",mtype,256,&flg);CHKERRQ(ierr); 3371 if (flg) { 3372 newtype = mtype; 3373 } 3374 ierr = PetscTypeCompare((PetscObject)mat,newtype,&sametype);CHKERRQ(ierr); 3375 ierr = PetscStrcmp(newtype,"same",&issame);CHKERRQ(ierr); 3376 if ((reuse == MAT_REUSE_MATRIX) && (mat != *M)) { 3377 SETERRQ(PETSC_ERR_SUP,"MAT_REUSE_MATRIX only supported for in-place conversion currently"); 3378 } 3379 3380 if ((reuse == MAT_REUSE_MATRIX) && (issame || sametype)) PetscFunctionReturn(0); 3381 3382 if ((sametype || issame) && (reuse==MAT_INITIAL_MATRIX) && mat->ops->duplicate) { 3383 ierr = (*mat->ops->duplicate)(mat,MAT_COPY_VALUES,M);CHKERRQ(ierr); 3384 } else { 3385 PetscErrorCode (*conv)(Mat, const MatType,MatReuse,Mat*)=PETSC_NULL; 3386 const char *prefix[3] = {"seq","mpi",""}; 3387 PetscInt i; 3388 /* 3389 Order of precedence: 3390 1) See if a specialized converter is known to the current matrix. 3391 2) See if a specialized converter is known to the desired matrix class. 3392 3) See if a good general converter is registered for the desired class 3393 (as of 6/27/03 only MATMPIADJ falls into this category). 3394 4) See if a good general converter is known for the current matrix. 3395 5) Use a really basic converter. 3396 */ 3397 3398 /* 1) See if a specialized converter is known to the current matrix and the desired class */ 3399 for (i=0; i<3; i++) { 3400 ierr = PetscStrcpy(convname,"MatConvert_");CHKERRQ(ierr); 3401 ierr = PetscStrcat(convname,((PetscObject)mat)->type_name);CHKERRQ(ierr); 3402 ierr = PetscStrcat(convname,"_");CHKERRQ(ierr); 3403 ierr = PetscStrcat(convname,prefix[i]);CHKERRQ(ierr); 3404 ierr = PetscStrcat(convname,newtype);CHKERRQ(ierr); 3405 ierr = PetscStrcat(convname,"_C");CHKERRQ(ierr); 3406 ierr = PetscObjectQueryFunction((PetscObject)mat,convname,(void (**)(void))&conv);CHKERRQ(ierr); 3407 if (conv) goto foundconv; 3408 } 3409 3410 /* 2) See if a specialized converter is known to the desired matrix class. */ 3411 ierr = MatCreate(((PetscObject)mat)->comm,&B);CHKERRQ(ierr); 3412 ierr = MatSetSizes(B,mat->rmap->n,mat->cmap->n,mat->rmap->N,mat->cmap->N);CHKERRQ(ierr); 3413 ierr = MatSetType(B,newtype);CHKERRQ(ierr); 3414 for (i=0; i<3; i++) { 3415 ierr = PetscStrcpy(convname,"MatConvert_");CHKERRQ(ierr); 3416 ierr = PetscStrcat(convname,((PetscObject)mat)->type_name);CHKERRQ(ierr); 3417 ierr = PetscStrcat(convname,"_");CHKERRQ(ierr); 3418 ierr = PetscStrcat(convname,prefix[i]);CHKERRQ(ierr); 3419 ierr = PetscStrcat(convname,newtype);CHKERRQ(ierr); 3420 ierr = PetscStrcat(convname,"_C");CHKERRQ(ierr); 3421 ierr = PetscObjectQueryFunction((PetscObject)B,convname,(void (**)(void))&conv);CHKERRQ(ierr); 3422 if (conv) { 3423 ierr = MatDestroy(B);CHKERRQ(ierr); 3424 goto foundconv; 3425 } 3426 } 3427 3428 /* 3) See if a good general converter is registered for the desired class */ 3429 conv = B->ops->convertfrom; 3430 ierr = MatDestroy(B);CHKERRQ(ierr); 3431 if (conv) goto foundconv; 3432 3433 /* 4) See if a good general converter is known for the current matrix */ 3434 if (mat->ops->convert) { 3435 conv = mat->ops->convert; 3436 } 3437 if (conv) goto foundconv; 3438 3439 /* 5) Use a really basic converter. */ 3440 conv = MatConvert_Basic; 3441 3442 foundconv: 3443 ierr = PetscLogEventBegin(MAT_Convert,mat,0,0,0);CHKERRQ(ierr); 3444 ierr = (*conv)(mat,newtype,reuse,M);CHKERRQ(ierr); 3445 ierr = PetscLogEventEnd(MAT_Convert,mat,0,0,0);CHKERRQ(ierr); 3446 } 3447 ierr = PetscObjectStateIncrease((PetscObject)*M);CHKERRQ(ierr); 3448 PetscFunctionReturn(0); 3449 } 3450 3451 #undef __FUNCT__ 3452 #define __FUNCT__ "MatFactorGetSolverPackage" 3453 /*@C 3454 MatFactorGetSolverPackage - Returns name of the package providing the factorization routines 3455 3456 Not Collective 3457 3458 Input Parameter: 3459 . mat - the matrix, must be a factored matrix 3460 3461 Output Parameter: 3462 . type - the string name of the package (do not free this string) 3463 3464 Notes: 3465 In Fortran you pass in a empty string and the package name will be copied into it. 3466 (Make sure the string is long enough) 3467 3468 Level: intermediate 3469 3470 .seealso: MatCopy(), MatDuplicate(), MatGetFactorAvailable(), MatGetFactor() 3471 @*/ 3472 PetscErrorCode PETSCMAT_DLLEXPORT MatFactorGetSolverPackage(Mat mat, const MatSolverPackage *type) 3473 { 3474 PetscErrorCode ierr; 3475 PetscErrorCode (*conv)(Mat,const MatSolverPackage*); 3476 3477 PetscFunctionBegin; 3478 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 3479 PetscValidType(mat,1); 3480 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Only for factored matrix"); 3481 ierr = PetscObjectQueryFunction((PetscObject)mat,"MatFactorGetSolverPackage_C",(void (**)(void))&conv);CHKERRQ(ierr); 3482 if (!conv) { 3483 *type = MAT_SOLVER_PETSC; 3484 } else { 3485 ierr = (*conv)(mat,type);CHKERRQ(ierr); 3486 } 3487 PetscFunctionReturn(0); 3488 } 3489 3490 #undef __FUNCT__ 3491 #define __FUNCT__ "MatGetFactor" 3492 /*@C 3493 MatGetFactor - Returns a matrix suitable to calls to MatXXFactorSymbolic() 3494 3495 Collective on Mat 3496 3497 Input Parameters: 3498 + mat - the matrix 3499 . type - name of solver type, for example, spooles, superlu, plapack, petsc (to use PETSc's default) 3500 - ftype - factor type, MAT_FACTOR_LU, MAT_FACTOR_CHOLESKY, MAT_FACTOR_ICC, MAT_FACTOR_ILU, 3501 3502 Output Parameters: 3503 . f - the factor matrix used with MatXXFactorSymbolic() calls 3504 3505 Notes: 3506 Some PETSc matrix formats have alternative solvers available that are contained in alternative packages 3507 such as pastix, superlu, mumps, spooles etc. 3508 3509 PETSc must have been config/configure.py to use the external solver, using the option --download-package 3510 3511 Level: intermediate 3512 3513 .seealso: MatCopy(), MatDuplicate(), MatGetFactorAvailable() 3514 @*/ 3515 PetscErrorCode PETSCMAT_DLLEXPORT MatGetFactor(Mat mat, const MatSolverPackage type,MatFactorType ftype,Mat *f) 3516 { 3517 PetscErrorCode ierr; 3518 char convname[256]; 3519 PetscErrorCode (*conv)(Mat,MatFactorType,Mat*); 3520 3521 PetscFunctionBegin; 3522 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 3523 PetscValidType(mat,1); 3524 3525 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 3526 ierr = MatPreallocated(mat);CHKERRQ(ierr); 3527 3528 ierr = PetscStrcpy(convname,"MatGetFactor_");CHKERRQ(ierr); 3529 ierr = PetscStrcat(convname,type);CHKERRQ(ierr); 3530 ierr = PetscStrcat(convname,"_C");CHKERRQ(ierr); 3531 ierr = PetscObjectQueryFunction((PetscObject)mat,convname,(void (**)(void))&conv);CHKERRQ(ierr); 3532 if (!conv) { 3533 PetscTruth flag; 3534 ierr = PetscStrcasecmp(MAT_SOLVER_PETSC,type,&flag);CHKERRQ(ierr); 3535 if (flag) { 3536 SETERRQ1(PETSC_ERR_SUP,"Matrix format %s does not have a built-in PETSc direct solver",((PetscObject)mat)->type_name); 3537 } else { 3538 SETERRQ3(PETSC_ERR_SUP,"Matrix format %s does not have a solver %s. Perhaps you must config/configure.py with --download-%s",((PetscObject)mat)->type_name,type,type); 3539 } 3540 } 3541 ierr = (*conv)(mat,ftype,f);CHKERRQ(ierr); 3542 PetscFunctionReturn(0); 3543 } 3544 3545 #undef __FUNCT__ 3546 #define __FUNCT__ "MatGetFactorAvailable" 3547 /*@C 3548 MatGetFactorAvailable - Returns a a flag if matrix supports particular package and factor type 3549 3550 Collective on Mat 3551 3552 Input Parameters: 3553 + mat - the matrix 3554 . type - name of solver type, for example, spooles, superlu, plapack, petsc (to use PETSc's default) 3555 - ftype - factor type, MAT_FACTOR_LU, MAT_FACTOR_CHOLESKY, MAT_FACTOR_ICC, MAT_FACTOR_ILU, 3556 3557 Output Parameter: 3558 . flg - PETSC_TRUE if the factorization is available 3559 3560 Notes: 3561 Some PETSc matrix formats have alternative solvers available that are contained in alternative packages 3562 such as pastix, superlu, mumps, spooles etc. 3563 3564 PETSc must have been config/configure.py to use the external solver, using the option --download-package 3565 3566 Level: intermediate 3567 3568 .seealso: MatCopy(), MatDuplicate(), MatGetFactor() 3569 @*/ 3570 PetscErrorCode PETSCMAT_DLLEXPORT MatGetFactorAvailable(Mat mat, const MatSolverPackage type,MatFactorType ftype,PetscTruth *flg) 3571 { 3572 PetscErrorCode ierr; 3573 char convname[256]; 3574 PetscErrorCode (*conv)(Mat,MatFactorType,PetscTruth*); 3575 3576 PetscFunctionBegin; 3577 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 3578 PetscValidType(mat,1); 3579 3580 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 3581 ierr = MatPreallocated(mat);CHKERRQ(ierr); 3582 3583 ierr = PetscStrcpy(convname,"MatGetFactorAvailable_");CHKERRQ(ierr); 3584 ierr = PetscStrcat(convname,type);CHKERRQ(ierr); 3585 ierr = PetscStrcat(convname,"_C");CHKERRQ(ierr); 3586 ierr = PetscObjectQueryFunction((PetscObject)mat,convname,(void (**)(void))&conv);CHKERRQ(ierr); 3587 if (!conv) { 3588 *flg = PETSC_FALSE; 3589 } else { 3590 ierr = (*conv)(mat,ftype,flg);CHKERRQ(ierr); 3591 } 3592 PetscFunctionReturn(0); 3593 } 3594 3595 3596 #undef __FUNCT__ 3597 #define __FUNCT__ "MatDuplicate" 3598 /*@ 3599 MatDuplicate - Duplicates a matrix including the non-zero structure. 3600 3601 Collective on Mat 3602 3603 Input Parameters: 3604 + mat - the matrix 3605 - op - either MAT_DO_NOT_COPY_VALUES or MAT_COPY_VALUES, cause it to copy the numerical values in the matrix 3606 MAT_SHARE_NONZERO_PATTERN to share the nonzero patterns with the previous matrix and not copy them. 3607 3608 Output Parameter: 3609 . M - pointer to place new matrix 3610 3611 Level: intermediate 3612 3613 Concepts: matrices^duplicating 3614 3615 Notes: You cannot change the nonzero pattern for the parent or child matrix if you use MAT_SHARE_NONZERO_PATTERN. 3616 3617 .seealso: MatCopy(), MatConvert() 3618 @*/ 3619 PetscErrorCode PETSCMAT_DLLEXPORT MatDuplicate(Mat mat,MatDuplicateOption op,Mat *M) 3620 { 3621 PetscErrorCode ierr; 3622 Mat B; 3623 PetscInt i; 3624 3625 PetscFunctionBegin; 3626 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 3627 PetscValidType(mat,1); 3628 PetscValidPointer(M,3); 3629 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3630 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 3631 ierr = MatPreallocated(mat);CHKERRQ(ierr); 3632 3633 *M = 0; 3634 if (!mat->ops->duplicate) { 3635 SETERRQ(PETSC_ERR_SUP,"Not written for this matrix type"); 3636 } 3637 ierr = PetscLogEventBegin(MAT_Convert,mat,0,0,0);CHKERRQ(ierr); 3638 ierr = (*mat->ops->duplicate)(mat,op,M);CHKERRQ(ierr); 3639 B = *M; 3640 if (mat->mapping) { 3641 ierr = MatSetLocalToGlobalMapping(B,mat->mapping);CHKERRQ(ierr); 3642 } 3643 if (mat->bmapping) { 3644 ierr = MatSetLocalToGlobalMappingBlock(B,mat->bmapping);CHKERRQ(ierr); 3645 } 3646 ierr = PetscLayoutCopy(mat->rmap,&B->rmap);CHKERRQ(ierr); 3647 ierr = PetscLayoutCopy(mat->cmap,&B->cmap);CHKERRQ(ierr); 3648 3649 B->stencil.dim = mat->stencil.dim; 3650 B->stencil.noc = mat->stencil.noc; 3651 for (i=0; i<=mat->stencil.dim; i++) { 3652 B->stencil.dims[i] = mat->stencil.dims[i]; 3653 B->stencil.starts[i] = mat->stencil.starts[i]; 3654 } 3655 3656 ierr = PetscLogEventEnd(MAT_Convert,mat,0,0,0);CHKERRQ(ierr); 3657 ierr = PetscObjectStateIncrease((PetscObject)B);CHKERRQ(ierr); 3658 PetscFunctionReturn(0); 3659 } 3660 3661 #undef __FUNCT__ 3662 #define __FUNCT__ "MatGetDiagonal" 3663 /*@ 3664 MatGetDiagonal - Gets the diagonal of a matrix. 3665 3666 Collective on Mat and Vec 3667 3668 Input Parameters: 3669 + mat - the matrix 3670 - v - the vector for storing the diagonal 3671 3672 Output Parameter: 3673 . v - the diagonal of the matrix 3674 3675 Level: intermediate 3676 3677 Concepts: matrices^accessing diagonals 3678 3679 .seealso: MatGetRow(), MatGetSubMatrices(), MatGetSubmatrix(), MatGetRowMaxAbs() 3680 @*/ 3681 PetscErrorCode PETSCMAT_DLLEXPORT MatGetDiagonal(Mat mat,Vec v) 3682 { 3683 PetscErrorCode ierr; 3684 3685 PetscFunctionBegin; 3686 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 3687 PetscValidType(mat,1); 3688 PetscValidHeaderSpecific(v,VEC_COOKIE,2); 3689 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3690 if (!mat->ops->getdiagonal) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 3691 ierr = MatPreallocated(mat);CHKERRQ(ierr); 3692 3693 ierr = (*mat->ops->getdiagonal)(mat,v);CHKERRQ(ierr); 3694 ierr = PetscObjectStateIncrease((PetscObject)v);CHKERRQ(ierr); 3695 PetscFunctionReturn(0); 3696 } 3697 3698 #undef __FUNCT__ 3699 #define __FUNCT__ "MatGetRowMin" 3700 /*@ 3701 MatGetRowMin - Gets the minimum value (of the real part) of each 3702 row of the matrix 3703 3704 Collective on Mat and Vec 3705 3706 Input Parameters: 3707 . mat - the matrix 3708 3709 Output Parameter: 3710 + v - the vector for storing the maximums 3711 - idx - the indices of the column found for each row (optional) 3712 3713 Level: intermediate 3714 3715 Notes: The result of this call are the same as if one converted the matrix to dense format 3716 and found the minimum value in each row (i.e. the implicit zeros are counted as zeros). 3717 3718 This code is only implemented for a couple of matrix formats. 3719 3720 Concepts: matrices^getting row maximums 3721 3722 .seealso: MatGetDiagonal(), MatGetSubMatrices(), MatGetSubmatrix(), MatGetRowMaxAbs(), 3723 MatGetRowMax() 3724 @*/ 3725 PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowMin(Mat mat,Vec v,PetscInt idx[]) 3726 { 3727 PetscErrorCode ierr; 3728 3729 PetscFunctionBegin; 3730 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 3731 PetscValidType(mat,1); 3732 PetscValidHeaderSpecific(v,VEC_COOKIE,2); 3733 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3734 if (!mat->ops->getrowmax) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 3735 ierr = MatPreallocated(mat);CHKERRQ(ierr); 3736 3737 ierr = (*mat->ops->getrowmin)(mat,v,idx);CHKERRQ(ierr); 3738 ierr = PetscObjectStateIncrease((PetscObject)v);CHKERRQ(ierr); 3739 PetscFunctionReturn(0); 3740 } 3741 3742 #undef __FUNCT__ 3743 #define __FUNCT__ "MatGetRowMinAbs" 3744 /*@ 3745 MatGetRowMinAbs - Gets the minimum value (in absolute value) of each 3746 row of the matrix 3747 3748 Collective on Mat and Vec 3749 3750 Input Parameters: 3751 . mat - the matrix 3752 3753 Output Parameter: 3754 + v - the vector for storing the minimums 3755 - idx - the indices of the column found for each row (optional) 3756 3757 Level: intermediate 3758 3759 Notes: if a row is completely empty or has only 0.0 values then the idx[] value for that 3760 row is 0 (the first column). 3761 3762 This code is only implemented for a couple of matrix formats. 3763 3764 Concepts: matrices^getting row maximums 3765 3766 .seealso: MatGetDiagonal(), MatGetSubMatrices(), MatGetSubmatrix(), MatGetRowMax(), MatGetRowMaxAbs(), MatGetRowMin() 3767 @*/ 3768 PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowMinAbs(Mat mat,Vec v,PetscInt idx[]) 3769 { 3770 PetscErrorCode ierr; 3771 3772 PetscFunctionBegin; 3773 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 3774 PetscValidType(mat,1); 3775 PetscValidHeaderSpecific(v,VEC_COOKIE,2); 3776 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3777 if (!mat->ops->getrowminabs) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 3778 ierr = MatPreallocated(mat);CHKERRQ(ierr); 3779 if (idx) {ierr = PetscMemzero(idx,mat->rmap->n*sizeof(PetscInt));CHKERRQ(ierr);} 3780 3781 ierr = (*mat->ops->getrowminabs)(mat,v,idx);CHKERRQ(ierr); 3782 ierr = PetscObjectStateIncrease((PetscObject)v);CHKERRQ(ierr); 3783 PetscFunctionReturn(0); 3784 } 3785 3786 #undef __FUNCT__ 3787 #define __FUNCT__ "MatGetRowMax" 3788 /*@ 3789 MatGetRowMax - Gets the maximum value (of the real part) of each 3790 row of the matrix 3791 3792 Collective on Mat and Vec 3793 3794 Input Parameters: 3795 . mat - the matrix 3796 3797 Output Parameter: 3798 + v - the vector for storing the maximums 3799 - idx - the indices of the column found for each row (optional) 3800 3801 Level: intermediate 3802 3803 Notes: The result of this call are the same as if one converted the matrix to dense format 3804 and found the minimum value in each row (i.e. the implicit zeros are counted as zeros). 3805 3806 This code is only implemented for a couple of matrix formats. 3807 3808 Concepts: matrices^getting row maximums 3809 3810 .seealso: MatGetDiagonal(), MatGetSubMatrices(), MatGetSubmatrix(), MatGetRowMaxAbs(), MatGetRowMin() 3811 @*/ 3812 PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowMax(Mat mat,Vec v,PetscInt idx[]) 3813 { 3814 PetscErrorCode ierr; 3815 3816 PetscFunctionBegin; 3817 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 3818 PetscValidType(mat,1); 3819 PetscValidHeaderSpecific(v,VEC_COOKIE,2); 3820 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3821 if (!mat->ops->getrowmax) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 3822 ierr = MatPreallocated(mat);CHKERRQ(ierr); 3823 3824 ierr = (*mat->ops->getrowmax)(mat,v,idx);CHKERRQ(ierr); 3825 ierr = PetscObjectStateIncrease((PetscObject)v);CHKERRQ(ierr); 3826 PetscFunctionReturn(0); 3827 } 3828 3829 #undef __FUNCT__ 3830 #define __FUNCT__ "MatGetRowMaxAbs" 3831 /*@ 3832 MatGetRowMaxAbs - Gets the maximum value (in absolute value) of each 3833 row of the matrix 3834 3835 Collective on Mat and Vec 3836 3837 Input Parameters: 3838 . mat - the matrix 3839 3840 Output Parameter: 3841 + v - the vector for storing the maximums 3842 - idx - the indices of the column found for each row (optional) 3843 3844 Level: intermediate 3845 3846 Notes: if a row is completely empty or has only 0.0 values then the idx[] value for that 3847 row is 0 (the first column). 3848 3849 This code is only implemented for a couple of matrix formats. 3850 3851 Concepts: matrices^getting row maximums 3852 3853 .seealso: MatGetDiagonal(), MatGetSubMatrices(), MatGetSubmatrix(), MatGetRowMax(), MatGetRowMin() 3854 @*/ 3855 PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowMaxAbs(Mat mat,Vec v,PetscInt idx[]) 3856 { 3857 PetscErrorCode ierr; 3858 3859 PetscFunctionBegin; 3860 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 3861 PetscValidType(mat,1); 3862 PetscValidHeaderSpecific(v,VEC_COOKIE,2); 3863 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3864 if (!mat->ops->getrowmaxabs) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 3865 ierr = MatPreallocated(mat);CHKERRQ(ierr); 3866 if (idx) {ierr = PetscMemzero(idx,mat->rmap->n*sizeof(PetscInt));CHKERRQ(ierr);} 3867 3868 ierr = (*mat->ops->getrowmaxabs)(mat,v,idx);CHKERRQ(ierr); 3869 ierr = PetscObjectStateIncrease((PetscObject)v);CHKERRQ(ierr); 3870 PetscFunctionReturn(0); 3871 } 3872 3873 #undef __FUNCT__ 3874 #define __FUNCT__ "MatGetRowSum" 3875 /*@ 3876 MatGetRowSum - Gets the sum of each row of the matrix 3877 3878 Collective on Mat and Vec 3879 3880 Input Parameters: 3881 . mat - the matrix 3882 3883 Output Parameter: 3884 . v - the vector for storing the maximums 3885 3886 Level: intermediate 3887 3888 Notes: This code is slow since it is not currently specialized for different formats 3889 3890 Concepts: matrices^getting row sums 3891 3892 .seealso: MatGetDiagonal(), MatGetSubMatrices(), MatGetSubmatrix(), MatGetRowMax(), MatGetRowMin() 3893 @*/ 3894 PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowSum(Mat mat, Vec v) 3895 { 3896 PetscInt start, end, row; 3897 PetscScalar *array; 3898 PetscErrorCode ierr; 3899 3900 PetscFunctionBegin; 3901 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 3902 PetscValidType(mat,1); 3903 PetscValidHeaderSpecific(v,VEC_COOKIE,2); 3904 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3905 ierr = MatPreallocated(mat);CHKERRQ(ierr); 3906 ierr = MatGetOwnershipRange(mat, &start, &end);CHKERRQ(ierr); 3907 ierr = VecGetArray(v, &array);CHKERRQ(ierr); 3908 for(row = start; row < end; ++row) { 3909 PetscInt ncols, col; 3910 const PetscInt *cols; 3911 const PetscScalar *vals; 3912 3913 array[row - start] = 0.0; 3914 ierr = MatGetRow(mat, row, &ncols, &cols, &vals);CHKERRQ(ierr); 3915 for(col = 0; col < ncols; col++) { 3916 array[row - start] += vals[col]; 3917 } 3918 ierr = MatRestoreRow(mat, row, &ncols, &cols, &vals);CHKERRQ(ierr); 3919 } 3920 ierr = VecRestoreArray(v, &array);CHKERRQ(ierr); 3921 ierr = PetscObjectStateIncrease((PetscObject) v);CHKERRQ(ierr); 3922 PetscFunctionReturn(0); 3923 } 3924 3925 #undef __FUNCT__ 3926 #define __FUNCT__ "MatTranspose" 3927 /*@ 3928 MatTranspose - Computes an in-place or out-of-place transpose of a matrix. 3929 3930 Collective on Mat 3931 3932 Input Parameter: 3933 + mat - the matrix to transpose 3934 - reuse - store the transpose matrix in the provided B 3935 3936 Output Parameters: 3937 . B - the transpose 3938 3939 Notes: 3940 If you pass in &mat for B the transpose will be done in place 3941 3942 Level: intermediate 3943 3944 Concepts: matrices^transposing 3945 3946 .seealso: MatMultTranspose(), MatMultTransposeAdd(), MatIsTranspose(), MatReuse 3947 @*/ 3948 PetscErrorCode PETSCMAT_DLLEXPORT MatTranspose(Mat mat,MatReuse reuse,Mat *B) 3949 { 3950 PetscErrorCode ierr; 3951 3952 PetscFunctionBegin; 3953 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 3954 PetscValidType(mat,1); 3955 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 3956 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 3957 if (!mat->ops->transpose) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 3958 ierr = MatPreallocated(mat);CHKERRQ(ierr); 3959 3960 ierr = PetscLogEventBegin(MAT_Transpose,mat,0,0,0);CHKERRQ(ierr); 3961 ierr = (*mat->ops->transpose)(mat,reuse,B);CHKERRQ(ierr); 3962 ierr = PetscLogEventEnd(MAT_Transpose,mat,0,0,0);CHKERRQ(ierr); 3963 if (B) {ierr = PetscObjectStateIncrease((PetscObject)*B);CHKERRQ(ierr);} 3964 PetscFunctionReturn(0); 3965 } 3966 3967 #undef __FUNCT__ 3968 #define __FUNCT__ "MatIsTranspose" 3969 /*@ 3970 MatIsTranspose - Test whether a matrix is another one's transpose, 3971 or its own, in which case it tests symmetry. 3972 3973 Collective on Mat 3974 3975 Input Parameter: 3976 + A - the matrix to test 3977 - B - the matrix to test against, this can equal the first parameter 3978 3979 Output Parameters: 3980 . flg - the result 3981 3982 Notes: 3983 Only available for SeqAIJ/MPIAIJ matrices. The sequential algorithm 3984 has a running time of the order of the number of nonzeros; the parallel 3985 test involves parallel copies of the block-offdiagonal parts of the matrix. 3986 3987 Level: intermediate 3988 3989 Concepts: matrices^transposing, matrix^symmetry 3990 3991 .seealso: MatTranspose(), MatIsSymmetric(), MatIsHermitian() 3992 @*/ 3993 PetscErrorCode PETSCMAT_DLLEXPORT MatIsTranspose(Mat A,Mat B,PetscReal tol,PetscTruth *flg) 3994 { 3995 PetscErrorCode ierr,(*f)(Mat,Mat,PetscReal,PetscTruth*),(*g)(Mat,Mat,PetscReal,PetscTruth*); 3996 3997 PetscFunctionBegin; 3998 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 3999 PetscValidHeaderSpecific(B,MAT_COOKIE,2); 4000 PetscValidPointer(flg,3); 4001 ierr = PetscObjectQueryFunction((PetscObject)A,"MatIsTranspose_C",(void (**)(void))&f);CHKERRQ(ierr); 4002 ierr = PetscObjectQueryFunction((PetscObject)B,"MatIsTranspose_C",(void (**)(void))&g);CHKERRQ(ierr); 4003 if (f && g) { 4004 if (f==g) { 4005 ierr = (*f)(A,B,tol,flg);CHKERRQ(ierr); 4006 } else { 4007 SETERRQ(PETSC_ERR_ARG_NOTSAMETYPE,"Matrices do not have the same comparator for symmetry test"); 4008 } 4009 } 4010 PetscFunctionReturn(0); 4011 } 4012 4013 #undef __FUNCT__ 4014 #define __FUNCT__ "MatIsHermitianTranspose" 4015 /*@ 4016 MatIsHermitianTranspose - Test whether a matrix is another one's Hermitian transpose, 4017 4018 Collective on Mat 4019 4020 Input Parameter: 4021 + A - the matrix to test 4022 - B - the matrix to test against, this can equal the first parameter 4023 4024 Output Parameters: 4025 . flg - the result 4026 4027 Notes: 4028 Only available for SeqAIJ/MPIAIJ matrices. The sequential algorithm 4029 has a running time of the order of the number of nonzeros; the parallel 4030 test involves parallel copies of the block-offdiagonal parts of the matrix. 4031 4032 Level: intermediate 4033 4034 Concepts: matrices^transposing, matrix^symmetry 4035 4036 .seealso: MatTranspose(), MatIsSymmetric(), MatIsHermitian(), MatIsTranspose() 4037 @*/ 4038 PetscErrorCode PETSCMAT_DLLEXPORT MatIsHermitianTranspose(Mat A,Mat B,PetscReal tol,PetscTruth *flg) 4039 { 4040 PetscErrorCode ierr,(*f)(Mat,Mat,PetscReal,PetscTruth*),(*g)(Mat,Mat,PetscReal,PetscTruth*); 4041 4042 PetscFunctionBegin; 4043 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 4044 PetscValidHeaderSpecific(B,MAT_COOKIE,2); 4045 PetscValidPointer(flg,3); 4046 ierr = PetscObjectQueryFunction((PetscObject)A,"MatIsHermitianTranspose_C",(void (**)(void))&f);CHKERRQ(ierr); 4047 ierr = PetscObjectQueryFunction((PetscObject)B,"MatIsHermitianTranspose_C",(void (**)(void))&g);CHKERRQ(ierr); 4048 if (f && g) { 4049 if (f==g) { 4050 ierr = (*f)(A,B,tol,flg);CHKERRQ(ierr); 4051 } else { 4052 SETERRQ(PETSC_ERR_ARG_NOTSAMETYPE,"Matrices do not have the same comparator for Hermitian test"); 4053 } 4054 } 4055 PetscFunctionReturn(0); 4056 } 4057 4058 #undef __FUNCT__ 4059 #define __FUNCT__ "MatPermute" 4060 /*@ 4061 MatPermute - Creates a new matrix with rows and columns permuted from the 4062 original. 4063 4064 Collective on Mat 4065 4066 Input Parameters: 4067 + mat - the matrix to permute 4068 . row - row permutation, each processor supplies only the permutation for its rows 4069 - col - column permutation, each processor needs the entire column permutation, that is 4070 this is the same size as the total number of columns in the matrix. It can often 4071 be obtained with ISAllGather() on the row permutation 4072 4073 Output Parameters: 4074 . B - the permuted matrix 4075 4076 Level: advanced 4077 4078 Concepts: matrices^permuting 4079 4080 .seealso: MatGetOrdering(), ISAllGather() 4081 4082 @*/ 4083 PetscErrorCode PETSCMAT_DLLEXPORT MatPermute(Mat mat,IS row,IS col,Mat *B) 4084 { 4085 PetscErrorCode ierr; 4086 4087 PetscFunctionBegin; 4088 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 4089 PetscValidType(mat,1); 4090 PetscValidHeaderSpecific(row,IS_COOKIE,2); 4091 PetscValidHeaderSpecific(col,IS_COOKIE,3); 4092 PetscValidPointer(B,4); 4093 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 4094 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 4095 if (!mat->ops->permute) SETERRQ1(PETSC_ERR_SUP,"MatPermute not available for Mat type %s",((PetscObject)mat)->type_name); 4096 ierr = MatPreallocated(mat);CHKERRQ(ierr); 4097 4098 ierr = (*mat->ops->permute)(mat,row,col,B);CHKERRQ(ierr); 4099 ierr = PetscObjectStateIncrease((PetscObject)*B);CHKERRQ(ierr); 4100 PetscFunctionReturn(0); 4101 } 4102 4103 #undef __FUNCT__ 4104 #define __FUNCT__ "MatPermuteSparsify" 4105 /*@ 4106 MatPermuteSparsify - Creates a new matrix with rows and columns permuted from the 4107 original and sparsified to the prescribed tolerance. 4108 4109 Collective on Mat 4110 4111 Input Parameters: 4112 + A - The matrix to permute 4113 . band - The half-bandwidth of the sparsified matrix, or PETSC_DECIDE 4114 . frac - The half-bandwidth as a fraction of the total size, or 0.0 4115 . tol - The drop tolerance 4116 . rowp - The row permutation 4117 - colp - The column permutation 4118 4119 Output Parameter: 4120 . B - The permuted, sparsified matrix 4121 4122 Level: advanced 4123 4124 Note: 4125 The default behavior (band = PETSC_DECIDE and frac = 0.0) is to 4126 restrict the half-bandwidth of the resulting matrix to 5% of the 4127 total matrix size. 4128 4129 .keywords: matrix, permute, sparsify 4130 4131 .seealso: MatGetOrdering(), MatPermute() 4132 @*/ 4133 PetscErrorCode PETSCMAT_DLLEXPORT MatPermuteSparsify(Mat A, PetscInt band, PetscReal frac, PetscReal tol, IS rowp, IS colp, Mat *B) 4134 { 4135 IS irowp, icolp; 4136 const PetscInt *rows, *cols; 4137 PetscInt M, N, locRowStart, locRowEnd; 4138 PetscInt nz, newNz; 4139 const PetscInt *cwork; 4140 PetscInt *cnew; 4141 const PetscScalar *vwork; 4142 PetscScalar *vnew; 4143 PetscInt bw, issize; 4144 PetscInt row, locRow, newRow, col, newCol; 4145 PetscErrorCode ierr; 4146 4147 PetscFunctionBegin; 4148 PetscValidHeaderSpecific(A, MAT_COOKIE,1); 4149 PetscValidHeaderSpecific(rowp, IS_COOKIE,5); 4150 PetscValidHeaderSpecific(colp, IS_COOKIE,6); 4151 PetscValidPointer(B,7); 4152 if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE, "Not for unassembled matrix"); 4153 if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE, "Not for factored matrix"); 4154 if (!A->ops->permutesparsify) { 4155 ierr = MatGetSize(A, &M, &N);CHKERRQ(ierr); 4156 ierr = MatGetOwnershipRange(A, &locRowStart, &locRowEnd);CHKERRQ(ierr); 4157 ierr = ISGetSize(rowp, &issize);CHKERRQ(ierr); 4158 if (issize != M) SETERRQ2(PETSC_ERR_ARG_WRONG, "Wrong size %D for row permutation, should be %D", issize, M); 4159 ierr = ISGetSize(colp, &issize);CHKERRQ(ierr); 4160 if (issize != N) SETERRQ2(PETSC_ERR_ARG_WRONG, "Wrong size %D for column permutation, should be %D", issize, N); 4161 ierr = ISInvertPermutation(rowp, 0, &irowp);CHKERRQ(ierr); 4162 ierr = ISGetIndices(irowp, &rows);CHKERRQ(ierr); 4163 ierr = ISInvertPermutation(colp, 0, &icolp);CHKERRQ(ierr); 4164 ierr = ISGetIndices(icolp, &cols);CHKERRQ(ierr); 4165 ierr = PetscMalloc(N * sizeof(PetscInt), &cnew);CHKERRQ(ierr); 4166 ierr = PetscMalloc(N * sizeof(PetscScalar), &vnew);CHKERRQ(ierr); 4167 4168 /* Setup bandwidth to include */ 4169 if (band == PETSC_DECIDE) { 4170 if (frac <= 0.0) 4171 bw = (PetscInt) (M * 0.05); 4172 else 4173 bw = (PetscInt) (M * frac); 4174 } else { 4175 if (band <= 0) SETERRQ(PETSC_ERR_ARG_WRONG, "Bandwidth must be a positive integer"); 4176 bw = band; 4177 } 4178 4179 /* Put values into new matrix */ 4180 ierr = MatDuplicate(A, MAT_DO_NOT_COPY_VALUES, B);CHKERRQ(ierr); 4181 for(row = locRowStart, locRow = 0; row < locRowEnd; row++, locRow++) { 4182 ierr = MatGetRow(A, row, &nz, &cwork, &vwork);CHKERRQ(ierr); 4183 newRow = rows[locRow]+locRowStart; 4184 for(col = 0, newNz = 0; col < nz; col++) { 4185 newCol = cols[cwork[col]]; 4186 if ((newCol >= newRow - bw) && (newCol < newRow + bw) && (PetscAbsScalar(vwork[col]) >= tol)) { 4187 cnew[newNz] = newCol; 4188 vnew[newNz] = vwork[col]; 4189 newNz++; 4190 } 4191 } 4192 ierr = MatSetValues(*B, 1, &newRow, newNz, cnew, vnew, INSERT_VALUES);CHKERRQ(ierr); 4193 ierr = MatRestoreRow(A, row, &nz, &cwork, &vwork);CHKERRQ(ierr); 4194 } 4195 ierr = PetscFree(cnew);CHKERRQ(ierr); 4196 ierr = PetscFree(vnew);CHKERRQ(ierr); 4197 ierr = MatAssemblyBegin(*B, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 4198 ierr = MatAssemblyEnd(*B, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 4199 ierr = ISRestoreIndices(irowp, &rows);CHKERRQ(ierr); 4200 ierr = ISRestoreIndices(icolp, &cols);CHKERRQ(ierr); 4201 ierr = ISDestroy(irowp);CHKERRQ(ierr); 4202 ierr = ISDestroy(icolp);CHKERRQ(ierr); 4203 } else { 4204 ierr = (*A->ops->permutesparsify)(A, band, frac, tol, rowp, colp, B);CHKERRQ(ierr); 4205 } 4206 ierr = PetscObjectStateIncrease((PetscObject)*B);CHKERRQ(ierr); 4207 PetscFunctionReturn(0); 4208 } 4209 4210 #undef __FUNCT__ 4211 #define __FUNCT__ "MatEqual" 4212 /*@ 4213 MatEqual - Compares two matrices. 4214 4215 Collective on Mat 4216 4217 Input Parameters: 4218 + A - the first matrix 4219 - B - the second matrix 4220 4221 Output Parameter: 4222 . flg - PETSC_TRUE if the matrices are equal; PETSC_FALSE otherwise. 4223 4224 Level: intermediate 4225 4226 Concepts: matrices^equality between 4227 @*/ 4228 PetscErrorCode PETSCMAT_DLLEXPORT MatEqual(Mat A,Mat B,PetscTruth *flg) 4229 { 4230 PetscErrorCode ierr; 4231 4232 PetscFunctionBegin; 4233 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 4234 PetscValidHeaderSpecific(B,MAT_COOKIE,2); 4235 PetscValidType(A,1); 4236 PetscValidType(B,2); 4237 PetscValidIntPointer(flg,3); 4238 PetscCheckSameComm(A,1,B,2); 4239 ierr = MatPreallocated(B);CHKERRQ(ierr); 4240 if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 4241 if (!B->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 4242 if (A->rmap->N != B->rmap->N || A->cmap->N != B->cmap->N) SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat A,Mat B: global dim %D %D %D %D",A->rmap->N,B->rmap->N,A->cmap->N,B->cmap->N); 4243 if (!A->ops->equal) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)A)->type_name); 4244 if (!B->ops->equal) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)B)->type_name); 4245 if (A->ops->equal != B->ops->equal) SETERRQ2(PETSC_ERR_ARG_INCOMP,"A is type: %s\nB is type: %s",((PetscObject)A)->type_name,((PetscObject)B)->type_name); 4246 ierr = MatPreallocated(A);CHKERRQ(ierr); 4247 4248 ierr = (*A->ops->equal)(A,B,flg);CHKERRQ(ierr); 4249 PetscFunctionReturn(0); 4250 } 4251 4252 #undef __FUNCT__ 4253 #define __FUNCT__ "MatDiagonalScale" 4254 /*@ 4255 MatDiagonalScale - Scales a matrix on the left and right by diagonal 4256 matrices that are stored as vectors. Either of the two scaling 4257 matrices can be PETSC_NULL. 4258 4259 Collective on Mat 4260 4261 Input Parameters: 4262 + mat - the matrix to be scaled 4263 . l - the left scaling vector (or PETSC_NULL) 4264 - r - the right scaling vector (or PETSC_NULL) 4265 4266 Notes: 4267 MatDiagonalScale() computes A = LAR, where 4268 L = a diagonal matrix (stored as a vector), R = a diagonal matrix (stored as a vector) 4269 4270 Level: intermediate 4271 4272 Concepts: matrices^diagonal scaling 4273 Concepts: diagonal scaling of matrices 4274 4275 .seealso: MatScale() 4276 @*/ 4277 PetscErrorCode PETSCMAT_DLLEXPORT MatDiagonalScale(Mat mat,Vec l,Vec r) 4278 { 4279 PetscErrorCode ierr; 4280 4281 PetscFunctionBegin; 4282 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 4283 PetscValidType(mat,1); 4284 if (!mat->ops->diagonalscale) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 4285 if (l) {PetscValidHeaderSpecific(l,VEC_COOKIE,2);PetscCheckSameComm(mat,1,l,2);} 4286 if (r) {PetscValidHeaderSpecific(r,VEC_COOKIE,3);PetscCheckSameComm(mat,1,r,3);} 4287 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 4288 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 4289 ierr = MatPreallocated(mat);CHKERRQ(ierr); 4290 4291 ierr = PetscLogEventBegin(MAT_Scale,mat,0,0,0);CHKERRQ(ierr); 4292 ierr = (*mat->ops->diagonalscale)(mat,l,r);CHKERRQ(ierr); 4293 ierr = PetscLogEventEnd(MAT_Scale,mat,0,0,0);CHKERRQ(ierr); 4294 ierr = PetscObjectStateIncrease((PetscObject)mat);CHKERRQ(ierr); 4295 PetscFunctionReturn(0); 4296 } 4297 4298 #undef __FUNCT__ 4299 #define __FUNCT__ "MatScale" 4300 /*@ 4301 MatScale - Scales all elements of a matrix by a given number. 4302 4303 Collective on Mat 4304 4305 Input Parameters: 4306 + mat - the matrix to be scaled 4307 - a - the scaling value 4308 4309 Output Parameter: 4310 . mat - the scaled matrix 4311 4312 Level: intermediate 4313 4314 Concepts: matrices^scaling all entries 4315 4316 .seealso: MatDiagonalScale() 4317 @*/ 4318 PetscErrorCode PETSCMAT_DLLEXPORT MatScale(Mat mat,PetscScalar a) 4319 { 4320 PetscErrorCode ierr; 4321 4322 PetscFunctionBegin; 4323 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 4324 PetscValidType(mat,1); 4325 if (a != 1.0 && !mat->ops->scale) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 4326 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 4327 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 4328 ierr = MatPreallocated(mat);CHKERRQ(ierr); 4329 4330 ierr = PetscLogEventBegin(MAT_Scale,mat,0,0,0);CHKERRQ(ierr); 4331 if (a != 1.0) { 4332 ierr = (*mat->ops->scale)(mat,a);CHKERRQ(ierr); 4333 ierr = PetscObjectStateIncrease((PetscObject)mat);CHKERRQ(ierr); 4334 } 4335 ierr = PetscLogEventEnd(MAT_Scale,mat,0,0,0);CHKERRQ(ierr); 4336 PetscFunctionReturn(0); 4337 } 4338 4339 #undef __FUNCT__ 4340 #define __FUNCT__ "MatNorm" 4341 /*@ 4342 MatNorm - Calculates various norms of a matrix. 4343 4344 Collective on Mat 4345 4346 Input Parameters: 4347 + mat - the matrix 4348 - type - the type of norm, NORM_1, NORM_FROBENIUS, NORM_INFINITY 4349 4350 Output Parameters: 4351 . nrm - the resulting norm 4352 4353 Level: intermediate 4354 4355 Concepts: matrices^norm 4356 Concepts: norm^of matrix 4357 @*/ 4358 PetscErrorCode PETSCMAT_DLLEXPORT MatNorm(Mat mat,NormType type,PetscReal *nrm) 4359 { 4360 PetscErrorCode ierr; 4361 4362 PetscFunctionBegin; 4363 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 4364 PetscValidType(mat,1); 4365 PetscValidScalarPointer(nrm,3); 4366 4367 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 4368 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 4369 if (!mat->ops->norm) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 4370 ierr = MatPreallocated(mat);CHKERRQ(ierr); 4371 4372 ierr = (*mat->ops->norm)(mat,type,nrm);CHKERRQ(ierr); 4373 PetscFunctionReturn(0); 4374 } 4375 4376 /* 4377 This variable is used to prevent counting of MatAssemblyBegin() that 4378 are called from within a MatAssemblyEnd(). 4379 */ 4380 static PetscInt MatAssemblyEnd_InUse = 0; 4381 #undef __FUNCT__ 4382 #define __FUNCT__ "MatAssemblyBegin" 4383 /*@ 4384 MatAssemblyBegin - Begins assembling the matrix. This routine should 4385 be called after completing all calls to MatSetValues(). 4386 4387 Collective on Mat 4388 4389 Input Parameters: 4390 + mat - the matrix 4391 - type - type of assembly, either MAT_FLUSH_ASSEMBLY or MAT_FINAL_ASSEMBLY 4392 4393 Notes: 4394 MatSetValues() generally caches the values. The matrix is ready to 4395 use only after MatAssemblyBegin() and MatAssemblyEnd() have been called. 4396 Use MAT_FLUSH_ASSEMBLY when switching between ADD_VALUES and INSERT_VALUES 4397 in MatSetValues(); use MAT_FINAL_ASSEMBLY for the final assembly before 4398 using the matrix. 4399 4400 Level: beginner 4401 4402 Concepts: matrices^assembling 4403 4404 .seealso: MatAssemblyEnd(), MatSetValues(), MatAssembled() 4405 @*/ 4406 PetscErrorCode PETSCMAT_DLLEXPORT MatAssemblyBegin(Mat mat,MatAssemblyType type) 4407 { 4408 PetscErrorCode ierr; 4409 4410 PetscFunctionBegin; 4411 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 4412 PetscValidType(mat,1); 4413 ierr = MatPreallocated(mat);CHKERRQ(ierr); 4414 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix.\nDid you forget to call MatSetUnfactored()?"); 4415 if (mat->assembled) { 4416 mat->was_assembled = PETSC_TRUE; 4417 mat->assembled = PETSC_FALSE; 4418 } 4419 if (!MatAssemblyEnd_InUse) { 4420 ierr = PetscLogEventBegin(MAT_AssemblyBegin,mat,0,0,0);CHKERRQ(ierr); 4421 if (mat->ops->assemblybegin){ierr = (*mat->ops->assemblybegin)(mat,type);CHKERRQ(ierr);} 4422 ierr = PetscLogEventEnd(MAT_AssemblyBegin,mat,0,0,0);CHKERRQ(ierr); 4423 } else { 4424 if (mat->ops->assemblybegin){ierr = (*mat->ops->assemblybegin)(mat,type);CHKERRQ(ierr);} 4425 } 4426 PetscFunctionReturn(0); 4427 } 4428 4429 #undef __FUNCT__ 4430 #define __FUNCT__ "MatAssembed" 4431 /*@ 4432 MatAssembled - Indicates if a matrix has been assembled and is ready for 4433 use; for example, in matrix-vector product. 4434 4435 Collective on Mat 4436 4437 Input Parameter: 4438 . mat - the matrix 4439 4440 Output Parameter: 4441 . assembled - PETSC_TRUE or PETSC_FALSE 4442 4443 Level: advanced 4444 4445 Concepts: matrices^assembled? 4446 4447 .seealso: MatAssemblyEnd(), MatSetValues(), MatAssemblyBegin() 4448 @*/ 4449 PetscErrorCode PETSCMAT_DLLEXPORT MatAssembled(Mat mat,PetscTruth *assembled) 4450 { 4451 PetscFunctionBegin; 4452 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 4453 PetscValidType(mat,1); 4454 PetscValidPointer(assembled,2); 4455 *assembled = mat->assembled; 4456 PetscFunctionReturn(0); 4457 } 4458 4459 #undef __FUNCT__ 4460 #define __FUNCT__ "MatView_Private" 4461 /* 4462 Processes command line options to determine if/how a matrix 4463 is to be viewed. Called by MatAssemblyEnd() and MatLoad(). 4464 */ 4465 PetscErrorCode MatView_Private(Mat mat) 4466 { 4467 PetscErrorCode ierr; 4468 PetscTruth flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flg4 = PETSC_FALSE,flg6 = PETSC_FALSE,flg7 = PETSC_FALSE,flg8 = PETSC_FALSE; 4469 static PetscTruth incall = PETSC_FALSE; 4470 #if defined(PETSC_USE_SOCKET_VIEWER) 4471 PetscTruth flg5 = PETSC_FALSE; 4472 #endif 4473 4474 PetscFunctionBegin; 4475 if (incall) PetscFunctionReturn(0); 4476 incall = PETSC_TRUE; 4477 ierr = PetscOptionsBegin(((PetscObject)mat)->comm,((PetscObject)mat)->prefix,"Matrix Options","Mat");CHKERRQ(ierr); 4478 ierr = PetscOptionsTruth("-mat_view_info","Information on matrix size","MatView",flg1,&flg1,PETSC_NULL);CHKERRQ(ierr); 4479 ierr = PetscOptionsTruth("-mat_view_info_detailed","Nonzeros in the matrix","MatView",flg2,&flg2,PETSC_NULL);CHKERRQ(ierr); 4480 ierr = PetscOptionsTruth("-mat_view","Print matrix to stdout","MatView",flg3,&flg3,PETSC_NULL);CHKERRQ(ierr); 4481 ierr = PetscOptionsTruth("-mat_view_matlab","Print matrix to stdout in a format Matlab can read","MatView",flg4,&flg4,PETSC_NULL);CHKERRQ(ierr); 4482 #if defined(PETSC_USE_SOCKET_VIEWER) 4483 ierr = PetscOptionsTruth("-mat_view_socket","Send matrix to socket (can be read from matlab)","MatView",flg5,&flg5,PETSC_NULL);CHKERRQ(ierr); 4484 #endif 4485 ierr = PetscOptionsTruth("-mat_view_binary","Save matrix to file in binary format","MatView",flg6,&flg6,PETSC_NULL);CHKERRQ(ierr); 4486 ierr = PetscOptionsTruth("-mat_view_draw","Draw the matrix nonzero structure","MatView",flg7,&flg7,PETSC_NULL);CHKERRQ(ierr); 4487 ierr = PetscOptionsEnd();CHKERRQ(ierr); 4488 4489 if (flg1) { 4490 PetscViewer viewer; 4491 4492 ierr = PetscViewerASCIIGetStdout(((PetscObject)mat)->comm,&viewer);CHKERRQ(ierr); 4493 ierr = PetscViewerPushFormat(viewer,PETSC_VIEWER_ASCII_INFO);CHKERRQ(ierr); 4494 ierr = MatView(mat,viewer);CHKERRQ(ierr); 4495 ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 4496 } 4497 if (flg2) { 4498 PetscViewer viewer; 4499 4500 ierr = PetscViewerASCIIGetStdout(((PetscObject)mat)->comm,&viewer);CHKERRQ(ierr); 4501 ierr = PetscViewerPushFormat(viewer,PETSC_VIEWER_ASCII_INFO_DETAIL);CHKERRQ(ierr); 4502 ierr = MatView(mat,viewer);CHKERRQ(ierr); 4503 ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 4504 } 4505 if (flg3) { 4506 PetscViewer viewer; 4507 4508 ierr = PetscViewerASCIIGetStdout(((PetscObject)mat)->comm,&viewer);CHKERRQ(ierr); 4509 ierr = MatView(mat,viewer);CHKERRQ(ierr); 4510 } 4511 if (flg4) { 4512 PetscViewer viewer; 4513 4514 ierr = PetscViewerASCIIGetStdout(((PetscObject)mat)->comm,&viewer);CHKERRQ(ierr); 4515 ierr = PetscViewerPushFormat(viewer,PETSC_VIEWER_ASCII_MATLAB);CHKERRQ(ierr); 4516 ierr = MatView(mat,viewer);CHKERRQ(ierr); 4517 ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 4518 } 4519 #if defined(PETSC_USE_SOCKET_VIEWER) 4520 if (flg5) { 4521 ierr = MatView(mat,PETSC_VIEWER_SOCKET_(((PetscObject)mat)->comm));CHKERRQ(ierr); 4522 ierr = PetscViewerFlush(PETSC_VIEWER_SOCKET_(((PetscObject)mat)->comm));CHKERRQ(ierr); 4523 } 4524 #endif 4525 if (flg6) { 4526 ierr = MatView(mat,PETSC_VIEWER_BINARY_(((PetscObject)mat)->comm));CHKERRQ(ierr); 4527 ierr = PetscViewerFlush(PETSC_VIEWER_BINARY_(((PetscObject)mat)->comm));CHKERRQ(ierr); 4528 } 4529 if (flg7) { 4530 ierr = PetscOptionsGetTruth(((PetscObject)mat)->prefix,"-mat_view_contour",&flg8,PETSC_NULL);CHKERRQ(ierr); 4531 if (flg8) { 4532 PetscViewerPushFormat(PETSC_VIEWER_DRAW_(((PetscObject)mat)->comm),PETSC_VIEWER_DRAW_CONTOUR);CHKERRQ(ierr); 4533 } 4534 ierr = MatView(mat,PETSC_VIEWER_DRAW_(((PetscObject)mat)->comm));CHKERRQ(ierr); 4535 ierr = PetscViewerFlush(PETSC_VIEWER_DRAW_(((PetscObject)mat)->comm));CHKERRQ(ierr); 4536 if (flg8) { 4537 PetscViewerPopFormat(PETSC_VIEWER_DRAW_(((PetscObject)mat)->comm));CHKERRQ(ierr); 4538 } 4539 } 4540 incall = PETSC_FALSE; 4541 PetscFunctionReturn(0); 4542 } 4543 4544 #undef __FUNCT__ 4545 #define __FUNCT__ "MatAssemblyEnd" 4546 /*@ 4547 MatAssemblyEnd - Completes assembling the matrix. This routine should 4548 be called after MatAssemblyBegin(). 4549 4550 Collective on Mat 4551 4552 Input Parameters: 4553 + mat - the matrix 4554 - type - type of assembly, either MAT_FLUSH_ASSEMBLY or MAT_FINAL_ASSEMBLY 4555 4556 Options Database Keys: 4557 + -mat_view_info - Prints info on matrix at conclusion of MatEndAssembly() 4558 . -mat_view_info_detailed - Prints more detailed info 4559 . -mat_view - Prints matrix in ASCII format 4560 . -mat_view_matlab - Prints matrix in Matlab format 4561 . -mat_view_draw - PetscDraws nonzero structure of matrix, using MatView() and PetscDrawOpenX(). 4562 . -display <name> - Sets display name (default is host) 4563 . -draw_pause <sec> - Sets number of seconds to pause after display 4564 . -mat_view_socket - Sends matrix to socket, can be accessed from Matlab (see users manual) 4565 . -viewer_socket_machine <machine> 4566 . -viewer_socket_port <port> 4567 . -mat_view_binary - save matrix to file in binary format 4568 - -viewer_binary_filename <name> 4569 4570 Notes: 4571 MatSetValues() generally caches the values. The matrix is ready to 4572 use only after MatAssemblyBegin() and MatAssemblyEnd() have been called. 4573 Use MAT_FLUSH_ASSEMBLY when switching between ADD_VALUES and INSERT_VALUES 4574 in MatSetValues(); use MAT_FINAL_ASSEMBLY for the final assembly before 4575 using the matrix. 4576 4577 Level: beginner 4578 4579 .seealso: MatAssemblyBegin(), MatSetValues(), PetscDrawOpenX(), MatView(), MatAssembled(), PetscViewerSocketOpen() 4580 @*/ 4581 PetscErrorCode PETSCMAT_DLLEXPORT MatAssemblyEnd(Mat mat,MatAssemblyType type) 4582 { 4583 PetscErrorCode ierr; 4584 static PetscInt inassm = 0; 4585 PetscTruth flg = PETSC_FALSE; 4586 4587 PetscFunctionBegin; 4588 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 4589 PetscValidType(mat,1); 4590 4591 inassm++; 4592 MatAssemblyEnd_InUse++; 4593 if (MatAssemblyEnd_InUse == 1) { /* Do the logging only the first time through */ 4594 ierr = PetscLogEventBegin(MAT_AssemblyEnd,mat,0,0,0);CHKERRQ(ierr); 4595 if (mat->ops->assemblyend) { 4596 ierr = (*mat->ops->assemblyend)(mat,type);CHKERRQ(ierr); 4597 } 4598 ierr = PetscLogEventEnd(MAT_AssemblyEnd,mat,0,0,0);CHKERRQ(ierr); 4599 } else { 4600 if (mat->ops->assemblyend) { 4601 ierr = (*mat->ops->assemblyend)(mat,type);CHKERRQ(ierr); 4602 } 4603 } 4604 4605 /* Flush assembly is not a true assembly */ 4606 if (type != MAT_FLUSH_ASSEMBLY) { 4607 mat->assembled = PETSC_TRUE; mat->num_ass++; 4608 } 4609 mat->insertmode = NOT_SET_VALUES; 4610 MatAssemblyEnd_InUse--; 4611 ierr = PetscObjectStateIncrease((PetscObject)mat);CHKERRQ(ierr); 4612 if (!mat->symmetric_eternal) { 4613 mat->symmetric_set = PETSC_FALSE; 4614 mat->hermitian_set = PETSC_FALSE; 4615 mat->structurally_symmetric_set = PETSC_FALSE; 4616 } 4617 if (inassm == 1 && type != MAT_FLUSH_ASSEMBLY) { 4618 ierr = MatView_Private(mat);CHKERRQ(ierr); 4619 ierr = PetscOptionsGetTruth(((PetscObject)mat)->prefix,"-mat_is_symmetric",&flg,PETSC_NULL);CHKERRQ(ierr); 4620 if (flg) { 4621 PetscReal tol = 0.0; 4622 ierr = PetscOptionsGetReal(((PetscObject)mat)->prefix,"-mat_is_symmetric",&tol,PETSC_NULL);CHKERRQ(ierr); 4623 ierr = MatIsSymmetric(mat,tol,&flg);CHKERRQ(ierr); 4624 if (flg) { 4625 ierr = PetscPrintf(((PetscObject)mat)->comm,"Matrix is symmetric (tolerance %G)\n",tol);CHKERRQ(ierr); 4626 } else { 4627 ierr = PetscPrintf(((PetscObject)mat)->comm,"Matrix is not symmetric (tolerance %G)\n",tol);CHKERRQ(ierr); 4628 } 4629 } 4630 } 4631 inassm--; 4632 PetscFunctionReturn(0); 4633 } 4634 4635 #undef __FUNCT__ 4636 #define __FUNCT__ "MatSetOption" 4637 /*@ 4638 MatSetOption - Sets a parameter option for a matrix. Some options 4639 may be specific to certain storage formats. Some options 4640 determine how values will be inserted (or added). Sorted, 4641 row-oriented input will generally assemble the fastest. The default 4642 is row-oriented, nonsorted input. 4643 4644 Collective on Mat 4645 4646 Input Parameters: 4647 + mat - the matrix 4648 . option - the option, one of those listed below (and possibly others), 4649 - flg - turn the option on (PETSC_TRUE) or off (PETSC_FALSE) 4650 4651 Options Describing Matrix Structure: 4652 + MAT_SYMMETRIC - symmetric in terms of both structure and value 4653 . MAT_HERMITIAN - transpose is the complex conjugation 4654 . MAT_STRUCTURALLY_SYMMETRIC - symmetric nonzero structure 4655 - MAT_SYMMETRY_ETERNAL - if you would like the symmetry/Hermitian flag 4656 you set to be kept with all future use of the matrix 4657 including after MatAssemblyBegin/End() which could 4658 potentially change the symmetry structure, i.e. you 4659 KNOW the matrix will ALWAYS have the property you set. 4660 4661 4662 Options For Use with MatSetValues(): 4663 Insert a logically dense subblock, which can be 4664 . MAT_ROW_ORIENTED - row-oriented (default) 4665 4666 Note these options reflect the data you pass in with MatSetValues(); it has 4667 nothing to do with how the data is stored internally in the matrix 4668 data structure. 4669 4670 When (re)assembling a matrix, we can restrict the input for 4671 efficiency/debugging purposes. These options include 4672 + MAT_NEW_NONZERO_LOCATIONS - additional insertions will be 4673 allowed if they generate a new nonzero 4674 . MAT_NEW_DIAGONALS - new diagonals will be allowed (for block diagonal format only) 4675 . MAT_IGNORE_OFF_PROC_ENTRIES - drops off-processor entries 4676 . MAT_NEW_NONZERO_LOCATION_ERR - generates an error for new matrix entry 4677 - MAT_USE_HASH_TABLE - uses a hash table to speed up matrix assembly 4678 4679 Notes: 4680 Some options are relevant only for particular matrix types and 4681 are thus ignored by others. Other options are not supported by 4682 certain matrix types and will generate an error message if set. 4683 4684 If using a Fortran 77 module to compute a matrix, one may need to 4685 use the column-oriented option (or convert to the row-oriented 4686 format). 4687 4688 MAT_NEW_NONZERO_LOCATIONS set to PETSC_FALSE indicates that any add or insertion 4689 that would generate a new entry in the nonzero structure is instead 4690 ignored. Thus, if memory has not alredy been allocated for this particular 4691 data, then the insertion is ignored. For dense matrices, in which 4692 the entire array is allocated, no entries are ever ignored. 4693 Set after the first MatAssemblyEnd() 4694 4695 MAT_NEW_NONZERO_LOCATION_ERR indicates that any add or insertion 4696 that would generate a new entry in the nonzero structure instead produces 4697 an error. (Currently supported for AIJ and BAIJ formats only.) 4698 This is a useful flag when using SAME_NONZERO_PATTERN in calling 4699 KSPSetOperators() to ensure that the nonzero pattern truely does 4700 remain unchanged. Set after the first MatAssemblyEnd() 4701 4702 MAT_NEW_NONZERO_ALLOCATION_ERR indicates that any add or insertion 4703 that would generate a new entry that has not been preallocated will 4704 instead produce an error. (Currently supported for AIJ and BAIJ formats 4705 only.) This is a useful flag when debugging matrix memory preallocation. 4706 4707 MAT_IGNORE_OFF_PROC_ENTRIES indicates entries destined for 4708 other processors should be dropped, rather than stashed. 4709 This is useful if you know that the "owning" processor is also 4710 always generating the correct matrix entries, so that PETSc need 4711 not transfer duplicate entries generated on another processor. 4712 4713 MAT_USE_HASH_TABLE indicates that a hash table be used to improve the 4714 searches during matrix assembly. When this flag is set, the hash table 4715 is created during the first Matrix Assembly. This hash table is 4716 used the next time through, during MatSetVaules()/MatSetVaulesBlocked() 4717 to improve the searching of indices. MAT_NEW_NONZERO_LOCATIONS flag 4718 should be used with MAT_USE_HASH_TABLE flag. This option is currently 4719 supported by MATMPIBAIJ format only. 4720 4721 MAT_KEEP_NONZERO_PATTERN indicates when MatZeroRows() is called the zeroed entries 4722 are kept in the nonzero structure 4723 4724 MAT_IGNORE_ZERO_ENTRIES - for AIJ/IS matrices this will stop zero values from creating 4725 a zero location in the matrix 4726 4727 MAT_USE_INODES - indicates using inode version of the code - works with AIJ and 4728 ROWBS matrix types 4729 4730 Level: intermediate 4731 4732 Concepts: matrices^setting options 4733 4734 @*/ 4735 PetscErrorCode PETSCMAT_DLLEXPORT MatSetOption(Mat mat,MatOption op,PetscTruth flg) 4736 { 4737 PetscErrorCode ierr; 4738 4739 PetscFunctionBegin; 4740 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 4741 PetscValidType(mat,1); 4742 if (((int) op) < 0 || ((int) op) >= NUM_MAT_OPTIONS) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Options %d is out of range",(int)op); 4743 ierr = MatPreallocated(mat);CHKERRQ(ierr); 4744 switch (op) { 4745 case MAT_SYMMETRIC: 4746 mat->symmetric = flg; 4747 if (flg) mat->structurally_symmetric = PETSC_TRUE; 4748 mat->symmetric_set = PETSC_TRUE; 4749 mat->structurally_symmetric_set = flg; 4750 break; 4751 case MAT_HERMITIAN: 4752 mat->hermitian = flg; 4753 if (flg) mat->structurally_symmetric = PETSC_TRUE; 4754 mat->hermitian_set = PETSC_TRUE; 4755 mat->structurally_symmetric_set = flg; 4756 break; 4757 case MAT_STRUCTURALLY_SYMMETRIC: 4758 mat->structurally_symmetric = flg; 4759 mat->structurally_symmetric_set = PETSC_TRUE; 4760 break; 4761 case MAT_SYMMETRY_ETERNAL: 4762 mat->symmetric_eternal = flg; 4763 break; 4764 default: 4765 break; 4766 } 4767 if (mat->ops->setoption) { 4768 ierr = (*mat->ops->setoption)(mat,op,flg);CHKERRQ(ierr); 4769 } 4770 PetscFunctionReturn(0); 4771 } 4772 4773 #undef __FUNCT__ 4774 #define __FUNCT__ "MatZeroEntries" 4775 /*@ 4776 MatZeroEntries - Zeros all entries of a matrix. For sparse matrices 4777 this routine retains the old nonzero structure. 4778 4779 Collective on Mat 4780 4781 Input Parameters: 4782 . mat - the matrix 4783 4784 Level: intermediate 4785 4786 Concepts: matrices^zeroing 4787 4788 .seealso: MatZeroRows() 4789 @*/ 4790 PetscErrorCode PETSCMAT_DLLEXPORT MatZeroEntries(Mat mat) 4791 { 4792 PetscErrorCode ierr; 4793 4794 PetscFunctionBegin; 4795 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 4796 PetscValidType(mat,1); 4797 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 4798 if (mat->insertmode != NOT_SET_VALUES) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for matrices where you have set values but not yet assembled"); 4799 if (!mat->ops->zeroentries) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 4800 ierr = MatPreallocated(mat);CHKERRQ(ierr); 4801 4802 ierr = PetscLogEventBegin(MAT_ZeroEntries,mat,0,0,0);CHKERRQ(ierr); 4803 ierr = (*mat->ops->zeroentries)(mat);CHKERRQ(ierr); 4804 ierr = PetscLogEventEnd(MAT_ZeroEntries,mat,0,0,0);CHKERRQ(ierr); 4805 ierr = PetscObjectStateIncrease((PetscObject)mat);CHKERRQ(ierr); 4806 PetscFunctionReturn(0); 4807 } 4808 4809 #undef __FUNCT__ 4810 #define __FUNCT__ "MatZeroRows" 4811 /*@C 4812 MatZeroRows - Zeros all entries (except possibly the main diagonal) 4813 of a set of rows of a matrix. 4814 4815 Collective on Mat 4816 4817 Input Parameters: 4818 + mat - the matrix 4819 . numRows - the number of rows to remove 4820 . rows - the global row indices 4821 - diag - value put in all diagonals of eliminated rows (0.0 will even eliminate diagonal entry) 4822 4823 Notes: 4824 For the AIJ and BAIJ matrix formats this removes the old nonzero structure, 4825 but does not release memory. For the dense and block diagonal 4826 formats this does not alter the nonzero structure. 4827 4828 If the option MatSetOption(mat,MAT_KEEP_NONZERO_PATTERN,PETSC_TRUE) the nonzero structure 4829 of the matrix is not changed (even for AIJ and BAIJ matrices) the values are 4830 merely zeroed. 4831 4832 The user can set a value in the diagonal entry (or for the AIJ and 4833 row formats can optionally remove the main diagonal entry from the 4834 nonzero structure as well, by passing 0.0 as the final argument). 4835 4836 For the parallel case, all processes that share the matrix (i.e., 4837 those in the communicator used for matrix creation) MUST call this 4838 routine, regardless of whether any rows being zeroed are owned by 4839 them. 4840 4841 Each processor can indicate any rows in the entire matrix to be zeroed (i.e. each process does NOT have to 4842 list only rows local to itself). 4843 4844 Level: intermediate 4845 4846 Concepts: matrices^zeroing rows 4847 4848 .seealso: MatZeroRowsIS(), MatZeroEntries(), MatZeroRowsLocal(), MatSetOption() 4849 @*/ 4850 PetscErrorCode PETSCMAT_DLLEXPORT MatZeroRows(Mat mat,PetscInt numRows,const PetscInt rows[],PetscScalar diag) 4851 { 4852 PetscErrorCode ierr; 4853 4854 PetscFunctionBegin; 4855 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 4856 PetscValidType(mat,1); 4857 if (numRows) PetscValidIntPointer(rows,3); 4858 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 4859 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 4860 if (!mat->ops->zerorows) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 4861 ierr = MatPreallocated(mat);CHKERRQ(ierr); 4862 4863 ierr = (*mat->ops->zerorows)(mat,numRows,rows,diag);CHKERRQ(ierr); 4864 ierr = MatView_Private(mat);CHKERRQ(ierr); 4865 ierr = PetscObjectStateIncrease((PetscObject)mat);CHKERRQ(ierr); 4866 PetscFunctionReturn(0); 4867 } 4868 4869 #undef __FUNCT__ 4870 #define __FUNCT__ "MatZeroRowsIS" 4871 /*@C 4872 MatZeroRowsIS - Zeros all entries (except possibly the main diagonal) 4873 of a set of rows of a matrix. 4874 4875 Collective on Mat 4876 4877 Input Parameters: 4878 + mat - the matrix 4879 . is - index set of rows to remove 4880 - diag - value put in all diagonals of eliminated rows 4881 4882 Notes: 4883 For the AIJ and BAIJ matrix formats this removes the old nonzero structure, 4884 but does not release memory. For the dense and block diagonal 4885 formats this does not alter the nonzero structure. 4886 4887 If the option MatSetOption(mat,MAT_KEEP_NONZERO_PATTERN,PETSC_TRUE) the nonzero structure 4888 of the matrix is not changed (even for AIJ and BAIJ matrices) the values are 4889 merely zeroed. 4890 4891 The user can set a value in the diagonal entry (or for the AIJ and 4892 row formats can optionally remove the main diagonal entry from the 4893 nonzero structure as well, by passing 0.0 as the final argument). 4894 4895 For the parallel case, all processes that share the matrix (i.e., 4896 those in the communicator used for matrix creation) MUST call this 4897 routine, regardless of whether any rows being zeroed are owned by 4898 them. 4899 4900 Each processor should list the rows that IT wants zeroed 4901 4902 Level: intermediate 4903 4904 Concepts: matrices^zeroing rows 4905 4906 .seealso: MatZeroRows(), MatZeroEntries(), MatZeroRowsLocal(), MatSetOption() 4907 @*/ 4908 PetscErrorCode PETSCMAT_DLLEXPORT MatZeroRowsIS(Mat mat,IS is,PetscScalar diag) 4909 { 4910 PetscInt numRows; 4911 const PetscInt *rows; 4912 PetscErrorCode ierr; 4913 4914 PetscFunctionBegin; 4915 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 4916 PetscValidType(mat,1); 4917 PetscValidHeaderSpecific(is,IS_COOKIE,2); 4918 ierr = ISGetLocalSize(is,&numRows);CHKERRQ(ierr); 4919 ierr = ISGetIndices(is,&rows);CHKERRQ(ierr); 4920 ierr = MatZeroRows(mat,numRows,rows,diag);CHKERRQ(ierr); 4921 ierr = ISRestoreIndices(is,&rows);CHKERRQ(ierr); 4922 PetscFunctionReturn(0); 4923 } 4924 4925 #undef __FUNCT__ 4926 #define __FUNCT__ "MatZeroRowsLocal" 4927 /*@C 4928 MatZeroRowsLocal - Zeros all entries (except possibly the main diagonal) 4929 of a set of rows of a matrix; using local numbering of rows. 4930 4931 Collective on Mat 4932 4933 Input Parameters: 4934 + mat - the matrix 4935 . numRows - the number of rows to remove 4936 . rows - the global row indices 4937 - diag - value put in all diagonals of eliminated rows 4938 4939 Notes: 4940 Before calling MatZeroRowsLocal(), the user must first set the 4941 local-to-global mapping by calling MatSetLocalToGlobalMapping(). 4942 4943 For the AIJ matrix formats this removes the old nonzero structure, 4944 but does not release memory. For the dense and block diagonal 4945 formats this does not alter the nonzero structure. 4946 4947 If the option MatSetOption(mat,MAT_KEEP_NONZERO_PATTERN,PETSC_TRUE) the nonzero structure 4948 of the matrix is not changed (even for AIJ and BAIJ matrices) the values are 4949 merely zeroed. 4950 4951 The user can set a value in the diagonal entry (or for the AIJ and 4952 row formats can optionally remove the main diagonal entry from the 4953 nonzero structure as well, by passing 0.0 as the final argument). 4954 4955 Level: intermediate 4956 4957 Concepts: matrices^zeroing 4958 4959 .seealso: MatZeroRows(), MatZeroRowsLocalIS(), MatZeroEntries(), MatZeroRows(), MatSetLocalToGlobalMapping 4960 @*/ 4961 PetscErrorCode PETSCMAT_DLLEXPORT MatZeroRowsLocal(Mat mat,PetscInt numRows,const PetscInt rows[],PetscScalar diag) 4962 { 4963 PetscErrorCode ierr; 4964 4965 PetscFunctionBegin; 4966 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 4967 PetscValidType(mat,1); 4968 if (numRows) PetscValidIntPointer(rows,3); 4969 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 4970 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 4971 ierr = MatPreallocated(mat);CHKERRQ(ierr); 4972 4973 if (mat->ops->zerorowslocal) { 4974 ierr = (*mat->ops->zerorowslocal)(mat,numRows,rows,diag);CHKERRQ(ierr); 4975 } else { 4976 IS is, newis; 4977 const PetscInt *newRows; 4978 4979 if (!mat->mapping) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Need to provide local to global mapping to matrix first"); 4980 ierr = ISCreateGeneral(PETSC_COMM_SELF,numRows,rows,&is);CHKERRQ(ierr); 4981 ierr = ISLocalToGlobalMappingApplyIS(mat->mapping,is,&newis);CHKERRQ(ierr); 4982 ierr = ISGetIndices(newis,&newRows);CHKERRQ(ierr); 4983 ierr = (*mat->ops->zerorows)(mat,numRows,newRows,diag);CHKERRQ(ierr); 4984 ierr = ISRestoreIndices(newis,&newRows);CHKERRQ(ierr); 4985 ierr = ISDestroy(newis);CHKERRQ(ierr); 4986 ierr = ISDestroy(is);CHKERRQ(ierr); 4987 } 4988 ierr = PetscObjectStateIncrease((PetscObject)mat);CHKERRQ(ierr); 4989 PetscFunctionReturn(0); 4990 } 4991 4992 #undef __FUNCT__ 4993 #define __FUNCT__ "MatZeroRowsLocalIS" 4994 /*@C 4995 MatZeroRowsLocalIS - Zeros all entries (except possibly the main diagonal) 4996 of a set of rows of a matrix; using local numbering of rows. 4997 4998 Collective on Mat 4999 5000 Input Parameters: 5001 + mat - the matrix 5002 . is - index set of rows to remove 5003 - diag - value put in all diagonals of eliminated rows 5004 5005 Notes: 5006 Before calling MatZeroRowsLocalIS(), the user must first set the 5007 local-to-global mapping by calling MatSetLocalToGlobalMapping(). 5008 5009 For the AIJ matrix formats this removes the old nonzero structure, 5010 but does not release memory. For the dense and block diagonal 5011 formats this does not alter the nonzero structure. 5012 5013 If the option MatSetOption(mat,MAT_KEEP_NONZERO_PATTERN,PETSC_TRUE) the nonzero structure 5014 of the matrix is not changed (even for AIJ and BAIJ matrices) the values are 5015 merely zeroed. 5016 5017 The user can set a value in the diagonal entry (or for the AIJ and 5018 row formats can optionally remove the main diagonal entry from the 5019 nonzero structure as well, by passing 0.0 as the final argument). 5020 5021 Level: intermediate 5022 5023 Concepts: matrices^zeroing 5024 5025 .seealso: MatZeroRows(), MatZeroRowsLocal(), MatZeroEntries(), MatZeroRows(), MatSetLocalToGlobalMapping 5026 @*/ 5027 PetscErrorCode PETSCMAT_DLLEXPORT MatZeroRowsLocalIS(Mat mat,IS is,PetscScalar diag) 5028 { 5029 PetscErrorCode ierr; 5030 PetscInt numRows; 5031 const PetscInt *rows; 5032 5033 PetscFunctionBegin; 5034 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 5035 PetscValidType(mat,1); 5036 PetscValidHeaderSpecific(is,IS_COOKIE,2); 5037 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 5038 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 5039 ierr = MatPreallocated(mat);CHKERRQ(ierr); 5040 5041 ierr = ISGetLocalSize(is,&numRows);CHKERRQ(ierr); 5042 ierr = ISGetIndices(is,&rows);CHKERRQ(ierr); 5043 ierr = MatZeroRowsLocal(mat,numRows,rows,diag);CHKERRQ(ierr); 5044 ierr = ISRestoreIndices(is,&rows);CHKERRQ(ierr); 5045 PetscFunctionReturn(0); 5046 } 5047 5048 #undef __FUNCT__ 5049 #define __FUNCT__ "MatGetSize" 5050 /*@ 5051 MatGetSize - Returns the numbers of rows and columns in a matrix. 5052 5053 Not Collective 5054 5055 Input Parameter: 5056 . mat - the matrix 5057 5058 Output Parameters: 5059 + m - the number of global rows 5060 - n - the number of global columns 5061 5062 Note: both output parameters can be PETSC_NULL on input. 5063 5064 Level: beginner 5065 5066 Concepts: matrices^size 5067 5068 .seealso: MatGetLocalSize() 5069 @*/ 5070 PetscErrorCode PETSCMAT_DLLEXPORT MatGetSize(Mat mat,PetscInt *m,PetscInt* n) 5071 { 5072 PetscFunctionBegin; 5073 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 5074 if (m) *m = mat->rmap->N; 5075 if (n) *n = mat->cmap->N; 5076 PetscFunctionReturn(0); 5077 } 5078 5079 #undef __FUNCT__ 5080 #define __FUNCT__ "MatGetLocalSize" 5081 /*@ 5082 MatGetLocalSize - Returns the number of rows and columns in a matrix 5083 stored locally. This information may be implementation dependent, so 5084 use with care. 5085 5086 Not Collective 5087 5088 Input Parameters: 5089 . mat - the matrix 5090 5091 Output Parameters: 5092 + m - the number of local rows 5093 - n - the number of local columns 5094 5095 Note: both output parameters can be PETSC_NULL on input. 5096 5097 Level: beginner 5098 5099 Concepts: matrices^local size 5100 5101 .seealso: MatGetSize() 5102 @*/ 5103 PetscErrorCode PETSCMAT_DLLEXPORT MatGetLocalSize(Mat mat,PetscInt *m,PetscInt* n) 5104 { 5105 PetscFunctionBegin; 5106 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 5107 if (m) PetscValidIntPointer(m,2); 5108 if (n) PetscValidIntPointer(n,3); 5109 if (m) *m = mat->rmap->n; 5110 if (n) *n = mat->cmap->n; 5111 PetscFunctionReturn(0); 5112 } 5113 5114 #undef __FUNCT__ 5115 #define __FUNCT__ "MatGetOwnershipRangeColumn" 5116 /*@ 5117 MatGetOwnershipRangeColumn - Returns the range of matrix columns owned by 5118 this processor. 5119 5120 Not Collective, unless matrix has not been allocated, then collective on Mat 5121 5122 Input Parameters: 5123 . mat - the matrix 5124 5125 Output Parameters: 5126 + m - the global index of the first local column 5127 - n - one more than the global index of the last local column 5128 5129 Notes: both output parameters can be PETSC_NULL on input. 5130 5131 Level: developer 5132 5133 Concepts: matrices^column ownership 5134 5135 .seealso: MatGetOwnershipRange(), MatGetOwnershipRanges(), MatGetOwnershipRangesColumn() 5136 5137 @*/ 5138 PetscErrorCode PETSCMAT_DLLEXPORT MatGetOwnershipRangeColumn(Mat mat,PetscInt *m,PetscInt* n) 5139 { 5140 PetscErrorCode ierr; 5141 5142 PetscFunctionBegin; 5143 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 5144 PetscValidType(mat,1); 5145 if (m) PetscValidIntPointer(m,2); 5146 if (n) PetscValidIntPointer(n,3); 5147 ierr = MatPreallocated(mat);CHKERRQ(ierr); 5148 if (m) *m = mat->cmap->rstart; 5149 if (n) *n = mat->cmap->rend; 5150 PetscFunctionReturn(0); 5151 } 5152 5153 #undef __FUNCT__ 5154 #define __FUNCT__ "MatGetOwnershipRange" 5155 /*@ 5156 MatGetOwnershipRange - Returns the range of matrix rows owned by 5157 this processor, assuming that the matrix is laid out with the first 5158 n1 rows on the first processor, the next n2 rows on the second, etc. 5159 For certain parallel layouts this range may not be well defined. 5160 5161 Not Collective, unless matrix has not been allocated, then collective on Mat 5162 5163 Input Parameters: 5164 . mat - the matrix 5165 5166 Output Parameters: 5167 + m - the global index of the first local row 5168 - n - one more than the global index of the last local row 5169 5170 Note: both output parameters can be PETSC_NULL on input. 5171 5172 Level: beginner 5173 5174 Concepts: matrices^row ownership 5175 5176 .seealso: MatGetOwnershipRanges(), MatGetOwnershipRangeColumn(), MatGetOwnershipRangesColumn() 5177 5178 @*/ 5179 PetscErrorCode PETSCMAT_DLLEXPORT MatGetOwnershipRange(Mat mat,PetscInt *m,PetscInt* n) 5180 { 5181 PetscErrorCode ierr; 5182 5183 PetscFunctionBegin; 5184 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 5185 PetscValidType(mat,1); 5186 if (m) PetscValidIntPointer(m,2); 5187 if (n) PetscValidIntPointer(n,3); 5188 ierr = MatPreallocated(mat);CHKERRQ(ierr); 5189 if (m) *m = mat->rmap->rstart; 5190 if (n) *n = mat->rmap->rend; 5191 PetscFunctionReturn(0); 5192 } 5193 5194 #undef __FUNCT__ 5195 #define __FUNCT__ "MatGetOwnershipRanges" 5196 /*@C 5197 MatGetOwnershipRanges - Returns the range of matrix rows owned by 5198 each process 5199 5200 Not Collective, unless matrix has not been allocated, then collective on Mat 5201 5202 Input Parameters: 5203 . mat - the matrix 5204 5205 Output Parameters: 5206 . ranges - start of each processors portion plus one more then the total length at the end 5207 5208 Level: beginner 5209 5210 Concepts: matrices^row ownership 5211 5212 .seealso: MatGetOwnershipRange(), MatGetOwnershipRangeColumn(), MatGetOwnershipRangesColumn() 5213 5214 @*/ 5215 PetscErrorCode PETSCMAT_DLLEXPORT MatGetOwnershipRanges(Mat mat,const PetscInt **ranges) 5216 { 5217 PetscErrorCode ierr; 5218 5219 PetscFunctionBegin; 5220 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 5221 PetscValidType(mat,1); 5222 ierr = MatPreallocated(mat);CHKERRQ(ierr); 5223 ierr = PetscLayoutGetRanges(mat->rmap,ranges);CHKERRQ(ierr); 5224 PetscFunctionReturn(0); 5225 } 5226 5227 #undef __FUNCT__ 5228 #define __FUNCT__ "MatGetOwnershipRangesColumn" 5229 /*@C 5230 MatGetOwnershipRangesColumn - Returns the range of local columns for each process 5231 5232 Not Collective, unless matrix has not been allocated, then collective on Mat 5233 5234 Input Parameters: 5235 . mat - the matrix 5236 5237 Output Parameters: 5238 . ranges - start of each processors portion plus one more then the total length at the end 5239 5240 Level: beginner 5241 5242 Concepts: matrices^column ownership 5243 5244 .seealso: MatGetOwnershipRange(), MatGetOwnershipRangeColumn(), MatGetOwnershipRanges() 5245 5246 @*/ 5247 PetscErrorCode PETSCMAT_DLLEXPORT MatGetOwnershipRangesColumn(Mat mat,const PetscInt **ranges) 5248 { 5249 PetscErrorCode ierr; 5250 5251 PetscFunctionBegin; 5252 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 5253 PetscValidType(mat,1); 5254 ierr = MatPreallocated(mat);CHKERRQ(ierr); 5255 ierr = PetscLayoutGetRanges(mat->cmap,ranges);CHKERRQ(ierr); 5256 PetscFunctionReturn(0); 5257 } 5258 5259 #undef __FUNCT__ 5260 #define __FUNCT__ "MatILUFactorSymbolic" 5261 /*@C 5262 MatILUFactorSymbolic - Performs symbolic ILU factorization of a matrix. 5263 Uses levels of fill only, not drop tolerance. Use MatLUFactorNumeric() 5264 to complete the factorization. 5265 5266 Collective on Mat 5267 5268 Input Parameters: 5269 + mat - the matrix 5270 . row - row permutation 5271 . column - column permutation 5272 - info - structure containing 5273 $ levels - number of levels of fill. 5274 $ expected fill - as ratio of original fill. 5275 $ 1 or 0 - indicating force fill on diagonal (improves robustness for matrices 5276 missing diagonal entries) 5277 5278 Output Parameters: 5279 . fact - new matrix that has been symbolically factored 5280 5281 Notes: 5282 See the users manual for additional information about 5283 choosing the fill factor for better efficiency. 5284 5285 Most users should employ the simplified KSP interface for linear solvers 5286 instead of working directly with matrix algebra routines such as this. 5287 See, e.g., KSPCreate(). 5288 5289 Level: developer 5290 5291 Concepts: matrices^symbolic LU factorization 5292 Concepts: matrices^factorization 5293 Concepts: LU^symbolic factorization 5294 5295 .seealso: MatLUFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor() 5296 MatGetOrdering(), MatFactorInfo 5297 5298 Developer Note: fortran interface is not autogenerated as the f90 5299 interface defintion cannot be generated correctly [due to MatFactorInfo] 5300 5301 @*/ 5302 PetscErrorCode PETSCMAT_DLLEXPORT MatILUFactorSymbolic(Mat fact,Mat mat,IS row,IS col,const MatFactorInfo *info) 5303 { 5304 PetscErrorCode ierr; 5305 5306 PetscFunctionBegin; 5307 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 5308 PetscValidType(mat,1); 5309 PetscValidHeaderSpecific(row,IS_COOKIE,2); 5310 PetscValidHeaderSpecific(col,IS_COOKIE,3); 5311 PetscValidPointer(info,4); 5312 PetscValidPointer(fact,5); 5313 if (info->levels < 0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Levels of fill negative %D",(PetscInt)info->levels); 5314 if (info->fill < 1.0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Expected fill less than 1.0 %G",info->fill); 5315 if (!(fact)->ops->ilufactorsymbolic) SETERRQ1(PETSC_ERR_SUP,"Matrix type %s symbolic ILU",((PetscObject)mat)->type_name); 5316 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 5317 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 5318 ierr = MatPreallocated(mat);CHKERRQ(ierr); 5319 5320 ierr = PetscLogEventBegin(MAT_ILUFactorSymbolic,mat,row,col,0);CHKERRQ(ierr); 5321 ierr = (fact->ops->ilufactorsymbolic)(fact,mat,row,col,info);CHKERRQ(ierr); 5322 ierr = PetscLogEventEnd(MAT_ILUFactorSymbolic,mat,row,col,0);CHKERRQ(ierr); 5323 PetscFunctionReturn(0); 5324 } 5325 5326 #undef __FUNCT__ 5327 #define __FUNCT__ "MatICCFactorSymbolic" 5328 /*@C 5329 MatICCFactorSymbolic - Performs symbolic incomplete 5330 Cholesky factorization for a symmetric matrix. Use 5331 MatCholeskyFactorNumeric() to complete the factorization. 5332 5333 Collective on Mat 5334 5335 Input Parameters: 5336 + mat - the matrix 5337 . perm - row and column permutation 5338 - info - structure containing 5339 $ levels - number of levels of fill. 5340 $ expected fill - as ratio of original fill. 5341 5342 Output Parameter: 5343 . fact - the factored matrix 5344 5345 Notes: 5346 Most users should employ the KSP interface for linear solvers 5347 instead of working directly with matrix algebra routines such as this. 5348 See, e.g., KSPCreate(). 5349 5350 Level: developer 5351 5352 Concepts: matrices^symbolic incomplete Cholesky factorization 5353 Concepts: matrices^factorization 5354 Concepts: Cholsky^symbolic factorization 5355 5356 .seealso: MatCholeskyFactorNumeric(), MatCholeskyFactor(), MatFactorInfo 5357 5358 Developer Note: fortran interface is not autogenerated as the f90 5359 interface defintion cannot be generated correctly [due to MatFactorInfo] 5360 5361 @*/ 5362 PetscErrorCode PETSCMAT_DLLEXPORT MatICCFactorSymbolic(Mat fact,Mat mat,IS perm,const MatFactorInfo *info) 5363 { 5364 PetscErrorCode ierr; 5365 5366 PetscFunctionBegin; 5367 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 5368 PetscValidType(mat,1); 5369 PetscValidHeaderSpecific(perm,IS_COOKIE,2); 5370 PetscValidPointer(info,3); 5371 PetscValidPointer(fact,4); 5372 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 5373 if (info->levels < 0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Levels negative %D",(PetscInt) info->levels); 5374 if (info->fill < 1.0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Expected fill less than 1.0 %G",info->fill); 5375 if (!(fact)->ops->iccfactorsymbolic) SETERRQ1(PETSC_ERR_SUP,"Matrix type %s symbolic ICC",((PetscObject)mat)->type_name); 5376 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 5377 ierr = MatPreallocated(mat);CHKERRQ(ierr); 5378 5379 ierr = PetscLogEventBegin(MAT_ICCFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr); 5380 ierr = (fact->ops->iccfactorsymbolic)(fact,mat,perm,info);CHKERRQ(ierr); 5381 ierr = PetscLogEventEnd(MAT_ICCFactorSymbolic,mat,perm,0,0);CHKERRQ(ierr); 5382 PetscFunctionReturn(0); 5383 } 5384 5385 #undef __FUNCT__ 5386 #define __FUNCT__ "MatILUDTFactorSymbolic" 5387 /*@ 5388 MatILUDTFactorSymbolic - Performs symbolic pivoting drop-tolerance ILU factorization of a matrix. 5389 User provides the drop tolerance(dt) and the maximum nonzeros to be allowed per row(dtcount). 5390 Use MatILUDTFactorNumeric() to complete the factorization. 5391 5392 Collective on Mat 5393 5394 Input Parameters: 5395 + mat - the matrix 5396 . row - row permutation 5397 . column - column permutation 5398 - info - structure containing 5399 $ dt - drop tolerance. 5400 $ dtcount - maximum nonzeros to be allowed per row. 5401 5402 Output Parameters: 5403 . fact - factor matrix with memory preallocated 5404 5405 Notes: 5406 See the ILUT algorithm written by Yousef Saad. 5407 5408 Most users should employ the simplified KSP interface for linear solvers 5409 instead of working directly with matrix algebra routines such as this. 5410 See, e.g., KSPCreate(). 5411 5412 Level: developer 5413 5414 Concepts: matrices^symbolic ILU factorization 5415 Concepts: matrices^factorization 5416 5417 .seealso: MatILUDTFactorNumeric() 5418 MatGetOrdering(), MatGetFactor(), MatFactorInfo 5419 5420 @*/ 5421 PetscErrorCode PETSCMAT_DLLEXPORT MatILUDTFactorSymbolic(Mat fact,Mat mat,IS row,IS col,const MatFactorInfo *info) 5422 { 5423 PetscErrorCode ierr; 5424 5425 PetscFunctionBegin; 5426 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 5427 PetscValidType(mat,1); 5428 PetscValidHeaderSpecific(row,IS_COOKIE,2); 5429 PetscValidHeaderSpecific(col,IS_COOKIE,3); 5430 PetscValidPointer(info,4); 5431 PetscValidPointer(fact,5); 5432 if (info->dt < 0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"drop tolerance negative %G",(PetscInt)info->dt); 5433 if (info->dtcount < 0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"nonzeros per row %D <0",info->dtcount); 5434 if (!(fact)->ops->iludtfactorsymbolic) SETERRQ1(PETSC_ERR_SUP,"Matrix type %s symbolic ILUDT",((PetscObject)mat)->type_name); 5435 if (mat->rmap->N != mat->cmap->N) SETERRQ(PETSC_ERR_ARG_WRONG,"matrix must be square"); 5436 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 5437 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 5438 ierr = MatPreallocated(mat);CHKERRQ(ierr); 5439 5440 ierr = PetscLogEventBegin(MAT_ILUDTFactorSymbolic,mat,row,col,0);CHKERRQ(ierr); 5441 ierr = (fact->ops->iludtfactorsymbolic)(fact,mat,row,col,info);CHKERRQ(ierr); 5442 ierr = PetscLogEventEnd(MAT_ILUDTFactorSymbolic,mat,row,col,0);CHKERRQ(ierr); 5443 PetscFunctionReturn(0); 5444 } 5445 5446 #undef __FUNCT__ 5447 #define __FUNCT__ "MatILUDTFactorNumeric" 5448 /*@ 5449 MatILUDTFactorNumeric - Performs numeric pivoting drop-tolerance ILU factorization of a matrix. 5450 Call this routine after first calling MatILUDTFactorSymbolic(). 5451 5452 Collective on Mat 5453 5454 Input Parameters: 5455 + fact - the factor matrix obtained with MatGetFactor() 5456 . mat - the matrix 5457 - info - options for factorization 5458 5459 Output Parameters: 5460 . fact - assembled factor matrix 5461 5462 Notes: 5463 Most users should employ the simplified KSP interface for linear solvers 5464 instead of working directly with matrix algebra routines such as this. 5465 See, e.g., KSPCreate(). 5466 5467 Level: developer 5468 5469 .seealso: MatILUDTFactorSymbolic() 5470 @*/ 5471 PetscErrorCode PETSCMAT_DLLEXPORT MatILUDTFactorNumeric(Mat fact,Mat mat,const MatFactorInfo *info) 5472 { 5473 PetscErrorCode ierr; 5474 5475 PetscFunctionBegin; 5476 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 5477 PetscValidType(mat,1); 5478 PetscValidPointer(fact,2); 5479 PetscValidHeaderSpecific(fact,MAT_COOKIE,2); 5480 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 5481 if (mat->rmap->N != (fact)->rmap->N || mat->cmap->N != (fact)->cmap->N) { 5482 SETERRQ4(PETSC_ERR_ARG_SIZ,"Mat mat,Mat fact: global dimensions are different %D should = %D %D should = %D",mat->rmap->N,(fact)->rmap->N,mat->cmap->N,(fact)->cmap->N); 5483 } 5484 if (!(fact)->ops->iludtfactornumeric) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 5485 ierr = MatPreallocated(mat);CHKERRQ(ierr); 5486 ierr = PetscLogEventBegin(MAT_ILUDTFactorNumeric,mat,fact,0,0);CHKERRQ(ierr); 5487 ierr = (fact->ops->iludtfactornumeric)(fact,mat,info);CHKERRQ(ierr); 5488 ierr = PetscLogEventEnd(MAT_ILUDTFactorNumeric,mat,fact,0,0);CHKERRQ(ierr); 5489 5490 ierr = MatView_Private(fact);CHKERRQ(ierr); 5491 ierr = PetscObjectStateIncrease((PetscObject)fact);CHKERRQ(ierr); 5492 PetscFunctionReturn(0); 5493 } 5494 5495 #undef __FUNCT__ 5496 #define __FUNCT__ "MatGetArray" 5497 /*@C 5498 MatGetArray - Returns a pointer to the element values in the matrix. 5499 The result of this routine is dependent on the underlying matrix data 5500 structure, and may not even work for certain matrix types. You MUST 5501 call MatRestoreArray() when you no longer need to access the array. 5502 5503 Not Collective 5504 5505 Input Parameter: 5506 . mat - the matrix 5507 5508 Output Parameter: 5509 . v - the location of the values 5510 5511 5512 Fortran Note: 5513 This routine is used differently from Fortran, e.g., 5514 .vb 5515 Mat mat 5516 PetscScalar mat_array(1) 5517 PetscOffset i_mat 5518 PetscErrorCode ierr 5519 call MatGetArray(mat,mat_array,i_mat,ierr) 5520 5521 C Access first local entry in matrix; note that array is 5522 C treated as one dimensional 5523 value = mat_array(i_mat + 1) 5524 5525 [... other code ...] 5526 call MatRestoreArray(mat,mat_array,i_mat,ierr) 5527 .ve 5528 5529 See the Fortran chapter of the users manual and 5530 petsc/src/mat/examples/tests for details. 5531 5532 Level: advanced 5533 5534 Concepts: matrices^access array 5535 5536 .seealso: MatRestoreArray(), MatGetArrayF90(), MatGetRowIJ() 5537 @*/ 5538 PetscErrorCode PETSCMAT_DLLEXPORT MatGetArray(Mat mat,PetscScalar *v[]) 5539 { 5540 PetscErrorCode ierr; 5541 5542 PetscFunctionBegin; 5543 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 5544 PetscValidType(mat,1); 5545 PetscValidPointer(v,2); 5546 if (!mat->ops->getarray) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 5547 ierr = MatPreallocated(mat);CHKERRQ(ierr); 5548 ierr = (*mat->ops->getarray)(mat,v);CHKERRQ(ierr); 5549 CHKMEMQ; 5550 PetscFunctionReturn(0); 5551 } 5552 5553 #undef __FUNCT__ 5554 #define __FUNCT__ "MatRestoreArray" 5555 /*@C 5556 MatRestoreArray - Restores the matrix after MatGetArray() has been called. 5557 5558 Not Collective 5559 5560 Input Parameter: 5561 + mat - the matrix 5562 - v - the location of the values 5563 5564 Fortran Note: 5565 This routine is used differently from Fortran, e.g., 5566 .vb 5567 Mat mat 5568 PetscScalar mat_array(1) 5569 PetscOffset i_mat 5570 PetscErrorCode ierr 5571 call MatGetArray(mat,mat_array,i_mat,ierr) 5572 5573 C Access first local entry in matrix; note that array is 5574 C treated as one dimensional 5575 value = mat_array(i_mat + 1) 5576 5577 [... other code ...] 5578 call MatRestoreArray(mat,mat_array,i_mat,ierr) 5579 .ve 5580 5581 See the Fortran chapter of the users manual and 5582 petsc/src/mat/examples/tests for details 5583 5584 Level: advanced 5585 5586 .seealso: MatGetArray(), MatRestoreArrayF90() 5587 @*/ 5588 PetscErrorCode PETSCMAT_DLLEXPORT MatRestoreArray(Mat mat,PetscScalar *v[]) 5589 { 5590 PetscErrorCode ierr; 5591 5592 PetscFunctionBegin; 5593 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 5594 PetscValidType(mat,1); 5595 PetscValidPointer(v,2); 5596 #if defined(PETSC_USE_DEBUG) 5597 CHKMEMQ; 5598 #endif 5599 if (!mat->ops->restorearray) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 5600 ierr = (*mat->ops->restorearray)(mat,v);CHKERRQ(ierr); 5601 ierr = PetscObjectStateIncrease((PetscObject)mat);CHKERRQ(ierr); 5602 PetscFunctionReturn(0); 5603 } 5604 5605 #undef __FUNCT__ 5606 #define __FUNCT__ "MatGetSubMatrices" 5607 /*@C 5608 MatGetSubMatrices - Extracts several submatrices from a matrix. If submat 5609 points to an array of valid matrices, they may be reused to store the new 5610 submatrices. 5611 5612 Collective on Mat 5613 5614 Input Parameters: 5615 + mat - the matrix 5616 . n - the number of submatrixes to be extracted (on this processor, may be zero) 5617 . irow, icol - index sets of rows and columns to extract 5618 - scall - either MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX 5619 5620 Output Parameter: 5621 . submat - the array of submatrices 5622 5623 Notes: 5624 MatGetSubMatrices() can extract ONLY sequential submatrices 5625 (from both sequential and parallel matrices). Use MatGetSubMatrix() 5626 to extract a parallel submatrix. 5627 5628 When extracting submatrices from a parallel matrix, each processor can 5629 form a different submatrix by setting the rows and columns of its 5630 individual index sets according to the local submatrix desired. 5631 5632 When finished using the submatrices, the user should destroy 5633 them with MatDestroyMatrices(). 5634 5635 MAT_REUSE_MATRIX can only be used when the nonzero structure of the 5636 original matrix has not changed from that last call to MatGetSubMatrices(). 5637 5638 This routine creates the matrices in submat; you should NOT create them before 5639 calling it. It also allocates the array of matrix pointers submat. 5640 5641 For BAIJ matrices the index sets must respect the block structure, that is if they 5642 request one row/column in a block, they must request all rows/columns that are in 5643 that block. For example, if the block size is 2 you cannot request just row 0 and 5644 column 0. 5645 5646 Fortran Note: 5647 The Fortran interface is slightly different from that given below; it 5648 requires one to pass in as submat a Mat (integer) array of size at least m. 5649 5650 Level: advanced 5651 5652 Concepts: matrices^accessing submatrices 5653 Concepts: submatrices 5654 5655 .seealso: MatDestroyMatrices(), MatGetSubMatrix(), MatGetRow(), MatGetDiagonal(), MatReuse 5656 @*/ 5657 PetscErrorCode PETSCMAT_DLLEXPORT MatGetSubMatrices(Mat mat,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *submat[]) 5658 { 5659 PetscErrorCode ierr; 5660 PetscInt i; 5661 PetscTruth eq; 5662 5663 PetscFunctionBegin; 5664 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 5665 PetscValidType(mat,1); 5666 if (n) { 5667 PetscValidPointer(irow,3); 5668 PetscValidHeaderSpecific(*irow,IS_COOKIE,3); 5669 PetscValidPointer(icol,4); 5670 PetscValidHeaderSpecific(*icol,IS_COOKIE,4); 5671 } 5672 PetscValidPointer(submat,6); 5673 if (n && scall == MAT_REUSE_MATRIX) { 5674 PetscValidPointer(*submat,6); 5675 PetscValidHeaderSpecific(**submat,MAT_COOKIE,6); 5676 } 5677 if (!mat->ops->getsubmatrices) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 5678 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 5679 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 5680 ierr = MatPreallocated(mat);CHKERRQ(ierr); 5681 5682 ierr = PetscLogEventBegin(MAT_GetSubMatrices,mat,0,0,0);CHKERRQ(ierr); 5683 ierr = (*mat->ops->getsubmatrices)(mat,n,irow,icol,scall,submat);CHKERRQ(ierr); 5684 ierr = PetscLogEventEnd(MAT_GetSubMatrices,mat,0,0,0);CHKERRQ(ierr); 5685 for (i=0; i<n; i++) { 5686 if (mat->symmetric || mat->structurally_symmetric || mat->hermitian) { 5687 ierr = ISEqual(irow[i],icol[i],&eq);CHKERRQ(ierr); 5688 if (eq) { 5689 if (mat->symmetric){ 5690 ierr = MatSetOption((*submat)[i],MAT_SYMMETRIC,PETSC_TRUE);CHKERRQ(ierr); 5691 } else if (mat->hermitian) { 5692 ierr = MatSetOption((*submat)[i],MAT_HERMITIAN,PETSC_TRUE);CHKERRQ(ierr); 5693 } else if (mat->structurally_symmetric) { 5694 ierr = MatSetOption((*submat)[i],MAT_STRUCTURALLY_SYMMETRIC,PETSC_TRUE);CHKERRQ(ierr); 5695 } 5696 } 5697 } 5698 } 5699 PetscFunctionReturn(0); 5700 } 5701 5702 #undef __FUNCT__ 5703 #define __FUNCT__ "MatDestroyMatrices" 5704 /*@C 5705 MatDestroyMatrices - Destroys a set of matrices obtained with MatGetSubMatrices(). 5706 5707 Collective on Mat 5708 5709 Input Parameters: 5710 + n - the number of local matrices 5711 - mat - the matrices (note that this is a pointer to the array of matrices, just to match the calling 5712 sequence of MatGetSubMatrices()) 5713 5714 Level: advanced 5715 5716 Notes: Frees not only the matrices, but also the array that contains the matrices 5717 In Fortran will not free the array. 5718 5719 .seealso: MatGetSubMatrices() 5720 @*/ 5721 PetscErrorCode PETSCMAT_DLLEXPORT MatDestroyMatrices(PetscInt n,Mat *mat[]) 5722 { 5723 PetscErrorCode ierr; 5724 PetscInt i; 5725 5726 PetscFunctionBegin; 5727 if (n < 0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Trying to destroy negative number of matrices %D",n); 5728 PetscValidPointer(mat,2); 5729 for (i=0; i<n; i++) { 5730 ierr = MatDestroy((*mat)[i]);CHKERRQ(ierr); 5731 } 5732 /* memory is allocated even if n = 0 */ 5733 ierr = PetscFree(*mat);CHKERRQ(ierr); 5734 PetscFunctionReturn(0); 5735 } 5736 5737 #undef __FUNCT__ 5738 #define __FUNCT__ "MatGetSeqNonzeroStructure" 5739 /*@C 5740 MatGetSeqNonzeroStructure - Extracts the sequential nonzero structure from a matrix. 5741 5742 Collective on Mat 5743 5744 Input Parameters: 5745 . mat - the matrix 5746 5747 Output Parameter: 5748 . matstruct - the sequential matrix with the nonzero structure of mat 5749 5750 Level: intermediate 5751 5752 .seealso: MatDestroySeqNonzeroStructure(), MatGetSubMatrices(), MatDestroyMatrices() 5753 @*/ 5754 PetscErrorCode PETSCMAT_DLLEXPORT MatGetSeqNonzeroStructure(Mat mat,Mat *matstruct) 5755 { 5756 PetscErrorCode ierr; 5757 5758 PetscFunctionBegin; 5759 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 5760 PetscValidPointer(matstruct,2); 5761 5762 PetscValidType(mat,1); 5763 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 5764 ierr = MatPreallocated(mat);CHKERRQ(ierr); 5765 5766 if (!mat->ops->getseqnonzerostructure) SETERRQ1(PETSC_ERR_SUP,"Not for matrix type %s\n",((PetscObject)mat)->type_name); 5767 ierr = PetscLogEventBegin(MAT_GetSeqNonzeroStructure,mat,0,0,0);CHKERRQ(ierr); 5768 ierr = (*mat->ops->getseqnonzerostructure)(mat,matstruct);CHKERRQ(ierr); 5769 ierr = PetscLogEventEnd(MAT_GetSeqNonzeroStructure,mat,0,0,0);CHKERRQ(ierr); 5770 PetscFunctionReturn(0); 5771 } 5772 5773 #undef __FUNCT__ 5774 #define __FUNCT__ "MatDestroySeqNonzeroStructure" 5775 /*@C 5776 MatDestroySeqNonzeroStructure - Destroys matrix obtained with MatGetSeqNonzeroStructure(). 5777 5778 Collective on Mat 5779 5780 Input Parameters: 5781 . mat - the matrix (note that this is a pointer to the array of matrices, just to match the calling 5782 sequence of MatGetSequentialNonzeroStructure()) 5783 5784 Level: advanced 5785 5786 Notes: Frees not only the matrices, but also the array that contains the matrices 5787 5788 .seealso: MatGetSeqNonzeroStructure() 5789 @*/ 5790 PetscErrorCode PETSCMAT_DLLEXPORT MatDestroySeqNonzeroStructure(Mat *mat) 5791 { 5792 PetscErrorCode ierr; 5793 5794 PetscFunctionBegin; 5795 PetscValidPointer(mat,1); 5796 ierr = MatDestroy(*mat);CHKERRQ(ierr); 5797 PetscFunctionReturn(0); 5798 } 5799 5800 #undef __FUNCT__ 5801 #define __FUNCT__ "MatIncreaseOverlap" 5802 /*@ 5803 MatIncreaseOverlap - Given a set of submatrices indicated by index sets, 5804 replaces the index sets by larger ones that represent submatrices with 5805 additional overlap. 5806 5807 Collective on Mat 5808 5809 Input Parameters: 5810 + mat - the matrix 5811 . n - the number of index sets 5812 . is - the array of index sets (these index sets will changed during the call) 5813 - ov - the additional overlap requested 5814 5815 Level: developer 5816 5817 Concepts: overlap 5818 Concepts: ASM^computing overlap 5819 5820 .seealso: MatGetSubMatrices() 5821 @*/ 5822 PetscErrorCode PETSCMAT_DLLEXPORT MatIncreaseOverlap(Mat mat,PetscInt n,IS is[],PetscInt ov) 5823 { 5824 PetscErrorCode ierr; 5825 5826 PetscFunctionBegin; 5827 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 5828 PetscValidType(mat,1); 5829 if (n < 0) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Must have one or more domains, you have %D",n); 5830 if (n) { 5831 PetscValidPointer(is,3); 5832 PetscValidHeaderSpecific(*is,IS_COOKIE,3); 5833 } 5834 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 5835 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 5836 ierr = MatPreallocated(mat);CHKERRQ(ierr); 5837 5838 if (!ov) PetscFunctionReturn(0); 5839 if (!mat->ops->increaseoverlap) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 5840 ierr = PetscLogEventBegin(MAT_IncreaseOverlap,mat,0,0,0);CHKERRQ(ierr); 5841 ierr = (*mat->ops->increaseoverlap)(mat,n,is,ov);CHKERRQ(ierr); 5842 ierr = PetscLogEventEnd(MAT_IncreaseOverlap,mat,0,0,0);CHKERRQ(ierr); 5843 PetscFunctionReturn(0); 5844 } 5845 5846 #undef __FUNCT__ 5847 #define __FUNCT__ "MatGetBlockSize" 5848 /*@ 5849 MatGetBlockSize - Returns the matrix block size; useful especially for the 5850 block row and block diagonal formats. 5851 5852 Not Collective 5853 5854 Input Parameter: 5855 . mat - the matrix 5856 5857 Output Parameter: 5858 . bs - block size 5859 5860 Notes: 5861 Block row formats are MATSEQBAIJ, MATMPIBAIJ, MATSEQSBAIJ, MATMPISBAIJ 5862 5863 Level: intermediate 5864 5865 Concepts: matrices^block size 5866 5867 .seealso: MatCreateSeqBAIJ(), MatCreateMPIBAIJ() 5868 @*/ 5869 PetscErrorCode PETSCMAT_DLLEXPORT MatGetBlockSize(Mat mat,PetscInt *bs) 5870 { 5871 PetscErrorCode ierr; 5872 5873 PetscFunctionBegin; 5874 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 5875 PetscValidType(mat,1); 5876 PetscValidIntPointer(bs,2); 5877 ierr = MatPreallocated(mat);CHKERRQ(ierr); 5878 *bs = mat->rmap->bs; 5879 PetscFunctionReturn(0); 5880 } 5881 5882 #undef __FUNCT__ 5883 #define __FUNCT__ "MatSetBlockSize" 5884 /*@ 5885 MatSetBlockSize - Sets the matrix block size; for many matrix types you 5886 cannot use this and MUST set the blocksize when you preallocate the matrix 5887 5888 Collective on Mat 5889 5890 Input Parameters: 5891 + mat - the matrix 5892 - bs - block size 5893 5894 Notes: 5895 Only works for shell and AIJ matrices 5896 5897 Level: intermediate 5898 5899 Concepts: matrices^block size 5900 5901 .seealso: MatCreateSeqBAIJ(), MatCreateMPIBAIJ(), MatGetBlockSize() 5902 @*/ 5903 PetscErrorCode PETSCMAT_DLLEXPORT MatSetBlockSize(Mat mat,PetscInt bs) 5904 { 5905 PetscErrorCode ierr; 5906 5907 PetscFunctionBegin; 5908 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 5909 PetscValidType(mat,1); 5910 ierr = MatPreallocated(mat);CHKERRQ(ierr); 5911 if (mat->ops->setblocksize) { 5912 /* XXX should check if (bs < 1) ??? */ 5913 ierr = PetscLayoutSetBlockSize(mat->rmap,bs);CHKERRQ(ierr); 5914 ierr = PetscLayoutSetBlockSize(mat->cmap,bs);CHKERRQ(ierr); 5915 ierr = (*mat->ops->setblocksize)(mat,bs);CHKERRQ(ierr); 5916 } else { 5917 SETERRQ1(PETSC_ERR_ARG_INCOMP,"Cannot set the blocksize for matrix type %s",((PetscObject)mat)->type_name); 5918 } 5919 PetscFunctionReturn(0); 5920 } 5921 5922 #undef __FUNCT__ 5923 #define __FUNCT__ "MatGetRowIJ" 5924 /*@C 5925 MatGetRowIJ - Returns the compressed row storage i and j indices for sequential matrices. 5926 5927 Collective on Mat 5928 5929 Input Parameters: 5930 + mat - the matrix 5931 . shift - 0 or 1 indicating we want the indices starting at 0 or 1 5932 . symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be 5933 symmetrized 5934 - inodecompressed - PETSC_TRUE or PETSC_FALSE indicating if the nonzero structure of the 5935 inodes or the nonzero elements is wanted. For BAIJ matrices the compressed version is 5936 always used. 5937 5938 Output Parameters: 5939 + n - number of rows in the (possibly compressed) matrix 5940 . ia - the row pointers [of length n+1] 5941 . ja - the column indices 5942 - done - indicates if the routine actually worked and returned appropriate ia[] and ja[] arrays; callers 5943 are responsible for handling the case when done == PETSC_FALSE and ia and ja are not set 5944 5945 Level: developer 5946 5947 Notes: You CANNOT change any of the ia[] or ja[] values. 5948 5949 Use MatRestoreRowIJ() when you are finished accessing the ia[] and ja[] values 5950 5951 Fortran Node 5952 5953 In Fortran use 5954 $ PetscInt ia(1), ja(1) 5955 $ PetscOffset iia, jja 5956 $ call MatGetRowIJ(mat,shift,symmetric,inodecompressed,n,ia,iia,ja,jja,done,ierr) 5957 $ 5958 $ or 5959 $ 5960 $ PetscScalar, pointer :: xx_v(:) 5961 $ call MatGetRowIJF90(mat,shift,symmetric,inodecompressed,n,ia,ja,done,ierr) 5962 5963 5964 Acess the ith and jth entries via ia(iia + i) and ja(jja + j) 5965 5966 .seealso: MatGetColumnIJ(), MatRestoreRowIJ(), MatGetArray() 5967 @*/ 5968 PetscErrorCode PETSCMAT_DLLEXPORT MatGetRowIJ(Mat mat,PetscInt shift,PetscTruth symmetric,PetscTruth inodecompressed,PetscInt *n,PetscInt *ia[],PetscInt* ja[],PetscTruth *done) 5969 { 5970 PetscErrorCode ierr; 5971 5972 PetscFunctionBegin; 5973 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 5974 PetscValidType(mat,1); 5975 PetscValidIntPointer(n,4); 5976 if (ia) PetscValidIntPointer(ia,5); 5977 if (ja) PetscValidIntPointer(ja,6); 5978 PetscValidIntPointer(done,7); 5979 ierr = MatPreallocated(mat);CHKERRQ(ierr); 5980 if (!mat->ops->getrowij) *done = PETSC_FALSE; 5981 else { 5982 *done = PETSC_TRUE; 5983 ierr = PetscLogEventBegin(MAT_GetRowIJ,mat,0,0,0);CHKERRQ(ierr); 5984 ierr = (*mat->ops->getrowij)(mat,shift,symmetric,inodecompressed,n,ia,ja,done);CHKERRQ(ierr); 5985 ierr = PetscLogEventEnd(MAT_GetRowIJ,mat,0,0,0);CHKERRQ(ierr); 5986 } 5987 PetscFunctionReturn(0); 5988 } 5989 5990 #undef __FUNCT__ 5991 #define __FUNCT__ "MatGetColumnIJ" 5992 /*@C 5993 MatGetColumnIJ - Returns the compressed column storage i and j indices for sequential matrices. 5994 5995 Collective on Mat 5996 5997 Input Parameters: 5998 + mat - the matrix 5999 . shift - 1 or zero indicating we want the indices starting at 0 or 1 6000 . symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be 6001 symmetrized 6002 - inodecompressed - PETSC_TRUE or PETSC_FALSE indicating if the nonzero structure of the 6003 inodes or the nonzero elements is wanted. For BAIJ matrices the compressed version is 6004 always used. 6005 6006 Output Parameters: 6007 + n - number of columns in the (possibly compressed) matrix 6008 . ia - the column pointers 6009 . ja - the row indices 6010 - done - PETSC_TRUE or PETSC_FALSE, indicating whether the values have been returned 6011 6012 Level: developer 6013 6014 .seealso: MatGetRowIJ(), MatRestoreColumnIJ() 6015 @*/ 6016 PetscErrorCode PETSCMAT_DLLEXPORT MatGetColumnIJ(Mat mat,PetscInt shift,PetscTruth symmetric,PetscTruth inodecompressed,PetscInt *n,PetscInt *ia[],PetscInt* ja[],PetscTruth *done) 6017 { 6018 PetscErrorCode ierr; 6019 6020 PetscFunctionBegin; 6021 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 6022 PetscValidType(mat,1); 6023 PetscValidIntPointer(n,4); 6024 if (ia) PetscValidIntPointer(ia,5); 6025 if (ja) PetscValidIntPointer(ja,6); 6026 PetscValidIntPointer(done,7); 6027 ierr = MatPreallocated(mat);CHKERRQ(ierr); 6028 if (!mat->ops->getcolumnij) *done = PETSC_FALSE; 6029 else { 6030 *done = PETSC_TRUE; 6031 ierr = (*mat->ops->getcolumnij)(mat,shift,symmetric,inodecompressed,n,ia,ja,done);CHKERRQ(ierr); 6032 } 6033 PetscFunctionReturn(0); 6034 } 6035 6036 #undef __FUNCT__ 6037 #define __FUNCT__ "MatRestoreRowIJ" 6038 /*@C 6039 MatRestoreRowIJ - Call after you are completed with the ia,ja indices obtained with 6040 MatGetRowIJ(). 6041 6042 Collective on Mat 6043 6044 Input Parameters: 6045 + mat - the matrix 6046 . shift - 1 or zero indicating we want the indices starting at 0 or 1 6047 . symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be 6048 symmetrized 6049 - inodecompressed - PETSC_TRUE or PETSC_FALSE indicating if the nonzero structure of the 6050 inodes or the nonzero elements is wanted. For BAIJ matrices the compressed version is 6051 always used. 6052 6053 Output Parameters: 6054 + n - size of (possibly compressed) matrix 6055 . ia - the row pointers 6056 . ja - the column indices 6057 - done - PETSC_TRUE or PETSC_FALSE indicated that the values have been returned 6058 6059 Level: developer 6060 6061 .seealso: MatGetRowIJ(), MatRestoreColumnIJ() 6062 @*/ 6063 PetscErrorCode PETSCMAT_DLLEXPORT MatRestoreRowIJ(Mat mat,PetscInt shift,PetscTruth symmetric,PetscTruth inodecompressed,PetscInt *n,PetscInt *ia[],PetscInt* ja[],PetscTruth *done) 6064 { 6065 PetscErrorCode ierr; 6066 6067 PetscFunctionBegin; 6068 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 6069 PetscValidType(mat,1); 6070 if (ia) PetscValidIntPointer(ia,5); 6071 if (ja) PetscValidIntPointer(ja,6); 6072 PetscValidIntPointer(done,7); 6073 ierr = MatPreallocated(mat);CHKERRQ(ierr); 6074 6075 if (!mat->ops->restorerowij) *done = PETSC_FALSE; 6076 else { 6077 *done = PETSC_TRUE; 6078 ierr = (*mat->ops->restorerowij)(mat,shift,symmetric,inodecompressed,n,ia,ja,done);CHKERRQ(ierr); 6079 } 6080 PetscFunctionReturn(0); 6081 } 6082 6083 #undef __FUNCT__ 6084 #define __FUNCT__ "MatRestoreColumnIJ" 6085 /*@C 6086 MatRestoreColumnIJ - Call after you are completed with the ia,ja indices obtained with 6087 MatGetColumnIJ(). 6088 6089 Collective on Mat 6090 6091 Input Parameters: 6092 + mat - the matrix 6093 . shift - 1 or zero indicating we want the indices starting at 0 or 1 6094 - symmetric - PETSC_TRUE or PETSC_FALSE indicating the matrix data structure should be 6095 symmetrized 6096 - inodecompressed - PETSC_TRUE or PETSC_FALSE indicating if the nonzero structure of the 6097 inodes or the nonzero elements is wanted. For BAIJ matrices the compressed version is 6098 always used. 6099 6100 Output Parameters: 6101 + n - size of (possibly compressed) matrix 6102 . ia - the column pointers 6103 . ja - the row indices 6104 - done - PETSC_TRUE or PETSC_FALSE indicated that the values have been returned 6105 6106 Level: developer 6107 6108 .seealso: MatGetColumnIJ(), MatRestoreRowIJ() 6109 @*/ 6110 PetscErrorCode PETSCMAT_DLLEXPORT MatRestoreColumnIJ(Mat mat,PetscInt shift,PetscTruth symmetric,PetscTruth inodecompressed,PetscInt *n,PetscInt *ia[],PetscInt* ja[],PetscTruth *done) 6111 { 6112 PetscErrorCode ierr; 6113 6114 PetscFunctionBegin; 6115 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 6116 PetscValidType(mat,1); 6117 if (ia) PetscValidIntPointer(ia,5); 6118 if (ja) PetscValidIntPointer(ja,6); 6119 PetscValidIntPointer(done,7); 6120 ierr = MatPreallocated(mat);CHKERRQ(ierr); 6121 6122 if (!mat->ops->restorecolumnij) *done = PETSC_FALSE; 6123 else { 6124 *done = PETSC_TRUE; 6125 ierr = (*mat->ops->restorecolumnij)(mat,shift,symmetric,inodecompressed,n,ia,ja,done);CHKERRQ(ierr); 6126 } 6127 PetscFunctionReturn(0); 6128 } 6129 6130 #undef __FUNCT__ 6131 #define __FUNCT__ "MatColoringPatch" 6132 /*@C 6133 MatColoringPatch -Used inside matrix coloring routines that 6134 use MatGetRowIJ() and/or MatGetColumnIJ(). 6135 6136 Collective on Mat 6137 6138 Input Parameters: 6139 + mat - the matrix 6140 . ncolors - max color value 6141 . n - number of entries in colorarray 6142 - colorarray - array indicating color for each column 6143 6144 Output Parameters: 6145 . iscoloring - coloring generated using colorarray information 6146 6147 Level: developer 6148 6149 .seealso: MatGetRowIJ(), MatGetColumnIJ() 6150 6151 @*/ 6152 PetscErrorCode PETSCMAT_DLLEXPORT MatColoringPatch(Mat mat,PetscInt ncolors,PetscInt n,ISColoringValue colorarray[],ISColoring *iscoloring) 6153 { 6154 PetscErrorCode ierr; 6155 6156 PetscFunctionBegin; 6157 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 6158 PetscValidType(mat,1); 6159 PetscValidIntPointer(colorarray,4); 6160 PetscValidPointer(iscoloring,5); 6161 ierr = MatPreallocated(mat);CHKERRQ(ierr); 6162 6163 if (!mat->ops->coloringpatch){ 6164 ierr = ISColoringCreate(((PetscObject)mat)->comm,ncolors,n,colorarray,iscoloring);CHKERRQ(ierr); 6165 } else { 6166 ierr = (*mat->ops->coloringpatch)(mat,ncolors,n,colorarray,iscoloring);CHKERRQ(ierr); 6167 } 6168 PetscFunctionReturn(0); 6169 } 6170 6171 6172 #undef __FUNCT__ 6173 #define __FUNCT__ "MatSetUnfactored" 6174 /*@ 6175 MatSetUnfactored - Resets a factored matrix to be treated as unfactored. 6176 6177 Collective on Mat 6178 6179 Input Parameter: 6180 . mat - the factored matrix to be reset 6181 6182 Notes: 6183 This routine should be used only with factored matrices formed by in-place 6184 factorization via ILU(0) (or by in-place LU factorization for the MATSEQDENSE 6185 format). This option can save memory, for example, when solving nonlinear 6186 systems with a matrix-free Newton-Krylov method and a matrix-based, in-place 6187 ILU(0) preconditioner. 6188 6189 Note that one can specify in-place ILU(0) factorization by calling 6190 .vb 6191 PCType(pc,PCILU); 6192 PCFactorSeUseInPlace(pc); 6193 .ve 6194 or by using the options -pc_type ilu -pc_factor_in_place 6195 6196 In-place factorization ILU(0) can also be used as a local 6197 solver for the blocks within the block Jacobi or additive Schwarz 6198 methods (runtime option: -sub_pc_factor_in_place). See the discussion 6199 of these preconditioners in the users manual for details on setting 6200 local solver options. 6201 6202 Most users should employ the simplified KSP interface for linear solvers 6203 instead of working directly with matrix algebra routines such as this. 6204 See, e.g., KSPCreate(). 6205 6206 Level: developer 6207 6208 .seealso: PCFactorSetUseInPlace() 6209 6210 Concepts: matrices^unfactored 6211 6212 @*/ 6213 PetscErrorCode PETSCMAT_DLLEXPORT MatSetUnfactored(Mat mat) 6214 { 6215 PetscErrorCode ierr; 6216 6217 PetscFunctionBegin; 6218 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 6219 PetscValidType(mat,1); 6220 ierr = MatPreallocated(mat);CHKERRQ(ierr); 6221 mat->factor = MAT_FACTOR_NONE; 6222 if (!mat->ops->setunfactored) PetscFunctionReturn(0); 6223 ierr = (*mat->ops->setunfactored)(mat);CHKERRQ(ierr); 6224 PetscFunctionReturn(0); 6225 } 6226 6227 /*MC 6228 MatGetArrayF90 - Accesses a matrix array from Fortran90. 6229 6230 Synopsis: 6231 MatGetArrayF90(Mat x,{Scalar, pointer :: xx_v(:)},integer ierr) 6232 6233 Not collective 6234 6235 Input Parameter: 6236 . x - matrix 6237 6238 Output Parameters: 6239 + xx_v - the Fortran90 pointer to the array 6240 - ierr - error code 6241 6242 Example of Usage: 6243 .vb 6244 PetscScalar, pointer xx_v(:) 6245 .... 6246 call MatGetArrayF90(x,xx_v,ierr) 6247 a = xx_v(3) 6248 call MatRestoreArrayF90(x,xx_v,ierr) 6249 .ve 6250 6251 Notes: 6252 Not yet supported for all F90 compilers 6253 6254 Level: advanced 6255 6256 .seealso: MatRestoreArrayF90(), MatGetArray(), MatRestoreArray() 6257 6258 Concepts: matrices^accessing array 6259 6260 M*/ 6261 6262 /*MC 6263 MatRestoreArrayF90 - Restores a matrix array that has been 6264 accessed with MatGetArrayF90(). 6265 6266 Synopsis: 6267 MatRestoreArrayF90(Mat x,{Scalar, pointer :: xx_v(:)},integer ierr) 6268 6269 Not collective 6270 6271 Input Parameters: 6272 + x - matrix 6273 - xx_v - the Fortran90 pointer to the array 6274 6275 Output Parameter: 6276 . ierr - error code 6277 6278 Example of Usage: 6279 .vb 6280 PetscScalar, pointer xx_v(:) 6281 .... 6282 call MatGetArrayF90(x,xx_v,ierr) 6283 a = xx_v(3) 6284 call MatRestoreArrayF90(x,xx_v,ierr) 6285 .ve 6286 6287 Notes: 6288 Not yet supported for all F90 compilers 6289 6290 Level: advanced 6291 6292 .seealso: MatGetArrayF90(), MatGetArray(), MatRestoreArray() 6293 6294 M*/ 6295 6296 6297 #undef __FUNCT__ 6298 #define __FUNCT__ "MatGetSubMatrix" 6299 /*@ 6300 MatGetSubMatrix - Gets a single submatrix on the same number of processors 6301 as the original matrix. 6302 6303 Collective on Mat 6304 6305 Input Parameters: 6306 + mat - the original matrix 6307 . isrow - parallel IS containing the rows this processor should obtain 6308 . iscol - parallel IS containing all columns you wish to keep 6309 - cll - either MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX 6310 6311 Output Parameter: 6312 . newmat - the new submatrix, of the same type as the old 6313 6314 Level: advanced 6315 6316 Notes: 6317 The submatrix will be able to be multiplied with vectors using the same layout as iscol. 6318 6319 The rows is isrow will be sorted into the same order as the original matrix. 6320 6321 The first time this is called you should use a cll of MAT_INITIAL_MATRIX, 6322 the MatGetSubMatrix() routine will create the newmat for you. Any additional calls 6323 to this routine with a mat of the same nonzero structure and with a call of MAT_REUSE_MATRIX 6324 will reuse the matrix generated the first time. You should call MatDestroy() on newmat when 6325 you are finished using it. 6326 6327 The communicator of the newly obtained matrix is ALWAYS the same as the communicator of 6328 the input matrix. 6329 6330 If iscol is PETSC_NULL then all columns are obtained (not supported in Fortran). 6331 6332 Example usage: 6333 Consider the following 8x8 matrix with 34 non-zero values, that is 6334 assembled across 3 processors. Lets assume that proc0 owns 3 rows, 6335 proc1 owns 3 rows, proc2 owns 2 rows. This division can be shown 6336 as follows: 6337 6338 .vb 6339 1 2 0 | 0 3 0 | 0 4 6340 Proc0 0 5 6 | 7 0 0 | 8 0 6341 9 0 10 | 11 0 0 | 12 0 6342 ------------------------------------- 6343 13 0 14 | 15 16 17 | 0 0 6344 Proc1 0 18 0 | 19 20 21 | 0 0 6345 0 0 0 | 22 23 0 | 24 0 6346 ------------------------------------- 6347 Proc2 25 26 27 | 0 0 28 | 29 0 6348 30 0 0 | 31 32 33 | 0 34 6349 .ve 6350 6351 Suppose isrow = [0 1 | 4 | 5 6] and iscol = [1 2 | 3 4 5 | 6]. The resulting submatrix is 6352 6353 .vb 6354 2 0 | 0 3 0 | 0 6355 Proc0 5 6 | 7 0 0 | 8 6356 ------------------------------- 6357 Proc1 18 0 | 19 20 21 | 0 6358 ------------------------------- 6359 Proc2 26 27 | 0 0 28 | 29 6360 0 0 | 31 32 33 | 0 6361 .ve 6362 6363 6364 Concepts: matrices^submatrices 6365 6366 .seealso: MatGetSubMatrices() 6367 @*/ 6368 PetscErrorCode PETSCMAT_DLLEXPORT MatGetSubMatrix(Mat mat,IS isrow,IS iscol,MatReuse cll,Mat *newmat) 6369 { 6370 PetscErrorCode ierr; 6371 PetscMPIInt size; 6372 Mat *local; 6373 IS iscoltmp; 6374 6375 PetscFunctionBegin; 6376 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 6377 PetscValidHeaderSpecific(isrow,IS_COOKIE,2); 6378 if (iscol) PetscValidHeaderSpecific(iscol,IS_COOKIE,3); 6379 PetscValidPointer(newmat,6); 6380 if (cll == MAT_REUSE_MATRIX) PetscValidHeaderSpecific(*newmat,MAT_COOKIE,6); 6381 PetscValidType(mat,1); 6382 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 6383 ierr = MatPreallocated(mat);CHKERRQ(ierr); 6384 ierr = MPI_Comm_size(((PetscObject)mat)->comm,&size);CHKERRQ(ierr); 6385 6386 if (!iscol) { 6387 ierr = ISCreateStride(((PetscObject)mat)->comm,mat->cmap->n,mat->cmap->rstart,1,&iscoltmp);CHKERRQ(ierr); 6388 } else { 6389 iscoltmp = iscol; 6390 } 6391 6392 /* if original matrix is on just one processor then use submatrix generated */ 6393 if (mat->ops->getsubmatrices && !mat->ops->getsubmatrix && size == 1 && cll == MAT_REUSE_MATRIX) { 6394 ierr = MatGetSubMatrices(mat,1,&isrow,&iscoltmp,MAT_REUSE_MATRIX,&newmat);CHKERRQ(ierr); 6395 if (!iscol) {ierr = ISDestroy(iscoltmp);CHKERRQ(ierr);} 6396 PetscFunctionReturn(0); 6397 } else if (mat->ops->getsubmatrices && !mat->ops->getsubmatrix && size == 1) { 6398 ierr = MatGetSubMatrices(mat,1,&isrow,&iscoltmp,MAT_INITIAL_MATRIX,&local);CHKERRQ(ierr); 6399 *newmat = *local; 6400 ierr = PetscFree(local);CHKERRQ(ierr); 6401 if (!iscol) {ierr = ISDestroy(iscoltmp);CHKERRQ(ierr);} 6402 PetscFunctionReturn(0); 6403 } else if (!mat->ops->getsubmatrix) { 6404 /* Create a new matrix type that implements the operation using the full matrix */ 6405 switch (cll) { 6406 case MAT_INITIAL_MATRIX: 6407 ierr = MatCreateSubMatrix(mat,isrow,iscoltmp,newmat);CHKERRQ(ierr); 6408 break; 6409 case MAT_REUSE_MATRIX: 6410 ierr = MatSubMatrixUpdate(*newmat,mat,isrow,iscoltmp);CHKERRQ(ierr); 6411 break; 6412 default: SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Invalid MatReuse, must be either MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX"); 6413 } 6414 if (!iscol) {ierr = ISDestroy(iscoltmp);CHKERRQ(ierr);} 6415 PetscFunctionReturn(0); 6416 } 6417 6418 if (!mat->ops->getsubmatrix) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 6419 ierr = (*mat->ops->getsubmatrix)(mat,isrow,iscoltmp,cll,newmat);CHKERRQ(ierr); 6420 if (!iscol) {ierr = ISDestroy(iscoltmp);CHKERRQ(ierr);} 6421 ierr = PetscObjectStateIncrease((PetscObject)*newmat);CHKERRQ(ierr); 6422 PetscFunctionReturn(0); 6423 } 6424 6425 #undef __FUNCT__ 6426 #define __FUNCT__ "MatStashSetInitialSize" 6427 /*@ 6428 MatStashSetInitialSize - sets the sizes of the matrix stash, that is 6429 used during the assembly process to store values that belong to 6430 other processors. 6431 6432 Not Collective 6433 6434 Input Parameters: 6435 + mat - the matrix 6436 . size - the initial size of the stash. 6437 - bsize - the initial size of the block-stash(if used). 6438 6439 Options Database Keys: 6440 + -matstash_initial_size <size> or <size0,size1,...sizep-1> 6441 - -matstash_block_initial_size <bsize> or <bsize0,bsize1,...bsizep-1> 6442 6443 Level: intermediate 6444 6445 Notes: 6446 The block-stash is used for values set with MatSetValuesBlocked() while 6447 the stash is used for values set with MatSetValues() 6448 6449 Run with the option -info and look for output of the form 6450 MatAssemblyBegin_MPIXXX:Stash has MM entries, uses nn mallocs. 6451 to determine the appropriate value, MM, to use for size and 6452 MatAssemblyBegin_MPIXXX:Block-Stash has BMM entries, uses nn mallocs. 6453 to determine the value, BMM to use for bsize 6454 6455 Concepts: stash^setting matrix size 6456 Concepts: matrices^stash 6457 6458 .seealso: MatAssemblyBegin(), MatAssemblyEnd(), Mat, MatStashGetInfo() 6459 6460 @*/ 6461 PetscErrorCode PETSCMAT_DLLEXPORT MatStashSetInitialSize(Mat mat,PetscInt size, PetscInt bsize) 6462 { 6463 PetscErrorCode ierr; 6464 6465 PetscFunctionBegin; 6466 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 6467 PetscValidType(mat,1); 6468 ierr = MatStashSetInitialSize_Private(&mat->stash,size);CHKERRQ(ierr); 6469 ierr = MatStashSetInitialSize_Private(&mat->bstash,bsize);CHKERRQ(ierr); 6470 PetscFunctionReturn(0); 6471 } 6472 6473 #undef __FUNCT__ 6474 #define __FUNCT__ "MatInterpolateAdd" 6475 /*@ 6476 MatInterpolateAdd - w = y + A*x or A'*x depending on the shape of 6477 the matrix 6478 6479 Collective on Mat 6480 6481 Input Parameters: 6482 + mat - the matrix 6483 . x,y - the vectors 6484 - w - where the result is stored 6485 6486 Level: intermediate 6487 6488 Notes: 6489 w may be the same vector as y. 6490 6491 This allows one to use either the restriction or interpolation (its transpose) 6492 matrix to do the interpolation 6493 6494 Concepts: interpolation 6495 6496 .seealso: MatMultAdd(), MatMultTransposeAdd(), MatRestrict() 6497 6498 @*/ 6499 PetscErrorCode PETSCMAT_DLLEXPORT MatInterpolateAdd(Mat A,Vec x,Vec y,Vec w) 6500 { 6501 PetscErrorCode ierr; 6502 PetscInt M,N; 6503 6504 PetscFunctionBegin; 6505 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 6506 PetscValidHeaderSpecific(x,VEC_COOKIE,2); 6507 PetscValidHeaderSpecific(y,VEC_COOKIE,3); 6508 PetscValidHeaderSpecific(w,VEC_COOKIE,4); 6509 PetscValidType(A,1); 6510 ierr = MatPreallocated(A);CHKERRQ(ierr); 6511 ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr); 6512 if (N > M) { 6513 ierr = MatMultTransposeAdd(A,x,y,w);CHKERRQ(ierr); 6514 } else { 6515 ierr = MatMultAdd(A,x,y,w);CHKERRQ(ierr); 6516 } 6517 PetscFunctionReturn(0); 6518 } 6519 6520 #undef __FUNCT__ 6521 #define __FUNCT__ "MatInterpolate" 6522 /*@ 6523 MatInterpolate - y = A*x or A'*x depending on the shape of 6524 the matrix 6525 6526 Collective on Mat 6527 6528 Input Parameters: 6529 + mat - the matrix 6530 - x,y - the vectors 6531 6532 Level: intermediate 6533 6534 Notes: 6535 This allows one to use either the restriction or interpolation (its transpose) 6536 matrix to do the interpolation 6537 6538 Concepts: matrices^interpolation 6539 6540 .seealso: MatMultAdd(), MatMultTransposeAdd(), MatRestrict() 6541 6542 @*/ 6543 PetscErrorCode PETSCMAT_DLLEXPORT MatInterpolate(Mat A,Vec x,Vec y) 6544 { 6545 PetscErrorCode ierr; 6546 PetscInt M,N; 6547 6548 PetscFunctionBegin; 6549 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 6550 PetscValidHeaderSpecific(x,VEC_COOKIE,2); 6551 PetscValidHeaderSpecific(y,VEC_COOKIE,3); 6552 PetscValidType(A,1); 6553 ierr = MatPreallocated(A);CHKERRQ(ierr); 6554 ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr); 6555 if (N > M) { 6556 ierr = MatMultTranspose(A,x,y);CHKERRQ(ierr); 6557 } else { 6558 ierr = MatMult(A,x,y);CHKERRQ(ierr); 6559 } 6560 PetscFunctionReturn(0); 6561 } 6562 6563 #undef __FUNCT__ 6564 #define __FUNCT__ "MatRestrict" 6565 /*@ 6566 MatRestrict - y = A*x or A'*x 6567 6568 Collective on Mat 6569 6570 Input Parameters: 6571 + mat - the matrix 6572 - x,y - the vectors 6573 6574 Level: intermediate 6575 6576 Notes: 6577 This allows one to use either the restriction or interpolation (its transpose) 6578 matrix to do the restriction 6579 6580 Concepts: matrices^restriction 6581 6582 .seealso: MatMultAdd(), MatMultTransposeAdd(), MatInterpolate() 6583 6584 @*/ 6585 PetscErrorCode PETSCMAT_DLLEXPORT MatRestrict(Mat A,Vec x,Vec y) 6586 { 6587 PetscErrorCode ierr; 6588 PetscInt M,N; 6589 6590 PetscFunctionBegin; 6591 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 6592 PetscValidHeaderSpecific(x,VEC_COOKIE,2); 6593 PetscValidHeaderSpecific(y,VEC_COOKIE,3); 6594 PetscValidType(A,1); 6595 ierr = MatPreallocated(A);CHKERRQ(ierr); 6596 6597 ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr); 6598 if (N > M) { 6599 ierr = MatMult(A,x,y);CHKERRQ(ierr); 6600 } else { 6601 ierr = MatMultTranspose(A,x,y);CHKERRQ(ierr); 6602 } 6603 PetscFunctionReturn(0); 6604 } 6605 6606 #undef __FUNCT__ 6607 #define __FUNCT__ "MatNullSpaceAttach" 6608 /*@ 6609 MatNullSpaceAttach - attaches a null space to a matrix. 6610 This null space will be removed from the resulting vector whenever 6611 MatMult() is called 6612 6613 Collective on Mat 6614 6615 Input Parameters: 6616 + mat - the matrix 6617 - nullsp - the null space object 6618 6619 Level: developer 6620 6621 Notes: 6622 Overwrites any previous null space that may have been attached 6623 6624 Concepts: null space^attaching to matrix 6625 6626 .seealso: MatCreate(), MatNullSpaceCreate() 6627 @*/ 6628 PetscErrorCode PETSCMAT_DLLEXPORT MatNullSpaceAttach(Mat mat,MatNullSpace nullsp) 6629 { 6630 PetscErrorCode ierr; 6631 6632 PetscFunctionBegin; 6633 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 6634 PetscValidType(mat,1); 6635 PetscValidHeaderSpecific(nullsp,MAT_NULLSPACE_COOKIE,2); 6636 ierr = MatPreallocated(mat);CHKERRQ(ierr); 6637 ierr = PetscObjectReference((PetscObject)nullsp);CHKERRQ(ierr); 6638 if (mat->nullsp) { ierr = MatNullSpaceDestroy(mat->nullsp);CHKERRQ(ierr); } 6639 mat->nullsp = nullsp; 6640 PetscFunctionReturn(0); 6641 } 6642 6643 #undef __FUNCT__ 6644 #define __FUNCT__ "MatICCFactor" 6645 /*@C 6646 MatICCFactor - Performs in-place incomplete Cholesky factorization of matrix. 6647 6648 Collective on Mat 6649 6650 Input Parameters: 6651 + mat - the matrix 6652 . row - row/column permutation 6653 . fill - expected fill factor >= 1.0 6654 - level - level of fill, for ICC(k) 6655 6656 Notes: 6657 Probably really in-place only when level of fill is zero, otherwise allocates 6658 new space to store factored matrix and deletes previous memory. 6659 6660 Most users should employ the simplified KSP interface for linear solvers 6661 instead of working directly with matrix algebra routines such as this. 6662 See, e.g., KSPCreate(). 6663 6664 Level: developer 6665 6666 Concepts: matrices^incomplete Cholesky factorization 6667 Concepts: Cholesky factorization 6668 6669 .seealso: MatICCFactorSymbolic(), MatLUFactorNumeric(), MatCholeskyFactor() 6670 6671 Developer Note: fortran interface is not autogenerated as the f90 6672 interface defintion cannot be generated correctly [due to MatFactorInfo] 6673 6674 @*/ 6675 PetscErrorCode PETSCMAT_DLLEXPORT MatICCFactor(Mat mat,IS row,const MatFactorInfo* info) 6676 { 6677 PetscErrorCode ierr; 6678 6679 PetscFunctionBegin; 6680 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 6681 PetscValidType(mat,1); 6682 if (row) PetscValidHeaderSpecific(row,IS_COOKIE,2); 6683 PetscValidPointer(info,3); 6684 if (mat->rmap->N != mat->cmap->N) SETERRQ(PETSC_ERR_ARG_WRONG,"matrix must be square"); 6685 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 6686 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 6687 if (!mat->ops->iccfactor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 6688 ierr = MatPreallocated(mat);CHKERRQ(ierr); 6689 ierr = (*mat->ops->iccfactor)(mat,row,info);CHKERRQ(ierr); 6690 ierr = PetscObjectStateIncrease((PetscObject)mat);CHKERRQ(ierr); 6691 PetscFunctionReturn(0); 6692 } 6693 6694 #undef __FUNCT__ 6695 #define __FUNCT__ "MatSetValuesAdic" 6696 /*@ 6697 MatSetValuesAdic - Sets values computed with ADIC automatic differentiation into a matrix. 6698 6699 Not Collective 6700 6701 Input Parameters: 6702 + mat - the matrix 6703 - v - the values compute with ADIC 6704 6705 Level: developer 6706 6707 Notes: 6708 Must call MatSetColoring() before using this routine. Also this matrix must already 6709 have its nonzero pattern determined. 6710 6711 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal(), 6712 MatSetValues(), MatSetColoring(), MatSetValuesAdifor() 6713 @*/ 6714 PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesAdic(Mat mat,void *v) 6715 { 6716 PetscErrorCode ierr; 6717 6718 PetscFunctionBegin; 6719 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 6720 PetscValidType(mat,1); 6721 PetscValidPointer(mat,2); 6722 6723 if (!mat->assembled) { 6724 SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Matrix must be already assembled"); 6725 } 6726 ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 6727 if (!mat->ops->setvaluesadic) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 6728 ierr = (*mat->ops->setvaluesadic)(mat,v);CHKERRQ(ierr); 6729 ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 6730 ierr = MatView_Private(mat);CHKERRQ(ierr); 6731 ierr = PetscObjectStateIncrease((PetscObject)mat);CHKERRQ(ierr); 6732 PetscFunctionReturn(0); 6733 } 6734 6735 6736 #undef __FUNCT__ 6737 #define __FUNCT__ "MatSetColoring" 6738 /*@ 6739 MatSetColoring - Sets a coloring used by calls to MatSetValuesAdic() 6740 6741 Not Collective 6742 6743 Input Parameters: 6744 + mat - the matrix 6745 - coloring - the coloring 6746 6747 Level: developer 6748 6749 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal(), 6750 MatSetValues(), MatSetValuesAdic() 6751 @*/ 6752 PetscErrorCode PETSCMAT_DLLEXPORT MatSetColoring(Mat mat,ISColoring coloring) 6753 { 6754 PetscErrorCode ierr; 6755 6756 PetscFunctionBegin; 6757 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 6758 PetscValidType(mat,1); 6759 PetscValidPointer(coloring,2); 6760 6761 if (!mat->assembled) { 6762 SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Matrix must be already assembled"); 6763 } 6764 if (!mat->ops->setcoloring) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 6765 ierr = (*mat->ops->setcoloring)(mat,coloring);CHKERRQ(ierr); 6766 PetscFunctionReturn(0); 6767 } 6768 6769 #undef __FUNCT__ 6770 #define __FUNCT__ "MatSetValuesAdifor" 6771 /*@ 6772 MatSetValuesAdifor - Sets values computed with automatic differentiation into a matrix. 6773 6774 Not Collective 6775 6776 Input Parameters: 6777 + mat - the matrix 6778 . nl - leading dimension of v 6779 - v - the values compute with ADIFOR 6780 6781 Level: developer 6782 6783 Notes: 6784 Must call MatSetColoring() before using this routine. Also this matrix must already 6785 have its nonzero pattern determined. 6786 6787 .seealso: MatSetOption(), MatAssemblyBegin(), MatAssemblyEnd(), MatSetValuesBlocked(), MatSetValuesLocal(), 6788 MatSetValues(), MatSetColoring() 6789 @*/ 6790 PetscErrorCode PETSCMAT_DLLEXPORT MatSetValuesAdifor(Mat mat,PetscInt nl,void *v) 6791 { 6792 PetscErrorCode ierr; 6793 6794 PetscFunctionBegin; 6795 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 6796 PetscValidType(mat,1); 6797 PetscValidPointer(v,3); 6798 6799 if (!mat->assembled) { 6800 SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Matrix must be already assembled"); 6801 } 6802 ierr = PetscLogEventBegin(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 6803 if (!mat->ops->setvaluesadifor) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 6804 ierr = (*mat->ops->setvaluesadifor)(mat,nl,v);CHKERRQ(ierr); 6805 ierr = PetscLogEventEnd(MAT_SetValues,mat,0,0,0);CHKERRQ(ierr); 6806 ierr = PetscObjectStateIncrease((PetscObject)mat);CHKERRQ(ierr); 6807 PetscFunctionReturn(0); 6808 } 6809 6810 #undef __FUNCT__ 6811 #define __FUNCT__ "MatDiagonalScaleLocal" 6812 /*@ 6813 MatDiagonalScaleLocal - Scales columns of a matrix given the scaling values including the 6814 ghosted ones. 6815 6816 Not Collective 6817 6818 Input Parameters: 6819 + mat - the matrix 6820 - diag = the diagonal values, including ghost ones 6821 6822 Level: developer 6823 6824 Notes: Works only for MPIAIJ and MPIBAIJ matrices 6825 6826 .seealso: MatDiagonalScale() 6827 @*/ 6828 PetscErrorCode PETSCMAT_DLLEXPORT MatDiagonalScaleLocal(Mat mat,Vec diag) 6829 { 6830 PetscErrorCode ierr; 6831 PetscMPIInt size; 6832 6833 PetscFunctionBegin; 6834 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 6835 PetscValidHeaderSpecific(diag,VEC_COOKIE,2); 6836 PetscValidType(mat,1); 6837 6838 if (!mat->assembled) { 6839 SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Matrix must be already assembled"); 6840 } 6841 ierr = PetscLogEventBegin(MAT_Scale,mat,0,0,0);CHKERRQ(ierr); 6842 ierr = MPI_Comm_size(((PetscObject)mat)->comm,&size);CHKERRQ(ierr); 6843 if (size == 1) { 6844 PetscInt n,m; 6845 ierr = VecGetSize(diag,&n);CHKERRQ(ierr); 6846 ierr = MatGetSize(mat,0,&m);CHKERRQ(ierr); 6847 if (m == n) { 6848 ierr = MatDiagonalScale(mat,0,diag);CHKERRQ(ierr); 6849 } else { 6850 SETERRQ(PETSC_ERR_SUP,"Only supported for sequential matrices when no ghost points/periodic conditions"); 6851 } 6852 } else { 6853 PetscErrorCode (*f)(Mat,Vec); 6854 ierr = PetscObjectQueryFunction((PetscObject)mat,"MatDiagonalScaleLocal_C",(void (**)(void))&f);CHKERRQ(ierr); 6855 if (f) { 6856 ierr = (*f)(mat,diag);CHKERRQ(ierr); 6857 } else { 6858 SETERRQ(PETSC_ERR_SUP,"Only supported for MPIAIJ and MPIBAIJ parallel matrices"); 6859 } 6860 } 6861 ierr = PetscLogEventEnd(MAT_Scale,mat,0,0,0);CHKERRQ(ierr); 6862 ierr = PetscObjectStateIncrease((PetscObject)mat);CHKERRQ(ierr); 6863 PetscFunctionReturn(0); 6864 } 6865 6866 #undef __FUNCT__ 6867 #define __FUNCT__ "MatGetInertia" 6868 /*@ 6869 MatGetInertia - Gets the inertia from a factored matrix 6870 6871 Collective on Mat 6872 6873 Input Parameter: 6874 . mat - the matrix 6875 6876 Output Parameters: 6877 + nneg - number of negative eigenvalues 6878 . nzero - number of zero eigenvalues 6879 - npos - number of positive eigenvalues 6880 6881 Level: advanced 6882 6883 Notes: Matrix must have been factored by MatCholeskyFactor() 6884 6885 6886 @*/ 6887 PetscErrorCode PETSCMAT_DLLEXPORT MatGetInertia(Mat mat,PetscInt *nneg,PetscInt *nzero,PetscInt *npos) 6888 { 6889 PetscErrorCode ierr; 6890 6891 PetscFunctionBegin; 6892 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 6893 PetscValidType(mat,1); 6894 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 6895 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Numeric factor mat is not assembled"); 6896 if (!mat->ops->getinertia) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 6897 ierr = (*mat->ops->getinertia)(mat,nneg,nzero,npos);CHKERRQ(ierr); 6898 PetscFunctionReturn(0); 6899 } 6900 6901 /* ----------------------------------------------------------------*/ 6902 #undef __FUNCT__ 6903 #define __FUNCT__ "MatSolves" 6904 /*@C 6905 MatSolves - Solves A x = b, given a factored matrix, for a collection of vectors 6906 6907 Collective on Mat and Vecs 6908 6909 Input Parameters: 6910 + mat - the factored matrix 6911 - b - the right-hand-side vectors 6912 6913 Output Parameter: 6914 . x - the result vectors 6915 6916 Notes: 6917 The vectors b and x cannot be the same. I.e., one cannot 6918 call MatSolves(A,x,x). 6919 6920 Notes: 6921 Most users should employ the simplified KSP interface for linear solvers 6922 instead of working directly with matrix algebra routines such as this. 6923 See, e.g., KSPCreate(). 6924 6925 Level: developer 6926 6927 Concepts: matrices^triangular solves 6928 6929 .seealso: MatSolveAdd(), MatSolveTranspose(), MatSolveTransposeAdd(), MatSolve() 6930 @*/ 6931 PetscErrorCode PETSCMAT_DLLEXPORT MatSolves(Mat mat,Vecs b,Vecs x) 6932 { 6933 PetscErrorCode ierr; 6934 6935 PetscFunctionBegin; 6936 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 6937 PetscValidType(mat,1); 6938 if (x == b) SETERRQ(PETSC_ERR_ARG_IDN,"x and b must be different vectors"); 6939 if (!mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Unfactored matrix"); 6940 if (!mat->rmap->N && !mat->cmap->N) PetscFunctionReturn(0); 6941 6942 if (!mat->ops->solves) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 6943 ierr = MatPreallocated(mat);CHKERRQ(ierr); 6944 ierr = PetscLogEventBegin(MAT_Solves,mat,0,0,0);CHKERRQ(ierr); 6945 ierr = (*mat->ops->solves)(mat,b,x);CHKERRQ(ierr); 6946 ierr = PetscLogEventEnd(MAT_Solves,mat,0,0,0);CHKERRQ(ierr); 6947 PetscFunctionReturn(0); 6948 } 6949 6950 #undef __FUNCT__ 6951 #define __FUNCT__ "MatIsSymmetric" 6952 /*@ 6953 MatIsSymmetric - Test whether a matrix is symmetric 6954 6955 Collective on Mat 6956 6957 Input Parameter: 6958 + A - the matrix to test 6959 - tol - difference between value and its transpose less than this amount counts as equal (use 0.0 for exact transpose) 6960 6961 Output Parameters: 6962 . flg - the result 6963 6964 Level: intermediate 6965 6966 Concepts: matrix^symmetry 6967 6968 .seealso: MatTranspose(), MatIsTranspose(), MatIsHermitian(), MatIsStructurallySymmetric(), MatSetOption(), MatIsSymmetricKnown() 6969 @*/ 6970 PetscErrorCode PETSCMAT_DLLEXPORT MatIsSymmetric(Mat A,PetscReal tol,PetscTruth *flg) 6971 { 6972 PetscErrorCode ierr; 6973 6974 PetscFunctionBegin; 6975 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 6976 PetscValidPointer(flg,2); 6977 6978 if (!A->symmetric_set) { 6979 if (!A->ops->issymmetric) { 6980 const MatType mattype; 6981 ierr = MatGetType(A,&mattype);CHKERRQ(ierr); 6982 SETERRQ1(PETSC_ERR_SUP,"Matrix of type <%s> does not support checking for symmetric",mattype); 6983 } 6984 ierr = (*A->ops->issymmetric)(A,tol,flg);CHKERRQ(ierr); 6985 if (!tol) { 6986 A->symmetric_set = PETSC_TRUE; 6987 A->symmetric = *flg; 6988 if (A->symmetric) { 6989 A->structurally_symmetric_set = PETSC_TRUE; 6990 A->structurally_symmetric = PETSC_TRUE; 6991 } 6992 } 6993 } else if (A->symmetric) { 6994 *flg = PETSC_TRUE; 6995 } else if (!tol) { 6996 *flg = PETSC_FALSE; 6997 } else { 6998 if (!A->ops->issymmetric) { 6999 const MatType mattype; 7000 ierr = MatGetType(A,&mattype);CHKERRQ(ierr); 7001 SETERRQ1(PETSC_ERR_SUP,"Matrix of type <%s> does not support checking for symmetric",mattype); 7002 } 7003 ierr = (*A->ops->issymmetric)(A,tol,flg);CHKERRQ(ierr); 7004 } 7005 PetscFunctionReturn(0); 7006 } 7007 7008 #undef __FUNCT__ 7009 #define __FUNCT__ "MatIsHermitian" 7010 /*@ 7011 MatIsHermitian - Test whether a matrix is Hermitian 7012 7013 Collective on Mat 7014 7015 Input Parameter: 7016 + A - the matrix to test 7017 - tol - difference between value and its transpose less than this amount counts as equal (use 0.0 for exact Hermitian) 7018 7019 Output Parameters: 7020 . flg - the result 7021 7022 Level: intermediate 7023 7024 Concepts: matrix^symmetry 7025 7026 .seealso: MatTranspose(), MatIsTranspose(), MatIsHermitian(), MatIsStructurallySymmetric(), MatSetOption(), MatIsSymmetricKnown() 7027 @*/ 7028 PetscErrorCode PETSCMAT_DLLEXPORT MatIsHermitian(Mat A,PetscReal tol,PetscTruth *flg) 7029 { 7030 PetscErrorCode ierr; 7031 7032 PetscFunctionBegin; 7033 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 7034 PetscValidPointer(flg,2); 7035 7036 if (!A->hermitian_set) { 7037 if (!A->ops->ishermitian) { 7038 const MatType mattype; 7039 ierr = MatGetType(A,&mattype);CHKERRQ(ierr); 7040 SETERRQ1(PETSC_ERR_SUP,"Matrix of type <%s> does not support checking for hermitian",mattype); 7041 } 7042 ierr = (*A->ops->ishermitian)(A,tol,flg);CHKERRQ(ierr); 7043 if (!tol) { 7044 A->hermitian_set = PETSC_TRUE; 7045 A->hermitian = *flg; 7046 if (A->hermitian) { 7047 A->structurally_symmetric_set = PETSC_TRUE; 7048 A->structurally_symmetric = PETSC_TRUE; 7049 } 7050 } 7051 } else if (A->hermitian) { 7052 *flg = PETSC_TRUE; 7053 } else if (!tol) { 7054 *flg = PETSC_FALSE; 7055 } else { 7056 if (!A->ops->ishermitian) { 7057 const MatType mattype; 7058 ierr = MatGetType(A,&mattype);CHKERRQ(ierr); 7059 SETERRQ1(PETSC_ERR_SUP,"Matrix of type <%s> does not support checking for hermitian",mattype); 7060 } 7061 ierr = (*A->ops->ishermitian)(A,tol,flg);CHKERRQ(ierr); 7062 } 7063 PetscFunctionReturn(0); 7064 } 7065 7066 #undef __FUNCT__ 7067 #define __FUNCT__ "MatIsSymmetricKnown" 7068 /*@ 7069 MatIsSymmetricKnown - Checks the flag on the matrix to see if it is symmetric. 7070 7071 Collective on Mat 7072 7073 Input Parameter: 7074 . A - the matrix to check 7075 7076 Output Parameters: 7077 + set - if the symmetric flag is set (this tells you if the next flag is valid) 7078 - flg - the result 7079 7080 Level: advanced 7081 7082 Concepts: matrix^symmetry 7083 7084 Note: Does not check the matrix values directly, so this may return unknown (set = PETSC_FALSE). Use MatIsSymmetric() 7085 if you want it explicitly checked 7086 7087 .seealso: MatTranspose(), MatIsTranspose(), MatIsHermitian(), MatIsStructurallySymmetric(), MatSetOption(), MatIsSymmetric() 7088 @*/ 7089 PetscErrorCode PETSCMAT_DLLEXPORT MatIsSymmetricKnown(Mat A,PetscTruth *set,PetscTruth *flg) 7090 { 7091 PetscFunctionBegin; 7092 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 7093 PetscValidPointer(set,2); 7094 PetscValidPointer(flg,3); 7095 if (A->symmetric_set) { 7096 *set = PETSC_TRUE; 7097 *flg = A->symmetric; 7098 } else { 7099 *set = PETSC_FALSE; 7100 } 7101 PetscFunctionReturn(0); 7102 } 7103 7104 #undef __FUNCT__ 7105 #define __FUNCT__ "MatIsHermitianKnown" 7106 /*@ 7107 MatIsHermitianKnown - Checks the flag on the matrix to see if it is hermitian. 7108 7109 Collective on Mat 7110 7111 Input Parameter: 7112 . A - the matrix to check 7113 7114 Output Parameters: 7115 + set - if the hermitian flag is set (this tells you if the next flag is valid) 7116 - flg - the result 7117 7118 Level: advanced 7119 7120 Concepts: matrix^symmetry 7121 7122 Note: Does not check the matrix values directly, so this may return unknown (set = PETSC_FALSE). Use MatIsHermitian() 7123 if you want it explicitly checked 7124 7125 .seealso: MatTranspose(), MatIsTranspose(), MatIsHermitian(), MatIsStructurallySymmetric(), MatSetOption(), MatIsSymmetric() 7126 @*/ 7127 PetscErrorCode PETSCMAT_DLLEXPORT MatIsHermitianKnown(Mat A,PetscTruth *set,PetscTruth *flg) 7128 { 7129 PetscFunctionBegin; 7130 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 7131 PetscValidPointer(set,2); 7132 PetscValidPointer(flg,3); 7133 if (A->hermitian_set) { 7134 *set = PETSC_TRUE; 7135 *flg = A->hermitian; 7136 } else { 7137 *set = PETSC_FALSE; 7138 } 7139 PetscFunctionReturn(0); 7140 } 7141 7142 #undef __FUNCT__ 7143 #define __FUNCT__ "MatIsStructurallySymmetric" 7144 /*@ 7145 MatIsStructurallySymmetric - Test whether a matrix is structurally symmetric 7146 7147 Collective on Mat 7148 7149 Input Parameter: 7150 . A - the matrix to test 7151 7152 Output Parameters: 7153 . flg - the result 7154 7155 Level: intermediate 7156 7157 Concepts: matrix^symmetry 7158 7159 .seealso: MatTranspose(), MatIsTranspose(), MatIsHermitian(), MatIsSymmetric(), MatSetOption() 7160 @*/ 7161 PetscErrorCode PETSCMAT_DLLEXPORT MatIsStructurallySymmetric(Mat A,PetscTruth *flg) 7162 { 7163 PetscErrorCode ierr; 7164 7165 PetscFunctionBegin; 7166 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 7167 PetscValidPointer(flg,2); 7168 if (!A->structurally_symmetric_set) { 7169 if (!A->ops->isstructurallysymmetric) SETERRQ(PETSC_ERR_SUP,"Matrix does not support checking for structural symmetric"); 7170 ierr = (*A->ops->isstructurallysymmetric)(A,&A->structurally_symmetric);CHKERRQ(ierr); 7171 A->structurally_symmetric_set = PETSC_TRUE; 7172 } 7173 *flg = A->structurally_symmetric; 7174 PetscFunctionReturn(0); 7175 } 7176 7177 #undef __FUNCT__ 7178 #define __FUNCT__ "MatStashGetInfo" 7179 extern PetscErrorCode MatStashGetInfo_Private(MatStash*,PetscInt*,PetscInt*); 7180 /*@ 7181 MatStashGetInfo - Gets how many values are currently in the vector stash, i.e. need 7182 to be communicated to other processors during the MatAssemblyBegin/End() process 7183 7184 Not collective 7185 7186 Input Parameter: 7187 . vec - the vector 7188 7189 Output Parameters: 7190 + nstash - the size of the stash 7191 . reallocs - the number of additional mallocs incurred. 7192 . bnstash - the size of the block stash 7193 - breallocs - the number of additional mallocs incurred.in the block stash 7194 7195 Level: advanced 7196 7197 .seealso: MatAssemblyBegin(), MatAssemblyEnd(), Mat, MatStashSetInitialSize() 7198 7199 @*/ 7200 PetscErrorCode PETSCMAT_DLLEXPORT MatStashGetInfo(Mat mat,PetscInt *nstash,PetscInt *reallocs,PetscInt *bnstash,PetscInt *breallocs) 7201 { 7202 PetscErrorCode ierr; 7203 PetscFunctionBegin; 7204 ierr = MatStashGetInfo_Private(&mat->stash,nstash,reallocs);CHKERRQ(ierr); 7205 ierr = MatStashGetInfo_Private(&mat->bstash,bnstash,breallocs);CHKERRQ(ierr); 7206 PetscFunctionReturn(0); 7207 } 7208 7209 #undef __FUNCT__ 7210 #define __FUNCT__ "MatGetVecs" 7211 /*@C 7212 MatGetVecs - Get vector(s) compatible with the matrix, i.e. with the same 7213 parallel layout 7214 7215 Collective on Mat 7216 7217 Input Parameter: 7218 . mat - the matrix 7219 7220 Output Parameter: 7221 + right - (optional) vector that the matrix can be multiplied against 7222 - left - (optional) vector that the matrix vector product can be stored in 7223 7224 Level: advanced 7225 7226 .seealso: MatCreate() 7227 @*/ 7228 PetscErrorCode PETSCMAT_DLLEXPORT MatGetVecs(Mat mat,Vec *right,Vec *left) 7229 { 7230 PetscErrorCode ierr; 7231 7232 PetscFunctionBegin; 7233 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 7234 PetscValidType(mat,1); 7235 ierr = MatPreallocated(mat);CHKERRQ(ierr); 7236 if (mat->ops->getvecs) { 7237 ierr = (*mat->ops->getvecs)(mat,right,left);CHKERRQ(ierr); 7238 } else { 7239 PetscMPIInt size; 7240 ierr = MPI_Comm_size(((PetscObject)mat)->comm, &size);CHKERRQ(ierr); 7241 if (right) { 7242 ierr = VecCreate(((PetscObject)mat)->comm,right);CHKERRQ(ierr); 7243 ierr = VecSetSizes(*right,mat->cmap->n,PETSC_DETERMINE);CHKERRQ(ierr); 7244 ierr = VecSetBlockSize(*right,mat->rmap->bs);CHKERRQ(ierr); 7245 if (size > 1) { 7246 /* New vectors uses Mat cmap and does not create a new one */ 7247 ierr = PetscLayoutDestroy((*right)->map);CHKERRQ(ierr); 7248 (*right)->map = mat->cmap; 7249 mat->cmap->refcnt++; 7250 7251 ierr = VecSetType(*right,VECMPI);CHKERRQ(ierr); 7252 } else {ierr = VecSetType(*right,VECSEQ);CHKERRQ(ierr);} 7253 } 7254 if (left) { 7255 ierr = VecCreate(((PetscObject)mat)->comm,left);CHKERRQ(ierr); 7256 ierr = VecSetSizes(*left,mat->rmap->n,PETSC_DETERMINE);CHKERRQ(ierr); 7257 ierr = VecSetBlockSize(*left,mat->rmap->bs);CHKERRQ(ierr); 7258 if (size > 1) { 7259 /* New vectors uses Mat rmap and does not create a new one */ 7260 ierr = PetscLayoutDestroy((*left)->map);CHKERRQ(ierr); 7261 (*left)->map = mat->rmap; 7262 mat->rmap->refcnt++; 7263 7264 ierr = VecSetType(*left,VECMPI);CHKERRQ(ierr); 7265 } else {ierr = VecSetType(*left,VECSEQ);CHKERRQ(ierr);} 7266 } 7267 } 7268 if (mat->mapping) { 7269 if (right) {ierr = VecSetLocalToGlobalMapping(*right,mat->mapping);CHKERRQ(ierr);} 7270 if (left) {ierr = VecSetLocalToGlobalMapping(*left,mat->mapping);CHKERRQ(ierr);} 7271 } 7272 if (mat->bmapping) { 7273 if (right) {ierr = VecSetLocalToGlobalMappingBlock(*right,mat->bmapping);CHKERRQ(ierr);} 7274 if (left) {ierr = VecSetLocalToGlobalMappingBlock(*left,mat->bmapping);CHKERRQ(ierr);} 7275 } 7276 PetscFunctionReturn(0); 7277 } 7278 7279 #undef __FUNCT__ 7280 #define __FUNCT__ "MatFactorInfoInitialize" 7281 /*@C 7282 MatFactorInfoInitialize - Initializes a MatFactorInfo data structure 7283 with default values. 7284 7285 Not Collective 7286 7287 Input Parameters: 7288 . info - the MatFactorInfo data structure 7289 7290 7291 Notes: The solvers are generally used through the KSP and PC objects, for example 7292 PCLU, PCILU, PCCHOLESKY, PCICC 7293 7294 Level: developer 7295 7296 .seealso: MatFactorInfo 7297 7298 Developer Note: fortran interface is not autogenerated as the f90 7299 interface defintion cannot be generated correctly [due to MatFactorInfo] 7300 7301 @*/ 7302 7303 PetscErrorCode PETSCMAT_DLLEXPORT MatFactorInfoInitialize(MatFactorInfo *info) 7304 { 7305 PetscErrorCode ierr; 7306 7307 PetscFunctionBegin; 7308 ierr = PetscMemzero(info,sizeof(MatFactorInfo));CHKERRQ(ierr); 7309 PetscFunctionReturn(0); 7310 } 7311 7312 #undef __FUNCT__ 7313 #define __FUNCT__ "MatPtAP" 7314 /*@ 7315 MatPtAP - Creates the matrix projection C = P^T * A * P 7316 7317 Collective on Mat 7318 7319 Input Parameters: 7320 + A - the matrix 7321 . P - the projection matrix 7322 . scall - either MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX 7323 - fill - expected fill as ratio of nnz(C)/nnz(A) 7324 7325 Output Parameters: 7326 . C - the product matrix 7327 7328 Notes: 7329 C will be created and must be destroyed by the user with MatDestroy(). 7330 7331 This routine is currently only implemented for pairs of AIJ matrices and classes 7332 which inherit from AIJ. 7333 7334 Level: intermediate 7335 7336 .seealso: MatPtAPSymbolic(), MatPtAPNumeric(), MatMatMult() 7337 @*/ 7338 PetscErrorCode PETSCMAT_DLLEXPORT MatPtAP(Mat A,Mat P,MatReuse scall,PetscReal fill,Mat *C) 7339 { 7340 PetscErrorCode ierr; 7341 7342 PetscFunctionBegin; 7343 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 7344 PetscValidType(A,1); 7345 if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 7346 if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 7347 PetscValidHeaderSpecific(P,MAT_COOKIE,2); 7348 PetscValidType(P,2); 7349 ierr = MatPreallocated(P);CHKERRQ(ierr); 7350 if (!P->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 7351 if (P->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 7352 PetscValidPointer(C,3); 7353 if (P->rmap->N!=A->cmap->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Matrix dimensions are incompatible, %D != %D",P->rmap->N,A->cmap->N); 7354 if (fill < 1.0) SETERRQ1(PETSC_ERR_ARG_SIZ,"Expected fill=%G must be >= 1.0",fill); 7355 ierr = MatPreallocated(A);CHKERRQ(ierr); 7356 7357 ierr = PetscLogEventBegin(MAT_PtAP,A,P,0,0);CHKERRQ(ierr); 7358 ierr = (*A->ops->ptap)(A,P,scall,fill,C);CHKERRQ(ierr); 7359 ierr = PetscLogEventEnd(MAT_PtAP,A,P,0,0);CHKERRQ(ierr); 7360 7361 PetscFunctionReturn(0); 7362 } 7363 7364 #undef __FUNCT__ 7365 #define __FUNCT__ "MatPtAPNumeric" 7366 /*@ 7367 MatPtAPNumeric - Computes the matrix projection C = P^T * A * P 7368 7369 Collective on Mat 7370 7371 Input Parameters: 7372 + A - the matrix 7373 - P - the projection matrix 7374 7375 Output Parameters: 7376 . C - the product matrix 7377 7378 Notes: 7379 C must have been created by calling MatPtAPSymbolic and must be destroyed by 7380 the user using MatDeatroy(). 7381 7382 This routine is currently only implemented for pairs of AIJ matrices and classes 7383 which inherit from AIJ. C will be of type MATAIJ. 7384 7385 Level: intermediate 7386 7387 .seealso: MatPtAP(), MatPtAPSymbolic(), MatMatMultNumeric() 7388 @*/ 7389 PetscErrorCode PETSCMAT_DLLEXPORT MatPtAPNumeric(Mat A,Mat P,Mat C) 7390 { 7391 PetscErrorCode ierr; 7392 7393 PetscFunctionBegin; 7394 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 7395 PetscValidType(A,1); 7396 if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 7397 if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 7398 PetscValidHeaderSpecific(P,MAT_COOKIE,2); 7399 PetscValidType(P,2); 7400 ierr = MatPreallocated(P);CHKERRQ(ierr); 7401 if (!P->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 7402 if (P->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 7403 PetscValidHeaderSpecific(C,MAT_COOKIE,3); 7404 PetscValidType(C,3); 7405 ierr = MatPreallocated(C);CHKERRQ(ierr); 7406 if (C->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 7407 if (P->cmap->N!=C->rmap->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Matrix dimensions are incompatible, %D != %D",P->cmap->N,C->rmap->N); 7408 if (P->rmap->N!=A->cmap->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Matrix dimensions are incompatible, %D != %D",P->rmap->N,A->cmap->N); 7409 if (A->rmap->N!=A->cmap->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Matrix 'A' must be square, %D != %D",A->rmap->N,A->cmap->N); 7410 if (P->cmap->N!=C->cmap->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Matrix dimensions are incompatible, %D != %D",P->cmap->N,C->cmap->N); 7411 ierr = MatPreallocated(A);CHKERRQ(ierr); 7412 7413 ierr = PetscLogEventBegin(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr); 7414 ierr = (*A->ops->ptapnumeric)(A,P,C);CHKERRQ(ierr); 7415 ierr = PetscLogEventEnd(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr); 7416 PetscFunctionReturn(0); 7417 } 7418 7419 #undef __FUNCT__ 7420 #define __FUNCT__ "MatPtAPSymbolic" 7421 /*@ 7422 MatPtAPSymbolic - Creates the (i,j) structure of the matrix projection C = P^T * A * P 7423 7424 Collective on Mat 7425 7426 Input Parameters: 7427 + A - the matrix 7428 - P - the projection matrix 7429 7430 Output Parameters: 7431 . C - the (i,j) structure of the product matrix 7432 7433 Notes: 7434 C will be created and must be destroyed by the user with MatDestroy(). 7435 7436 This routine is currently only implemented for pairs of SeqAIJ matrices and classes 7437 which inherit from SeqAIJ. C will be of type MATSEQAIJ. The product is computed using 7438 this (i,j) structure by calling MatPtAPNumeric(). 7439 7440 Level: intermediate 7441 7442 .seealso: MatPtAP(), MatPtAPNumeric(), MatMatMultSymbolic() 7443 @*/ 7444 PetscErrorCode PETSCMAT_DLLEXPORT MatPtAPSymbolic(Mat A,Mat P,PetscReal fill,Mat *C) 7445 { 7446 PetscErrorCode ierr; 7447 7448 PetscFunctionBegin; 7449 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 7450 PetscValidType(A,1); 7451 if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 7452 if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 7453 if (fill <1.0) SETERRQ1(PETSC_ERR_ARG_SIZ,"Expected fill=%G must be >= 1.0",fill); 7454 PetscValidHeaderSpecific(P,MAT_COOKIE,2); 7455 PetscValidType(P,2); 7456 ierr = MatPreallocated(P);CHKERRQ(ierr); 7457 if (!P->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 7458 if (P->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 7459 PetscValidPointer(C,3); 7460 7461 if (P->rmap->N!=A->cmap->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Matrix dimensions are incompatible, %D != %D",P->rmap->N,A->cmap->N); 7462 if (A->rmap->N!=A->cmap->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Matrix 'A' must be square, %D != %D",A->rmap->N,A->cmap->N); 7463 ierr = MatPreallocated(A);CHKERRQ(ierr); 7464 ierr = PetscLogEventBegin(MAT_PtAPSymbolic,A,P,0,0);CHKERRQ(ierr); 7465 ierr = (*A->ops->ptapsymbolic)(A,P,fill,C);CHKERRQ(ierr); 7466 ierr = PetscLogEventEnd(MAT_PtAPSymbolic,A,P,0,0);CHKERRQ(ierr); 7467 7468 ierr = MatSetBlockSize(*C,A->rmap->bs);CHKERRQ(ierr); 7469 7470 PetscFunctionReturn(0); 7471 } 7472 7473 #undef __FUNCT__ 7474 #define __FUNCT__ "MatMatMult" 7475 /*@ 7476 MatMatMult - Performs Matrix-Matrix Multiplication C=A*B. 7477 7478 Collective on Mat 7479 7480 Input Parameters: 7481 + A - the left matrix 7482 . B - the right matrix 7483 . scall - either MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX 7484 - fill - expected fill as ratio of nnz(C)/(nnz(A) + nnz(B)), use PETSC_DEFAULT if you do not have a good estimate 7485 if the result is a dense matrix this is irrelevent 7486 7487 Output Parameters: 7488 . C - the product matrix 7489 7490 Notes: 7491 Unless scall is MAT_REUSE_MATRIX C will be created. 7492 7493 MAT_REUSE_MATRIX can only be used if the matrices A and B have the same nonzero pattern as in the previous call 7494 7495 To determine the correct fill value, run with -info and search for the string "Fill ratio" to see the value 7496 actually needed. 7497 7498 If you have many matrices with the same non-zero structure to multiply, you 7499 should either 7500 $ 1) use MAT_REUSE_MATRIX in all calls but the first or 7501 $ 2) call MatMatMultSymbolic() once and then MatMatMultNumeric() for each product needed 7502 7503 Level: intermediate 7504 7505 .seealso: MatMatMultSymbolic(), MatMatMultNumeric(), MatPtAP() 7506 @*/ 7507 PetscErrorCode PETSCMAT_DLLEXPORT MatMatMult(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 7508 { 7509 PetscErrorCode ierr; 7510 PetscErrorCode (*fA)(Mat,Mat,MatReuse,PetscReal,Mat*); 7511 PetscErrorCode (*fB)(Mat,Mat,MatReuse,PetscReal,Mat*); 7512 PetscErrorCode (*mult)(Mat,Mat,MatReuse,PetscReal,Mat *)=PETSC_NULL; 7513 7514 PetscFunctionBegin; 7515 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 7516 PetscValidType(A,1); 7517 if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 7518 if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 7519 PetscValidHeaderSpecific(B,MAT_COOKIE,2); 7520 PetscValidType(B,2); 7521 ierr = MatPreallocated(B);CHKERRQ(ierr); 7522 if (!B->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 7523 if (B->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 7524 PetscValidPointer(C,3); 7525 if (B->rmap->N!=A->cmap->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Matrix dimensions are incompatible, %D != %D",B->rmap->N,A->cmap->N); 7526 if (scall == MAT_REUSE_MATRIX){ 7527 PetscValidPointer(*C,5); 7528 PetscValidHeaderSpecific(*C,MAT_COOKIE,5); 7529 } 7530 if (fill == PETSC_DEFAULT || fill == PETSC_DECIDE) fill = 2.0; 7531 if (fill < 1.0) SETERRQ1(PETSC_ERR_ARG_SIZ,"Expected fill=%G must be >= 1.0",fill); 7532 ierr = MatPreallocated(A);CHKERRQ(ierr); 7533 7534 fA = A->ops->matmult; 7535 fB = B->ops->matmult; 7536 if (fB == fA) { 7537 if (!fB) SETERRQ1(PETSC_ERR_SUP,"MatMatMult not supported for B of type %s",((PetscObject)B)->type_name); 7538 mult = fB; 7539 } else { 7540 /* dispatch based on the type of A and B */ 7541 char multname[256]; 7542 ierr = PetscStrcpy(multname,"MatMatMult_");CHKERRQ(ierr); 7543 ierr = PetscStrcat(multname,((PetscObject)A)->type_name);CHKERRQ(ierr); 7544 ierr = PetscStrcat(multname,"_");CHKERRQ(ierr); 7545 ierr = PetscStrcat(multname,((PetscObject)B)->type_name);CHKERRQ(ierr); 7546 ierr = PetscStrcat(multname,"_C");CHKERRQ(ierr); /* e.g., multname = "MatMatMult_seqdense_seqaij_C" */ 7547 ierr = PetscObjectQueryFunction((PetscObject)B,multname,(void (**)(void))&mult);CHKERRQ(ierr); 7548 if (!mult) SETERRQ2(PETSC_ERR_ARG_INCOMP,"MatMatMult requires A, %s, to be compatible with B, %s",((PetscObject)A)->type_name,((PetscObject)B)->type_name); 7549 } 7550 ierr = PetscLogEventBegin(MAT_MatMult,A,B,0,0);CHKERRQ(ierr); 7551 ierr = (*mult)(A,B,scall,fill,C);CHKERRQ(ierr); 7552 ierr = PetscLogEventEnd(MAT_MatMult,A,B,0,0);CHKERRQ(ierr); 7553 PetscFunctionReturn(0); 7554 } 7555 7556 #undef __FUNCT__ 7557 #define __FUNCT__ "MatMatMultSymbolic" 7558 /*@ 7559 MatMatMultSymbolic - Performs construction, preallocation, and computes the ij structure 7560 of the matrix-matrix product C=A*B. Call this routine before calling MatMatMultNumeric(). 7561 7562 Collective on Mat 7563 7564 Input Parameters: 7565 + A - the left matrix 7566 . B - the right matrix 7567 - fill - expected fill as ratio of nnz(C)/(nnz(A) + nnz(B)), use PETSC_DEFAULT if you do not have a good estimate, 7568 if C is a dense matrix this is irrelevent 7569 7570 Output Parameters: 7571 . C - the product matrix 7572 7573 Notes: 7574 Unless scall is MAT_REUSE_MATRIX C will be created. 7575 7576 To determine the correct fill value, run with -info and search for the string "Fill ratio" to see the value 7577 actually needed. 7578 7579 This routine is currently implemented for 7580 - pairs of AIJ matrices and classes which inherit from AIJ, C will be of type AIJ 7581 - pairs of AIJ (A) and Dense (B) matrix, C will be of type Dense. 7582 - pairs of Dense (A) and AIJ (B) matrix, C will be of type Dense. 7583 7584 Level: intermediate 7585 7586 .seealso: MatMatMult(), MatMatMultNumeric() 7587 @*/ 7588 PetscErrorCode PETSCMAT_DLLEXPORT MatMatMultSymbolic(Mat A,Mat B,PetscReal fill,Mat *C) 7589 { 7590 PetscErrorCode ierr; 7591 PetscErrorCode (*Asymbolic)(Mat,Mat,PetscReal,Mat *); 7592 PetscErrorCode (*Bsymbolic)(Mat,Mat,PetscReal,Mat *); 7593 PetscErrorCode (*symbolic)(Mat,Mat,PetscReal,Mat *)=PETSC_NULL; 7594 7595 PetscFunctionBegin; 7596 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 7597 PetscValidType(A,1); 7598 if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 7599 if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 7600 7601 PetscValidHeaderSpecific(B,MAT_COOKIE,2); 7602 PetscValidType(B,2); 7603 ierr = MatPreallocated(B);CHKERRQ(ierr); 7604 if (!B->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 7605 if (B->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 7606 PetscValidPointer(C,3); 7607 7608 if (B->rmap->N!=A->cmap->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Matrix dimensions are incompatible, %D != %D",B->rmap->N,A->cmap->N); 7609 if (fill == PETSC_DEFAULT) fill = 2.0; 7610 if (fill < 1.0) SETERRQ1(PETSC_ERR_ARG_SIZ,"Expected fill=%G must be > 1.0",fill); 7611 ierr = MatPreallocated(A);CHKERRQ(ierr); 7612 7613 Asymbolic = A->ops->matmultsymbolic; 7614 Bsymbolic = B->ops->matmultsymbolic; 7615 if (Asymbolic == Bsymbolic){ 7616 if (!Bsymbolic) SETERRQ1(PETSC_ERR_SUP,"C=A*B not implemented for B of type %s",((PetscObject)B)->type_name); 7617 symbolic = Bsymbolic; 7618 } else { /* dispatch based on the type of A and B */ 7619 char symbolicname[256]; 7620 ierr = PetscStrcpy(symbolicname,"MatMatMultSymbolic_");CHKERRQ(ierr); 7621 ierr = PetscStrcat(symbolicname,((PetscObject)A)->type_name);CHKERRQ(ierr); 7622 ierr = PetscStrcat(symbolicname,"_");CHKERRQ(ierr); 7623 ierr = PetscStrcat(symbolicname,((PetscObject)B)->type_name);CHKERRQ(ierr); 7624 ierr = PetscStrcat(symbolicname,"_C");CHKERRQ(ierr); 7625 ierr = PetscObjectQueryFunction((PetscObject)B,symbolicname,(void (**)(void))&symbolic);CHKERRQ(ierr); 7626 if (!symbolic) SETERRQ2(PETSC_ERR_ARG_INCOMP,"MatMatMultSymbolic requires A, %s, to be compatible with B, %s",((PetscObject)A)->type_name,((PetscObject)B)->type_name); 7627 } 7628 ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 7629 ierr = (*symbolic)(A,B,fill,C);CHKERRQ(ierr); 7630 ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 7631 PetscFunctionReturn(0); 7632 } 7633 7634 #undef __FUNCT__ 7635 #define __FUNCT__ "MatMatMultNumeric" 7636 /*@ 7637 MatMatMultNumeric - Performs the numeric matrix-matrix product. 7638 Call this routine after first calling MatMatMultSymbolic(). 7639 7640 Collective on Mat 7641 7642 Input Parameters: 7643 + A - the left matrix 7644 - B - the right matrix 7645 7646 Output Parameters: 7647 . C - the product matrix, which was created by from MatMatMultSymbolic() or a call to MatMatMult(). 7648 7649 Notes: 7650 C must have been created with MatMatMultSymbolic(). 7651 7652 This routine is currently implemented for 7653 - pairs of AIJ matrices and classes which inherit from AIJ, C will be of type MATAIJ. 7654 - pairs of AIJ (A) and Dense (B) matrix, C will be of type Dense. 7655 - pairs of Dense (A) and AIJ (B) matrix, C will be of type Dense. 7656 7657 Level: intermediate 7658 7659 .seealso: MatMatMult(), MatMatMultSymbolic() 7660 @*/ 7661 PetscErrorCode PETSCMAT_DLLEXPORT MatMatMultNumeric(Mat A,Mat B,Mat C) 7662 { 7663 PetscErrorCode ierr; 7664 PetscErrorCode (*Anumeric)(Mat,Mat,Mat); 7665 PetscErrorCode (*Bnumeric)(Mat,Mat,Mat); 7666 PetscErrorCode (*numeric)(Mat,Mat,Mat)=PETSC_NULL; 7667 7668 PetscFunctionBegin; 7669 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 7670 PetscValidType(A,1); 7671 if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 7672 if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 7673 7674 PetscValidHeaderSpecific(B,MAT_COOKIE,2); 7675 PetscValidType(B,2); 7676 ierr = MatPreallocated(B);CHKERRQ(ierr); 7677 if (!B->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 7678 if (B->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 7679 7680 PetscValidHeaderSpecific(C,MAT_COOKIE,3); 7681 PetscValidType(C,3); 7682 ierr = MatPreallocated(C);CHKERRQ(ierr); 7683 if (!C->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 7684 if (C->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 7685 7686 if (B->cmap->N!=C->cmap->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Matrix dimensions are incompatible, %D != %D",B->cmap->N,C->cmap->N); 7687 if (B->rmap->N!=A->cmap->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Matrix dimensions are incompatible, %D != %D",B->rmap->N,A->cmap->N); 7688 if (A->rmap->N!=C->rmap->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Matrix dimensions are incompatible, %D != %D",A->rmap->N,C->rmap->N); 7689 ierr = MatPreallocated(A);CHKERRQ(ierr); 7690 7691 Anumeric = A->ops->matmultnumeric; 7692 Bnumeric = B->ops->matmultnumeric; 7693 if (Anumeric == Bnumeric){ 7694 if (!Bnumeric) SETERRQ1(PETSC_ERR_SUP,"MatMatMultNumeric not supported for B of type %s",((PetscObject)B)->type_name); 7695 numeric = Bnumeric; 7696 } else { 7697 char numericname[256]; 7698 ierr = PetscStrcpy(numericname,"MatMatMultNumeric_");CHKERRQ(ierr); 7699 ierr = PetscStrcat(numericname,((PetscObject)A)->type_name);CHKERRQ(ierr); 7700 ierr = PetscStrcat(numericname,"_");CHKERRQ(ierr); 7701 ierr = PetscStrcat(numericname,((PetscObject)B)->type_name);CHKERRQ(ierr); 7702 ierr = PetscStrcat(numericname,"_C");CHKERRQ(ierr); 7703 ierr = PetscObjectQueryFunction((PetscObject)B,numericname,(void (**)(void))&numeric);CHKERRQ(ierr); 7704 if (!numeric) 7705 SETERRQ2(PETSC_ERR_ARG_INCOMP,"MatMatMultNumeric requires A, %s, to be compatible with B, %s",((PetscObject)A)->type_name,((PetscObject)B)->type_name); 7706 } 7707 ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 7708 ierr = (*numeric)(A,B,C);CHKERRQ(ierr); 7709 ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 7710 PetscFunctionReturn(0); 7711 } 7712 7713 #undef __FUNCT__ 7714 #define __FUNCT__ "MatMatMultTranspose" 7715 /*@ 7716 MatMatMultTranspose - Performs Matrix-Matrix Multiplication C=A^T*B. 7717 7718 Collective on Mat 7719 7720 Input Parameters: 7721 + A - the left matrix 7722 . B - the right matrix 7723 . scall - either MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX 7724 - fill - expected fill as ratio of nnz(C)/(nnz(A) + nnz(B)), use PETSC_DEFAULT if not known 7725 7726 Output Parameters: 7727 . C - the product matrix 7728 7729 Notes: 7730 C will be created if MAT_INITIAL_MATRIX and must be destroyed by the user with MatDestroy(). 7731 7732 MAT_REUSE_MATRIX can only be used if the matrices A and B have the same nonzero pattern as in the previous call 7733 7734 To determine the correct fill value, run with -info and search for the string "Fill ratio" to see the value 7735 actually needed. 7736 7737 This routine is currently only implemented for pairs of SeqAIJ matrices and pairs of SeqDense matrices and classes 7738 which inherit from SeqAIJ. C will be of type MATSEQAIJ. 7739 7740 Level: intermediate 7741 7742 .seealso: MatMatMultTransposeSymbolic(), MatMatMultTransposeNumeric(), MatPtAP() 7743 @*/ 7744 PetscErrorCode PETSCMAT_DLLEXPORT MatMatMultTranspose(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 7745 { 7746 PetscErrorCode ierr; 7747 PetscErrorCode (*fA)(Mat,Mat,MatReuse,PetscReal,Mat*); 7748 PetscErrorCode (*fB)(Mat,Mat,MatReuse,PetscReal,Mat*); 7749 7750 PetscFunctionBegin; 7751 PetscValidHeaderSpecific(A,MAT_COOKIE,1); 7752 PetscValidType(A,1); 7753 if (!A->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 7754 if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 7755 PetscValidHeaderSpecific(B,MAT_COOKIE,2); 7756 PetscValidType(B,2); 7757 ierr = MatPreallocated(B);CHKERRQ(ierr); 7758 if (!B->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 7759 if (B->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 7760 PetscValidPointer(C,3); 7761 if (B->rmap->N!=A->rmap->N) SETERRQ2(PETSC_ERR_ARG_SIZ,"Matrix dimensions are incompatible, %D != %D",B->rmap->N,A->rmap->N); 7762 if (fill == PETSC_DEFAULT || fill == PETSC_DECIDE) fill = 2.0; 7763 if (fill < 1.0) SETERRQ1(PETSC_ERR_ARG_SIZ,"Expected fill=%G must be > 1.0",fill); 7764 ierr = MatPreallocated(A);CHKERRQ(ierr); 7765 7766 fA = A->ops->matmulttranspose; 7767 if (!fA) SETERRQ1(PETSC_ERR_SUP,"MatMatMultTranspose not supported for A of type %s",((PetscObject)A)->type_name); 7768 fB = B->ops->matmulttranspose; 7769 if (!fB) SETERRQ1(PETSC_ERR_SUP,"MatMatMultTranspose not supported for B of type %s",((PetscObject)B)->type_name); 7770 if (fB!=fA) SETERRQ2(PETSC_ERR_ARG_INCOMP,"MatMatMultTranspose requires A, %s, to be compatible with B, %s",((PetscObject)A)->type_name,((PetscObject)B)->type_name); 7771 7772 ierr = PetscLogEventBegin(MAT_MatMultTranspose,A,B,0,0);CHKERRQ(ierr); 7773 ierr = (*A->ops->matmulttranspose)(A,B,scall,fill,C);CHKERRQ(ierr); 7774 ierr = PetscLogEventEnd(MAT_MatMultTranspose,A,B,0,0);CHKERRQ(ierr); 7775 7776 PetscFunctionReturn(0); 7777 } 7778 7779 #undef __FUNCT__ 7780 #define __FUNCT__ "MatGetRedundantMatrix" 7781 /*@C 7782 MatGetRedundantMatrix - Create redundant matrices and put them into processors of subcommunicators. 7783 7784 Collective on Mat 7785 7786 Input Parameters: 7787 + mat - the matrix 7788 . nsubcomm - the number of subcommunicators (= number of redundant pareallel or sequential matrices) 7789 . subcomm - MPI communicator split from the communicator where mat resides in 7790 . mlocal_red - number of local rows of the redundant matrix 7791 - reuse - either MAT_INITIAL_MATRIX or MAT_REUSE_MATRIX 7792 7793 Output Parameter: 7794 . matredundant - redundant matrix 7795 7796 Notes: 7797 MAT_REUSE_MATRIX can only be used when the nonzero structure of the 7798 original matrix has not changed from that last call to MatGetRedundantMatrix(). 7799 7800 This routine creates the duplicated matrices in subcommunicators; you should NOT create them before 7801 calling it. 7802 7803 Only MPIAIJ matrix is supported. 7804 7805 Level: advanced 7806 7807 Concepts: subcommunicator 7808 Concepts: duplicate matrix 7809 7810 .seealso: MatDestroy() 7811 @*/ 7812 PetscErrorCode PETSCMAT_DLLEXPORT MatGetRedundantMatrix(Mat mat,PetscInt nsubcomm,MPI_Comm subcomm,PetscInt mlocal_red,MatReuse reuse,Mat *matredundant) 7813 { 7814 PetscErrorCode ierr; 7815 7816 PetscFunctionBegin; 7817 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 7818 if (nsubcomm && reuse == MAT_REUSE_MATRIX) { 7819 PetscValidPointer(*matredundant,6); 7820 PetscValidHeaderSpecific(*matredundant,MAT_COOKIE,6); 7821 } 7822 if (!mat->ops->getredundantmatrix) SETERRQ1(PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); 7823 if (!mat->assembled) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for unassembled matrix"); 7824 if (mat->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 7825 ierr = MatPreallocated(mat);CHKERRQ(ierr); 7826 7827 ierr = PetscLogEventBegin(MAT_GetRedundantMatrix,mat,0,0,0);CHKERRQ(ierr); 7828 ierr = (*mat->ops->getredundantmatrix)(mat,nsubcomm,subcomm,mlocal_red,reuse,matredundant);CHKERRQ(ierr); 7829 ierr = PetscLogEventEnd(MAT_GetRedundantMatrix,mat,0,0,0);CHKERRQ(ierr); 7830 PetscFunctionReturn(0); 7831 } 7832