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 if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 309 if ((*tj)->ops->reset) {ierr = (*(*tj)->ops->reset)((*tj));CHKERRQ(ierr);} 310 (*tj)->setupcalled = PETSC_FALSE; 311 PetscFunctionReturn(0); 312 } 313 314 /*@ 315 TSTrajectoryDestroy - Destroys a trajectory context 316 317 Collective on TSTrajectory 318 319 Input Parameter: 320 . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 321 322 Level: developer 323 324 .keywords: TS, trajectory, timestep, destroy 325 326 .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 327 @*/ 328 PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 329 { 330 PetscErrorCode ierr; 331 332 PetscFunctionBegin; 333 if (!*tj) PetscFunctionReturn(0); 334 PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 335 if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 336 337 if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);} 338 if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 339 ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr); 340 ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr); 341 ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr); 342 ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr); 343 ierr = PetscFree((*tj)->dirfiletemplate);CHKERRQ(ierr); 344 ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 345 PetscFunctionReturn(0); 346 } 347 348 /* 349 TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 350 351 Collective on TSTrajectory 352 353 Input Parameter: 354 + tj - the TSTrajectory context 355 - ts - the TS context 356 357 Options Database Keys: 358 . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 359 360 Level: developer 361 362 .keywords: TS, trajectory, set, options, type 363 364 .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType() 365 */ 366 static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 367 { 368 PetscBool opt; 369 const char *defaultType; 370 char typeName[256]; 371 PetscBool flg; 372 PetscErrorCode ierr; 373 374 PetscFunctionBegin; 375 if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 376 else defaultType = TSTRAJECTORYBASIC; 377 378 ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr); 379 ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 380 if (opt) { 381 ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr); 382 ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr); 383 } else { 384 ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr); 385 } 386 PetscFunctionReturn(0); 387 } 388 389 /*@ 390 TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 391 392 Collective on TSTrajectory 393 394 Input Arguments: 395 + tj - the TSTrajectory context 396 - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 397 398 Options Database Keys: 399 . -ts_trajectory_monitor - print TSTrajectory information 400 401 Level: developer 402 403 .keywords: TS, trajectory, set, monitor 404 405 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp() 406 @*/ 407 PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg) 408 { 409 PetscErrorCode ierr; 410 411 PetscFunctionBegin; 412 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 413 PetscValidLogicalCollectiveBool(tj,flg,2); 414 if (flg) { 415 if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);} 416 } else { 417 ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr); 418 } 419 PetscFunctionReturn(0); 420 } 421 422 /*@ 423 TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory 424 425 Collective on TSTrajectory 426 427 Input Arguments: 428 + tj - the TSTrajectory context 429 - flg - PETSC_TRUE to save, PETSC_FALSE to disable 430 431 Options Database Keys: 432 . -ts_trajectory_keep_files - have it keep the files 433 434 Notes: 435 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. 436 437 Level: advanced 438 439 .keywords: TS, trajectory, set, monitor 440 441 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor() 442 @*/ 443 PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg) 444 { 445 PetscFunctionBegin; 446 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 447 PetscValidLogicalCollectiveBool(tj,flg,2); 448 tj->keepfiles = flg; 449 PetscFunctionReturn(0); 450 } 451 452 /*@C 453 TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored. 454 455 Collective on TSTrajectory 456 457 Input Arguments: 458 + tj - the TSTrajectory context 459 - dirname - the directory name 460 461 Options Database Keys: 462 . -ts_trajectory_dirname - set the directory name 463 464 Notes: 465 The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate() 466 467 Level: developer 468 469 .keywords: TS, trajectory, set 470 471 .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp() 472 @*/ 473 PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[]) 474 { 475 PetscErrorCode ierr; 476 PetscFunctionBegin; 477 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 478 if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after it TSTrajectory has been setup"); 479 ierr = PetscFree(tj->dirname);CHKERRQ(ierr); 480 ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr); 481 PetscFunctionReturn(0); 482 } 483 484 /*@C 485 TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints. 486 487 Collective on TSTrajectory 488 489 Input Arguments: 490 + tj - the TSTrajectory context 491 - filetemplate - the template 492 493 Options Database Keys: 494 . -ts_trajectory_file_template - set the file name template 495 496 Notes: 497 The name template should be of the form, for example filename-%06D.bin It should not begin with a leading / 498 499 The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the 500 timestep counter 501 502 Level: developer 503 504 .keywords: TS, trajectory, set 505 506 .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp() 507 @*/ 508 PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[]) 509 { 510 PetscErrorCode ierr; 511 const char *ptr,*ptr2; 512 513 PetscFunctionBegin; 514 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 515 if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup"); 516 517 if (!filetemplate[0]) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin"); 518 /* Do some cursory validation of the input. */ 519 ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr); 520 if (!ptr) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin"); 521 for (ptr++; ptr && *ptr; ptr++) { 522 ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr); 523 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"); 524 if (ptr2) break; 525 } 526 ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr); 527 ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr); 528 PetscFunctionReturn(0); 529 } 530 531 /*@ 532 TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 533 534 Collective on TSTrajectory 535 536 Input Parameter: 537 + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 538 - ts - the TS context 539 540 Options Database Keys: 541 + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 542 . -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 543 - -ts_trajectory_monitor - print TSTrajectory information 544 545 Level: developer 546 547 Notes: 548 This is not normally called directly by users 549 550 .keywords: TS, trajectory, timestep, set, options, database 551 552 .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp() 553 @*/ 554 PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 555 { 556 PetscBool set,flg; 557 char dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN]; 558 PetscErrorCode ierr; 559 560 PetscFunctionBegin; 561 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 562 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 563 ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 564 ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 565 ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 566 if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);} 567 568 ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr); 569 if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);} 570 571 ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr); 572 if (set) { 573 ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr); 574 } 575 576 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); 577 if (set) { 578 ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr); 579 } 580 581 /* Handle specific TSTrajectory options */ 582 if (tj->ops->setfromoptions) { 583 ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr); 584 } 585 ierr = PetscOptionsEnd();CHKERRQ(ierr); 586 PetscFunctionReturn(0); 587 } 588 589 /*@ 590 TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 591 of a TS trajectory. 592 593 Collective on TS 594 595 Input Parameter: 596 + ts - the TS context obtained from TSCreate() 597 - tj - the TS trajectory context 598 599 Level: developer 600 601 .keywords: TS, trajectory, setup 602 603 .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 604 @*/ 605 PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 606 { 607 PetscErrorCode ierr; 608 size_t s1,s2; 609 610 PetscFunctionBegin; 611 if (!tj) PetscFunctionReturn(0); 612 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 613 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 614 if (tj->setupcalled) PetscFunctionReturn(0); 615 616 if (!((PetscObject)tj)->type_name) { 617 ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr); 618 } 619 if (tj->ops->setup) { 620 ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr); 621 } 622 623 tj->setupcalled = PETSC_TRUE; 624 625 /* Set the counters to zero */ 626 tj->recomps = 0; 627 tj->diskreads = 0; 628 tj->diskwrites = 0; 629 ierr = PetscStrlen(tj->dirname,&s1);CHKERRQ(ierr); 630 ierr = PetscStrlen(tj->filetemplate,&s2);CHKERRQ(ierr); 631 ierr = PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate);CHKERRQ(ierr); 632 ierr = PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate);CHKERRQ(ierr); 633 PetscFunctionReturn(0); 634 } 635