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 ierr = PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 55 ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr); 56 ierr = PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 57 PetscFunctionReturn(0); 58 } 59 60 /*@C 61 TSTrajectoryView - Prints information about the trajectory object 62 63 Collective on TSTrajectory 64 65 Input Parameters: 66 + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 67 - viewer - visualization context 68 69 Options Database Key: 70 . -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep() 71 72 Notes: 73 The available visualization contexts include 74 + PETSC_VIEWER_STDOUT_SELF - standard output (default) 75 - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 76 output where only the first processor opens 77 the file. All other processors send their 78 data to the first processor to print. 79 80 The user can open an alternative visualization context with 81 PetscViewerASCIIOpen() - output to a specified file. 82 83 Level: developer 84 85 .keywords: TS, trajectory, timestep, view 86 87 .seealso: PetscViewerASCIIOpen() 88 @*/ 89 PetscErrorCode TSTrajectoryView(TSTrajectory tj,PetscViewer viewer) 90 { 91 PetscErrorCode ierr; 92 PetscBool iascii; 93 94 PetscFunctionBegin; 95 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 96 if (!viewer) { 97 ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr); 98 } 99 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 100 PetscCheckSameComm(tj,1,viewer,2); 101 102 ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 103 if (iascii) { 104 ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr); 105 ierr = PetscViewerASCIIPrintf(viewer," total number of recomputations for adjoint calculation = %D\n",tj->recomps);CHKERRQ(ierr); 106 ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint reads = %D\n",tj->diskreads);CHKERRQ(ierr); 107 ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint writes = %D\n",tj->diskwrites);CHKERRQ(ierr); 108 if (tj->ops->view) { 109 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 110 ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr); 111 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 112 } 113 } 114 PetscFunctionReturn(0); 115 } 116 117 /*@C 118 TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory 119 120 Collective on TSTrajectory 121 122 Input Parameters: 123 + tr - the trajectory context 124 - names - the names of the components, final string must be NULL 125 126 Level: intermediate 127 128 .keywords: TS, TSTrajectory, vector, monitor, view 129 130 .seealso: TSTrajectory, TSGetTrajectory() 131 @*/ 132 PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names) 133 { 134 PetscErrorCode ierr; 135 136 PetscFunctionBegin; 137 ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr); 138 ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr); 139 PetscFunctionReturn(0); 140 } 141 142 /*@C 143 TSTrjactorySetTransform - Solution vector will be transformed by provided function before being saved to disk 144 145 Collective on TSLGCtx 146 147 Input Parameters: 148 + tj - the TSTrajectory context 149 . transform - the transform function 150 . destroy - function to destroy the optional context 151 - ctx - optional context used by transform function 152 153 Level: intermediate 154 155 .keywords: TSTrajectory, vector, monitor, view 156 157 .seealso: TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform() 158 @*/ 159 PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx) 160 { 161 PetscFunctionBegin; 162 tj->transform = transform; 163 tj->transformdestroy = destroy; 164 tj->transformctx = tctx; 165 PetscFunctionReturn(0); 166 } 167 168 169 /*@C 170 TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 171 172 Collective on MPI_Comm 173 174 Input Parameter: 175 . comm - the communicator 176 177 Output Parameter: 178 . tj - the trajectory object 179 180 Level: developer 181 182 Notes: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). 183 184 .keywords: TS, trajectory, create 185 186 .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory() 187 @*/ 188 PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 189 { 190 TSTrajectory t; 191 PetscErrorCode ierr; 192 193 PetscFunctionBegin; 194 PetscValidPointer(tj,2); 195 *tj = NULL; 196 ierr = TSInitializePackage();CHKERRQ(ierr); 197 198 ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr); 199 t->setupcalled = PETSC_FALSE; 200 *tj = t; 201 PetscFunctionReturn(0); 202 } 203 204 /*@C 205 TSTrajectorySetType - Sets the storage method to be used as in a trajectory 206 207 Collective on TS 208 209 Input Parameters: 210 + tj - the TSTrajectory context 211 . ts - the TS context 212 - type - a known method 213 214 Options Database Command: 215 . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 216 217 Level: developer 218 219 .keywords: TS, trajectory, timestep, set, type 220 221 .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy() 222 223 @*/ 224 PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type) 225 { 226 PetscErrorCode (*r)(TSTrajectory,TS); 227 PetscBool match; 228 PetscErrorCode ierr; 229 230 PetscFunctionBegin; 231 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 232 ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr); 233 if (match) PetscFunctionReturn(0); 234 235 ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr); 236 if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 237 if (tj->ops->destroy) { 238 ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr); 239 240 tj->ops->destroy = NULL; 241 } 242 ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr); 243 244 ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr); 245 ierr = (*r)(tj,ts);CHKERRQ(ierr); 246 PetscFunctionReturn(0); 247 } 248 249 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 250 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 251 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 252 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS); 253 254 /*@C 255 TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 256 257 Not Collective 258 259 Level: developer 260 261 .keywords: TS, trajectory, register, all 262 263 .seealso: TSTrajectoryRegister() 264 @*/ 265 PetscErrorCode TSTrajectoryRegisterAll(void) 266 { 267 PetscErrorCode ierr; 268 269 PetscFunctionBegin; 270 if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 271 TSTrajectoryRegisterAllCalled = PETSC_TRUE; 272 273 ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr); 274 ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr); 275 ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr); 276 ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr); 277 PetscFunctionReturn(0); 278 } 279 280 /*@ 281 TSTrajectoryDestroy - Destroys a trajectory context 282 283 Collective on TSTrajectory 284 285 Input Parameter: 286 . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 287 288 Level: developer 289 290 .keywords: TS, trajectory, timestep, destroy 291 292 .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 293 @*/ 294 PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 295 { 296 PetscErrorCode ierr; 297 298 PetscFunctionBegin; 299 if (!*tj) PetscFunctionReturn(0); 300 PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 301 if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 302 303 if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);} 304 if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 305 ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr); 306 ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr); 307 ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 308 PetscFunctionReturn(0); 309 } 310 311 /* 312 TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 313 314 Collective on TSTrajectory 315 316 Input Parameter: 317 + tj - the TSTrajectory context 318 - ts - the TS context 319 320 Options Database Keys: 321 . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 322 323 Level: developer 324 325 .keywords: TS, trajectory, set, options, type 326 327 .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType() 328 */ 329 static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 330 { 331 PetscBool opt; 332 const char *defaultType; 333 char typeName[256]; 334 PetscBool flg; 335 PetscErrorCode ierr; 336 337 PetscFunctionBegin; 338 if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 339 else defaultType = TSTRAJECTORYBASIC; 340 341 ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr); 342 ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method"," TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 343 if (opt) { 344 ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr); 345 ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr); 346 } else { 347 ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr); 348 } 349 PetscFunctionReturn(0); 350 } 351 352 /*@ 353 TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 354 355 Collective on TSTrajectory 356 357 Input Arguments: 358 + tj - the TSTrajectory context 359 - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 360 361 Options Database Keys: 362 . -ts_trajectory_monitor - print TSTrajectory information 363 364 Level: developer 365 366 .keywords: TS, trajectory, set, monitor 367 368 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp() 369 @*/ 370 PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg) 371 { 372 PetscErrorCode ierr; 373 374 PetscFunctionBegin; 375 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 376 PetscValidLogicalCollectiveBool(tj,flg,2); 377 if (flg) { 378 if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);} 379 } else { 380 ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr); 381 } 382 PetscFunctionReturn(0); 383 } 384 385 /*@ 386 TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 387 388 Collective on TSTrajectory 389 390 Input Parameter: 391 + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 392 - ts - the TS context 393 394 Options Database Keys: 395 + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 396 - -ts_trajectory_monitor - print TSTrajectory information 397 398 Level: developer 399 400 Notes: This is not normally called directly by users 401 402 .keywords: TS, trajectory, timestep, set, options, database 403 404 .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp() 405 @*/ 406 PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 407 { 408 PetscErrorCode ierr; 409 PetscBool set,flg; 410 411 PetscFunctionBegin; 412 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 413 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 414 ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 415 ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 416 ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 417 if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);} 418 /* Handle specific TS options */ 419 if (tj->ops->setfromoptions) { 420 ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr); 421 } 422 ierr = PetscOptionsEnd();CHKERRQ(ierr); 423 PetscFunctionReturn(0); 424 } 425 426 /*@ 427 TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 428 of a TS trajectory. 429 430 Collective on TS 431 432 Input Parameter: 433 + ts - the TS context obtained from TSCreate() 434 - tj - the TS trajectory context 435 436 Level: developer 437 438 .keywords: TS, trajectory, setup 439 440 .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 441 @*/ 442 PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 443 { 444 PetscErrorCode ierr; 445 446 PetscFunctionBegin; 447 if (!tj) PetscFunctionReturn(0); 448 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 449 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 450 if (tj->setupcalled) PetscFunctionReturn(0); 451 452 if (!((PetscObject)tj)->type_name) { 453 ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr); 454 } 455 if (tj->ops->setup) { 456 ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr); 457 } 458 459 tj->setupcalled = PETSC_TRUE; 460 461 /* Set the counters to zero */ 462 tj->recomps = 0; 463 tj->diskreads = 0; 464 tj->diskwrites = 0; 465 PetscFunctionReturn(0); 466 } 467