1af0996ceSBarry Smith #include <petsc/private/tsimpl.h> /*I "petscts.h" I*/ 2fe8322adSStefano Zampini #include <petsc/private/tshistoryimpl.h> 3fe8322adSStefano Zampini #include <petscdm.h> 4bc952696SBarry Smith 5bc952696SBarry Smith PetscFunctionList TSTrajectoryList = NULL; 6bc952696SBarry Smith PetscBool TSTrajectoryRegisterAllCalled = PETSC_FALSE; 7bc952696SBarry Smith PetscClassId TSTRAJECTORY_CLASSID; 82bf6d308SHong Zhang PetscLogEvent TSTrajectory_Set, TSTrajectory_Get, TSTrajectory_GetVecs, TSTrajectory_SetUp; 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 .seealso: TSTrajectoryRegisterAll() 25bc952696SBarry Smith @*/ 26972caf09SHong Zhang PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS)) 27bc952696SBarry Smith { 28bc952696SBarry Smith PetscErrorCode ierr; 29bc952696SBarry Smith 30bc952696SBarry Smith PetscFunctionBegin; 31bc952696SBarry Smith ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr); 32bc952696SBarry Smith PetscFunctionReturn(0); 33bc952696SBarry Smith } 34bc952696SBarry Smith 35fe8322adSStefano Zampini /*@ 36fe8322adSStefano Zampini TSTrajectorySet - Sets a vector of state in the trajectory object 37fe8322adSStefano Zampini 38fe8322adSStefano Zampini Collective on TSTrajectory 39fe8322adSStefano Zampini 40fe8322adSStefano Zampini Input Parameters: 41fe8322adSStefano Zampini + tj - the trajectory object 42fe8322adSStefano Zampini . ts - the time stepper object (optional) 43fe8322adSStefano Zampini . stepnum - the step number 44fe8322adSStefano Zampini . time - the current time 45fe8322adSStefano Zampini - X - the current solution 46fe8322adSStefano Zampini 47fe8322adSStefano Zampini Level: developer 48fe8322adSStefano Zampini 49fe8322adSStefano Zampini Notes: Usually one does not call this routine, it is called automatically during TSSolve() 50fe8322adSStefano Zampini 51fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectoryGet(), TSTrajectoryGetVecs() 52fe8322adSStefano Zampini @*/ 53bc952696SBarry Smith PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X) 54bc952696SBarry Smith { 55bc952696SBarry Smith PetscErrorCode ierr; 56bc952696SBarry Smith 57bc952696SBarry Smith PetscFunctionBegin; 58bc952696SBarry Smith if (!tj) PetscFunctionReturn(0); 59fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 60fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 61fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj,stepnum,3); 62fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj,time,4); 63fe8322adSStefano Zampini PetscValidHeaderSpecific(X,VEC_CLASSID,5); 64fe8322adSStefano Zampini if (!tj->ops->set) SETERRQ1(PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name); 65fe8322adSStefano Zampini if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first"); 66fe8322adSStefano Zampini if (tj->monitor) { 67fe8322adSStefano Zampini ierr = PetscViewerASCIIPrintf(tj->monitor,"TSTrajectorySet: stepnum %D, time %g (stages %D)\n",stepnum,(double)time,(PetscInt)!tj->solution_only);CHKERRQ(ierr); 68fe8322adSStefano Zampini } 69d0d044f3SHong Zhang ierr = PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr); 70bc952696SBarry Smith ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr); 71d0d044f3SHong Zhang ierr = PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr); 72ac1a7491SHong Zhang if (tj->usehistory) { 73fe8322adSStefano Zampini ierr = TSHistoryUpdate(tj->tsh,stepnum,time);CHKERRQ(ierr); 74ac1a7491SHong Zhang } 75fe8322adSStefano Zampini if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL; 76bc952696SBarry Smith PetscFunctionReturn(0); 77bc952696SBarry Smith } 78bc952696SBarry Smith 79fe8322adSStefano Zampini /*@ 80fe8322adSStefano Zampini TSTrajectoryGetNumSteps - Return the number of steps registered in the TSTrajectory via TSTrajectorySet(). 81fe8322adSStefano Zampini 82fe8322adSStefano Zampini Not collective. 83fe8322adSStefano Zampini 84fe8322adSStefano Zampini Input Parameters: 85fe8322adSStefano Zampini . tj - the trajectory object 86fe8322adSStefano Zampini 87fe8322adSStefano Zampini Output Parameter: 88fe8322adSStefano Zampini . steps - the number of steps 89fe8322adSStefano Zampini 90fe8322adSStefano Zampini Level: developer 91fe8322adSStefano Zampini 92fe8322adSStefano Zampini .seealso: TSTrajectorySet() 93fe8322adSStefano Zampini @*/ 94fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps) 95fe8322adSStefano Zampini { 96fe8322adSStefano Zampini PetscErrorCode ierr; 97fe8322adSStefano Zampini 98fe8322adSStefano Zampini PetscFunctionBegin; 99fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 100fe8322adSStefano Zampini PetscValidIntPointer(steps,2); 101fe8322adSStefano Zampini ierr = TSHistoryGetNumSteps(tj->tsh,steps);CHKERRQ(ierr); 102fe8322adSStefano Zampini PetscFunctionReturn(0); 103fe8322adSStefano Zampini } 104fe8322adSStefano Zampini 105fe8322adSStefano Zampini /*@ 106fe8322adSStefano Zampini TSTrajectoryGet - Updates the solution vector of a time stepper object by inquiring the TSTrajectory 107fe8322adSStefano Zampini 108fe8322adSStefano Zampini Collective on TS 109fe8322adSStefano Zampini 110fe8322adSStefano Zampini Input Parameters: 111fe8322adSStefano Zampini + tj - the trajectory object 112fe8322adSStefano Zampini . ts - the time stepper object 113fe8322adSStefano Zampini - stepnum - the step number 114fe8322adSStefano Zampini 115fe8322adSStefano Zampini Output Parameter: 116fe8322adSStefano Zampini . time - the time associated with the step number 117fe8322adSStefano Zampini 118fe8322adSStefano Zampini Level: developer 119fe8322adSStefano Zampini 120fe8322adSStefano Zampini Notes: Usually one does not call this routine, it is called automatically during TSSolve() 121fe8322adSStefano Zampini 122fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySet(), TSTrajectoryGetVecs(), TSGetSolution() 123fe8322adSStefano Zampini @*/ 124c679fc15SHong Zhang PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time) 125bc952696SBarry Smith { 126bc952696SBarry Smith PetscErrorCode ierr; 127bc952696SBarry Smith 128bc952696SBarry Smith PetscFunctionBegin; 129bc952696SBarry Smith if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 130fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 131fe8322adSStefano Zampini PetscValidHeaderSpecific(ts,TS_CLASSID,2); 132fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj,stepnum,3); 133fe8322adSStefano Zampini PetscValidPointer(time,4); 134fe8322adSStefano Zampini if (!tj->ops->get) SETERRQ1(PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name); 135fe8322adSStefano Zampini if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first"); 13611e1d5c3SBarry Smith if (stepnum < 0) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_PLIB,"Requesting negative step number"); 137fe8322adSStefano Zampini if (tj->monitor) { 138fe8322adSStefano Zampini ierr = PetscViewerASCIIPrintf(tj->monitor,"TSTrajectoryGet: stepnum %D, stages %D\n",stepnum,(PetscInt)!tj->solution_only);CHKERRQ(ierr); 139fe8322adSStefano Zampini ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr); 140fe8322adSStefano Zampini } 141d0d044f3SHong Zhang ierr = PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 142bc952696SBarry Smith ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr); 143d0d044f3SHong Zhang ierr = PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 144bc952696SBarry Smith PetscFunctionReturn(0); 145bc952696SBarry Smith } 146bc952696SBarry Smith 147fe8322adSStefano Zampini /*@ 148fe8322adSStefano Zampini TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the TSTrajectory and, possibly, from the TS 149fe8322adSStefano Zampini 150fe8322adSStefano Zampini Collective on TS 151fe8322adSStefano Zampini 152fe8322adSStefano Zampini Input Parameters: 153fe8322adSStefano Zampini + tj - the trajectory object 154fe8322adSStefano Zampini . ts - the time stepper object (optional) 155fe8322adSStefano Zampini - stepnum - the requested step number 156fe8322adSStefano Zampini 157fe8322adSStefano Zampini Input/Output Parameters: 158fe8322adSStefano Zampini . time - the time associated with the step number 159fe8322adSStefano Zampini 160fe8322adSStefano Zampini Output Parameters: 161fe8322adSStefano Zampini + U - state vector (can be NULL) 162fe8322adSStefano Zampini - Udot - time derivative of state vector (can be NULL) 163fe8322adSStefano Zampini 164fe8322adSStefano Zampini Level: developer 165fe8322adSStefano Zampini 166fe8322adSStefano Zampini Notes: If the step number is PETSC_DECIDE, the time argument is used to inquire the trajectory. 167fe8322adSStefano Zampini If the requested time does not match any in the trajectory, Lagrangian interpolations are returned. 168fe8322adSStefano Zampini 169fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySet(), TSTrajectoryGet() 170fe8322adSStefano Zampini @*/ 171fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time,Vec U,Vec Udot) 172fe8322adSStefano Zampini { 173fe8322adSStefano Zampini PetscErrorCode ierr; 174fe8322adSStefano Zampini 175fe8322adSStefano Zampini PetscFunctionBegin; 176fe8322adSStefano Zampini if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 177fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 178fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 179fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj,stepnum,3); 180fe8322adSStefano Zampini PetscValidPointer(time,4); 181fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(U,VEC_CLASSID,5); 182fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(Udot,VEC_CLASSID,6); 183fe8322adSStefano Zampini if (!U && !Udot) PetscFunctionReturn(0); 184fe8322adSStefano Zampini if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first"); 185fe8322adSStefano Zampini ierr = PetscLogEventBegin(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr); 186fe8322adSStefano Zampini if (tj->monitor) { 187fe8322adSStefano Zampini PetscInt pU,pUdot; 188fe8322adSStefano Zampini pU = U ? 1 : 0; 189fe8322adSStefano Zampini pUdot = Udot ? 1 : 0; 190fe8322adSStefano Zampini ierr = PetscViewerASCIIPrintf(tj->monitor,"Requested by GetVecs %D %D: stepnum %D, time %g\n",pU,pUdot,stepnum,(double)*time);CHKERRQ(ierr); 191fe8322adSStefano Zampini ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr); 192fe8322adSStefano Zampini } 193fe8322adSStefano Zampini if (U && tj->lag.caching) { 194fe8322adSStefano Zampini PetscObjectId id; 195fe8322adSStefano Zampini PetscObjectState state; 196fe8322adSStefano Zampini 197fe8322adSStefano Zampini ierr = PetscObjectStateGet((PetscObject)U,&state);CHKERRQ(ierr); 198fe8322adSStefano Zampini ierr = PetscObjectGetId((PetscObject)U,&id);CHKERRQ(ierr); 199fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 200fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL; 201fe8322adSStefano Zampini } else { 202fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL; 203fe8322adSStefano Zampini } 204fe8322adSStefano Zampini if (tj->monitor && !U) { 205fe8322adSStefano Zampini ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr); 206fe8322adSStefano Zampini ierr = PetscViewerASCIIPrintf(tj->monitor,"State vector cached\n");CHKERRQ(ierr); 207fe8322adSStefano Zampini ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr); 208fe8322adSStefano Zampini ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr); 209fe8322adSStefano Zampini } 210fe8322adSStefano Zampini } 211fe8322adSStefano Zampini if (Udot && tj->lag.caching) { 212fe8322adSStefano Zampini PetscObjectId id; 213fe8322adSStefano Zampini PetscObjectState state; 214fe8322adSStefano Zampini 215fe8322adSStefano Zampini ierr = PetscObjectStateGet((PetscObject)Udot,&state);CHKERRQ(ierr); 216fe8322adSStefano Zampini ierr = PetscObjectGetId((PetscObject)Udot,&id);CHKERRQ(ierr); 217fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 218fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL; 219fe8322adSStefano Zampini } else { 220fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL; 221fe8322adSStefano Zampini } 222fe8322adSStefano Zampini if (tj->monitor && !Udot) { 223fe8322adSStefano Zampini ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr); 224fe8322adSStefano Zampini ierr = PetscViewerASCIIPrintf(tj->monitor,"Derivative vector cached\n");CHKERRQ(ierr); 225fe8322adSStefano Zampini ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr); 226fe8322adSStefano Zampini ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr); 227fe8322adSStefano Zampini } 228fe8322adSStefano Zampini } 229fe8322adSStefano Zampini if (!U && !Udot) { 230fe8322adSStefano Zampini ierr = PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr); 231fe8322adSStefano Zampini PetscFunctionReturn(0); 232fe8322adSStefano Zampini } 233fe8322adSStefano Zampini 234fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */ 235fe8322adSStefano Zampini if (tj->monitor) { 236fe8322adSStefano Zampini ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr); 237fe8322adSStefano Zampini } 238fe8322adSStefano Zampini /* cached states will be updated in the function */ 239fe8322adSStefano Zampini ierr = TSTrajectoryReconstruct_Private(tj,ts,*time,U,Udot);CHKERRQ(ierr); 240fe8322adSStefano Zampini if (tj->monitor) { 241fe8322adSStefano Zampini ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr); 242fe8322adSStefano Zampini ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr); 243fe8322adSStefano Zampini } 244fe8322adSStefano Zampini } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */ 245fe8322adSStefano Zampini TS fakets = ts; 246fe8322adSStefano Zampini Vec U2; 247fe8322adSStefano Zampini 248fe8322adSStefano Zampini /* use a fake TS if ts is missing */ 249fe8322adSStefano Zampini if (!ts) { 250fe8322adSStefano Zampini ierr = PetscObjectQuery((PetscObject)tj,"__fake_ts",(PetscObject*)&fakets);CHKERRQ(ierr); 251fe8322adSStefano Zampini if (!fakets) { 252fe8322adSStefano Zampini ierr = TSCreate(PetscObjectComm((PetscObject)tj),&fakets);CHKERRQ(ierr); 253fe8322adSStefano Zampini ierr = PetscObjectCompose((PetscObject)tj,"__fake_ts",(PetscObject)fakets);CHKERRQ(ierr); 254fe8322adSStefano Zampini ierr = PetscObjectDereference((PetscObject)fakets);CHKERRQ(ierr); 255fe8322adSStefano Zampini ierr = VecDuplicate(U,&U2);CHKERRQ(ierr); 256fe8322adSStefano Zampini ierr = TSSetSolution(fakets,U2);CHKERRQ(ierr); 257fe8322adSStefano Zampini ierr = PetscObjectDereference((PetscObject)U2);CHKERRQ(ierr); 258fe8322adSStefano Zampini } 259fe8322adSStefano Zampini } 260fe8322adSStefano Zampini ierr = TSTrajectoryGet(tj,fakets,stepnum,time);CHKERRQ(ierr); 261fe8322adSStefano Zampini ierr = TSGetSolution(fakets,&U2);CHKERRQ(ierr); 262fe8322adSStefano Zampini ierr = VecCopy(U2,U);CHKERRQ(ierr); 263fe8322adSStefano Zampini ierr = PetscObjectStateGet((PetscObject)U,&tj->lag.Ucached.state);CHKERRQ(ierr); 264fe8322adSStefano Zampini ierr = PetscObjectGetId((PetscObject)U,&tj->lag.Ucached.id);CHKERRQ(ierr); 265fe8322adSStefano Zampini tj->lag.Ucached.time = *time; 266fe8322adSStefano Zampini tj->lag.Ucached.step = stepnum; 267fe8322adSStefano Zampini } 268fe8322adSStefano Zampini ierr = PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr); 269fe8322adSStefano Zampini PetscFunctionReturn(0); 270fe8322adSStefano Zampini } 271fe8322adSStefano Zampini 272bc952696SBarry Smith /*@C 273fe2efc57SMark TSTrajectoryViewFromOptions - View from Options 274fe2efc57SMark 275fe2efc57SMark Collective on TSTrajectory 276fe2efc57SMark 277fe2efc57SMark Input Parameters: 278fe2efc57SMark + A - the TSTrajectory context 279736c3998SJose E. Roman . obj - Optional object 280736c3998SJose E. Roman - name - command line option 281fe2efc57SMark 282fe2efc57SMark Level: intermediate 283fe2efc57SMark .seealso: TSTrajectory, TSTrajectoryView, PetscObjectViewFromOptions(), TSTrajectoryCreate() 284fe2efc57SMark @*/ 285fe2efc57SMark PetscErrorCode TSTrajectoryViewFromOptions(TSTrajectory A,PetscObject obj,const char name[]) 286fe2efc57SMark { 287fe2efc57SMark PetscErrorCode ierr; 288fe2efc57SMark 289fe2efc57SMark PetscFunctionBegin; 290fe2efc57SMark PetscValidHeaderSpecific(A,TSTRAJECTORY_CLASSID,1); 291fe2efc57SMark ierr = PetscObjectViewFromOptions((PetscObject)A,obj,name);CHKERRQ(ierr); 292fe2efc57SMark PetscFunctionReturn(0); 293fe2efc57SMark } 294fe2efc57SMark 295fe2efc57SMark /*@C 296bc952696SBarry Smith TSTrajectoryView - Prints information about the trajectory object 297bc952696SBarry Smith 298bc952696SBarry Smith Collective on TSTrajectory 299bc952696SBarry Smith 300bc952696SBarry Smith Input Parameters: 301b1d74d50SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 302bc952696SBarry Smith - viewer - visualization context 303bc952696SBarry Smith 304bc952696SBarry Smith Options Database Key: 305e210cd0eSHong Zhang . -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep() 306bc952696SBarry Smith 307bc952696SBarry Smith Notes: 308bc952696SBarry Smith The available visualization contexts include 309bc952696SBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 310bc952696SBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 311bc952696SBarry Smith output where only the first processor opens 312bc952696SBarry Smith the file. All other processors send their 313bc952696SBarry Smith data to the first processor to print. 314bc952696SBarry Smith 315bc952696SBarry Smith The user can open an alternative visualization context with 316bc952696SBarry Smith PetscViewerASCIIOpen() - output to a specified file. 317bc952696SBarry Smith 318df5474d8SHong Zhang Level: developer 319bc952696SBarry Smith 320bc952696SBarry Smith .seealso: PetscViewerASCIIOpen() 321bc952696SBarry Smith @*/ 322b1d74d50SHong Zhang PetscErrorCode TSTrajectoryView(TSTrajectory tj,PetscViewer viewer) 323bc952696SBarry Smith { 324bc952696SBarry Smith PetscErrorCode ierr; 325bc952696SBarry Smith PetscBool iascii; 326bc952696SBarry Smith 327bc952696SBarry Smith PetscFunctionBegin; 3281a5a771fSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 329bc952696SBarry Smith if (!viewer) { 330b1d74d50SHong Zhang ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr); 331bc952696SBarry Smith } 332bc952696SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 333b1d74d50SHong Zhang PetscCheckSameComm(tj,1,viewer,2); 334bc952696SBarry Smith 335bc952696SBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 336bc952696SBarry Smith if (iascii) { 337b1d74d50SHong Zhang ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr); 3381a5a771fSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," total number of recomputations for adjoint calculation = %D\n",tj->recomps);CHKERRQ(ierr); 33953b27ddbSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint reads = %D\n",tj->diskreads);CHKERRQ(ierr); 34053b27ddbSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint writes = %D\n",tj->diskwrites);CHKERRQ(ierr); 341b1d74d50SHong Zhang if (tj->ops->view) { 342285336bfSHong Zhang ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 343b1d74d50SHong Zhang ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr); 344285336bfSHong Zhang ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 345bc952696SBarry Smith } 346bc952696SBarry Smith } 347bc952696SBarry Smith PetscFunctionReturn(0); 348bc952696SBarry Smith } 349bc952696SBarry Smith 350bc952696SBarry Smith /*@C 35178fbdcc8SBarry Smith TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory 35278fbdcc8SBarry Smith 35378fbdcc8SBarry Smith Collective on TSTrajectory 35478fbdcc8SBarry Smith 35578fbdcc8SBarry Smith Input Parameters: 35678fbdcc8SBarry Smith + tr - the trajectory context 35778fbdcc8SBarry Smith - names - the names of the components, final string must be NULL 35878fbdcc8SBarry Smith 35978fbdcc8SBarry Smith Level: intermediate 36078fbdcc8SBarry Smith 361db901c5bSHong Zhang Note: Fortran interface is not possible because of the string array argument 362db901c5bSHong Zhang 36378fbdcc8SBarry Smith .seealso: TSTrajectory, TSGetTrajectory() 36478fbdcc8SBarry Smith @*/ 36578fbdcc8SBarry Smith PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names) 36678fbdcc8SBarry Smith { 36778fbdcc8SBarry Smith PetscErrorCode ierr; 36878fbdcc8SBarry Smith 36978fbdcc8SBarry Smith PetscFunctionBegin; 370fe8322adSStefano Zampini PetscValidHeaderSpecific(ctx,TSTRAJECTORY_CLASSID,1); 371fe8322adSStefano Zampini PetscValidPointer(names,2); 37278fbdcc8SBarry Smith ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr); 37378fbdcc8SBarry Smith ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr); 37478fbdcc8SBarry Smith PetscFunctionReturn(0); 37578fbdcc8SBarry Smith } 37678fbdcc8SBarry Smith 37778fbdcc8SBarry Smith /*@C 378fe8322adSStefano Zampini TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk 37908347785SBarry Smith 38008347785SBarry Smith Collective on TSLGCtx 38108347785SBarry Smith 38208347785SBarry Smith Input Parameters: 38308347785SBarry Smith + tj - the TSTrajectory context 38408347785SBarry Smith . transform - the transform function 38508347785SBarry Smith . destroy - function to destroy the optional context 38608347785SBarry Smith - ctx - optional context used by transform function 38708347785SBarry Smith 38808347785SBarry Smith Level: intermediate 38908347785SBarry Smith 39008347785SBarry Smith .seealso: TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform() 39108347785SBarry Smith @*/ 39208347785SBarry Smith PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx) 39308347785SBarry Smith { 39408347785SBarry Smith PetscFunctionBegin; 395fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 39608347785SBarry Smith tj->transform = transform; 39708347785SBarry Smith tj->transformdestroy = destroy; 39808347785SBarry Smith tj->transformctx = tctx; 39908347785SBarry Smith PetscFunctionReturn(0); 40008347785SBarry Smith } 40108347785SBarry Smith 402db901c5bSHong Zhang /*@ 403bc952696SBarry Smith TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 404bc952696SBarry Smith 405d083f849SBarry Smith Collective 406bc952696SBarry Smith 407bc952696SBarry Smith Input Parameter: 4083c0fce88SHong Zhang . comm - the communicator 409bc952696SBarry Smith 410bc952696SBarry Smith Output Parameter: 4113c0fce88SHong Zhang . tj - the trajectory object 412bc952696SBarry Smith 413df5474d8SHong Zhang Level: developer 414bc952696SBarry Smith 41595452b02SPatrick Sanan Notes: 41695452b02SPatrick Sanan Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). 417bc952696SBarry Smith 41864fc91eeSBarry Smith .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles() 419bc952696SBarry Smith @*/ 420b1d74d50SHong Zhang PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 421bc952696SBarry Smith { 422bc952696SBarry Smith TSTrajectory t; 423bc952696SBarry Smith PetscErrorCode ierr; 424bc952696SBarry Smith 425bc952696SBarry Smith PetscFunctionBegin; 426b1d74d50SHong Zhang PetscValidPointer(tj,2); 427b1d74d50SHong Zhang *tj = NULL; 428bc952696SBarry Smith ierr = TSInitializePackage();CHKERRQ(ierr); 429bc952696SBarry Smith 43073107ff1SLisandro Dalcin ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr); 43168bece0bSHong Zhang t->setupcalled = PETSC_FALSE; 432fe8322adSStefano Zampini ierr = TSHistoryCreate(comm,&t->tsh);CHKERRQ(ierr); 433fe8322adSStefano Zampini 434fe8322adSStefano Zampini t->lag.order = 1; 435fe8322adSStefano Zampini t->lag.L = NULL; 436fe8322adSStefano Zampini t->lag.T = NULL; 437fe8322adSStefano Zampini t->lag.W = NULL; 438fe8322adSStefano Zampini t->lag.WW = NULL; 439fe8322adSStefano Zampini t->lag.TW = NULL; 440fe8322adSStefano Zampini t->lag.TT = NULL; 441fe8322adSStefano Zampini t->lag.caching = PETSC_TRUE; 442fe8322adSStefano Zampini t->lag.Ucached.id = 0; 443fe8322adSStefano Zampini t->lag.Ucached.state = -1; 444fe8322adSStefano Zampini t->lag.Ucached.time = PETSC_MIN_REAL; 445fe8322adSStefano Zampini t->lag.Ucached.step = PETSC_MAX_INT; 446fe8322adSStefano Zampini t->lag.Udotcached.id = 0; 447fe8322adSStefano Zampini t->lag.Udotcached.state = -1; 448fe8322adSStefano Zampini t->lag.Udotcached.time = PETSC_MIN_REAL; 449fe8322adSStefano Zampini t->lag.Udotcached.step = PETSC_MAX_INT; 450fe8322adSStefano Zampini t->adjoint_solve_mode = PETSC_TRUE; 451fe8322adSStefano Zampini t->solution_only = PETSC_FALSE; 452fe8322adSStefano Zampini t->keepfiles = PETSC_FALSE; 453ac1a7491SHong Zhang t->usehistory = PETSC_TRUE; 454b1d74d50SHong Zhang *tj = t; 4558a10d460SHong Zhang ierr = TSTrajectorySetFiletemplate(t,"TS-%06D.bin");CHKERRQ(ierr); 456bc952696SBarry Smith PetscFunctionReturn(0); 457bc952696SBarry Smith } 458bc952696SBarry Smith 459bc952696SBarry Smith /*@C 460bc952696SBarry Smith TSTrajectorySetType - Sets the storage method to be used as in a trajectory 461bc952696SBarry Smith 462bc952696SBarry Smith Collective on TS 463bc952696SBarry Smith 464bc952696SBarry Smith Input Parameters: 4653c0fce88SHong Zhang + tj - the TSTrajectory context 4663c0fce88SHong Zhang . ts - the TS context 4673c0fce88SHong Zhang - type - a known method 468bc952696SBarry Smith 469bc952696SBarry Smith Options Database Command: 470e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 471bc952696SBarry Smith 472df5474d8SHong Zhang Level: developer 473bc952696SBarry Smith 474881c1a9bSHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy(), TSTrajectoryGetType() 475bc952696SBarry Smith 476bc952696SBarry Smith @*/ 477fd9d3c67SJed Brown PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type) 478bc952696SBarry Smith { 479972caf09SHong Zhang PetscErrorCode (*r)(TSTrajectory,TS); 480bc952696SBarry Smith PetscBool match; 481bc952696SBarry Smith PetscErrorCode ierr; 482bc952696SBarry Smith 483bc952696SBarry Smith PetscFunctionBegin; 484972caf09SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 485972caf09SHong Zhang ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr); 486bc952696SBarry Smith if (match) PetscFunctionReturn(0); 487bc952696SBarry Smith 488bc952696SBarry Smith ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr); 489bc952696SBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 490972caf09SHong Zhang if (tj->ops->destroy) { 491972caf09SHong Zhang ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr); 492bc952696SBarry Smith 493972caf09SHong Zhang tj->ops->destroy = NULL; 494bc952696SBarry Smith } 495972caf09SHong Zhang ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr); 496bc952696SBarry Smith 497972caf09SHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr); 498972caf09SHong Zhang ierr = (*r)(tj,ts);CHKERRQ(ierr); 499bc952696SBarry Smith PetscFunctionReturn(0); 500bc952696SBarry Smith } 501bc952696SBarry Smith 502881c1a9bSHong Zhang /*@C 503881c1a9bSHong Zhang TSTrajectoryGetType - Gets the trajectory type 504881c1a9bSHong Zhang 505881c1a9bSHong Zhang Collective on TS 506881c1a9bSHong Zhang 507881c1a9bSHong Zhang Input Parameters: 508881c1a9bSHong Zhang + tj - the TSTrajectory context 509881c1a9bSHong Zhang - ts - the TS context 510881c1a9bSHong Zhang 511881c1a9bSHong Zhang Output Parameters: 512881c1a9bSHong Zhang . type - a known method 513881c1a9bSHong Zhang 514881c1a9bSHong Zhang Level: developer 515881c1a9bSHong Zhang 516881c1a9bSHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy(), TSTrajectorySetType() 517881c1a9bSHong Zhang 518881c1a9bSHong Zhang @*/ 519881c1a9bSHong Zhang PetscErrorCode TSTrajectoryGetType(TSTrajectory tj,TS ts,TSTrajectoryType *type) 520881c1a9bSHong Zhang { 521881c1a9bSHong Zhang PetscFunctionBegin; 522881c1a9bSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 523881c1a9bSHong Zhang if (type) *type = ((PetscObject)tj)->type_name; 524881c1a9bSHong Zhang PetscFunctionReturn(0); 525881c1a9bSHong Zhang } 526881c1a9bSHong Zhang 527972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 528972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 5299a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 5302b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS); 531bc952696SBarry Smith 532bc952696SBarry Smith /*@C 533bc952696SBarry Smith TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 534bc952696SBarry Smith 535bc952696SBarry Smith Not Collective 536bc952696SBarry Smith 537df5474d8SHong Zhang Level: developer 538bc952696SBarry Smith 5393c0fce88SHong Zhang .seealso: TSTrajectoryRegister() 540bc952696SBarry Smith @*/ 541bc952696SBarry Smith PetscErrorCode TSTrajectoryRegisterAll(void) 542bc952696SBarry Smith { 543bc952696SBarry Smith PetscErrorCode ierr; 544bc952696SBarry Smith 545bc952696SBarry Smith PetscFunctionBegin; 546560360afSLisandro Dalcin if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 547bc952696SBarry Smith TSTrajectoryRegisterAllCalled = PETSC_TRUE; 548bc952696SBarry Smith 549bc952696SBarry Smith ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr); 5501c8c567eSBarry Smith ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr); 5519a53571cSHong Zhang ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr); 5522b043167SHong Zhang ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr); 553bc952696SBarry Smith PetscFunctionReturn(0); 554bc952696SBarry Smith } 555bc952696SBarry Smith 556bc952696SBarry Smith /*@ 5571550c9b9SHong Zhang TSTrajectoryReset - Resets a trajectory context 5581550c9b9SHong Zhang 5591550c9b9SHong Zhang Collective on TSTrajectory 5601550c9b9SHong Zhang 5611550c9b9SHong Zhang Input Parameter: 5621550c9b9SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 5631550c9b9SHong Zhang 5641550c9b9SHong Zhang Level: developer 5651550c9b9SHong Zhang 5661550c9b9SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 5671550c9b9SHong Zhang @*/ 5689a992471SHong Zhang PetscErrorCode TSTrajectoryReset(TSTrajectory tj) 5691550c9b9SHong Zhang { 5701550c9b9SHong Zhang PetscErrorCode ierr; 5711550c9b9SHong Zhang 5721550c9b9SHong Zhang PetscFunctionBegin; 5739a992471SHong Zhang if (!tj) PetscFunctionReturn(0); 5749a992471SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 5759a992471SHong Zhang if (tj->ops->reset) { 5769a992471SHong Zhang ierr = (*tj->ops->reset)(tj);CHKERRQ(ierr); 5779a992471SHong Zhang } 5789a992471SHong Zhang ierr = PetscFree(tj->dirfiletemplate);CHKERRQ(ierr); 579fe8322adSStefano Zampini ierr = TSHistoryDestroy(&tj->tsh);CHKERRQ(ierr); 580fe8322adSStefano Zampini ierr = TSHistoryCreate(PetscObjectComm((PetscObject)tj),&tj->tsh);CHKERRQ(ierr); 581fe8322adSStefano Zampini tj->setupcalled = PETSC_FALSE; 5821550c9b9SHong Zhang PetscFunctionReturn(0); 5831550c9b9SHong Zhang } 5841550c9b9SHong Zhang 5851550c9b9SHong Zhang /*@ 586bc952696SBarry Smith TSTrajectoryDestroy - Destroys a trajectory context 587bc952696SBarry Smith 588bc952696SBarry Smith Collective on TSTrajectory 589bc952696SBarry Smith 590bc952696SBarry Smith Input Parameter: 5913c0fce88SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 592bc952696SBarry Smith 593df5474d8SHong Zhang Level: developer 594bc952696SBarry Smith 5953c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 596bc952696SBarry Smith @*/ 597972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 598bc952696SBarry Smith { 599bc952696SBarry Smith PetscErrorCode ierr; 600bc952696SBarry Smith 601bc952696SBarry Smith PetscFunctionBegin; 602972caf09SHong Zhang if (!*tj) PetscFunctionReturn(0); 603972caf09SHong Zhang PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 604c793f718SLisandro Dalcin if (--((PetscObject)(*tj))->refct > 0) {*tj = NULL; PetscFunctionReturn(0);} 605bc952696SBarry Smith 606fe8322adSStefano Zampini ierr = TSTrajectoryReset(*tj);CHKERRQ(ierr); 607fe8322adSStefano Zampini ierr = TSHistoryDestroy(&(*tj)->tsh);CHKERRQ(ierr); 608fe8322adSStefano Zampini ierr = VecDestroyVecs((*tj)->lag.order+1,&(*tj)->lag.W);CHKERRQ(ierr); 609fe8322adSStefano Zampini ierr = PetscFree5((*tj)->lag.L,(*tj)->lag.T,(*tj)->lag.WW,(*tj)->lag.TT,(*tj)->lag.TW);CHKERRQ(ierr); 610fe8322adSStefano Zampini ierr = VecDestroy(&(*tj)->U);CHKERRQ(ierr); 611fe8322adSStefano Zampini ierr = VecDestroy(&(*tj)->Udot);CHKERRQ(ierr); 6129a992471SHong Zhang 6137f79407eSBarry Smith if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);} 614972caf09SHong Zhang if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 615fe8322adSStefano Zampini if (!((*tj)->keepfiles)) { 616fe8322adSStefano Zampini PetscMPIInt rank; 617fe8322adSStefano Zampini MPI_Comm comm; 618fe8322adSStefano Zampini 619fe8322adSStefano Zampini ierr = PetscObjectGetComm((PetscObject)(*tj),&comm);CHKERRQ(ierr); 620ffc4695bSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr); 6218a10d460SHong Zhang if (!rank && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */ 622fe8322adSStefano Zampini ierr = PetscRMTree((*tj)->dirname);CHKERRQ(ierr); 623fe8322adSStefano Zampini } 624fe8322adSStefano Zampini } 62578fbdcc8SBarry Smith ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr); 62664e38db7SHong Zhang ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr); 62764e38db7SHong Zhang ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr); 628972caf09SHong Zhang ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 629bc952696SBarry Smith PetscFunctionReturn(0); 630bc952696SBarry Smith } 631bc952696SBarry Smith 632bc952696SBarry Smith /* 633772b2523SBarry Smith TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 634bc952696SBarry Smith 635bc952696SBarry Smith Collective on TSTrajectory 636bc952696SBarry Smith 637bc952696SBarry Smith Input Parameter: 6383c0fce88SHong Zhang + tj - the TSTrajectory context 6393c0fce88SHong Zhang - ts - the TS context 6403c0fce88SHong Zhang 6413c0fce88SHong Zhang Options Database Keys: 6423c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 643bc952696SBarry Smith 644df5474d8SHong Zhang Level: developer 645bc952696SBarry Smith 6463c0fce88SHong Zhang .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType() 647bc952696SBarry Smith */ 6482bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 649bc952696SBarry Smith { 650bc952696SBarry Smith PetscBool opt; 651bc952696SBarry Smith const char *defaultType; 652bc952696SBarry Smith char typeName[256]; 653bc952696SBarry Smith PetscErrorCode ierr; 654bc952696SBarry Smith 655bc952696SBarry Smith PetscFunctionBegin; 656b1d74d50SHong Zhang if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 657bc952696SBarry Smith else defaultType = TSTRAJECTORYBASIC; 658bc952696SBarry Smith 659560360afSLisandro Dalcin ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr); 660e210cd0eSHong Zhang ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 661bc952696SBarry Smith if (opt) { 662972caf09SHong Zhang ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr); 663bc952696SBarry Smith } else { 664972caf09SHong Zhang ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr); 665bc952696SBarry Smith } 666bc952696SBarry Smith PetscFunctionReturn(0); 667bc952696SBarry Smith } 668bc952696SBarry Smith 669ed695a29SHong Zhang /*@ 6709ffb3502SHong Zhang TSTrajectorySetUseHistory - Use TSHistory in TSTrajectory 6719ffb3502SHong Zhang 6729ffb3502SHong Zhang Collective on TSTrajectory 6739ffb3502SHong Zhang 6749ffb3502SHong Zhang Input Arguments: 6759ffb3502SHong Zhang + tj - the TSTrajectory context 6769ffb3502SHong Zhang - flg - PETSC_TRUE to save, PETSC_FALSE to disable 6779ffb3502SHong Zhang 6789ffb3502SHong Zhang Options Database Keys: 6799ffb3502SHong Zhang . -ts_trajectory_use_history - have it use TSHistory 6809ffb3502SHong Zhang 6819ffb3502SHong Zhang Level: advanced 6829ffb3502SHong Zhang 6839ffb3502SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp() 6849ffb3502SHong Zhang @*/ 6859ffb3502SHong Zhang PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj,PetscBool flg) 6869ffb3502SHong Zhang { 6879ffb3502SHong Zhang PetscFunctionBegin; 6889ffb3502SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 6899ffb3502SHong Zhang PetscValidLogicalCollectiveBool(tj,flg,2); 6909ffb3502SHong Zhang tj->usehistory = flg; 6919ffb3502SHong Zhang PetscFunctionReturn(0); 6929ffb3502SHong Zhang } 6939ffb3502SHong Zhang 6949ffb3502SHong Zhang /*@ 695ed695a29SHong Zhang TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 696ed695a29SHong Zhang 697ed695a29SHong Zhang Collective on TSTrajectory 698ed695a29SHong Zhang 699ed695a29SHong Zhang Input Arguments: 700ed695a29SHong Zhang + tj - the TSTrajectory context 701ed695a29SHong Zhang - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 702ed695a29SHong Zhang 7033c0fce88SHong Zhang Options Database Keys: 704063c0c7aSHong Zhang . -ts_trajectory_monitor - print TSTrajectory information 7053c0fce88SHong Zhang 706df5474d8SHong Zhang Level: developer 707ed695a29SHong Zhang 7083c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp() 709ed695a29SHong Zhang @*/ 7102bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg) 711ed695a29SHong Zhang { 712ed695a29SHong Zhang PetscFunctionBegin; 713ed695a29SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 714ed695a29SHong Zhang PetscValidLogicalCollectiveBool(tj,flg,2); 715fe8322adSStefano Zampini if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj)); 716fe8322adSStefano Zampini else tj->monitor = NULL; 717ed695a29SHong Zhang PetscFunctionReturn(0); 718ed695a29SHong Zhang } 719ed695a29SHong Zhang 720bc952696SBarry Smith /*@ 72164fc91eeSBarry Smith TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory 72264fc91eeSBarry Smith 72364fc91eeSBarry Smith Collective on TSTrajectory 72464fc91eeSBarry Smith 72564fc91eeSBarry Smith Input Arguments: 72664fc91eeSBarry Smith + tj - the TSTrajectory context 72764fc91eeSBarry Smith - flg - PETSC_TRUE to save, PETSC_FALSE to disable 72864fc91eeSBarry Smith 72964fc91eeSBarry Smith Options Database Keys: 73064fc91eeSBarry Smith . -ts_trajectory_keep_files - have it keep the files 73164fc91eeSBarry Smith 73295452b02SPatrick Sanan Notes: 73395452b02SPatrick 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. 73464fc91eeSBarry Smith 73564fc91eeSBarry Smith Level: advanced 73664fc91eeSBarry Smith 73764fc91eeSBarry Smith .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor() 73864fc91eeSBarry Smith @*/ 73964fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg) 74064fc91eeSBarry Smith { 74164fc91eeSBarry Smith PetscFunctionBegin; 74264fc91eeSBarry Smith PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 74364fc91eeSBarry Smith PetscValidLogicalCollectiveBool(tj,flg,2); 74464fc91eeSBarry Smith tj->keepfiles = flg; 74564fc91eeSBarry Smith PetscFunctionReturn(0); 74664fc91eeSBarry Smith } 74764fc91eeSBarry Smith 748db901c5bSHong Zhang /*@C 74964e38db7SHong Zhang TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored. 75064e38db7SHong Zhang 75164e38db7SHong Zhang Collective on TSTrajectory 75264e38db7SHong Zhang 75364e38db7SHong Zhang Input Arguments: 75464e38db7SHong Zhang + tj - the TSTrajectory context 75564e38db7SHong Zhang - dirname - the directory name 75664e38db7SHong Zhang 75764e38db7SHong Zhang Options Database Keys: 75864e38db7SHong Zhang . -ts_trajectory_dirname - set the directory name 75964e38db7SHong Zhang 76095452b02SPatrick Sanan Notes: 76195452b02SPatrick Sanan The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate() 7621585b412SBarry Smith 76364e38db7SHong Zhang Level: developer 76464e38db7SHong Zhang 76564e38db7SHong Zhang .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp() 76664e38db7SHong Zhang @*/ 76764e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[]) 76864e38db7SHong Zhang { 76964e38db7SHong Zhang PetscErrorCode ierr; 770a17281aeSStefano Zampini PetscBool flg; 771a17281aeSStefano Zampini 77264e38db7SHong Zhang PetscFunctionBegin; 77364e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 774a17281aeSStefano Zampini ierr = PetscStrcmp(tj->dirname,dirname,&flg);CHKERRQ(ierr); 775a17281aeSStefano Zampini if (!flg && tj->dirfiletemplate) { 776a17281aeSStefano Zampini SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after TSTrajectory has been setup"); 777a17281aeSStefano Zampini } 77884a45834SBarry Smith ierr = PetscFree(tj->dirname);CHKERRQ(ierr); 77964e38db7SHong Zhang ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr); 78064e38db7SHong Zhang PetscFunctionReturn(0); 78164e38db7SHong Zhang } 78264e38db7SHong Zhang 783db901c5bSHong Zhang /*@C 78464e38db7SHong Zhang TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints. 78564e38db7SHong Zhang 78664e38db7SHong Zhang Collective on TSTrajectory 78764e38db7SHong Zhang 78864e38db7SHong Zhang Input Arguments: 78964e38db7SHong Zhang + tj - the TSTrajectory context 7901585b412SBarry Smith - filetemplate - the template 79164e38db7SHong Zhang 79264e38db7SHong Zhang Options Database Keys: 7931585b412SBarry Smith . -ts_trajectory_file_template - set the file name template 7941585b412SBarry Smith 79595452b02SPatrick Sanan Notes: 79695452b02SPatrick Sanan The name template should be of the form, for example filename-%06D.bin It should not begin with a leading / 7971585b412SBarry Smith 7981585b412SBarry Smith The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the 7991585b412SBarry Smith timestep counter 80064e38db7SHong Zhang 80164e38db7SHong Zhang Level: developer 80264e38db7SHong Zhang 8031585b412SBarry Smith .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp() 80464e38db7SHong Zhang @*/ 80564e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[]) 80664e38db7SHong Zhang { 80764e38db7SHong Zhang PetscErrorCode ierr; 8089afe7f3eSBarry Smith const char *ptr,*ptr2; 8099afe7f3eSBarry Smith 81064e38db7SHong Zhang PetscFunctionBegin; 81164e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 8129afe7f3eSBarry Smith if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup"); 8139afe7f3eSBarry Smith 8149afe7f3eSBarry 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"); 8159afe7f3eSBarry Smith /* Do some cursory validation of the input. */ 8169afe7f3eSBarry Smith ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr); 8179afe7f3eSBarry Smith if (!ptr) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin"); 8189afe7f3eSBarry Smith for (ptr++; ptr && *ptr; ptr++) { 8199afe7f3eSBarry Smith ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr); 8209afe7f3eSBarry 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"); 8219afe7f3eSBarry Smith if (ptr2) break; 8229afe7f3eSBarry Smith } 82384a45834SBarry Smith ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr); 82464e38db7SHong Zhang ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr); 82564e38db7SHong Zhang PetscFunctionReturn(0); 82664e38db7SHong Zhang } 82764e38db7SHong Zhang 82864e38db7SHong Zhang /*@ 829bc952696SBarry Smith TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 830bc952696SBarry Smith 831bc952696SBarry Smith Collective on TSTrajectory 832bc952696SBarry Smith 833*d8d19677SJose E. Roman Input Parameters: 8343c0fce88SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 8353c0fce88SHong Zhang - ts - the TS context 836bc952696SBarry Smith 837bc952696SBarry Smith Options Database Keys: 8383c0fce88SHong Zhang + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 83964fc91eeSBarry 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 840063c0c7aSHong Zhang - -ts_trajectory_monitor - print TSTrajectory information 841bc952696SBarry Smith 842df5474d8SHong Zhang Level: developer 843bc952696SBarry Smith 84495452b02SPatrick Sanan Notes: 84595452b02SPatrick Sanan This is not normally called directly by users 846bc952696SBarry Smith 8473c0fce88SHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp() 848bc952696SBarry Smith @*/ 849972caf09SHong Zhang PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 850bc952696SBarry Smith { 851ed695a29SHong Zhang PetscBool set,flg; 85264e38db7SHong Zhang char dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN]; 85364e38db7SHong Zhang PetscErrorCode ierr; 854bc952696SBarry Smith 855bc952696SBarry Smith PetscFunctionBegin; 856b1d74d50SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 857fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 858b1d74d50SHong Zhang ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 859972caf09SHong Zhang ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 860ac1a7491SHong Zhang ierr = PetscOptionsBool("-ts_trajectory_use_history","Turn on/off usage of TSHistory",NULL,tj->usehistory,&tj->usehistory,NULL);CHKERRQ(ierr); 861ed695a29SHong Zhang ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 862aced365eSHong Zhang if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);} 863fe8322adSStefano Zampini ierr = PetscOptionsInt("-ts_trajectory_reconstruction_order","Interpolation order for reconstruction",NULL,tj->lag.order,&tj->lag.order,NULL);CHKERRQ(ierr); 864fe8322adSStefano Zampini ierr = PetscOptionsBool("-ts_trajectory_reconstruction_caching","Turn on/off caching of TSTrajectoryGetVecs input",NULL,tj->lag.caching,&tj->lag.caching,NULL);CHKERRQ(ierr); 865fe8322adSStefano 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); 866fe8322adSStefano Zampini ierr = PetscOptionsBool("-ts_trajectory_solution_only","Checkpoint solution only","TSTrajectorySetSolutionOnly",tj->solution_only,&tj->solution_only,NULL);CHKERRQ(ierr); 86764fc91eeSBarry Smith ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr); 86864fc91eeSBarry Smith if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);} 86964e38db7SHong Zhang 870589a23caSBarry Smith ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",NULL,dirname,sizeof(dirname)-14,&set);CHKERRQ(ierr); 87184a45834SBarry Smith if (set) { 87264e38db7SHong Zhang ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr); 87384a45834SBarry Smith } 87464e38db7SHong Zhang 875589a23caSBarry Smith ierr = PetscOptionsString("-ts_trajectory_file_template","Template for TSTrajectory file name, use filename-%06D.bin","TSTrajectorySetFiletemplate",NULL,filetemplate,sizeof(filetemplate),&set);CHKERRQ(ierr); 87664e38db7SHong Zhang if (set) { 8771585b412SBarry Smith ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr); 87884a45834SBarry Smith } 87964e38db7SHong Zhang 88064e38db7SHong Zhang /* Handle specific TSTrajectory options */ 88162b521acSHong Zhang if (tj->ops->setfromoptions) { 88262b521acSHong Zhang ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr); 88362b521acSHong Zhang } 884bc952696SBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 885bc952696SBarry Smith PetscFunctionReturn(0); 886bc952696SBarry Smith } 88768bece0bSHong Zhang 88868bece0bSHong Zhang /*@ 88968bece0bSHong Zhang TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 89068bece0bSHong Zhang of a TS trajectory. 89168bece0bSHong Zhang 89268bece0bSHong Zhang Collective on TS 89368bece0bSHong Zhang 894*d8d19677SJose E. Roman Input Parameters: 8953c0fce88SHong Zhang + ts - the TS context obtained from TSCreate() 8963c0fce88SHong Zhang - tj - the TS trajectory context 89768bece0bSHong Zhang 898df5474d8SHong Zhang Level: developer 89968bece0bSHong Zhang 90068bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 90168bece0bSHong Zhang @*/ 90268bece0bSHong Zhang PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 90368bece0bSHong Zhang { 90468bece0bSHong Zhang PetscErrorCode ierr; 9059afe7f3eSBarry Smith size_t s1,s2; 90668bece0bSHong Zhang 90768bece0bSHong Zhang PetscFunctionBegin; 90868bece0bSHong Zhang if (!tj) PetscFunctionReturn(0); 90968bece0bSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 910fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 91168bece0bSHong Zhang if (tj->setupcalled) PetscFunctionReturn(0); 91268bece0bSHong Zhang 9132bf6d308SHong Zhang ierr = PetscLogEventBegin(TSTrajectory_SetUp,tj,ts,0,0);CHKERRQ(ierr); 91468bece0bSHong Zhang if (!((PetscObject)tj)->type_name) { 91568bece0bSHong Zhang ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr); 91668bece0bSHong Zhang } 91768bece0bSHong Zhang if (tj->ops->setup) { 91868bece0bSHong Zhang ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr); 91968bece0bSHong Zhang } 92068bece0bSHong Zhang 92168bece0bSHong Zhang tj->setupcalled = PETSC_TRUE; 92253b27ddbSHong Zhang 92353b27ddbSHong Zhang /* Set the counters to zero */ 9241a5a771fSHong Zhang tj->recomps = 0; 92553b27ddbSHong Zhang tj->diskreads = 0; 92653b27ddbSHong Zhang tj->diskwrites = 0; 9279afe7f3eSBarry Smith ierr = PetscStrlen(tj->dirname,&s1);CHKERRQ(ierr); 9289afe7f3eSBarry Smith ierr = PetscStrlen(tj->filetemplate,&s2);CHKERRQ(ierr); 929fe8322adSStefano Zampini ierr = PetscFree(tj->dirfiletemplate);CHKERRQ(ierr); 93011e1d5c3SBarry Smith ierr = PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate);CHKERRQ(ierr); 93111e1d5c3SBarry Smith ierr = PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate);CHKERRQ(ierr); 9322bf6d308SHong Zhang ierr = PetscLogEventEnd(TSTrajectory_SetUp,tj,ts,0,0);CHKERRQ(ierr); 93368bece0bSHong Zhang PetscFunctionReturn(0); 93468bece0bSHong Zhang } 935fe8322adSStefano Zampini 936fe8322adSStefano Zampini /*@ 937fe8322adSStefano Zampini TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage also. 938fe8322adSStefano Zampini 939fe8322adSStefano Zampini Collective on TSTrajectory 940fe8322adSStefano Zampini 941*d8d19677SJose E. Roman Input Parameters: 942fe8322adSStefano Zampini + tj - the TS trajectory context 943fe8322adSStefano Zampini - flg - the boolean flag 944fe8322adSStefano Zampini 945fe8322adSStefano Zampini Level: developer 946fe8322adSStefano Zampini 947fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryGetSolutionOnly() 948fe8322adSStefano Zampini @*/ 949fe8322adSStefano Zampini PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj,PetscBool solution_only) 950fe8322adSStefano Zampini { 951fe8322adSStefano Zampini PetscFunctionBegin; 952fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 953fe8322adSStefano Zampini PetscValidLogicalCollectiveBool(tj,solution_only,2); 954fe8322adSStefano Zampini tj->solution_only = solution_only; 955fe8322adSStefano Zampini PetscFunctionReturn(0); 956fe8322adSStefano Zampini } 957fe8322adSStefano Zampini 958fe8322adSStefano Zampini /*@ 959fe8322adSStefano Zampini TSTrajectoryGetSolutionOnly - Gets the value set with TSTrajectorySetSolutionOnly. 960fe8322adSStefano Zampini 961fe8322adSStefano Zampini Logically collective on TSTrajectory 962fe8322adSStefano Zampini 963fe8322adSStefano Zampini Input Parameter: 964fe8322adSStefano Zampini . tj - the TS trajectory context 965fe8322adSStefano Zampini 966fe8322adSStefano Zampini Output Parameter: 967*d8d19677SJose E. Roman . flg - the boolean flag 968fe8322adSStefano Zampini 969fe8322adSStefano Zampini Level: developer 970fe8322adSStefano Zampini 971fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetSolutionOnly() 972fe8322adSStefano Zampini @*/ 973fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj,PetscBool *solution_only) 974fe8322adSStefano Zampini { 975fe8322adSStefano Zampini PetscFunctionBegin; 976fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 977fe8322adSStefano Zampini PetscValidPointer(solution_only,2); 978fe8322adSStefano Zampini *solution_only = tj->solution_only; 979fe8322adSStefano Zampini PetscFunctionReturn(0); 980fe8322adSStefano Zampini } 981fe8322adSStefano Zampini 982fe8322adSStefano Zampini /*@ 983fe8322adSStefano Zampini TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors. 984fe8322adSStefano Zampini 985fe8322adSStefano Zampini Collective on TSTrajectory 986fe8322adSStefano Zampini 987*d8d19677SJose E. Roman Input Parameters: 988fe8322adSStefano Zampini + tj - the TS trajectory context 989fe8322adSStefano Zampini . ts - the TS solver context 990fe8322adSStefano Zampini - time - the requested time 991fe8322adSStefano Zampini 992*d8d19677SJose E. Roman Output Parameters: 993fe8322adSStefano Zampini + U - state vector at given time (can be interpolated) 994fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 995fe8322adSStefano Zampini 996fe8322adSStefano Zampini Level: developer 997fe8322adSStefano Zampini 998fe8322adSStefano 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. 999fe8322adSStefano Zampini This function differs from TSTrajectoryGetVecs since the vectors obtained cannot be modified, and they need to be returned by 1000fe8322adSStefano Zampini calling TSTrajectoryRestoreUpdatedHistoryVecs(). 1001fe8322adSStefano Zampini 1002fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryRestoreUpdatedHistoryVecs(), TSTrajectoryGetVecs() 1003fe8322adSStefano Zampini @*/ 1004fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot) 1005fe8322adSStefano Zampini { 1006fe8322adSStefano Zampini PetscErrorCode ierr; 1007fe8322adSStefano Zampini 1008fe8322adSStefano Zampini PetscFunctionBegin; 1009fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 1010fe8322adSStefano Zampini PetscValidHeaderSpecific(ts,TS_CLASSID,2); 1011fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj,time,3); 1012fe8322adSStefano Zampini if (U) PetscValidPointer(U,4); 1013fe8322adSStefano Zampini if (Udot) PetscValidPointer(Udot,5); 1014fe8322adSStefano Zampini if (U && !tj->U) { 1015fe8322adSStefano Zampini DM dm; 1016fe8322adSStefano Zampini 1017fe8322adSStefano Zampini ierr = TSGetDM(ts,&dm);CHKERRQ(ierr); 1018fe8322adSStefano Zampini ierr = DMCreateGlobalVector(dm,&tj->U);CHKERRQ(ierr); 1019fe8322adSStefano Zampini } 1020fe8322adSStefano Zampini if (Udot && !tj->Udot) { 1021fe8322adSStefano Zampini DM dm; 1022fe8322adSStefano Zampini 1023fe8322adSStefano Zampini ierr = TSGetDM(ts,&dm);CHKERRQ(ierr); 1024fe8322adSStefano Zampini ierr = DMCreateGlobalVector(dm,&tj->Udot);CHKERRQ(ierr); 1025fe8322adSStefano Zampini } 1026fe8322adSStefano Zampini ierr = TSTrajectoryGetVecs(tj,ts,PETSC_DECIDE,&time,U ? tj->U : NULL,Udot ? tj->Udot : NULL);CHKERRQ(ierr); 1027fe8322adSStefano Zampini if (U) { 10288860a134SJunchao Zhang ierr = VecLockReadPush(tj->U);CHKERRQ(ierr); 1029fe8322adSStefano Zampini *U = tj->U; 1030fe8322adSStefano Zampini } 1031fe8322adSStefano Zampini if (Udot) { 10328860a134SJunchao Zhang ierr = VecLockReadPush(tj->Udot);CHKERRQ(ierr); 1033fe8322adSStefano Zampini *Udot = tj->Udot; 1034fe8322adSStefano Zampini } 1035fe8322adSStefano Zampini PetscFunctionReturn(0); 1036fe8322adSStefano Zampini } 1037fe8322adSStefano Zampini 1038fe8322adSStefano Zampini /*@ 1039fe8322adSStefano Zampini TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with TSTrajectoryGetUpdatedHistoryVecs(). 1040fe8322adSStefano Zampini 1041fe8322adSStefano Zampini Collective on TSTrajectory 1042fe8322adSStefano Zampini 1043*d8d19677SJose E. Roman Input Parameters: 1044fe8322adSStefano Zampini + tj - the TS trajectory context 1045fe8322adSStefano Zampini . U - state vector at given time (can be interpolated) 1046fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 1047fe8322adSStefano Zampini 1048fe8322adSStefano Zampini Level: developer 1049fe8322adSStefano Zampini 1050fe8322adSStefano Zampini .seealso: TSTrajectoryGetUpdatedHistoryVecs() 1051fe8322adSStefano Zampini @*/ 1052fe8322adSStefano Zampini PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot) 1053fe8322adSStefano Zampini { 1054fe8322adSStefano Zampini PetscErrorCode ierr; 1055fe8322adSStefano Zampini 1056fe8322adSStefano Zampini PetscFunctionBegin; 1057fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 1058fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(*U,VEC_CLASSID,2); 1059fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(*Udot,VEC_CLASSID,3); 1060fe8322adSStefano Zampini if (U && *U != tj->U) SETERRQ(PetscObjectComm((PetscObject)*U),PETSC_ERR_USER,"U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 1061fe8322adSStefano Zampini if (Udot && *Udot != tj->Udot) SETERRQ(PetscObjectComm((PetscObject)*Udot),PETSC_ERR_USER,"Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 1062fe8322adSStefano Zampini if (U) { 10638860a134SJunchao Zhang ierr = VecLockReadPop(tj->U);CHKERRQ(ierr); 1064fe8322adSStefano Zampini *U = NULL; 1065fe8322adSStefano Zampini } 1066fe8322adSStefano Zampini if (Udot) { 10678860a134SJunchao Zhang ierr = VecLockReadPop(tj->Udot);CHKERRQ(ierr); 1068fe8322adSStefano Zampini *Udot = NULL; 1069fe8322adSStefano Zampini } 1070fe8322adSStefano Zampini PetscFunctionReturn(0); 1071fe8322adSStefano Zampini } 1072