1 2 #include <petsc/private/tsimpl.h> /*I "petscts.h" I*/ 3 4 PetscFunctionList TSTrajectoryList = NULL; 5 PetscBool TSTrajectoryRegisterAllCalled = PETSC_FALSE; 6 PetscClassId TSTRAJECTORY_CLASSID; 7 PetscLogEvent TSTrajectory_Set, TSTrajectory_Get; 8 9 /*@C 10 TSTrajectoryRegister - Adds a way of storing trajectories to the TS package 11 12 Not Collective 13 14 Input Parameters: 15 + name - the name of a new user-defined creation routine 16 - create_func - the creation routine itself 17 18 Notes: 19 TSTrajectoryRegister() may be called multiple times to add several user-defined tses. 20 21 Level: developer 22 23 .keywords: TS, trajectory, timestep, register 24 25 .seealso: TSTrajectoryRegisterAll() 26 @*/ 27 PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS)) 28 { 29 PetscErrorCode ierr; 30 31 PetscFunctionBegin; 32 ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr); 33 PetscFunctionReturn(0); 34 } 35 36 PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X) 37 { 38 PetscErrorCode ierr; 39 40 PetscFunctionBegin; 41 if (!tj) PetscFunctionReturn(0); 42 ierr = PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr); 43 ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr); 44 ierr = PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr); 45 PetscFunctionReturn(0); 46 } 47 48 PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time) 49 { 50 PetscErrorCode ierr; 51 52 PetscFunctionBegin; 53 if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 54 if (stepnum < 0) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_PLIB,"Requesting negative step number"); 55 ierr = PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 56 ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr); 57 ierr = PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 58 PetscFunctionReturn(0); 59 } 60 61 /*@C 62 TSTrajectoryView - Prints information about the trajectory object 63 64 Collective on TSTrajectory 65 66 Input Parameters: 67 + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 68 - viewer - visualization context 69 70 Options Database Key: 71 . -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep() 72 73 Notes: 74 The available visualization contexts include 75 + PETSC_VIEWER_STDOUT_SELF - standard output (default) 76 - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 77 output where only the first processor opens 78 the file. All other processors send their 79 data to the first processor to print. 80 81 The user can open an alternative visualization context with 82 PetscViewerASCIIOpen() - output to a specified file. 83 84 Level: developer 85 86 .keywords: TS, trajectory, timestep, view 87 88 .seealso: PetscViewerASCIIOpen() 89 @*/ 90 PetscErrorCode TSTrajectoryView(TSTrajectory tj,PetscViewer viewer) 91 { 92 PetscErrorCode ierr; 93 PetscBool iascii; 94 95 PetscFunctionBegin; 96 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 97 if (!viewer) { 98 ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr); 99 } 100 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 101 PetscCheckSameComm(tj,1,viewer,2); 102 103 ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 104 if (iascii) { 105 ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr); 106 ierr = PetscViewerASCIIPrintf(viewer," total number of recomputations for adjoint calculation = %D\n",tj->recomps);CHKERRQ(ierr); 107 ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint reads = %D\n",tj->diskreads);CHKERRQ(ierr); 108 ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint writes = %D\n",tj->diskwrites);CHKERRQ(ierr); 109 if (tj->ops->view) { 110 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 111 ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr); 112 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 113 } 114 } 115 PetscFunctionReturn(0); 116 } 117 118 /*@C 119 TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory 120 121 Collective on TSTrajectory 122 123 Input Parameters: 124 + tr - the trajectory context 125 - names - the names of the components, final string must be NULL 126 127 Level: intermediate 128 129 Note: Fortran interface is not possible because of the string array argument 130 131 .keywords: TS, TSTrajectory, vector, monitor, view 132 133 .seealso: TSTrajectory, TSGetTrajectory() 134 @*/ 135 PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names) 136 { 137 PetscErrorCode ierr; 138 139 PetscFunctionBegin; 140 ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr); 141 ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr); 142 PetscFunctionReturn(0); 143 } 144 145 /*@C 146 TSTrjactorySetTransform - Solution vector will be transformed by provided function before being saved to disk 147 148 Collective on TSLGCtx 149 150 Input Parameters: 151 + tj - the TSTrajectory context 152 . transform - the transform function 153 . destroy - function to destroy the optional context 154 - ctx - optional context used by transform function 155 156 Level: intermediate 157 158 .keywords: TSTrajectory, vector, monitor, view 159 160 .seealso: TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform() 161 @*/ 162 PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx) 163 { 164 PetscFunctionBegin; 165 tj->transform = transform; 166 tj->transformdestroy = destroy; 167 tj->transformctx = tctx; 168 PetscFunctionReturn(0); 169 } 170 171 172 /*@ 173 TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 174 175 Collective on MPI_Comm 176 177 Input Parameter: 178 . comm - the communicator 179 180 Output Parameter: 181 . tj - the trajectory object 182 183 Level: developer 184 185 Notes: 186 Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). 187 188 .keywords: TS, trajectory, create 189 190 .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles() 191 @*/ 192 PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 193 { 194 TSTrajectory t; 195 PetscErrorCode ierr; 196 197 PetscFunctionBegin; 198 PetscValidPointer(tj,2); 199 *tj = NULL; 200 ierr = TSInitializePackage();CHKERRQ(ierr); 201 202 ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr); 203 t->setupcalled = PETSC_FALSE; 204 t->keepfiles = PETSC_TRUE; 205 *tj = t; 206 ierr = TSTrajectorySetDirname(t,"SA-data");CHKERRQ(ierr); 207 ierr = TSTrajectorySetFiletemplate(t,"SA-%06D.bin");CHKERRQ(ierr); 208 PetscFunctionReturn(0); 209 } 210 211 /*@C 212 TSTrajectorySetType - Sets the storage method to be used as in a trajectory 213 214 Collective on TS 215 216 Input Parameters: 217 + tj - the TSTrajectory context 218 . ts - the TS context 219 - type - a known method 220 221 Options Database Command: 222 . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 223 224 Level: developer 225 226 .keywords: TS, trajectory, timestep, set, type 227 228 .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy() 229 230 @*/ 231 PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type) 232 { 233 PetscErrorCode (*r)(TSTrajectory,TS); 234 PetscBool match; 235 PetscErrorCode ierr; 236 237 PetscFunctionBegin; 238 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 239 ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr); 240 if (match) PetscFunctionReturn(0); 241 242 ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr); 243 if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 244 if (tj->ops->destroy) { 245 ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr); 246 247 tj->ops->destroy = NULL; 248 } 249 ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr); 250 251 ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr); 252 ierr = (*r)(tj,ts);CHKERRQ(ierr); 253 PetscFunctionReturn(0); 254 } 255 256 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 257 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 258 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 259 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS); 260 261 /*@C 262 TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 263 264 Not Collective 265 266 Level: developer 267 268 .keywords: TS, trajectory, register, all 269 270 .seealso: TSTrajectoryRegister() 271 @*/ 272 PetscErrorCode TSTrajectoryRegisterAll(void) 273 { 274 PetscErrorCode ierr; 275 276 PetscFunctionBegin; 277 if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 278 TSTrajectoryRegisterAllCalled = PETSC_TRUE; 279 280 ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr); 281 ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr); 282 ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr); 283 ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr); 284 PetscFunctionReturn(0); 285 } 286 287 /*@ 288 TSTrajectoryReset - Resets a trajectory context 289 290 Collective on TSTrajectory 291 292 Input Parameter: 293 . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 294 295 Level: developer 296 297 .keywords: TS, trajectory, timestep, reset 298 299 .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 300 @*/ 301 PetscErrorCode TSTrajectoryReset(TSTrajectory tj) 302 { 303 PetscErrorCode ierr; 304 305 PetscFunctionBegin; 306 if (!tj) PetscFunctionReturn(0); 307 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 308 309 if (tj->ops->reset) { 310 ierr = (*tj->ops->reset)(tj);CHKERRQ(ierr); 311 } 312 tj->setupcalled = PETSC_FALSE; 313 ierr = PetscFree(tj->dirfiletemplate);CHKERRQ(ierr); 314 PetscFunctionReturn(0); 315 } 316 317 /*@ 318 TSTrajectoryDestroy - Destroys a trajectory context 319 320 Collective on TSTrajectory 321 322 Input Parameter: 323 . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 324 325 Level: developer 326 327 .keywords: TS, trajectory, timestep, destroy 328 329 .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 330 @*/ 331 PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 332 { 333 PetscErrorCode ierr; 334 335 PetscFunctionBegin; 336 if (!*tj) PetscFunctionReturn(0); 337 PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 338 if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 339 340 ierr = TSTrajectoryReset((*tj));CHKERRQ(ierr); 341 342 if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);} 343 if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 344 ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr); 345 ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr); 346 ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr); 347 ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr); 348 ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 349 PetscFunctionReturn(0); 350 } 351 352 /* 353 TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 354 355 Collective on TSTrajectory 356 357 Input Parameter: 358 + tj - the TSTrajectory context 359 - ts - the TS context 360 361 Options Database Keys: 362 . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 363 364 Level: developer 365 366 .keywords: TS, trajectory, set, options, type 367 368 .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType() 369 */ 370 static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 371 { 372 PetscBool opt; 373 const char *defaultType; 374 char typeName[256]; 375 PetscBool flg; 376 PetscErrorCode ierr; 377 378 PetscFunctionBegin; 379 if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 380 else defaultType = TSTRAJECTORYBASIC; 381 382 ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr); 383 ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 384 if (opt) { 385 ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr); 386 ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr); 387 } else { 388 ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr); 389 } 390 PetscFunctionReturn(0); 391 } 392 393 /*@ 394 TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 395 396 Collective on TSTrajectory 397 398 Input Arguments: 399 + tj - the TSTrajectory context 400 - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 401 402 Options Database Keys: 403 . -ts_trajectory_monitor - print TSTrajectory information 404 405 Level: developer 406 407 .keywords: TS, trajectory, set, monitor 408 409 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp() 410 @*/ 411 PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg) 412 { 413 PetscErrorCode ierr; 414 415 PetscFunctionBegin; 416 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 417 PetscValidLogicalCollectiveBool(tj,flg,2); 418 if (flg) { 419 if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);} 420 } else { 421 ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr); 422 } 423 PetscFunctionReturn(0); 424 } 425 426 /*@ 427 TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory 428 429 Collective on TSTrajectory 430 431 Input Arguments: 432 + tj - the TSTrajectory context 433 - flg - PETSC_TRUE to save, PETSC_FALSE to disable 434 435 Options Database Keys: 436 . -ts_trajectory_keep_files - have it keep the files 437 438 Notes: 439 By default the TSTrajectory used for adjoint computations, TSTRAJECTORYBASIC, removes the files it generates at the end of the run. This causes the files to be kept. 440 441 Level: advanced 442 443 .keywords: TS, trajectory, set, monitor 444 445 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor() 446 @*/ 447 PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg) 448 { 449 PetscFunctionBegin; 450 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 451 PetscValidLogicalCollectiveBool(tj,flg,2); 452 tj->keepfiles = flg; 453 PetscFunctionReturn(0); 454 } 455 456 /*@C 457 TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored. 458 459 Collective on TSTrajectory 460 461 Input Arguments: 462 + tj - the TSTrajectory context 463 - dirname - the directory name 464 465 Options Database Keys: 466 . -ts_trajectory_dirname - set the directory name 467 468 Notes: 469 The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate() 470 471 Level: developer 472 473 .keywords: TS, trajectory, set 474 475 .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp() 476 @*/ 477 PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[]) 478 { 479 PetscErrorCode ierr; 480 PetscFunctionBegin; 481 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 482 if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after it TSTrajectory has been setup"); 483 ierr = PetscFree(tj->dirname);CHKERRQ(ierr); 484 ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr); 485 PetscFunctionReturn(0); 486 } 487 488 /*@C 489 TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints. 490 491 Collective on TSTrajectory 492 493 Input Arguments: 494 + tj - the TSTrajectory context 495 - filetemplate - the template 496 497 Options Database Keys: 498 . -ts_trajectory_file_template - set the file name template 499 500 Notes: 501 The name template should be of the form, for example filename-%06D.bin It should not begin with a leading / 502 503 The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the 504 timestep counter 505 506 Level: developer 507 508 .keywords: TS, trajectory, set 509 510 .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp() 511 @*/ 512 PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[]) 513 { 514 PetscErrorCode ierr; 515 const char *ptr,*ptr2; 516 517 PetscFunctionBegin; 518 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 519 if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup"); 520 521 if (!filetemplate[0]) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin"); 522 /* Do some cursory validation of the input. */ 523 ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr); 524 if (!ptr) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin"); 525 for (ptr++; ptr && *ptr; ptr++) { 526 ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr); 527 if (!ptr2 && (*ptr < '0' || '9' < *ptr)) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"Invalid file template argument to -ts_trajectory_file_template, should look like filename-%%06D.bin"); 528 if (ptr2) break; 529 } 530 ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr); 531 ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr); 532 PetscFunctionReturn(0); 533 } 534 535 /*@ 536 TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 537 538 Collective on TSTrajectory 539 540 Input Parameter: 541 + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 542 - ts - the TS context 543 544 Options Database Keys: 545 + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 546 . -ts_trajectory_keep_files <true,false> - keep the files generated by the code after the program ends. This is true by default for TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 547 - -ts_trajectory_monitor - print TSTrajectory information 548 549 Level: developer 550 551 Notes: 552 This is not normally called directly by users 553 554 .keywords: TS, trajectory, timestep, set, options, database 555 556 .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp() 557 @*/ 558 PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 559 { 560 PetscBool set,flg; 561 char dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN]; 562 PetscErrorCode ierr; 563 564 PetscFunctionBegin; 565 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 566 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 567 ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 568 ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 569 ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 570 if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);} 571 572 ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr); 573 if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);} 574 575 ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr); 576 if (set) { 577 ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr); 578 } 579 580 ierr = PetscOptionsString("-ts_trajectory_file_template","Template for TSTrajectory file name, use filename-%06D.bin","TSTrajectorySetFiletemplate",0,filetemplate,PETSC_MAX_PATH_LEN,&set);CHKERRQ(ierr); 581 if (set) { 582 ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr); 583 } 584 585 /* Handle specific TSTrajectory options */ 586 if (tj->ops->setfromoptions) { 587 ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr); 588 } 589 ierr = PetscOptionsEnd();CHKERRQ(ierr); 590 PetscFunctionReturn(0); 591 } 592 593 /*@ 594 TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 595 of a TS trajectory. 596 597 Collective on TS 598 599 Input Parameter: 600 + ts - the TS context obtained from TSCreate() 601 - tj - the TS trajectory context 602 603 Level: developer 604 605 .keywords: TS, trajectory, setup 606 607 .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 608 @*/ 609 PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 610 { 611 PetscErrorCode ierr; 612 size_t s1,s2; 613 614 PetscFunctionBegin; 615 if (!tj) PetscFunctionReturn(0); 616 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 617 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 618 if (tj->setupcalled) PetscFunctionReturn(0); 619 620 if (!((PetscObject)tj)->type_name) { 621 ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr); 622 } 623 if (tj->ops->setup) { 624 ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr); 625 } 626 627 tj->setupcalled = PETSC_TRUE; 628 629 /* Set the counters to zero */ 630 tj->recomps = 0; 631 tj->diskreads = 0; 632 tj->diskwrites = 0; 633 ierr = PetscStrlen(tj->dirname,&s1);CHKERRQ(ierr); 634 ierr = PetscStrlen(tj->filetemplate,&s2);CHKERRQ(ierr); 635 ierr = PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate);CHKERRQ(ierr); 636 ierr = PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate);CHKERRQ(ierr); 637 PetscFunctionReturn(0); 638 } 639