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 8 #undef __FUNCT__ 9 #define __FUNCT__ "TSTrajectoryRegister" 10 /*@C 11 TSTrajectoryRegister - Adds a way of storing trajectories to the TS package 12 13 Not Collective 14 15 Input Parameters: 16 + name - The name of a new user-defined creation routine 17 - create_func - The creation routine itself 18 19 Notes: 20 TSTrajectoryRegister() may be called multiple times to add several user-defined tses. 21 22 Level: advanced 23 24 .keywords: TS, register 25 26 .seealso: TSTrajectoryRegisterAll(), TSTrajectoryRegisterDestroy() 27 @*/ 28 PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS)) 29 { 30 PetscErrorCode ierr; 31 32 PetscFunctionBegin; 33 ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr); 34 PetscFunctionReturn(0); 35 } 36 37 #undef __FUNCT__ 38 #define __FUNCT__ "TSTrajectorySet" 39 PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X) 40 { 41 PetscErrorCode ierr; 42 43 PetscFunctionBegin; 44 if (!tj) PetscFunctionReturn(0); 45 ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr); 46 PetscFunctionReturn(0); 47 } 48 49 #undef __FUNCT__ 50 #define __FUNCT__ "TSTrajectoryGet" 51 PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time) 52 { 53 PetscErrorCode ierr; 54 55 PetscFunctionBegin; 56 if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 57 ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr); 58 PetscFunctionReturn(0); 59 } 60 61 #undef __FUNCT__ 62 #define __FUNCT__ "TSTrajectoryView" 63 /*@C 64 TSTrajectoryView - Prints information about the trajectory object 65 66 Collective on TSTrajectory 67 68 Input Parameters: 69 + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 70 - viewer - visualization context 71 72 Options Database Key: 73 . -ts_view - calls TSView() at end of TSStep() 74 75 Notes: 76 The available visualization contexts include 77 + PETSC_VIEWER_STDOUT_SELF - standard output (default) 78 - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 79 output where only the first processor opens 80 the file. All other processors send their 81 data to the first processor to print. 82 83 The user can open an alternative visualization context with 84 PetscViewerASCIIOpen() - output to a specified file. 85 86 Level: beginner 87 88 .keywords: TS, timestep, view 89 90 .seealso: PetscViewerASCIIOpen() 91 @*/ 92 PetscErrorCode TSTrajectoryView(TSTrajectory tj,PetscViewer viewer) 93 { 94 PetscErrorCode ierr; 95 PetscBool iascii; 96 97 PetscFunctionBegin; 98 PetscValidHeaderSpecific(tj,TS_CLASSID,1); 99 if (!viewer) { 100 ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr); 101 } 102 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 103 PetscCheckSameComm(tj,1,viewer,2); 104 105 ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 106 if (iascii) { 107 ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr); 108 if (tj->ops->view) { 109 ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr); 110 } 111 } 112 PetscFunctionReturn(0); 113 } 114 115 #undef __FUNCT__ 116 #define __FUNCT__ "TSTrajectoryCreate" 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(). One can call 131 TSGetTrajectory() to access the created trajectory. 132 133 .keywords: TS, create 134 .seealso: TSSetType(), TSSetUp(), TSDestroy(), TSSetProblemType(), TSGetTrajectory() 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 #undef __FUNCT__ 153 #define __FUNCT__ "TSTrajectorySetType" 154 /*@C 155 TSTrajectorySetType - Sets the storage method to be used as in a trajectory 156 157 Collective on TS 158 159 Input Parameters: 160 + ts - The TS context 161 - type - A known method 162 163 Options Database Command: 164 . -tstrajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 165 166 Level: intermediate 167 168 .keywords: TS, set, type 169 170 .seealso: TS, TSSolve(), TSCreate(), TSSetFromOptions(), TSDestroy(), TSType 171 172 @*/ 173 PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type) 174 { 175 PetscErrorCode (*r)(TSTrajectory,TS); 176 PetscBool match; 177 PetscErrorCode ierr; 178 179 PetscFunctionBegin; 180 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 181 ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr); 182 if (match) PetscFunctionReturn(0); 183 184 ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr); 185 if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 186 if (tj->ops->destroy) { 187 ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr); 188 189 tj->ops->destroy = NULL; 190 } 191 ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr); 192 193 ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr); 194 ierr = (*r)(tj,ts);CHKERRQ(ierr); 195 PetscFunctionReturn(0); 196 } 197 198 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 199 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 200 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 201 202 #undef __FUNCT__ 203 #define __FUNCT__ "TSTrajectoryRegisterAll" 204 /*@C 205 TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 206 207 Not Collective 208 209 Level: advanced 210 211 .keywords: TS, timestepper, register, all 212 .seealso: TSCreate(), TSRegister(), TSRegisterDestroy() 213 @*/ 214 PetscErrorCode TSTrajectoryRegisterAll(void) 215 { 216 PetscErrorCode ierr; 217 218 PetscFunctionBegin; 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 PetscFunctionReturn(0); 225 } 226 227 #undef __FUNCT__ 228 #define __FUNCT__ "TSTrajectoryDestroy" 229 /*@ 230 TSTrajectoryDestroy - Destroys a trajectory context 231 232 Collective on TSTrajectory 233 234 Input Parameter: 235 . ts - the TSTrajectory context obtained from TSTrajectoryCreate() 236 237 Level: advanced 238 239 .keywords: TS, timestepper, destroy 240 241 .seealso: TSCreate(), TSSetUp(), TSSolve() 242 @*/ 243 PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 244 { 245 PetscErrorCode ierr; 246 247 PetscFunctionBegin; 248 if (!*tj) PetscFunctionReturn(0); 249 PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 250 if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 251 252 if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 253 ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 254 PetscFunctionReturn(0); 255 } 256 257 #undef __FUNCT__ 258 #define __FUNCT__ "TSTrajectorySetTypeFromOptions_Private" 259 /* 260 TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 261 262 Collective on TSTrajectory 263 264 Input Parameter: 265 . tj - TSTrajectory 266 267 Level: intermediate 268 269 .keywords: TS, set, options, database, type 270 .seealso: TSSetFromOptions(), TSSetType() 271 */ 272 static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptions *PetscOptionsObject,TSTrajectory tj,TS ts) 273 { 274 PetscBool opt; 275 const char *defaultType; 276 char typeName[256]; 277 PetscBool flg; 278 PetscErrorCode ierr; 279 280 PetscFunctionBegin; 281 if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 282 else defaultType = TSTRAJECTORYBASIC; 283 284 if (!TSRegisterAllCalled) {ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);} 285 ierr = PetscOptionsFList("-tstrajectory_type","TSTrajectory method"," TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 286 if (opt) { 287 ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg); 288 //if (flg) { /* ts_max_steps determines memory allocated */ 289 // ierr = PetscOptionsInt("-ts_max_steps","Maximum number of time steps","TSSetDuration",ts->max_steps,&ts->max_steps,NULL);CHKERRQ(ierr); 290 //} 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 #undef __FUNCT__ 299 #define __FUNCT__ "TSTrajectorySetFromOptions" 300 /*@ 301 TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 302 303 Collective on TSTrajectory 304 305 Input Parameter: 306 . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 307 308 Options Database Keys: 309 . -tstrajectory_type <type> - TSTRAJECTORYBASIC 310 . -tstrajectory_max_cps <int> 311 312 Level: advanced 313 314 Notes: This is not normally called directly by users 315 316 .keywords: TS, timestep, set, options, database, trajectory 317 318 .seealso: TSGetType(), TSSetSaveTrajectory(), TSGetTrajectory() 319 @*/ 320 PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 321 { 322 PetscErrorCode ierr; 323 324 PetscFunctionBegin; 325 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 326 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 327 ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 328 ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 329 /* Handle specific TS options */ 330 if (tj->ops->setfromoptions) { 331 ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr); 332 } 333 ierr = PetscOptionsEnd();CHKERRQ(ierr); 334 PetscFunctionReturn(0); 335 } 336 337 #undef __FUNCT__ 338 #define __FUNCT__ "TSTrajectorySetUp" 339 /*@ 340 TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 341 of a TS trajectory. 342 343 Collective on TS 344 345 Input Parameter: 346 . ts - the TS context obtained from TSCreate() 347 . tj - the TS trajectory context 348 349 Level: advanced 350 351 .keywords: TS, setup, checkpoint 352 353 .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 354 @*/ 355 PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 356 { 357 PetscErrorCode ierr; 358 359 PetscFunctionBegin; 360 if (!tj) PetscFunctionReturn(0); 361 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 362 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 363 if (tj->setupcalled) PetscFunctionReturn(0); 364 365 if (!((PetscObject)tj)->type_name) { 366 ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr); 367 } 368 if (tj->ops->setup) { 369 ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr); 370 } 371 372 tj->setupcalled = PETSC_TRUE; 373 PetscFunctionReturn(0); 374 } 375