xref: /petsc/src/dm/impls/network/networkmonitor.c (revision cef0416bfaf3f2eda18a772a528c82211592945c)
127f51fceSHong Zhang #include <petscdmnetwork.h> /*I  "petscdmnetwork.h"  I*/
227f51fceSHong Zhang #include <petscdraw.h>
327f51fceSHong Zhang 
427f51fceSHong Zhang /*@
527f51fceSHong Zhang   DMNetworkMonitorCreate - Creates a network monitor context
627f51fceSHong Zhang 
7d083f849SBarry Smith   Collective
827f51fceSHong Zhang 
92fe279fdSBarry Smith   Input Parameter:
1096a0c994SBarry Smith . network - network to monitor
1127f51fceSHong Zhang 
122fe279fdSBarry Smith   Output Parameter:
1320f4b53cSBarry Smith . monitorptr - the `DMNetworkMonitor` object
1427f51fceSHong Zhang 
1596a0c994SBarry Smith   Level: intermediate
1696a0c994SBarry Smith 
1720f4b53cSBarry Smith .seealso: `DM`, `DMNETWORK`, `DMNetworkMonitor`, `DMNetworkMonitorDestroy()`, `DMNetworkMonitorAdd()`
1827f51fceSHong Zhang @*/
DMNetworkMonitorCreate(DM network,DMNetworkMonitor * monitorptr)19d71ae5a4SJacob Faibussowitsch PetscErrorCode DMNetworkMonitorCreate(DM network, DMNetworkMonitor *monitorptr)
20d71ae5a4SJacob Faibussowitsch {
2127f51fceSHong Zhang   DMNetworkMonitor monitor;
222d2f4133SHong Zhang   MPI_Comm         comm;
2327f51fceSHong Zhang   PetscMPIInt      size;
2427f51fceSHong Zhang 
2527f51fceSHong Zhang   PetscFunctionBegin;
269566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)network, &comm));
279566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
285c6496baSHong Zhang   PetscCheck(size == 1, PETSC_COMM_SELF, PETSC_ERR_SUP, "Parallel DMNetworkMonitor is not supported yet");
292d2f4133SHong Zhang 
309566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(1, &monitor));
312d2f4133SHong Zhang   monitor->comm      = comm;
3227f51fceSHong Zhang   monitor->network   = network;
33390e1bf2SBarry Smith   monitor->firstnode = NULL;
3427f51fceSHong Zhang 
3527f51fceSHong Zhang   *monitorptr = monitor;
363ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3727f51fceSHong Zhang }
3827f51fceSHong Zhang 
3927f51fceSHong Zhang /*@
4027f51fceSHong Zhang   DMNetworkMonitorDestroy - Destroys a network monitor and all associated viewers
4127f51fceSHong Zhang 
4220f4b53cSBarry Smith   Collective
4327f51fceSHong Zhang 
442fe279fdSBarry Smith   Input Parameter:
4596a0c994SBarry Smith . monitor - monitor to destroy
4696a0c994SBarry Smith 
4796a0c994SBarry Smith   Level: intermediate
4827f51fceSHong Zhang 
495f25b224SDuncan Campbell .seealso: `DM`, `DMNETWORK`, `DMNetworkMonitor`, `DMNetworkMonitorCreate()`, `DMNetworkMonitorAdd()`
5027f51fceSHong Zhang @*/
DMNetworkMonitorDestroy(DMNetworkMonitor * monitor)51d71ae5a4SJacob Faibussowitsch PetscErrorCode DMNetworkMonitorDestroy(DMNetworkMonitor *monitor)
52d71ae5a4SJacob Faibussowitsch {
5327f51fceSHong Zhang   PetscFunctionBegin;
5448a46eb9SPierre Jolivet   while ((*monitor)->firstnode) PetscCall(DMNetworkMonitorPop(*monitor));
5527f51fceSHong Zhang 
569566063dSJacob Faibussowitsch   PetscCall(PetscFree(*monitor));
573ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5827f51fceSHong Zhang }
5927f51fceSHong Zhang 
6027f51fceSHong Zhang /*@
6120f4b53cSBarry Smith   DMNetworkMonitorPop - Removes the most recently added viewer to a `DMNetworkMonitor`
6227f51fceSHong Zhang 
6320f4b53cSBarry Smith   Collective
6427f51fceSHong Zhang 
652fe279fdSBarry Smith   Input Parameter:
6696a0c994SBarry Smith . monitor - the monitor
6796a0c994SBarry Smith 
6896a0c994SBarry Smith   Level: intermediate
6996a0c994SBarry Smith 
7020f4b53cSBarry Smith .seealso: `DM`, `DMNETWORK`, `DMNetworkMonitor`, `DMNetworkMonitorCreate()`, `DMNetworkMonitorDestroy()`
7127f51fceSHong Zhang @*/
DMNetworkMonitorPop(DMNetworkMonitor monitor)72d71ae5a4SJacob Faibussowitsch PetscErrorCode DMNetworkMonitorPop(DMNetworkMonitor monitor)
73d71ae5a4SJacob Faibussowitsch {
7427f51fceSHong Zhang   DMNetworkMonitorList node;
7527f51fceSHong Zhang 
7627f51fceSHong Zhang   PetscFunctionBegin;
7727f51fceSHong Zhang   if (monitor->firstnode) {
7827f51fceSHong Zhang     /* Update links */
7927f51fceSHong Zhang     node               = monitor->firstnode;
8027f51fceSHong Zhang     monitor->firstnode = node->next;
8127f51fceSHong Zhang 
8227f51fceSHong Zhang     /* Free list node */
83f4f49eeaSPierre Jolivet     PetscCall(PetscViewerDestroy(&node->viewer));
84f4f49eeaSPierre Jolivet     PetscCall(VecDestroy(&node->v));
859566063dSJacob Faibussowitsch     PetscCall(PetscFree(node));
8627f51fceSHong Zhang   }
873ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8827f51fceSHong Zhang }
8927f51fceSHong Zhang 
9094ef8ddeSSatish Balay /*@C
9120f4b53cSBarry Smith   DMNetworkMonitorAdd - Adds a new viewer to a `DMNetworkMonitor`
9227f51fceSHong Zhang 
9320f4b53cSBarry Smith   Collective
9496a0c994SBarry Smith 
9527f51fceSHong Zhang   Input Parameters:
9627f51fceSHong Zhang + monitor   - the monitor
9727f51fceSHong Zhang . name      - name of viewer
9827f51fceSHong Zhang . element   - vertex / edge number
9927f51fceSHong Zhang . nodes     - number of nodes
10027f51fceSHong Zhang . start     - variable starting offset
10127f51fceSHong Zhang . blocksize - variable blocksize
10220f4b53cSBarry Smith . xmin      - xmin (or `PETSC_DECIDE`) for viewer
10320f4b53cSBarry Smith . xmax      - xmax (or `PETSC_DECIDE`) for viewer
10427f51fceSHong Zhang . ymin      - ymin for viewer
10527f51fceSHong Zhang . ymax      - ymax for viewer
10627f51fceSHong Zhang - hold      - determines if plot limits should be held
10727f51fceSHong Zhang 
10896a0c994SBarry Smith   Level: intermediate
10996a0c994SBarry Smith 
11027f51fceSHong Zhang   Notes:
11127f51fceSHong Zhang   This is written to be independent of the semantics associated to the variables
11227f51fceSHong Zhang   at a given network vertex / edge.
11327f51fceSHong Zhang 
11427f51fceSHong Zhang   Precisely, the parameters nodes, start and blocksize allow you to select a general
11527f51fceSHong Zhang   strided subarray of the variables to monitor.
11627f51fceSHong Zhang 
11720f4b53cSBarry Smith .seealso: `DM`, `DMNETWORK`, `DMNetworkMonitor`, `DMNetworkMonitorCreate()`, `DMNetworkMonitorDestroy()`
11827f51fceSHong Zhang @*/
DMNetworkMonitorAdd(DMNetworkMonitor monitor,const char * name,PetscInt element,PetscInt nodes,PetscInt start,PetscInt blocksize,PetscReal xmin,PetscReal xmax,PetscReal ymin,PetscReal ymax,PetscBool hold)119d71ae5a4SJacob Faibussowitsch PetscErrorCode DMNetworkMonitorAdd(DMNetworkMonitor monitor, const char *name, PetscInt element, PetscInt nodes, PetscInt start, PetscInt blocksize, PetscReal xmin, PetscReal xmax, PetscReal ymin, PetscReal ymax, PetscBool hold)
120d71ae5a4SJacob Faibussowitsch {
12127f51fceSHong Zhang   PetscDrawLG          drawlg;
12227f51fceSHong Zhang   PetscDrawAxis        axis;
12327f51fceSHong Zhang   PetscMPIInt          rank, size;
12427f51fceSHong Zhang   DMNetworkMonitorList node;
12527f51fceSHong Zhang   char                 titleBuffer[64];
12627f51fceSHong Zhang   PetscInt             vStart, vEnd, eStart, eEnd;
12727f51fceSHong Zhang 
12827f51fceSHong Zhang   PetscFunctionBegin;
1299566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(monitor->comm, &rank));
1309566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(monitor->comm, &size));
13127f51fceSHong Zhang 
1329566063dSJacob Faibussowitsch   PetscCall(DMNetworkGetVertexRange(monitor->network, &vStart, &vEnd));
1339566063dSJacob Faibussowitsch   PetscCall(DMNetworkGetEdgeRange(monitor->network, &eStart, &eEnd));
13427f51fceSHong Zhang 
13527f51fceSHong Zhang   /* Make window title */
13627f51fceSHong Zhang   if (vStart <= element && element < vEnd) {
13763a3b9bcSJacob Faibussowitsch     PetscCall(PetscSNPrintf(titleBuffer, sizeof(titleBuffer), "%s @ vertex %" PetscInt_FMT " [%d / %d]", name, element - vStart, rank, size - 1));
13827f51fceSHong Zhang   } else if (eStart <= element && element < eEnd) {
13963a3b9bcSJacob Faibussowitsch     PetscCall(PetscSNPrintf(titleBuffer, sizeof(titleBuffer), "%s @ edge %" PetscInt_FMT " [%d / %d]", name, element - eStart, rank, size - 1));
14027f51fceSHong Zhang   } else {
14127f51fceSHong Zhang     /* vertex / edge is not on local machine, so skip! */
1423ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
14327f51fceSHong Zhang   }
14427f51fceSHong Zhang 
1459566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(1, &node));
14627f51fceSHong Zhang 
14727f51fceSHong Zhang   /* Setup viewer. */
148f4f49eeaSPierre Jolivet   PetscCall(PetscViewerDrawOpen(monitor->comm, NULL, titleBuffer, PETSC_DECIDE, PETSC_DECIDE, PETSC_DRAW_QUARTER_SIZE, PETSC_DRAW_QUARTER_SIZE, &node->viewer));
1499566063dSJacob Faibussowitsch   PetscCall(PetscViewerPushFormat(node->viewer, PETSC_VIEWER_DRAW_LG_XRANGE));
1509566063dSJacob Faibussowitsch   PetscCall(PetscViewerDrawGetDrawLG(node->viewer, 0, &drawlg));
1519566063dSJacob Faibussowitsch   PetscCall(PetscDrawLGGetAxis(drawlg, &axis));
15213bcc0bdSJacob Faibussowitsch   if (xmin != (PetscReal)PETSC_DECIDE && xmax != (PetscReal)PETSC_DECIDE) PetscCall(PetscDrawAxisSetLimits(axis, xmin, xmax, ymin, ymax));
1531baa6e33SBarry Smith   else PetscCall(PetscDrawAxisSetLimits(axis, 0, nodes - 1, ymin, ymax));
1549566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisSetHoldLimits(axis, hold));
15527f51fceSHong Zhang 
15627f51fceSHong Zhang   /* Setup vector storage for drawing. */
157f4f49eeaSPierre Jolivet   PetscCall(VecCreateSeq(PETSC_COMM_SELF, nodes, &node->v));
15827f51fceSHong Zhang 
15927f51fceSHong Zhang   node->element   = element;
16027f51fceSHong Zhang   node->nodes     = nodes;
16127f51fceSHong Zhang   node->start     = start;
16227f51fceSHong Zhang   node->blocksize = blocksize;
16327f51fceSHong Zhang 
16427f51fceSHong Zhang   node->next         = monitor->firstnode;
16527f51fceSHong Zhang   monitor->firstnode = node;
1663ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
16727f51fceSHong Zhang }
16827f51fceSHong Zhang 
169*ffeef943SBarry Smith /*@C
170*ffeef943SBarry Smith   DMNetworkMonitorView - A `DMNETWORK` specific monitor function for `TSMonitorSet()`
17127f51fceSHong Zhang 
172*ffeef943SBarry Smith   Collective, No Fortran support
17396a0c994SBarry Smith 
17427f51fceSHong Zhang   Input Parameters:
17520f4b53cSBarry Smith + monitor - `DMNetworkMonitor` object
17620f4b53cSBarry Smith - x       - `TS` solution vector
17727f51fceSHong Zhang 
17896a0c994SBarry Smith   Level: intermediate
17996a0c994SBarry Smith 
180*ffeef943SBarry Smith .seealso: `DM`, `DMNETWORK`, `DMNetworkMonitor`, `DMNetworkMonitorCreate()`, `DMNetworkMonitorDestroy()`, `DMNetworkMonitorAdd()`
18127f51fceSHong Zhang @*/
DMNetworkMonitorView(DMNetworkMonitor monitor,Vec x)182d71ae5a4SJacob Faibussowitsch PetscErrorCode DMNetworkMonitorView(DMNetworkMonitor monitor, Vec x)
183d71ae5a4SJacob Faibussowitsch {
18427f51fceSHong Zhang   PetscInt             varoffset, i, start;
18527f51fceSHong Zhang   const PetscScalar   *xx;
18627f51fceSHong Zhang   PetscScalar         *vv;
18727f51fceSHong Zhang   DMNetworkMonitorList node;
18827f51fceSHong Zhang 
18927f51fceSHong Zhang   PetscFunctionBegin;
1909566063dSJacob Faibussowitsch   PetscCall(VecGetArrayRead(x, &xx));
19127f51fceSHong Zhang   for (node = monitor->firstnode; node; node = node->next) {
1929566063dSJacob Faibussowitsch     PetscCall(DMNetworkGetGlobalVecOffset(monitor->network, node->element, ALL_COMPONENTS, &varoffset));
1939566063dSJacob Faibussowitsch     PetscCall(VecGetArray(node->v, &vv));
19427f51fceSHong Zhang     start = varoffset + node->start;
195ad540459SPierre Jolivet     for (i = 0; i < node->nodes; i++) vv[i] = xx[start + i * node->blocksize];
1969566063dSJacob Faibussowitsch     PetscCall(VecRestoreArray(node->v, &vv));
1979566063dSJacob Faibussowitsch     PetscCall(VecView(node->v, node->viewer));
19827f51fceSHong Zhang   }
1999566063dSJacob Faibussowitsch   PetscCall(VecRestoreArrayRead(x, &xx));
2003ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
20127f51fceSHong Zhang }
202