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