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 #undef __FUNCT__ 10 #define __FUNCT__ "TSTrajectoryRegister" 11 /*@C 12 TSTrajectoryRegister - Adds a way of storing trajectories to the TS package 13 14 Not Collective 15 16 Input Parameters: 17 + name - The name of a new user-defined creation routine 18 - create_func - The creation routine itself 19 20 Notes: 21 TSTrajectoryRegister() may be called multiple times to add several user-defined tses. 22 23 Level: advanced 24 25 .keywords: TS, register 26 27 .seealso: TSTrajectoryRegisterAll(), TSTrajectoryRegisterDestroy() 28 @*/ 29 PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS)) 30 { 31 PetscErrorCode ierr; 32 33 PetscFunctionBegin; 34 ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr); 35 PetscFunctionReturn(0); 36 } 37 38 #undef __FUNCT__ 39 #define __FUNCT__ "TSTrajectorySet" 40 PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X) 41 { 42 PetscErrorCode ierr; 43 44 PetscFunctionBegin; 45 if (!tj) PetscFunctionReturn(0); 46 ierr = PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr); 47 ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr); 48 ierr = PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr); 49 PetscFunctionReturn(0); 50 } 51 52 #undef __FUNCT__ 53 #define __FUNCT__ "TSTrajectoryGet" 54 PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time) 55 { 56 PetscErrorCode ierr; 57 58 PetscFunctionBegin; 59 if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 60 ierr = PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 61 ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr); 62 ierr = PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 63 PetscFunctionReturn(0); 64 } 65 66 #undef __FUNCT__ 67 #define __FUNCT__ "TSTrajectoryView" 68 /*@C 69 TSTrajectoryView - Prints information about the trajectory object 70 71 Collective on TSTrajectory 72 73 Input Parameters: 74 + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 75 - viewer - visualization context 76 77 Options Database Key: 78 . -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep() 79 80 Notes: 81 The available visualization contexts include 82 + PETSC_VIEWER_STDOUT_SELF - standard output (default) 83 - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 84 output where only the first processor opens 85 the file. All other processors send their 86 data to the first processor to print. 87 88 The user can open an alternative visualization context with 89 PetscViewerASCIIOpen() - output to a specified file. 90 91 Level: beginner 92 93 .keywords: TS, timestep, view 94 95 .seealso: PetscViewerASCIIOpen() 96 @*/ 97 PetscErrorCode TSTrajectoryView(TSTrajectory tj,PetscViewer viewer) 98 { 99 PetscErrorCode ierr; 100 PetscBool iascii; 101 102 PetscFunctionBegin; 103 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 104 if (!viewer) { 105 ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr); 106 } 107 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 108 PetscCheckSameComm(tj,1,viewer,2); 109 110 ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 111 if (iascii) { 112 ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr); 113 ierr = PetscViewerASCIIPrintf(viewer," total number of recomputations for adjoint calculation = %D\n",tj->recomps);CHKERRQ(ierr); 114 ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint reads = %D\n",tj->diskreads);CHKERRQ(ierr); 115 ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint writes = %D\n",tj->diskwrites);CHKERRQ(ierr); 116 if (tj->ops->view) { 117 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 118 ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr); 119 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 120 } 121 } 122 PetscFunctionReturn(0); 123 } 124 125 #undef __FUNCT__ 126 #define __FUNCT__ "TSTrajectoryCreate" 127 /*@C 128 TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 129 130 Collective on MPI_Comm 131 132 Input Parameter: 133 . comm - The communicator 134 135 Output Parameter: 136 . tj - The trajectory object 137 138 Level: advanced 139 140 Notes: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). One can call 141 TSGetTrajectory() to access the created trajectory. 142 143 .keywords: TS, create 144 .seealso: TSSetType(), TSSetUp(), TSDestroy(), TSSetProblemType(), TSGetTrajectory() 145 @*/ 146 PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 147 { 148 TSTrajectory t; 149 PetscErrorCode ierr; 150 151 PetscFunctionBegin; 152 PetscValidPointer(tj,2); 153 *tj = NULL; 154 ierr = TSInitializePackage();CHKERRQ(ierr); 155 156 ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr); 157 t->setupcalled = PETSC_FALSE; 158 *tj = t; 159 PetscFunctionReturn(0); 160 } 161 162 #undef __FUNCT__ 163 #define __FUNCT__ "TSTrajectorySetType" 164 /*@C 165 TSTrajectorySetType - Sets the storage method to be used as in a trajectory 166 167 Collective on TS 168 169 Input Parameters: 170 + ts - The TS context 171 - type - A known method 172 173 Options Database Command: 174 . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 175 176 Level: intermediate 177 178 .keywords: TS, set, type 179 180 .seealso: TS, TSSolve(), TSCreate(), TSSetFromOptions(), TSDestroy(), TSType 181 182 @*/ 183 PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type) 184 { 185 PetscErrorCode (*r)(TSTrajectory,TS); 186 PetscBool match; 187 PetscErrorCode ierr; 188 189 PetscFunctionBegin; 190 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 191 ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr); 192 if (match) PetscFunctionReturn(0); 193 194 ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr); 195 if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 196 if (tj->ops->destroy) { 197 ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr); 198 199 tj->ops->destroy = NULL; 200 } 201 ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr); 202 203 ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr); 204 ierr = (*r)(tj,ts);CHKERRQ(ierr); 205 PetscFunctionReturn(0); 206 } 207 208 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 209 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 210 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 211 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS); 212 213 #undef __FUNCT__ 214 #define __FUNCT__ "TSTrajectoryRegisterAll" 215 /*@C 216 TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 217 218 Not Collective 219 220 Level: advanced 221 222 .keywords: TS, timestepper, register, all 223 .seealso: TSCreate(), TSRegister(), TSRegisterDestroy() 224 @*/ 225 PetscErrorCode TSTrajectoryRegisterAll(void) 226 { 227 PetscErrorCode ierr; 228 229 PetscFunctionBegin; 230 if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 231 TSTrajectoryRegisterAllCalled = PETSC_TRUE; 232 233 ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr); 234 ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr); 235 ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr); 236 ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr); 237 PetscFunctionReturn(0); 238 } 239 240 #undef __FUNCT__ 241 #define __FUNCT__ "TSTrajectoryDestroy" 242 /*@ 243 TSTrajectoryDestroy - Destroys a trajectory context 244 245 Collective on TSTrajectory 246 247 Input Parameter: 248 . ts - the TSTrajectory context obtained from TSTrajectoryCreate() 249 250 Level: advanced 251 252 .keywords: TS, timestepper, destroy 253 254 .seealso: TSCreate(), TSSetUp(), TSSolve() 255 @*/ 256 PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 257 { 258 PetscErrorCode ierr; 259 260 PetscFunctionBegin; 261 if (!*tj) PetscFunctionReturn(0); 262 PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 263 if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 264 265 if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 266 ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr); 267 ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 268 PetscFunctionReturn(0); 269 } 270 271 #undef __FUNCT__ 272 #define __FUNCT__ "TSTrajectorySetTypeFromOptions_Private" 273 /* 274 TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 275 276 Collective on TSTrajectory 277 278 Input Parameter: 279 . tj - TSTrajectory 280 281 Level: intermediate 282 283 .keywords: TS, set, options, database, type 284 .seealso: TSSetFromOptions(), TSSetType() 285 */ 286 static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 287 { 288 PetscBool opt; 289 const char *defaultType; 290 char typeName[256]; 291 PetscBool flg; 292 PetscErrorCode ierr; 293 294 PetscFunctionBegin; 295 if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 296 else defaultType = TSTRAJECTORYBASIC; 297 298 ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr); 299 ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method"," TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 300 if (opt) { 301 ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr); 302 ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr); 303 } else { 304 ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr); 305 } 306 PetscFunctionReturn(0); 307 } 308 309 #undef __FUNCT__ 310 #define __FUNCT__ "TSTrajectorySetMonitor" 311 /*@ 312 TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 313 314 Collective on TSTrajectory 315 316 Input Arguments: 317 + tj - the TSTrajectory context 318 - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 319 320 Level: intermediate 321 322 .seealso: TSTrajectorySetType() 323 @*/ 324 PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg) 325 { 326 PetscErrorCode ierr; 327 328 PetscFunctionBegin; 329 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 330 PetscValidLogicalCollectiveBool(tj,flg,2); 331 if (flg) { 332 if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);} 333 } else { 334 ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr); 335 } 336 PetscFunctionReturn(0); 337 } 338 339 #undef __FUNCT__ 340 #define __FUNCT__ "TSTrajectorySetFromOptions" 341 /*@ 342 TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 343 344 Collective on TSTrajectory 345 346 Input Parameter: 347 . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 348 349 Options Database Keys: 350 . -ts_trajectory_type <type> - TSTRAJECTORYBASIC 351 . -ts_trajectory_max_cps <int> 352 353 Level: advanced 354 355 Notes: This is not normally called directly by users 356 357 .keywords: TS, timestep, set, options, database, trajectory 358 359 .seealso: TSGetType(), TSSetSaveTrajectory(), TSGetTrajectory() 360 @*/ 361 PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 362 { 363 PetscErrorCode ierr; 364 PetscBool set,flg; 365 366 PetscFunctionBegin; 367 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 368 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 369 ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 370 ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 371 ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 372 if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);} 373 /* Handle specific TS options */ 374 if (tj->ops->setfromoptions) { 375 ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr); 376 } 377 ierr = PetscOptionsEnd();CHKERRQ(ierr); 378 PetscFunctionReturn(0); 379 } 380 381 #undef __FUNCT__ 382 #define __FUNCT__ "TSTrajectorySetUp" 383 /*@ 384 TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 385 of a TS trajectory. 386 387 Collective on TS 388 389 Input Parameter: 390 . ts - the TS context obtained from TSCreate() 391 . tj - the TS trajectory context 392 393 Level: advanced 394 395 .keywords: TS, setup, checkpoint 396 397 .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 398 @*/ 399 PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 400 { 401 PetscErrorCode ierr; 402 403 PetscFunctionBegin; 404 if (!tj) PetscFunctionReturn(0); 405 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 406 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 407 if (tj->setupcalled) PetscFunctionReturn(0); 408 409 if (!((PetscObject)tj)->type_name) { 410 ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr); 411 } 412 if (tj->ops->setup) { 413 ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr); 414 } 415 416 tj->setupcalled = PETSC_TRUE; 417 418 /* Set the counters to zero */ 419 tj->recomps = 0; 420 tj->diskreads = 0; 421 tj->diskwrites = 0; 422 PetscFunctionReturn(0); 423 } 424