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: advanced 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: beginner 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 TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 119 120 Collective on MPI_Comm 121 122 Input Parameter: 123 . comm - the communicator 124 125 Output Parameter: 126 . tj - the trajectory object 127 128 Level: advanced 129 130 Notes: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). 131 132 .keywords: TS, trajectory, create 133 134 .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType() 135 @*/ 136 PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 137 { 138 TSTrajectory t; 139 PetscErrorCode ierr; 140 141 PetscFunctionBegin; 142 PetscValidPointer(tj,2); 143 *tj = NULL; 144 ierr = TSInitializePackage();CHKERRQ(ierr); 145 146 ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr); 147 t->setupcalled = PETSC_FALSE; 148 *tj = t; 149 PetscFunctionReturn(0); 150 } 151 152 /*@C 153 TSTrajectorySetType - Sets the storage method to be used as in a trajectory 154 155 Collective on TS 156 157 Input Parameters: 158 + tj - the TSTrajectory context 159 . ts - the TS context 160 - type - a known method 161 162 Options Database Command: 163 . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 164 165 Level: intermediate 166 167 .keywords: TS, trajectory, timestep, set, type 168 169 .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy() 170 171 @*/ 172 PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type) 173 { 174 PetscErrorCode (*r)(TSTrajectory,TS); 175 PetscBool match; 176 PetscErrorCode ierr; 177 178 PetscFunctionBegin; 179 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 180 ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr); 181 if (match) PetscFunctionReturn(0); 182 183 ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr); 184 if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 185 if (tj->ops->destroy) { 186 ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr); 187 188 tj->ops->destroy = NULL; 189 } 190 ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr); 191 192 ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr); 193 ierr = (*r)(tj,ts);CHKERRQ(ierr); 194 PetscFunctionReturn(0); 195 } 196 197 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 198 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 199 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 200 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS); 201 202 /*@C 203 TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 204 205 Not Collective 206 207 Level: advanced 208 209 .keywords: TS, trajectory, register, all 210 211 .seealso: TSTrajectoryRegister() 212 @*/ 213 PetscErrorCode TSTrajectoryRegisterAll(void) 214 { 215 PetscErrorCode ierr; 216 217 PetscFunctionBegin; 218 if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 219 TSTrajectoryRegisterAllCalled = PETSC_TRUE; 220 221 ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr); 222 ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr); 223 ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr); 224 ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr); 225 PetscFunctionReturn(0); 226 } 227 228 /*@ 229 TSTrajectoryDestroy - Destroys a trajectory context 230 231 Collective on TSTrajectory 232 233 Input Parameter: 234 . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 235 236 Level: advanced 237 238 .keywords: TS, trajectory, timestep, destroy 239 240 .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 241 @*/ 242 PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 243 { 244 PetscErrorCode ierr; 245 246 PetscFunctionBegin; 247 if (!*tj) PetscFunctionReturn(0); 248 PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 249 if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 250 251 if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 252 ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr); 253 ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 254 PetscFunctionReturn(0); 255 } 256 257 /* 258 TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 259 260 Collective on TSTrajectory 261 262 Input Parameter: 263 + tj - the TSTrajectory context 264 - ts - the TS context 265 266 Options Database Keys: 267 . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 268 269 Level: intermediate 270 271 .keywords: TS, trajectory, set, options, type 272 273 .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType() 274 */ 275 static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 276 { 277 PetscBool opt; 278 const char *defaultType; 279 char typeName[256]; 280 PetscBool flg; 281 PetscErrorCode ierr; 282 283 PetscFunctionBegin; 284 if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 285 else defaultType = TSTRAJECTORYBASIC; 286 287 ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr); 288 ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method"," TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 289 if (opt) { 290 ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr); 291 ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr); 292 } else { 293 ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr); 294 } 295 PetscFunctionReturn(0); 296 } 297 298 /*@ 299 TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 300 301 Collective on TSTrajectory 302 303 Input Arguments: 304 + tj - the TSTrajectory context 305 - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 306 307 Options Database Keys: 308 . -ts_trajectory_monitor - print TSTrajectory information 309 310 Level: intermediate 311 312 .keywords: TS, trajectory, set, monitor 313 314 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp() 315 @*/ 316 PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg) 317 { 318 PetscErrorCode ierr; 319 320 PetscFunctionBegin; 321 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 322 PetscValidLogicalCollectiveBool(tj,flg,2); 323 if (flg) { 324 if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);} 325 } else { 326 ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr); 327 } 328 PetscFunctionReturn(0); 329 } 330 331 /*@ 332 TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 333 334 Collective on TSTrajectory 335 336 Input Parameter: 337 + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 338 - ts - the TS context 339 340 Options Database Keys: 341 + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 342 - -ts_trajectory_monitor - print TSTrajectory information 343 344 Level: advanced 345 346 Notes: This is not normally called directly by users 347 348 .keywords: TS, trajectory, timestep, set, options, database 349 350 .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp() 351 @*/ 352 PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 353 { 354 PetscErrorCode ierr; 355 PetscBool set,flg; 356 357 PetscFunctionBegin; 358 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 359 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 360 ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 361 ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 362 ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 363 if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);} 364 /* Handle specific TS options */ 365 if (tj->ops->setfromoptions) { 366 ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr); 367 } 368 ierr = PetscOptionsEnd();CHKERRQ(ierr); 369 PetscFunctionReturn(0); 370 } 371 372 /*@ 373 TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 374 of a TS trajectory. 375 376 Collective on TS 377 378 Input Parameter: 379 + ts - the TS context obtained from TSCreate() 380 - tj - the TS trajectory context 381 382 Level: advanced 383 384 .keywords: TS, trajectory, setup 385 386 .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 387 @*/ 388 PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 389 { 390 PetscErrorCode ierr; 391 392 PetscFunctionBegin; 393 if (!tj) PetscFunctionReturn(0); 394 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 395 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 396 if (tj->setupcalled) PetscFunctionReturn(0); 397 398 if (!((PetscObject)tj)->type_name) { 399 ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr); 400 } 401 if (tj->ops->setup) { 402 ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr); 403 } 404 405 tj->setupcalled = PETSC_TRUE; 406 407 /* Set the counters to zero */ 408 tj->recomps = 0; 409 tj->diskreads = 0; 410 tj->diskwrites = 0; 411 PetscFunctionReturn(0); 412 } 413