1 #define PETSCTS_DLL 2 3 #include "src/ts/tsimpl.h" /*I "petscts.h" I*/ 4 5 /* Logging support */ 6 PetscCookie PETSCTS_DLLEXPORT TS_COOKIE = 0; 7 PetscEvent TS_Step = 0, TS_PseudoComputeTimeStep = 0, TS_FunctionEval = 0, TS_JacobianEval = 0; 8 9 #undef __FUNCT__ 10 #define __FUNCT__ "TSSetTypeFromOptions" 11 /* 12 TSSetTypeFromOptions - Sets the type of ts from user options. 13 14 Collective on TS 15 16 Input Parameter: 17 . ts - The ts 18 19 Level: intermediate 20 21 .keywords: TS, set, options, database, type 22 .seealso: TSSetFromOptions(), TSSetType() 23 */ 24 static PetscErrorCode TSSetTypeFromOptions(TS ts) 25 { 26 PetscTruth opt; 27 const char *defaultType; 28 char typeName[256]; 29 PetscErrorCode ierr; 30 31 PetscFunctionBegin; 32 if (ts->type_name) { 33 defaultType = ts->type_name; 34 } else { 35 defaultType = TS_EULER; 36 } 37 38 if (!TSRegisterAllCalled) { 39 ierr = TSRegisterAll(PETSC_NULL);CHKERRQ(ierr); 40 } 41 ierr = PetscOptionsList("-ts_type", "TS method"," TSSetType", TSList, defaultType, typeName, 256, &opt);CHKERRQ(ierr); 42 if (opt) { 43 ierr = TSSetType(ts, typeName);CHKERRQ(ierr); 44 } else { 45 ierr = TSSetType(ts, defaultType);CHKERRQ(ierr); 46 } 47 PetscFunctionReturn(0); 48 } 49 50 #undef __FUNCT__ 51 #define __FUNCT__ "TSSetFromOptions" 52 /*@ 53 TSSetFromOptions - Sets various TS parameters from user options. 54 55 Collective on TS 56 57 Input Parameter: 58 . ts - the TS context obtained from TSCreate() 59 60 Options Database Keys: 61 + -ts_type <type> - TS_EULER, TS_BEULER, TS_SUNDIALS, TS_PSEUDO, TS_CRANK_NICHOLSON 62 . -ts_max_steps maxsteps - maximum number of time-steps to take 63 . -ts_max_time time - maximum time to compute to 64 . -ts_dt dt - initial time step 65 . -ts_monitor - print information at each timestep 66 - -ts_xmonitor - plot information at each timestep 67 68 Level: beginner 69 70 .keywords: TS, timestep, set, options, database 71 72 .seealso: TSGetType 73 @*/ 74 PetscErrorCode PETSCTS_DLLEXPORT TSSetFromOptions(TS ts) 75 { 76 PetscReal dt; 77 PetscTruth opt; 78 PetscErrorCode ierr; 79 80 PetscFunctionBegin; 81 PetscValidHeaderSpecific(ts, TS_COOKIE,1); 82 ierr = PetscOptionsBegin(ts->comm, ts->prefix, "Time step options", "TS");CHKERRQ(ierr); 83 84 /* Handle generic TS options */ 85 ierr = PetscOptionsInt("-ts_max_steps","Maximum number of time steps","TSSetDuration",ts->max_steps,&ts->max_steps,PETSC_NULL);CHKERRQ(ierr); 86 ierr = PetscOptionsReal("-ts_max_time","Time to run to","TSSetDuration",ts->max_time,&ts->max_time,PETSC_NULL);CHKERRQ(ierr); 87 ierr = PetscOptionsReal("-ts_init_time","Initial time","TSSetInitialTime", ts->ptime, &ts->ptime, PETSC_NULL);CHKERRQ(ierr); 88 ierr = PetscOptionsReal("-ts_dt","Initial time step","TSSetInitialTimeStep",ts->initial_time_step,&dt,&opt);CHKERRQ(ierr); 89 if (opt) { 90 ts->initial_time_step = ts->time_step = dt; 91 } 92 93 /* Monitor options */ 94 ierr = PetscOptionsName("-ts_monitor","Monitor timestep size","TSDefaultMonitor",&opt);CHKERRQ(ierr); 95 if (opt) { 96 ierr = TSSetMonitor(ts,TSDefaultMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 97 } 98 ierr = PetscOptionsName("-ts_xmonitor","Monitor timestep size graphically","TSLGMonitor",&opt);CHKERRQ(ierr); 99 if (opt) { 100 ierr = TSSetMonitor(ts,TSLGMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 101 } 102 ierr = PetscOptionsName("-ts_vecmonitor","Monitor solution graphically","TSVecViewMonitor",&opt);CHKERRQ(ierr); 103 if (opt) { 104 ierr = TSSetMonitor(ts,TSVecViewMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 105 } 106 107 /* Handle TS type options */ 108 ierr = TSSetTypeFromOptions(ts);CHKERRQ(ierr); 109 110 /* Handle specific TS options */ 111 if (ts->ops->setfromoptions) { 112 ierr = (*ts->ops->setfromoptions)(ts);CHKERRQ(ierr); 113 } 114 ierr = PetscOptionsEnd();CHKERRQ(ierr); 115 116 /* Handle subobject options */ 117 switch(ts->problem_type) { 118 /* Should check for implicit/explicit */ 119 case TS_LINEAR: 120 if (ts->ksp) { 121 ierr = KSPSetOperators(ts->ksp,ts->A,ts->B,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr); 122 ierr = KSPSetFromOptions(ts->ksp);CHKERRQ(ierr); 123 } 124 break; 125 case TS_NONLINEAR: 126 if (ts->snes) { 127 /* this is a bit of a hack, but it gets the matrix information into SNES earlier 128 so that SNES and KSP have more information to pick reasonable defaults 129 before they allow users to set options */ 130 ierr = SNESSetJacobian(ts->snes,ts->A,ts->B,0,ts);CHKERRQ(ierr); 131 ierr = SNESSetFromOptions(ts->snes);CHKERRQ(ierr); 132 } 133 break; 134 default: 135 SETERRQ1(PETSC_ERR_ARG_WRONG, "Invalid problem type: %d", (int)ts->problem_type); 136 } 137 138 PetscFunctionReturn(0); 139 } 140 141 #undef __FUNCT__ 142 #define __FUNCT__ "TSViewFromOptions" 143 /*@ 144 TSViewFromOptions - This function visualizes the ts based upon user options. 145 146 Collective on TS 147 148 Input Parameter: 149 . ts - The ts 150 151 Level: intermediate 152 153 .keywords: TS, view, options, database 154 .seealso: TSSetFromOptions(), TSView() 155 @*/ 156 PetscErrorCode PETSCTS_DLLEXPORT TSViewFromOptions(TS ts,const char title[]) 157 { 158 PetscViewer viewer; 159 PetscDraw draw; 160 PetscTruth opt; 161 char typeName[1024]; 162 char fileName[PETSC_MAX_PATH_LEN]; 163 size_t len; 164 PetscErrorCode ierr; 165 166 PetscFunctionBegin; 167 ierr = PetscOptionsHasName(ts->prefix, "-ts_view", &opt);CHKERRQ(ierr); 168 if (opt) { 169 ierr = PetscOptionsGetString(ts->prefix, "-ts_view", typeName, 1024, &opt);CHKERRQ(ierr); 170 ierr = PetscStrlen(typeName, &len);CHKERRQ(ierr); 171 if (len > 0) { 172 ierr = PetscViewerCreate(ts->comm, &viewer);CHKERRQ(ierr); 173 ierr = PetscViewerSetType(viewer, typeName);CHKERRQ(ierr); 174 ierr = PetscOptionsGetString(ts->prefix, "-ts_view_file", fileName, 1024, &opt);CHKERRQ(ierr); 175 if (opt) { 176 ierr = PetscViewerSetFilename(viewer, fileName);CHKERRQ(ierr); 177 } else { 178 ierr = PetscViewerSetFilename(viewer, ts->name);CHKERRQ(ierr); 179 } 180 ierr = TSView(ts, viewer);CHKERRQ(ierr); 181 ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 182 ierr = PetscViewerDestroy(viewer);CHKERRQ(ierr); 183 } else { 184 ierr = TSView(ts, PETSC_NULL);CHKERRQ(ierr); 185 } 186 } 187 ierr = PetscOptionsHasName(ts->prefix, "-ts_view_draw", &opt);CHKERRQ(ierr); 188 if (opt) { 189 ierr = PetscViewerDrawOpen(ts->comm, 0, 0, 0, 0, 300, 300, &viewer);CHKERRQ(ierr); 190 ierr = PetscViewerDrawGetDraw(viewer, 0, &draw);CHKERRQ(ierr); 191 if (title) { 192 ierr = PetscDrawSetTitle(draw, (char *)title);CHKERRQ(ierr); 193 } else { 194 ierr = PetscObjectName((PetscObject) ts);CHKERRQ(ierr); 195 ierr = PetscDrawSetTitle(draw, ts->name);CHKERRQ(ierr); 196 } 197 ierr = TSView(ts, viewer);CHKERRQ(ierr); 198 ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 199 ierr = PetscDrawPause(draw);CHKERRQ(ierr); 200 ierr = PetscViewerDestroy(viewer);CHKERRQ(ierr); 201 } 202 PetscFunctionReturn(0); 203 } 204 205 #undef __FUNCT__ 206 #define __FUNCT__ "TSComputeRHSJacobian" 207 /*@ 208 TSComputeRHSJacobian - Computes the Jacobian matrix that has been 209 set with TSSetRHSJacobian(). 210 211 Collective on TS and Vec 212 213 Input Parameters: 214 + ts - the SNES context 215 . t - current timestep 216 - x - input vector 217 218 Output Parameters: 219 + A - Jacobian matrix 220 . B - optional preconditioning matrix 221 - flag - flag indicating matrix structure 222 223 Notes: 224 Most users should not need to explicitly call this routine, as it 225 is used internally within the nonlinear solvers. 226 227 See KSPSetOperators() for important information about setting the 228 flag parameter. 229 230 TSComputeJacobian() is valid only for TS_NONLINEAR 231 232 Level: developer 233 234 .keywords: SNES, compute, Jacobian, matrix 235 236 .seealso: TSSetRHSJacobian(), KSPSetOperators() 237 @*/ 238 PetscErrorCode PETSCTS_DLLEXPORT TSComputeRHSJacobian(TS ts,PetscReal t,Vec X,Mat *A,Mat *B,MatStructure *flg) 239 { 240 PetscErrorCode ierr; 241 242 PetscFunctionBegin; 243 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 244 PetscValidHeaderSpecific(X,VEC_COOKIE,3); 245 PetscCheckSameComm(ts,1,X,3); 246 if (ts->problem_type != TS_NONLINEAR) { 247 SETERRQ(PETSC_ERR_ARG_WRONG,"For TS_NONLINEAR only"); 248 } 249 if (ts->ops->rhsjacobian) { 250 ierr = PetscLogEventBegin(TS_JacobianEval,ts,X,*A,*B);CHKERRQ(ierr); 251 *flg = DIFFERENT_NONZERO_PATTERN; 252 PetscStackPush("TS user Jacobian function"); 253 ierr = (*ts->ops->rhsjacobian)(ts,t,X,A,B,flg,ts->jacP);CHKERRQ(ierr); 254 PetscStackPop; 255 ierr = PetscLogEventEnd(TS_JacobianEval,ts,X,*A,*B);CHKERRQ(ierr); 256 /* make sure user returned a correct Jacobian and preconditioner */ 257 PetscValidHeaderSpecific(*A,MAT_COOKIE,4); 258 PetscValidHeaderSpecific(*B,MAT_COOKIE,5); 259 } else { 260 ierr = MatAssemblyBegin(*A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 261 ierr = MatAssemblyEnd(*A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 262 if (*A != *B) { 263 ierr = MatAssemblyBegin(*B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 264 ierr = MatAssemblyEnd(*B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 265 } 266 } 267 PetscFunctionReturn(0); 268 } 269 270 #undef __FUNCT__ 271 #define __FUNCT__ "TSComputeRHSFunction" 272 /* 273 TSComputeRHSFunction - Evaluates the right-hand-side function. 274 275 Note: If the user did not provide a function but merely a matrix, 276 this routine applies the matrix. 277 */ 278 PetscErrorCode TSComputeRHSFunction(TS ts,PetscReal t,Vec x,Vec y) 279 { 280 PetscErrorCode ierr; 281 282 PetscFunctionBegin; 283 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 284 PetscValidHeaderSpecific(x,VEC_COOKIE,2); 285 PetscValidHeaderSpecific(y,VEC_COOKIE,3); 286 287 ierr = PetscLogEventBegin(TS_FunctionEval,ts,x,y,0);CHKERRQ(ierr); 288 if (ts->ops->rhsfunction) { 289 PetscStackPush("TS user right-hand-side function"); 290 ierr = (*ts->ops->rhsfunction)(ts,t,x,y,ts->funP);CHKERRQ(ierr); 291 PetscStackPop; 292 } else { 293 if (ts->ops->rhsmatrix) { /* assemble matrix for this timestep */ 294 MatStructure flg; 295 PetscStackPush("TS user right-hand-side matrix function"); 296 ierr = (*ts->ops->rhsmatrix)(ts,t,&ts->A,&ts->B,&flg,ts->jacP);CHKERRQ(ierr); 297 PetscStackPop; 298 } 299 ierr = MatMult(ts->A,x,y);CHKERRQ(ierr); 300 } 301 302 /* apply user-provided boundary conditions (only needed if these are time dependent) */ 303 ierr = TSComputeRHSBoundaryConditions(ts,t,y);CHKERRQ(ierr); 304 ierr = PetscLogEventEnd(TS_FunctionEval,ts,x,y,0);CHKERRQ(ierr); 305 306 PetscFunctionReturn(0); 307 } 308 309 #undef __FUNCT__ 310 #define __FUNCT__ "TSSetRHSFunction" 311 /*@C 312 TSSetRHSFunction - Sets the routine for evaluating the function, 313 F(t,u), where U_t = F(t,u). 314 315 Collective on TS 316 317 Input Parameters: 318 + ts - the TS context obtained from TSCreate() 319 . f - routine for evaluating the right-hand-side function 320 - ctx - [optional] user-defined context for private data for the 321 function evaluation routine (may be PETSC_NULL) 322 323 Calling sequence of func: 324 $ func (TS ts,PetscReal t,Vec u,Vec F,void *ctx); 325 326 + t - current timestep 327 . u - input vector 328 . F - function vector 329 - ctx - [optional] user-defined function context 330 331 Important: 332 The user MUST call either this routine or TSSetRHSMatrix(). 333 334 Level: beginner 335 336 .keywords: TS, timestep, set, right-hand-side, function 337 338 .seealso: TSSetRHSMatrix() 339 @*/ 340 PetscErrorCode PETSCTS_DLLEXPORT TSSetRHSFunction(TS ts,PetscErrorCode (*f)(TS,PetscReal,Vec,Vec,void*),void *ctx) 341 { 342 PetscFunctionBegin; 343 344 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 345 if (ts->problem_type == TS_LINEAR) { 346 SETERRQ(PETSC_ERR_ARG_WRONG,"Cannot set function for linear problem"); 347 } 348 ts->ops->rhsfunction = f; 349 ts->funP = ctx; 350 PetscFunctionReturn(0); 351 } 352 353 #undef __FUNCT__ 354 #define __FUNCT__ "TSSetRHSMatrix" 355 /*@C 356 TSSetRHSMatrix - Sets the function to compute the matrix A, where U_t = A(t) U. 357 Also sets the location to store A. 358 359 Collective on TS 360 361 Input Parameters: 362 + ts - the TS context obtained from TSCreate() 363 . A - matrix 364 . B - preconditioner matrix (usually same as A) 365 . f - the matrix evaluation routine; use PETSC_NULL (PETSC_NULL_FUNCTION in fortran) 366 if A is not a function of t. 367 - ctx - [optional] user-defined context for private data for the 368 matrix evaluation routine (may be PETSC_NULL) 369 370 Calling sequence of func: 371 $ func (TS ts,PetscReal t,Mat *A,Mat *B,PetscInt *flag,void *ctx); 372 373 + t - current timestep 374 . A - matrix A, where U_t = A(t) U 375 . B - preconditioner matrix, usually the same as A 376 . flag - flag indicating information about the preconditioner matrix 377 structure (same as flag in KSPSetOperators()) 378 - ctx - [optional] user-defined context for matrix evaluation routine 379 380 Notes: 381 See KSPSetOperators() for important information about setting the flag 382 output parameter in the routine func(). Be sure to read this information! 383 384 The routine func() takes Mat * as the matrix arguments rather than Mat. 385 This allows the matrix evaluation routine to replace A and/or B with a 386 completely new new matrix structure (not just different matrix elements) 387 when appropriate, for instance, if the nonzero structure is changing 388 throughout the global iterations. 389 390 Important: 391 The user MUST call either this routine or TSSetRHSFunction(). 392 393 Level: beginner 394 395 .keywords: TS, timestep, set, right-hand-side, matrix 396 397 .seealso: TSSetRHSFunction() 398 @*/ 399 PetscErrorCode PETSCTS_DLLEXPORT TSSetRHSMatrix(TS ts,Mat A,Mat B,PetscErrorCode (*f)(TS,PetscReal,Mat*,Mat*,MatStructure*,void*),void *ctx) 400 { 401 PetscFunctionBegin; 402 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 403 PetscValidHeaderSpecific(A,MAT_COOKIE,2); 404 PetscValidHeaderSpecific(B,MAT_COOKIE,3); 405 PetscCheckSameComm(ts,1,A,2); 406 PetscCheckSameComm(ts,1,B,3); 407 if (ts->problem_type == TS_NONLINEAR) { 408 SETERRQ(PETSC_ERR_ARG_WRONG,"Not for nonlinear problems; use TSSetRHSJacobian()"); 409 } 410 411 ts->ops->rhsmatrix = f; 412 ts->jacP = ctx; 413 ts->A = A; 414 ts->B = B; 415 416 PetscFunctionReturn(0); 417 } 418 419 #undef __FUNCT__ 420 #define __FUNCT__ "TSSetRHSJacobian" 421 /*@C 422 TSSetRHSJacobian - Sets the function to compute the Jacobian of F, 423 where U_t = F(U,t), as well as the location to store the matrix. 424 Use TSSetRHSMatrix() for linear problems. 425 426 Collective on TS 427 428 Input Parameters: 429 + ts - the TS context obtained from TSCreate() 430 . A - Jacobian matrix 431 . B - preconditioner matrix (usually same as A) 432 . f - the Jacobian evaluation routine 433 - ctx - [optional] user-defined context for private data for the 434 Jacobian evaluation routine (may be PETSC_NULL) 435 436 Calling sequence of func: 437 $ func (TS ts,PetscReal t,Vec u,Mat *A,Mat *B,MatStructure *flag,void *ctx); 438 439 + t - current timestep 440 . u - input vector 441 . A - matrix A, where U_t = A(t)u 442 . B - preconditioner matrix, usually the same as A 443 . flag - flag indicating information about the preconditioner matrix 444 structure (same as flag in KSPSetOperators()) 445 - ctx - [optional] user-defined context for matrix evaluation routine 446 447 Notes: 448 See KSPSetOperators() for important information about setting the flag 449 output parameter in the routine func(). Be sure to read this information! 450 451 The routine func() takes Mat * as the matrix arguments rather than Mat. 452 This allows the matrix evaluation routine to replace A and/or B with a 453 completely new new matrix structure (not just different matrix elements) 454 when appropriate, for instance, if the nonzero structure is changing 455 throughout the global iterations. 456 457 Level: beginner 458 459 .keywords: TS, timestep, set, right-hand-side, Jacobian 460 461 .seealso: TSDefaultComputeJacobianColor(), 462 SNESDefaultComputeJacobianColor(), TSSetRHSFunction(), TSSetRHSMatrix() 463 464 @*/ 465 PetscErrorCode PETSCTS_DLLEXPORT TSSetRHSJacobian(TS ts,Mat A,Mat B,PetscErrorCode (*f)(TS,PetscReal,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx) 466 { 467 PetscFunctionBegin; 468 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 469 PetscValidHeaderSpecific(A,MAT_COOKIE,2); 470 PetscValidHeaderSpecific(B,MAT_COOKIE,3); 471 PetscCheckSameComm(ts,1,A,2); 472 PetscCheckSameComm(ts,1,B,3); 473 if (ts->problem_type != TS_NONLINEAR) { 474 SETERRQ(PETSC_ERR_ARG_WRONG,"Not for linear problems; use TSSetRHSMatrix()"); 475 } 476 477 ts->ops->rhsjacobian = f; 478 ts->jacP = ctx; 479 ts->A = A; 480 ts->B = B; 481 PetscFunctionReturn(0); 482 } 483 484 #undef __FUNCT__ 485 #define __FUNCT__ "TSComputeRHSBoundaryConditions" 486 /* 487 TSComputeRHSBoundaryConditions - Evaluates the boundary condition function. 488 489 Note: If the user did not provide a function but merely a matrix, 490 this routine applies the matrix. 491 */ 492 PetscErrorCode TSComputeRHSBoundaryConditions(TS ts,PetscReal t,Vec x) 493 { 494 PetscErrorCode ierr; 495 496 PetscFunctionBegin; 497 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 498 PetscValidHeaderSpecific(x,VEC_COOKIE,3); 499 PetscCheckSameComm(ts,1,x,3); 500 501 if (ts->ops->rhsbc) { 502 PetscStackPush("TS user boundary condition function"); 503 ierr = (*ts->ops->rhsbc)(ts,t,x,ts->bcP);CHKERRQ(ierr); 504 PetscStackPop; 505 PetscFunctionReturn(0); 506 } 507 508 PetscFunctionReturn(0); 509 } 510 511 #undef __FUNCT__ 512 #define __FUNCT__ "TSSetRHSBoundaryConditions" 513 /*@C 514 TSSetRHSBoundaryConditions - Sets the routine for evaluating the function, 515 boundary conditions for the function F. 516 517 Collective on TS 518 519 Input Parameters: 520 + ts - the TS context obtained from TSCreate() 521 . f - routine for evaluating the boundary condition function 522 - ctx - [optional] user-defined context for private data for the 523 function evaluation routine (may be PETSC_NULL) 524 525 Calling sequence of func: 526 $ func (TS ts,PetscReal t,Vec F,void *ctx); 527 528 + t - current timestep 529 . F - function vector 530 - ctx - [optional] user-defined function context 531 532 Level: intermediate 533 534 .keywords: TS, timestep, set, boundary conditions, function 535 @*/ 536 PetscErrorCode PETSCTS_DLLEXPORT TSSetRHSBoundaryConditions(TS ts,PetscErrorCode (*f)(TS,PetscReal,Vec,void*),void *ctx) 537 { 538 PetscFunctionBegin; 539 540 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 541 if (ts->problem_type != TS_LINEAR) { 542 SETERRQ(PETSC_ERR_ARG_WRONG,"For linear problems only"); 543 } 544 ts->ops->rhsbc = f; 545 ts->bcP = ctx; 546 PetscFunctionReturn(0); 547 } 548 549 #undef __FUNCT__ 550 #define __FUNCT__ "TSView" 551 /*@C 552 TSView - Prints the TS data structure. 553 554 Collective on TS 555 556 Input Parameters: 557 + ts - the TS context obtained from TSCreate() 558 - viewer - visualization context 559 560 Options Database Key: 561 . -ts_view - calls TSView() at end of TSStep() 562 563 Notes: 564 The available visualization contexts include 565 + PETSC_VIEWER_STDOUT_SELF - standard output (default) 566 - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 567 output where only the first processor opens 568 the file. All other processors send their 569 data to the first processor to print. 570 571 The user can open an alternative visualization context with 572 PetscViewerASCIIOpen() - output to a specified file. 573 574 Level: beginner 575 576 .keywords: TS, timestep, view 577 578 .seealso: PetscViewerASCIIOpen() 579 @*/ 580 PetscErrorCode PETSCTS_DLLEXPORT TSView(TS ts,PetscViewer viewer) 581 { 582 PetscErrorCode ierr; 583 char *type; 584 PetscTruth iascii,isstring; 585 586 PetscFunctionBegin; 587 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 588 if (!viewer) viewer = PETSC_VIEWER_STDOUT_(ts->comm); 589 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE,2); 590 PetscCheckSameComm(ts,1,viewer,2); 591 592 ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 593 ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_STRING,&isstring);CHKERRQ(ierr); 594 if (iascii) { 595 ierr = PetscViewerASCIIPrintf(viewer,"TS Object:\n");CHKERRQ(ierr); 596 ierr = TSGetType(ts,(TSType *)&type);CHKERRQ(ierr); 597 if (type) { 598 ierr = PetscViewerASCIIPrintf(viewer," type: %s\n",type);CHKERRQ(ierr); 599 } else { 600 ierr = PetscViewerASCIIPrintf(viewer," type: not yet set\n");CHKERRQ(ierr); 601 } 602 if (ts->ops->view) { 603 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 604 ierr = (*ts->ops->view)(ts,viewer);CHKERRQ(ierr); 605 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 606 } 607 ierr = PetscViewerASCIIPrintf(viewer," maximum steps=%D\n",ts->max_steps);CHKERRQ(ierr); 608 ierr = PetscViewerASCIIPrintf(viewer," maximum time=%g\n",ts->max_time);CHKERRQ(ierr); 609 if (ts->problem_type == TS_NONLINEAR) { 610 ierr = PetscViewerASCIIPrintf(viewer," total number of nonlinear solver iterations=%D\n",ts->nonlinear_its);CHKERRQ(ierr); 611 } 612 ierr = PetscViewerASCIIPrintf(viewer," total number of linear solver iterations=%D\n",ts->linear_its);CHKERRQ(ierr); 613 } else if (isstring) { 614 ierr = TSGetType(ts,(TSType *)&type);CHKERRQ(ierr); 615 ierr = PetscViewerStringSPrintf(viewer," %-7.7s",type);CHKERRQ(ierr); 616 } 617 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 618 if (ts->ksp) {ierr = KSPView(ts->ksp,viewer);CHKERRQ(ierr);} 619 if (ts->snes) {ierr = SNESView(ts->snes,viewer);CHKERRQ(ierr);} 620 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 621 PetscFunctionReturn(0); 622 } 623 624 625 #undef __FUNCT__ 626 #define __FUNCT__ "TSSetApplicationContext" 627 /*@C 628 TSSetApplicationContext - Sets an optional user-defined context for 629 the timesteppers. 630 631 Collective on TS 632 633 Input Parameters: 634 + ts - the TS context obtained from TSCreate() 635 - usrP - optional user context 636 637 Level: intermediate 638 639 .keywords: TS, timestep, set, application, context 640 641 .seealso: TSGetApplicationContext() 642 @*/ 643 PetscErrorCode PETSCTS_DLLEXPORT TSSetApplicationContext(TS ts,void *usrP) 644 { 645 PetscFunctionBegin; 646 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 647 ts->user = usrP; 648 PetscFunctionReturn(0); 649 } 650 651 #undef __FUNCT__ 652 #define __FUNCT__ "TSGetApplicationContext" 653 /*@C 654 TSGetApplicationContext - Gets the user-defined context for the 655 timestepper. 656 657 Not Collective 658 659 Input Parameter: 660 . ts - the TS context obtained from TSCreate() 661 662 Output Parameter: 663 . usrP - user context 664 665 Level: intermediate 666 667 .keywords: TS, timestep, get, application, context 668 669 .seealso: TSSetApplicationContext() 670 @*/ 671 PetscErrorCode PETSCTS_DLLEXPORT TSGetApplicationContext(TS ts,void **usrP) 672 { 673 PetscFunctionBegin; 674 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 675 *usrP = ts->user; 676 PetscFunctionReturn(0); 677 } 678 679 #undef __FUNCT__ 680 #define __FUNCT__ "TSGetTimeStepNumber" 681 /*@ 682 TSGetTimeStepNumber - Gets the current number of timesteps. 683 684 Not Collective 685 686 Input Parameter: 687 . ts - the TS context obtained from TSCreate() 688 689 Output Parameter: 690 . iter - number steps so far 691 692 Level: intermediate 693 694 .keywords: TS, timestep, get, iteration, number 695 @*/ 696 PetscErrorCode PETSCTS_DLLEXPORT TSGetTimeStepNumber(TS ts,PetscInt* iter) 697 { 698 PetscFunctionBegin; 699 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 700 PetscValidIntPointer(iter,2); 701 *iter = ts->steps; 702 PetscFunctionReturn(0); 703 } 704 705 #undef __FUNCT__ 706 #define __FUNCT__ "TSSetInitialTimeStep" 707 /*@ 708 TSSetInitialTimeStep - Sets the initial timestep to be used, 709 as well as the initial time. 710 711 Collective on TS 712 713 Input Parameters: 714 + ts - the TS context obtained from TSCreate() 715 . initial_time - the initial time 716 - time_step - the size of the timestep 717 718 Level: intermediate 719 720 .seealso: TSSetTimeStep(), TSGetTimeStep() 721 722 .keywords: TS, set, initial, timestep 723 @*/ 724 PetscErrorCode PETSCTS_DLLEXPORT TSSetInitialTimeStep(TS ts,PetscReal initial_time,PetscReal time_step) 725 { 726 PetscFunctionBegin; 727 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 728 ts->time_step = time_step; 729 ts->initial_time_step = time_step; 730 ts->ptime = initial_time; 731 PetscFunctionReturn(0); 732 } 733 734 #undef __FUNCT__ 735 #define __FUNCT__ "TSSetTimeStep" 736 /*@ 737 TSSetTimeStep - Allows one to reset the timestep at any time, 738 useful for simple pseudo-timestepping codes. 739 740 Collective on TS 741 742 Input Parameters: 743 + ts - the TS context obtained from TSCreate() 744 - time_step - the size of the timestep 745 746 Level: intermediate 747 748 .seealso: TSSetInitialTimeStep(), TSGetTimeStep() 749 750 .keywords: TS, set, timestep 751 @*/ 752 PetscErrorCode PETSCTS_DLLEXPORT TSSetTimeStep(TS ts,PetscReal time_step) 753 { 754 PetscFunctionBegin; 755 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 756 ts->time_step = time_step; 757 PetscFunctionReturn(0); 758 } 759 760 #undef __FUNCT__ 761 #define __FUNCT__ "TSGetTimeStep" 762 /*@ 763 TSGetTimeStep - Gets the current timestep size. 764 765 Not Collective 766 767 Input Parameter: 768 . ts - the TS context obtained from TSCreate() 769 770 Output Parameter: 771 . dt - the current timestep size 772 773 Level: intermediate 774 775 .seealso: TSSetInitialTimeStep(), TSGetTimeStep() 776 777 .keywords: TS, get, timestep 778 @*/ 779 PetscErrorCode PETSCTS_DLLEXPORT TSGetTimeStep(TS ts,PetscReal* dt) 780 { 781 PetscFunctionBegin; 782 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 783 PetscValidDoublePointer(dt,2); 784 *dt = ts->time_step; 785 PetscFunctionReturn(0); 786 } 787 788 #undef __FUNCT__ 789 #define __FUNCT__ "TSGetSolution" 790 /*@ 791 TSGetSolution - Returns the solution at the present timestep. It 792 is valid to call this routine inside the function that you are evaluating 793 in order to move to the new timestep. This vector not changed until 794 the solution at the next timestep has been calculated. 795 796 Not Collective, but Vec returned is parallel if TS is parallel 797 798 Input Parameter: 799 . ts - the TS context obtained from TSCreate() 800 801 Output Parameter: 802 . v - the vector containing the solution 803 804 Level: intermediate 805 806 .seealso: TSGetTimeStep() 807 808 .keywords: TS, timestep, get, solution 809 @*/ 810 PetscErrorCode PETSCTS_DLLEXPORT TSGetSolution(TS ts,Vec *v) 811 { 812 PetscFunctionBegin; 813 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 814 PetscValidPointer(v,2); 815 *v = ts->vec_sol_always; 816 PetscFunctionReturn(0); 817 } 818 819 /* ----- Routines to initialize and destroy a timestepper ---- */ 820 #undef __FUNCT__ 821 #define __FUNCT__ "TSSetProblemType" 822 /*@ 823 TSSetProblemType - Sets the type of problem to be solved. 824 825 Not collective 826 827 Input Parameters: 828 + ts - The TS 829 - type - One of TS_LINEAR, TS_NONLINEAR where these types refer to problems of the forms 830 .vb 831 U_t = A U 832 U_t = A(t) U 833 U_t = F(t,U) 834 .ve 835 836 Level: beginner 837 838 .keywords: TS, problem type 839 .seealso: TSSetUp(), TSProblemType, TS 840 @*/ 841 PetscErrorCode PETSCTS_DLLEXPORT TSSetProblemType(TS ts, TSProblemType type) 842 { 843 PetscFunctionBegin; 844 PetscValidHeaderSpecific(ts, TS_COOKIE,1); 845 ts->problem_type = type; 846 PetscFunctionReturn(0); 847 } 848 849 #undef __FUNCT__ 850 #define __FUNCT__ "TSGetProblemType" 851 /*@C 852 TSGetProblemType - Gets the type of problem to be solved. 853 854 Not collective 855 856 Input Parameter: 857 . ts - The TS 858 859 Output Parameter: 860 . type - One of TS_LINEAR, TS_NONLINEAR where these types refer to problems of the forms 861 .vb 862 U_t = A U 863 U_t = A(t) U 864 U_t = F(t,U) 865 .ve 866 867 Level: beginner 868 869 .keywords: TS, problem type 870 .seealso: TSSetUp(), TSProblemType, TS 871 @*/ 872 PetscErrorCode PETSCTS_DLLEXPORT TSGetProblemType(TS ts, TSProblemType *type) 873 { 874 PetscFunctionBegin; 875 PetscValidHeaderSpecific(ts, TS_COOKIE,1); 876 PetscValidIntPointer(type,2); 877 *type = ts->problem_type; 878 PetscFunctionReturn(0); 879 } 880 881 #undef __FUNCT__ 882 #define __FUNCT__ "TSSetUp" 883 /*@ 884 TSSetUp - Sets up the internal data structures for the later use 885 of a timestepper. 886 887 Collective on TS 888 889 Input Parameter: 890 . ts - the TS context obtained from TSCreate() 891 892 Notes: 893 For basic use of the TS solvers the user need not explicitly call 894 TSSetUp(), since these actions will automatically occur during 895 the call to TSStep(). However, if one wishes to control this 896 phase separately, TSSetUp() should be called after TSCreate() 897 and optional routines of the form TSSetXXX(), but before TSStep(). 898 899 Level: advanced 900 901 .keywords: TS, timestep, setup 902 903 .seealso: TSCreate(), TSStep(), TSDestroy() 904 @*/ 905 PetscErrorCode PETSCTS_DLLEXPORT TSSetUp(TS ts) 906 { 907 PetscErrorCode ierr; 908 909 PetscFunctionBegin; 910 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 911 if (!ts->vec_sol) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call TSSetSolution() first"); 912 if (!ts->type_name) { 913 ierr = TSSetType(ts,TS_EULER);CHKERRQ(ierr); 914 } 915 ierr = (*ts->ops->setup)(ts);CHKERRQ(ierr); 916 ts->setupcalled = 1; 917 PetscFunctionReturn(0); 918 } 919 920 #undef __FUNCT__ 921 #define __FUNCT__ "TSDestroy" 922 /*@ 923 TSDestroy - Destroys the timestepper context that was created 924 with TSCreate(). 925 926 Collective on TS 927 928 Input Parameter: 929 . ts - the TS context obtained from TSCreate() 930 931 Level: beginner 932 933 .keywords: TS, timestepper, destroy 934 935 .seealso: TSCreate(), TSSetUp(), TSSolve() 936 @*/ 937 PetscErrorCode PETSCTS_DLLEXPORT TSDestroy(TS ts) 938 { 939 PetscErrorCode ierr; 940 PetscInt i; 941 942 PetscFunctionBegin; 943 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 944 if (--ts->refct > 0) PetscFunctionReturn(0); 945 946 /* if memory was published with AMS then destroy it */ 947 ierr = PetscObjectDepublish(ts);CHKERRQ(ierr); 948 949 if (ts->ksp) {ierr = KSPDestroy(ts->ksp);CHKERRQ(ierr);} 950 if (ts->snes) {ierr = SNESDestroy(ts->snes);CHKERRQ(ierr);} 951 ierr = (*(ts)->ops->destroy)(ts);CHKERRQ(ierr); 952 for (i=0; i<ts->numbermonitors; i++) { 953 if (ts->mdestroy[i]) { 954 ierr = (*ts->mdestroy[i])(ts->monitorcontext[i]);CHKERRQ(ierr); 955 } 956 } 957 ierr = PetscHeaderDestroy(ts);CHKERRQ(ierr); 958 PetscFunctionReturn(0); 959 } 960 961 #undef __FUNCT__ 962 #define __FUNCT__ "TSGetSNES" 963 /*@ 964 TSGetSNES - Returns the SNES (nonlinear solver) associated with 965 a TS (timestepper) context. Valid only for nonlinear problems. 966 967 Not Collective, but SNES is parallel if TS is parallel 968 969 Input Parameter: 970 . ts - the TS context obtained from TSCreate() 971 972 Output Parameter: 973 . snes - the nonlinear solver context 974 975 Notes: 976 The user can then directly manipulate the SNES context to set various 977 options, etc. Likewise, the user can then extract and manipulate the 978 KSP, KSP, and PC contexts as well. 979 980 TSGetSNES() does not work for integrators that do not use SNES; in 981 this case TSGetSNES() returns PETSC_NULL in snes. 982 983 Level: beginner 984 985 .keywords: timestep, get, SNES 986 @*/ 987 PetscErrorCode PETSCTS_DLLEXPORT TSGetSNES(TS ts,SNES *snes) 988 { 989 PetscFunctionBegin; 990 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 991 PetscValidPointer(snes,2); 992 if (ts->problem_type == TS_LINEAR) SETERRQ(PETSC_ERR_ARG_WRONG,"Nonlinear only; use TSGetKSP()"); 993 *snes = ts->snes; 994 PetscFunctionReturn(0); 995 } 996 997 #undef __FUNCT__ 998 #define __FUNCT__ "TSGetKSP" 999 /*@ 1000 TSGetKSP - Returns the KSP (linear solver) associated with 1001 a TS (timestepper) context. 1002 1003 Not Collective, but KSP is parallel if TS is parallel 1004 1005 Input Parameter: 1006 . ts - the TS context obtained from TSCreate() 1007 1008 Output Parameter: 1009 . ksp - the nonlinear solver context 1010 1011 Notes: 1012 The user can then directly manipulate the KSP context to set various 1013 options, etc. Likewise, the user can then extract and manipulate the 1014 KSP and PC contexts as well. 1015 1016 TSGetKSP() does not work for integrators that do not use KSP; 1017 in this case TSGetKSP() returns PETSC_NULL in ksp. 1018 1019 Level: beginner 1020 1021 .keywords: timestep, get, KSP 1022 @*/ 1023 PetscErrorCode PETSCTS_DLLEXPORT TSGetKSP(TS ts,KSP *ksp) 1024 { 1025 PetscFunctionBegin; 1026 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 1027 PetscValidPointer(ksp,2); 1028 if (ts->problem_type != TS_LINEAR) SETERRQ(PETSC_ERR_ARG_WRONG,"Linear only; use TSGetSNES()"); 1029 *ksp = ts->ksp; 1030 PetscFunctionReturn(0); 1031 } 1032 1033 /* ----------- Routines to set solver parameters ---------- */ 1034 1035 #undef __FUNCT__ 1036 #define __FUNCT__ "TSGetDuration" 1037 /*@ 1038 TSGetDuration - Gets the maximum number of timesteps to use and 1039 maximum time for iteration. 1040 1041 Collective on TS 1042 1043 Input Parameters: 1044 + ts - the TS context obtained from TSCreate() 1045 . maxsteps - maximum number of iterations to use, or PETSC_NULL 1046 - maxtime - final time to iterate to, or PETSC_NULL 1047 1048 Level: intermediate 1049 1050 .keywords: TS, timestep, get, maximum, iterations, time 1051 @*/ 1052 PetscErrorCode PETSCTS_DLLEXPORT TSGetDuration(TS ts, PetscInt *maxsteps, PetscReal *maxtime) 1053 { 1054 PetscFunctionBegin; 1055 PetscValidHeaderSpecific(ts, TS_COOKIE,1); 1056 if (maxsteps) { 1057 PetscValidIntPointer(maxsteps,2); 1058 *maxsteps = ts->max_steps; 1059 } 1060 if (maxtime ) { 1061 PetscValidScalarPointer(maxtime,3); 1062 *maxtime = ts->max_time; 1063 } 1064 PetscFunctionReturn(0); 1065 } 1066 1067 #undef __FUNCT__ 1068 #define __FUNCT__ "TSSetDuration" 1069 /*@ 1070 TSSetDuration - Sets the maximum number of timesteps to use and 1071 maximum time for iteration. 1072 1073 Collective on TS 1074 1075 Input Parameters: 1076 + ts - the TS context obtained from TSCreate() 1077 . maxsteps - maximum number of iterations to use 1078 - maxtime - final time to iterate to 1079 1080 Options Database Keys: 1081 . -ts_max_steps <maxsteps> - Sets maxsteps 1082 . -ts_max_time <maxtime> - Sets maxtime 1083 1084 Notes: 1085 The default maximum number of iterations is 5000. Default time is 5.0 1086 1087 Level: intermediate 1088 1089 .keywords: TS, timestep, set, maximum, iterations 1090 @*/ 1091 PetscErrorCode PETSCTS_DLLEXPORT TSSetDuration(TS ts,PetscInt maxsteps,PetscReal maxtime) 1092 { 1093 PetscFunctionBegin; 1094 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 1095 ts->max_steps = maxsteps; 1096 ts->max_time = maxtime; 1097 PetscFunctionReturn(0); 1098 } 1099 1100 #undef __FUNCT__ 1101 #define __FUNCT__ "TSSetSolution" 1102 /*@ 1103 TSSetSolution - Sets the initial solution vector 1104 for use by the TS routines. 1105 1106 Collective on TS and Vec 1107 1108 Input Parameters: 1109 + ts - the TS context obtained from TSCreate() 1110 - x - the solution vector 1111 1112 Level: beginner 1113 1114 .keywords: TS, timestep, set, solution, initial conditions 1115 @*/ 1116 PetscErrorCode PETSCTS_DLLEXPORT TSSetSolution(TS ts,Vec x) 1117 { 1118 PetscFunctionBegin; 1119 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 1120 PetscValidHeaderSpecific(x,VEC_COOKIE,2); 1121 ts->vec_sol = ts->vec_sol_always = x; 1122 PetscFunctionReturn(0); 1123 } 1124 1125 #undef __FUNCT__ 1126 #define __FUNCT__ "TSDefaultRhsBC" 1127 /*@ 1128 TSDefaultRhsBC - The default boundary condition function which does nothing. 1129 1130 Collective on TS 1131 1132 Input Parameters: 1133 + ts - The TS context obtained from TSCreate() 1134 . rhs - The Rhs 1135 - ctx - The user-context 1136 1137 Level: developer 1138 1139 .keywords: TS, Rhs, boundary conditions 1140 @*/ 1141 PetscErrorCode PETSCTS_DLLEXPORT TSDefaultRhsBC(TS ts, Vec rhs, void *ctx) 1142 { 1143 PetscFunctionBegin; 1144 PetscFunctionReturn(0); 1145 } 1146 1147 #undef __FUNCT__ 1148 #define __FUNCT__ "TSSetSystemMatrixBC" 1149 /*@C 1150 TSSetSystemMatrixBC - Sets the function which applies boundary conditions 1151 to the system matrix and preconditioner of each system. 1152 1153 Collective on TS 1154 1155 Input Parameters: 1156 + ts - The TS context obtained from TSCreate() 1157 - func - The function 1158 1159 Calling sequence of func: 1160 . func (TS ts, Mat A, Mat B, void *ctx); 1161 1162 + A - The current system matrix 1163 . B - The current preconditioner 1164 - ctx - The user-context 1165 1166 Level: intermediate 1167 1168 .keywords: TS, System matrix, boundary conditions 1169 @*/ 1170 PetscErrorCode PETSCTS_DLLEXPORT TSSetSystemMatrixBC(TS ts, PetscErrorCode (*func)(TS, Mat, Mat, void *)) 1171 { 1172 PetscFunctionBegin; 1173 PetscValidHeaderSpecific(ts, TS_COOKIE,1); 1174 ts->ops->applymatrixbc = func; 1175 PetscFunctionReturn(0); 1176 } 1177 1178 #undef __FUNCT__ 1179 #define __FUNCT__ "TSDefaultSystemMatrixBC" 1180 /*@ 1181 TSDefaultSystemMatrixBC - The default boundary condition function which 1182 does nothing. 1183 1184 Collective on TS 1185 1186 Input Parameters: 1187 + ts - The TS context obtained from TSCreate() 1188 . A - The system matrix 1189 . B - The preconditioner 1190 - ctx - The user-context 1191 1192 Level: developer 1193 1194 .keywords: TS, System matrix, boundary conditions 1195 @*/ 1196 PetscErrorCode PETSCTS_DLLEXPORT TSDefaultSystemMatrixBC(TS ts, Mat A, Mat B, void *ctx) 1197 { 1198 PetscFunctionBegin; 1199 PetscFunctionReturn(0); 1200 } 1201 1202 #undef __FUNCT__ 1203 #define __FUNCT__ "TSSetSolutionBC" 1204 /*@C 1205 TSSetSolutionBC - Sets the function which applies boundary conditions 1206 to the solution of each system. This is necessary in nonlinear systems 1207 which time dependent boundary conditions. 1208 1209 Collective on TS 1210 1211 Input Parameters: 1212 + ts - The TS context obtained from TSCreate() 1213 - func - The function 1214 1215 Calling sequence of func: 1216 . func (TS ts, Vec rsol, void *ctx); 1217 1218 + sol - The current solution vector 1219 - ctx - The user-context 1220 1221 Level: intermediate 1222 1223 .keywords: TS, solution, boundary conditions 1224 @*/ 1225 PetscErrorCode PETSCTS_DLLEXPORT TSSetSolutionBC(TS ts, PetscErrorCode (*func)(TS, Vec, void *)) 1226 { 1227 PetscFunctionBegin; 1228 PetscValidHeaderSpecific(ts, TS_COOKIE,1); 1229 ts->ops->applysolbc = func; 1230 PetscFunctionReturn(0); 1231 } 1232 1233 #undef __FUNCT__ 1234 #define __FUNCT__ "TSDefaultSolutionBC" 1235 /*@ 1236 TSDefaultSolutionBC - The default boundary condition function which 1237 does nothing. 1238 1239 Collective on TS 1240 1241 Input Parameters: 1242 + ts - The TS context obtained from TSCreate() 1243 . sol - The solution 1244 - ctx - The user-context 1245 1246 Level: developer 1247 1248 .keywords: TS, solution, boundary conditions 1249 @*/ 1250 PetscErrorCode PETSCTS_DLLEXPORT TSDefaultSolutionBC(TS ts, Vec sol, void *ctx) 1251 { 1252 PetscFunctionBegin; 1253 PetscFunctionReturn(0); 1254 } 1255 1256 #undef __FUNCT__ 1257 #define __FUNCT__ "TSSetPreStep" 1258 /*@C 1259 TSSetPreStep - Sets the general-purpose function 1260 called once at the beginning of time stepping. 1261 1262 Collective on TS 1263 1264 Input Parameters: 1265 + ts - The TS context obtained from TSCreate() 1266 - func - The function 1267 1268 Calling sequence of func: 1269 . func (TS ts); 1270 1271 Level: intermediate 1272 1273 .keywords: TS, timestep 1274 @*/ 1275 PetscErrorCode PETSCTS_DLLEXPORT TSSetPreStep(TS ts, PetscErrorCode (*func)(TS)) 1276 { 1277 PetscFunctionBegin; 1278 PetscValidHeaderSpecific(ts, TS_COOKIE,1); 1279 ts->ops->prestep = func; 1280 PetscFunctionReturn(0); 1281 } 1282 1283 #undef __FUNCT__ 1284 #define __FUNCT__ "TSDefaultPreStep" 1285 /*@ 1286 TSDefaultPreStep - The default pre-stepping function which does nothing. 1287 1288 Collective on TS 1289 1290 Input Parameters: 1291 . ts - The TS context obtained from TSCreate() 1292 1293 Level: developer 1294 1295 .keywords: TS, timestep 1296 @*/ 1297 PetscErrorCode PETSCTS_DLLEXPORT TSDefaultPreStep(TS ts) 1298 { 1299 PetscFunctionBegin; 1300 PetscFunctionReturn(0); 1301 } 1302 1303 #undef __FUNCT__ 1304 #define __FUNCT__ "TSSetUpdate" 1305 /*@C 1306 TSSetUpdate - Sets the general-purpose update function called 1307 at the beginning of every time step. This function can change 1308 the time step. 1309 1310 Collective on TS 1311 1312 Input Parameters: 1313 + ts - The TS context obtained from TSCreate() 1314 - func - The function 1315 1316 Calling sequence of func: 1317 . func (TS ts, double t, double *dt); 1318 1319 + t - The current time 1320 - dt - The current time step 1321 1322 Level: intermediate 1323 1324 .keywords: TS, update, timestep 1325 @*/ 1326 PetscErrorCode PETSCTS_DLLEXPORT TSSetUpdate(TS ts, PetscErrorCode (*func)(TS, PetscReal, PetscReal *)) 1327 { 1328 PetscFunctionBegin; 1329 PetscValidHeaderSpecific(ts, TS_COOKIE,1); 1330 ts->ops->update = func; 1331 PetscFunctionReturn(0); 1332 } 1333 1334 #undef __FUNCT__ 1335 #define __FUNCT__ "TSDefaultUpdate" 1336 /*@ 1337 TSDefaultUpdate - The default update function which does nothing. 1338 1339 Collective on TS 1340 1341 Input Parameters: 1342 + ts - The TS context obtained from TSCreate() 1343 - t - The current time 1344 1345 Output Parameters: 1346 . dt - The current time step 1347 1348 Level: developer 1349 1350 .keywords: TS, update, timestep 1351 @*/ 1352 PetscErrorCode PETSCTS_DLLEXPORT TSDefaultUpdate(TS ts, PetscReal t, PetscReal *dt) 1353 { 1354 PetscFunctionBegin; 1355 PetscFunctionReturn(0); 1356 } 1357 1358 #undef __FUNCT__ 1359 #define __FUNCT__ "TSSetPostStep" 1360 /*@C 1361 TSSetPostStep - Sets the general-purpose function 1362 called once at the end of time stepping. 1363 1364 Collective on TS 1365 1366 Input Parameters: 1367 + ts - The TS context obtained from TSCreate() 1368 - func - The function 1369 1370 Calling sequence of func: 1371 . func (TS ts); 1372 1373 Level: intermediate 1374 1375 .keywords: TS, timestep 1376 @*/ 1377 PetscErrorCode PETSCTS_DLLEXPORT TSSetPostStep(TS ts, PetscErrorCode (*func)(TS)) 1378 { 1379 PetscFunctionBegin; 1380 PetscValidHeaderSpecific(ts, TS_COOKIE,1); 1381 ts->ops->poststep = func; 1382 PetscFunctionReturn(0); 1383 } 1384 1385 #undef __FUNCT__ 1386 #define __FUNCT__ "TSDefaultPostStep" 1387 /*@ 1388 TSDefaultPostStep - The default post-stepping function which does nothing. 1389 1390 Collective on TS 1391 1392 Input Parameters: 1393 . ts - The TS context obtained from TSCreate() 1394 1395 Level: developer 1396 1397 .keywords: TS, timestep 1398 @*/ 1399 PetscErrorCode PETSCTS_DLLEXPORT TSDefaultPostStep(TS ts) 1400 { 1401 PetscFunctionBegin; 1402 PetscFunctionReturn(0); 1403 } 1404 1405 /* ------------ Routines to set performance monitoring options ----------- */ 1406 1407 #undef __FUNCT__ 1408 #define __FUNCT__ "TSSetMonitor" 1409 /*@C 1410 TSSetMonitor - Sets an ADDITIONAL function that is to be used at every 1411 timestep to display the iteration's progress. 1412 1413 Collective on TS 1414 1415 Input Parameters: 1416 + ts - the TS context obtained from TSCreate() 1417 . func - monitoring routine 1418 . mctx - [optional] user-defined context for private data for the 1419 monitor routine (use PETSC_NULL if no context is desired) 1420 - monitordestroy - [optional] routine that frees monitor context 1421 (may be PETSC_NULL) 1422 1423 Calling sequence of func: 1424 $ int func(TS ts,PetscInt steps,PetscReal time,Vec x,void *mctx) 1425 1426 + ts - the TS context 1427 . steps - iteration number 1428 . time - current time 1429 . x - current iterate 1430 - mctx - [optional] monitoring context 1431 1432 Notes: 1433 This routine adds an additional monitor to the list of monitors that 1434 already has been loaded. 1435 1436 Level: intermediate 1437 1438 .keywords: TS, timestep, set, monitor 1439 1440 .seealso: TSDefaultMonitor(), TSClearMonitor() 1441 @*/ 1442 PetscErrorCode PETSCTS_DLLEXPORT TSSetMonitor(TS ts,PetscErrorCode (*monitor)(TS,PetscInt,PetscReal,Vec,void*),void *mctx,PetscErrorCode (*mdestroy)(void*)) 1443 { 1444 PetscFunctionBegin; 1445 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 1446 if (ts->numbermonitors >= MAXTSMONITORS) { 1447 SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Too many monitors set"); 1448 } 1449 ts->monitor[ts->numbermonitors] = monitor; 1450 ts->mdestroy[ts->numbermonitors] = mdestroy; 1451 ts->monitorcontext[ts->numbermonitors++] = (void*)mctx; 1452 PetscFunctionReturn(0); 1453 } 1454 1455 #undef __FUNCT__ 1456 #define __FUNCT__ "TSClearMonitor" 1457 /*@C 1458 TSClearMonitor - Clears all the monitors that have been set on a time-step object. 1459 1460 Collective on TS 1461 1462 Input Parameters: 1463 . ts - the TS context obtained from TSCreate() 1464 1465 Notes: 1466 There is no way to remove a single, specific monitor. 1467 1468 Level: intermediate 1469 1470 .keywords: TS, timestep, set, monitor 1471 1472 .seealso: TSDefaultMonitor(), TSSetMonitor() 1473 @*/ 1474 PetscErrorCode PETSCTS_DLLEXPORT TSClearMonitor(TS ts) 1475 { 1476 PetscFunctionBegin; 1477 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 1478 ts->numbermonitors = 0; 1479 PetscFunctionReturn(0); 1480 } 1481 1482 #undef __FUNCT__ 1483 #define __FUNCT__ "TSDefaultMonitor" 1484 /*@ 1485 TSDefaultMonitor - Sets the Default monitor 1486 @*/ 1487 PetscErrorCode TSDefaultMonitor(TS ts,PetscInt step,PetscReal ptime,Vec v,void *ctx) 1488 { 1489 PetscErrorCode ierr; 1490 1491 PetscFunctionBegin; 1492 ierr = PetscPrintf(ts->comm,"timestep %D dt %g time %g\n",step,ts->time_step,ptime);CHKERRQ(ierr); 1493 PetscFunctionReturn(0); 1494 } 1495 1496 #undef __FUNCT__ 1497 #define __FUNCT__ "TSStep" 1498 /*@ 1499 TSStep - Steps the requested number of timesteps. 1500 1501 Collective on TS 1502 1503 Input Parameter: 1504 . ts - the TS context obtained from TSCreate() 1505 1506 Output Parameters: 1507 + steps - number of iterations until termination 1508 - ptime - time until termination 1509 1510 Level: beginner 1511 1512 .keywords: TS, timestep, solve 1513 1514 .seealso: TSCreate(), TSSetUp(), TSDestroy() 1515 @*/ 1516 PetscErrorCode PETSCTS_DLLEXPORT TSStep(TS ts,PetscInt *steps,PetscReal *ptime) 1517 { 1518 PetscErrorCode ierr; 1519 1520 PetscFunctionBegin; 1521 PetscValidHeaderSpecific(ts, TS_COOKIE,1); 1522 if (!ts->setupcalled) { 1523 ierr = TSSetUp(ts);CHKERRQ(ierr); 1524 } 1525 1526 ierr = PetscLogEventBegin(TS_Step, ts, 0, 0, 0);CHKERRQ(ierr); 1527 ierr = (*ts->ops->prestep)(ts);CHKERRQ(ierr); 1528 ierr = (*ts->ops->step)(ts, steps, ptime);CHKERRQ(ierr); 1529 ierr = (*ts->ops->poststep)(ts);CHKERRQ(ierr); 1530 ierr = PetscLogEventEnd(TS_Step, ts, 0, 0, 0);CHKERRQ(ierr); 1531 1532 if (!PetscPreLoadingOn) { 1533 ierr = TSViewFromOptions(ts,ts->name);CHKERRQ(ierr); 1534 } 1535 PetscFunctionReturn(0); 1536 } 1537 1538 #undef __FUNCT__ 1539 #define __FUNCT__ "TSMonitor" 1540 /* 1541 Runs the user provided monitor routines, if they exists. 1542 */ 1543 PetscErrorCode TSMonitor(TS ts,PetscInt step,PetscReal ptime,Vec x) 1544 { 1545 PetscErrorCode ierr; 1546 PetscInt i,n = ts->numbermonitors; 1547 1548 PetscFunctionBegin; 1549 for (i=0; i<n; i++) { 1550 ierr = (*ts->monitor[i])(ts,step,ptime,x,ts->monitorcontext[i]);CHKERRQ(ierr); 1551 } 1552 PetscFunctionReturn(0); 1553 } 1554 1555 /* ------------------------------------------------------------------------*/ 1556 1557 #undef __FUNCT__ 1558 #define __FUNCT__ "TSLGMonitorCreate" 1559 /*@C 1560 TSLGMonitorCreate - Creates a line graph context for use with 1561 TS to monitor convergence of preconditioned residual norms. 1562 1563 Collective on TS 1564 1565 Input Parameters: 1566 + host - the X display to open, or null for the local machine 1567 . label - the title to put in the title bar 1568 . x, y - the screen coordinates of the upper left coordinate of the window 1569 - m, n - the screen width and height in pixels 1570 1571 Output Parameter: 1572 . draw - the drawing context 1573 1574 Options Database Key: 1575 . -ts_xmonitor - automatically sets line graph monitor 1576 1577 Notes: 1578 Use TSLGMonitorDestroy() to destroy this line graph, not PetscDrawLGDestroy(). 1579 1580 Level: intermediate 1581 1582 .keywords: TS, monitor, line graph, residual, seealso 1583 1584 .seealso: TSLGMonitorDestroy(), TSSetMonitor() 1585 1586 @*/ 1587 PetscErrorCode PETSCTS_DLLEXPORT TSLGMonitorCreate(const char host[],const char label[],int x,int y,int m,int n,PetscDrawLG *draw) 1588 { 1589 PetscDraw win; 1590 PetscErrorCode ierr; 1591 1592 PetscFunctionBegin; 1593 ierr = PetscDrawCreate(PETSC_COMM_SELF,host,label,x,y,m,n,&win);CHKERRQ(ierr); 1594 ierr = PetscDrawSetType(win,PETSC_DRAW_X);CHKERRQ(ierr); 1595 ierr = PetscDrawLGCreate(win,1,draw);CHKERRQ(ierr); 1596 ierr = PetscDrawLGIndicateDataPoints(*draw);CHKERRQ(ierr); 1597 1598 ierr = PetscLogObjectParent(*draw,win);CHKERRQ(ierr); 1599 PetscFunctionReturn(0); 1600 } 1601 1602 #undef __FUNCT__ 1603 #define __FUNCT__ "TSLGMonitor" 1604 PetscErrorCode TSLGMonitor(TS ts,PetscInt n,PetscReal ptime,Vec v,void *monctx) 1605 { 1606 PetscDrawLG lg = (PetscDrawLG) monctx; 1607 PetscReal x,y = ptime; 1608 PetscErrorCode ierr; 1609 1610 PetscFunctionBegin; 1611 if (!monctx) { 1612 MPI_Comm comm; 1613 PetscViewer viewer; 1614 1615 ierr = PetscObjectGetComm((PetscObject)ts,&comm);CHKERRQ(ierr); 1616 viewer = PETSC_VIEWER_DRAW_(comm); 1617 ierr = PetscViewerDrawGetDrawLG(viewer,0,&lg);CHKERRQ(ierr); 1618 } 1619 1620 if (!n) {ierr = PetscDrawLGReset(lg);CHKERRQ(ierr);} 1621 x = (PetscReal)n; 1622 ierr = PetscDrawLGAddPoint(lg,&x,&y);CHKERRQ(ierr); 1623 if (n < 20 || (n % 5)) { 1624 ierr = PetscDrawLGDraw(lg);CHKERRQ(ierr); 1625 } 1626 PetscFunctionReturn(0); 1627 } 1628 1629 #undef __FUNCT__ 1630 #define __FUNCT__ "TSLGMonitorDestroy" 1631 /*@C 1632 TSLGMonitorDestroy - Destroys a line graph context that was created 1633 with TSLGMonitorCreate(). 1634 1635 Collective on PetscDrawLG 1636 1637 Input Parameter: 1638 . draw - the drawing context 1639 1640 Level: intermediate 1641 1642 .keywords: TS, monitor, line graph, destroy 1643 1644 .seealso: TSLGMonitorCreate(), TSSetMonitor(), TSLGMonitor(); 1645 @*/ 1646 PetscErrorCode PETSCTS_DLLEXPORT TSLGMonitorDestroy(PetscDrawLG drawlg) 1647 { 1648 PetscDraw draw; 1649 PetscErrorCode ierr; 1650 1651 PetscFunctionBegin; 1652 ierr = PetscDrawLGGetDraw(drawlg,&draw);CHKERRQ(ierr); 1653 ierr = PetscDrawDestroy(draw);CHKERRQ(ierr); 1654 ierr = PetscDrawLGDestroy(drawlg);CHKERRQ(ierr); 1655 PetscFunctionReturn(0); 1656 } 1657 1658 #undef __FUNCT__ 1659 #define __FUNCT__ "TSGetTime" 1660 /*@ 1661 TSGetTime - Gets the current time. 1662 1663 Not Collective 1664 1665 Input Parameter: 1666 . ts - the TS context obtained from TSCreate() 1667 1668 Output Parameter: 1669 . t - the current time 1670 1671 Contributed by: Matthew Knepley 1672 1673 Level: beginner 1674 1675 .seealso: TSSetInitialTimeStep(), TSGetTimeStep() 1676 1677 .keywords: TS, get, time 1678 @*/ 1679 PetscErrorCode PETSCTS_DLLEXPORT TSGetTime(TS ts,PetscReal* t) 1680 { 1681 PetscFunctionBegin; 1682 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 1683 PetscValidDoublePointer(t,2); 1684 *t = ts->ptime; 1685 PetscFunctionReturn(0); 1686 } 1687 1688 #undef __FUNCT__ 1689 #define __FUNCT__ "TSSetOptionsPrefix" 1690 /*@C 1691 TSSetOptionsPrefix - Sets the prefix used for searching for all 1692 TS options in the database. 1693 1694 Collective on TS 1695 1696 Input Parameter: 1697 + ts - The TS context 1698 - prefix - The prefix to prepend to all option names 1699 1700 Notes: 1701 A hyphen (-) must NOT be given at the beginning of the prefix name. 1702 The first character of all runtime options is AUTOMATICALLY the 1703 hyphen. 1704 1705 Contributed by: Matthew Knepley 1706 1707 Level: advanced 1708 1709 .keywords: TS, set, options, prefix, database 1710 1711 .seealso: TSSetFromOptions() 1712 1713 @*/ 1714 PetscErrorCode PETSCTS_DLLEXPORT TSSetOptionsPrefix(TS ts,const char prefix[]) 1715 { 1716 PetscErrorCode ierr; 1717 1718 PetscFunctionBegin; 1719 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 1720 ierr = PetscObjectSetOptionsPrefix((PetscObject)ts,prefix);CHKERRQ(ierr); 1721 switch(ts->problem_type) { 1722 case TS_NONLINEAR: 1723 ierr = SNESSetOptionsPrefix(ts->snes,prefix);CHKERRQ(ierr); 1724 break; 1725 case TS_LINEAR: 1726 ierr = KSPSetOptionsPrefix(ts->ksp,prefix);CHKERRQ(ierr); 1727 break; 1728 } 1729 PetscFunctionReturn(0); 1730 } 1731 1732 1733 #undef __FUNCT__ 1734 #define __FUNCT__ "TSAppendOptionsPrefix" 1735 /*@C 1736 TSAppendOptionsPrefix - Appends to the prefix used for searching for all 1737 TS options in the database. 1738 1739 Collective on TS 1740 1741 Input Parameter: 1742 + ts - The TS context 1743 - prefix - The prefix to prepend to all option names 1744 1745 Notes: 1746 A hyphen (-) must NOT be given at the beginning of the prefix name. 1747 The first character of all runtime options is AUTOMATICALLY the 1748 hyphen. 1749 1750 Contributed by: Matthew Knepley 1751 1752 Level: advanced 1753 1754 .keywords: TS, append, options, prefix, database 1755 1756 .seealso: TSGetOptionsPrefix() 1757 1758 @*/ 1759 PetscErrorCode PETSCTS_DLLEXPORT TSAppendOptionsPrefix(TS ts,const char prefix[]) 1760 { 1761 PetscErrorCode ierr; 1762 1763 PetscFunctionBegin; 1764 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 1765 ierr = PetscObjectAppendOptionsPrefix((PetscObject)ts,prefix);CHKERRQ(ierr); 1766 switch(ts->problem_type) { 1767 case TS_NONLINEAR: 1768 ierr = SNESAppendOptionsPrefix(ts->snes,prefix);CHKERRQ(ierr); 1769 break; 1770 case TS_LINEAR: 1771 ierr = KSPAppendOptionsPrefix(ts->ksp,prefix);CHKERRQ(ierr); 1772 break; 1773 } 1774 PetscFunctionReturn(0); 1775 } 1776 1777 #undef __FUNCT__ 1778 #define __FUNCT__ "TSGetOptionsPrefix" 1779 /*@C 1780 TSGetOptionsPrefix - Sets the prefix used for searching for all 1781 TS options in the database. 1782 1783 Not Collective 1784 1785 Input Parameter: 1786 . ts - The TS context 1787 1788 Output Parameter: 1789 . prefix - A pointer to the prefix string used 1790 1791 Contributed by: Matthew Knepley 1792 1793 Notes: On the fortran side, the user should pass in a string 'prifix' of 1794 sufficient length to hold the prefix. 1795 1796 Level: intermediate 1797 1798 .keywords: TS, get, options, prefix, database 1799 1800 .seealso: TSAppendOptionsPrefix() 1801 @*/ 1802 PetscErrorCode PETSCTS_DLLEXPORT TSGetOptionsPrefix(TS ts,const char *prefix[]) 1803 { 1804 PetscErrorCode ierr; 1805 1806 PetscFunctionBegin; 1807 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 1808 PetscValidPointer(prefix,2); 1809 ierr = PetscObjectGetOptionsPrefix((PetscObject)ts,prefix);CHKERRQ(ierr); 1810 PetscFunctionReturn(0); 1811 } 1812 1813 #undef __FUNCT__ 1814 #define __FUNCT__ "TSGetRHSMatrix" 1815 /*@C 1816 TSGetRHSMatrix - Returns the matrix A at the present timestep. 1817 1818 Not Collective, but parallel objects are returned if TS is parallel 1819 1820 Input Parameter: 1821 . ts - The TS context obtained from TSCreate() 1822 1823 Output Parameters: 1824 + A - The matrix A, where U_t = A(t) U 1825 . M - The preconditioner matrix, usually the same as A 1826 - ctx - User-defined context for matrix evaluation routine 1827 1828 Notes: You can pass in PETSC_NULL for any return argument you do not need. 1829 1830 Contributed by: Matthew Knepley 1831 1832 Level: intermediate 1833 1834 .seealso: TSGetTimeStep(), TSGetTime(), TSGetTimeStepNumber(), TSGetRHSJacobian() 1835 1836 .keywords: TS, timestep, get, matrix 1837 1838 @*/ 1839 PetscErrorCode PETSCTS_DLLEXPORT TSGetRHSMatrix(TS ts,Mat *A,Mat *M,void **ctx) 1840 { 1841 PetscFunctionBegin; 1842 PetscValidHeaderSpecific(ts,TS_COOKIE,1); 1843 if (A) *A = ts->A; 1844 if (M) *M = ts->B; 1845 if (ctx) *ctx = ts->jacP; 1846 PetscFunctionReturn(0); 1847 } 1848 1849 #undef __FUNCT__ 1850 #define __FUNCT__ "TSGetRHSJacobian" 1851 /*@C 1852 TSGetRHSJacobian - Returns the Jacobian J at the present timestep. 1853 1854 Not Collective, but parallel objects are returned if TS is parallel 1855 1856 Input Parameter: 1857 . ts - The TS context obtained from TSCreate() 1858 1859 Output Parameters: 1860 + J - The Jacobian J of F, where U_t = F(U,t) 1861 . M - The preconditioner matrix, usually the same as J 1862 - ctx - User-defined context for Jacobian evaluation routine 1863 1864 Notes: You can pass in PETSC_NULL for any return argument you do not need. 1865 1866 Contributed by: Matthew Knepley 1867 1868 Level: intermediate 1869 1870 .seealso: TSGetTimeStep(), TSGetRHSMatrix(), TSGetTime(), TSGetTimeStepNumber() 1871 1872 .keywords: TS, timestep, get, matrix, Jacobian 1873 @*/ 1874 PetscErrorCode PETSCTS_DLLEXPORT TSGetRHSJacobian(TS ts,Mat *J,Mat *M,void **ctx) 1875 { 1876 PetscErrorCode ierr; 1877 1878 PetscFunctionBegin; 1879 ierr = TSGetRHSMatrix(ts,J,M,ctx);CHKERRQ(ierr); 1880 PetscFunctionReturn(0); 1881 } 1882 1883 #undef __FUNCT__ 1884 #define __FUNCT__ "TSVecViewMonitor" 1885 /*@C 1886 TSVecViewMonitor - Monitors progress of the TS solvers by calling 1887 VecView() for the solution at each timestep 1888 1889 Collective on TS 1890 1891 Input Parameters: 1892 + ts - the TS context 1893 . step - current time-step 1894 . ptime - current time 1895 - dummy - either a viewer or PETSC_NULL 1896 1897 Level: intermediate 1898 1899 .keywords: TS, vector, monitor, view 1900 1901 .seealso: TSSetMonitor(), TSDefaultMonitor(), VecView() 1902 @*/ 1903 PetscErrorCode PETSCTS_DLLEXPORT TSVecViewMonitor(TS ts,PetscInt step,PetscReal ptime,Vec x,void *dummy) 1904 { 1905 PetscErrorCode ierr; 1906 PetscViewer viewer = (PetscViewer) dummy; 1907 1908 PetscFunctionBegin; 1909 if (!viewer) { 1910 MPI_Comm comm; 1911 ierr = PetscObjectGetComm((PetscObject)ts,&comm);CHKERRQ(ierr); 1912 viewer = PETSC_VIEWER_DRAW_(comm); 1913 } 1914 ierr = VecView(x,viewer);CHKERRQ(ierr); 1915 PetscFunctionReturn(0); 1916 } 1917 1918 1919 1920