1d0c080abSJoseph Pusztay #include <petsc/private/tsimpl.h> /*I "petscts.h" I*/ 2d0c080abSJoseph Pusztay #include <petscdm.h> 3*07eaae0cSMatthew G. Knepley #include <petscds.h> 4ab43fcacSJoe Pusztay #include <petscdmswarm.h> 5d0c080abSJoseph Pusztay #include <petscdraw.h> 6d0c080abSJoseph Pusztay 7d0c080abSJoseph Pusztay /*@C 8d0c080abSJoseph Pusztay TSMonitor - Runs all user-provided monitor routines set using TSMonitorSet() 9d0c080abSJoseph Pusztay 10d0c080abSJoseph Pusztay Collective on TS 11d0c080abSJoseph Pusztay 12d0c080abSJoseph Pusztay Input Parameters: 13d0c080abSJoseph Pusztay + ts - time stepping context obtained from TSCreate() 14d0c080abSJoseph Pusztay . step - step number that has just completed 15d0c080abSJoseph Pusztay . ptime - model time of the state 16d0c080abSJoseph Pusztay - u - state at the current model time 17d0c080abSJoseph Pusztay 18d0c080abSJoseph Pusztay Notes: 19d0c080abSJoseph Pusztay TSMonitor() is typically used automatically within the time stepping implementations. 20d0c080abSJoseph Pusztay Users would almost never call this routine directly. 21d0c080abSJoseph Pusztay 22d0c080abSJoseph Pusztay A step of -1 indicates that the monitor is being called on a solution obtained by interpolating from computed solutions 23d0c080abSJoseph Pusztay 24d0c080abSJoseph Pusztay Level: developer 25d0c080abSJoseph Pusztay 26d0c080abSJoseph Pusztay @*/ 27d0c080abSJoseph Pusztay PetscErrorCode TSMonitor(TS ts,PetscInt step,PetscReal ptime,Vec u) 28d0c080abSJoseph Pusztay { 29d0c080abSJoseph Pusztay DM dm; 30d0c080abSJoseph Pusztay PetscInt i,n = ts->numbermonitors; 31d0c080abSJoseph Pusztay PetscErrorCode ierr; 32d0c080abSJoseph Pusztay 33d0c080abSJoseph Pusztay PetscFunctionBegin; 34d0c080abSJoseph Pusztay PetscValidHeaderSpecific(ts,TS_CLASSID,1); 35d0c080abSJoseph Pusztay PetscValidHeaderSpecific(u,VEC_CLASSID,4); 36d0c080abSJoseph Pusztay 37d0c080abSJoseph Pusztay ierr = TSGetDM(ts,&dm);CHKERRQ(ierr); 38d0c080abSJoseph Pusztay ierr = DMSetOutputSequenceNumber(dm,step,ptime);CHKERRQ(ierr); 39d0c080abSJoseph Pusztay 40d0c080abSJoseph Pusztay ierr = VecLockReadPush(u);CHKERRQ(ierr); 41d0c080abSJoseph Pusztay for (i=0; i<n; i++) { 42d0c080abSJoseph Pusztay ierr = (*ts->monitor[i])(ts,step,ptime,u,ts->monitorcontext[i]);CHKERRQ(ierr); 43d0c080abSJoseph Pusztay } 44d0c080abSJoseph Pusztay ierr = VecLockReadPop(u);CHKERRQ(ierr); 45d0c080abSJoseph Pusztay PetscFunctionReturn(0); 46d0c080abSJoseph Pusztay } 47d0c080abSJoseph Pusztay 48d0c080abSJoseph Pusztay /*@C 49d0c080abSJoseph Pusztay TSMonitorSetFromOptions - Sets a monitor function and viewer appropriate for the type indicated by the user 50d0c080abSJoseph Pusztay 51d0c080abSJoseph Pusztay Collective on TS 52d0c080abSJoseph Pusztay 53d0c080abSJoseph Pusztay Input Parameters: 54d0c080abSJoseph Pusztay + ts - TS object you wish to monitor 55d0c080abSJoseph Pusztay . name - the monitor type one is seeking 56d0c080abSJoseph Pusztay . help - message indicating what monitoring is done 57d0c080abSJoseph Pusztay . manual - manual page for the monitor 58d0c080abSJoseph Pusztay . monitor - the monitor function 59d0c080abSJoseph Pusztay - monitorsetup - a function that is called once ONLY if the user selected this monitor that may set additional features of the TS or PetscViewer objects 60d0c080abSJoseph Pusztay 61d0c080abSJoseph Pusztay Level: developer 62d0c080abSJoseph Pusztay 63d0c080abSJoseph Pusztay .seealso: PetscOptionsGetViewer(), PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 64d0c080abSJoseph Pusztay PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 65d0c080abSJoseph Pusztay PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 66d0c080abSJoseph Pusztay PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 67d0c080abSJoseph Pusztay PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 68d0c080abSJoseph Pusztay PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 69d0c080abSJoseph Pusztay PetscOptionsFList(), PetscOptionsEList() 70d0c080abSJoseph Pusztay @*/ 71d0c080abSJoseph Pusztay PetscErrorCode TSMonitorSetFromOptions(TS ts,const char name[],const char help[], const char manual[],PetscErrorCode (*monitor)(TS,PetscInt,PetscReal,Vec,PetscViewerAndFormat*),PetscErrorCode (*monitorsetup)(TS,PetscViewerAndFormat*)) 72d0c080abSJoseph Pusztay { 73d0c080abSJoseph Pusztay PetscErrorCode ierr; 74d0c080abSJoseph Pusztay PetscViewer viewer; 75d0c080abSJoseph Pusztay PetscViewerFormat format; 76d0c080abSJoseph Pusztay PetscBool flg; 77d0c080abSJoseph Pusztay 78d0c080abSJoseph Pusztay PetscFunctionBegin; 79d0c080abSJoseph Pusztay ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject)ts),((PetscObject) ts)->options,((PetscObject)ts)->prefix,name,&viewer,&format,&flg);CHKERRQ(ierr); 80d0c080abSJoseph Pusztay if (flg) { 81d0c080abSJoseph Pusztay PetscViewerAndFormat *vf; 82d0c080abSJoseph Pusztay ierr = PetscViewerAndFormatCreate(viewer,format,&vf);CHKERRQ(ierr); 83d0c080abSJoseph Pusztay ierr = PetscObjectDereference((PetscObject)viewer);CHKERRQ(ierr); 84d0c080abSJoseph Pusztay if (monitorsetup) { 85d0c080abSJoseph Pusztay ierr = (*monitorsetup)(ts,vf);CHKERRQ(ierr); 86d0c080abSJoseph Pusztay } 87d0c080abSJoseph Pusztay ierr = TSMonitorSet(ts,(PetscErrorCode (*)(TS,PetscInt,PetscReal,Vec,void*))monitor,vf,(PetscErrorCode (*)(void**))PetscViewerAndFormatDestroy);CHKERRQ(ierr); 88d0c080abSJoseph Pusztay } 89d0c080abSJoseph Pusztay PetscFunctionReturn(0); 90d0c080abSJoseph Pusztay } 91d0c080abSJoseph Pusztay 92d0c080abSJoseph Pusztay /*@C 93d0c080abSJoseph Pusztay TSMonitorSet - Sets an ADDITIONAL function that is to be used at every 94d0c080abSJoseph Pusztay timestep to display the iteration's progress. 95d0c080abSJoseph Pusztay 96d0c080abSJoseph Pusztay Logically Collective on TS 97d0c080abSJoseph Pusztay 98d0c080abSJoseph Pusztay Input Parameters: 99d0c080abSJoseph Pusztay + ts - the TS context obtained from TSCreate() 100d0c080abSJoseph Pusztay . monitor - monitoring routine 101d0c080abSJoseph Pusztay . mctx - [optional] user-defined context for private data for the 102d0c080abSJoseph Pusztay monitor routine (use NULL if no context is desired) 103d0c080abSJoseph Pusztay - monitordestroy - [optional] routine that frees monitor context 104d0c080abSJoseph Pusztay (may be NULL) 105d0c080abSJoseph Pusztay 106d0c080abSJoseph Pusztay Calling sequence of monitor: 107d0c080abSJoseph Pusztay $ PetscErrorCode monitor(TS ts,PetscInt steps,PetscReal time,Vec u,void *mctx) 108d0c080abSJoseph Pusztay 109d0c080abSJoseph Pusztay + ts - the TS context 110d0c080abSJoseph Pusztay . steps - iteration number (after the final time step the monitor routine may be called with a step of -1, this indicates the solution has been interpolated to this time) 111d0c080abSJoseph Pusztay . time - current time 112d0c080abSJoseph Pusztay . u - current iterate 113d0c080abSJoseph Pusztay - mctx - [optional] monitoring context 114d0c080abSJoseph Pusztay 115d0c080abSJoseph Pusztay Notes: 116d0c080abSJoseph Pusztay This routine adds an additional monitor to the list of monitors that 117d0c080abSJoseph Pusztay already has been loaded. 118d0c080abSJoseph Pusztay 119d0c080abSJoseph Pusztay Fortran Notes: 120d0c080abSJoseph Pusztay Only a single monitor function can be set for each TS object 121d0c080abSJoseph Pusztay 122d0c080abSJoseph Pusztay Level: intermediate 123d0c080abSJoseph Pusztay 124d0c080abSJoseph Pusztay .seealso: TSMonitorDefault(), TSMonitorCancel() 125d0c080abSJoseph Pusztay @*/ 126d0c080abSJoseph Pusztay PetscErrorCode TSMonitorSet(TS ts,PetscErrorCode (*monitor)(TS,PetscInt,PetscReal,Vec,void*),void *mctx,PetscErrorCode (*mdestroy)(void**)) 127d0c080abSJoseph Pusztay { 128d0c080abSJoseph Pusztay PetscErrorCode ierr; 129d0c080abSJoseph Pusztay PetscInt i; 130d0c080abSJoseph Pusztay PetscBool identical; 131d0c080abSJoseph Pusztay 132d0c080abSJoseph Pusztay PetscFunctionBegin; 133d0c080abSJoseph Pusztay PetscValidHeaderSpecific(ts,TS_CLASSID,1); 134d0c080abSJoseph Pusztay for (i=0; i<ts->numbermonitors;i++) { 135d0c080abSJoseph Pusztay ierr = PetscMonitorCompare((PetscErrorCode (*)(void))monitor,mctx,mdestroy,(PetscErrorCode (*)(void))ts->monitor[i],ts->monitorcontext[i],ts->monitordestroy[i],&identical);CHKERRQ(ierr); 136d0c080abSJoseph Pusztay if (identical) PetscFunctionReturn(0); 137d0c080abSJoseph Pusztay } 138d0c080abSJoseph Pusztay if (ts->numbermonitors >= MAXTSMONITORS) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Too many monitors set"); 139d0c080abSJoseph Pusztay ts->monitor[ts->numbermonitors] = monitor; 140d0c080abSJoseph Pusztay ts->monitordestroy[ts->numbermonitors] = mdestroy; 141d0c080abSJoseph Pusztay ts->monitorcontext[ts->numbermonitors++] = (void*)mctx; 142d0c080abSJoseph Pusztay PetscFunctionReturn(0); 143d0c080abSJoseph Pusztay } 144d0c080abSJoseph Pusztay 145d0c080abSJoseph Pusztay /*@C 146d0c080abSJoseph Pusztay TSMonitorCancel - Clears all the monitors that have been set on a time-step object. 147d0c080abSJoseph Pusztay 148d0c080abSJoseph Pusztay Logically Collective on TS 149d0c080abSJoseph Pusztay 150d0c080abSJoseph Pusztay Input Parameters: 151d0c080abSJoseph Pusztay . ts - the TS context obtained from TSCreate() 152d0c080abSJoseph Pusztay 153d0c080abSJoseph Pusztay Notes: 154d0c080abSJoseph Pusztay There is no way to remove a single, specific monitor. 155d0c080abSJoseph Pusztay 156d0c080abSJoseph Pusztay Level: intermediate 157d0c080abSJoseph Pusztay 158d0c080abSJoseph Pusztay .seealso: TSMonitorDefault(), TSMonitorSet() 159d0c080abSJoseph Pusztay @*/ 160d0c080abSJoseph Pusztay PetscErrorCode TSMonitorCancel(TS ts) 161d0c080abSJoseph Pusztay { 162d0c080abSJoseph Pusztay PetscErrorCode ierr; 163d0c080abSJoseph Pusztay PetscInt i; 164d0c080abSJoseph Pusztay 165d0c080abSJoseph Pusztay PetscFunctionBegin; 166d0c080abSJoseph Pusztay PetscValidHeaderSpecific(ts,TS_CLASSID,1); 167d0c080abSJoseph Pusztay for (i=0; i<ts->numbermonitors; i++) { 168d0c080abSJoseph Pusztay if (ts->monitordestroy[i]) { 169d0c080abSJoseph Pusztay ierr = (*ts->monitordestroy[i])(&ts->monitorcontext[i]);CHKERRQ(ierr); 170d0c080abSJoseph Pusztay } 171d0c080abSJoseph Pusztay } 172d0c080abSJoseph Pusztay ts->numbermonitors = 0; 173d0c080abSJoseph Pusztay PetscFunctionReturn(0); 174d0c080abSJoseph Pusztay } 175d0c080abSJoseph Pusztay 176d0c080abSJoseph Pusztay /*@C 177d0c080abSJoseph Pusztay TSMonitorDefault - The Default monitor, prints the timestep and time for each step 178d0c080abSJoseph Pusztay 179d0c080abSJoseph Pusztay Level: intermediate 180d0c080abSJoseph Pusztay 181d0c080abSJoseph Pusztay .seealso: TSMonitorSet() 182d0c080abSJoseph Pusztay @*/ 183d0c080abSJoseph Pusztay PetscErrorCode TSMonitorDefault(TS ts,PetscInt step,PetscReal ptime,Vec v,PetscViewerAndFormat *vf) 184d0c080abSJoseph Pusztay { 185d0c080abSJoseph Pusztay PetscErrorCode ierr; 186d0c080abSJoseph Pusztay PetscViewer viewer = vf->viewer; 187d0c080abSJoseph Pusztay PetscBool iascii,ibinary; 188d0c080abSJoseph Pusztay 189d0c080abSJoseph Pusztay PetscFunctionBegin; 190064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,5); 191d0c080abSJoseph Pusztay ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 192d0c080abSJoseph Pusztay ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&ibinary);CHKERRQ(ierr); 193d0c080abSJoseph Pusztay ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr); 194d0c080abSJoseph Pusztay if (iascii) { 195d0c080abSJoseph Pusztay ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)ts)->tablevel);CHKERRQ(ierr); 196d0c080abSJoseph Pusztay if (step == -1) { /* this indicates it is an interpolated solution */ 197d0c080abSJoseph Pusztay ierr = PetscViewerASCIIPrintf(viewer,"Interpolated solution at time %g between steps %D and %D\n",(double)ptime,ts->steps-1,ts->steps);CHKERRQ(ierr); 198d0c080abSJoseph Pusztay } else { 199d0c080abSJoseph Pusztay ierr = PetscViewerASCIIPrintf(viewer,"%D TS dt %g time %g%s",step,(double)ts->time_step,(double)ptime,ts->steprollback ? " (r)\n" : "\n");CHKERRQ(ierr); 200d0c080abSJoseph Pusztay } 201d0c080abSJoseph Pusztay ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)ts)->tablevel);CHKERRQ(ierr); 202d0c080abSJoseph Pusztay } else if (ibinary) { 203d0c080abSJoseph Pusztay PetscMPIInt rank; 204d0c080abSJoseph Pusztay ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRMPI(ierr); 205d0c080abSJoseph Pusztay if (!rank) { 206d0c080abSJoseph Pusztay PetscBool skipHeader; 207d0c080abSJoseph Pusztay PetscInt classid = REAL_FILE_CLASSID; 208d0c080abSJoseph Pusztay 209d0c080abSJoseph Pusztay ierr = PetscViewerBinaryGetSkipHeader(viewer,&skipHeader);CHKERRQ(ierr); 210d0c080abSJoseph Pusztay if (!skipHeader) { 211d0c080abSJoseph Pusztay ierr = PetscViewerBinaryWrite(viewer,&classid,1,PETSC_INT);CHKERRQ(ierr); 212d0c080abSJoseph Pusztay } 213d0c080abSJoseph Pusztay ierr = PetscRealView(1,&ptime,viewer);CHKERRQ(ierr); 214d0c080abSJoseph Pusztay } else { 215d0c080abSJoseph Pusztay ierr = PetscRealView(0,&ptime,viewer);CHKERRQ(ierr); 216d0c080abSJoseph Pusztay } 217d0c080abSJoseph Pusztay } 218d0c080abSJoseph Pusztay ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 219d0c080abSJoseph Pusztay PetscFunctionReturn(0); 220d0c080abSJoseph Pusztay } 221d0c080abSJoseph Pusztay 222d0c080abSJoseph Pusztay /*@C 223d0c080abSJoseph Pusztay TSMonitorExtreme - Prints the extreme values of the solution at each timestep 224d0c080abSJoseph Pusztay 225d0c080abSJoseph Pusztay Level: intermediate 226d0c080abSJoseph Pusztay 227d0c080abSJoseph Pusztay .seealso: TSMonitorSet() 228d0c080abSJoseph Pusztay @*/ 229d0c080abSJoseph Pusztay PetscErrorCode TSMonitorExtreme(TS ts,PetscInt step,PetscReal ptime,Vec v,PetscViewerAndFormat *vf) 230d0c080abSJoseph Pusztay { 231d0c080abSJoseph Pusztay PetscErrorCode ierr; 232d0c080abSJoseph Pusztay PetscViewer viewer = vf->viewer; 233d0c080abSJoseph Pusztay PetscBool iascii; 234d0c080abSJoseph Pusztay PetscReal max,min; 235d0c080abSJoseph Pusztay 236d0c080abSJoseph Pusztay PetscFunctionBegin; 237064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,5); 238d0c080abSJoseph Pusztay ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 239d0c080abSJoseph Pusztay ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr); 240d0c080abSJoseph Pusztay if (iascii) { 241d0c080abSJoseph Pusztay ierr = VecMax(v,NULL,&max);CHKERRQ(ierr); 242d0c080abSJoseph Pusztay ierr = VecMin(v,NULL,&min);CHKERRQ(ierr); 243d0c080abSJoseph Pusztay ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)ts)->tablevel);CHKERRQ(ierr); 244d0c080abSJoseph Pusztay ierr = PetscViewerASCIIPrintf(viewer,"%D TS dt %g time %g%s max %g min %g\n",step,(double)ts->time_step,(double)ptime,ts->steprollback ? " (r)" : "",(double)max,(double)min);CHKERRQ(ierr); 245d0c080abSJoseph Pusztay ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)ts)->tablevel);CHKERRQ(ierr); 246d0c080abSJoseph Pusztay } 247d0c080abSJoseph Pusztay ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 248d0c080abSJoseph Pusztay PetscFunctionReturn(0); 249d0c080abSJoseph Pusztay } 250d0c080abSJoseph Pusztay 251d0c080abSJoseph Pusztay /*@C 252d0c080abSJoseph Pusztay TSMonitorLGCtxCreate - Creates a TSMonitorLGCtx context for use with 253d0c080abSJoseph Pusztay TS to monitor the solution process graphically in various ways 254d0c080abSJoseph Pusztay 255d0c080abSJoseph Pusztay Collective on TS 256d0c080abSJoseph Pusztay 257d0c080abSJoseph Pusztay Input Parameters: 258d0c080abSJoseph Pusztay + host - the X display to open, or null for the local machine 259d0c080abSJoseph Pusztay . label - the title to put in the title bar 260d0c080abSJoseph Pusztay . x, y - the screen coordinates of the upper left coordinate of the window 261d0c080abSJoseph Pusztay . m, n - the screen width and height in pixels 262d0c080abSJoseph Pusztay - howoften - if positive then determines the frequency of the plotting, if -1 then only at the final time 263d0c080abSJoseph Pusztay 264d0c080abSJoseph Pusztay Output Parameter: 265d0c080abSJoseph Pusztay . ctx - the context 266d0c080abSJoseph Pusztay 267d0c080abSJoseph Pusztay Options Database Key: 268d0c080abSJoseph Pusztay + -ts_monitor_lg_timestep - automatically sets line graph monitor 269d0c080abSJoseph Pusztay + -ts_monitor_lg_timestep_log - automatically sets line graph monitor 270d0c080abSJoseph Pusztay . -ts_monitor_lg_solution - monitor the solution (or certain values of the solution by calling TSMonitorLGSetDisplayVariables() or TSMonitorLGCtxSetDisplayVariables()) 271d0c080abSJoseph Pusztay . -ts_monitor_lg_error - monitor the error 272d0c080abSJoseph Pusztay . -ts_monitor_lg_ksp_iterations - monitor the number of KSP iterations needed for each timestep 273d0c080abSJoseph Pusztay . -ts_monitor_lg_snes_iterations - monitor the number of SNES iterations needed for each timestep 274d0c080abSJoseph Pusztay - -lg_use_markers <true,false> - mark the data points (at each time step) on the plot; default is true 275d0c080abSJoseph Pusztay 276d0c080abSJoseph Pusztay Notes: 277d0c080abSJoseph Pusztay Use TSMonitorLGCtxDestroy() to destroy. 278d0c080abSJoseph Pusztay 279d0c080abSJoseph Pusztay One can provide a function that transforms the solution before plotting it with TSMonitorLGCtxSetTransform() or TSMonitorLGSetTransform() 280d0c080abSJoseph Pusztay 281d0c080abSJoseph Pusztay Many of the functions that control the monitoring have two forms: TSMonitorLGSet/GetXXXX() and TSMonitorLGCtxSet/GetXXXX() the first take a TS object as the 282d0c080abSJoseph Pusztay first argument (if that TS object does not have a TSMonitorLGCtx associated with it the function call is ignored) and the second takes a TSMonitorLGCtx object 283d0c080abSJoseph Pusztay as the first argument. 284d0c080abSJoseph Pusztay 285d0c080abSJoseph Pusztay One can control the names displayed for each solution or error variable with TSMonitorLGCtxSetVariableNames() or TSMonitorLGSetVariableNames() 286d0c080abSJoseph Pusztay 287d0c080abSJoseph Pusztay Level: intermediate 288d0c080abSJoseph Pusztay 289d0c080abSJoseph Pusztay .seealso: TSMonitorLGTimeStep(), TSMonitorSet(), TSMonitorLGSolution(), TSMonitorLGError(), TSMonitorDefault(), VecView(), 290d0c080abSJoseph Pusztay TSMonitorLGCtxCreate(), TSMonitorLGCtxSetVariableNames(), TSMonitorLGCtxGetVariableNames(), 291d0c080abSJoseph Pusztay TSMonitorLGSetVariableNames(), TSMonitorLGGetVariableNames(), TSMonitorLGSetDisplayVariables(), TSMonitorLGCtxSetDisplayVariables(), 292d0c080abSJoseph Pusztay TSMonitorLGCtxSetTransform(), TSMonitorLGSetTransform(), TSMonitorLGError(), TSMonitorLGSNESIterations(), TSMonitorLGKSPIterations(), 293d0c080abSJoseph Pusztay TSMonitorEnvelopeCtxCreate(), TSMonitorEnvelopeGetBounds(), TSMonitorEnvelopeCtxDestroy(), TSMonitorEnvelop() 294d0c080abSJoseph Pusztay 295d0c080abSJoseph Pusztay @*/ 296d0c080abSJoseph Pusztay PetscErrorCode TSMonitorLGCtxCreate(MPI_Comm comm,const char host[],const char label[],int x,int y,int m,int n,PetscInt howoften,TSMonitorLGCtx *ctx) 297d0c080abSJoseph Pusztay { 298d0c080abSJoseph Pusztay PetscDraw draw; 299d0c080abSJoseph Pusztay PetscErrorCode ierr; 300d0c080abSJoseph Pusztay 301d0c080abSJoseph Pusztay PetscFunctionBegin; 302d0c080abSJoseph Pusztay ierr = PetscNew(ctx);CHKERRQ(ierr); 303d0c080abSJoseph Pusztay ierr = PetscDrawCreate(comm,host,label,x,y,m,n,&draw);CHKERRQ(ierr); 304d0c080abSJoseph Pusztay ierr = PetscDrawSetFromOptions(draw);CHKERRQ(ierr); 305d0c080abSJoseph Pusztay ierr = PetscDrawLGCreate(draw,1,&(*ctx)->lg);CHKERRQ(ierr); 306d0c080abSJoseph Pusztay ierr = PetscDrawLGSetFromOptions((*ctx)->lg);CHKERRQ(ierr); 307d0c080abSJoseph Pusztay ierr = PetscDrawDestroy(&draw);CHKERRQ(ierr); 308d0c080abSJoseph Pusztay (*ctx)->howoften = howoften; 309d0c080abSJoseph Pusztay PetscFunctionReturn(0); 310d0c080abSJoseph Pusztay } 311d0c080abSJoseph Pusztay 312d0c080abSJoseph Pusztay PetscErrorCode TSMonitorLGTimeStep(TS ts,PetscInt step,PetscReal ptime,Vec v,void *monctx) 313d0c080abSJoseph Pusztay { 314d0c080abSJoseph Pusztay TSMonitorLGCtx ctx = (TSMonitorLGCtx) monctx; 315d0c080abSJoseph Pusztay PetscReal x = ptime,y; 316d0c080abSJoseph Pusztay PetscErrorCode ierr; 317d0c080abSJoseph Pusztay 318d0c080abSJoseph Pusztay PetscFunctionBegin; 319d0c080abSJoseph Pusztay if (step < 0) PetscFunctionReturn(0); /* -1 indicates an interpolated solution */ 320d0c080abSJoseph Pusztay if (!step) { 321d0c080abSJoseph Pusztay PetscDrawAxis axis; 322d0c080abSJoseph Pusztay const char *ylabel = ctx->semilogy ? "Log Time Step" : "Time Step"; 323d0c080abSJoseph Pusztay ierr = PetscDrawLGGetAxis(ctx->lg,&axis);CHKERRQ(ierr); 324d0c080abSJoseph Pusztay ierr = PetscDrawAxisSetLabels(axis,"Timestep as function of time","Time",ylabel);CHKERRQ(ierr); 325d0c080abSJoseph Pusztay ierr = PetscDrawLGReset(ctx->lg);CHKERRQ(ierr); 326d0c080abSJoseph Pusztay } 327d0c080abSJoseph Pusztay ierr = TSGetTimeStep(ts,&y);CHKERRQ(ierr); 328d0c080abSJoseph Pusztay if (ctx->semilogy) y = PetscLog10Real(y); 329d0c080abSJoseph Pusztay ierr = PetscDrawLGAddPoint(ctx->lg,&x,&y);CHKERRQ(ierr); 330d0c080abSJoseph Pusztay if (((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && ts->reason)) { 331d0c080abSJoseph Pusztay ierr = PetscDrawLGDraw(ctx->lg);CHKERRQ(ierr); 332d0c080abSJoseph Pusztay ierr = PetscDrawLGSave(ctx->lg);CHKERRQ(ierr); 333d0c080abSJoseph Pusztay } 334d0c080abSJoseph Pusztay PetscFunctionReturn(0); 335d0c080abSJoseph Pusztay } 336d0c080abSJoseph Pusztay 337d0c080abSJoseph Pusztay /*@C 338d0c080abSJoseph Pusztay TSMonitorLGCtxDestroy - Destroys a line graph context that was created 339d0c080abSJoseph Pusztay with TSMonitorLGCtxCreate(). 340d0c080abSJoseph Pusztay 341d0c080abSJoseph Pusztay Collective on TSMonitorLGCtx 342d0c080abSJoseph Pusztay 343d0c080abSJoseph Pusztay Input Parameter: 344d0c080abSJoseph Pusztay . ctx - the monitor context 345d0c080abSJoseph Pusztay 346d0c080abSJoseph Pusztay Level: intermediate 347d0c080abSJoseph Pusztay 348d0c080abSJoseph Pusztay .seealso: TSMonitorLGCtxCreate(), TSMonitorSet(), TSMonitorLGTimeStep(); 349d0c080abSJoseph Pusztay @*/ 350d0c080abSJoseph Pusztay PetscErrorCode TSMonitorLGCtxDestroy(TSMonitorLGCtx *ctx) 351d0c080abSJoseph Pusztay { 352d0c080abSJoseph Pusztay PetscErrorCode ierr; 353d0c080abSJoseph Pusztay 354d0c080abSJoseph Pusztay PetscFunctionBegin; 355d0c080abSJoseph Pusztay if ((*ctx)->transformdestroy) { 356d0c080abSJoseph Pusztay ierr = ((*ctx)->transformdestroy)((*ctx)->transformctx);CHKERRQ(ierr); 357d0c080abSJoseph Pusztay } 358d0c080abSJoseph Pusztay ierr = PetscDrawLGDestroy(&(*ctx)->lg);CHKERRQ(ierr); 359d0c080abSJoseph Pusztay ierr = PetscStrArrayDestroy(&(*ctx)->names);CHKERRQ(ierr); 360d0c080abSJoseph Pusztay ierr = PetscStrArrayDestroy(&(*ctx)->displaynames);CHKERRQ(ierr); 361d0c080abSJoseph Pusztay ierr = PetscFree((*ctx)->displayvariables);CHKERRQ(ierr); 362d0c080abSJoseph Pusztay ierr = PetscFree((*ctx)->displayvalues);CHKERRQ(ierr); 363d0c080abSJoseph Pusztay ierr = PetscFree(*ctx);CHKERRQ(ierr); 364d0c080abSJoseph Pusztay PetscFunctionReturn(0); 365d0c080abSJoseph Pusztay } 366d0c080abSJoseph Pusztay 367d7462660SMatthew Knepley /* Creates a TS Monitor SPCtx for use with DMSwarm particle visualizations */ 368d7462660SMatthew Knepley PetscErrorCode TSMonitorSPCtxCreate(MPI_Comm comm,const char host[],const char label[],int x,int y,int m,int n,PetscInt howoften,PetscInt retain,PetscBool phase,TSMonitorSPCtx *ctx) 369d0c080abSJoseph Pusztay { 370d0c080abSJoseph Pusztay PetscDraw draw; 371d0c080abSJoseph Pusztay PetscErrorCode ierr; 372d0c080abSJoseph Pusztay 373d0c080abSJoseph Pusztay PetscFunctionBegin; 374d0c080abSJoseph Pusztay ierr = PetscNew(ctx);CHKERRQ(ierr); 375d0c080abSJoseph Pusztay ierr = PetscDrawCreate(comm,host,label,x,y,m,n,&draw);CHKERRQ(ierr); 376d0c080abSJoseph Pusztay ierr = PetscDrawSetFromOptions(draw);CHKERRQ(ierr); 377d0c080abSJoseph Pusztay ierr = PetscDrawSPCreate(draw,1,&(*ctx)->sp);CHKERRQ(ierr); 378d0c080abSJoseph Pusztay ierr = PetscDrawDestroy(&draw);CHKERRQ(ierr); 379d0c080abSJoseph Pusztay (*ctx)->howoften = howoften; 380d7462660SMatthew Knepley (*ctx)->retain = retain; 381d7462660SMatthew Knepley (*ctx)->phase = phase; 382d0c080abSJoseph Pusztay PetscFunctionReturn(0); 383d0c080abSJoseph Pusztay } 384d0c080abSJoseph Pusztay 385d0c080abSJoseph Pusztay /* 386d0c080abSJoseph Pusztay Destroys a TSMonitorSPCtx that was created with TSMonitorSPCtxCreate 387d0c080abSJoseph Pusztay */ 388d0c080abSJoseph Pusztay PetscErrorCode TSMonitorSPCtxDestroy(TSMonitorSPCtx *ctx) 389d0c080abSJoseph Pusztay { 390d0c080abSJoseph Pusztay PetscErrorCode ierr; 391d0c080abSJoseph Pusztay 392d0c080abSJoseph Pusztay PetscFunctionBegin; 393d0c080abSJoseph Pusztay 394d0c080abSJoseph Pusztay ierr = PetscDrawSPDestroy(&(*ctx)->sp);CHKERRQ(ierr); 395d0c080abSJoseph Pusztay ierr = PetscFree(*ctx);CHKERRQ(ierr); 396d0c080abSJoseph Pusztay 397d0c080abSJoseph Pusztay PetscFunctionReturn(0); 398d0c080abSJoseph Pusztay 399d0c080abSJoseph Pusztay } 400d0c080abSJoseph Pusztay 401d0c080abSJoseph Pusztay /*@C 402d0c080abSJoseph Pusztay TSMonitorDrawSolution - Monitors progress of the TS solvers by calling 403d0c080abSJoseph Pusztay VecView() for the solution at each timestep 404d0c080abSJoseph Pusztay 405d0c080abSJoseph Pusztay Collective on TS 406d0c080abSJoseph Pusztay 407d0c080abSJoseph Pusztay Input Parameters: 408d0c080abSJoseph Pusztay + ts - the TS context 409d0c080abSJoseph Pusztay . step - current time-step 410d0c080abSJoseph Pusztay . ptime - current time 411d0c080abSJoseph Pusztay - dummy - either a viewer or NULL 412d0c080abSJoseph Pusztay 413d0c080abSJoseph Pusztay Options Database: 414d0c080abSJoseph Pusztay . -ts_monitor_draw_solution_initial - show initial solution as well as current solution 415d0c080abSJoseph Pusztay 416d0c080abSJoseph Pusztay Notes: 417d0c080abSJoseph Pusztay the initial solution and current solution are not display with a common axis scaling so generally the option -ts_monitor_draw_solution_initial 418d0c080abSJoseph Pusztay will look bad 419d0c080abSJoseph Pusztay 420d0c080abSJoseph Pusztay Level: intermediate 421d0c080abSJoseph Pusztay 422d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView() 423d0c080abSJoseph Pusztay @*/ 424d0c080abSJoseph Pusztay PetscErrorCode TSMonitorDrawSolution(TS ts,PetscInt step,PetscReal ptime,Vec u,void *dummy) 425d0c080abSJoseph Pusztay { 426d0c080abSJoseph Pusztay PetscErrorCode ierr; 427d0c080abSJoseph Pusztay TSMonitorDrawCtx ictx = (TSMonitorDrawCtx)dummy; 428d0c080abSJoseph Pusztay PetscDraw draw; 429d0c080abSJoseph Pusztay 430d0c080abSJoseph Pusztay PetscFunctionBegin; 431d0c080abSJoseph Pusztay if (!step && ictx->showinitial) { 432d0c080abSJoseph Pusztay if (!ictx->initialsolution) { 433d0c080abSJoseph Pusztay ierr = VecDuplicate(u,&ictx->initialsolution);CHKERRQ(ierr); 434d0c080abSJoseph Pusztay } 435d0c080abSJoseph Pusztay ierr = VecCopy(u,ictx->initialsolution);CHKERRQ(ierr); 436d0c080abSJoseph Pusztay } 437d0c080abSJoseph Pusztay if (!(((ictx->howoften > 0) && (!(step % ictx->howoften))) || ((ictx->howoften == -1) && ts->reason))) PetscFunctionReturn(0); 438d0c080abSJoseph Pusztay 439d0c080abSJoseph Pusztay if (ictx->showinitial) { 440d0c080abSJoseph Pusztay PetscReal pause; 441d0c080abSJoseph Pusztay ierr = PetscViewerDrawGetPause(ictx->viewer,&pause);CHKERRQ(ierr); 442d0c080abSJoseph Pusztay ierr = PetscViewerDrawSetPause(ictx->viewer,0.0);CHKERRQ(ierr); 443d0c080abSJoseph Pusztay ierr = VecView(ictx->initialsolution,ictx->viewer);CHKERRQ(ierr); 444d0c080abSJoseph Pusztay ierr = PetscViewerDrawSetPause(ictx->viewer,pause);CHKERRQ(ierr); 445d0c080abSJoseph Pusztay ierr = PetscViewerDrawSetHold(ictx->viewer,PETSC_TRUE);CHKERRQ(ierr); 446d0c080abSJoseph Pusztay } 447d0c080abSJoseph Pusztay ierr = VecView(u,ictx->viewer);CHKERRQ(ierr); 448d0c080abSJoseph Pusztay if (ictx->showtimestepandtime) { 449d0c080abSJoseph Pusztay PetscReal xl,yl,xr,yr,h; 450d0c080abSJoseph Pusztay char time[32]; 451d0c080abSJoseph Pusztay 452d0c080abSJoseph Pusztay ierr = PetscViewerDrawGetDraw(ictx->viewer,0,&draw);CHKERRQ(ierr); 453d0c080abSJoseph Pusztay ierr = PetscSNPrintf(time,32,"Timestep %d Time %g",(int)step,(double)ptime);CHKERRQ(ierr); 454d0c080abSJoseph Pusztay ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 455d0c080abSJoseph Pusztay h = yl + .95*(yr - yl); 456d0c080abSJoseph Pusztay ierr = PetscDrawStringCentered(draw,.5*(xl+xr),h,PETSC_DRAW_BLACK,time);CHKERRQ(ierr); 457d0c080abSJoseph Pusztay ierr = PetscDrawFlush(draw);CHKERRQ(ierr); 458d0c080abSJoseph Pusztay } 459d0c080abSJoseph Pusztay 460d0c080abSJoseph Pusztay if (ictx->showinitial) { 461d0c080abSJoseph Pusztay ierr = PetscViewerDrawSetHold(ictx->viewer,PETSC_FALSE);CHKERRQ(ierr); 462d0c080abSJoseph Pusztay } 463d0c080abSJoseph Pusztay PetscFunctionReturn(0); 464d0c080abSJoseph Pusztay } 465d0c080abSJoseph Pusztay 466d0c080abSJoseph Pusztay /*@C 467d0c080abSJoseph Pusztay TSMonitorDrawSolutionPhase - Monitors progress of the TS solvers by plotting the solution as a phase diagram 468d0c080abSJoseph Pusztay 469d0c080abSJoseph Pusztay Collective on TS 470d0c080abSJoseph Pusztay 471d0c080abSJoseph Pusztay Input Parameters: 472d0c080abSJoseph Pusztay + ts - the TS context 473d0c080abSJoseph Pusztay . step - current time-step 474d0c080abSJoseph Pusztay . ptime - current time 475d0c080abSJoseph Pusztay - dummy - either a viewer or NULL 476d0c080abSJoseph Pusztay 477d0c080abSJoseph Pusztay Level: intermediate 478d0c080abSJoseph Pusztay 479d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView() 480d0c080abSJoseph Pusztay @*/ 481d0c080abSJoseph Pusztay PetscErrorCode TSMonitorDrawSolutionPhase(TS ts,PetscInt step,PetscReal ptime,Vec u,void *dummy) 482d0c080abSJoseph Pusztay { 483d0c080abSJoseph Pusztay PetscErrorCode ierr; 484d0c080abSJoseph Pusztay TSMonitorDrawCtx ictx = (TSMonitorDrawCtx)dummy; 485d0c080abSJoseph Pusztay PetscDraw draw; 486d0c080abSJoseph Pusztay PetscDrawAxis axis; 487d0c080abSJoseph Pusztay PetscInt n; 488d0c080abSJoseph Pusztay PetscMPIInt size; 489d0c080abSJoseph Pusztay PetscReal U0,U1,xl,yl,xr,yr,h; 490d0c080abSJoseph Pusztay char time[32]; 491d0c080abSJoseph Pusztay const PetscScalar *U; 492d0c080abSJoseph Pusztay 493d0c080abSJoseph Pusztay PetscFunctionBegin; 494d0c080abSJoseph Pusztay ierr = MPI_Comm_size(PetscObjectComm((PetscObject)ts),&size);CHKERRMPI(ierr); 495d0c080abSJoseph Pusztay if (size != 1) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_SUP,"Only allowed for sequential runs"); 496d0c080abSJoseph Pusztay ierr = VecGetSize(u,&n);CHKERRQ(ierr); 497d0c080abSJoseph Pusztay if (n != 2) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_SUP,"Only for ODEs with two unknowns"); 498d0c080abSJoseph Pusztay 499d0c080abSJoseph Pusztay ierr = PetscViewerDrawGetDraw(ictx->viewer,0,&draw);CHKERRQ(ierr); 500d0c080abSJoseph Pusztay ierr = PetscViewerDrawGetDrawAxis(ictx->viewer,0,&axis);CHKERRQ(ierr); 501d0c080abSJoseph Pusztay ierr = PetscDrawAxisGetLimits(axis,&xl,&xr,&yl,&yr);CHKERRQ(ierr); 502d0c080abSJoseph Pusztay if (!step) { 503d0c080abSJoseph Pusztay ierr = PetscDrawClear(draw);CHKERRQ(ierr); 504d0c080abSJoseph Pusztay ierr = PetscDrawAxisDraw(axis);CHKERRQ(ierr); 505d0c080abSJoseph Pusztay } 506d0c080abSJoseph Pusztay 507d0c080abSJoseph Pusztay ierr = VecGetArrayRead(u,&U);CHKERRQ(ierr); 508d0c080abSJoseph Pusztay U0 = PetscRealPart(U[0]); 509d0c080abSJoseph Pusztay U1 = PetscRealPart(U[1]); 510d0c080abSJoseph Pusztay ierr = VecRestoreArrayRead(u,&U);CHKERRQ(ierr); 511d0c080abSJoseph Pusztay if ((U0 < xl) || (U1 < yl) || (U0 > xr) || (U1 > yr)) PetscFunctionReturn(0); 512d0c080abSJoseph Pusztay 513d0c080abSJoseph Pusztay ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 514d0c080abSJoseph Pusztay ierr = PetscDrawPoint(draw,U0,U1,PETSC_DRAW_BLACK);CHKERRQ(ierr); 515d0c080abSJoseph Pusztay if (ictx->showtimestepandtime) { 516d0c080abSJoseph Pusztay ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 517d0c080abSJoseph Pusztay ierr = PetscSNPrintf(time,32,"Timestep %d Time %g",(int)step,(double)ptime);CHKERRQ(ierr); 518d0c080abSJoseph Pusztay h = yl + .95*(yr - yl); 519d0c080abSJoseph Pusztay ierr = PetscDrawStringCentered(draw,.5*(xl+xr),h,PETSC_DRAW_BLACK,time);CHKERRQ(ierr); 520d0c080abSJoseph Pusztay } 521d0c080abSJoseph Pusztay ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 522d0c080abSJoseph Pusztay ierr = PetscDrawFlush(draw);CHKERRQ(ierr); 523d0c080abSJoseph Pusztay ierr = PetscDrawPause(draw);CHKERRQ(ierr); 524d0c080abSJoseph Pusztay ierr = PetscDrawSave(draw);CHKERRQ(ierr); 525d0c080abSJoseph Pusztay PetscFunctionReturn(0); 526d0c080abSJoseph Pusztay } 527d0c080abSJoseph Pusztay 528d0c080abSJoseph Pusztay /*@C 529d0c080abSJoseph Pusztay TSMonitorDrawCtxDestroy - Destroys the monitor context for TSMonitorDrawSolution() 530d0c080abSJoseph Pusztay 531d0c080abSJoseph Pusztay Collective on TS 532d0c080abSJoseph Pusztay 533d0c080abSJoseph Pusztay Input Parameters: 534d0c080abSJoseph Pusztay . ctx - the monitor context 535d0c080abSJoseph Pusztay 536d0c080abSJoseph Pusztay Level: intermediate 537d0c080abSJoseph Pusztay 538d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorDrawSolution(), TSMonitorDrawError() 539d0c080abSJoseph Pusztay @*/ 540d0c080abSJoseph Pusztay PetscErrorCode TSMonitorDrawCtxDestroy(TSMonitorDrawCtx *ictx) 541d0c080abSJoseph Pusztay { 542d0c080abSJoseph Pusztay PetscErrorCode ierr; 543d0c080abSJoseph Pusztay 544d0c080abSJoseph Pusztay PetscFunctionBegin; 545d0c080abSJoseph Pusztay ierr = PetscViewerDestroy(&(*ictx)->viewer);CHKERRQ(ierr); 546d0c080abSJoseph Pusztay ierr = VecDestroy(&(*ictx)->initialsolution);CHKERRQ(ierr); 547d0c080abSJoseph Pusztay ierr = PetscFree(*ictx);CHKERRQ(ierr); 548d0c080abSJoseph Pusztay PetscFunctionReturn(0); 549d0c080abSJoseph Pusztay } 550d0c080abSJoseph Pusztay 551d0c080abSJoseph Pusztay /*@C 552d0c080abSJoseph Pusztay TSMonitorDrawCtxCreate - Creates the monitor context for TSMonitorDrawCtx 553d0c080abSJoseph Pusztay 554d0c080abSJoseph Pusztay Collective on TS 555d0c080abSJoseph Pusztay 556d0c080abSJoseph Pusztay Input Parameter: 557d0c080abSJoseph Pusztay . ts - time-step context 558d0c080abSJoseph Pusztay 559d0c080abSJoseph Pusztay Output Patameter: 560d0c080abSJoseph Pusztay . ctx - the monitor context 561d0c080abSJoseph Pusztay 562d0c080abSJoseph Pusztay Options Database: 563d0c080abSJoseph Pusztay . -ts_monitor_draw_solution_initial - show initial solution as well as current solution 564d0c080abSJoseph Pusztay 565d0c080abSJoseph Pusztay Level: intermediate 566d0c080abSJoseph Pusztay 567d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorDrawCtx() 568d0c080abSJoseph Pusztay @*/ 569d0c080abSJoseph Pusztay PetscErrorCode TSMonitorDrawCtxCreate(MPI_Comm comm,const char host[],const char label[],int x,int y,int m,int n,PetscInt howoften,TSMonitorDrawCtx *ctx) 570d0c080abSJoseph Pusztay { 571d0c080abSJoseph Pusztay PetscErrorCode ierr; 572d0c080abSJoseph Pusztay 573d0c080abSJoseph Pusztay PetscFunctionBegin; 574d0c080abSJoseph Pusztay ierr = PetscNew(ctx);CHKERRQ(ierr); 575d0c080abSJoseph Pusztay ierr = PetscViewerDrawOpen(comm,host,label,x,y,m,n,&(*ctx)->viewer);CHKERRQ(ierr); 576d0c080abSJoseph Pusztay ierr = PetscViewerSetFromOptions((*ctx)->viewer);CHKERRQ(ierr); 577d0c080abSJoseph Pusztay 578d0c080abSJoseph Pusztay (*ctx)->howoften = howoften; 579d0c080abSJoseph Pusztay (*ctx)->showinitial = PETSC_FALSE; 580d0c080abSJoseph Pusztay ierr = PetscOptionsGetBool(NULL,NULL,"-ts_monitor_draw_solution_initial",&(*ctx)->showinitial,NULL);CHKERRQ(ierr); 581d0c080abSJoseph Pusztay 582d0c080abSJoseph Pusztay (*ctx)->showtimestepandtime = PETSC_FALSE; 583d0c080abSJoseph Pusztay ierr = PetscOptionsGetBool(NULL,NULL,"-ts_monitor_draw_solution_show_time",&(*ctx)->showtimestepandtime,NULL);CHKERRQ(ierr); 584d0c080abSJoseph Pusztay PetscFunctionReturn(0); 585d0c080abSJoseph Pusztay } 586d0c080abSJoseph Pusztay 587d0c080abSJoseph Pusztay /*@C 588d0c080abSJoseph Pusztay TSMonitorDrawSolutionFunction - Monitors progress of the TS solvers by calling 589d0c080abSJoseph Pusztay VecView() for the solution provided by TSSetSolutionFunction() at each timestep 590d0c080abSJoseph Pusztay 591d0c080abSJoseph Pusztay Collective on TS 592d0c080abSJoseph Pusztay 593d0c080abSJoseph Pusztay Input Parameters: 594d0c080abSJoseph Pusztay + ts - the TS context 595d0c080abSJoseph Pusztay . step - current time-step 596d0c080abSJoseph Pusztay . ptime - current time 597d0c080abSJoseph Pusztay - dummy - either a viewer or NULL 598d0c080abSJoseph Pusztay 599d0c080abSJoseph Pusztay Options Database: 600d0c080abSJoseph Pusztay . -ts_monitor_draw_solution_function - Monitor error graphically, requires user to have provided TSSetSolutionFunction() 601d0c080abSJoseph Pusztay 602d0c080abSJoseph Pusztay Level: intermediate 603d0c080abSJoseph Pusztay 604d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSSetSolutionFunction() 605d0c080abSJoseph Pusztay @*/ 606d0c080abSJoseph Pusztay PetscErrorCode TSMonitorDrawSolutionFunction(TS ts,PetscInt step,PetscReal ptime,Vec u,void *dummy) 607d0c080abSJoseph Pusztay { 608d0c080abSJoseph Pusztay PetscErrorCode ierr; 609d0c080abSJoseph Pusztay TSMonitorDrawCtx ctx = (TSMonitorDrawCtx)dummy; 610d0c080abSJoseph Pusztay PetscViewer viewer = ctx->viewer; 611d0c080abSJoseph Pusztay Vec work; 612d0c080abSJoseph Pusztay 613d0c080abSJoseph Pusztay PetscFunctionBegin; 614d0c080abSJoseph Pusztay if (!(((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && ts->reason))) PetscFunctionReturn(0); 615d0c080abSJoseph Pusztay ierr = VecDuplicate(u,&work);CHKERRQ(ierr); 616d0c080abSJoseph Pusztay ierr = TSComputeSolutionFunction(ts,ptime,work);CHKERRQ(ierr); 617d0c080abSJoseph Pusztay ierr = VecView(work,viewer);CHKERRQ(ierr); 618d0c080abSJoseph Pusztay ierr = VecDestroy(&work);CHKERRQ(ierr); 619d0c080abSJoseph Pusztay PetscFunctionReturn(0); 620d0c080abSJoseph Pusztay } 621d0c080abSJoseph Pusztay 622d0c080abSJoseph Pusztay /*@C 623d0c080abSJoseph Pusztay TSMonitorDrawError - Monitors progress of the TS solvers by calling 624d0c080abSJoseph Pusztay VecView() for the error at each timestep 625d0c080abSJoseph Pusztay 626d0c080abSJoseph Pusztay Collective on TS 627d0c080abSJoseph Pusztay 628d0c080abSJoseph Pusztay Input Parameters: 629d0c080abSJoseph Pusztay + ts - the TS context 630d0c080abSJoseph Pusztay . step - current time-step 631d0c080abSJoseph Pusztay . ptime - current time 632d0c080abSJoseph Pusztay - dummy - either a viewer or NULL 633d0c080abSJoseph Pusztay 634d0c080abSJoseph Pusztay Options Database: 635d0c080abSJoseph Pusztay . -ts_monitor_draw_error - Monitor error graphically, requires user to have provided TSSetSolutionFunction() 636d0c080abSJoseph Pusztay 637d0c080abSJoseph Pusztay Level: intermediate 638d0c080abSJoseph Pusztay 639d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSSetSolutionFunction() 640d0c080abSJoseph Pusztay @*/ 641d0c080abSJoseph Pusztay PetscErrorCode TSMonitorDrawError(TS ts,PetscInt step,PetscReal ptime,Vec u,void *dummy) 642d0c080abSJoseph Pusztay { 643d0c080abSJoseph Pusztay PetscErrorCode ierr; 644d0c080abSJoseph Pusztay TSMonitorDrawCtx ctx = (TSMonitorDrawCtx)dummy; 645d0c080abSJoseph Pusztay PetscViewer viewer = ctx->viewer; 646d0c080abSJoseph Pusztay Vec work; 647d0c080abSJoseph Pusztay 648d0c080abSJoseph Pusztay PetscFunctionBegin; 649d0c080abSJoseph Pusztay if (!(((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && ts->reason))) PetscFunctionReturn(0); 650d0c080abSJoseph Pusztay ierr = VecDuplicate(u,&work);CHKERRQ(ierr); 651d0c080abSJoseph Pusztay ierr = TSComputeSolutionFunction(ts,ptime,work);CHKERRQ(ierr); 652d0c080abSJoseph Pusztay ierr = VecAXPY(work,-1.0,u);CHKERRQ(ierr); 653d0c080abSJoseph Pusztay ierr = VecView(work,viewer);CHKERRQ(ierr); 654d0c080abSJoseph Pusztay ierr = VecDestroy(&work);CHKERRQ(ierr); 655d0c080abSJoseph Pusztay PetscFunctionReturn(0); 656d0c080abSJoseph Pusztay } 657d0c080abSJoseph Pusztay 658d0c080abSJoseph Pusztay /*@C 659d0c080abSJoseph Pusztay TSMonitorSolution - Monitors progress of the TS solvers by VecView() for the solution at each timestep. Normally the viewer is a binary file or a PetscDraw object 660d0c080abSJoseph Pusztay 661d0c080abSJoseph Pusztay Collective on TS 662d0c080abSJoseph Pusztay 663d0c080abSJoseph Pusztay Input Parameters: 664d0c080abSJoseph Pusztay + ts - the TS context 665d0c080abSJoseph Pusztay . step - current time-step 666d0c080abSJoseph Pusztay . ptime - current time 667d0c080abSJoseph Pusztay . u - current state 668d0c080abSJoseph Pusztay - vf - viewer and its format 669d0c080abSJoseph Pusztay 670d0c080abSJoseph Pusztay Level: intermediate 671d0c080abSJoseph Pusztay 672d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView() 673d0c080abSJoseph Pusztay @*/ 674d0c080abSJoseph Pusztay PetscErrorCode TSMonitorSolution(TS ts,PetscInt step,PetscReal ptime,Vec u,PetscViewerAndFormat *vf) 675d0c080abSJoseph Pusztay { 676d0c080abSJoseph Pusztay PetscErrorCode ierr; 677d0c080abSJoseph Pusztay 678d0c080abSJoseph Pusztay PetscFunctionBegin; 679d0c080abSJoseph Pusztay ierr = PetscViewerPushFormat(vf->viewer,vf->format);CHKERRQ(ierr); 680d0c080abSJoseph Pusztay ierr = VecView(u,vf->viewer);CHKERRQ(ierr); 681d0c080abSJoseph Pusztay ierr = PetscViewerPopFormat(vf->viewer);CHKERRQ(ierr); 682d0c080abSJoseph Pusztay PetscFunctionReturn(0); 683d0c080abSJoseph Pusztay } 684d0c080abSJoseph Pusztay 685d0c080abSJoseph Pusztay /*@C 686d0c080abSJoseph Pusztay TSMonitorSolutionVTK - Monitors progress of the TS solvers by VecView() for the solution at each timestep. 687d0c080abSJoseph Pusztay 688d0c080abSJoseph Pusztay Collective on TS 689d0c080abSJoseph Pusztay 690d0c080abSJoseph Pusztay Input Parameters: 691d0c080abSJoseph Pusztay + ts - the TS context 692d0c080abSJoseph Pusztay . step - current time-step 693d0c080abSJoseph Pusztay . ptime - current time 694d0c080abSJoseph Pusztay . u - current state 695d0c080abSJoseph Pusztay - filenametemplate - string containing a format specifier for the integer time step (e.g. %03D) 696d0c080abSJoseph Pusztay 697d0c080abSJoseph Pusztay Level: intermediate 698d0c080abSJoseph Pusztay 699d0c080abSJoseph Pusztay Notes: 700d0c080abSJoseph Pusztay The VTK format does not allow writing multiple time steps in the same file, therefore a different file will be written for each time step. 701d0c080abSJoseph Pusztay These are named according to the file name template. 702d0c080abSJoseph Pusztay 703d0c080abSJoseph Pusztay This function is normally passed as an argument to TSMonitorSet() along with TSMonitorSolutionVTKDestroy(). 704d0c080abSJoseph Pusztay 705d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView() 706d0c080abSJoseph Pusztay @*/ 707d0c080abSJoseph Pusztay PetscErrorCode TSMonitorSolutionVTK(TS ts,PetscInt step,PetscReal ptime,Vec u,void *filenametemplate) 708d0c080abSJoseph Pusztay { 709d0c080abSJoseph Pusztay PetscErrorCode ierr; 710d0c080abSJoseph Pusztay char filename[PETSC_MAX_PATH_LEN]; 711d0c080abSJoseph Pusztay PetscViewer viewer; 712d0c080abSJoseph Pusztay 713d0c080abSJoseph Pusztay PetscFunctionBegin; 714d0c080abSJoseph Pusztay if (step < 0) PetscFunctionReturn(0); /* -1 indicates interpolated solution */ 715d0c080abSJoseph Pusztay ierr = PetscSNPrintf(filename,sizeof(filename),(const char*)filenametemplate,step);CHKERRQ(ierr); 716d0c080abSJoseph Pusztay ierr = PetscViewerVTKOpen(PetscObjectComm((PetscObject)ts),filename,FILE_MODE_WRITE,&viewer);CHKERRQ(ierr); 717d0c080abSJoseph Pusztay ierr = VecView(u,viewer);CHKERRQ(ierr); 718d0c080abSJoseph Pusztay ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 719d0c080abSJoseph Pusztay PetscFunctionReturn(0); 720d0c080abSJoseph Pusztay } 721d0c080abSJoseph Pusztay 722d0c080abSJoseph Pusztay /*@C 723d0c080abSJoseph Pusztay TSMonitorSolutionVTKDestroy - Destroy context for monitoring 724d0c080abSJoseph Pusztay 725d0c080abSJoseph Pusztay Collective on TS 726d0c080abSJoseph Pusztay 727d0c080abSJoseph Pusztay Input Parameters: 728d0c080abSJoseph Pusztay . filenametemplate - string containing a format specifier for the integer time step (e.g. %03D) 729d0c080abSJoseph Pusztay 730d0c080abSJoseph Pusztay Level: intermediate 731d0c080abSJoseph Pusztay 732d0c080abSJoseph Pusztay Note: 733d0c080abSJoseph Pusztay This function is normally passed to TSMonitorSet() along with TSMonitorSolutionVTK(). 734d0c080abSJoseph Pusztay 735d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorSolutionVTK() 736d0c080abSJoseph Pusztay @*/ 737d0c080abSJoseph Pusztay PetscErrorCode TSMonitorSolutionVTKDestroy(void *filenametemplate) 738d0c080abSJoseph Pusztay { 739d0c080abSJoseph Pusztay PetscErrorCode ierr; 740d0c080abSJoseph Pusztay 741d0c080abSJoseph Pusztay PetscFunctionBegin; 742d0c080abSJoseph Pusztay ierr = PetscFree(*(char**)filenametemplate);CHKERRQ(ierr); 743d0c080abSJoseph Pusztay PetscFunctionReturn(0); 744d0c080abSJoseph Pusztay } 745d0c080abSJoseph Pusztay 746d0c080abSJoseph Pusztay /*@C 747d0c080abSJoseph Pusztay TSMonitorLGSolution - Monitors progress of the TS solvers by plotting each component of the solution vector 748d0c080abSJoseph Pusztay in a time based line graph 749d0c080abSJoseph Pusztay 750d0c080abSJoseph Pusztay Collective on TS 751d0c080abSJoseph Pusztay 752d0c080abSJoseph Pusztay Input Parameters: 753d0c080abSJoseph Pusztay + ts - the TS context 754d0c080abSJoseph Pusztay . step - current time-step 755d0c080abSJoseph Pusztay . ptime - current time 756d0c080abSJoseph Pusztay . u - current solution 757d0c080abSJoseph Pusztay - dctx - the TSMonitorLGCtx object that contains all the options for the monitoring, this is created with TSMonitorLGCtxCreate() 758d0c080abSJoseph Pusztay 759d0c080abSJoseph Pusztay Options Database: 760d0c080abSJoseph Pusztay . -ts_monitor_lg_solution_variables 761d0c080abSJoseph Pusztay 762d0c080abSJoseph Pusztay Level: intermediate 763d0c080abSJoseph Pusztay 764d0c080abSJoseph Pusztay Notes: 765d0c080abSJoseph Pusztay Each process in a parallel run displays its component solutions in a separate window 766d0c080abSJoseph Pusztay 767d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorLGCtxCreate(), TSMonitorLGCtxSetVariableNames(), TSMonitorLGCtxGetVariableNames(), 768d0c080abSJoseph Pusztay TSMonitorLGSetVariableNames(), TSMonitorLGGetVariableNames(), TSMonitorLGSetDisplayVariables(), TSMonitorLGCtxSetDisplayVariables(), 769d0c080abSJoseph Pusztay TSMonitorLGCtxSetTransform(), TSMonitorLGSetTransform(), TSMonitorLGError(), TSMonitorLGSNESIterations(), TSMonitorLGKSPIterations(), 770d0c080abSJoseph Pusztay TSMonitorEnvelopeCtxCreate(), TSMonitorEnvelopeGetBounds(), TSMonitorEnvelopeCtxDestroy(), TSMonitorEnvelop() 771d0c080abSJoseph Pusztay @*/ 772d0c080abSJoseph Pusztay PetscErrorCode TSMonitorLGSolution(TS ts,PetscInt step,PetscReal ptime,Vec u,void *dctx) 773d0c080abSJoseph Pusztay { 774d0c080abSJoseph Pusztay PetscErrorCode ierr; 775d0c080abSJoseph Pusztay TSMonitorLGCtx ctx = (TSMonitorLGCtx)dctx; 776d0c080abSJoseph Pusztay const PetscScalar *yy; 777d0c080abSJoseph Pusztay Vec v; 778d0c080abSJoseph Pusztay 779d0c080abSJoseph Pusztay PetscFunctionBegin; 780d0c080abSJoseph Pusztay if (step < 0) PetscFunctionReturn(0); /* -1 indicates interpolated solution */ 781d0c080abSJoseph Pusztay if (!step) { 782d0c080abSJoseph Pusztay PetscDrawAxis axis; 783d0c080abSJoseph Pusztay PetscInt dim; 784d0c080abSJoseph Pusztay ierr = PetscDrawLGGetAxis(ctx->lg,&axis);CHKERRQ(ierr); 785d0c080abSJoseph Pusztay ierr = PetscDrawAxisSetLabels(axis,"Solution as function of time","Time","Solution");CHKERRQ(ierr); 786d0c080abSJoseph Pusztay if (!ctx->names) { 787d0c080abSJoseph Pusztay PetscBool flg; 788d0c080abSJoseph Pusztay /* user provides names of variables to plot but no names has been set so assume names are integer values */ 789d0c080abSJoseph Pusztay ierr = PetscOptionsHasName(((PetscObject)ts)->options,((PetscObject)ts)->prefix,"-ts_monitor_lg_solution_variables",&flg);CHKERRQ(ierr); 790d0c080abSJoseph Pusztay if (flg) { 791d0c080abSJoseph Pusztay PetscInt i,n; 792d0c080abSJoseph Pusztay char **names; 793d0c080abSJoseph Pusztay ierr = VecGetSize(u,&n);CHKERRQ(ierr); 794d0c080abSJoseph Pusztay ierr = PetscMalloc1(n+1,&names);CHKERRQ(ierr); 795d0c080abSJoseph Pusztay for (i=0; i<n; i++) { 796d0c080abSJoseph Pusztay ierr = PetscMalloc1(5,&names[i]);CHKERRQ(ierr); 797d0c080abSJoseph Pusztay ierr = PetscSNPrintf(names[i],5,"%D",i);CHKERRQ(ierr); 798d0c080abSJoseph Pusztay } 799d0c080abSJoseph Pusztay names[n] = NULL; 800d0c080abSJoseph Pusztay ctx->names = names; 801d0c080abSJoseph Pusztay } 802d0c080abSJoseph Pusztay } 803d0c080abSJoseph Pusztay if (ctx->names && !ctx->displaynames) { 804d0c080abSJoseph Pusztay char **displaynames; 805d0c080abSJoseph Pusztay PetscBool flg; 806d0c080abSJoseph Pusztay ierr = VecGetLocalSize(u,&dim);CHKERRQ(ierr); 807d0c080abSJoseph Pusztay ierr = PetscCalloc1(dim+1,&displaynames);CHKERRQ(ierr); 808d0c080abSJoseph Pusztay ierr = PetscOptionsGetStringArray(((PetscObject)ts)->options,((PetscObject)ts)->prefix,"-ts_monitor_lg_solution_variables",displaynames,&dim,&flg);CHKERRQ(ierr); 809d0c080abSJoseph Pusztay if (flg) { 810d0c080abSJoseph Pusztay ierr = TSMonitorLGCtxSetDisplayVariables(ctx,(const char *const *)displaynames);CHKERRQ(ierr); 811d0c080abSJoseph Pusztay } 812d0c080abSJoseph Pusztay ierr = PetscStrArrayDestroy(&displaynames);CHKERRQ(ierr); 813d0c080abSJoseph Pusztay } 814d0c080abSJoseph Pusztay if (ctx->displaynames) { 815d0c080abSJoseph Pusztay ierr = PetscDrawLGSetDimension(ctx->lg,ctx->ndisplayvariables);CHKERRQ(ierr); 816d0c080abSJoseph Pusztay ierr = PetscDrawLGSetLegend(ctx->lg,(const char *const *)ctx->displaynames);CHKERRQ(ierr); 817d0c080abSJoseph Pusztay } else if (ctx->names) { 818d0c080abSJoseph Pusztay ierr = VecGetLocalSize(u,&dim);CHKERRQ(ierr); 819d0c080abSJoseph Pusztay ierr = PetscDrawLGSetDimension(ctx->lg,dim);CHKERRQ(ierr); 820d0c080abSJoseph Pusztay ierr = PetscDrawLGSetLegend(ctx->lg,(const char *const *)ctx->names);CHKERRQ(ierr); 821d0c080abSJoseph Pusztay } else { 822d0c080abSJoseph Pusztay ierr = VecGetLocalSize(u,&dim);CHKERRQ(ierr); 823d0c080abSJoseph Pusztay ierr = PetscDrawLGSetDimension(ctx->lg,dim);CHKERRQ(ierr); 824d0c080abSJoseph Pusztay } 825d0c080abSJoseph Pusztay ierr = PetscDrawLGReset(ctx->lg);CHKERRQ(ierr); 826d0c080abSJoseph Pusztay } 827d0c080abSJoseph Pusztay 828d0c080abSJoseph Pusztay if (!ctx->transform) v = u; 829d0c080abSJoseph Pusztay else {ierr = (*ctx->transform)(ctx->transformctx,u,&v);CHKERRQ(ierr);} 830d0c080abSJoseph Pusztay ierr = VecGetArrayRead(v,&yy);CHKERRQ(ierr); 831d0c080abSJoseph Pusztay if (ctx->displaynames) { 832d0c080abSJoseph Pusztay PetscInt i; 833d0c080abSJoseph Pusztay for (i=0; i<ctx->ndisplayvariables; i++) 834d0c080abSJoseph Pusztay ctx->displayvalues[i] = PetscRealPart(yy[ctx->displayvariables[i]]); 835d0c080abSJoseph Pusztay ierr = PetscDrawLGAddCommonPoint(ctx->lg,ptime,ctx->displayvalues);CHKERRQ(ierr); 836d0c080abSJoseph Pusztay } else { 837d0c080abSJoseph Pusztay #if defined(PETSC_USE_COMPLEX) 838d0c080abSJoseph Pusztay PetscInt i,n; 839d0c080abSJoseph Pusztay PetscReal *yreal; 840d0c080abSJoseph Pusztay ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr); 841d0c080abSJoseph Pusztay ierr = PetscMalloc1(n,&yreal);CHKERRQ(ierr); 842d0c080abSJoseph Pusztay for (i=0; i<n; i++) yreal[i] = PetscRealPart(yy[i]); 843d0c080abSJoseph Pusztay ierr = PetscDrawLGAddCommonPoint(ctx->lg,ptime,yreal);CHKERRQ(ierr); 844d0c080abSJoseph Pusztay ierr = PetscFree(yreal);CHKERRQ(ierr); 845d0c080abSJoseph Pusztay #else 846d0c080abSJoseph Pusztay ierr = PetscDrawLGAddCommonPoint(ctx->lg,ptime,yy);CHKERRQ(ierr); 847d0c080abSJoseph Pusztay #endif 848d0c080abSJoseph Pusztay } 849d0c080abSJoseph Pusztay ierr = VecRestoreArrayRead(v,&yy);CHKERRQ(ierr); 850d0c080abSJoseph Pusztay if (ctx->transform) {ierr = VecDestroy(&v);CHKERRQ(ierr);} 851d0c080abSJoseph Pusztay 852d0c080abSJoseph Pusztay if (((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && ts->reason)) { 853d0c080abSJoseph Pusztay ierr = PetscDrawLGDraw(ctx->lg);CHKERRQ(ierr); 854d0c080abSJoseph Pusztay ierr = PetscDrawLGSave(ctx->lg);CHKERRQ(ierr); 855d0c080abSJoseph Pusztay } 856d0c080abSJoseph Pusztay PetscFunctionReturn(0); 857d0c080abSJoseph Pusztay } 858d0c080abSJoseph Pusztay 859d0c080abSJoseph Pusztay /*@C 860d0c080abSJoseph Pusztay TSMonitorLGSetVariableNames - Sets the name of each component in the solution vector so that it may be displayed in the plot 861d0c080abSJoseph Pusztay 862d0c080abSJoseph Pusztay Collective on TS 863d0c080abSJoseph Pusztay 864d0c080abSJoseph Pusztay Input Parameters: 865d0c080abSJoseph Pusztay + ts - the TS context 866d0c080abSJoseph Pusztay - names - the names of the components, final string must be NULL 867d0c080abSJoseph Pusztay 868d0c080abSJoseph Pusztay Level: intermediate 869d0c080abSJoseph Pusztay 870d0c080abSJoseph Pusztay Notes: 871d0c080abSJoseph Pusztay If the TS object does not have a TSMonitorLGCtx associated with it then this function is ignored 872d0c080abSJoseph Pusztay 873d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorLGSetDisplayVariables(), TSMonitorLGCtxSetVariableNames() 874d0c080abSJoseph Pusztay @*/ 875d0c080abSJoseph Pusztay PetscErrorCode TSMonitorLGSetVariableNames(TS ts,const char * const *names) 876d0c080abSJoseph Pusztay { 877d0c080abSJoseph Pusztay PetscErrorCode ierr; 878d0c080abSJoseph Pusztay PetscInt i; 879d0c080abSJoseph Pusztay 880d0c080abSJoseph Pusztay PetscFunctionBegin; 881d0c080abSJoseph Pusztay for (i=0; i<ts->numbermonitors; i++) { 882d0c080abSJoseph Pusztay if (ts->monitor[i] == TSMonitorLGSolution) { 883d0c080abSJoseph Pusztay ierr = TSMonitorLGCtxSetVariableNames((TSMonitorLGCtx)ts->monitorcontext[i],names);CHKERRQ(ierr); 884d0c080abSJoseph Pusztay break; 885d0c080abSJoseph Pusztay } 886d0c080abSJoseph Pusztay } 887d0c080abSJoseph Pusztay PetscFunctionReturn(0); 888d0c080abSJoseph Pusztay } 889d0c080abSJoseph Pusztay 890d0c080abSJoseph Pusztay /*@C 891d0c080abSJoseph Pusztay TSMonitorLGCtxSetVariableNames - Sets the name of each component in the solution vector so that it may be displayed in the plot 892d0c080abSJoseph Pusztay 893d0c080abSJoseph Pusztay Collective on TS 894d0c080abSJoseph Pusztay 895d0c080abSJoseph Pusztay Input Parameters: 896d0c080abSJoseph Pusztay + ts - the TS context 897d0c080abSJoseph Pusztay - names - the names of the components, final string must be NULL 898d0c080abSJoseph Pusztay 899d0c080abSJoseph Pusztay Level: intermediate 900d0c080abSJoseph Pusztay 901d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorLGSetDisplayVariables(), TSMonitorLGSetVariableNames() 902d0c080abSJoseph Pusztay @*/ 903d0c080abSJoseph Pusztay PetscErrorCode TSMonitorLGCtxSetVariableNames(TSMonitorLGCtx ctx,const char * const *names) 904d0c080abSJoseph Pusztay { 905d0c080abSJoseph Pusztay PetscErrorCode ierr; 906d0c080abSJoseph Pusztay 907d0c080abSJoseph Pusztay PetscFunctionBegin; 908d0c080abSJoseph Pusztay ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr); 909d0c080abSJoseph Pusztay ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr); 910d0c080abSJoseph Pusztay PetscFunctionReturn(0); 911d0c080abSJoseph Pusztay } 912d0c080abSJoseph Pusztay 913d0c080abSJoseph Pusztay /*@C 914d0c080abSJoseph Pusztay TSMonitorLGGetVariableNames - Gets the name of each component in the solution vector so that it may be displayed in the plot 915d0c080abSJoseph Pusztay 916d0c080abSJoseph Pusztay Collective on TS 917d0c080abSJoseph Pusztay 918d0c080abSJoseph Pusztay Input Parameter: 919d0c080abSJoseph Pusztay . ts - the TS context 920d0c080abSJoseph Pusztay 921d0c080abSJoseph Pusztay Output Parameter: 922d0c080abSJoseph Pusztay . names - the names of the components, final string must be NULL 923d0c080abSJoseph Pusztay 924d0c080abSJoseph Pusztay Level: intermediate 925d0c080abSJoseph Pusztay 926d0c080abSJoseph Pusztay Notes: 927d0c080abSJoseph Pusztay If the TS object does not have a TSMonitorLGCtx associated with it then this function is ignored 928d0c080abSJoseph Pusztay 929d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorLGSetDisplayVariables() 930d0c080abSJoseph Pusztay @*/ 931d0c080abSJoseph Pusztay PetscErrorCode TSMonitorLGGetVariableNames(TS ts,const char *const **names) 932d0c080abSJoseph Pusztay { 933d0c080abSJoseph Pusztay PetscInt i; 934d0c080abSJoseph Pusztay 935d0c080abSJoseph Pusztay PetscFunctionBegin; 936d0c080abSJoseph Pusztay *names = NULL; 937d0c080abSJoseph Pusztay for (i=0; i<ts->numbermonitors; i++) { 938d0c080abSJoseph Pusztay if (ts->monitor[i] == TSMonitorLGSolution) { 939d0c080abSJoseph Pusztay TSMonitorLGCtx ctx = (TSMonitorLGCtx) ts->monitorcontext[i]; 940d0c080abSJoseph Pusztay *names = (const char *const *)ctx->names; 941d0c080abSJoseph Pusztay break; 942d0c080abSJoseph Pusztay } 943d0c080abSJoseph Pusztay } 944d0c080abSJoseph Pusztay PetscFunctionReturn(0); 945d0c080abSJoseph Pusztay } 946d0c080abSJoseph Pusztay 947d0c080abSJoseph Pusztay /*@C 948d0c080abSJoseph Pusztay TSMonitorLGCtxSetDisplayVariables - Sets the variables that are to be display in the monitor 949d0c080abSJoseph Pusztay 950d0c080abSJoseph Pusztay Collective on TS 951d0c080abSJoseph Pusztay 952d0c080abSJoseph Pusztay Input Parameters: 953d0c080abSJoseph Pusztay + ctx - the TSMonitorLG context 954d0c080abSJoseph Pusztay - displaynames - the names of the components, final string must be NULL 955d0c080abSJoseph Pusztay 956d0c080abSJoseph Pusztay Level: intermediate 957d0c080abSJoseph Pusztay 958d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorLGSetVariableNames() 959d0c080abSJoseph Pusztay @*/ 960d0c080abSJoseph Pusztay PetscErrorCode TSMonitorLGCtxSetDisplayVariables(TSMonitorLGCtx ctx,const char * const *displaynames) 961d0c080abSJoseph Pusztay { 962d0c080abSJoseph Pusztay PetscInt j = 0,k; 963d0c080abSJoseph Pusztay PetscErrorCode ierr; 964d0c080abSJoseph Pusztay 965d0c080abSJoseph Pusztay PetscFunctionBegin; 966d0c080abSJoseph Pusztay if (!ctx->names) PetscFunctionReturn(0); 967d0c080abSJoseph Pusztay ierr = PetscStrArrayDestroy(&ctx->displaynames);CHKERRQ(ierr); 968d0c080abSJoseph Pusztay ierr = PetscStrArrayallocpy(displaynames,&ctx->displaynames);CHKERRQ(ierr); 969d0c080abSJoseph Pusztay while (displaynames[j]) j++; 970d0c080abSJoseph Pusztay ctx->ndisplayvariables = j; 971d0c080abSJoseph Pusztay ierr = PetscMalloc1(ctx->ndisplayvariables,&ctx->displayvariables);CHKERRQ(ierr); 972d0c080abSJoseph Pusztay ierr = PetscMalloc1(ctx->ndisplayvariables,&ctx->displayvalues);CHKERRQ(ierr); 973d0c080abSJoseph Pusztay j = 0; 974d0c080abSJoseph Pusztay while (displaynames[j]) { 975d0c080abSJoseph Pusztay k = 0; 976d0c080abSJoseph Pusztay while (ctx->names[k]) { 977d0c080abSJoseph Pusztay PetscBool flg; 978d0c080abSJoseph Pusztay ierr = PetscStrcmp(displaynames[j],ctx->names[k],&flg);CHKERRQ(ierr); 979d0c080abSJoseph Pusztay if (flg) { 980d0c080abSJoseph Pusztay ctx->displayvariables[j] = k; 981d0c080abSJoseph Pusztay break; 982d0c080abSJoseph Pusztay } 983d0c080abSJoseph Pusztay k++; 984d0c080abSJoseph Pusztay } 985d0c080abSJoseph Pusztay j++; 986d0c080abSJoseph Pusztay } 987d0c080abSJoseph Pusztay PetscFunctionReturn(0); 988d0c080abSJoseph Pusztay } 989d0c080abSJoseph Pusztay 990d0c080abSJoseph Pusztay /*@C 991d0c080abSJoseph Pusztay TSMonitorLGSetDisplayVariables - Sets the variables that are to be display in the monitor 992d0c080abSJoseph Pusztay 993d0c080abSJoseph Pusztay Collective on TS 994d0c080abSJoseph Pusztay 995d0c080abSJoseph Pusztay Input Parameters: 996d0c080abSJoseph Pusztay + ts - the TS context 997d0c080abSJoseph Pusztay - displaynames - the names of the components, final string must be NULL 998d0c080abSJoseph Pusztay 999d0c080abSJoseph Pusztay Notes: 1000d0c080abSJoseph Pusztay If the TS object does not have a TSMonitorLGCtx associated with it then this function is ignored 1001d0c080abSJoseph Pusztay 1002d0c080abSJoseph Pusztay Level: intermediate 1003d0c080abSJoseph Pusztay 1004d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorLGSetVariableNames() 1005d0c080abSJoseph Pusztay @*/ 1006d0c080abSJoseph Pusztay PetscErrorCode TSMonitorLGSetDisplayVariables(TS ts,const char * const *displaynames) 1007d0c080abSJoseph Pusztay { 1008d0c080abSJoseph Pusztay PetscInt i; 1009d0c080abSJoseph Pusztay PetscErrorCode ierr; 1010d0c080abSJoseph Pusztay 1011d0c080abSJoseph Pusztay PetscFunctionBegin; 1012d0c080abSJoseph Pusztay for (i=0; i<ts->numbermonitors; i++) { 1013d0c080abSJoseph Pusztay if (ts->monitor[i] == TSMonitorLGSolution) { 1014d0c080abSJoseph Pusztay ierr = TSMonitorLGCtxSetDisplayVariables((TSMonitorLGCtx)ts->monitorcontext[i],displaynames);CHKERRQ(ierr); 1015d0c080abSJoseph Pusztay break; 1016d0c080abSJoseph Pusztay } 1017d0c080abSJoseph Pusztay } 1018d0c080abSJoseph Pusztay PetscFunctionReturn(0); 1019d0c080abSJoseph Pusztay } 1020d0c080abSJoseph Pusztay 1021d0c080abSJoseph Pusztay /*@C 1022d0c080abSJoseph Pusztay TSMonitorLGSetTransform - Solution vector will be transformed by provided function before being displayed 1023d0c080abSJoseph Pusztay 1024d0c080abSJoseph Pusztay Collective on TS 1025d0c080abSJoseph Pusztay 1026d0c080abSJoseph Pusztay Input Parameters: 1027d0c080abSJoseph Pusztay + ts - the TS context 1028d0c080abSJoseph Pusztay . transform - the transform function 1029d0c080abSJoseph Pusztay . destroy - function to destroy the optional context 1030d0c080abSJoseph Pusztay - ctx - optional context used by transform function 1031d0c080abSJoseph Pusztay 1032d0c080abSJoseph Pusztay Notes: 1033d0c080abSJoseph Pusztay If the TS object does not have a TSMonitorLGCtx associated with it then this function is ignored 1034d0c080abSJoseph Pusztay 1035d0c080abSJoseph Pusztay Level: intermediate 1036d0c080abSJoseph Pusztay 1037d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorLGSetVariableNames(), TSMonitorLGCtxSetTransform() 1038d0c080abSJoseph Pusztay @*/ 1039d0c080abSJoseph Pusztay PetscErrorCode TSMonitorLGSetTransform(TS ts,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx) 1040d0c080abSJoseph Pusztay { 1041d0c080abSJoseph Pusztay PetscInt i; 1042d0c080abSJoseph Pusztay PetscErrorCode ierr; 1043d0c080abSJoseph Pusztay 1044d0c080abSJoseph Pusztay PetscFunctionBegin; 1045d0c080abSJoseph Pusztay for (i=0; i<ts->numbermonitors; i++) { 1046d0c080abSJoseph Pusztay if (ts->monitor[i] == TSMonitorLGSolution) { 1047d0c080abSJoseph Pusztay ierr = TSMonitorLGCtxSetTransform((TSMonitorLGCtx)ts->monitorcontext[i],transform,destroy,tctx);CHKERRQ(ierr); 1048d0c080abSJoseph Pusztay } 1049d0c080abSJoseph Pusztay } 1050d0c080abSJoseph Pusztay PetscFunctionReturn(0); 1051d0c080abSJoseph Pusztay } 1052d0c080abSJoseph Pusztay 1053d0c080abSJoseph Pusztay /*@C 1054d0c080abSJoseph Pusztay TSMonitorLGCtxSetTransform - Solution vector will be transformed by provided function before being displayed 1055d0c080abSJoseph Pusztay 1056d0c080abSJoseph Pusztay Collective on TSLGCtx 1057d0c080abSJoseph Pusztay 1058d0c080abSJoseph Pusztay Input Parameters: 1059d0c080abSJoseph Pusztay + ts - the TS context 1060d0c080abSJoseph Pusztay . transform - the transform function 1061d0c080abSJoseph Pusztay . destroy - function to destroy the optional context 1062d0c080abSJoseph Pusztay - ctx - optional context used by transform function 1063d0c080abSJoseph Pusztay 1064d0c080abSJoseph Pusztay Level: intermediate 1065d0c080abSJoseph Pusztay 1066d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorLGSetVariableNames(), TSMonitorLGSetTransform() 1067d0c080abSJoseph Pusztay @*/ 1068d0c080abSJoseph Pusztay PetscErrorCode TSMonitorLGCtxSetTransform(TSMonitorLGCtx ctx,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx) 1069d0c080abSJoseph Pusztay { 1070d0c080abSJoseph Pusztay PetscFunctionBegin; 1071d0c080abSJoseph Pusztay ctx->transform = transform; 1072d0c080abSJoseph Pusztay ctx->transformdestroy = destroy; 1073d0c080abSJoseph Pusztay ctx->transformctx = tctx; 1074d0c080abSJoseph Pusztay PetscFunctionReturn(0); 1075d0c080abSJoseph Pusztay } 1076d0c080abSJoseph Pusztay 1077d0c080abSJoseph Pusztay /*@C 1078d0c080abSJoseph Pusztay TSMonitorLGError - Monitors progress of the TS solvers by plotting each component of the error 1079d0c080abSJoseph Pusztay in a time based line graph 1080d0c080abSJoseph Pusztay 1081d0c080abSJoseph Pusztay Collective on TS 1082d0c080abSJoseph Pusztay 1083d0c080abSJoseph Pusztay Input Parameters: 1084d0c080abSJoseph Pusztay + ts - the TS context 1085d0c080abSJoseph Pusztay . step - current time-step 1086d0c080abSJoseph Pusztay . ptime - current time 1087d0c080abSJoseph Pusztay . u - current solution 1088d0c080abSJoseph Pusztay - dctx - TSMonitorLGCtx object created with TSMonitorLGCtxCreate() 1089d0c080abSJoseph Pusztay 1090d0c080abSJoseph Pusztay Level: intermediate 1091d0c080abSJoseph Pusztay 1092d0c080abSJoseph Pusztay Notes: 1093d0c080abSJoseph Pusztay Each process in a parallel run displays its component errors in a separate window 1094d0c080abSJoseph Pusztay 1095d0c080abSJoseph Pusztay The user must provide the solution using TSSetSolutionFunction() to use this monitor. 1096d0c080abSJoseph Pusztay 1097d0c080abSJoseph Pusztay Options Database Keys: 1098d0c080abSJoseph Pusztay . -ts_monitor_lg_error - create a graphical monitor of error history 1099d0c080abSJoseph Pusztay 1100d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSSetSolutionFunction() 1101d0c080abSJoseph Pusztay @*/ 1102d0c080abSJoseph Pusztay PetscErrorCode TSMonitorLGError(TS ts,PetscInt step,PetscReal ptime,Vec u,void *dummy) 1103d0c080abSJoseph Pusztay { 1104d0c080abSJoseph Pusztay PetscErrorCode ierr; 1105d0c080abSJoseph Pusztay TSMonitorLGCtx ctx = (TSMonitorLGCtx)dummy; 1106d0c080abSJoseph Pusztay const PetscScalar *yy; 1107d0c080abSJoseph Pusztay Vec y; 1108d0c080abSJoseph Pusztay 1109d0c080abSJoseph Pusztay PetscFunctionBegin; 1110d0c080abSJoseph Pusztay if (!step) { 1111d0c080abSJoseph Pusztay PetscDrawAxis axis; 1112d0c080abSJoseph Pusztay PetscInt dim; 1113d0c080abSJoseph Pusztay ierr = PetscDrawLGGetAxis(ctx->lg,&axis);CHKERRQ(ierr); 1114d0c080abSJoseph Pusztay ierr = PetscDrawAxisSetLabels(axis,"Error in solution as function of time","Time","Error");CHKERRQ(ierr); 1115d0c080abSJoseph Pusztay ierr = VecGetLocalSize(u,&dim);CHKERRQ(ierr); 1116d0c080abSJoseph Pusztay ierr = PetscDrawLGSetDimension(ctx->lg,dim);CHKERRQ(ierr); 1117d0c080abSJoseph Pusztay ierr = PetscDrawLGReset(ctx->lg);CHKERRQ(ierr); 1118d0c080abSJoseph Pusztay } 1119d0c080abSJoseph Pusztay ierr = VecDuplicate(u,&y);CHKERRQ(ierr); 1120d0c080abSJoseph Pusztay ierr = TSComputeSolutionFunction(ts,ptime,y);CHKERRQ(ierr); 1121d0c080abSJoseph Pusztay ierr = VecAXPY(y,-1.0,u);CHKERRQ(ierr); 1122d0c080abSJoseph Pusztay ierr = VecGetArrayRead(y,&yy);CHKERRQ(ierr); 1123d0c080abSJoseph Pusztay #if defined(PETSC_USE_COMPLEX) 1124d0c080abSJoseph Pusztay { 1125d0c080abSJoseph Pusztay PetscReal *yreal; 1126d0c080abSJoseph Pusztay PetscInt i,n; 1127d0c080abSJoseph Pusztay ierr = VecGetLocalSize(y,&n);CHKERRQ(ierr); 1128d0c080abSJoseph Pusztay ierr = PetscMalloc1(n,&yreal);CHKERRQ(ierr); 1129d0c080abSJoseph Pusztay for (i=0; i<n; i++) yreal[i] = PetscRealPart(yy[i]); 1130d0c080abSJoseph Pusztay ierr = PetscDrawLGAddCommonPoint(ctx->lg,ptime,yreal);CHKERRQ(ierr); 1131d0c080abSJoseph Pusztay ierr = PetscFree(yreal);CHKERRQ(ierr); 1132d0c080abSJoseph Pusztay } 1133d0c080abSJoseph Pusztay #else 1134d0c080abSJoseph Pusztay ierr = PetscDrawLGAddCommonPoint(ctx->lg,ptime,yy);CHKERRQ(ierr); 1135d0c080abSJoseph Pusztay #endif 1136d0c080abSJoseph Pusztay ierr = VecRestoreArrayRead(y,&yy);CHKERRQ(ierr); 1137d0c080abSJoseph Pusztay ierr = VecDestroy(&y);CHKERRQ(ierr); 1138d0c080abSJoseph Pusztay if (((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && ts->reason)) { 1139d0c080abSJoseph Pusztay ierr = PetscDrawLGDraw(ctx->lg);CHKERRQ(ierr); 1140d0c080abSJoseph Pusztay ierr = PetscDrawLGSave(ctx->lg);CHKERRQ(ierr); 1141d0c080abSJoseph Pusztay } 1142d0c080abSJoseph Pusztay PetscFunctionReturn(0); 1143d0c080abSJoseph Pusztay } 1144d0c080abSJoseph Pusztay 1145d0c080abSJoseph Pusztay /*@C 1146d0c080abSJoseph Pusztay TSMonitorSPSwarmSolution - Graphically displays phase plots of DMSwarm particles on a scatter plot 1147d0c080abSJoseph Pusztay 1148d0c080abSJoseph Pusztay Input Parameters: 1149d0c080abSJoseph Pusztay + ts - the TS context 1150d0c080abSJoseph Pusztay . step - current time-step 1151d0c080abSJoseph Pusztay . ptime - current time 1152d0c080abSJoseph Pusztay . u - current solution 1153d0c080abSJoseph Pusztay - dctx - the TSMonitorSPCtx object that contains all the options for the monitoring, this is created with TSMonitorSPCtxCreate() 1154d0c080abSJoseph Pusztay 1155d0c080abSJoseph Pusztay Options Database: 1156d7462660SMatthew Knepley + -ts_monitor_sp_swarm <n> - Monitor the solution every n steps, or -1 for plotting only the final solution 1157d7462660SMatthew Knepley . -ts_monitor_sp_swarm_retain <n> - Retain n old points so we can see the history, or -1 for all points 1158d7462660SMatthew Knepley - -ts_monitor_sp_swarm_phase <bool> - Plot in phase space, as opposed to coordinate space 1159d0c080abSJoseph Pusztay 1160d0c080abSJoseph Pusztay Level: intermediate 1161d0c080abSJoseph Pusztay 1162d7462660SMatthew Knepley .seealso: TSMonitoSet() 1163d0c080abSJoseph Pusztay @*/ 1164d0c080abSJoseph Pusztay PetscErrorCode TSMonitorSPSwarmSolution(TS ts, PetscInt step, PetscReal ptime, Vec u, void *dctx) 1165d0c080abSJoseph Pusztay { 1166d0c080abSJoseph Pusztay TSMonitorSPCtx ctx = (TSMonitorSPCtx) dctx; 1167d7462660SMatthew Knepley DM dm, cdm; 1168d0c080abSJoseph Pusztay const PetscScalar *yy; 1169d0c080abSJoseph Pusztay PetscReal *y, *x; 1170d0c080abSJoseph Pusztay PetscInt Np, p, dim = 2; 1171d7462660SMatthew Knepley PetscErrorCode ierr; 1172d0c080abSJoseph Pusztay 1173d0c080abSJoseph Pusztay PetscFunctionBegin; 1174d0c080abSJoseph Pusztay if (step < 0) PetscFunctionReturn(0); /* -1 indicates interpolated solution */ 1175d0c080abSJoseph Pusztay if (!step) { 1176d0c080abSJoseph Pusztay PetscDrawAxis axis; 1177ab43fcacSJoe Pusztay PetscReal dmboxlower[2], dmboxupper[2]; 1178d0c080abSJoseph Pusztay ierr = TSGetDM(ts, &dm);CHKERRQ(ierr); 1179d8185827SBarry Smith ierr = DMGetDimension(dm, &dim);CHKERRQ(ierr); 1180d7462660SMatthew Knepley if (dim != 2) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Monitor only supports two dimensional fields"); 1181ab43fcacSJoe Pusztay ierr = DMSwarmGetCellDM(dm, &cdm);CHKERRQ(ierr); 1182ab43fcacSJoe Pusztay ierr = DMGetBoundingBox(cdm, dmboxlower, dmboxupper);CHKERRQ(ierr); 1183d0c080abSJoseph Pusztay ierr = VecGetLocalSize(u, &Np);CHKERRQ(ierr); 1184d7462660SMatthew Knepley Np /= dim*2; 1185ab43fcacSJoe Pusztay ierr = PetscDrawSPGetAxis(ctx->sp,&axis);CHKERRQ(ierr); 1186ab43fcacSJoe Pusztay ierr = PetscDrawAxisSetLabels(axis,"Particles","X","V");CHKERRQ(ierr); 1187ab43fcacSJoe Pusztay ierr = PetscDrawAxisSetLimits(axis, dmboxlower[0], dmboxupper[0], -5, 5);CHKERRQ(ierr); 1188ab43fcacSJoe Pusztay ierr = PetscDrawAxisSetHoldLimits(axis, PETSC_TRUE);CHKERRQ(ierr); 1189d0c080abSJoseph Pusztay ierr = PetscDrawSPSetDimension(ctx->sp, Np);CHKERRQ(ierr); 1190d0c080abSJoseph Pusztay ierr = PetscDrawSPReset(ctx->sp);CHKERRQ(ierr); 1191d0c080abSJoseph Pusztay } 1192d0c080abSJoseph Pusztay ierr = VecGetLocalSize(u, &Np);CHKERRQ(ierr); 1193d7462660SMatthew Knepley Np /= dim*2; 1194d0c080abSJoseph Pusztay ierr = VecGetArrayRead(u,&yy);CHKERRQ(ierr); 1195d0c080abSJoseph Pusztay ierr = PetscMalloc2(Np, &x, Np, &y);CHKERRQ(ierr); 1196d0c080abSJoseph Pusztay /* get points from solution vector */ 1197d0c080abSJoseph Pusztay for (p = 0; p < Np; ++p) { 1198d7462660SMatthew Knepley if (ctx->phase) { 1199d7462660SMatthew Knepley x[p] = PetscRealPart(yy[p*dim*2]); 1200d7462660SMatthew Knepley y[p] = PetscRealPart(yy[p*dim*2 + dim]); 1201d7462660SMatthew Knepley } else { 1202d7462660SMatthew Knepley x[p] = PetscRealPart(yy[p*dim*2]); 1203d7462660SMatthew Knepley y[p] = PetscRealPart(yy[p*dim*2 + 1]); 1204d7462660SMatthew Knepley } 1205d0c080abSJoseph Pusztay } 1206d0c080abSJoseph Pusztay ierr = VecRestoreArrayRead(u,&yy);CHKERRQ(ierr); 1207d0c080abSJoseph Pusztay if (((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && ts->reason)) { 1208ab43fcacSJoe Pusztay PetscDraw draw; 1209ab43fcacSJoe Pusztay ierr = PetscDrawSPGetDraw(ctx->sp, &draw);CHKERRQ(ierr); 1210d7462660SMatthew Knepley if ((ctx->retain == 0) || (ctx->retain > 0 && !(step % ctx->retain))) { 1211ab43fcacSJoe Pusztay ierr = PetscDrawClear(draw);CHKERRQ(ierr); 1212d7462660SMatthew Knepley } 1213ab43fcacSJoe Pusztay ierr = PetscDrawFlush(draw);CHKERRQ(ierr); 1214ab43fcacSJoe Pusztay ierr = PetscDrawSPReset(ctx->sp);CHKERRQ(ierr); 1215d0c080abSJoseph Pusztay ierr = PetscDrawSPAddPoint(ctx->sp, x, y);CHKERRQ(ierr); 1216d0c080abSJoseph Pusztay ierr = PetscDrawSPDraw(ctx->sp, PETSC_FALSE);CHKERRQ(ierr); 1217d0c080abSJoseph Pusztay ierr = PetscDrawSPSave(ctx->sp);CHKERRQ(ierr); 1218d0c080abSJoseph Pusztay } 1219d0c080abSJoseph Pusztay ierr = PetscFree2(x, y);CHKERRQ(ierr); 1220d0c080abSJoseph Pusztay PetscFunctionReturn(0); 1221d0c080abSJoseph Pusztay } 1222d0c080abSJoseph Pusztay 1223d0c080abSJoseph Pusztay /*@C 1224d0c080abSJoseph Pusztay TSMonitorError - Monitors progress of the TS solvers by printing the 2 norm of the error at each timestep 1225d0c080abSJoseph Pusztay 1226d0c080abSJoseph Pusztay Collective on TS 1227d0c080abSJoseph Pusztay 1228d0c080abSJoseph Pusztay Input Parameters: 1229d0c080abSJoseph Pusztay + ts - the TS context 1230d0c080abSJoseph Pusztay . step - current time-step 1231d0c080abSJoseph Pusztay . ptime - current time 1232d0c080abSJoseph Pusztay . u - current solution 1233d0c080abSJoseph Pusztay - dctx - unused context 1234d0c080abSJoseph Pusztay 1235d0c080abSJoseph Pusztay Level: intermediate 1236d0c080abSJoseph Pusztay 1237d0c080abSJoseph Pusztay The user must provide the solution using TSSetSolutionFunction() to use this monitor. 1238d0c080abSJoseph Pusztay 1239d0c080abSJoseph Pusztay Options Database Keys: 1240d0c080abSJoseph Pusztay . -ts_monitor_error - create a graphical monitor of error history 1241d0c080abSJoseph Pusztay 1242d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSSetSolutionFunction() 1243d0c080abSJoseph Pusztay @*/ 1244d0c080abSJoseph Pusztay PetscErrorCode TSMonitorError(TS ts,PetscInt step,PetscReal ptime,Vec u,PetscViewerAndFormat *vf) 1245d0c080abSJoseph Pusztay { 1246*07eaae0cSMatthew G. Knepley DM dm; 1247*07eaae0cSMatthew G. Knepley PetscDS ds = NULL; 1248*07eaae0cSMatthew G. Knepley PetscInt Nf = -1, f; 1249d0c080abSJoseph Pusztay PetscBool flg; 1250*07eaae0cSMatthew G. Knepley PetscErrorCode ierr; 1251d0c080abSJoseph Pusztay 1252d0c080abSJoseph Pusztay PetscFunctionBegin; 1253*07eaae0cSMatthew G. Knepley ierr = TSGetDM(ts, &dm);CHKERRQ(ierr); 1254*07eaae0cSMatthew G. Knepley if (dm) {ierr = DMGetDS(dm, &ds);CHKERRQ(ierr);} 1255*07eaae0cSMatthew G. Knepley if (ds) {ierr = PetscDSGetNumFields(ds, &Nf);CHKERRQ(ierr);} 1256*07eaae0cSMatthew G. Knepley if (Nf <= 0) { 1257*07eaae0cSMatthew G. Knepley Vec y; 1258*07eaae0cSMatthew G. Knepley PetscReal nrm; 1259*07eaae0cSMatthew G. Knepley 1260d0c080abSJoseph Pusztay ierr = VecDuplicate(u,&y);CHKERRQ(ierr); 1261d0c080abSJoseph Pusztay ierr = TSComputeSolutionFunction(ts,ptime,y);CHKERRQ(ierr); 1262d0c080abSJoseph Pusztay ierr = VecAXPY(y,-1.0,u);CHKERRQ(ierr); 1263d0c080abSJoseph Pusztay ierr = PetscObjectTypeCompare((PetscObject)vf->viewer,PETSCVIEWERASCII,&flg);CHKERRQ(ierr); 1264d0c080abSJoseph Pusztay if (flg) { 1265d0c080abSJoseph Pusztay ierr = VecNorm(y,NORM_2,&nrm);CHKERRQ(ierr); 1266d0c080abSJoseph Pusztay ierr = PetscViewerASCIIPrintf(vf->viewer,"2-norm of error %g\n",(double)nrm);CHKERRQ(ierr); 1267d0c080abSJoseph Pusztay } 1268d0c080abSJoseph Pusztay ierr = PetscObjectTypeCompare((PetscObject)vf->viewer,PETSCVIEWERDRAW,&flg);CHKERRQ(ierr); 1269d0c080abSJoseph Pusztay if (flg) { 1270d0c080abSJoseph Pusztay ierr = VecView(y,vf->viewer);CHKERRQ(ierr); 1271d0c080abSJoseph Pusztay } 1272d0c080abSJoseph Pusztay ierr = VecDestroy(&y);CHKERRQ(ierr); 1273*07eaae0cSMatthew G. Knepley } else { 1274*07eaae0cSMatthew G. Knepley PetscErrorCode (**exactFuncs)(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nf, PetscScalar *u, void *ctx); 1275*07eaae0cSMatthew G. Knepley void **ctxs; 1276*07eaae0cSMatthew G. Knepley Vec v; 1277*07eaae0cSMatthew G. Knepley PetscReal ferrors[1]; 1278*07eaae0cSMatthew G. Knepley 1279*07eaae0cSMatthew G. Knepley ierr = PetscMalloc2(Nf, &exactFuncs, Nf, &ctxs);CHKERRQ(ierr); 1280*07eaae0cSMatthew G. Knepley for (f = 0; f < Nf; ++f) {ierr = PetscDSGetExactSolution(ds, f, &exactFuncs[f], &ctxs[f]);CHKERRQ(ierr);} 1281*07eaae0cSMatthew G. Knepley ierr = DMComputeL2FieldDiff(dm, ptime, exactFuncs, ctxs, u, ferrors);CHKERRQ(ierr); 1282*07eaae0cSMatthew G. Knepley ierr = PetscPrintf(PETSC_COMM_WORLD, "Timestep: %04d time = %-8.4g \t L_2 Error: [", (int) step, (double) ptime);CHKERRQ(ierr); 1283*07eaae0cSMatthew G. Knepley for (f = 0; f < Nf; ++f) { 1284*07eaae0cSMatthew G. Knepley if (f > 0) {ierr = PetscPrintf(PETSC_COMM_WORLD, ", ");CHKERRQ(ierr);} 1285*07eaae0cSMatthew G. Knepley ierr = PetscPrintf(PETSC_COMM_WORLD, "%2.3g", (double) ferrors[f]);CHKERRQ(ierr); 1286*07eaae0cSMatthew G. Knepley } 1287*07eaae0cSMatthew G. Knepley ierr = PetscPrintf(PETSC_COMM_WORLD, "]\n");CHKERRQ(ierr); 1288*07eaae0cSMatthew G. Knepley 1289*07eaae0cSMatthew G. Knepley ierr = VecViewFromOptions(u, NULL, "-sol_vec_view");CHKERRQ(ierr); 1290*07eaae0cSMatthew G. Knepley 1291*07eaae0cSMatthew G. Knepley ierr = PetscOptionsHasName(NULL, NULL, "-exact_vec_view", &flg);CHKERRQ(ierr); 1292*07eaae0cSMatthew G. Knepley if (flg) { 1293*07eaae0cSMatthew G. Knepley ierr = DMGetGlobalVector(dm, &v);CHKERRQ(ierr); 1294*07eaae0cSMatthew G. Knepley ierr = DMProjectFunction(dm, ptime, exactFuncs, ctxs, INSERT_ALL_VALUES, v);CHKERRQ(ierr); 1295*07eaae0cSMatthew G. Knepley ierr = PetscObjectSetName((PetscObject) v, "Exact Solution");CHKERRQ(ierr); 1296*07eaae0cSMatthew G. Knepley ierr = VecViewFromOptions(v, NULL, "-exact_vec_view");CHKERRQ(ierr); 1297*07eaae0cSMatthew G. Knepley ierr = DMRestoreGlobalVector(dm, &v);CHKERRQ(ierr); 1298*07eaae0cSMatthew G. Knepley } 1299*07eaae0cSMatthew G. Knepley ierr = PetscFree2(exactFuncs, ctxs);CHKERRQ(ierr); 1300*07eaae0cSMatthew G. Knepley } 1301d0c080abSJoseph Pusztay PetscFunctionReturn(0); 1302d0c080abSJoseph Pusztay } 1303d0c080abSJoseph Pusztay 1304d0c080abSJoseph Pusztay PetscErrorCode TSMonitorLGSNESIterations(TS ts,PetscInt n,PetscReal ptime,Vec v,void *monctx) 1305d0c080abSJoseph Pusztay { 1306d0c080abSJoseph Pusztay TSMonitorLGCtx ctx = (TSMonitorLGCtx) monctx; 1307d0c080abSJoseph Pusztay PetscReal x = ptime,y; 1308d0c080abSJoseph Pusztay PetscErrorCode ierr; 1309d0c080abSJoseph Pusztay PetscInt its; 1310d0c080abSJoseph Pusztay 1311d0c080abSJoseph Pusztay PetscFunctionBegin; 1312d0c080abSJoseph Pusztay if (n < 0) PetscFunctionReturn(0); /* -1 indicates interpolated solution */ 1313d0c080abSJoseph Pusztay if (!n) { 1314d0c080abSJoseph Pusztay PetscDrawAxis axis; 1315d0c080abSJoseph Pusztay ierr = PetscDrawLGGetAxis(ctx->lg,&axis);CHKERRQ(ierr); 1316d0c080abSJoseph Pusztay ierr = PetscDrawAxisSetLabels(axis,"Nonlinear iterations as function of time","Time","SNES Iterations");CHKERRQ(ierr); 1317d0c080abSJoseph Pusztay ierr = PetscDrawLGReset(ctx->lg);CHKERRQ(ierr); 1318d0c080abSJoseph Pusztay ctx->snes_its = 0; 1319d0c080abSJoseph Pusztay } 1320d0c080abSJoseph Pusztay ierr = TSGetSNESIterations(ts,&its);CHKERRQ(ierr); 1321d0c080abSJoseph Pusztay y = its - ctx->snes_its; 1322d0c080abSJoseph Pusztay ierr = PetscDrawLGAddPoint(ctx->lg,&x,&y);CHKERRQ(ierr); 1323d0c080abSJoseph Pusztay if (((ctx->howoften > 0) && (!(n % ctx->howoften)) && (n > -1)) || ((ctx->howoften == -1) && (n == -1))) { 1324d0c080abSJoseph Pusztay ierr = PetscDrawLGDraw(ctx->lg);CHKERRQ(ierr); 1325d0c080abSJoseph Pusztay ierr = PetscDrawLGSave(ctx->lg);CHKERRQ(ierr); 1326d0c080abSJoseph Pusztay } 1327d0c080abSJoseph Pusztay ctx->snes_its = its; 1328d0c080abSJoseph Pusztay PetscFunctionReturn(0); 1329d0c080abSJoseph Pusztay } 1330d0c080abSJoseph Pusztay 1331d0c080abSJoseph Pusztay PetscErrorCode TSMonitorLGKSPIterations(TS ts,PetscInt n,PetscReal ptime,Vec v,void *monctx) 1332d0c080abSJoseph Pusztay { 1333d0c080abSJoseph Pusztay TSMonitorLGCtx ctx = (TSMonitorLGCtx) monctx; 1334d0c080abSJoseph Pusztay PetscReal x = ptime,y; 1335d0c080abSJoseph Pusztay PetscErrorCode ierr; 1336d0c080abSJoseph Pusztay PetscInt its; 1337d0c080abSJoseph Pusztay 1338d0c080abSJoseph Pusztay PetscFunctionBegin; 1339d0c080abSJoseph Pusztay if (n < 0) PetscFunctionReturn(0); /* -1 indicates interpolated solution */ 1340d0c080abSJoseph Pusztay if (!n) { 1341d0c080abSJoseph Pusztay PetscDrawAxis axis; 1342d0c080abSJoseph Pusztay ierr = PetscDrawLGGetAxis(ctx->lg,&axis);CHKERRQ(ierr); 1343d0c080abSJoseph Pusztay ierr = PetscDrawAxisSetLabels(axis,"Linear iterations as function of time","Time","KSP Iterations");CHKERRQ(ierr); 1344d0c080abSJoseph Pusztay ierr = PetscDrawLGReset(ctx->lg);CHKERRQ(ierr); 1345d0c080abSJoseph Pusztay ctx->ksp_its = 0; 1346d0c080abSJoseph Pusztay } 1347d0c080abSJoseph Pusztay ierr = TSGetKSPIterations(ts,&its);CHKERRQ(ierr); 1348d0c080abSJoseph Pusztay y = its - ctx->ksp_its; 1349d0c080abSJoseph Pusztay ierr = PetscDrawLGAddPoint(ctx->lg,&x,&y);CHKERRQ(ierr); 1350d0c080abSJoseph Pusztay if (((ctx->howoften > 0) && (!(n % ctx->howoften)) && (n > -1)) || ((ctx->howoften == -1) && (n == -1))) { 1351d0c080abSJoseph Pusztay ierr = PetscDrawLGDraw(ctx->lg);CHKERRQ(ierr); 1352d0c080abSJoseph Pusztay ierr = PetscDrawLGSave(ctx->lg);CHKERRQ(ierr); 1353d0c080abSJoseph Pusztay } 1354d0c080abSJoseph Pusztay ctx->ksp_its = its; 1355d0c080abSJoseph Pusztay PetscFunctionReturn(0); 1356d0c080abSJoseph Pusztay } 1357d0c080abSJoseph Pusztay 1358d0c080abSJoseph Pusztay /*@C 1359d0c080abSJoseph Pusztay TSMonitorEnvelopeCtxCreate - Creates a context for use with TSMonitorEnvelope() 1360d0c080abSJoseph Pusztay 1361d0c080abSJoseph Pusztay Collective on TS 1362d0c080abSJoseph Pusztay 1363d0c080abSJoseph Pusztay Input Parameters: 1364d0c080abSJoseph Pusztay . ts - the ODE solver object 1365d0c080abSJoseph Pusztay 1366d0c080abSJoseph Pusztay Output Parameter: 1367d0c080abSJoseph Pusztay . ctx - the context 1368d0c080abSJoseph Pusztay 1369d0c080abSJoseph Pusztay Level: intermediate 1370d0c080abSJoseph Pusztay 1371d0c080abSJoseph Pusztay .seealso: TSMonitorLGTimeStep(), TSMonitorSet(), TSMonitorLGSolution(), TSMonitorLGError() 1372d0c080abSJoseph Pusztay 1373d0c080abSJoseph Pusztay @*/ 1374d0c080abSJoseph Pusztay PetscErrorCode TSMonitorEnvelopeCtxCreate(TS ts,TSMonitorEnvelopeCtx *ctx) 1375d0c080abSJoseph Pusztay { 1376d0c080abSJoseph Pusztay PetscErrorCode ierr; 1377d0c080abSJoseph Pusztay 1378d0c080abSJoseph Pusztay PetscFunctionBegin; 1379d0c080abSJoseph Pusztay ierr = PetscNew(ctx);CHKERRQ(ierr); 1380d0c080abSJoseph Pusztay PetscFunctionReturn(0); 1381d0c080abSJoseph Pusztay } 1382d0c080abSJoseph Pusztay 1383d0c080abSJoseph Pusztay /*@C 1384d0c080abSJoseph Pusztay TSMonitorEnvelope - Monitors the maximum and minimum value of each component of the solution 1385d0c080abSJoseph Pusztay 1386d0c080abSJoseph Pusztay Collective on TS 1387d0c080abSJoseph Pusztay 1388d0c080abSJoseph Pusztay Input Parameters: 1389d0c080abSJoseph Pusztay + ts - the TS context 1390d0c080abSJoseph Pusztay . step - current time-step 1391d0c080abSJoseph Pusztay . ptime - current time 1392d0c080abSJoseph Pusztay . u - current solution 1393d0c080abSJoseph Pusztay - dctx - the envelope context 1394d0c080abSJoseph Pusztay 1395d0c080abSJoseph Pusztay Options Database: 1396d0c080abSJoseph Pusztay . -ts_monitor_envelope 1397d0c080abSJoseph Pusztay 1398d0c080abSJoseph Pusztay Level: intermediate 1399d0c080abSJoseph Pusztay 1400d0c080abSJoseph Pusztay Notes: 1401d0c080abSJoseph Pusztay after a solve you can use TSMonitorEnvelopeGetBounds() to access the envelope 1402d0c080abSJoseph Pusztay 1403d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorEnvelopeGetBounds(), TSMonitorEnvelopeCtxCreate() 1404d0c080abSJoseph Pusztay @*/ 1405d0c080abSJoseph Pusztay PetscErrorCode TSMonitorEnvelope(TS ts,PetscInt step,PetscReal ptime,Vec u,void *dctx) 1406d0c080abSJoseph Pusztay { 1407d0c080abSJoseph Pusztay PetscErrorCode ierr; 1408d0c080abSJoseph Pusztay TSMonitorEnvelopeCtx ctx = (TSMonitorEnvelopeCtx)dctx; 1409d0c080abSJoseph Pusztay 1410d0c080abSJoseph Pusztay PetscFunctionBegin; 1411d0c080abSJoseph Pusztay if (!ctx->max) { 1412d0c080abSJoseph Pusztay ierr = VecDuplicate(u,&ctx->max);CHKERRQ(ierr); 1413d0c080abSJoseph Pusztay ierr = VecDuplicate(u,&ctx->min);CHKERRQ(ierr); 1414d0c080abSJoseph Pusztay ierr = VecCopy(u,ctx->max);CHKERRQ(ierr); 1415d0c080abSJoseph Pusztay ierr = VecCopy(u,ctx->min);CHKERRQ(ierr); 1416d0c080abSJoseph Pusztay } else { 1417d0c080abSJoseph Pusztay ierr = VecPointwiseMax(ctx->max,u,ctx->max);CHKERRQ(ierr); 1418d0c080abSJoseph Pusztay ierr = VecPointwiseMin(ctx->min,u,ctx->min);CHKERRQ(ierr); 1419d0c080abSJoseph Pusztay } 1420d0c080abSJoseph Pusztay PetscFunctionReturn(0); 1421d0c080abSJoseph Pusztay } 1422d0c080abSJoseph Pusztay 1423d0c080abSJoseph Pusztay /*@C 1424d0c080abSJoseph Pusztay TSMonitorEnvelopeGetBounds - Gets the bounds for the components of the solution 1425d0c080abSJoseph Pusztay 1426d0c080abSJoseph Pusztay Collective on TS 1427d0c080abSJoseph Pusztay 1428d0c080abSJoseph Pusztay Input Parameter: 1429d0c080abSJoseph Pusztay . ts - the TS context 1430d0c080abSJoseph Pusztay 1431d8d19677SJose E. Roman Output Parameters: 1432d0c080abSJoseph Pusztay + max - the maximum values 1433d0c080abSJoseph Pusztay - min - the minimum values 1434d0c080abSJoseph Pusztay 1435d0c080abSJoseph Pusztay Notes: 1436d0c080abSJoseph Pusztay If the TS does not have a TSMonitorEnvelopeCtx associated with it then this function is ignored 1437d0c080abSJoseph Pusztay 1438d0c080abSJoseph Pusztay Level: intermediate 1439d0c080abSJoseph Pusztay 1440d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), VecView(), TSMonitorLGSetDisplayVariables() 1441d0c080abSJoseph Pusztay @*/ 1442d0c080abSJoseph Pusztay PetscErrorCode TSMonitorEnvelopeGetBounds(TS ts,Vec *max,Vec *min) 1443d0c080abSJoseph Pusztay { 1444d0c080abSJoseph Pusztay PetscInt i; 1445d0c080abSJoseph Pusztay 1446d0c080abSJoseph Pusztay PetscFunctionBegin; 1447d0c080abSJoseph Pusztay if (max) *max = NULL; 1448d0c080abSJoseph Pusztay if (min) *min = NULL; 1449d0c080abSJoseph Pusztay for (i=0; i<ts->numbermonitors; i++) { 1450d0c080abSJoseph Pusztay if (ts->monitor[i] == TSMonitorEnvelope) { 1451d0c080abSJoseph Pusztay TSMonitorEnvelopeCtx ctx = (TSMonitorEnvelopeCtx) ts->monitorcontext[i]; 1452d0c080abSJoseph Pusztay if (max) *max = ctx->max; 1453d0c080abSJoseph Pusztay if (min) *min = ctx->min; 1454d0c080abSJoseph Pusztay break; 1455d0c080abSJoseph Pusztay } 1456d0c080abSJoseph Pusztay } 1457d0c080abSJoseph Pusztay PetscFunctionReturn(0); 1458d0c080abSJoseph Pusztay } 1459d0c080abSJoseph Pusztay 1460d0c080abSJoseph Pusztay /*@C 1461d0c080abSJoseph Pusztay TSMonitorEnvelopeCtxDestroy - Destroys a context that was created with TSMonitorEnvelopeCtxCreate(). 1462d0c080abSJoseph Pusztay 1463d0c080abSJoseph Pusztay Collective on TSMonitorEnvelopeCtx 1464d0c080abSJoseph Pusztay 1465d0c080abSJoseph Pusztay Input Parameter: 1466d0c080abSJoseph Pusztay . ctx - the monitor context 1467d0c080abSJoseph Pusztay 1468d0c080abSJoseph Pusztay Level: intermediate 1469d0c080abSJoseph Pusztay 1470d0c080abSJoseph Pusztay .seealso: TSMonitorLGCtxCreate(), TSMonitorSet(), TSMonitorLGTimeStep() 1471d0c080abSJoseph Pusztay @*/ 1472d0c080abSJoseph Pusztay PetscErrorCode TSMonitorEnvelopeCtxDestroy(TSMonitorEnvelopeCtx *ctx) 1473d0c080abSJoseph Pusztay { 1474d0c080abSJoseph Pusztay PetscErrorCode ierr; 1475d0c080abSJoseph Pusztay 1476d0c080abSJoseph Pusztay PetscFunctionBegin; 1477d0c080abSJoseph Pusztay ierr = VecDestroy(&(*ctx)->min);CHKERRQ(ierr); 1478d0c080abSJoseph Pusztay ierr = VecDestroy(&(*ctx)->max);CHKERRQ(ierr); 1479d0c080abSJoseph Pusztay ierr = PetscFree(*ctx);CHKERRQ(ierr); 1480d0c080abSJoseph Pusztay PetscFunctionReturn(0); 1481d0c080abSJoseph Pusztay } 1482d0c080abSJoseph Pusztay 1483d0c080abSJoseph Pusztay /*@C 1484d0c080abSJoseph Pusztay TSDMSwarmMonitorMoments - Monitors the first three moments of a DMSarm being evolved by the TS 1485d0c080abSJoseph Pusztay 1486d0c080abSJoseph Pusztay Not collective 1487d0c080abSJoseph Pusztay 1488d0c080abSJoseph Pusztay Input Parameters: 1489d0c080abSJoseph Pusztay + ts - the TS context 1490d0c080abSJoseph Pusztay . step - current timestep 1491d0c080abSJoseph Pusztay . t - current time 1492d0c080abSJoseph Pusztay . u - current solution 1493d0c080abSJoseph Pusztay - ctx - not used 1494d0c080abSJoseph Pusztay 1495d0c080abSJoseph Pusztay Options Database: 1496d0c080abSJoseph Pusztay . -ts_dmswarm_monitor_moments 1497d0c080abSJoseph Pusztay 1498d0c080abSJoseph Pusztay Level: intermediate 1499d0c080abSJoseph Pusztay 1500d0c080abSJoseph Pusztay Notes: 1501d0c080abSJoseph Pusztay This requires a DMSwarm be attached to the TS. 1502d0c080abSJoseph Pusztay 1503d0c080abSJoseph Pusztay .seealso: TSMonitorSet(), TSMonitorDefault(), DMSWARM 1504d0c080abSJoseph Pusztay @*/ 1505d0c080abSJoseph Pusztay PetscErrorCode TSDMSwarmMonitorMoments(TS ts, PetscInt step, PetscReal t, Vec U, PetscViewerAndFormat *vf) 1506d0c080abSJoseph Pusztay { 1507d0c080abSJoseph Pusztay DM sw; 1508d0c080abSJoseph Pusztay const PetscScalar *u; 1509d0c080abSJoseph Pusztay PetscReal m = 1.0, totE = 0., totMom[3] = {0., 0., 0.}; 1510d0c080abSJoseph Pusztay PetscInt dim, d, Np, p; 1511d0c080abSJoseph Pusztay MPI_Comm comm; 1512d0c080abSJoseph Pusztay PetscErrorCode ierr; 1513d0c080abSJoseph Pusztay 1514d0c080abSJoseph Pusztay PetscFunctionBeginUser; 1515d0c080abSJoseph Pusztay ierr = TSGetDM(ts, &sw);CHKERRQ(ierr); 1516d0c080abSJoseph Pusztay if (!sw || step%ts->monitorFrequency != 0) PetscFunctionReturn(0); 1517d0c080abSJoseph Pusztay ierr = PetscObjectGetComm((PetscObject) ts, &comm);CHKERRQ(ierr); 1518d0c080abSJoseph Pusztay ierr = DMGetDimension(sw, &dim);CHKERRQ(ierr); 1519d0c080abSJoseph Pusztay ierr = VecGetLocalSize(U, &Np);CHKERRQ(ierr); 1520d0c080abSJoseph Pusztay Np /= dim; 1521d0c080abSJoseph Pusztay ierr = VecGetArrayRead(U, &u);CHKERRQ(ierr); 1522d0c080abSJoseph Pusztay for (p = 0; p < Np; ++p) { 1523d0c080abSJoseph Pusztay for (d = 0; d < dim; ++d) { 1524d0c080abSJoseph Pusztay totE += PetscRealPart(u[p*dim+d]*u[p*dim+d]); 1525d0c080abSJoseph Pusztay totMom[d] += PetscRealPart(u[p*dim+d]); 1526d0c080abSJoseph Pusztay } 1527d0c080abSJoseph Pusztay } 1528d0c080abSJoseph Pusztay ierr = VecRestoreArrayRead(U, &u);CHKERRQ(ierr); 1529d0c080abSJoseph Pusztay for (d = 0; d < dim; ++d) totMom[d] *= m; 1530d0c080abSJoseph Pusztay totE *= 0.5*m; 1531d0c080abSJoseph Pusztay ierr = PetscPrintf(comm, "Step %4D Total Energy: %10.8lf", step, (double) totE);CHKERRQ(ierr); 1532d0c080abSJoseph Pusztay for (d = 0; d < dim; ++d) {ierr = PetscPrintf(comm, " Total Momentum %c: %10.8lf", 'x'+d, (double) totMom[d]);CHKERRQ(ierr);} 1533d0c080abSJoseph Pusztay ierr = PetscPrintf(comm, "\n");CHKERRQ(ierr); 1534d0c080abSJoseph Pusztay PetscFunctionReturn(0); 1535d0c080abSJoseph Pusztay } 1536