xref: /petsc/src/ts/utils/dmnetworkts.c (revision b43aa488f900e1fa15f896f863d5deacb647a378)
1e669de00SBarry Smith #include <petsc/private/dmnetworkimpl.h> /*I "petscdmplex.h" I*/
2e669de00SBarry Smith #include <petscts.h>
3e669de00SBarry Smith #include <petscdraw.h>
4e669de00SBarry Smith 
5e669de00SBarry Smith /*
64500feddSGetnet Betrie    TSMonitorLGCtxDestroy - Destroys  line graph contexts that where created with TSMonitorLGCtxNetworkCreate().
7e669de00SBarry Smith 
8c3339decSBarry Smith    Collective
9e669de00SBarry Smith 
10e669de00SBarry Smith    Input Parameter:
11e669de00SBarry Smith .  ctx - the monitor context
12e669de00SBarry Smith 
13e669de00SBarry Smith */
14d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGCtxNetworkDestroy(TSMonitorLGCtxNetwork *ctx)
15d71ae5a4SJacob Faibussowitsch {
16e669de00SBarry Smith   PetscInt i;
17e669de00SBarry Smith 
18e669de00SBarry Smith   PetscFunctionBegin;
1948a46eb9SPierre Jolivet   for (i = 0; i < (*ctx)->nlg; i++) PetscCall(PetscDrawLGDestroy(&(*ctx)->lg[i]));
209566063dSJacob Faibussowitsch   PetscCall(PetscFree((*ctx)->lg));
219566063dSJacob Faibussowitsch   PetscCall(PetscFree(*ctx));
223ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
23e669de00SBarry Smith }
24e669de00SBarry Smith 
25d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGCtxNetworkCreate(TS ts, const char host[], const char label[], int x, int y, int m, int n, PetscInt howoften, TSMonitorLGCtxNetwork *ctx)
26d71ae5a4SJacob Faibussowitsch {
27e669de00SBarry Smith   PetscDraw draw;
28e669de00SBarry Smith   MPI_Comm  comm;
29e669de00SBarry Smith   DM        dm;
30e669de00SBarry Smith   PetscInt  i, Start, End, e, nvar;
31e669de00SBarry Smith 
32e669de00SBarry Smith   PetscFunctionBegin;
339566063dSJacob Faibussowitsch   PetscCall(TSGetDM(ts, &dm));
349566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)ts, &comm));
359566063dSJacob Faibussowitsch   PetscCall(PetscNew(ctx));
36e669de00SBarry Smith   i = 0;
37e669de00SBarry Smith   /* loop over edges counting number of line graphs needed */
389566063dSJacob Faibussowitsch   PetscCall(DMNetworkGetEdgeRange(dm, &Start, &End));
39e669de00SBarry Smith   for (e = Start; e < End; e++) {
409566063dSJacob Faibussowitsch     PetscCall(DMNetworkGetComponent(dm, e, ALL_COMPONENTS, NULL, NULL, &nvar));
41e669de00SBarry Smith     if (!nvar) continue;
42e669de00SBarry Smith     i++;
43e669de00SBarry Smith   }
44e669de00SBarry Smith   /* loop over vertices */
459566063dSJacob Faibussowitsch   PetscCall(DMNetworkGetVertexRange(dm, &Start, &End));
46e669de00SBarry Smith   for (e = Start; e < End; e++) {
479566063dSJacob Faibussowitsch     PetscCall(DMNetworkGetComponent(dm, e, ALL_COMPONENTS, NULL, NULL, &nvar));
48e669de00SBarry Smith     if (!nvar) continue;
49e669de00SBarry Smith     i++;
50e669de00SBarry Smith   }
51e669de00SBarry Smith   (*ctx)->nlg = i;
529566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(i, &(*ctx)->lg));
53e669de00SBarry Smith 
54e669de00SBarry Smith   i = 0;
55e669de00SBarry Smith   /* loop over edges creating all needed line graphs*/
569566063dSJacob Faibussowitsch   PetscCall(DMNetworkGetEdgeRange(dm, &Start, &End));
57e669de00SBarry Smith   for (e = Start; e < End; e++) {
589566063dSJacob Faibussowitsch     PetscCall(DMNetworkGetComponent(dm, e, ALL_COMPONENTS, NULL, NULL, &nvar));
59e669de00SBarry Smith     if (!nvar) continue;
609566063dSJacob Faibussowitsch     PetscCall(PetscDrawCreate(comm, host, label, x, y, m, n, &draw));
619566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetFromOptions(draw));
629566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGCreate(draw, nvar, &(*ctx)->lg[i]));
639566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGSetFromOptions((*ctx)->lg[i]));
649566063dSJacob Faibussowitsch     PetscCall(PetscDrawDestroy(&draw));
65e669de00SBarry Smith     i++;
66e669de00SBarry Smith   }
67e669de00SBarry Smith   /* loop over vertices */
689566063dSJacob Faibussowitsch   PetscCall(DMNetworkGetVertexRange(dm, &Start, &End));
69e669de00SBarry Smith   for (e = Start; e < End; e++) {
709566063dSJacob Faibussowitsch     PetscCall(DMNetworkGetComponent(dm, e, ALL_COMPONENTS, NULL, NULL, &nvar));
71e669de00SBarry Smith     if (!nvar) continue;
729566063dSJacob Faibussowitsch     PetscCall(PetscDrawCreate(comm, host, label, x, y, m, n, &draw));
739566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetFromOptions(draw));
749566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGCreate(draw, nvar, &(*ctx)->lg[i]));
759566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGSetFromOptions((*ctx)->lg[i]));
769566063dSJacob Faibussowitsch     PetscCall(PetscDrawDestroy(&draw));
77e669de00SBarry Smith     i++;
78e669de00SBarry Smith   }
799566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy(&draw));
80e669de00SBarry Smith   (*ctx)->howoften = howoften;
813ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
82e669de00SBarry Smith }
83e669de00SBarry Smith 
84e669de00SBarry Smith /*
85bcf0153eSBarry Smith   TSMonitorLGCtxNetworkSolution - Monitors progress of the `TS` solvers for a `DMNETWORK` solution with one window for each vertex and each edge
86e669de00SBarry Smith 
87c3339decSBarry Smith   Collective
88e669de00SBarry Smith 
89e669de00SBarry Smith   Input Parameters:
90bcf0153eSBarry Smith + ts    - the `TS` context
91e669de00SBarry Smith . step  - current time-step
92e669de00SBarry Smith . ptime - current time
93e669de00SBarry Smith . u     - current solution
94bcf0153eSBarry Smith - dctx  - the `TSMonitorLGCtxNetwork` object that contains all the options for the monitoring, this is created with `TSMonitorLGCtxCreateNetwork()`
95e669de00SBarry Smith 
96bcf0153eSBarry Smith   Options Database Key:
97*b43aa488SJacob Faibussowitsch . -ts_monitor_lg_solution_variables - monitor solution variables
98e669de00SBarry Smith 
99e669de00SBarry Smith   Level: intermediate
100e669de00SBarry Smith 
101bcf0153eSBarry Smith   Note:
102e669de00SBarry Smith   Each process in a parallel run displays its component solutions in a separate window
103e669de00SBarry Smith 
104e669de00SBarry Smith */
105d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGCtxNetworkSolution(TS ts, PetscInt step, PetscReal ptime, Vec u, void *dctx)
106d71ae5a4SJacob Faibussowitsch {
107e669de00SBarry Smith   TSMonitorLGCtxNetwork ctx = (TSMonitorLGCtxNetwork)dctx;
108e669de00SBarry Smith   const PetscScalar    *xv;
109e669de00SBarry Smith   PetscScalar          *yv;
110e669de00SBarry Smith   PetscInt              i, v, Start, End, offset, nvar, e;
111e669de00SBarry Smith   TSConvergedReason     reason;
112e669de00SBarry Smith   DM                    dm;
113e669de00SBarry Smith   Vec                   uv;
114e669de00SBarry Smith 
115e669de00SBarry Smith   PetscFunctionBegin;
1163ba16761SJacob Faibussowitsch   if (step < 0) PetscFunctionReturn(PETSC_SUCCESS); /* -1 indicates interpolated solution */
117e669de00SBarry Smith   if (!step) {
118e669de00SBarry Smith     PetscDrawAxis axis;
119e669de00SBarry Smith 
120e669de00SBarry Smith     for (i = 0; i < ctx->nlg; i++) {
1219566063dSJacob Faibussowitsch       PetscCall(PetscDrawLGGetAxis(ctx->lg[i], &axis));
1229566063dSJacob Faibussowitsch       PetscCall(PetscDrawAxisSetLabels(axis, "Solution as function of time", "Time", "Solution"));
1239566063dSJacob Faibussowitsch       PetscCall(PetscDrawLGReset(ctx->lg[i]));
124e669de00SBarry Smith     }
125e669de00SBarry Smith   }
126e669de00SBarry Smith 
127e669de00SBarry Smith   if (ctx->semilogy) {
128e669de00SBarry Smith     PetscInt n, j;
129e669de00SBarry Smith 
1309566063dSJacob Faibussowitsch     PetscCall(VecDuplicate(u, &uv));
1319566063dSJacob Faibussowitsch     PetscCall(VecCopy(u, uv));
1329566063dSJacob Faibussowitsch     PetscCall(VecGetArray(uv, &yv));
1339566063dSJacob Faibussowitsch     PetscCall(VecGetLocalSize(uv, &n));
134e669de00SBarry Smith     for (j = 0; j < n; j++) {
1354500feddSGetnet Betrie       if (PetscRealPart(yv[j]) <= 0.0) yv[j] = -12;
1364e936a74SSatish Balay       else yv[j] = PetscLog10Real(PetscRealPart(yv[j]));
137e669de00SBarry Smith     }
138e669de00SBarry Smith     xv = yv;
139e669de00SBarry Smith   } else {
1409566063dSJacob Faibussowitsch     PetscCall(VecGetArrayRead(u, &xv));
141e669de00SBarry Smith   }
142e669de00SBarry Smith   /* iterate over edges */
1439566063dSJacob Faibussowitsch   PetscCall(TSGetDM(ts, &dm));
144e669de00SBarry Smith   i = 0;
1459566063dSJacob Faibussowitsch   PetscCall(DMNetworkGetEdgeRange(dm, &Start, &End));
146e669de00SBarry Smith   for (e = Start; e < End; e++) {
1479566063dSJacob Faibussowitsch     PetscCall(DMNetworkGetComponent(dm, e, ALL_COMPONENTS, NULL, NULL, &nvar));
148e669de00SBarry Smith     if (!nvar) continue;
149e669de00SBarry Smith 
1509566063dSJacob Faibussowitsch     PetscCall(DMNetworkGetLocalVecOffset(dm, e, ALL_COMPONENTS, &offset));
1519566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGAddCommonPoint(ctx->lg[i], ptime, (const PetscReal *)(xv + offset)));
152e669de00SBarry Smith     i++;
153e669de00SBarry Smith   }
154e669de00SBarry Smith 
155e669de00SBarry Smith   /* iterate over vertices */
1569566063dSJacob Faibussowitsch   PetscCall(DMNetworkGetVertexRange(dm, &Start, &End));
157e669de00SBarry Smith   for (v = Start; v < End; v++) {
1589566063dSJacob Faibussowitsch     PetscCall(DMNetworkGetComponent(dm, v, ALL_COMPONENTS, NULL, NULL, &nvar));
159e669de00SBarry Smith     if (!nvar) continue;
160e669de00SBarry Smith 
1619566063dSJacob Faibussowitsch     PetscCall(DMNetworkGetLocalVecOffset(dm, v, ALL_COMPONENTS, &offset));
1629566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGAddCommonPoint(ctx->lg[i], ptime, (const PetscReal *)(xv + offset)));
163e669de00SBarry Smith     i++;
164e669de00SBarry Smith   }
165e669de00SBarry Smith   if (ctx->semilogy) {
1669566063dSJacob Faibussowitsch     PetscCall(VecRestoreArray(uv, &yv));
1679566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&uv));
168e669de00SBarry Smith   } else {
1699566063dSJacob Faibussowitsch     PetscCall(VecRestoreArrayRead(u, &xv));
170e669de00SBarry Smith   }
171e669de00SBarry Smith 
1729566063dSJacob Faibussowitsch   PetscCall(TSGetConvergedReason(ts, &reason));
173e669de00SBarry Smith   if (((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && reason)) {
174e669de00SBarry Smith     for (i = 0; i < ctx->nlg; i++) {
1759566063dSJacob Faibussowitsch       PetscCall(PetscDrawLGDraw(ctx->lg[i]));
1769566063dSJacob Faibussowitsch       PetscCall(PetscDrawLGSave(ctx->lg[i]));
177e669de00SBarry Smith     }
178e669de00SBarry Smith   }
1793ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
180e669de00SBarry Smith }
181