1af0996ceSBarry Smith #include <petsc/private/tsimpl.h> /*I "petscts.h" I*/ 2*fe8322adSStefano Zampini #include <petsc/private/tshistoryimpl.h> 3*fe8322adSStefano Zampini #include <petscdm.h> 4bc952696SBarry Smith 5bc952696SBarry Smith PetscFunctionList TSTrajectoryList = NULL; 6bc952696SBarry Smith PetscBool TSTrajectoryRegisterAllCalled = PETSC_FALSE; 7bc952696SBarry Smith PetscClassId TSTRAJECTORY_CLASSID; 8*fe8322adSStefano Zampini PetscLogEvent TSTrajectory_Set, TSTrajectory_Get, TSTrajectory_GetVecs; 9bc952696SBarry Smith 10bc952696SBarry Smith /*@C 11bc952696SBarry Smith TSTrajectoryRegister - Adds a way of storing trajectories to the TS package 12bc952696SBarry Smith 13bc952696SBarry Smith Not Collective 14bc952696SBarry Smith 15bc952696SBarry Smith Input Parameters: 163c0fce88SHong Zhang + name - the name of a new user-defined creation routine 173c0fce88SHong Zhang - create_func - the creation routine itself 18bc952696SBarry Smith 19bc952696SBarry Smith Notes: 20bc952696SBarry Smith TSTrajectoryRegister() may be called multiple times to add several user-defined tses. 21bc952696SBarry Smith 22df5474d8SHong Zhang Level: developer 23bc952696SBarry Smith 243c0fce88SHong Zhang .keywords: TS, trajectory, timestep, register 25bc952696SBarry Smith 263c0fce88SHong Zhang .seealso: TSTrajectoryRegisterAll() 27bc952696SBarry Smith @*/ 28972caf09SHong Zhang PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS)) 29bc952696SBarry Smith { 30bc952696SBarry Smith PetscErrorCode ierr; 31bc952696SBarry Smith 32bc952696SBarry Smith PetscFunctionBegin; 33bc952696SBarry Smith ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr); 34bc952696SBarry Smith PetscFunctionReturn(0); 35bc952696SBarry Smith } 36bc952696SBarry Smith 37*fe8322adSStefano Zampini /*@ 38*fe8322adSStefano Zampini TSTrajectorySet - Sets a vector of state in the trajectory object 39*fe8322adSStefano Zampini 40*fe8322adSStefano Zampini Collective on TSTrajectory 41*fe8322adSStefano Zampini 42*fe8322adSStefano Zampini Input Parameters: 43*fe8322adSStefano Zampini + tj - the trajectory object 44*fe8322adSStefano Zampini . ts - the time stepper object (optional) 45*fe8322adSStefano Zampini . stepnum - the step number 46*fe8322adSStefano Zampini . time - the current time 47*fe8322adSStefano Zampini - X - the current solution 48*fe8322adSStefano Zampini 49*fe8322adSStefano Zampini Level: developer 50*fe8322adSStefano Zampini 51*fe8322adSStefano Zampini Notes: Usually one does not call this routine, it is called automatically during TSSolve() 52*fe8322adSStefano Zampini 53*fe8322adSStefano Zampini .keywords: TS, trajectory, create 54*fe8322adSStefano Zampini 55*fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectoryGet(), TSTrajectoryGetVecs() 56*fe8322adSStefano Zampini @*/ 57bc952696SBarry Smith PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X) 58bc952696SBarry Smith { 59bc952696SBarry Smith PetscErrorCode ierr; 60bc952696SBarry Smith 61bc952696SBarry Smith PetscFunctionBegin; 62bc952696SBarry Smith if (!tj) PetscFunctionReturn(0); 63*fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 64*fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 65*fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj,stepnum,3); 66*fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj,time,4); 67*fe8322adSStefano Zampini PetscValidHeaderSpecific(X,VEC_CLASSID,5); 68*fe8322adSStefano Zampini if (!tj->ops->set) SETERRQ1(PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name); 69*fe8322adSStefano Zampini if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first"); 70*fe8322adSStefano Zampini if (tj->monitor) { 71*fe8322adSStefano Zampini ierr = PetscViewerASCIIPrintf(tj->monitor,"TSTrajectorySet: stepnum %D, time %g (stages %D)\n",stepnum,(double)time,(PetscInt)!tj->solution_only);CHKERRQ(ierr); 72*fe8322adSStefano Zampini } 73d0d044f3SHong Zhang ierr = PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr); 74bc952696SBarry Smith ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr); 75d0d044f3SHong Zhang ierr = PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr); 76*fe8322adSStefano Zampini ierr = TSHistoryUpdate(tj->tsh,stepnum,time);CHKERRQ(ierr); 77*fe8322adSStefano Zampini if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL; 78bc952696SBarry Smith PetscFunctionReturn(0); 79bc952696SBarry Smith } 80bc952696SBarry Smith 81*fe8322adSStefano Zampini /*@ 82*fe8322adSStefano Zampini TSTrajectoryGetNumSteps - Return the number of steps registered in the TSTrajectory via TSTrajectorySet(). 83*fe8322adSStefano Zampini 84*fe8322adSStefano Zampini Not collective. 85*fe8322adSStefano Zampini 86*fe8322adSStefano Zampini Input Parameters: 87*fe8322adSStefano Zampini . tj - the trajectory object 88*fe8322adSStefano Zampini 89*fe8322adSStefano Zampini Output Parameter: 90*fe8322adSStefano Zampini . steps - the number of steps 91*fe8322adSStefano Zampini 92*fe8322adSStefano Zampini Level: developer 93*fe8322adSStefano Zampini 94*fe8322adSStefano Zampini .keywords: TS, trajectory, create 95*fe8322adSStefano Zampini 96*fe8322adSStefano Zampini .seealso: TSTrajectorySet() 97*fe8322adSStefano Zampini @*/ 98*fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps) 99*fe8322adSStefano Zampini { 100*fe8322adSStefano Zampini PetscErrorCode ierr; 101*fe8322adSStefano Zampini 102*fe8322adSStefano Zampini PetscFunctionBegin; 103*fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 104*fe8322adSStefano Zampini PetscValidIntPointer(steps,2); 105*fe8322adSStefano Zampini ierr = TSHistoryGetNumSteps(tj->tsh,steps);CHKERRQ(ierr); 106*fe8322adSStefano Zampini PetscFunctionReturn(0); 107*fe8322adSStefano Zampini } 108*fe8322adSStefano Zampini 109*fe8322adSStefano Zampini /*@ 110*fe8322adSStefano Zampini TSTrajectoryGet - Updates the solution vector of a time stepper object by inquiring the TSTrajectory 111*fe8322adSStefano Zampini 112*fe8322adSStefano Zampini Collective on TS 113*fe8322adSStefano Zampini 114*fe8322adSStefano Zampini Input Parameters: 115*fe8322adSStefano Zampini + tj - the trajectory object 116*fe8322adSStefano Zampini . ts - the time stepper object 117*fe8322adSStefano Zampini - stepnum - the step number 118*fe8322adSStefano Zampini 119*fe8322adSStefano Zampini Output Parameter: 120*fe8322adSStefano Zampini . time - the time associated with the step number 121*fe8322adSStefano Zampini 122*fe8322adSStefano Zampini Level: developer 123*fe8322adSStefano Zampini 124*fe8322adSStefano Zampini Notes: Usually one does not call this routine, it is called automatically during TSSolve() 125*fe8322adSStefano Zampini 126*fe8322adSStefano Zampini .keywords: TS, trajectory, create 127*fe8322adSStefano Zampini 128*fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySet(), TSTrajectoryGetVecs(), TSGetSolution() 129*fe8322adSStefano Zampini @*/ 130c679fc15SHong Zhang PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time) 131bc952696SBarry Smith { 132bc952696SBarry Smith PetscErrorCode ierr; 133bc952696SBarry Smith 134bc952696SBarry Smith PetscFunctionBegin; 135bc952696SBarry Smith if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 136*fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 137*fe8322adSStefano Zampini PetscValidHeaderSpecific(ts,TS_CLASSID,2); 138*fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj,stepnum,3); 139*fe8322adSStefano Zampini PetscValidPointer(time,4); 140*fe8322adSStefano Zampini if (!tj->ops->get) SETERRQ1(PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name); 141*fe8322adSStefano Zampini if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first"); 14211e1d5c3SBarry Smith if (stepnum < 0) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_PLIB,"Requesting negative step number"); 143*fe8322adSStefano Zampini if (tj->monitor) { 144*fe8322adSStefano Zampini ierr = PetscViewerASCIIPrintf(tj->monitor,"TSTrajectoryGet: stepnum %D, stages %D\n",stepnum,(PetscInt)!tj->solution_only);CHKERRQ(ierr); 145*fe8322adSStefano Zampini ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr); 146*fe8322adSStefano Zampini } 147d0d044f3SHong Zhang ierr = PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 148bc952696SBarry Smith ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr); 149d0d044f3SHong Zhang ierr = PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 150bc952696SBarry Smith PetscFunctionReturn(0); 151bc952696SBarry Smith } 152bc952696SBarry Smith 153*fe8322adSStefano Zampini /*@ 154*fe8322adSStefano Zampini TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the TSTrajectory and, possibly, from the TS 155*fe8322adSStefano Zampini 156*fe8322adSStefano Zampini Collective on TS 157*fe8322adSStefano Zampini 158*fe8322adSStefano Zampini Input Parameters: 159*fe8322adSStefano Zampini + tj - the trajectory object 160*fe8322adSStefano Zampini . ts - the time stepper object (optional) 161*fe8322adSStefano Zampini - stepnum - the requested step number 162*fe8322adSStefano Zampini 163*fe8322adSStefano Zampini Input/Output Parameters: 164*fe8322adSStefano Zampini . time - the time associated with the step number 165*fe8322adSStefano Zampini 166*fe8322adSStefano Zampini Output Parameters: 167*fe8322adSStefano Zampini + U - state vector (can be NULL) 168*fe8322adSStefano Zampini - Udot - time derivative of state vector (can be NULL) 169*fe8322adSStefano Zampini 170*fe8322adSStefano Zampini Level: developer 171*fe8322adSStefano Zampini 172*fe8322adSStefano Zampini Notes: If the step number is PETSC_DECIDE, the time argument is used to inquire the trajectory. 173*fe8322adSStefano Zampini If the requested time does not match any in the trajectory, Lagrangian interpolations are returned. 174*fe8322adSStefano Zampini 175*fe8322adSStefano Zampini .keywords: TS, trajectory, create 176*fe8322adSStefano Zampini 177*fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySet(), TSTrajectoryGet() 178*fe8322adSStefano Zampini @*/ 179*fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time,Vec U,Vec Udot) 180*fe8322adSStefano Zampini { 181*fe8322adSStefano Zampini PetscErrorCode ierr; 182*fe8322adSStefano Zampini 183*fe8322adSStefano Zampini PetscFunctionBegin; 184*fe8322adSStefano Zampini if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 185*fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 186*fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 187*fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj,stepnum,3); 188*fe8322adSStefano Zampini PetscValidPointer(time,4); 189*fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(U,VEC_CLASSID,5); 190*fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(Udot,VEC_CLASSID,6); 191*fe8322adSStefano Zampini if (!U && !Udot) PetscFunctionReturn(0); 192*fe8322adSStefano Zampini if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first"); 193*fe8322adSStefano Zampini ierr = PetscLogEventBegin(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr); 194*fe8322adSStefano Zampini if (tj->monitor) { 195*fe8322adSStefano Zampini PetscInt pU,pUdot; 196*fe8322adSStefano Zampini pU = U ? 1 : 0; 197*fe8322adSStefano Zampini pUdot = Udot ? 1 : 0; 198*fe8322adSStefano Zampini ierr = PetscViewerASCIIPrintf(tj->monitor,"Requested by GetVecs %D %D: stepnum %D, time %g\n",pU,pUdot,stepnum,(double)*time);CHKERRQ(ierr); 199*fe8322adSStefano Zampini ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr); 200*fe8322adSStefano Zampini } 201*fe8322adSStefano Zampini if (U && tj->lag.caching) { 202*fe8322adSStefano Zampini PetscObjectId id; 203*fe8322adSStefano Zampini PetscObjectState state; 204*fe8322adSStefano Zampini 205*fe8322adSStefano Zampini ierr = PetscObjectStateGet((PetscObject)U,&state);CHKERRQ(ierr); 206*fe8322adSStefano Zampini ierr = PetscObjectGetId((PetscObject)U,&id);CHKERRQ(ierr); 207*fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 208*fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL; 209*fe8322adSStefano Zampini } else { 210*fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL; 211*fe8322adSStefano Zampini } 212*fe8322adSStefano Zampini if (tj->monitor && !U) { 213*fe8322adSStefano Zampini ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr); 214*fe8322adSStefano Zampini ierr = PetscViewerASCIIPrintf(tj->monitor,"State vector cached\n");CHKERRQ(ierr); 215*fe8322adSStefano Zampini ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr); 216*fe8322adSStefano Zampini ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr); 217*fe8322adSStefano Zampini } 218*fe8322adSStefano Zampini } 219*fe8322adSStefano Zampini if (Udot && tj->lag.caching) { 220*fe8322adSStefano Zampini PetscObjectId id; 221*fe8322adSStefano Zampini PetscObjectState state; 222*fe8322adSStefano Zampini 223*fe8322adSStefano Zampini ierr = PetscObjectStateGet((PetscObject)Udot,&state);CHKERRQ(ierr); 224*fe8322adSStefano Zampini ierr = PetscObjectGetId((PetscObject)Udot,&id);CHKERRQ(ierr); 225*fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 226*fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL; 227*fe8322adSStefano Zampini } else { 228*fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL; 229*fe8322adSStefano Zampini } 230*fe8322adSStefano Zampini if (tj->monitor && !Udot) { 231*fe8322adSStefano Zampini ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr); 232*fe8322adSStefano Zampini ierr = PetscViewerASCIIPrintf(tj->monitor,"Derivative vector cached\n");CHKERRQ(ierr); 233*fe8322adSStefano Zampini ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr); 234*fe8322adSStefano Zampini ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr); 235*fe8322adSStefano Zampini } 236*fe8322adSStefano Zampini } 237*fe8322adSStefano Zampini if (!U && !Udot) { 238*fe8322adSStefano Zampini ierr = PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr); 239*fe8322adSStefano Zampini PetscFunctionReturn(0); 240*fe8322adSStefano Zampini } 241*fe8322adSStefano Zampini 242*fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */ 243*fe8322adSStefano Zampini if (tj->monitor) { 244*fe8322adSStefano Zampini ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr); 245*fe8322adSStefano Zampini } 246*fe8322adSStefano Zampini /* cached states will be updated in the function */ 247*fe8322adSStefano Zampini ierr = TSTrajectoryReconstruct_Private(tj,ts,*time,U,Udot);CHKERRQ(ierr); 248*fe8322adSStefano Zampini if (tj->monitor) { 249*fe8322adSStefano Zampini ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr); 250*fe8322adSStefano Zampini ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr); 251*fe8322adSStefano Zampini } 252*fe8322adSStefano Zampini } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */ 253*fe8322adSStefano Zampini TS fakets = ts; 254*fe8322adSStefano Zampini Vec U2; 255*fe8322adSStefano Zampini 256*fe8322adSStefano Zampini /* use a fake TS if ts is missing */ 257*fe8322adSStefano Zampini if (!ts) { 258*fe8322adSStefano Zampini ierr = PetscObjectQuery((PetscObject)tj,"__fake_ts",(PetscObject*)&fakets);CHKERRQ(ierr); 259*fe8322adSStefano Zampini if (!fakets) { 260*fe8322adSStefano Zampini ierr = TSCreate(PetscObjectComm((PetscObject)tj),&fakets);CHKERRQ(ierr); 261*fe8322adSStefano Zampini ierr = PetscObjectCompose((PetscObject)tj,"__fake_ts",(PetscObject)fakets);CHKERRQ(ierr); 262*fe8322adSStefano Zampini ierr = PetscObjectDereference((PetscObject)fakets);CHKERRQ(ierr); 263*fe8322adSStefano Zampini ierr = VecDuplicate(U,&U2);CHKERRQ(ierr); 264*fe8322adSStefano Zampini ierr = TSSetSolution(fakets,U2);CHKERRQ(ierr); 265*fe8322adSStefano Zampini ierr = PetscObjectDereference((PetscObject)U2);CHKERRQ(ierr); 266*fe8322adSStefano Zampini } 267*fe8322adSStefano Zampini } 268*fe8322adSStefano Zampini ierr = TSTrajectoryGet(tj,fakets,stepnum,time);CHKERRQ(ierr); 269*fe8322adSStefano Zampini ierr = TSGetSolution(fakets,&U2);CHKERRQ(ierr); 270*fe8322adSStefano Zampini ierr = VecCopy(U2,U);CHKERRQ(ierr); 271*fe8322adSStefano Zampini ierr = PetscObjectStateGet((PetscObject)U,&tj->lag.Ucached.state);CHKERRQ(ierr); 272*fe8322adSStefano Zampini ierr = PetscObjectGetId((PetscObject)U,&tj->lag.Ucached.id);CHKERRQ(ierr); 273*fe8322adSStefano Zampini tj->lag.Ucached.time = *time; 274*fe8322adSStefano Zampini tj->lag.Ucached.step = stepnum; 275*fe8322adSStefano Zampini } 276*fe8322adSStefano Zampini ierr = PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr); 277*fe8322adSStefano Zampini PetscFunctionReturn(0); 278*fe8322adSStefano Zampini } 279*fe8322adSStefano Zampini 280bc952696SBarry Smith /*@C 281bc952696SBarry Smith TSTrajectoryView - Prints information about the trajectory object 282bc952696SBarry Smith 283bc952696SBarry Smith Collective on TSTrajectory 284bc952696SBarry Smith 285bc952696SBarry Smith Input Parameters: 286b1d74d50SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 287bc952696SBarry Smith - viewer - visualization context 288bc952696SBarry Smith 289bc952696SBarry Smith Options Database Key: 290e210cd0eSHong Zhang . -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep() 291bc952696SBarry Smith 292bc952696SBarry Smith Notes: 293bc952696SBarry Smith The available visualization contexts include 294bc952696SBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 295bc952696SBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 296bc952696SBarry Smith output where only the first processor opens 297bc952696SBarry Smith the file. All other processors send their 298bc952696SBarry Smith data to the first processor to print. 299bc952696SBarry Smith 300bc952696SBarry Smith The user can open an alternative visualization context with 301bc952696SBarry Smith PetscViewerASCIIOpen() - output to a specified file. 302bc952696SBarry Smith 303df5474d8SHong Zhang Level: developer 304bc952696SBarry Smith 3053c0fce88SHong Zhang .keywords: TS, trajectory, timestep, view 306bc952696SBarry Smith 307bc952696SBarry Smith .seealso: PetscViewerASCIIOpen() 308bc952696SBarry Smith @*/ 309b1d74d50SHong Zhang PetscErrorCode TSTrajectoryView(TSTrajectory tj,PetscViewer viewer) 310bc952696SBarry Smith { 311bc952696SBarry Smith PetscErrorCode ierr; 312bc952696SBarry Smith PetscBool iascii; 313bc952696SBarry Smith 314bc952696SBarry Smith PetscFunctionBegin; 3151a5a771fSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 316bc952696SBarry Smith if (!viewer) { 317b1d74d50SHong Zhang ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr); 318bc952696SBarry Smith } 319bc952696SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 320b1d74d50SHong Zhang PetscCheckSameComm(tj,1,viewer,2); 321bc952696SBarry Smith 322bc952696SBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 323bc952696SBarry Smith if (iascii) { 324b1d74d50SHong Zhang ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr); 3251a5a771fSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," total number of recomputations for adjoint calculation = %D\n",tj->recomps);CHKERRQ(ierr); 32653b27ddbSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint reads = %D\n",tj->diskreads);CHKERRQ(ierr); 32753b27ddbSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint writes = %D\n",tj->diskwrites);CHKERRQ(ierr); 328b1d74d50SHong Zhang if (tj->ops->view) { 329285336bfSHong Zhang ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 330b1d74d50SHong Zhang ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr); 331285336bfSHong Zhang ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 332bc952696SBarry Smith } 333bc952696SBarry Smith } 334bc952696SBarry Smith PetscFunctionReturn(0); 335bc952696SBarry Smith } 336bc952696SBarry Smith 337bc952696SBarry Smith /*@C 33878fbdcc8SBarry Smith TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory 33978fbdcc8SBarry Smith 34078fbdcc8SBarry Smith Collective on TSTrajectory 34178fbdcc8SBarry Smith 34278fbdcc8SBarry Smith Input Parameters: 34378fbdcc8SBarry Smith + tr - the trajectory context 34478fbdcc8SBarry Smith - names - the names of the components, final string must be NULL 34578fbdcc8SBarry Smith 34678fbdcc8SBarry Smith Level: intermediate 34778fbdcc8SBarry Smith 348db901c5bSHong Zhang Note: Fortran interface is not possible because of the string array argument 349db901c5bSHong Zhang 35078fbdcc8SBarry Smith .keywords: TS, TSTrajectory, vector, monitor, view 35178fbdcc8SBarry Smith 35278fbdcc8SBarry Smith .seealso: TSTrajectory, TSGetTrajectory() 35378fbdcc8SBarry Smith @*/ 35478fbdcc8SBarry Smith PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names) 35578fbdcc8SBarry Smith { 35678fbdcc8SBarry Smith PetscErrorCode ierr; 35778fbdcc8SBarry Smith 35878fbdcc8SBarry Smith PetscFunctionBegin; 359*fe8322adSStefano Zampini PetscValidHeaderSpecific(ctx,TSTRAJECTORY_CLASSID,1); 360*fe8322adSStefano Zampini PetscValidPointer(names,2); 36178fbdcc8SBarry Smith ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr); 36278fbdcc8SBarry Smith ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr); 36378fbdcc8SBarry Smith PetscFunctionReturn(0); 36478fbdcc8SBarry Smith } 36578fbdcc8SBarry Smith 36678fbdcc8SBarry Smith /*@C 367*fe8322adSStefano Zampini TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk 36808347785SBarry Smith 36908347785SBarry Smith Collective on TSLGCtx 37008347785SBarry Smith 37108347785SBarry Smith Input Parameters: 37208347785SBarry Smith + tj - the TSTrajectory context 37308347785SBarry Smith . transform - the transform function 37408347785SBarry Smith . destroy - function to destroy the optional context 37508347785SBarry Smith - ctx - optional context used by transform function 37608347785SBarry Smith 37708347785SBarry Smith Level: intermediate 37808347785SBarry Smith 37908347785SBarry Smith .keywords: TSTrajectory, vector, monitor, view 38008347785SBarry Smith 38108347785SBarry Smith .seealso: TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform() 38208347785SBarry Smith @*/ 38308347785SBarry Smith PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx) 38408347785SBarry Smith { 38508347785SBarry Smith PetscFunctionBegin; 386*fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 38708347785SBarry Smith tj->transform = transform; 38808347785SBarry Smith tj->transformdestroy = destroy; 38908347785SBarry Smith tj->transformctx = tctx; 39008347785SBarry Smith PetscFunctionReturn(0); 39108347785SBarry Smith } 39208347785SBarry Smith 393db901c5bSHong Zhang /*@ 394bc952696SBarry Smith TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 395bc952696SBarry Smith 396bc952696SBarry Smith Collective on MPI_Comm 397bc952696SBarry Smith 398bc952696SBarry Smith Input Parameter: 3993c0fce88SHong Zhang . comm - the communicator 400bc952696SBarry Smith 401bc952696SBarry Smith Output Parameter: 4023c0fce88SHong Zhang . tj - the trajectory object 403bc952696SBarry Smith 404df5474d8SHong Zhang Level: developer 405bc952696SBarry Smith 40695452b02SPatrick Sanan Notes: 40795452b02SPatrick Sanan Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). 408bc952696SBarry Smith 4093c0fce88SHong Zhang .keywords: TS, trajectory, create 4103c0fce88SHong Zhang 41164fc91eeSBarry Smith .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles() 412bc952696SBarry Smith @*/ 413b1d74d50SHong Zhang PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 414bc952696SBarry Smith { 415bc952696SBarry Smith TSTrajectory t; 416bc952696SBarry Smith PetscErrorCode ierr; 417bc952696SBarry Smith 418bc952696SBarry Smith PetscFunctionBegin; 419b1d74d50SHong Zhang PetscValidPointer(tj,2); 420b1d74d50SHong Zhang *tj = NULL; 421bc952696SBarry Smith ierr = TSInitializePackage();CHKERRQ(ierr); 422bc952696SBarry Smith 42373107ff1SLisandro Dalcin ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr); 42468bece0bSHong Zhang t->setupcalled = PETSC_FALSE; 425*fe8322adSStefano Zampini ierr = TSHistoryCreate(comm,&t->tsh);CHKERRQ(ierr); 426*fe8322adSStefano Zampini 427*fe8322adSStefano Zampini t->lag.order = 1; 428*fe8322adSStefano Zampini t->lag.L = NULL; 429*fe8322adSStefano Zampini t->lag.T = NULL; 430*fe8322adSStefano Zampini t->lag.W = NULL; 431*fe8322adSStefano Zampini t->lag.WW = NULL; 432*fe8322adSStefano Zampini t->lag.TW = NULL; 433*fe8322adSStefano Zampini t->lag.TT = NULL; 434*fe8322adSStefano Zampini t->lag.caching = PETSC_TRUE; 435*fe8322adSStefano Zampini t->lag.Ucached.id = 0; 436*fe8322adSStefano Zampini t->lag.Ucached.state = -1; 437*fe8322adSStefano Zampini t->lag.Ucached.time = PETSC_MIN_REAL; 438*fe8322adSStefano Zampini t->lag.Ucached.step = PETSC_MAX_INT; 439*fe8322adSStefano Zampini t->lag.Udotcached.id = 0; 440*fe8322adSStefano Zampini t->lag.Udotcached.state = -1; 441*fe8322adSStefano Zampini t->lag.Udotcached.time = PETSC_MIN_REAL; 442*fe8322adSStefano Zampini t->lag.Udotcached.step = PETSC_MAX_INT; 443*fe8322adSStefano Zampini t->adjoint_solve_mode = PETSC_TRUE; 444*fe8322adSStefano Zampini t->solution_only = PETSC_FALSE; 445*fe8322adSStefano Zampini t->keepfiles = PETSC_FALSE; 446b1d74d50SHong Zhang *tj = t; 44784a45834SBarry Smith ierr = TSTrajectorySetDirname(t,"SA-data");CHKERRQ(ierr); 448e94726ebSBarry Smith ierr = TSTrajectorySetFiletemplate(t,"SA-%06D.bin");CHKERRQ(ierr); 449bc952696SBarry Smith PetscFunctionReturn(0); 450bc952696SBarry Smith } 451bc952696SBarry Smith 452bc952696SBarry Smith /*@C 453bc952696SBarry Smith TSTrajectorySetType - Sets the storage method to be used as in a trajectory 454bc952696SBarry Smith 455bc952696SBarry Smith Collective on TS 456bc952696SBarry Smith 457bc952696SBarry Smith Input Parameters: 4583c0fce88SHong Zhang + tj - the TSTrajectory context 4593c0fce88SHong Zhang . ts - the TS context 4603c0fce88SHong Zhang - type - a known method 461bc952696SBarry Smith 462bc952696SBarry Smith Options Database Command: 463e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 464bc952696SBarry Smith 465df5474d8SHong Zhang Level: developer 466bc952696SBarry Smith 4673c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, type 468bc952696SBarry Smith 4693c0fce88SHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy() 470bc952696SBarry Smith 471bc952696SBarry Smith @*/ 472fd9d3c67SJed Brown PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type) 473bc952696SBarry Smith { 474972caf09SHong Zhang PetscErrorCode (*r)(TSTrajectory,TS); 475bc952696SBarry Smith PetscBool match; 476bc952696SBarry Smith PetscErrorCode ierr; 477bc952696SBarry Smith 478bc952696SBarry Smith PetscFunctionBegin; 479972caf09SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 480972caf09SHong Zhang ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr); 481bc952696SBarry Smith if (match) PetscFunctionReturn(0); 482bc952696SBarry Smith 483bc952696SBarry Smith ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr); 484bc952696SBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 485972caf09SHong Zhang if (tj->ops->destroy) { 486972caf09SHong Zhang ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr); 487bc952696SBarry Smith 488972caf09SHong Zhang tj->ops->destroy = NULL; 489bc952696SBarry Smith } 490972caf09SHong Zhang ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr); 491bc952696SBarry Smith 492972caf09SHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr); 493972caf09SHong Zhang ierr = (*r)(tj,ts);CHKERRQ(ierr); 494bc952696SBarry Smith PetscFunctionReturn(0); 495bc952696SBarry Smith } 496bc952696SBarry Smith 497972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 498972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 4999a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 5002b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS); 501bc952696SBarry Smith 502bc952696SBarry Smith /*@C 503bc952696SBarry Smith TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 504bc952696SBarry Smith 505bc952696SBarry Smith Not Collective 506bc952696SBarry Smith 507df5474d8SHong Zhang Level: developer 508bc952696SBarry Smith 5093c0fce88SHong Zhang .keywords: TS, trajectory, register, all 5103c0fce88SHong Zhang 5113c0fce88SHong Zhang .seealso: TSTrajectoryRegister() 512bc952696SBarry Smith @*/ 513bc952696SBarry Smith PetscErrorCode TSTrajectoryRegisterAll(void) 514bc952696SBarry Smith { 515bc952696SBarry Smith PetscErrorCode ierr; 516bc952696SBarry Smith 517bc952696SBarry Smith PetscFunctionBegin; 518560360afSLisandro Dalcin if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 519bc952696SBarry Smith TSTrajectoryRegisterAllCalled = PETSC_TRUE; 520bc952696SBarry Smith 521bc952696SBarry Smith ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr); 5221c8c567eSBarry Smith ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr); 5239a53571cSHong Zhang ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr); 5242b043167SHong Zhang ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr); 525bc952696SBarry Smith PetscFunctionReturn(0); 526bc952696SBarry Smith } 527bc952696SBarry Smith 528bc952696SBarry Smith /*@ 5291550c9b9SHong Zhang TSTrajectoryReset - Resets a trajectory context 5301550c9b9SHong Zhang 5311550c9b9SHong Zhang Collective on TSTrajectory 5321550c9b9SHong Zhang 5331550c9b9SHong Zhang Input Parameter: 5341550c9b9SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 5351550c9b9SHong Zhang 5361550c9b9SHong Zhang Level: developer 5371550c9b9SHong Zhang 5381550c9b9SHong Zhang .keywords: TS, trajectory, timestep, reset 5391550c9b9SHong Zhang 5401550c9b9SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 5411550c9b9SHong Zhang @*/ 5429a992471SHong Zhang PetscErrorCode TSTrajectoryReset(TSTrajectory tj) 5431550c9b9SHong Zhang { 5441550c9b9SHong Zhang PetscErrorCode ierr; 5451550c9b9SHong Zhang 5461550c9b9SHong Zhang PetscFunctionBegin; 5479a992471SHong Zhang if (!tj) PetscFunctionReturn(0); 5489a992471SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 5499a992471SHong Zhang if (tj->ops->reset) { 5509a992471SHong Zhang ierr = (*tj->ops->reset)(tj);CHKERRQ(ierr); 5519a992471SHong Zhang } 5529a992471SHong Zhang ierr = PetscFree(tj->dirfiletemplate);CHKERRQ(ierr); 553*fe8322adSStefano Zampini ierr = TSHistoryDestroy(&tj->tsh);CHKERRQ(ierr); 554*fe8322adSStefano Zampini ierr = TSHistoryCreate(PetscObjectComm((PetscObject)tj),&tj->tsh);CHKERRQ(ierr); 555*fe8322adSStefano Zampini tj->setupcalled = PETSC_FALSE; 5561550c9b9SHong Zhang PetscFunctionReturn(0); 5571550c9b9SHong Zhang } 5581550c9b9SHong Zhang 5591550c9b9SHong Zhang /*@ 560bc952696SBarry Smith TSTrajectoryDestroy - Destroys a trajectory context 561bc952696SBarry Smith 562bc952696SBarry Smith Collective on TSTrajectory 563bc952696SBarry Smith 564bc952696SBarry Smith Input Parameter: 5653c0fce88SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 566bc952696SBarry Smith 567df5474d8SHong Zhang Level: developer 568bc952696SBarry Smith 5693c0fce88SHong Zhang .keywords: TS, trajectory, timestep, destroy 570bc952696SBarry Smith 5713c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 572bc952696SBarry Smith @*/ 573972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 574bc952696SBarry Smith { 575bc952696SBarry Smith PetscErrorCode ierr; 576bc952696SBarry Smith 577bc952696SBarry Smith PetscFunctionBegin; 578972caf09SHong Zhang if (!*tj) PetscFunctionReturn(0); 579972caf09SHong Zhang PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 580972caf09SHong Zhang if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 581bc952696SBarry Smith 582*fe8322adSStefano Zampini ierr = TSTrajectoryReset(*tj);CHKERRQ(ierr); 583*fe8322adSStefano Zampini ierr = TSHistoryDestroy(&(*tj)->tsh);CHKERRQ(ierr); 584*fe8322adSStefano Zampini ierr = VecDestroyVecs((*tj)->lag.order+1,&(*tj)->lag.W);CHKERRQ(ierr); 585*fe8322adSStefano Zampini ierr = PetscFree5((*tj)->lag.L,(*tj)->lag.T,(*tj)->lag.WW,(*tj)->lag.TT,(*tj)->lag.TW);CHKERRQ(ierr); 586*fe8322adSStefano Zampini ierr = VecDestroy(&(*tj)->U);CHKERRQ(ierr); 587*fe8322adSStefano Zampini ierr = VecDestroy(&(*tj)->Udot);CHKERRQ(ierr); 5889a992471SHong Zhang 5897f79407eSBarry Smith if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);} 590972caf09SHong Zhang if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 591*fe8322adSStefano Zampini if (!((*tj)->keepfiles)) { 592*fe8322adSStefano Zampini PetscMPIInt rank; 593*fe8322adSStefano Zampini MPI_Comm comm; 594*fe8322adSStefano Zampini 595*fe8322adSStefano Zampini ierr = PetscObjectGetComm((PetscObject)(*tj),&comm);CHKERRQ(ierr); 596*fe8322adSStefano Zampini ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 597*fe8322adSStefano Zampini if (!rank) { /* we own the directory, so we run PetscRMTree on it */ 598*fe8322adSStefano Zampini ierr = PetscRMTree((*tj)->dirname);CHKERRQ(ierr); 599*fe8322adSStefano Zampini } 600*fe8322adSStefano Zampini } 60178fbdcc8SBarry Smith ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr); 60264e38db7SHong Zhang ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr); 60364e38db7SHong Zhang ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr); 604972caf09SHong Zhang ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 605bc952696SBarry Smith PetscFunctionReturn(0); 606bc952696SBarry Smith } 607bc952696SBarry Smith 608bc952696SBarry Smith /* 609772b2523SBarry Smith TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 610bc952696SBarry Smith 611bc952696SBarry Smith Collective on TSTrajectory 612bc952696SBarry Smith 613bc952696SBarry Smith Input Parameter: 6143c0fce88SHong Zhang + tj - the TSTrajectory context 6153c0fce88SHong Zhang - ts - the TS context 6163c0fce88SHong Zhang 6173c0fce88SHong Zhang Options Database Keys: 6183c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 619bc952696SBarry Smith 620df5474d8SHong Zhang Level: developer 621bc952696SBarry Smith 6223c0fce88SHong Zhang .keywords: TS, trajectory, set, options, type 6233c0fce88SHong Zhang 6243c0fce88SHong Zhang .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType() 625bc952696SBarry Smith */ 6262bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 627bc952696SBarry Smith { 628bc952696SBarry Smith PetscBool opt; 629bc952696SBarry Smith const char *defaultType; 630bc952696SBarry Smith char typeName[256]; 631bc952696SBarry Smith PetscErrorCode ierr; 632bc952696SBarry Smith 633bc952696SBarry Smith PetscFunctionBegin; 634b1d74d50SHong Zhang if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 635bc952696SBarry Smith else defaultType = TSTRAJECTORYBASIC; 636bc952696SBarry Smith 637560360afSLisandro Dalcin ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr); 638e210cd0eSHong Zhang ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 639bc952696SBarry Smith if (opt) { 640972caf09SHong Zhang ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr); 641bc952696SBarry Smith } else { 642972caf09SHong Zhang ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr); 643bc952696SBarry Smith } 644bc952696SBarry Smith PetscFunctionReturn(0); 645bc952696SBarry Smith } 646bc952696SBarry Smith 647ed695a29SHong Zhang /*@ 648ed695a29SHong Zhang TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 649ed695a29SHong Zhang 650ed695a29SHong Zhang Collective on TSTrajectory 651ed695a29SHong Zhang 652ed695a29SHong Zhang Input Arguments: 653ed695a29SHong Zhang + tj - the TSTrajectory context 654ed695a29SHong Zhang - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 655ed695a29SHong Zhang 6563c0fce88SHong Zhang Options Database Keys: 657063c0c7aSHong Zhang . -ts_trajectory_monitor - print TSTrajectory information 6583c0fce88SHong Zhang 659df5474d8SHong Zhang Level: developer 660ed695a29SHong Zhang 6613c0fce88SHong Zhang .keywords: TS, trajectory, set, monitor 6623c0fce88SHong Zhang 6633c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp() 664ed695a29SHong Zhang @*/ 6652bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg) 666ed695a29SHong Zhang { 667ed695a29SHong Zhang PetscFunctionBegin; 668ed695a29SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 669ed695a29SHong Zhang PetscValidLogicalCollectiveBool(tj,flg,2); 670*fe8322adSStefano Zampini if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj)); 671*fe8322adSStefano Zampini else tj->monitor = NULL; 672ed695a29SHong Zhang PetscFunctionReturn(0); 673ed695a29SHong Zhang } 674ed695a29SHong Zhang 675bc952696SBarry Smith /*@ 67664fc91eeSBarry Smith TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory 67764fc91eeSBarry Smith 67864fc91eeSBarry Smith Collective on TSTrajectory 67964fc91eeSBarry Smith 68064fc91eeSBarry Smith Input Arguments: 68164fc91eeSBarry Smith + tj - the TSTrajectory context 68264fc91eeSBarry Smith - flg - PETSC_TRUE to save, PETSC_FALSE to disable 68364fc91eeSBarry Smith 68464fc91eeSBarry Smith Options Database Keys: 68564fc91eeSBarry Smith . -ts_trajectory_keep_files - have it keep the files 68664fc91eeSBarry Smith 68795452b02SPatrick Sanan Notes: 68895452b02SPatrick Sanan By default the TSTrajectory used for adjoint computations, TSTRAJECTORYBASIC, removes the files it generates at the end of the run. This causes the files to be kept. 68964fc91eeSBarry Smith 69064fc91eeSBarry Smith Level: advanced 69164fc91eeSBarry Smith 69264fc91eeSBarry Smith .keywords: TS, trajectory, set, monitor 69364fc91eeSBarry Smith 69464fc91eeSBarry Smith .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor() 69564fc91eeSBarry Smith @*/ 69664fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg) 69764fc91eeSBarry Smith { 69864fc91eeSBarry Smith PetscFunctionBegin; 69964fc91eeSBarry Smith PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 70064fc91eeSBarry Smith PetscValidLogicalCollectiveBool(tj,flg,2); 70164fc91eeSBarry Smith tj->keepfiles = flg; 70264fc91eeSBarry Smith PetscFunctionReturn(0); 70364fc91eeSBarry Smith } 70464fc91eeSBarry Smith 705db901c5bSHong Zhang /*@C 70664e38db7SHong Zhang TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored. 70764e38db7SHong Zhang 70864e38db7SHong Zhang Collective on TSTrajectory 70964e38db7SHong Zhang 71064e38db7SHong Zhang Input Arguments: 71164e38db7SHong Zhang + tj - the TSTrajectory context 71264e38db7SHong Zhang - dirname - the directory name 71364e38db7SHong Zhang 71464e38db7SHong Zhang Options Database Keys: 71564e38db7SHong Zhang . -ts_trajectory_dirname - set the directory name 71664e38db7SHong Zhang 71795452b02SPatrick Sanan Notes: 71895452b02SPatrick Sanan The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate() 7191585b412SBarry Smith 72064e38db7SHong Zhang Level: developer 72164e38db7SHong Zhang 72264e38db7SHong Zhang .keywords: TS, trajectory, set 72364e38db7SHong Zhang 72464e38db7SHong Zhang .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp() 72564e38db7SHong Zhang @*/ 72664e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[]) 72764e38db7SHong Zhang { 72864e38db7SHong Zhang PetscErrorCode ierr; 72964e38db7SHong Zhang PetscFunctionBegin; 73064e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 731*fe8322adSStefano Zampini if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after TSTrajectory has been setup"); 73284a45834SBarry Smith ierr = PetscFree(tj->dirname);CHKERRQ(ierr); 73364e38db7SHong Zhang ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr); 73464e38db7SHong Zhang PetscFunctionReturn(0); 73564e38db7SHong Zhang } 73664e38db7SHong Zhang 737db901c5bSHong Zhang /*@C 73864e38db7SHong Zhang TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints. 73964e38db7SHong Zhang 74064e38db7SHong Zhang Collective on TSTrajectory 74164e38db7SHong Zhang 74264e38db7SHong Zhang Input Arguments: 74364e38db7SHong Zhang + tj - the TSTrajectory context 7441585b412SBarry Smith - filetemplate - the template 74564e38db7SHong Zhang 74664e38db7SHong Zhang Options Database Keys: 7471585b412SBarry Smith . -ts_trajectory_file_template - set the file name template 7481585b412SBarry Smith 74995452b02SPatrick Sanan Notes: 75095452b02SPatrick Sanan The name template should be of the form, for example filename-%06D.bin It should not begin with a leading / 7511585b412SBarry Smith 7521585b412SBarry Smith The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the 7531585b412SBarry Smith timestep counter 75464e38db7SHong Zhang 75564e38db7SHong Zhang Level: developer 75664e38db7SHong Zhang 75764e38db7SHong Zhang .keywords: TS, trajectory, set 75864e38db7SHong Zhang 7591585b412SBarry Smith .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp() 76064e38db7SHong Zhang @*/ 76164e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[]) 76264e38db7SHong Zhang { 76364e38db7SHong Zhang PetscErrorCode ierr; 7649afe7f3eSBarry Smith const char *ptr,*ptr2; 7659afe7f3eSBarry Smith 76664e38db7SHong Zhang PetscFunctionBegin; 76764e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 7689afe7f3eSBarry Smith if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup"); 7699afe7f3eSBarry Smith 7709afe7f3eSBarry Smith if (!filetemplate[0]) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin"); 7719afe7f3eSBarry Smith /* Do some cursory validation of the input. */ 7729afe7f3eSBarry Smith ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr); 7739afe7f3eSBarry Smith if (!ptr) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin"); 7749afe7f3eSBarry Smith for (ptr++; ptr && *ptr; ptr++) { 7759afe7f3eSBarry Smith ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr); 7769afe7f3eSBarry Smith if (!ptr2 && (*ptr < '0' || '9' < *ptr)) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"Invalid file template argument to -ts_trajectory_file_template, should look like filename-%%06D.bin"); 7779afe7f3eSBarry Smith if (ptr2) break; 7789afe7f3eSBarry Smith } 77984a45834SBarry Smith ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr); 78064e38db7SHong Zhang ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr); 78164e38db7SHong Zhang PetscFunctionReturn(0); 78264e38db7SHong Zhang } 78364e38db7SHong Zhang 78464e38db7SHong Zhang /*@ 785bc952696SBarry Smith TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 786bc952696SBarry Smith 787bc952696SBarry Smith Collective on TSTrajectory 788bc952696SBarry Smith 789bc952696SBarry Smith Input Parameter: 7903c0fce88SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 7913c0fce88SHong Zhang - ts - the TS context 792bc952696SBarry Smith 793bc952696SBarry Smith Options Database Keys: 7943c0fce88SHong Zhang + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 79564fc91eeSBarry Smith . -ts_trajectory_keep_files <true,false> - keep the files generated by the code after the program ends. This is true by default for TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 796063c0c7aSHong Zhang - -ts_trajectory_monitor - print TSTrajectory information 797bc952696SBarry Smith 798df5474d8SHong Zhang Level: developer 799bc952696SBarry Smith 80095452b02SPatrick Sanan Notes: 80195452b02SPatrick Sanan This is not normally called directly by users 802bc952696SBarry Smith 8033c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, options, database 804bc952696SBarry Smith 8053c0fce88SHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp() 806bc952696SBarry Smith @*/ 807972caf09SHong Zhang PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 808bc952696SBarry Smith { 809ed695a29SHong Zhang PetscBool set,flg; 81064e38db7SHong Zhang char dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN]; 81164e38db7SHong Zhang PetscErrorCode ierr; 812bc952696SBarry Smith 813bc952696SBarry Smith PetscFunctionBegin; 814b1d74d50SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 815*fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 816b1d74d50SHong Zhang ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 817972caf09SHong Zhang ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 818ed695a29SHong Zhang ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 819aced365eSHong Zhang if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);} 820*fe8322adSStefano Zampini ierr = PetscOptionsInt("-ts_trajectory_reconstruction_order","Interpolation order for reconstruction",NULL,tj->lag.order,&tj->lag.order,NULL);CHKERRQ(ierr); 821*fe8322adSStefano Zampini ierr = PetscOptionsBool("-ts_trajectory_reconstruction_caching","Turn on/off caching of TSTrajectoryGetVecs input",NULL,tj->lag.caching,&tj->lag.caching,NULL);CHKERRQ(ierr); 822*fe8322adSStefano Zampini ierr = PetscOptionsBool("-ts_trajectory_adjointmode","Instruct the trajectory that will be used in a TSAdjointSolve()",NULL,tj->adjoint_solve_mode,&tj->adjoint_solve_mode,NULL);CHKERRQ(ierr); 823*fe8322adSStefano Zampini ierr = PetscOptionsBool("-ts_trajectory_solution_only","Checkpoint solution only","TSTrajectorySetSolutionOnly",tj->solution_only,&tj->solution_only,NULL);CHKERRQ(ierr); 82464fc91eeSBarry Smith ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr); 82564fc91eeSBarry Smith if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);} 82664e38db7SHong Zhang 82764e38db7SHong Zhang ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr); 82884a45834SBarry Smith if (set) { 82964e38db7SHong Zhang ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr); 83084a45834SBarry Smith } 83164e38db7SHong Zhang 8321585b412SBarry Smith ierr = PetscOptionsString("-ts_trajectory_file_template","Template for TSTrajectory file name, use filename-%06D.bin","TSTrajectorySetFiletemplate",0,filetemplate,PETSC_MAX_PATH_LEN,&set);CHKERRQ(ierr); 83364e38db7SHong Zhang if (set) { 8341585b412SBarry Smith ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr); 83584a45834SBarry Smith } 83664e38db7SHong Zhang 83764e38db7SHong Zhang /* Handle specific TSTrajectory options */ 83862b521acSHong Zhang if (tj->ops->setfromoptions) { 83962b521acSHong Zhang ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr); 84062b521acSHong Zhang } 841bc952696SBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 842bc952696SBarry Smith PetscFunctionReturn(0); 843bc952696SBarry Smith } 84468bece0bSHong Zhang 84568bece0bSHong Zhang /*@ 84668bece0bSHong Zhang TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 84768bece0bSHong Zhang of a TS trajectory. 84868bece0bSHong Zhang 84968bece0bSHong Zhang Collective on TS 85068bece0bSHong Zhang 85168bece0bSHong Zhang Input Parameter: 8523c0fce88SHong Zhang + ts - the TS context obtained from TSCreate() 8533c0fce88SHong Zhang - tj - the TS trajectory context 85468bece0bSHong Zhang 855df5474d8SHong Zhang Level: developer 85668bece0bSHong Zhang 8573c0fce88SHong Zhang .keywords: TS, trajectory, setup 85868bece0bSHong Zhang 85968bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 86068bece0bSHong Zhang @*/ 86168bece0bSHong Zhang PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 86268bece0bSHong Zhang { 86368bece0bSHong Zhang PetscErrorCode ierr; 8649afe7f3eSBarry Smith size_t s1,s2; 86568bece0bSHong Zhang 86668bece0bSHong Zhang PetscFunctionBegin; 86768bece0bSHong Zhang if (!tj) PetscFunctionReturn(0); 86868bece0bSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 869*fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 87068bece0bSHong Zhang if (tj->setupcalled) PetscFunctionReturn(0); 87168bece0bSHong Zhang 87268bece0bSHong Zhang if (!((PetscObject)tj)->type_name) { 87368bece0bSHong Zhang ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr); 87468bece0bSHong Zhang } 87568bece0bSHong Zhang if (tj->ops->setup) { 87668bece0bSHong Zhang ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr); 87768bece0bSHong Zhang } 87868bece0bSHong Zhang 87968bece0bSHong Zhang tj->setupcalled = PETSC_TRUE; 88053b27ddbSHong Zhang 88153b27ddbSHong Zhang /* Set the counters to zero */ 8821a5a771fSHong Zhang tj->recomps = 0; 88353b27ddbSHong Zhang tj->diskreads = 0; 88453b27ddbSHong Zhang tj->diskwrites = 0; 8859afe7f3eSBarry Smith ierr = PetscStrlen(tj->dirname,&s1);CHKERRQ(ierr); 8869afe7f3eSBarry Smith ierr = PetscStrlen(tj->filetemplate,&s2);CHKERRQ(ierr); 887*fe8322adSStefano Zampini ierr = PetscFree(tj->dirfiletemplate);CHKERRQ(ierr); 88811e1d5c3SBarry Smith ierr = PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate);CHKERRQ(ierr); 88911e1d5c3SBarry Smith ierr = PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate);CHKERRQ(ierr); 89068bece0bSHong Zhang PetscFunctionReturn(0); 89168bece0bSHong Zhang } 892*fe8322adSStefano Zampini 893*fe8322adSStefano Zampini /*@ 894*fe8322adSStefano Zampini TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage also. 895*fe8322adSStefano Zampini 896*fe8322adSStefano Zampini Collective on TSTrajectory 897*fe8322adSStefano Zampini 898*fe8322adSStefano Zampini Input Parameter: 899*fe8322adSStefano Zampini + tj - the TS trajectory context 900*fe8322adSStefano Zampini - flg - the boolean flag 901*fe8322adSStefano Zampini 902*fe8322adSStefano Zampini Level: developer 903*fe8322adSStefano Zampini 904*fe8322adSStefano Zampini .keywords: trajectory 905*fe8322adSStefano Zampini 906*fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryGetSolutionOnly() 907*fe8322adSStefano Zampini @*/ 908*fe8322adSStefano Zampini PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj,PetscBool solution_only) 909*fe8322adSStefano Zampini { 910*fe8322adSStefano Zampini PetscFunctionBegin; 911*fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 912*fe8322adSStefano Zampini PetscValidLogicalCollectiveBool(tj,solution_only,2); 913*fe8322adSStefano Zampini tj->solution_only = solution_only; 914*fe8322adSStefano Zampini PetscFunctionReturn(0); 915*fe8322adSStefano Zampini } 916*fe8322adSStefano Zampini 917*fe8322adSStefano Zampini /*@ 918*fe8322adSStefano Zampini TSTrajectoryGetSolutionOnly - Gets the value set with TSTrajectorySetSolutionOnly. 919*fe8322adSStefano Zampini 920*fe8322adSStefano Zampini Logically collective on TSTrajectory 921*fe8322adSStefano Zampini 922*fe8322adSStefano Zampini Input Parameter: 923*fe8322adSStefano Zampini . tj - the TS trajectory context 924*fe8322adSStefano Zampini 925*fe8322adSStefano Zampini Output Parameter: 926*fe8322adSStefano Zampini - flg - the boolean flag 927*fe8322adSStefano Zampini 928*fe8322adSStefano Zampini Level: developer 929*fe8322adSStefano Zampini 930*fe8322adSStefano Zampini .keywords: trajectory 931*fe8322adSStefano Zampini 932*fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetSolutionOnly() 933*fe8322adSStefano Zampini @*/ 934*fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj,PetscBool *solution_only) 935*fe8322adSStefano Zampini { 936*fe8322adSStefano Zampini PetscFunctionBegin; 937*fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 938*fe8322adSStefano Zampini PetscValidPointer(solution_only,2); 939*fe8322adSStefano Zampini *solution_only = tj->solution_only; 940*fe8322adSStefano Zampini PetscFunctionReturn(0); 941*fe8322adSStefano Zampini } 942*fe8322adSStefano Zampini 943*fe8322adSStefano Zampini /*@ 944*fe8322adSStefano Zampini TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors. 945*fe8322adSStefano Zampini 946*fe8322adSStefano Zampini Collective on TSTrajectory 947*fe8322adSStefano Zampini 948*fe8322adSStefano Zampini Input Parameter: 949*fe8322adSStefano Zampini + tj - the TS trajectory context 950*fe8322adSStefano Zampini . ts - the TS solver context 951*fe8322adSStefano Zampini - time - the requested time 952*fe8322adSStefano Zampini 953*fe8322adSStefano Zampini Output Parameter: 954*fe8322adSStefano Zampini + U - state vector at given time (can be interpolated) 955*fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 956*fe8322adSStefano Zampini 957*fe8322adSStefano Zampini Level: developer 958*fe8322adSStefano Zampini 959*fe8322adSStefano Zampini Notes: The vectors are interpolated if time does not match any time step stored in the TSTrajectory(). Pass NULL to not request a vector. 960*fe8322adSStefano Zampini This function differs from TSTrajectoryGetVecs since the vectors obtained cannot be modified, and they need to be returned by 961*fe8322adSStefano Zampini calling TSTrajectoryRestoreUpdatedHistoryVecs(). 962*fe8322adSStefano Zampini 963*fe8322adSStefano Zampini .keywords: trajectory 964*fe8322adSStefano Zampini 965*fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryRestoreUpdatedHistoryVecs(), TSTrajectoryGetVecs() 966*fe8322adSStefano Zampini @*/ 967*fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot) 968*fe8322adSStefano Zampini { 969*fe8322adSStefano Zampini PetscErrorCode ierr; 970*fe8322adSStefano Zampini 971*fe8322adSStefano Zampini PetscFunctionBegin; 972*fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 973*fe8322adSStefano Zampini PetscValidHeaderSpecific(ts,TS_CLASSID,2); 974*fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj,time,3); 975*fe8322adSStefano Zampini if (U) PetscValidPointer(U,4); 976*fe8322adSStefano Zampini if (Udot) PetscValidPointer(Udot,5); 977*fe8322adSStefano Zampini if (U && !tj->U) { 978*fe8322adSStefano Zampini DM dm; 979*fe8322adSStefano Zampini 980*fe8322adSStefano Zampini ierr = TSGetDM(ts,&dm);CHKERRQ(ierr); 981*fe8322adSStefano Zampini ierr = DMCreateGlobalVector(dm,&tj->U);CHKERRQ(ierr); 982*fe8322adSStefano Zampini } 983*fe8322adSStefano Zampini if (Udot && !tj->Udot) { 984*fe8322adSStefano Zampini DM dm; 985*fe8322adSStefano Zampini 986*fe8322adSStefano Zampini ierr = TSGetDM(ts,&dm);CHKERRQ(ierr); 987*fe8322adSStefano Zampini ierr = DMCreateGlobalVector(dm,&tj->Udot);CHKERRQ(ierr); 988*fe8322adSStefano Zampini } 989*fe8322adSStefano Zampini ierr = TSTrajectoryGetVecs(tj,ts,PETSC_DECIDE,&time,U ? tj->U : NULL,Udot ? tj->Udot : NULL);CHKERRQ(ierr); 990*fe8322adSStefano Zampini if (U) { 991*fe8322adSStefano Zampini ierr = VecLockPush(tj->U);CHKERRQ(ierr); 992*fe8322adSStefano Zampini *U = tj->U; 993*fe8322adSStefano Zampini } 994*fe8322adSStefano Zampini if (Udot) { 995*fe8322adSStefano Zampini ierr = VecLockPush(tj->Udot);CHKERRQ(ierr); 996*fe8322adSStefano Zampini *Udot = tj->Udot; 997*fe8322adSStefano Zampini } 998*fe8322adSStefano Zampini PetscFunctionReturn(0); 999*fe8322adSStefano Zampini } 1000*fe8322adSStefano Zampini 1001*fe8322adSStefano Zampini /*@ 1002*fe8322adSStefano Zampini TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with TSTrajectoryGetUpdatedHistoryVecs(). 1003*fe8322adSStefano Zampini 1004*fe8322adSStefano Zampini Collective on TSTrajectory 1005*fe8322adSStefano Zampini 1006*fe8322adSStefano Zampini Input Parameter: 1007*fe8322adSStefano Zampini + tj - the TS trajectory context 1008*fe8322adSStefano Zampini . U - state vector at given time (can be interpolated) 1009*fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 1010*fe8322adSStefano Zampini 1011*fe8322adSStefano Zampini Level: developer 1012*fe8322adSStefano Zampini 1013*fe8322adSStefano Zampini .keywords: trajectory 1014*fe8322adSStefano Zampini 1015*fe8322adSStefano Zampini .seealso: TSTrajectoryGetUpdatedHistoryVecs() 1016*fe8322adSStefano Zampini @*/ 1017*fe8322adSStefano Zampini PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot) 1018*fe8322adSStefano Zampini { 1019*fe8322adSStefano Zampini PetscErrorCode ierr; 1020*fe8322adSStefano Zampini 1021*fe8322adSStefano Zampini PetscFunctionBegin; 1022*fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 1023*fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(*U,VEC_CLASSID,2); 1024*fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(*Udot,VEC_CLASSID,3); 1025*fe8322adSStefano Zampini if (U && *U != tj->U) SETERRQ(PetscObjectComm((PetscObject)*U),PETSC_ERR_USER,"U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 1026*fe8322adSStefano Zampini if (Udot && *Udot != tj->Udot) SETERRQ(PetscObjectComm((PetscObject)*Udot),PETSC_ERR_USER,"Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 1027*fe8322adSStefano Zampini if (U) { 1028*fe8322adSStefano Zampini ierr = VecLockPop(tj->U);CHKERRQ(ierr); 1029*fe8322adSStefano Zampini *U = NULL; 1030*fe8322adSStefano Zampini } 1031*fe8322adSStefano Zampini if (Udot) { 1032*fe8322adSStefano Zampini ierr = VecLockPop(tj->Udot);CHKERRQ(ierr); 1033*fe8322adSStefano Zampini *Udot = NULL; 1034*fe8322adSStefano Zampini } 1035*fe8322adSStefano Zampini PetscFunctionReturn(0); 1036*fe8322adSStefano Zampini } 1037