1d0c080abSJoseph Pusztay #include <petsc/private/tsimpl.h> /*I "petscts.h" I*/ 2d0c080abSJoseph Pusztay #include <petscdm.h> 307eaae0cSMatthew G. Knepley #include <petscds.h> 4ab43fcacSJoe Pusztay #include <petscdmswarm.h> 5d0c080abSJoseph Pusztay #include <petscdraw.h> 6d0c080abSJoseph Pusztay 7d0c080abSJoseph Pusztay /*@C 8bcf0153eSBarry Smith TSMonitor - Runs all user-provided monitor routines set using `TSMonitorSet()` 9d0c080abSJoseph Pusztay 10c3339decSBarry Smith Collective 11d0c080abSJoseph Pusztay 12d0c080abSJoseph Pusztay Input Parameters: 13bcf0153eSBarry Smith + 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 18bcf0153eSBarry Smith Level: developer 19bcf0153eSBarry Smith 20d0c080abSJoseph Pusztay Notes: 21bcf0153eSBarry Smith `TSMonitor()` is typically used automatically within the time stepping implementations. 22d0c080abSJoseph Pusztay Users would almost never call this routine directly. 23d0c080abSJoseph Pusztay 24d0c080abSJoseph Pusztay A step of -1 indicates that the monitor is being called on a solution obtained by interpolating from computed solutions 25d0c080abSJoseph Pusztay 26bcf0153eSBarry Smith .seealso: `TS`, `TSMonitorSet()`, `TSMonitorSetFromOptions()` 27d0c080abSJoseph Pusztay @*/ 28d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitor(TS ts, PetscInt step, PetscReal ptime, Vec u) 29d71ae5a4SJacob Faibussowitsch { 30d0c080abSJoseph Pusztay DM dm; 31d0c080abSJoseph Pusztay PetscInt i, n = ts->numbermonitors; 32d0c080abSJoseph Pusztay 33d0c080abSJoseph Pusztay PetscFunctionBegin; 34d0c080abSJoseph Pusztay PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 35d0c080abSJoseph Pusztay PetscValidHeaderSpecific(u, VEC_CLASSID, 4); 36d0c080abSJoseph Pusztay 379566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 389566063dSJacob Faibussowitsch PetscCall(DMSetOutputSequenceNumber(dm, step, ptime)); 39d0c080abSJoseph Pusztay 409566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(u)); 4148a46eb9SPierre Jolivet for (i = 0; i < n; i++) PetscCall((*ts->monitor[i])(ts, step, ptime, u, ts->monitorcontext[i])); 429566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(u)); 433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 44d0c080abSJoseph Pusztay } 45d0c080abSJoseph Pusztay 46d0c080abSJoseph Pusztay /*@C 47d0c080abSJoseph Pusztay TSMonitorSetFromOptions - Sets a monitor function and viewer appropriate for the type indicated by the user 48d0c080abSJoseph Pusztay 49c3339decSBarry Smith Collective 50d0c080abSJoseph Pusztay 51d0c080abSJoseph Pusztay Input Parameters: 52bcf0153eSBarry Smith + ts - `TS` object you wish to monitor 53d0c080abSJoseph Pusztay . name - the monitor type one is seeking 54d0c080abSJoseph Pusztay . help - message indicating what monitoring is done 55d0c080abSJoseph Pusztay . manual - manual page for the monitor 56d0c080abSJoseph Pusztay . monitor - the monitor function 57bcf0153eSBarry Smith - 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 58d0c080abSJoseph Pusztay 59d0c080abSJoseph Pusztay Level: developer 60d0c080abSJoseph Pusztay 61*648c30bcSBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorSet()`, `PetscOptionsCreateViewer()`, `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`, 62db781477SPatrick Sanan `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()` 63b43aa488SJacob Faibussowitsch `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`, 64db781477SPatrick Sanan `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`, 65c2e3fba1SPatrick Sanan `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`, 66db781477SPatrick Sanan `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`, 67db781477SPatrick Sanan `PetscOptionsFList()`, `PetscOptionsEList()` 68d0c080abSJoseph Pusztay @*/ 69d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorSetFromOptions(TS ts, const char name[], const char help[], const char manual[], PetscErrorCode (*monitor)(TS, PetscInt, PetscReal, Vec, PetscViewerAndFormat *), PetscErrorCode (*monitorsetup)(TS, PetscViewerAndFormat *)) 70d71ae5a4SJacob Faibussowitsch { 71d0c080abSJoseph Pusztay PetscViewer viewer; 72d0c080abSJoseph Pusztay PetscViewerFormat format; 73d0c080abSJoseph Pusztay PetscBool flg; 74d0c080abSJoseph Pusztay 75d0c080abSJoseph Pusztay PetscFunctionBegin; 76*648c30bcSBarry Smith PetscCall(PetscOptionsCreateViewer(PetscObjectComm((PetscObject)ts), ((PetscObject)ts)->options, ((PetscObject)ts)->prefix, name, &viewer, &format, &flg)); 77d0c080abSJoseph Pusztay if (flg) { 78d0c080abSJoseph Pusztay PetscViewerAndFormat *vf; 799812b6beSJed Brown char interval_key[1024]; 809566063dSJacob Faibussowitsch PetscCall(PetscViewerAndFormatCreate(viewer, format, &vf)); 819812b6beSJed Brown PetscCall(PetscSNPrintf(interval_key, sizeof interval_key, "%s_interval", name)); 829812b6beSJed Brown PetscCall(PetscOptionsGetInt(((PetscObject)ts)->options, ((PetscObject)ts)->prefix, interval_key, &vf->view_interval, NULL)); 83*648c30bcSBarry Smith PetscCall(PetscViewerDestroy(&viewer)); 841baa6e33SBarry Smith if (monitorsetup) PetscCall((*monitorsetup)(ts, vf)); 859566063dSJacob Faibussowitsch PetscCall(TSMonitorSet(ts, (PetscErrorCode(*)(TS, PetscInt, PetscReal, Vec, void *))monitor, vf, (PetscErrorCode(*)(void **))PetscViewerAndFormatDestroy)); 86d0c080abSJoseph Pusztay } 873ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 88d0c080abSJoseph Pusztay } 89d0c080abSJoseph Pusztay 90d0c080abSJoseph Pusztay /*@C 91d0c080abSJoseph Pusztay TSMonitorSet - Sets an ADDITIONAL function that is to be used at every 92d0c080abSJoseph Pusztay timestep to display the iteration's progress. 93d0c080abSJoseph Pusztay 94c3339decSBarry Smith Logically Collective 95d0c080abSJoseph Pusztay 96d0c080abSJoseph Pusztay Input Parameters: 97bcf0153eSBarry Smith + ts - the `TS` context obtained from `TSCreate()` 98d0c080abSJoseph Pusztay . monitor - monitoring routine 99195e9b02SBarry Smith . mctx - [optional] user-defined context for private data for the monitor routine (use `NULL` if no context is desired) 10014d0ab18SJacob Faibussowitsch - mdestroy - [optional] routine that frees monitor context (may be `NULL`) 101d0c080abSJoseph Pusztay 10220f4b53cSBarry Smith Calling sequence of `monitor`: 10320f4b53cSBarry Smith + ts - the `TS` context 104d0c080abSJoseph 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) 105d0c080abSJoseph Pusztay . time - current time 106d0c080abSJoseph Pusztay . u - current iterate 10714d0ab18SJacob Faibussowitsch - ctx - [optional] monitoring context 108d0c080abSJoseph Pusztay 109bcf0153eSBarry Smith Level: intermediate 110bcf0153eSBarry Smith 111bcf0153eSBarry Smith Note: 112195e9b02SBarry Smith This routine adds an additional monitor to the list of monitors that already has been loaded. 113d0c080abSJoseph Pusztay 114b43aa488SJacob Faibussowitsch Fortran Notes: 115bcf0153eSBarry Smith Only a single monitor function can be set for each `TS` object 116d0c080abSJoseph Pusztay 1171cc06b55SBarry Smith .seealso: [](ch_ts), `TSMonitorDefault()`, `TSMonitorCancel()`, `TSDMSwarmMonitorMoments()`, `TSMonitorExtreme()`, `TSMonitorDrawSolution()`, 1183a61192cSBarry Smith `TSMonitorDrawSolutionPhase()`, `TSMonitorDrawSolutionFunction()`, `TSMonitorDrawError()`, `TSMonitorSolution()`, `TSMonitorSolutionVTK()`, 119b43aa488SJacob Faibussowitsch `TSMonitorLGSolution()`, `TSMonitorLGError()`, `TSMonitorSPSwarmSolution()`, `TSMonitorError()`, `TSMonitorEnvelope()` 120d0c080abSJoseph Pusztay @*/ 12114d0ab18SJacob Faibussowitsch PetscErrorCode TSMonitorSet(TS ts, PetscErrorCode (*monitor)(TS ts, PetscInt steps, PetscReal time, Vec u, void *ctx), void *mctx, PetscErrorCode (*mdestroy)(void **)) 122d71ae5a4SJacob Faibussowitsch { 123d0c080abSJoseph Pusztay PetscInt i; 124d0c080abSJoseph Pusztay PetscBool identical; 125d0c080abSJoseph Pusztay 126d0c080abSJoseph Pusztay PetscFunctionBegin; 127d0c080abSJoseph Pusztay PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 128d0c080abSJoseph Pusztay for (i = 0; i < ts->numbermonitors; i++) { 1299566063dSJacob Faibussowitsch PetscCall(PetscMonitorCompare((PetscErrorCode(*)(void))monitor, mctx, mdestroy, (PetscErrorCode(*)(void))ts->monitor[i], ts->monitorcontext[i], ts->monitordestroy[i], &identical)); 1303ba16761SJacob Faibussowitsch if (identical) PetscFunctionReturn(PETSC_SUCCESS); 131d0c080abSJoseph Pusztay } 1323c633725SBarry Smith PetscCheck(ts->numbermonitors < MAXTSMONITORS, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Too many monitors set"); 133d0c080abSJoseph Pusztay ts->monitor[ts->numbermonitors] = monitor; 134d0c080abSJoseph Pusztay ts->monitordestroy[ts->numbermonitors] = mdestroy; 135d0c080abSJoseph Pusztay ts->monitorcontext[ts->numbermonitors++] = (void *)mctx; 1363ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 137d0c080abSJoseph Pusztay } 138d0c080abSJoseph Pusztay 139d0c080abSJoseph Pusztay /*@C 140d0c080abSJoseph Pusztay TSMonitorCancel - Clears all the monitors that have been set on a time-step object. 141d0c080abSJoseph Pusztay 142c3339decSBarry Smith Logically Collective 143d0c080abSJoseph Pusztay 1442fe279fdSBarry Smith Input Parameter: 145bcf0153eSBarry Smith . ts - the `TS` context obtained from `TSCreate()` 146d0c080abSJoseph Pusztay 147d0c080abSJoseph Pusztay Level: intermediate 148d0c080abSJoseph Pusztay 149bcf0153eSBarry Smith Note: 150bcf0153eSBarry Smith There is no way to remove a single, specific monitor. 151bcf0153eSBarry Smith 1521cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorDefault()`, `TSMonitorSet()` 153d0c080abSJoseph Pusztay @*/ 154d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorCancel(TS ts) 155d71ae5a4SJacob Faibussowitsch { 156d0c080abSJoseph Pusztay PetscInt i; 157d0c080abSJoseph Pusztay 158d0c080abSJoseph Pusztay PetscFunctionBegin; 159d0c080abSJoseph Pusztay PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 160d0c080abSJoseph Pusztay for (i = 0; i < ts->numbermonitors; i++) { 16148a46eb9SPierre Jolivet if (ts->monitordestroy[i]) PetscCall((*ts->monitordestroy[i])(&ts->monitorcontext[i])); 162d0c080abSJoseph Pusztay } 163d0c080abSJoseph Pusztay ts->numbermonitors = 0; 1643ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 165d0c080abSJoseph Pusztay } 166d0c080abSJoseph Pusztay 167d0c080abSJoseph Pusztay /*@C 168195e9b02SBarry Smith TSMonitorDefault - The default monitor, prints the timestep and time for each step 169d0c080abSJoseph Pusztay 17014d0ab18SJacob Faibussowitsch Input Parameters: 17114d0ab18SJacob Faibussowitsch + ts - the `TS` context 17214d0ab18SJacob Faibussowitsch . step - 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) 17314d0ab18SJacob Faibussowitsch . ptime - current time 17414d0ab18SJacob Faibussowitsch . v - current iterate 17514d0ab18SJacob Faibussowitsch - vf - the viewer and format 17614d0ab18SJacob Faibussowitsch 177bcf0153eSBarry Smith Options Database Key: 1783a61192cSBarry Smith . -ts_monitor - monitors the time integration 1793a61192cSBarry Smith 180d0c080abSJoseph Pusztay Level: intermediate 181d0c080abSJoseph Pusztay 182bcf0153eSBarry Smith Notes: 183bcf0153eSBarry Smith This is not called directly by users, rather one calls `TSMonitorSet()`, with this function as an argument, to cause the monitor 184bcf0153eSBarry Smith to be used during the `TS` integration. 185bcf0153eSBarry Smith 1861cc06b55SBarry Smith .seealso: [](ch_ts), `TSMonitorSet()`, `TSDMSwarmMonitorMoments()`, `TSMonitorExtreme()`, `TSMonitorDrawSolution()`, 1873a61192cSBarry Smith `TSMonitorDrawSolutionPhase()`, `TSMonitorDrawSolutionFunction()`, `TSMonitorDrawError()`, `TSMonitorSolution()`, `TSMonitorSolutionVTK()`, 188b43aa488SJacob Faibussowitsch `TSMonitorLGSolution()`, `TSMonitorLGError()`, `TSMonitorSPSwarmSolution()`, `TSMonitorError()`, `TSMonitorEnvelope()` 189d0c080abSJoseph Pusztay @*/ 190d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorDefault(TS ts, PetscInt step, PetscReal ptime, Vec v, PetscViewerAndFormat *vf) 191d71ae5a4SJacob Faibussowitsch { 192d0c080abSJoseph Pusztay PetscViewer viewer = vf->viewer; 193d0c080abSJoseph Pusztay PetscBool iascii, ibinary; 194d0c080abSJoseph Pusztay 195d0c080abSJoseph Pusztay PetscFunctionBegin; 196064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 5); 1979566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 1989566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERBINARY, &ibinary)); 1999566063dSJacob Faibussowitsch PetscCall(PetscViewerPushFormat(viewer, vf->format)); 200d0c080abSJoseph Pusztay if (iascii) { 2019566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIAddTab(viewer, ((PetscObject)ts)->tablevel)); 202d0c080abSJoseph Pusztay if (step == -1) { /* this indicates it is an interpolated solution */ 20363a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Interpolated solution at time %g between steps %" PetscInt_FMT " and %" PetscInt_FMT "\n", (double)ptime, ts->steps - 1, ts->steps)); 204d0c080abSJoseph Pusztay } else { 20563a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "%" PetscInt_FMT " TS dt %g time %g%s", step, (double)ts->time_step, (double)ptime, ts->steprollback ? " (r)\n" : "\n")); 206d0c080abSJoseph Pusztay } 2079566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISubtractTab(viewer, ((PetscObject)ts)->tablevel)); 208d0c080abSJoseph Pusztay } else if (ibinary) { 209d0c080abSJoseph Pusztay PetscMPIInt rank; 2109566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank)); 211c5853193SPierre Jolivet if (rank == 0) { 212d0c080abSJoseph Pusztay PetscBool skipHeader; 213d0c080abSJoseph Pusztay PetscInt classid = REAL_FILE_CLASSID; 214d0c080abSJoseph Pusztay 2159566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetSkipHeader(viewer, &skipHeader)); 21648a46eb9SPierre Jolivet if (!skipHeader) PetscCall(PetscViewerBinaryWrite(viewer, &classid, 1, PETSC_INT)); 2179566063dSJacob Faibussowitsch PetscCall(PetscRealView(1, &ptime, viewer)); 218d0c080abSJoseph Pusztay } else { 2199566063dSJacob Faibussowitsch PetscCall(PetscRealView(0, &ptime, viewer)); 220d0c080abSJoseph Pusztay } 221d0c080abSJoseph Pusztay } 2229566063dSJacob Faibussowitsch PetscCall(PetscViewerPopFormat(viewer)); 2233ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 224d0c080abSJoseph Pusztay } 225d0c080abSJoseph Pusztay 226d0c080abSJoseph Pusztay /*@C 227d0c080abSJoseph Pusztay TSMonitorExtreme - Prints the extreme values of the solution at each timestep 228d0c080abSJoseph Pusztay 22914d0ab18SJacob Faibussowitsch Input Parameters: 23014d0ab18SJacob Faibussowitsch + ts - the `TS` context 23114d0ab18SJacob Faibussowitsch . step - 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) 23214d0ab18SJacob Faibussowitsch . ptime - current time 23314d0ab18SJacob Faibussowitsch . v - current iterate 23414d0ab18SJacob Faibussowitsch - vf - the viewer and format 23514d0ab18SJacob Faibussowitsch 236bcf0153eSBarry Smith Level: intermediate 237bcf0153eSBarry Smith 238195e9b02SBarry Smith Note: 2393a61192cSBarry Smith This is not called directly by users, rather one calls `TSMonitorSet()`, with this function as an argument, to cause the monitor 240195e9b02SBarry Smith to be used during the `TS` integration. 2413a61192cSBarry Smith 2421cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorSet()` 243d0c080abSJoseph Pusztay @*/ 244d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorExtreme(TS ts, PetscInt step, PetscReal ptime, Vec v, PetscViewerAndFormat *vf) 245d71ae5a4SJacob Faibussowitsch { 246d0c080abSJoseph Pusztay PetscViewer viewer = vf->viewer; 247d0c080abSJoseph Pusztay PetscBool iascii; 248d0c080abSJoseph Pusztay PetscReal max, min; 249d0c080abSJoseph Pusztay 250d0c080abSJoseph Pusztay PetscFunctionBegin; 251064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 5); 2529566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 2539566063dSJacob Faibussowitsch PetscCall(PetscViewerPushFormat(viewer, vf->format)); 254d0c080abSJoseph Pusztay if (iascii) { 2559566063dSJacob Faibussowitsch PetscCall(VecMax(v, NULL, &max)); 2569566063dSJacob Faibussowitsch PetscCall(VecMin(v, NULL, &min)); 2579566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIAddTab(viewer, ((PetscObject)ts)->tablevel)); 25863a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "%" PetscInt_FMT " 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)); 2599566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISubtractTab(viewer, ((PetscObject)ts)->tablevel)); 260d0c080abSJoseph Pusztay } 2619566063dSJacob Faibussowitsch PetscCall(PetscViewerPopFormat(viewer)); 2623ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 263d0c080abSJoseph Pusztay } 264d0c080abSJoseph Pusztay 265d0c080abSJoseph Pusztay /*@C 266bcf0153eSBarry Smith TSMonitorLGCtxCreate - Creates a `TSMonitorLGCtx` context for use with 267bcf0153eSBarry Smith `TS` to monitor the solution process graphically in various ways 268d0c080abSJoseph Pusztay 269c3339decSBarry Smith Collective 270d0c080abSJoseph Pusztay 271d0c080abSJoseph Pusztay Input Parameters: 27214d0ab18SJacob Faibussowitsch + comm - the MPI communicator to use 27314d0ab18SJacob Faibussowitsch . host - the X display to open, or `NULL` for the local machine 274d0c080abSJoseph Pusztay . label - the title to put in the title bar 27514d0ab18SJacob Faibussowitsch . x - the x screen coordinates of the upper left coordinate of the window 27614d0ab18SJacob Faibussowitsch . y - the y screen coordinates of the upper left coordinate of the window 27714d0ab18SJacob Faibussowitsch . m - the screen width in pixels 27814d0ab18SJacob Faibussowitsch . n - the screen height in pixels 279d0c080abSJoseph Pusztay - howoften - if positive then determines the frequency of the plotting, if -1 then only at the final time 280d0c080abSJoseph Pusztay 281d0c080abSJoseph Pusztay Output Parameter: 282d0c080abSJoseph Pusztay . ctx - the context 283d0c080abSJoseph Pusztay 284bcf0153eSBarry Smith Options Database Keys: 285d0c080abSJoseph Pusztay + -ts_monitor_lg_timestep - automatically sets line graph monitor 286b43aa488SJacob Faibussowitsch . -ts_monitor_lg_timestep_log - automatically sets line graph monitor 287bcf0153eSBarry Smith . -ts_monitor_lg_solution - monitor the solution (or certain values of the solution by calling `TSMonitorLGSetDisplayVariables()` or `TSMonitorLGCtxSetDisplayVariables()`) 288d0c080abSJoseph Pusztay . -ts_monitor_lg_error - monitor the error 289bcf0153eSBarry Smith . -ts_monitor_lg_ksp_iterations - monitor the number of `KSP` iterations needed for each timestep 290bcf0153eSBarry Smith . -ts_monitor_lg_snes_iterations - monitor the number of `SNES` iterations needed for each timestep 291d0c080abSJoseph Pusztay - -lg_use_markers <true,false> - mark the data points (at each time step) on the plot; default is true 292d0c080abSJoseph Pusztay 293d0c080abSJoseph Pusztay Level: intermediate 294d0c080abSJoseph Pusztay 295bcf0153eSBarry Smith Notes: 296bcf0153eSBarry Smith Pass the context and `TSMonitorLGCtxDestroy()` to `TSMonitorSet()` to have the context destroyed when no longer needed. 297bcf0153eSBarry Smith 298bcf0153eSBarry Smith One can provide a function that transforms the solution before plotting it with `TSMonitorLGCtxSetTransform()` or `TSMonitorLGSetTransform()` 299bcf0153eSBarry Smith 3001d27aa22SBarry Smith Many of the functions that control the monitoring have two forms\: TSMonitorLGSet/GetXXXX() and TSMonitorLGCtxSet/GetXXXX() the first take a `TS` object as the 301bcf0153eSBarry Smith 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 302bcf0153eSBarry Smith as the first argument. 303bcf0153eSBarry Smith 304bcf0153eSBarry Smith One can control the names displayed for each solution or error variable with `TSMonitorLGCtxSetVariableNames()` or `TSMonitorLGSetVariableNames()` 305bcf0153eSBarry Smith 3061cc06b55SBarry Smith .seealso: [](ch_ts), `TSMonitorLGTimeStep()`, `TSMonitorSet()`, `TSMonitorLGSolution()`, `TSMonitorLGError()`, `TSMonitorDefault()`, `VecView()`, 30742747ad1SJacob Faibussowitsch `TSMonitorLGCtxSetVariableNames()`, `TSMonitorLGCtxGetVariableNames()`, 308db781477SPatrick Sanan `TSMonitorLGSetVariableNames()`, `TSMonitorLGGetVariableNames()`, `TSMonitorLGSetDisplayVariables()`, `TSMonitorLGCtxSetDisplayVariables()`, 309b43aa488SJacob Faibussowitsch `TSMonitorLGCtxSetTransform()`, `TSMonitorLGSetTransform()`, `TSMonitorLGSNESIterations()`, `TSMonitorLGKSPIterations()`, 310db781477SPatrick Sanan `TSMonitorEnvelopeCtxCreate()`, `TSMonitorEnvelopeGetBounds()`, `TSMonitorEnvelopeCtxDestroy()`, `TSMonitorEnvelop()` 311d0c080abSJoseph Pusztay @*/ 312d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGCtxCreate(MPI_Comm comm, const char host[], const char label[], int x, int y, int m, int n, PetscInt howoften, TSMonitorLGCtx *ctx) 313d71ae5a4SJacob Faibussowitsch { 314d0c080abSJoseph Pusztay PetscDraw draw; 315d0c080abSJoseph Pusztay 316d0c080abSJoseph Pusztay PetscFunctionBegin; 3179566063dSJacob Faibussowitsch PetscCall(PetscNew(ctx)); 3189566063dSJacob Faibussowitsch PetscCall(PetscDrawCreate(comm, host, label, x, y, m, n, &draw)); 3199566063dSJacob Faibussowitsch PetscCall(PetscDrawSetFromOptions(draw)); 3209566063dSJacob Faibussowitsch PetscCall(PetscDrawLGCreate(draw, 1, &(*ctx)->lg)); 3219566063dSJacob Faibussowitsch PetscCall(PetscDrawLGSetFromOptions((*ctx)->lg)); 3229566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&draw)); 323d0c080abSJoseph Pusztay (*ctx)->howoften = howoften; 3243ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 325d0c080abSJoseph Pusztay } 326d0c080abSJoseph Pusztay 327a54bb2a9SBarry Smith /*@C 328a54bb2a9SBarry Smith TSMonitorLGTimeStep - Monitors a `TS` by printing the time-steps 329a54bb2a9SBarry Smith 330a54bb2a9SBarry Smith Collective 331a54bb2a9SBarry Smith 332a54bb2a9SBarry Smith Input Parameters: 333a54bb2a9SBarry Smith + ts - the time integrator 334a54bb2a9SBarry Smith . step - the current time step 335a54bb2a9SBarry Smith . ptime - the current time 336a54bb2a9SBarry Smith . v - the current state 337a54bb2a9SBarry Smith - monctx - the monitor context obtained with `TSMonitorLGCtxCreate()` 338a54bb2a9SBarry Smith 339a54bb2a9SBarry Smith Level: advanced 340a54bb2a9SBarry Smith 341a54bb2a9SBarry Smith Note: 342a54bb2a9SBarry Smith This is not called directly by users, rather one calls `TSMonitorSet()` along the `ctx` created by `TSMonitorLGCtxCreate()` 343a54bb2a9SBarry Smith and `TSMonitorLGCtxDestroy()` 344a54bb2a9SBarry Smith 345a54bb2a9SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorLGCtxCreate()`, `TSMonitorSet()`, `TSMonitorLGCtxDestroy()` 346a54bb2a9SBarry Smith @*/ 347d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGTimeStep(TS ts, PetscInt step, PetscReal ptime, Vec v, void *monctx) 348d71ae5a4SJacob Faibussowitsch { 349d0c080abSJoseph Pusztay TSMonitorLGCtx ctx = (TSMonitorLGCtx)monctx; 350d0c080abSJoseph Pusztay PetscReal x = ptime, y; 351d0c080abSJoseph Pusztay 352d0c080abSJoseph Pusztay PetscFunctionBegin; 3533ba16761SJacob Faibussowitsch if (step < 0) PetscFunctionReturn(PETSC_SUCCESS); /* -1 indicates an interpolated solution */ 354d0c080abSJoseph Pusztay if (!step) { 355d0c080abSJoseph Pusztay PetscDrawAxis axis; 356d0c080abSJoseph Pusztay const char *ylabel = ctx->semilogy ? "Log Time Step" : "Time Step"; 3579566063dSJacob Faibussowitsch PetscCall(PetscDrawLGGetAxis(ctx->lg, &axis)); 3589566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisSetLabels(axis, "Timestep as function of time", "Time", ylabel)); 3599566063dSJacob Faibussowitsch PetscCall(PetscDrawLGReset(ctx->lg)); 360d0c080abSJoseph Pusztay } 3619566063dSJacob Faibussowitsch PetscCall(TSGetTimeStep(ts, &y)); 362d0c080abSJoseph Pusztay if (ctx->semilogy) y = PetscLog10Real(y); 3639566063dSJacob Faibussowitsch PetscCall(PetscDrawLGAddPoint(ctx->lg, &x, &y)); 364d0c080abSJoseph Pusztay if (((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && ts->reason)) { 3659566063dSJacob Faibussowitsch PetscCall(PetscDrawLGDraw(ctx->lg)); 3669566063dSJacob Faibussowitsch PetscCall(PetscDrawLGSave(ctx->lg)); 367d0c080abSJoseph Pusztay } 3683ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 369d0c080abSJoseph Pusztay } 370d0c080abSJoseph Pusztay 371d0c080abSJoseph Pusztay /*@C 372195e9b02SBarry Smith TSMonitorLGCtxDestroy - Destroys a line graph context that was created with `TSMonitorLGCtxCreate()`. 373d0c080abSJoseph Pusztay 374c3339decSBarry Smith Collective 375d0c080abSJoseph Pusztay 376d0c080abSJoseph Pusztay Input Parameter: 377d0c080abSJoseph Pusztay . ctx - the monitor context 378d0c080abSJoseph Pusztay 379d0c080abSJoseph Pusztay Level: intermediate 380d0c080abSJoseph Pusztay 381bcf0153eSBarry Smith Note: 382bcf0153eSBarry Smith Pass to `TSMonitorSet()` along with the context and `TSMonitorLGTimeStep()` 383bcf0153eSBarry Smith 384a54bb2a9SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorLGCtxCreate()`, `TSMonitorSet()`, `TSMonitorLGTimeStep()` 385d0c080abSJoseph Pusztay @*/ 386d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGCtxDestroy(TSMonitorLGCtx *ctx) 387d71ae5a4SJacob Faibussowitsch { 388d0c080abSJoseph Pusztay PetscFunctionBegin; 38948a46eb9SPierre Jolivet if ((*ctx)->transformdestroy) PetscCall(((*ctx)->transformdestroy)((*ctx)->transformctx)); 3909566063dSJacob Faibussowitsch PetscCall(PetscDrawLGDestroy(&(*ctx)->lg)); 3919566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&(*ctx)->names)); 3929566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&(*ctx)->displaynames)); 3939566063dSJacob Faibussowitsch PetscCall(PetscFree((*ctx)->displayvariables)); 3949566063dSJacob Faibussowitsch PetscCall(PetscFree((*ctx)->displayvalues)); 3959566063dSJacob Faibussowitsch PetscCall(PetscFree(*ctx)); 3963ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 397d0c080abSJoseph Pusztay } 398d0c080abSJoseph Pusztay 399d7462660SMatthew Knepley /* Creates a TSMonitorSPCtx for use with DMSwarm particle visualizations */ 40060e16b1bSMatthew G. 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, PetscBool multispecies, TSMonitorSPCtx *ctx) 401d71ae5a4SJacob Faibussowitsch { 402d0c080abSJoseph Pusztay PetscDraw draw; 403d0c080abSJoseph Pusztay 404d0c080abSJoseph Pusztay PetscFunctionBegin; 4059566063dSJacob Faibussowitsch PetscCall(PetscNew(ctx)); 4069566063dSJacob Faibussowitsch PetscCall(PetscDrawCreate(comm, host, label, x, y, m, n, &draw)); 4079566063dSJacob Faibussowitsch PetscCall(PetscDrawSetFromOptions(draw)); 4089566063dSJacob Faibussowitsch PetscCall(PetscDrawSPCreate(draw, 1, &(*ctx)->sp)); 4099566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&draw)); 410d0c080abSJoseph Pusztay (*ctx)->howoften = howoften; 411d7462660SMatthew Knepley (*ctx)->retain = retain; 412d7462660SMatthew Knepley (*ctx)->phase = phase; 41360e16b1bSMatthew G. Knepley (*ctx)->multispecies = multispecies; 4143ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 415d0c080abSJoseph Pusztay } 416d0c080abSJoseph Pusztay 41760e16b1bSMatthew G. Knepley /* Destroys a TSMonitorSPCtx that was created with TSMonitorSPCtxCreate */ 418d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorSPCtxDestroy(TSMonitorSPCtx *ctx) 419d71ae5a4SJacob Faibussowitsch { 420d0c080abSJoseph Pusztay PetscFunctionBegin; 4219566063dSJacob Faibussowitsch PetscCall(PetscDrawSPDestroy(&(*ctx)->sp)); 4229566063dSJacob Faibussowitsch PetscCall(PetscFree(*ctx)); 42360e16b1bSMatthew G. Knepley PetscFunctionReturn(PETSC_SUCCESS); 42460e16b1bSMatthew G. Knepley } 425d0c080abSJoseph Pusztay 42660e16b1bSMatthew G. Knepley /* Creates a TSMonitorHGCtx for use with DMSwarm particle visualizations */ 42760e16b1bSMatthew G. Knepley PetscErrorCode TSMonitorHGCtxCreate(MPI_Comm comm, const char host[], const char label[], int x, int y, int m, int n, PetscInt howoften, PetscInt Ns, PetscInt Nb, PetscBool velocity, TSMonitorHGCtx *ctx) 42860e16b1bSMatthew G. Knepley { 42960e16b1bSMatthew G. Knepley PetscDraw draw; 43060e16b1bSMatthew G. Knepley PetscInt s; 43160e16b1bSMatthew G. Knepley 43260e16b1bSMatthew G. Knepley PetscFunctionBegin; 43360e16b1bSMatthew G. Knepley PetscCall(PetscNew(ctx)); 43460e16b1bSMatthew G. Knepley PetscCall(PetscMalloc1(Ns, &(*ctx)->hg)); 43560e16b1bSMatthew G. Knepley for (s = 0; s < Ns; ++s) { 43660e16b1bSMatthew G. Knepley PetscCall(PetscDrawCreate(comm, host, label, x + s * m, y, m, n, &draw)); 43760e16b1bSMatthew G. Knepley PetscCall(PetscDrawSetFromOptions(draw)); 43860e16b1bSMatthew G. Knepley PetscCall(PetscDrawHGCreate(draw, Nb, &(*ctx)->hg[s])); 43960e16b1bSMatthew G. Knepley PetscCall(PetscDrawHGCalcStats((*ctx)->hg[s], PETSC_TRUE)); 44060e16b1bSMatthew G. Knepley PetscCall(PetscDrawDestroy(&draw)); 44160e16b1bSMatthew G. Knepley } 44260e16b1bSMatthew G. Knepley (*ctx)->howoften = howoften; 44360e16b1bSMatthew G. Knepley (*ctx)->Ns = Ns; 44460e16b1bSMatthew G. Knepley (*ctx)->velocity = velocity; 44560e16b1bSMatthew G. Knepley PetscFunctionReturn(PETSC_SUCCESS); 44660e16b1bSMatthew G. Knepley } 44760e16b1bSMatthew G. Knepley 44860e16b1bSMatthew G. Knepley /* Destroys a TSMonitorHGCtx that was created with TSMonitorHGCtxCreate */ 44960e16b1bSMatthew G. Knepley PetscErrorCode TSMonitorHGCtxDestroy(TSMonitorHGCtx *ctx) 45060e16b1bSMatthew G. Knepley { 45160e16b1bSMatthew G. Knepley PetscInt s; 45260e16b1bSMatthew G. Knepley 45360e16b1bSMatthew G. Knepley PetscFunctionBegin; 45460e16b1bSMatthew G. Knepley for (s = 0; s < (*ctx)->Ns; ++s) PetscCall(PetscDrawHGDestroy(&(*ctx)->hg[s])); 45560e16b1bSMatthew G. Knepley PetscCall(PetscFree((*ctx)->hg)); 45660e16b1bSMatthew G. Knepley PetscCall(PetscFree(*ctx)); 4573ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 458d0c080abSJoseph Pusztay } 459d0c080abSJoseph Pusztay 460d0c080abSJoseph Pusztay /*@C 461bcf0153eSBarry Smith TSMonitorDrawSolution - Monitors progress of the `TS` solvers by calling 462bcf0153eSBarry Smith `VecView()` for the solution at each timestep 463d0c080abSJoseph Pusztay 464c3339decSBarry Smith Collective 465d0c080abSJoseph Pusztay 466d0c080abSJoseph Pusztay Input Parameters: 467bcf0153eSBarry Smith + ts - the `TS` context 468d0c080abSJoseph Pusztay . step - current time-step 469d0c080abSJoseph Pusztay . ptime - current time 47014d0ab18SJacob Faibussowitsch . u - the solution at the current time 471195e9b02SBarry Smith - dummy - either a viewer or `NULL` 472d0c080abSJoseph Pusztay 473bcf0153eSBarry Smith Options Database Keys: 474bcf0153eSBarry Smith + -ts_monitor_draw_solution - draw the solution at each time-step 475bcf0153eSBarry Smith - -ts_monitor_draw_solution_initial - show initial solution as well as current solution 476bcf0153eSBarry Smith 477bcf0153eSBarry Smith Level: intermediate 478d0c080abSJoseph Pusztay 479d0c080abSJoseph Pusztay Notes: 480195e9b02SBarry Smith The initial solution and current solution are not displayed with a common axis scaling so generally the option `-ts_monitor_draw_solution_initial` 481d0c080abSJoseph Pusztay will look bad 482d0c080abSJoseph Pusztay 483bcf0153eSBarry Smith This is not called directly by users, rather one calls `TSMonitorSet()`, with this function as an argument, as well as the context created with 484bcf0153eSBarry Smith `TSMonitorDrawCtxCreate()` and the function `TSMonitorDrawCtxDestroy()` to cause the monitor to be used during the `TS` integration. 4853a61192cSBarry Smith 4861cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()`, `TSMonitorDrawCtxCreate()`, `TSMonitorDrawCtxDestroy()` 487d0c080abSJoseph Pusztay @*/ 488d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorDrawSolution(TS ts, PetscInt step, PetscReal ptime, Vec u, void *dummy) 489d71ae5a4SJacob Faibussowitsch { 490d0c080abSJoseph Pusztay TSMonitorDrawCtx ictx = (TSMonitorDrawCtx)dummy; 491d0c080abSJoseph Pusztay PetscDraw draw; 492d0c080abSJoseph Pusztay 493d0c080abSJoseph Pusztay PetscFunctionBegin; 494d0c080abSJoseph Pusztay if (!step && ictx->showinitial) { 49548a46eb9SPierre Jolivet if (!ictx->initialsolution) PetscCall(VecDuplicate(u, &ictx->initialsolution)); 4969566063dSJacob Faibussowitsch PetscCall(VecCopy(u, ictx->initialsolution)); 497d0c080abSJoseph Pusztay } 4983ba16761SJacob Faibussowitsch if (!(((ictx->howoften > 0) && (!(step % ictx->howoften))) || ((ictx->howoften == -1) && ts->reason))) PetscFunctionReturn(PETSC_SUCCESS); 499d0c080abSJoseph Pusztay 500d0c080abSJoseph Pusztay if (ictx->showinitial) { 501d0c080abSJoseph Pusztay PetscReal pause; 5029566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetPause(ictx->viewer, &pause)); 5039566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawSetPause(ictx->viewer, 0.0)); 5049566063dSJacob Faibussowitsch PetscCall(VecView(ictx->initialsolution, ictx->viewer)); 5059566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawSetPause(ictx->viewer, pause)); 5069566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawSetHold(ictx->viewer, PETSC_TRUE)); 507d0c080abSJoseph Pusztay } 5089566063dSJacob Faibussowitsch PetscCall(VecView(u, ictx->viewer)); 509d0c080abSJoseph Pusztay if (ictx->showtimestepandtime) { 510d0c080abSJoseph Pusztay PetscReal xl, yl, xr, yr, h; 511d0c080abSJoseph Pusztay char time[32]; 512d0c080abSJoseph Pusztay 5139566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(ictx->viewer, 0, &draw)); 5149566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(time, 32, "Timestep %d Time %g", (int)step, (double)ptime)); 5159566063dSJacob Faibussowitsch PetscCall(PetscDrawGetCoordinates(draw, &xl, &yl, &xr, &yr)); 516d0c080abSJoseph Pusztay h = yl + .95 * (yr - yl); 5179566063dSJacob Faibussowitsch PetscCall(PetscDrawStringCentered(draw, .5 * (xl + xr), h, PETSC_DRAW_BLACK, time)); 5189566063dSJacob Faibussowitsch PetscCall(PetscDrawFlush(draw)); 519d0c080abSJoseph Pusztay } 520d0c080abSJoseph Pusztay 5211baa6e33SBarry Smith if (ictx->showinitial) PetscCall(PetscViewerDrawSetHold(ictx->viewer, PETSC_FALSE)); 5223ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 523d0c080abSJoseph Pusztay } 524d0c080abSJoseph Pusztay 525d0c080abSJoseph Pusztay /*@C 526bcf0153eSBarry Smith TSMonitorDrawSolutionPhase - Monitors progress of the `TS` solvers by plotting the solution as a phase diagram 527d0c080abSJoseph Pusztay 528c3339decSBarry Smith Collective 529d0c080abSJoseph Pusztay 530d0c080abSJoseph Pusztay Input Parameters: 531bcf0153eSBarry Smith + ts - the `TS` context 532d0c080abSJoseph Pusztay . step - current time-step 533d0c080abSJoseph Pusztay . ptime - current time 53414d0ab18SJacob Faibussowitsch . u - the solution at the current time 535195e9b02SBarry Smith - dummy - either a viewer or `NULL` 536d0c080abSJoseph Pusztay 537d0c080abSJoseph Pusztay Level: intermediate 538d0c080abSJoseph Pusztay 539bcf0153eSBarry Smith Notes: 540bcf0153eSBarry Smith This is not called directly by users, rather one calls `TSMonitorSet()`, with this function as an argument, to cause the monitor 541bcf0153eSBarry Smith to be used during the `TS` integration. 542bcf0153eSBarry Smith 5431cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()` 544d0c080abSJoseph Pusztay @*/ 545d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorDrawSolutionPhase(TS ts, PetscInt step, PetscReal ptime, Vec u, void *dummy) 546d71ae5a4SJacob Faibussowitsch { 547d0c080abSJoseph Pusztay TSMonitorDrawCtx ictx = (TSMonitorDrawCtx)dummy; 548d0c080abSJoseph Pusztay PetscDraw draw; 549d0c080abSJoseph Pusztay PetscDrawAxis axis; 550d0c080abSJoseph Pusztay PetscInt n; 551d0c080abSJoseph Pusztay PetscMPIInt size; 552d0c080abSJoseph Pusztay PetscReal U0, U1, xl, yl, xr, yr, h; 553d0c080abSJoseph Pusztay char time[32]; 554d0c080abSJoseph Pusztay const PetscScalar *U; 555d0c080abSJoseph Pusztay 556d0c080abSJoseph Pusztay PetscFunctionBegin; 5579566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)ts), &size)); 5583c633725SBarry Smith PetscCheck(size == 1, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "Only allowed for sequential runs"); 5599566063dSJacob Faibussowitsch PetscCall(VecGetSize(u, &n)); 5603c633725SBarry Smith PetscCheck(n == 2, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "Only for ODEs with two unknowns"); 561d0c080abSJoseph Pusztay 5629566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(ictx->viewer, 0, &draw)); 5639566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDrawAxis(ictx->viewer, 0, &axis)); 5649566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisGetLimits(axis, &xl, &xr, &yl, &yr)); 565d0c080abSJoseph Pusztay if (!step) { 5669566063dSJacob Faibussowitsch PetscCall(PetscDrawClear(draw)); 5679566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisDraw(axis)); 568d0c080abSJoseph Pusztay } 569d0c080abSJoseph Pusztay 5709566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(u, &U)); 571d0c080abSJoseph Pusztay U0 = PetscRealPart(U[0]); 572d0c080abSJoseph Pusztay U1 = PetscRealPart(U[1]); 5739566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(u, &U)); 5743ba16761SJacob Faibussowitsch if ((U0 < xl) || (U1 < yl) || (U0 > xr) || (U1 > yr)) PetscFunctionReturn(PETSC_SUCCESS); 575d0c080abSJoseph Pusztay 576d0609cedSBarry Smith PetscDrawCollectiveBegin(draw); 5779566063dSJacob Faibussowitsch PetscCall(PetscDrawPoint(draw, U0, U1, PETSC_DRAW_BLACK)); 578d0c080abSJoseph Pusztay if (ictx->showtimestepandtime) { 5799566063dSJacob Faibussowitsch PetscCall(PetscDrawGetCoordinates(draw, &xl, &yl, &xr, &yr)); 5809566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(time, 32, "Timestep %d Time %g", (int)step, (double)ptime)); 581d0c080abSJoseph Pusztay h = yl + .95 * (yr - yl); 5829566063dSJacob Faibussowitsch PetscCall(PetscDrawStringCentered(draw, .5 * (xl + xr), h, PETSC_DRAW_BLACK, time)); 583d0c080abSJoseph Pusztay } 584d0609cedSBarry Smith PetscDrawCollectiveEnd(draw); 5859566063dSJacob Faibussowitsch PetscCall(PetscDrawFlush(draw)); 5869566063dSJacob Faibussowitsch PetscCall(PetscDrawPause(draw)); 5879566063dSJacob Faibussowitsch PetscCall(PetscDrawSave(draw)); 5883ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 589d0c080abSJoseph Pusztay } 590d0c080abSJoseph Pusztay 591d0c080abSJoseph Pusztay /*@C 592bcf0153eSBarry Smith TSMonitorDrawCtxDestroy - Destroys the monitor context for `TSMonitorDrawSolution()` 593d0c080abSJoseph Pusztay 594c3339decSBarry Smith Collective 595d0c080abSJoseph Pusztay 5962fe279fdSBarry Smith Input Parameter: 597b43aa488SJacob Faibussowitsch . ictx - the monitor context 598d0c080abSJoseph Pusztay 599d0c080abSJoseph Pusztay Level: intermediate 600d0c080abSJoseph Pusztay 6011cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()`, `TSMonitorDrawSolution()`, `TSMonitorDrawError()`, `TSMonitorDrawCtx` 602d0c080abSJoseph Pusztay @*/ 603d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorDrawCtxDestroy(TSMonitorDrawCtx *ictx) 604d71ae5a4SJacob Faibussowitsch { 605d0c080abSJoseph Pusztay PetscFunctionBegin; 6069566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&(*ictx)->viewer)); 6079566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*ictx)->initialsolution)); 6089566063dSJacob Faibussowitsch PetscCall(PetscFree(*ictx)); 6093ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 610d0c080abSJoseph Pusztay } 611d0c080abSJoseph Pusztay 612d0c080abSJoseph Pusztay /*@C 613bcf0153eSBarry Smith TSMonitorDrawCtxCreate - Creates the monitor context for `TSMonitorDrawCtx` 614d0c080abSJoseph Pusztay 615c3339decSBarry Smith Collective 616d0c080abSJoseph Pusztay 61714d0ab18SJacob Faibussowitsch Input Parameters: 61814d0ab18SJacob Faibussowitsch + comm - the MPI communicator to use 61914d0ab18SJacob Faibussowitsch . host - the X display to open, or `NULL` for the local machine 62014d0ab18SJacob Faibussowitsch . label - the title to put in the title bar 62114d0ab18SJacob Faibussowitsch . x - the x screen coordinates of the upper left coordinate of the window 62214d0ab18SJacob Faibussowitsch . y - the y screen coordinates of the upper left coordinate of the window 62314d0ab18SJacob Faibussowitsch . m - the screen width in pixels 62414d0ab18SJacob Faibussowitsch . n - the screen height in pixels 62514d0ab18SJacob Faibussowitsch - howoften - if positive then determines the frequency of the plotting, if -1 then only at the final time 626d0c080abSJoseph Pusztay 627d5b43468SJose E. Roman Output Parameter: 628d0c080abSJoseph Pusztay . ctx - the monitor context 629d0c080abSJoseph Pusztay 630bcf0153eSBarry Smith Options Database Keys: 631bcf0153eSBarry Smith + -ts_monitor_draw_solution - draw the solution at each time-step 632bcf0153eSBarry Smith - -ts_monitor_draw_solution_initial - show initial solution as well as current solution 633d0c080abSJoseph Pusztay 634d0c080abSJoseph Pusztay Level: intermediate 635d0c080abSJoseph Pusztay 636bcf0153eSBarry Smith Note: 637bcf0153eSBarry Smith The context created by this function, `PetscMonitorDrawSolution()`, and `TSMonitorDrawCtxDestroy()` should be passed together to `TSMonitorSet()`. 638bcf0153eSBarry Smith 6391cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorDrawCtxDestroy()`, `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()`, `TSMonitorDrawCtx`, `PetscMonitorDrawSolution()` 640d0c080abSJoseph Pusztay @*/ 641d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorDrawCtxCreate(MPI_Comm comm, const char host[], const char label[], int x, int y, int m, int n, PetscInt howoften, TSMonitorDrawCtx *ctx) 642d71ae5a4SJacob Faibussowitsch { 643d0c080abSJoseph Pusztay PetscFunctionBegin; 6449566063dSJacob Faibussowitsch PetscCall(PetscNew(ctx)); 6459566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawOpen(comm, host, label, x, y, m, n, &(*ctx)->viewer)); 6469566063dSJacob Faibussowitsch PetscCall(PetscViewerSetFromOptions((*ctx)->viewer)); 647d0c080abSJoseph Pusztay 648d0c080abSJoseph Pusztay (*ctx)->howoften = howoften; 649d0c080abSJoseph Pusztay (*ctx)->showinitial = PETSC_FALSE; 6509566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-ts_monitor_draw_solution_initial", &(*ctx)->showinitial, NULL)); 651d0c080abSJoseph Pusztay 652d0c080abSJoseph Pusztay (*ctx)->showtimestepandtime = PETSC_FALSE; 6539566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-ts_monitor_draw_solution_show_time", &(*ctx)->showtimestepandtime, NULL)); 6543ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 655d0c080abSJoseph Pusztay } 656d0c080abSJoseph Pusztay 657d0c080abSJoseph Pusztay /*@C 658bcf0153eSBarry Smith TSMonitorDrawSolutionFunction - Monitors progress of the `TS` solvers by calling 659bcf0153eSBarry Smith `VecView()` for the solution provided by `TSSetSolutionFunction()` at each timestep 660d0c080abSJoseph Pusztay 661c3339decSBarry Smith Collective 662d0c080abSJoseph Pusztay 663d0c080abSJoseph Pusztay Input Parameters: 664bcf0153eSBarry Smith + ts - the `TS` context 665d0c080abSJoseph Pusztay . step - current time-step 666d0c080abSJoseph Pusztay . ptime - current time 66714d0ab18SJacob Faibussowitsch . u - solution at current time 668195e9b02SBarry Smith - dummy - either a viewer or `NULL` 669d0c080abSJoseph Pusztay 670bcf0153eSBarry Smith Options Database Key: 671bcf0153eSBarry Smith . -ts_monitor_draw_solution_function - Monitor error graphically, requires user to have provided `TSSetSolutionFunction()` 6723a61192cSBarry Smith 673d0c080abSJoseph Pusztay Level: intermediate 674d0c080abSJoseph Pusztay 675bcf0153eSBarry Smith Note: 676bcf0153eSBarry Smith This is not called directly by users, rather one calls `TSMonitorSet()`, with this function as an argument, to cause the monitor 677bcf0153eSBarry Smith to be used during the `TS` integration. 678bcf0153eSBarry Smith 6791cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()`, `TSSetSolutionFunction()` 680d0c080abSJoseph Pusztay @*/ 681d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorDrawSolutionFunction(TS ts, PetscInt step, PetscReal ptime, Vec u, void *dummy) 682d71ae5a4SJacob Faibussowitsch { 683d0c080abSJoseph Pusztay TSMonitorDrawCtx ctx = (TSMonitorDrawCtx)dummy; 684d0c080abSJoseph Pusztay PetscViewer viewer = ctx->viewer; 685d0c080abSJoseph Pusztay Vec work; 686d0c080abSJoseph Pusztay 687d0c080abSJoseph Pusztay PetscFunctionBegin; 6883ba16761SJacob Faibussowitsch if (!(((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && ts->reason))) PetscFunctionReturn(PETSC_SUCCESS); 6899566063dSJacob Faibussowitsch PetscCall(VecDuplicate(u, &work)); 6909566063dSJacob Faibussowitsch PetscCall(TSComputeSolutionFunction(ts, ptime, work)); 6919566063dSJacob Faibussowitsch PetscCall(VecView(work, viewer)); 6929566063dSJacob Faibussowitsch PetscCall(VecDestroy(&work)); 6933ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 694d0c080abSJoseph Pusztay } 695d0c080abSJoseph Pusztay 696d0c080abSJoseph Pusztay /*@C 697bcf0153eSBarry Smith TSMonitorDrawError - Monitors progress of the `TS` solvers by calling 698bcf0153eSBarry Smith `VecView()` for the error at each timestep 699d0c080abSJoseph Pusztay 700c3339decSBarry Smith Collective 701d0c080abSJoseph Pusztay 702d0c080abSJoseph Pusztay Input Parameters: 703bcf0153eSBarry Smith + ts - the `TS` context 704d0c080abSJoseph Pusztay . step - current time-step 705d0c080abSJoseph Pusztay . ptime - current time 70614d0ab18SJacob Faibussowitsch . u - solution at current time 707195e9b02SBarry Smith - dummy - either a viewer or `NULL` 708d0c080abSJoseph Pusztay 709bcf0153eSBarry Smith Options Database Key: 710bcf0153eSBarry Smith . -ts_monitor_draw_error - Monitor error graphically, requires user to have provided `TSSetSolutionFunction()` 7113a61192cSBarry Smith 712d0c080abSJoseph Pusztay Level: intermediate 713d0c080abSJoseph Pusztay 714bcf0153eSBarry Smith Notes: 715bcf0153eSBarry Smith This is not called directly by users, rather one calls `TSMonitorSet()`, with this function as an argument, to cause the monitor 716bcf0153eSBarry Smith to be used during the `TS` integration. 717bcf0153eSBarry Smith 7181cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()`, `TSSetSolutionFunction()` 719d0c080abSJoseph Pusztay @*/ 720d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorDrawError(TS ts, PetscInt step, PetscReal ptime, Vec u, void *dummy) 721d71ae5a4SJacob Faibussowitsch { 722d0c080abSJoseph Pusztay TSMonitorDrawCtx ctx = (TSMonitorDrawCtx)dummy; 723d0c080abSJoseph Pusztay PetscViewer viewer = ctx->viewer; 724d0c080abSJoseph Pusztay Vec work; 725d0c080abSJoseph Pusztay 726d0c080abSJoseph Pusztay PetscFunctionBegin; 7273ba16761SJacob Faibussowitsch if (!(((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && ts->reason))) PetscFunctionReturn(PETSC_SUCCESS); 7289566063dSJacob Faibussowitsch PetscCall(VecDuplicate(u, &work)); 7299566063dSJacob Faibussowitsch PetscCall(TSComputeSolutionFunction(ts, ptime, work)); 7309566063dSJacob Faibussowitsch PetscCall(VecAXPY(work, -1.0, u)); 7319566063dSJacob Faibussowitsch PetscCall(VecView(work, viewer)); 7329566063dSJacob Faibussowitsch PetscCall(VecDestroy(&work)); 7333ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 734d0c080abSJoseph Pusztay } 735d0c080abSJoseph Pusztay 736d0c080abSJoseph Pusztay /*@C 737195e9b02SBarry Smith 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 738d0c080abSJoseph Pusztay 739c3339decSBarry Smith Collective 740d0c080abSJoseph Pusztay 741d0c080abSJoseph Pusztay Input Parameters: 742bcf0153eSBarry Smith + ts - the `TS` context 743d0c080abSJoseph Pusztay . step - current time-step 744d0c080abSJoseph Pusztay . ptime - current time 745d0c080abSJoseph Pusztay . u - current state 746d0c080abSJoseph Pusztay - vf - viewer and its format 747d0c080abSJoseph Pusztay 748d0c080abSJoseph Pusztay Level: intermediate 749d0c080abSJoseph Pusztay 750bcf0153eSBarry Smith Notes: 751bcf0153eSBarry Smith This is not called directly by users, rather one calls `TSMonitorSet()`, with this function as an argument, to cause the monitor 752bcf0153eSBarry Smith to be used during the `TS` integration. 753bcf0153eSBarry Smith 7541cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()` 755d0c080abSJoseph Pusztay @*/ 756d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorSolution(TS ts, PetscInt step, PetscReal ptime, Vec u, PetscViewerAndFormat *vf) 757d71ae5a4SJacob Faibussowitsch { 758d0c080abSJoseph Pusztay PetscFunctionBegin; 7593ba16761SJacob Faibussowitsch if (vf->view_interval > 0 && !ts->reason && step % vf->view_interval != 0) PetscFunctionReturn(PETSC_SUCCESS); 7609566063dSJacob Faibussowitsch PetscCall(PetscViewerPushFormat(vf->viewer, vf->format)); 7619566063dSJacob Faibussowitsch PetscCall(VecView(u, vf->viewer)); 7629566063dSJacob Faibussowitsch PetscCall(PetscViewerPopFormat(vf->viewer)); 7633ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 764d0c080abSJoseph Pusztay } 765d0c080abSJoseph Pusztay 766d0c080abSJoseph Pusztay /*@C 767bcf0153eSBarry Smith TSMonitorSolutionVTK - Monitors progress of the `TS` solvers by `VecView()` for the solution at each timestep. 768d0c080abSJoseph Pusztay 769c3339decSBarry Smith Collective 770d0c080abSJoseph Pusztay 771d0c080abSJoseph Pusztay Input Parameters: 772bcf0153eSBarry Smith + ts - the `TS` context 773d0c080abSJoseph Pusztay . step - current time-step 774d0c080abSJoseph Pusztay . ptime - current time 775d0c080abSJoseph Pusztay . u - current state 77663a3b9bcSJacob Faibussowitsch - filenametemplate - string containing a format specifier for the integer time step (e.g. %03" PetscInt_FMT ") 777d0c080abSJoseph Pusztay 778d0c080abSJoseph Pusztay Level: intermediate 779d0c080abSJoseph Pusztay 780d0c080abSJoseph Pusztay Notes: 781d0c080abSJoseph 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. 782d0c080abSJoseph Pusztay These are named according to the file name template. 783d0c080abSJoseph Pusztay 7843a61192cSBarry Smith This is not called directly by users, rather one calls `TSMonitorSet()`, with this function as an argument, to cause the monitor 785bcf0153eSBarry Smith to be used during the `TS` integration. 786d0c080abSJoseph Pusztay 7871cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()` 788d0c080abSJoseph Pusztay @*/ 789d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorSolutionVTK(TS ts, PetscInt step, PetscReal ptime, Vec u, void *filenametemplate) 790d71ae5a4SJacob Faibussowitsch { 791d0c080abSJoseph Pusztay char filename[PETSC_MAX_PATH_LEN]; 792d0c080abSJoseph Pusztay PetscViewer viewer; 793d0c080abSJoseph Pusztay 794d0c080abSJoseph Pusztay PetscFunctionBegin; 7953ba16761SJacob Faibussowitsch if (step < 0) PetscFunctionReturn(PETSC_SUCCESS); /* -1 indicates interpolated solution */ 7969566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(filename, sizeof(filename), (const char *)filenametemplate, step)); 7979566063dSJacob Faibussowitsch PetscCall(PetscViewerVTKOpen(PetscObjectComm((PetscObject)ts), filename, FILE_MODE_WRITE, &viewer)); 7989566063dSJacob Faibussowitsch PetscCall(VecView(u, viewer)); 7999566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer)); 8003ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 801d0c080abSJoseph Pusztay } 802d0c080abSJoseph Pusztay 803d0c080abSJoseph Pusztay /*@C 804bcf0153eSBarry Smith TSMonitorSolutionVTKDestroy - Destroy filename template string created for use with `TSMonitorSolutionVTK()` 805d0c080abSJoseph Pusztay 806bcf0153eSBarry Smith Not Collective 807d0c080abSJoseph Pusztay 8082fe279fdSBarry Smith Input Parameter: 80963a3b9bcSJacob Faibussowitsch . filenametemplate - string containing a format specifier for the integer time step (e.g. %03" PetscInt_FMT ") 810d0c080abSJoseph Pusztay 811d0c080abSJoseph Pusztay Level: intermediate 812d0c080abSJoseph Pusztay 813d0c080abSJoseph Pusztay Note: 814bcf0153eSBarry Smith This function is normally passed to `TSMonitorSet()` along with `TSMonitorSolutionVTK()`. 815d0c080abSJoseph Pusztay 8161cc06b55SBarry Smith .seealso: [](ch_ts), `TSMonitorSet()`, `TSMonitorSolutionVTK()` 817d0c080abSJoseph Pusztay @*/ 818d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorSolutionVTKDestroy(void *filenametemplate) 819d71ae5a4SJacob Faibussowitsch { 820d0c080abSJoseph Pusztay PetscFunctionBegin; 8219566063dSJacob Faibussowitsch PetscCall(PetscFree(*(char **)filenametemplate)); 8223ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 823d0c080abSJoseph Pusztay } 824d0c080abSJoseph Pusztay 825d0c080abSJoseph Pusztay /*@C 826bcf0153eSBarry Smith TSMonitorLGSolution - Monitors progress of the `TS` solvers by plotting each component of the solution vector 827d0c080abSJoseph Pusztay in a time based line graph 828d0c080abSJoseph Pusztay 829c3339decSBarry Smith Collective 830d0c080abSJoseph Pusztay 831d0c080abSJoseph Pusztay Input Parameters: 832bcf0153eSBarry Smith + ts - the `TS` context 833d0c080abSJoseph Pusztay . step - current time-step 834d0c080abSJoseph Pusztay . ptime - current time 835d0c080abSJoseph Pusztay . u - current solution 836bcf0153eSBarry Smith - dctx - the `TSMonitorLGCtx` object that contains all the options for the monitoring, this is created with `TSMonitorLGCtxCreate()` 837d0c080abSJoseph Pusztay 838bcf0153eSBarry Smith Options Database Key: 83967b8a455SSatish Balay . -ts_monitor_lg_solution_variables - enable monitor of lg solution variables 840d0c080abSJoseph Pusztay 841d0c080abSJoseph Pusztay Level: intermediate 842d0c080abSJoseph Pusztay 843d0c080abSJoseph Pusztay Notes: 844d0c080abSJoseph Pusztay Each process in a parallel run displays its component solutions in a separate window 845d0c080abSJoseph Pusztay 8463a61192cSBarry Smith This is not called directly by users, rather one calls `TSMonitorSet()`, with this function as an argument, to cause the monitor 847bcf0153eSBarry Smith to be used during the `TS` integration. 8483a61192cSBarry Smith 8491cc06b55SBarry Smith .seealso: [](ch_ts), `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()`, `TSMonitorLGCtxCreate()`, `TSMonitorLGCtxSetVariableNames()`, `TSMonitorLGCtxGetVariableNames()`, 850db781477SPatrick Sanan `TSMonitorLGSetVariableNames()`, `TSMonitorLGGetVariableNames()`, `TSMonitorLGSetDisplayVariables()`, `TSMonitorLGCtxSetDisplayVariables()`, 851db781477SPatrick Sanan `TSMonitorLGCtxSetTransform()`, `TSMonitorLGSetTransform()`, `TSMonitorLGError()`, `TSMonitorLGSNESIterations()`, `TSMonitorLGKSPIterations()`, 852db781477SPatrick Sanan `TSMonitorEnvelopeCtxCreate()`, `TSMonitorEnvelopeGetBounds()`, `TSMonitorEnvelopeCtxDestroy()`, `TSMonitorEnvelop()` 853d0c080abSJoseph Pusztay @*/ 854d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGSolution(TS ts, PetscInt step, PetscReal ptime, Vec u, void *dctx) 855d71ae5a4SJacob Faibussowitsch { 856d0c080abSJoseph Pusztay TSMonitorLGCtx ctx = (TSMonitorLGCtx)dctx; 857d0c080abSJoseph Pusztay const PetscScalar *yy; 858d0c080abSJoseph Pusztay Vec v; 859d0c080abSJoseph Pusztay 860d0c080abSJoseph Pusztay PetscFunctionBegin; 8613ba16761SJacob Faibussowitsch if (step < 0) PetscFunctionReturn(PETSC_SUCCESS); /* -1 indicates interpolated solution */ 862d0c080abSJoseph Pusztay if (!step) { 863d0c080abSJoseph Pusztay PetscDrawAxis axis; 864d0c080abSJoseph Pusztay PetscInt dim; 8659566063dSJacob Faibussowitsch PetscCall(PetscDrawLGGetAxis(ctx->lg, &axis)); 8669566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisSetLabels(axis, "Solution as function of time", "Time", "Solution")); 867d0c080abSJoseph Pusztay if (!ctx->names) { 868d0c080abSJoseph Pusztay PetscBool flg; 869d0c080abSJoseph Pusztay /* user provides names of variables to plot but no names has been set so assume names are integer values */ 8709566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(((PetscObject)ts)->options, ((PetscObject)ts)->prefix, "-ts_monitor_lg_solution_variables", &flg)); 871d0c080abSJoseph Pusztay if (flg) { 872d0c080abSJoseph Pusztay PetscInt i, n; 873d0c080abSJoseph Pusztay char **names; 8749566063dSJacob Faibussowitsch PetscCall(VecGetSize(u, &n)); 8759566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(n + 1, &names)); 876d0c080abSJoseph Pusztay for (i = 0; i < n; i++) { 8779566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(5, &names[i])); 87863a3b9bcSJacob Faibussowitsch PetscCall(PetscSNPrintf(names[i], 5, "%" PetscInt_FMT, i)); 879d0c080abSJoseph Pusztay } 880d0c080abSJoseph Pusztay names[n] = NULL; 881d0c080abSJoseph Pusztay ctx->names = names; 882d0c080abSJoseph Pusztay } 883d0c080abSJoseph Pusztay } 884d0c080abSJoseph Pusztay if (ctx->names && !ctx->displaynames) { 885d0c080abSJoseph Pusztay char **displaynames; 886d0c080abSJoseph Pusztay PetscBool flg; 8879566063dSJacob Faibussowitsch PetscCall(VecGetLocalSize(u, &dim)); 8889566063dSJacob Faibussowitsch PetscCall(PetscCalloc1(dim + 1, &displaynames)); 8899566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetStringArray(((PetscObject)ts)->options, ((PetscObject)ts)->prefix, "-ts_monitor_lg_solution_variables", displaynames, &dim, &flg)); 8901baa6e33SBarry Smith if (flg) PetscCall(TSMonitorLGCtxSetDisplayVariables(ctx, (const char *const *)displaynames)); 8919566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&displaynames)); 892d0c080abSJoseph Pusztay } 893d0c080abSJoseph Pusztay if (ctx->displaynames) { 8949566063dSJacob Faibussowitsch PetscCall(PetscDrawLGSetDimension(ctx->lg, ctx->ndisplayvariables)); 8959566063dSJacob Faibussowitsch PetscCall(PetscDrawLGSetLegend(ctx->lg, (const char *const *)ctx->displaynames)); 896d0c080abSJoseph Pusztay } else if (ctx->names) { 8979566063dSJacob Faibussowitsch PetscCall(VecGetLocalSize(u, &dim)); 8989566063dSJacob Faibussowitsch PetscCall(PetscDrawLGSetDimension(ctx->lg, dim)); 8999566063dSJacob Faibussowitsch PetscCall(PetscDrawLGSetLegend(ctx->lg, (const char *const *)ctx->names)); 900d0c080abSJoseph Pusztay } else { 9019566063dSJacob Faibussowitsch PetscCall(VecGetLocalSize(u, &dim)); 9029566063dSJacob Faibussowitsch PetscCall(PetscDrawLGSetDimension(ctx->lg, dim)); 903d0c080abSJoseph Pusztay } 9049566063dSJacob Faibussowitsch PetscCall(PetscDrawLGReset(ctx->lg)); 905d0c080abSJoseph Pusztay } 906d0c080abSJoseph Pusztay 907d0c080abSJoseph Pusztay if (!ctx->transform) v = u; 9089566063dSJacob Faibussowitsch else PetscCall((*ctx->transform)(ctx->transformctx, u, &v)); 9099566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(v, &yy)); 910d0c080abSJoseph Pusztay if (ctx->displaynames) { 911d0c080abSJoseph Pusztay PetscInt i; 9129371c9d4SSatish Balay for (i = 0; i < ctx->ndisplayvariables; i++) ctx->displayvalues[i] = PetscRealPart(yy[ctx->displayvariables[i]]); 9139566063dSJacob Faibussowitsch PetscCall(PetscDrawLGAddCommonPoint(ctx->lg, ptime, ctx->displayvalues)); 914d0c080abSJoseph Pusztay } else { 915d0c080abSJoseph Pusztay #if defined(PETSC_USE_COMPLEX) 916d0c080abSJoseph Pusztay PetscInt i, n; 917d0c080abSJoseph Pusztay PetscReal *yreal; 9189566063dSJacob Faibussowitsch PetscCall(VecGetLocalSize(v, &n)); 9199566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(n, &yreal)); 920d0c080abSJoseph Pusztay for (i = 0; i < n; i++) yreal[i] = PetscRealPart(yy[i]); 9219566063dSJacob Faibussowitsch PetscCall(PetscDrawLGAddCommonPoint(ctx->lg, ptime, yreal)); 9229566063dSJacob Faibussowitsch PetscCall(PetscFree(yreal)); 923d0c080abSJoseph Pusztay #else 9249566063dSJacob Faibussowitsch PetscCall(PetscDrawLGAddCommonPoint(ctx->lg, ptime, yy)); 925d0c080abSJoseph Pusztay #endif 926d0c080abSJoseph Pusztay } 9279566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(v, &yy)); 9289566063dSJacob Faibussowitsch if (ctx->transform) PetscCall(VecDestroy(&v)); 929d0c080abSJoseph Pusztay 930d0c080abSJoseph Pusztay if (((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && ts->reason)) { 9319566063dSJacob Faibussowitsch PetscCall(PetscDrawLGDraw(ctx->lg)); 9329566063dSJacob Faibussowitsch PetscCall(PetscDrawLGSave(ctx->lg)); 933d0c080abSJoseph Pusztay } 9343ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 935d0c080abSJoseph Pusztay } 936d0c080abSJoseph Pusztay 937d0c080abSJoseph Pusztay /*@C 938d0c080abSJoseph Pusztay TSMonitorLGSetVariableNames - Sets the name of each component in the solution vector so that it may be displayed in the plot 939d0c080abSJoseph Pusztay 940c3339decSBarry Smith Collective 941d0c080abSJoseph Pusztay 942d0c080abSJoseph Pusztay Input Parameters: 943bcf0153eSBarry Smith + ts - the `TS` context 944195e9b02SBarry Smith - names - the names of the components, final string must be `NULL` 945d0c080abSJoseph Pusztay 946d0c080abSJoseph Pusztay Level: intermediate 947d0c080abSJoseph Pusztay 948d0c080abSJoseph Pusztay Notes: 949bcf0153eSBarry Smith If the `TS` object does not have a `TSMonitorLGCtx` associated with it then this function is ignored 950d0c080abSJoseph Pusztay 9511cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()`, `TSMonitorLGSetDisplayVariables()`, `TSMonitorLGCtxSetVariableNames()` 952d0c080abSJoseph Pusztay @*/ 953d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGSetVariableNames(TS ts, const char *const *names) 954d71ae5a4SJacob Faibussowitsch { 955d0c080abSJoseph Pusztay PetscInt i; 956d0c080abSJoseph Pusztay 957d0c080abSJoseph Pusztay PetscFunctionBegin; 958d0c080abSJoseph Pusztay for (i = 0; i < ts->numbermonitors; i++) { 959d0c080abSJoseph Pusztay if (ts->monitor[i] == TSMonitorLGSolution) { 9609566063dSJacob Faibussowitsch PetscCall(TSMonitorLGCtxSetVariableNames((TSMonitorLGCtx)ts->monitorcontext[i], names)); 961d0c080abSJoseph Pusztay break; 962d0c080abSJoseph Pusztay } 963d0c080abSJoseph Pusztay } 9643ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 965d0c080abSJoseph Pusztay } 966d0c080abSJoseph Pusztay 967d0c080abSJoseph Pusztay /*@C 968d0c080abSJoseph Pusztay TSMonitorLGCtxSetVariableNames - Sets the name of each component in the solution vector so that it may be displayed in the plot 969d0c080abSJoseph Pusztay 970c3339decSBarry Smith Collective 971d0c080abSJoseph Pusztay 972d0c080abSJoseph Pusztay Input Parameters: 973b43aa488SJacob Faibussowitsch + ctx - the `TS` context 974195e9b02SBarry Smith - names - the names of the components, final string must be `NULL` 975d0c080abSJoseph Pusztay 976d0c080abSJoseph Pusztay Level: intermediate 977d0c080abSJoseph Pusztay 9781cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()`, `TSMonitorLGSetDisplayVariables()`, `TSMonitorLGSetVariableNames()` 979d0c080abSJoseph Pusztay @*/ 980d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGCtxSetVariableNames(TSMonitorLGCtx ctx, const char *const *names) 981d71ae5a4SJacob Faibussowitsch { 982d0c080abSJoseph Pusztay PetscFunctionBegin; 9839566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&ctx->names)); 9849566063dSJacob Faibussowitsch PetscCall(PetscStrArrayallocpy(names, &ctx->names)); 9853ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 986d0c080abSJoseph Pusztay } 987d0c080abSJoseph Pusztay 988d0c080abSJoseph Pusztay /*@C 989d0c080abSJoseph Pusztay TSMonitorLGGetVariableNames - Gets the name of each component in the solution vector so that it may be displayed in the plot 990d0c080abSJoseph Pusztay 991c3339decSBarry Smith Collective 992d0c080abSJoseph Pusztay 993d0c080abSJoseph Pusztay Input Parameter: 994bcf0153eSBarry Smith . ts - the `TS` context 995d0c080abSJoseph Pusztay 996d0c080abSJoseph Pusztay Output Parameter: 997195e9b02SBarry Smith . names - the names of the components, final string must be `NULL` 998d0c080abSJoseph Pusztay 999d0c080abSJoseph Pusztay Level: intermediate 1000d0c080abSJoseph Pusztay 1001bcf0153eSBarry Smith Note: 1002bcf0153eSBarry Smith If the `TS` object does not have a `TSMonitorLGCtx` associated with it then this function is ignored 1003d0c080abSJoseph Pusztay 10041cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()`, `TSMonitorLGSetDisplayVariables()` 1005d0c080abSJoseph Pusztay @*/ 1006d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGGetVariableNames(TS ts, const char *const **names) 1007d71ae5a4SJacob Faibussowitsch { 1008d0c080abSJoseph Pusztay PetscInt i; 1009d0c080abSJoseph Pusztay 1010d0c080abSJoseph Pusztay PetscFunctionBegin; 1011d0c080abSJoseph Pusztay *names = NULL; 1012d0c080abSJoseph Pusztay for (i = 0; i < ts->numbermonitors; i++) { 1013d0c080abSJoseph Pusztay if (ts->monitor[i] == TSMonitorLGSolution) { 1014d0c080abSJoseph Pusztay TSMonitorLGCtx ctx = (TSMonitorLGCtx)ts->monitorcontext[i]; 1015d0c080abSJoseph Pusztay *names = (const char *const *)ctx->names; 1016d0c080abSJoseph Pusztay break; 1017d0c080abSJoseph Pusztay } 1018d0c080abSJoseph Pusztay } 10193ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1020d0c080abSJoseph Pusztay } 1021d0c080abSJoseph Pusztay 1022d0c080abSJoseph Pusztay /*@C 1023d0c080abSJoseph Pusztay TSMonitorLGCtxSetDisplayVariables - Sets the variables that are to be display in the monitor 1024d0c080abSJoseph Pusztay 1025c3339decSBarry Smith Collective 1026d0c080abSJoseph Pusztay 1027d0c080abSJoseph Pusztay Input Parameters: 1028bcf0153eSBarry Smith + ctx - the `TSMonitorLG` context 1029195e9b02SBarry Smith - displaynames - the names of the components, final string must be `NULL` 1030d0c080abSJoseph Pusztay 1031d0c080abSJoseph Pusztay Level: intermediate 1032d0c080abSJoseph Pusztay 10331cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()`, `TSMonitorLGSetVariableNames()` 1034d0c080abSJoseph Pusztay @*/ 1035d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGCtxSetDisplayVariables(TSMonitorLGCtx ctx, const char *const *displaynames) 1036d71ae5a4SJacob Faibussowitsch { 1037d0c080abSJoseph Pusztay PetscInt j = 0, k; 1038d0c080abSJoseph Pusztay 1039d0c080abSJoseph Pusztay PetscFunctionBegin; 10403ba16761SJacob Faibussowitsch if (!ctx->names) PetscFunctionReturn(PETSC_SUCCESS); 10419566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&ctx->displaynames)); 10429566063dSJacob Faibussowitsch PetscCall(PetscStrArrayallocpy(displaynames, &ctx->displaynames)); 1043d0c080abSJoseph Pusztay while (displaynames[j]) j++; 1044d0c080abSJoseph Pusztay ctx->ndisplayvariables = j; 10459566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(ctx->ndisplayvariables, &ctx->displayvariables)); 10469566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(ctx->ndisplayvariables, &ctx->displayvalues)); 1047d0c080abSJoseph Pusztay j = 0; 1048d0c080abSJoseph Pusztay while (displaynames[j]) { 1049d0c080abSJoseph Pusztay k = 0; 1050d0c080abSJoseph Pusztay while (ctx->names[k]) { 1051d0c080abSJoseph Pusztay PetscBool flg; 10529566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(displaynames[j], ctx->names[k], &flg)); 1053d0c080abSJoseph Pusztay if (flg) { 1054d0c080abSJoseph Pusztay ctx->displayvariables[j] = k; 1055d0c080abSJoseph Pusztay break; 1056d0c080abSJoseph Pusztay } 1057d0c080abSJoseph Pusztay k++; 1058d0c080abSJoseph Pusztay } 1059d0c080abSJoseph Pusztay j++; 1060d0c080abSJoseph Pusztay } 10613ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1062d0c080abSJoseph Pusztay } 1063d0c080abSJoseph Pusztay 1064d0c080abSJoseph Pusztay /*@C 1065d0c080abSJoseph Pusztay TSMonitorLGSetDisplayVariables - Sets the variables that are to be display in the monitor 1066d0c080abSJoseph Pusztay 1067c3339decSBarry Smith Collective 1068d0c080abSJoseph Pusztay 1069d0c080abSJoseph Pusztay Input Parameters: 1070bcf0153eSBarry Smith + ts - the `TS` context 1071195e9b02SBarry Smith - displaynames - the names of the components, final string must be `NULL` 1072d0c080abSJoseph Pusztay 1073d0c080abSJoseph Pusztay Level: intermediate 1074d0c080abSJoseph Pusztay 1075bcf0153eSBarry Smith Note: 1076bcf0153eSBarry Smith If the `TS` object does not have a `TSMonitorLGCtx` associated with it then this function is ignored 1077bcf0153eSBarry Smith 10781cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()`, `TSMonitorLGSetVariableNames()` 1079d0c080abSJoseph Pusztay @*/ 1080d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGSetDisplayVariables(TS ts, const char *const *displaynames) 1081d71ae5a4SJacob Faibussowitsch { 1082d0c080abSJoseph Pusztay PetscInt i; 1083d0c080abSJoseph Pusztay 1084d0c080abSJoseph Pusztay PetscFunctionBegin; 1085d0c080abSJoseph Pusztay for (i = 0; i < ts->numbermonitors; i++) { 1086d0c080abSJoseph Pusztay if (ts->monitor[i] == TSMonitorLGSolution) { 10879566063dSJacob Faibussowitsch PetscCall(TSMonitorLGCtxSetDisplayVariables((TSMonitorLGCtx)ts->monitorcontext[i], displaynames)); 1088d0c080abSJoseph Pusztay break; 1089d0c080abSJoseph Pusztay } 1090d0c080abSJoseph Pusztay } 10913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1092d0c080abSJoseph Pusztay } 1093d0c080abSJoseph Pusztay 1094d0c080abSJoseph Pusztay /*@C 1095d0c080abSJoseph Pusztay TSMonitorLGSetTransform - Solution vector will be transformed by provided function before being displayed 1096d0c080abSJoseph Pusztay 1097c3339decSBarry Smith Collective 1098d0c080abSJoseph Pusztay 1099d0c080abSJoseph Pusztay Input Parameters: 1100bcf0153eSBarry Smith + ts - the `TS` context 1101d0c080abSJoseph Pusztay . transform - the transform function 1102d0c080abSJoseph Pusztay . destroy - function to destroy the optional context 1103b43aa488SJacob Faibussowitsch - tctx - optional context used by transform function 1104d0c080abSJoseph Pusztay 1105d0c080abSJoseph Pusztay Level: intermediate 1106d0c080abSJoseph Pusztay 1107bcf0153eSBarry Smith Note: 1108bcf0153eSBarry Smith If the `TS` object does not have a `TSMonitorLGCtx` associated with it then this function is ignored 1109bcf0153eSBarry Smith 11101cc06b55SBarry Smith .seealso: [](ch_ts), `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()`, `TSMonitorLGSetVariableNames()`, `TSMonitorLGCtxSetTransform()` 1111d0c080abSJoseph Pusztay @*/ 1112d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGSetTransform(TS ts, PetscErrorCode (*transform)(void *, Vec, Vec *), PetscErrorCode (*destroy)(void *), void *tctx) 1113d71ae5a4SJacob Faibussowitsch { 1114d0c080abSJoseph Pusztay PetscInt i; 1115d0c080abSJoseph Pusztay 1116d0c080abSJoseph Pusztay PetscFunctionBegin; 1117d0c080abSJoseph Pusztay for (i = 0; i < ts->numbermonitors; i++) { 111848a46eb9SPierre Jolivet if (ts->monitor[i] == TSMonitorLGSolution) PetscCall(TSMonitorLGCtxSetTransform((TSMonitorLGCtx)ts->monitorcontext[i], transform, destroy, tctx)); 1119d0c080abSJoseph Pusztay } 11203ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1121d0c080abSJoseph Pusztay } 1122d0c080abSJoseph Pusztay 1123d0c080abSJoseph Pusztay /*@C 1124d0c080abSJoseph Pusztay TSMonitorLGCtxSetTransform - Solution vector will be transformed by provided function before being displayed 1125d0c080abSJoseph Pusztay 1126c3339decSBarry Smith Collective 1127d0c080abSJoseph Pusztay 1128d0c080abSJoseph Pusztay Input Parameters: 1129b43aa488SJacob Faibussowitsch + tctx - the `TS` context 1130d0c080abSJoseph Pusztay . transform - the transform function 1131d0c080abSJoseph Pusztay . destroy - function to destroy the optional context 1132d0c080abSJoseph Pusztay - ctx - optional context used by transform function 1133d0c080abSJoseph Pusztay 1134d0c080abSJoseph Pusztay Level: intermediate 1135d0c080abSJoseph Pusztay 11361cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()`, `TSMonitorLGSetVariableNames()`, `TSMonitorLGSetTransform()` 1137d0c080abSJoseph Pusztay @*/ 1138d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGCtxSetTransform(TSMonitorLGCtx ctx, PetscErrorCode (*transform)(void *, Vec, Vec *), PetscErrorCode (*destroy)(void *), void *tctx) 1139d71ae5a4SJacob Faibussowitsch { 1140d0c080abSJoseph Pusztay PetscFunctionBegin; 1141d0c080abSJoseph Pusztay ctx->transform = transform; 1142d0c080abSJoseph Pusztay ctx->transformdestroy = destroy; 1143d0c080abSJoseph Pusztay ctx->transformctx = tctx; 11443ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1145d0c080abSJoseph Pusztay } 1146d0c080abSJoseph Pusztay 1147d0c080abSJoseph Pusztay /*@C 1148bcf0153eSBarry Smith TSMonitorLGError - Monitors progress of the `TS` solvers by plotting each component of the error 1149d0c080abSJoseph Pusztay in a time based line graph 1150d0c080abSJoseph Pusztay 1151c3339decSBarry Smith Collective 1152d0c080abSJoseph Pusztay 1153d0c080abSJoseph Pusztay Input Parameters: 1154bcf0153eSBarry Smith + ts - the `TS` context 1155d0c080abSJoseph Pusztay . step - current time-step 1156d0c080abSJoseph Pusztay . ptime - current time 1157d0c080abSJoseph Pusztay . u - current solution 1158b43aa488SJacob Faibussowitsch - dummy - `TSMonitorLGCtx` object created with `TSMonitorLGCtxCreate()` 1159d0c080abSJoseph Pusztay 1160bcf0153eSBarry Smith Options Database Key: 11613a61192cSBarry Smith . -ts_monitor_lg_error - create a graphical monitor of error history 11623a61192cSBarry Smith 1163d0c080abSJoseph Pusztay Level: intermediate 1164d0c080abSJoseph Pusztay 1165d0c080abSJoseph Pusztay Notes: 1166d0c080abSJoseph Pusztay Each process in a parallel run displays its component errors in a separate window 1167d0c080abSJoseph Pusztay 1168bcf0153eSBarry Smith The user must provide the solution using `TSSetSolutionFunction()` to use this monitor. 1169d0c080abSJoseph Pusztay 11703a61192cSBarry Smith This is not called directly by users, rather one calls `TSMonitorSet()`, with this function as an argument, to cause the monitor 11713a61192cSBarry Smith to be used during the TS integration. 1172d0c080abSJoseph Pusztay 11731cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()`, `TSSetSolutionFunction()` 1174d0c080abSJoseph Pusztay @*/ 1175d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGError(TS ts, PetscInt step, PetscReal ptime, Vec u, void *dummy) 1176d71ae5a4SJacob Faibussowitsch { 1177d0c080abSJoseph Pusztay TSMonitorLGCtx ctx = (TSMonitorLGCtx)dummy; 1178d0c080abSJoseph Pusztay const PetscScalar *yy; 1179d0c080abSJoseph Pusztay Vec y; 1180d0c080abSJoseph Pusztay 1181d0c080abSJoseph Pusztay PetscFunctionBegin; 1182d0c080abSJoseph Pusztay if (!step) { 1183d0c080abSJoseph Pusztay PetscDrawAxis axis; 1184d0c080abSJoseph Pusztay PetscInt dim; 11859566063dSJacob Faibussowitsch PetscCall(PetscDrawLGGetAxis(ctx->lg, &axis)); 11869566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisSetLabels(axis, "Error in solution as function of time", "Time", "Error")); 11879566063dSJacob Faibussowitsch PetscCall(VecGetLocalSize(u, &dim)); 11889566063dSJacob Faibussowitsch PetscCall(PetscDrawLGSetDimension(ctx->lg, dim)); 11899566063dSJacob Faibussowitsch PetscCall(PetscDrawLGReset(ctx->lg)); 1190d0c080abSJoseph Pusztay } 11919566063dSJacob Faibussowitsch PetscCall(VecDuplicate(u, &y)); 11929566063dSJacob Faibussowitsch PetscCall(TSComputeSolutionFunction(ts, ptime, y)); 11939566063dSJacob Faibussowitsch PetscCall(VecAXPY(y, -1.0, u)); 11949566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(y, &yy)); 1195d0c080abSJoseph Pusztay #if defined(PETSC_USE_COMPLEX) 1196d0c080abSJoseph Pusztay { 1197d0c080abSJoseph Pusztay PetscReal *yreal; 1198d0c080abSJoseph Pusztay PetscInt i, n; 11999566063dSJacob Faibussowitsch PetscCall(VecGetLocalSize(y, &n)); 12009566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(n, &yreal)); 1201d0c080abSJoseph Pusztay for (i = 0; i < n; i++) yreal[i] = PetscRealPart(yy[i]); 12029566063dSJacob Faibussowitsch PetscCall(PetscDrawLGAddCommonPoint(ctx->lg, ptime, yreal)); 12039566063dSJacob Faibussowitsch PetscCall(PetscFree(yreal)); 1204d0c080abSJoseph Pusztay } 1205d0c080abSJoseph Pusztay #else 12069566063dSJacob Faibussowitsch PetscCall(PetscDrawLGAddCommonPoint(ctx->lg, ptime, yy)); 1207d0c080abSJoseph Pusztay #endif 12089566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(y, &yy)); 12099566063dSJacob Faibussowitsch PetscCall(VecDestroy(&y)); 1210d0c080abSJoseph Pusztay if (((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && ts->reason)) { 12119566063dSJacob Faibussowitsch PetscCall(PetscDrawLGDraw(ctx->lg)); 12129566063dSJacob Faibussowitsch PetscCall(PetscDrawLGSave(ctx->lg)); 1213d0c080abSJoseph Pusztay } 12143ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1215d0c080abSJoseph Pusztay } 1216d0c080abSJoseph Pusztay 1217d0c080abSJoseph Pusztay /*@C 1218bcf0153eSBarry Smith TSMonitorSPSwarmSolution - Graphically displays phase plots of `DMSWARM` particles on a scatter plot 1219d0c080abSJoseph Pusztay 1220d0c080abSJoseph Pusztay Input Parameters: 1221bcf0153eSBarry Smith + ts - the `TS` context 1222d0c080abSJoseph Pusztay . step - current time-step 1223d0c080abSJoseph Pusztay . ptime - current time 1224d0c080abSJoseph Pusztay . u - current solution 1225bcf0153eSBarry Smith - dctx - the `TSMonitorSPCtx` object that contains all the options for the monitoring, this is created with `TSMonitorSPCtxCreate()` 1226d0c080abSJoseph Pusztay 1227bcf0153eSBarry Smith Options Database Keys: 1228d7462660SMatthew Knepley + -ts_monitor_sp_swarm <n> - Monitor the solution every n steps, or -1 for plotting only the final solution 1229d7462660SMatthew Knepley . -ts_monitor_sp_swarm_retain <n> - Retain n old points so we can see the history, or -1 for all points 123020f4b53cSBarry Smith . -ts_monitor_sp_swarm_multi_species <bool> - Color each species differently 1231d7462660SMatthew Knepley - -ts_monitor_sp_swarm_phase <bool> - Plot in phase space, as opposed to coordinate space 1232d0c080abSJoseph Pusztay 1233d0c080abSJoseph Pusztay Level: intermediate 1234d0c080abSJoseph Pusztay 12353a61192cSBarry Smith Notes: 12363a61192cSBarry Smith This is not called directly by users, rather one calls `TSMonitorSet()`, with this function as an argument, to cause the monitor 1237bcf0153eSBarry Smith to be used during the `TS` integration. 12383a61192cSBarry Smith 12391cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitoSet()`, `DMSWARM`, `TSMonitorSPCtxCreate()` 1240d0c080abSJoseph Pusztay @*/ 1241d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorSPSwarmSolution(TS ts, PetscInt step, PetscReal ptime, Vec u, void *dctx) 1242d71ae5a4SJacob Faibussowitsch { 1243d0c080abSJoseph Pusztay TSMonitorSPCtx ctx = (TSMonitorSPCtx)dctx; 1244f98b2f00SMatthew G. Knepley PetscDraw draw; 1245d7462660SMatthew Knepley DM dm, cdm; 1246d0c080abSJoseph Pusztay const PetscScalar *yy; 124760e16b1bSMatthew G. Knepley PetscInt Np, p, dim = 2, *species; 124860e16b1bSMatthew G. Knepley PetscReal species_color; 1249d0c080abSJoseph Pusztay 1250d0c080abSJoseph Pusztay PetscFunctionBegin; 12513ba16761SJacob Faibussowitsch if (step < 0) PetscFunctionReturn(PETSC_SUCCESS); /* -1 indicates interpolated solution */ 125260e16b1bSMatthew G. Knepley PetscCall(TSGetDM(ts, &dm)); 1253d0c080abSJoseph Pusztay if (!step) { 1254d0c080abSJoseph Pusztay PetscDrawAxis axis; 1255ab43fcacSJoe Pusztay PetscReal dmboxlower[2], dmboxupper[2]; 1256f98b2f00SMatthew G. Knepley 12579566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 12589566063dSJacob Faibussowitsch PetscCall(DMGetDimension(dm, &dim)); 12593c633725SBarry Smith PetscCheck(dim == 2, PETSC_COMM_SELF, PETSC_ERR_SUP, "Monitor only supports two dimensional fields"); 12609566063dSJacob Faibussowitsch PetscCall(DMSwarmGetCellDM(dm, &cdm)); 12619566063dSJacob Faibussowitsch PetscCall(DMGetBoundingBox(cdm, dmboxlower, dmboxupper)); 12629566063dSJacob Faibussowitsch PetscCall(VecGetLocalSize(u, &Np)); 1263d7462660SMatthew Knepley Np /= dim * 2; 12649566063dSJacob Faibussowitsch PetscCall(PetscDrawSPGetAxis(ctx->sp, &axis)); 12658c87cf4dSdanfinn if (ctx->phase) { 12669566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisSetLabels(axis, "Particles", "X", "V")); 126760e16b1bSMatthew G. Knepley PetscCall(PetscDrawAxisSetLimits(axis, dmboxlower[0], dmboxupper[0], -10, 10)); 12688c87cf4dSdanfinn } else { 12699566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisSetLabels(axis, "Particles", "X", "Y")); 12709566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisSetLimits(axis, dmboxlower[0], dmboxupper[0], dmboxlower[1], dmboxupper[1])); 12718c87cf4dSdanfinn } 12729566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisSetHoldLimits(axis, PETSC_TRUE)); 12739566063dSJacob Faibussowitsch PetscCall(PetscDrawSPReset(ctx->sp)); 1274d0c080abSJoseph Pusztay } 127560e16b1bSMatthew G. Knepley if (ctx->multispecies) PetscCall(DMSwarmGetField(dm, "species", NULL, NULL, (void **)&species)); 12769566063dSJacob Faibussowitsch PetscCall(VecGetLocalSize(u, &Np)); 1277d7462660SMatthew Knepley Np /= dim * 2; 1278d0c080abSJoseph Pusztay if (((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && ts->reason)) { 12799566063dSJacob Faibussowitsch PetscCall(PetscDrawSPGetDraw(ctx->sp, &draw)); 128048a46eb9SPierre Jolivet if ((ctx->retain == 0) || (ctx->retain > 0 && !(step % ctx->retain))) PetscCall(PetscDrawClear(draw)); 12819566063dSJacob Faibussowitsch PetscCall(PetscDrawFlush(draw)); 12829566063dSJacob Faibussowitsch PetscCall(PetscDrawSPReset(ctx->sp)); 1283f98b2f00SMatthew G. Knepley PetscCall(VecGetArrayRead(u, &yy)); 1284f98b2f00SMatthew G. Knepley for (p = 0; p < Np; ++p) { 1285f98b2f00SMatthew G. Knepley PetscReal x, y; 1286f98b2f00SMatthew G. Knepley 1287f98b2f00SMatthew G. Knepley if (ctx->phase) { 1288f98b2f00SMatthew G. Knepley x = PetscRealPart(yy[p * dim * 2]); 1289f98b2f00SMatthew G. Knepley y = PetscRealPart(yy[p * dim * 2 + dim]); 1290f98b2f00SMatthew G. Knepley } else { 1291f98b2f00SMatthew G. Knepley x = PetscRealPart(yy[p * dim * 2]); 1292f98b2f00SMatthew G. Knepley y = PetscRealPart(yy[p * dim * 2 + 1]); 1293f98b2f00SMatthew G. Knepley } 129460e16b1bSMatthew G. Knepley if (ctx->multispecies) { 129560e16b1bSMatthew G. Knepley species_color = species[p] + 2; 129660e16b1bSMatthew G. Knepley PetscCall(PetscDrawSPAddPointColorized(ctx->sp, &x, &y, &species_color)); 129760e16b1bSMatthew G. Knepley } else { 129860e16b1bSMatthew G. Knepley PetscCall(PetscDrawSPAddPoint(ctx->sp, &x, &y)); 129960e16b1bSMatthew G. Knepley } 1300f98b2f00SMatthew G. Knepley PetscCall(PetscDrawSPAddPoint(ctx->sp, &x, &y)); 1301f98b2f00SMatthew G. Knepley } 1302f98b2f00SMatthew G. Knepley PetscCall(VecRestoreArrayRead(u, &yy)); 13039566063dSJacob Faibussowitsch PetscCall(PetscDrawSPDraw(ctx->sp, PETSC_FALSE)); 13049566063dSJacob Faibussowitsch PetscCall(PetscDrawSPSave(ctx->sp)); 130560e16b1bSMatthew G. Knepley if (ctx->multispecies) PetscCall(DMSwarmRestoreField(dm, "species", NULL, NULL, (void **)&species)); 130660e16b1bSMatthew G. Knepley } 130760e16b1bSMatthew G. Knepley PetscFunctionReturn(PETSC_SUCCESS); 130860e16b1bSMatthew G. Knepley } 130960e16b1bSMatthew G. Knepley 131060e16b1bSMatthew G. Knepley /*@C 131120f4b53cSBarry Smith TSMonitorHGSwarmSolution - Graphically displays histograms of `DMSWARM` particles 131260e16b1bSMatthew G. Knepley 131360e16b1bSMatthew G. Knepley Input Parameters: 131420f4b53cSBarry Smith + ts - the `TS` context 131560e16b1bSMatthew G. Knepley . step - current time-step 131660e16b1bSMatthew G. Knepley . ptime - current time 131760e16b1bSMatthew G. Knepley . u - current solution 131820f4b53cSBarry Smith - dctx - the `TSMonitorSPCtx` object that contains all the options for the monitoring, this is created with `TSMonitorHGCtxCreate()` 131960e16b1bSMatthew G. Knepley 132020f4b53cSBarry Smith Options Database Keys: 132160e16b1bSMatthew G. Knepley + -ts_monitor_hg_swarm <n> - Monitor the solution every n steps, or -1 for plotting only the final solution 132260e16b1bSMatthew G. Knepley . -ts_monitor_hg_swarm_species <num> - Number of species to histogram 132360e16b1bSMatthew G. Knepley . -ts_monitor_hg_swarm_bins <num> - Number of histogram bins 132460e16b1bSMatthew G. Knepley - -ts_monitor_hg_swarm_velocity <bool> - Plot in velocity space, as opposed to coordinate space 132560e16b1bSMatthew G. Knepley 132660e16b1bSMatthew G. Knepley Level: intermediate 132760e16b1bSMatthew G. Knepley 132820f4b53cSBarry Smith Note: 132960e16b1bSMatthew G. Knepley This is not called directly by users, rather one calls `TSMonitorSet()`, with this function as an argument, to cause the monitor 133060e16b1bSMatthew G. Knepley to be used during the `TS` integration. 133160e16b1bSMatthew G. Knepley 133260e16b1bSMatthew G. Knepley .seealso: `TSMonitoSet()` 133360e16b1bSMatthew G. Knepley @*/ 133460e16b1bSMatthew G. Knepley PetscErrorCode TSMonitorHGSwarmSolution(TS ts, PetscInt step, PetscReal ptime, Vec u, void *dctx) 133560e16b1bSMatthew G. Knepley { 133660e16b1bSMatthew G. Knepley TSMonitorHGCtx ctx = (TSMonitorHGCtx)dctx; 133760e16b1bSMatthew G. Knepley PetscDraw draw; 133860e16b1bSMatthew G. Knepley DM sw; 133960e16b1bSMatthew G. Knepley const PetscScalar *yy; 134060e16b1bSMatthew G. Knepley PetscInt *species; 134160e16b1bSMatthew G. Knepley PetscInt dim, d = 0, Np, p, Ns, s; 134260e16b1bSMatthew G. Knepley 134360e16b1bSMatthew G. Knepley PetscFunctionBegin; 134460e16b1bSMatthew G. Knepley if (step < 0) PetscFunctionReturn(PETSC_SUCCESS); /* -1 indicates interpolated solution */ 134560e16b1bSMatthew G. Knepley PetscCall(TSGetDM(ts, &sw)); 134660e16b1bSMatthew G. Knepley PetscCall(DMGetDimension(sw, &dim)); 134760e16b1bSMatthew G. Knepley PetscCall(DMSwarmGetNumSpecies(sw, &Ns)); 134860e16b1bSMatthew G. Knepley Ns = PetscMin(Ns, ctx->Ns); 134960e16b1bSMatthew G. Knepley PetscCall(VecGetLocalSize(u, &Np)); 135060e16b1bSMatthew G. Knepley Np /= dim * 2; 135160e16b1bSMatthew G. Knepley if (!step) { 135260e16b1bSMatthew G. Knepley PetscDrawAxis axis; 135360e16b1bSMatthew G. Knepley char title[PETSC_MAX_PATH_LEN]; 135460e16b1bSMatthew G. Knepley 135560e16b1bSMatthew G. Knepley for (s = 0; s < Ns; ++s) { 135660e16b1bSMatthew G. Knepley PetscCall(PetscDrawHGGetAxis(ctx->hg[s], &axis)); 135760e16b1bSMatthew G. Knepley PetscCall(PetscSNPrintf(title, PETSC_MAX_PATH_LEN, "Species %" PetscInt_FMT, s)); 135860e16b1bSMatthew G. Knepley if (ctx->velocity) PetscCall(PetscDrawAxisSetLabels(axis, title, "V", "N")); 135960e16b1bSMatthew G. Knepley else PetscCall(PetscDrawAxisSetLabels(axis, title, "X", "N")); 136060e16b1bSMatthew G. Knepley } 136160e16b1bSMatthew G. Knepley } 136260e16b1bSMatthew G. Knepley if (((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && ts->reason)) { 136360e16b1bSMatthew G. Knepley PetscCall(DMSwarmGetField(sw, "species", NULL, NULL, (void **)&species)); 136460e16b1bSMatthew G. Knepley for (s = 0; s < Ns; ++s) { 136560e16b1bSMatthew G. Knepley PetscCall(PetscDrawHGReset(ctx->hg[s])); 136660e16b1bSMatthew G. Knepley PetscCall(PetscDrawHGGetDraw(ctx->hg[s], &draw)); 136760e16b1bSMatthew G. Knepley PetscCall(PetscDrawClear(draw)); 136860e16b1bSMatthew G. Knepley PetscCall(PetscDrawFlush(draw)); 136960e16b1bSMatthew G. Knepley } 137060e16b1bSMatthew G. Knepley PetscCall(VecGetArrayRead(u, &yy)); 137160e16b1bSMatthew G. Knepley for (p = 0; p < Np; ++p) { 137260e16b1bSMatthew G. Knepley const PetscInt s = species[p] < Ns ? species[p] : 0; 137360e16b1bSMatthew G. Knepley PetscReal v; 137460e16b1bSMatthew G. Knepley 137560e16b1bSMatthew G. Knepley if (ctx->velocity) v = PetscRealPart(yy[p * dim * 2 + d + dim]); 137660e16b1bSMatthew G. Knepley else v = PetscRealPart(yy[p * dim * 2 + d]); 137760e16b1bSMatthew G. Knepley PetscCall(PetscDrawHGAddValue(ctx->hg[s], v)); 137860e16b1bSMatthew G. Knepley } 137960e16b1bSMatthew G. Knepley PetscCall(VecRestoreArrayRead(u, &yy)); 138060e16b1bSMatthew G. Knepley for (s = 0; s < Ns; ++s) { 138160e16b1bSMatthew G. Knepley PetscCall(PetscDrawHGDraw(ctx->hg[s])); 138260e16b1bSMatthew G. Knepley PetscCall(PetscDrawHGSave(ctx->hg[s])); 138360e16b1bSMatthew G. Knepley } 138460e16b1bSMatthew G. Knepley PetscCall(DMSwarmRestoreField(sw, "species", NULL, NULL, (void **)&species)); 1385d0c080abSJoseph Pusztay } 13863ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1387d0c080abSJoseph Pusztay } 1388d0c080abSJoseph Pusztay 1389d0c080abSJoseph Pusztay /*@C 1390bcf0153eSBarry Smith TSMonitorError - Monitors progress of the `TS` solvers by printing the 2 norm of the error at each timestep 1391d0c080abSJoseph Pusztay 1392c3339decSBarry Smith Collective 1393d0c080abSJoseph Pusztay 1394d0c080abSJoseph Pusztay Input Parameters: 1395bcf0153eSBarry Smith + ts - the `TS` context 1396d0c080abSJoseph Pusztay . step - current time-step 1397d0c080abSJoseph Pusztay . ptime - current time 1398d0c080abSJoseph Pusztay . u - current solution 1399b43aa488SJacob Faibussowitsch - vf - unused context 1400d0c080abSJoseph Pusztay 1401bcf0153eSBarry Smith Options Database Key: 1402bcf0153eSBarry Smith . -ts_monitor_error - create a graphical monitor of error history 1403bcf0153eSBarry Smith 1404d0c080abSJoseph Pusztay Level: intermediate 1405d0c080abSJoseph Pusztay 14063a61192cSBarry Smith Notes: 14073a61192cSBarry Smith This is not called directly by users, rather one calls `TSMonitorSet()`, with this function as an argument, to cause the monitor 1408bcf0153eSBarry Smith to be used during the `TS` integration. 14093a61192cSBarry Smith 1410bcf0153eSBarry Smith The user must provide the solution using `TSSetSolutionFunction()` to use this monitor. 1411d0c080abSJoseph Pusztay 14121cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()`, `TSSetSolutionFunction()` 1413d0c080abSJoseph Pusztay @*/ 1414d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorError(TS ts, PetscInt step, PetscReal ptime, Vec u, PetscViewerAndFormat *vf) 1415d71ae5a4SJacob Faibussowitsch { 141607eaae0cSMatthew G. Knepley DM dm; 141707eaae0cSMatthew G. Knepley PetscDS ds = NULL; 141807eaae0cSMatthew G. Knepley PetscInt Nf = -1, f; 1419d0c080abSJoseph Pusztay PetscBool flg; 1420d0c080abSJoseph Pusztay 1421d0c080abSJoseph Pusztay PetscFunctionBegin; 14229566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 14239566063dSJacob Faibussowitsch if (dm) PetscCall(DMGetDS(dm, &ds)); 14249566063dSJacob Faibussowitsch if (ds) PetscCall(PetscDSGetNumFields(ds, &Nf)); 142507eaae0cSMatthew G. Knepley if (Nf <= 0) { 142607eaae0cSMatthew G. Knepley Vec y; 142707eaae0cSMatthew G. Knepley PetscReal nrm; 142807eaae0cSMatthew G. Knepley 14299566063dSJacob Faibussowitsch PetscCall(VecDuplicate(u, &y)); 14309566063dSJacob Faibussowitsch PetscCall(TSComputeSolutionFunction(ts, ptime, y)); 14319566063dSJacob Faibussowitsch PetscCall(VecAXPY(y, -1.0, u)); 14329566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)vf->viewer, PETSCVIEWERASCII, &flg)); 1433d0c080abSJoseph Pusztay if (flg) { 14349566063dSJacob Faibussowitsch PetscCall(VecNorm(y, NORM_2, &nrm)); 14359566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(vf->viewer, "2-norm of error %g\n", (double)nrm)); 1436d0c080abSJoseph Pusztay } 14379566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)vf->viewer, PETSCVIEWERDRAW, &flg)); 14381baa6e33SBarry Smith if (flg) PetscCall(VecView(y, vf->viewer)); 14399566063dSJacob Faibussowitsch PetscCall(VecDestroy(&y)); 144007eaae0cSMatthew G. Knepley } else { 144107eaae0cSMatthew G. Knepley PetscErrorCode (**exactFuncs)(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nf, PetscScalar *u, void *ctx); 144207eaae0cSMatthew G. Knepley void **ctxs; 144307eaae0cSMatthew G. Knepley Vec v; 144407eaae0cSMatthew G. Knepley PetscReal ferrors[1]; 144507eaae0cSMatthew G. Knepley 14469566063dSJacob Faibussowitsch PetscCall(PetscMalloc2(Nf, &exactFuncs, Nf, &ctxs)); 14479566063dSJacob Faibussowitsch for (f = 0; f < Nf; ++f) PetscCall(PetscDSGetExactSolution(ds, f, &exactFuncs[f], &ctxs[f])); 14489566063dSJacob Faibussowitsch PetscCall(DMComputeL2FieldDiff(dm, ptime, exactFuncs, ctxs, u, ferrors)); 14499566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Timestep: %04d time = %-8.4g \t L_2 Error: [", (int)step, (double)ptime)); 145007eaae0cSMatthew G. Knepley for (f = 0; f < Nf; ++f) { 14519566063dSJacob Faibussowitsch if (f > 0) PetscCall(PetscPrintf(PETSC_COMM_WORLD, ", ")); 14529566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "%2.3g", (double)ferrors[f])); 145307eaae0cSMatthew G. Knepley } 14549566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "]\n")); 145507eaae0cSMatthew G. Knepley 14569566063dSJacob Faibussowitsch PetscCall(VecViewFromOptions(u, NULL, "-sol_vec_view")); 145707eaae0cSMatthew G. Knepley 14589566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-exact_vec_view", &flg)); 145907eaae0cSMatthew G. Knepley if (flg) { 14609566063dSJacob Faibussowitsch PetscCall(DMGetGlobalVector(dm, &v)); 14619566063dSJacob Faibussowitsch PetscCall(DMProjectFunction(dm, ptime, exactFuncs, ctxs, INSERT_ALL_VALUES, v)); 14629566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)v, "Exact Solution")); 14639566063dSJacob Faibussowitsch PetscCall(VecViewFromOptions(v, NULL, "-exact_vec_view")); 14649566063dSJacob Faibussowitsch PetscCall(DMRestoreGlobalVector(dm, &v)); 146507eaae0cSMatthew G. Knepley } 14669566063dSJacob Faibussowitsch PetscCall(PetscFree2(exactFuncs, ctxs)); 146707eaae0cSMatthew G. Knepley } 14683ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1469d0c080abSJoseph Pusztay } 1470d0c080abSJoseph Pusztay 1471d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGSNESIterations(TS ts, PetscInt n, PetscReal ptime, Vec v, void *monctx) 1472d71ae5a4SJacob Faibussowitsch { 1473d0c080abSJoseph Pusztay TSMonitorLGCtx ctx = (TSMonitorLGCtx)monctx; 1474d0c080abSJoseph Pusztay PetscReal x = ptime, y; 1475d0c080abSJoseph Pusztay PetscInt its; 1476d0c080abSJoseph Pusztay 1477d0c080abSJoseph Pusztay PetscFunctionBegin; 14783ba16761SJacob Faibussowitsch if (n < 0) PetscFunctionReturn(PETSC_SUCCESS); /* -1 indicates interpolated solution */ 1479d0c080abSJoseph Pusztay if (!n) { 1480d0c080abSJoseph Pusztay PetscDrawAxis axis; 14819566063dSJacob Faibussowitsch PetscCall(PetscDrawLGGetAxis(ctx->lg, &axis)); 14829566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisSetLabels(axis, "Nonlinear iterations as function of time", "Time", "SNES Iterations")); 14839566063dSJacob Faibussowitsch PetscCall(PetscDrawLGReset(ctx->lg)); 1484d0c080abSJoseph Pusztay ctx->snes_its = 0; 1485d0c080abSJoseph Pusztay } 14869566063dSJacob Faibussowitsch PetscCall(TSGetSNESIterations(ts, &its)); 1487d0c080abSJoseph Pusztay y = its - ctx->snes_its; 14889566063dSJacob Faibussowitsch PetscCall(PetscDrawLGAddPoint(ctx->lg, &x, &y)); 1489d0c080abSJoseph Pusztay if (((ctx->howoften > 0) && (!(n % ctx->howoften)) && (n > -1)) || ((ctx->howoften == -1) && (n == -1))) { 14909566063dSJacob Faibussowitsch PetscCall(PetscDrawLGDraw(ctx->lg)); 14919566063dSJacob Faibussowitsch PetscCall(PetscDrawLGSave(ctx->lg)); 1492d0c080abSJoseph Pusztay } 1493d0c080abSJoseph Pusztay ctx->snes_its = its; 14943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1495d0c080abSJoseph Pusztay } 1496d0c080abSJoseph Pusztay 1497d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGKSPIterations(TS ts, PetscInt n, PetscReal ptime, Vec v, void *monctx) 1498d71ae5a4SJacob Faibussowitsch { 1499d0c080abSJoseph Pusztay TSMonitorLGCtx ctx = (TSMonitorLGCtx)monctx; 1500d0c080abSJoseph Pusztay PetscReal x = ptime, y; 1501d0c080abSJoseph Pusztay PetscInt its; 1502d0c080abSJoseph Pusztay 1503d0c080abSJoseph Pusztay PetscFunctionBegin; 15043ba16761SJacob Faibussowitsch if (n < 0) PetscFunctionReturn(PETSC_SUCCESS); /* -1 indicates interpolated solution */ 1505d0c080abSJoseph Pusztay if (!n) { 1506d0c080abSJoseph Pusztay PetscDrawAxis axis; 15079566063dSJacob Faibussowitsch PetscCall(PetscDrawLGGetAxis(ctx->lg, &axis)); 15089566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisSetLabels(axis, "Linear iterations as function of time", "Time", "KSP Iterations")); 15099566063dSJacob Faibussowitsch PetscCall(PetscDrawLGReset(ctx->lg)); 1510d0c080abSJoseph Pusztay ctx->ksp_its = 0; 1511d0c080abSJoseph Pusztay } 15129566063dSJacob Faibussowitsch PetscCall(TSGetKSPIterations(ts, &its)); 1513d0c080abSJoseph Pusztay y = its - ctx->ksp_its; 15149566063dSJacob Faibussowitsch PetscCall(PetscDrawLGAddPoint(ctx->lg, &x, &y)); 1515d0c080abSJoseph Pusztay if (((ctx->howoften > 0) && (!(n % ctx->howoften)) && (n > -1)) || ((ctx->howoften == -1) && (n == -1))) { 15169566063dSJacob Faibussowitsch PetscCall(PetscDrawLGDraw(ctx->lg)); 15179566063dSJacob Faibussowitsch PetscCall(PetscDrawLGSave(ctx->lg)); 1518d0c080abSJoseph Pusztay } 1519d0c080abSJoseph Pusztay ctx->ksp_its = its; 15203ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1521d0c080abSJoseph Pusztay } 1522d0c080abSJoseph Pusztay 1523d0c080abSJoseph Pusztay /*@C 1524bcf0153eSBarry Smith TSMonitorEnvelopeCtxCreate - Creates a context for use with `TSMonitorEnvelope()` 1525d0c080abSJoseph Pusztay 1526c3339decSBarry Smith Collective 1527d0c080abSJoseph Pusztay 15282fe279fdSBarry Smith Input Parameter: 1529bcf0153eSBarry Smith . ts - the `TS` solver object 1530d0c080abSJoseph Pusztay 1531d0c080abSJoseph Pusztay Output Parameter: 1532d0c080abSJoseph Pusztay . ctx - the context 1533d0c080abSJoseph Pusztay 1534d0c080abSJoseph Pusztay Level: intermediate 1535d0c080abSJoseph Pusztay 15361cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorLGTimeStep()`, `TSMonitorSet()`, `TSMonitorLGSolution()`, `TSMonitorLGError()` 1537d0c080abSJoseph Pusztay @*/ 1538d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorEnvelopeCtxCreate(TS ts, TSMonitorEnvelopeCtx *ctx) 1539d71ae5a4SJacob Faibussowitsch { 1540d0c080abSJoseph Pusztay PetscFunctionBegin; 15419566063dSJacob Faibussowitsch PetscCall(PetscNew(ctx)); 15423ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1543d0c080abSJoseph Pusztay } 1544d0c080abSJoseph Pusztay 1545d0c080abSJoseph Pusztay /*@C 1546d0c080abSJoseph Pusztay TSMonitorEnvelope - Monitors the maximum and minimum value of each component of the solution 1547d0c080abSJoseph Pusztay 1548c3339decSBarry Smith Collective 1549d0c080abSJoseph Pusztay 1550d0c080abSJoseph Pusztay Input Parameters: 1551195e9b02SBarry Smith + ts - the `TS` context 1552d0c080abSJoseph Pusztay . step - current time-step 1553d0c080abSJoseph Pusztay . ptime - current time 1554d0c080abSJoseph Pusztay . u - current solution 1555d0c080abSJoseph Pusztay - dctx - the envelope context 1556d0c080abSJoseph Pusztay 1557bcf0153eSBarry Smith Options Database Key: 155867b8a455SSatish Balay . -ts_monitor_envelope - determine maximum and minimum value of each component of the solution over the solution time 1559d0c080abSJoseph Pusztay 1560d0c080abSJoseph Pusztay Level: intermediate 1561d0c080abSJoseph Pusztay 1562d0c080abSJoseph Pusztay Notes: 1563bcf0153eSBarry Smith After a solve you can use `TSMonitorEnvelopeGetBounds()` to access the envelope 15643a61192cSBarry Smith 15653a61192cSBarry Smith This is not called directly by users, rather one calls `TSMonitorSet()`, with this function as an argument, to cause the monitor 1566bcf0153eSBarry Smith to be used during the `TS` integration. 1567d0c080abSJoseph Pusztay 15681cc06b55SBarry Smith .seealso: [](ch_ts), `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()`, `TSMonitorEnvelopeGetBounds()`, `TSMonitorEnvelopeCtxCreate()` 1569d0c080abSJoseph Pusztay @*/ 1570d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorEnvelope(TS ts, PetscInt step, PetscReal ptime, Vec u, void *dctx) 1571d71ae5a4SJacob Faibussowitsch { 1572d0c080abSJoseph Pusztay TSMonitorEnvelopeCtx ctx = (TSMonitorEnvelopeCtx)dctx; 1573d0c080abSJoseph Pusztay 1574d0c080abSJoseph Pusztay PetscFunctionBegin; 1575d0c080abSJoseph Pusztay if (!ctx->max) { 15769566063dSJacob Faibussowitsch PetscCall(VecDuplicate(u, &ctx->max)); 15779566063dSJacob Faibussowitsch PetscCall(VecDuplicate(u, &ctx->min)); 15789566063dSJacob Faibussowitsch PetscCall(VecCopy(u, ctx->max)); 15799566063dSJacob Faibussowitsch PetscCall(VecCopy(u, ctx->min)); 1580d0c080abSJoseph Pusztay } else { 15819566063dSJacob Faibussowitsch PetscCall(VecPointwiseMax(ctx->max, u, ctx->max)); 15829566063dSJacob Faibussowitsch PetscCall(VecPointwiseMin(ctx->min, u, ctx->min)); 1583d0c080abSJoseph Pusztay } 15843ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1585d0c080abSJoseph Pusztay } 1586d0c080abSJoseph Pusztay 1587d0c080abSJoseph Pusztay /*@C 1588d0c080abSJoseph Pusztay TSMonitorEnvelopeGetBounds - Gets the bounds for the components of the solution 1589d0c080abSJoseph Pusztay 1590c3339decSBarry Smith Collective 1591d0c080abSJoseph Pusztay 1592d0c080abSJoseph Pusztay Input Parameter: 1593bcf0153eSBarry Smith . ts - the `TS` context 1594d0c080abSJoseph Pusztay 1595d8d19677SJose E. Roman Output Parameters: 1596d0c080abSJoseph Pusztay + max - the maximum values 1597d0c080abSJoseph Pusztay - min - the minimum values 1598d0c080abSJoseph Pusztay 1599195e9b02SBarry Smith Level: intermediate 1600195e9b02SBarry Smith 1601d0c080abSJoseph Pusztay Notes: 1602bcf0153eSBarry Smith If the `TS` does not have a `TSMonitorEnvelopeCtx` associated with it then this function is ignored 1603d0c080abSJoseph Pusztay 16041cc06b55SBarry Smith .seealso: [](ch_ts), `TSMonitorEnvelopeCtx`, `TS`, `TSMonitorSet()`, `TSMonitorDefault()`, `VecView()`, `TSMonitorLGSetDisplayVariables()` 1605d0c080abSJoseph Pusztay @*/ 1606d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorEnvelopeGetBounds(TS ts, Vec *max, Vec *min) 1607d71ae5a4SJacob Faibussowitsch { 1608d0c080abSJoseph Pusztay PetscInt i; 1609d0c080abSJoseph Pusztay 1610d0c080abSJoseph Pusztay PetscFunctionBegin; 1611d0c080abSJoseph Pusztay if (max) *max = NULL; 1612d0c080abSJoseph Pusztay if (min) *min = NULL; 1613d0c080abSJoseph Pusztay for (i = 0; i < ts->numbermonitors; i++) { 1614d0c080abSJoseph Pusztay if (ts->monitor[i] == TSMonitorEnvelope) { 1615d0c080abSJoseph Pusztay TSMonitorEnvelopeCtx ctx = (TSMonitorEnvelopeCtx)ts->monitorcontext[i]; 1616d0c080abSJoseph Pusztay if (max) *max = ctx->max; 1617d0c080abSJoseph Pusztay if (min) *min = ctx->min; 1618d0c080abSJoseph Pusztay break; 1619d0c080abSJoseph Pusztay } 1620d0c080abSJoseph Pusztay } 16213ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1622d0c080abSJoseph Pusztay } 1623d0c080abSJoseph Pusztay 1624d0c080abSJoseph Pusztay /*@C 1625bcf0153eSBarry Smith TSMonitorEnvelopeCtxDestroy - Destroys a context that was created with `TSMonitorEnvelopeCtxCreate()`. 1626d0c080abSJoseph Pusztay 1627c3339decSBarry Smith Collective 1628d0c080abSJoseph Pusztay 1629d0c080abSJoseph Pusztay Input Parameter: 1630d0c080abSJoseph Pusztay . ctx - the monitor context 1631d0c080abSJoseph Pusztay 1632d0c080abSJoseph Pusztay Level: intermediate 1633d0c080abSJoseph Pusztay 16341cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorLGCtxCreate()`, `TSMonitorSet()`, `TSMonitorLGTimeStep()` 1635d0c080abSJoseph Pusztay @*/ 1636d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorEnvelopeCtxDestroy(TSMonitorEnvelopeCtx *ctx) 1637d71ae5a4SJacob Faibussowitsch { 1638d0c080abSJoseph Pusztay PetscFunctionBegin; 16399566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*ctx)->min)); 16409566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*ctx)->max)); 16419566063dSJacob Faibussowitsch PetscCall(PetscFree(*ctx)); 16423ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1643d0c080abSJoseph Pusztay } 1644d0c080abSJoseph Pusztay 1645d0c080abSJoseph Pusztay /*@C 1646bcf0153eSBarry Smith TSDMSwarmMonitorMoments - Monitors the first three moments of a `DMSWARM` being evolved by the `TS` 1647d0c080abSJoseph Pusztay 164820f4b53cSBarry Smith Not Collective 1649d0c080abSJoseph Pusztay 1650d0c080abSJoseph Pusztay Input Parameters: 1651bcf0153eSBarry Smith + ts - the `TS` context 1652d0c080abSJoseph Pusztay . step - current timestep 1653d0c080abSJoseph Pusztay . t - current time 165414d0ab18SJacob Faibussowitsch . U - current solution 165514d0ab18SJacob Faibussowitsch - vf - not used 1656d0c080abSJoseph Pusztay 1657bcf0153eSBarry Smith Options Database Key: 165867b8a455SSatish Balay . -ts_dmswarm_monitor_moments - Monitor moments of particle distribution 1659d0c080abSJoseph Pusztay 1660d0c080abSJoseph Pusztay Level: intermediate 1661d0c080abSJoseph Pusztay 1662d0c080abSJoseph Pusztay Notes: 1663bcf0153eSBarry Smith This requires a `DMSWARM` be attached to the `TS`. 1664d0c080abSJoseph Pusztay 16653a61192cSBarry Smith This is not called directly by users, rather one calls `TSMonitorSet()`, with this function as an argument, to cause the monitor 16663a61192cSBarry Smith to be used during the TS integration. 16673a61192cSBarry Smith 16681cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSMonitorSet()`, `TSMonitorDefault()`, `DMSWARM` 1669d0c080abSJoseph Pusztay @*/ 1670d71ae5a4SJacob Faibussowitsch PetscErrorCode TSDMSwarmMonitorMoments(TS ts, PetscInt step, PetscReal t, Vec U, PetscViewerAndFormat *vf) 1671d71ae5a4SJacob Faibussowitsch { 1672d0c080abSJoseph Pusztay DM sw; 1673d0c080abSJoseph Pusztay const PetscScalar *u; 1674d0c080abSJoseph Pusztay PetscReal m = 1.0, totE = 0., totMom[3] = {0., 0., 0.}; 1675d0c080abSJoseph Pusztay PetscInt dim, d, Np, p; 1676d0c080abSJoseph Pusztay MPI_Comm comm; 1677d0c080abSJoseph Pusztay 1678d0c080abSJoseph Pusztay PetscFunctionBeginUser; 167914d0ab18SJacob Faibussowitsch (void)t; 168014d0ab18SJacob Faibussowitsch (void)vf; 16819566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &sw)); 16823ba16761SJacob Faibussowitsch if (!sw || step % ts->monitorFrequency != 0) PetscFunctionReturn(PETSC_SUCCESS); 16839566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)ts, &comm)); 16849566063dSJacob Faibussowitsch PetscCall(DMGetDimension(sw, &dim)); 16859566063dSJacob Faibussowitsch PetscCall(VecGetLocalSize(U, &Np)); 1686d0c080abSJoseph Pusztay Np /= dim; 16879566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(U, &u)); 1688d0c080abSJoseph Pusztay for (p = 0; p < Np; ++p) { 1689d0c080abSJoseph Pusztay for (d = 0; d < dim; ++d) { 1690d0c080abSJoseph Pusztay totE += PetscRealPart(u[p * dim + d] * u[p * dim + d]); 1691d0c080abSJoseph Pusztay totMom[d] += PetscRealPart(u[p * dim + d]); 1692d0c080abSJoseph Pusztay } 1693d0c080abSJoseph Pusztay } 16949566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(U, &u)); 1695d0c080abSJoseph Pusztay for (d = 0; d < dim; ++d) totMom[d] *= m; 1696d0c080abSJoseph Pusztay totE *= 0.5 * m; 169763a3b9bcSJacob Faibussowitsch PetscCall(PetscPrintf(comm, "Step %4" PetscInt_FMT " Total Energy: %10.8lf", step, (double)totE)); 169863a3b9bcSJacob Faibussowitsch for (d = 0; d < dim; ++d) PetscCall(PetscPrintf(comm, " Total Momentum %c: %10.8lf", (char)('x' + d), (double)totMom[d])); 16999566063dSJacob Faibussowitsch PetscCall(PetscPrintf(comm, "\n")); 17003ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1701d0c080abSJoseph Pusztay } 1702