xref: /petsc/src/dm/impls/network/networkmonitor.c (revision 48a46eb9bd028bec07ec0f396b1a3abb43f14558)
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 
927f51fceSHong Zhang   Input Parameters:
1096a0c994SBarry Smith . network - network to monitor
1127f51fceSHong Zhang 
1227f51fceSHong Zhang   Output Parameters:
132bf73ac6SHong Zhang . monitorptr - Location to put network monitor context
1427f51fceSHong Zhang 
1596a0c994SBarry Smith   Level: intermediate
1696a0c994SBarry Smith 
17db781477SPatrick Sanan .seealso: `DMNetworkMonitorDestroy()`, `DMNetworkMonitorAdd()`
1827f51fceSHong Zhang @*/
199371c9d4SSatish Balay PetscErrorCode DMNetworkMonitorCreate(DM network, DMNetworkMonitor *monitorptr) {
2027f51fceSHong Zhang   DMNetworkMonitor monitor;
212d2f4133SHong Zhang   MPI_Comm         comm;
2227f51fceSHong Zhang   PetscMPIInt      size;
2327f51fceSHong Zhang 
2427f51fceSHong Zhang   PetscFunctionBegin;
259566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)network, &comm));
269566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
275c6496baSHong Zhang   PetscCheck(size == 1, PETSC_COMM_SELF, PETSC_ERR_SUP, "Parallel DMNetworkMonitor is not supported yet");
282d2f4133SHong Zhang 
299566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(1, &monitor));
302d2f4133SHong Zhang   monitor->comm      = comm;
3127f51fceSHong Zhang   monitor->network   = network;
32390e1bf2SBarry Smith   monitor->firstnode = NULL;
3327f51fceSHong Zhang 
3427f51fceSHong Zhang   *monitorptr = monitor;
3527f51fceSHong Zhang   PetscFunctionReturn(0);
3627f51fceSHong Zhang }
3727f51fceSHong Zhang 
3827f51fceSHong Zhang /*@
3927f51fceSHong Zhang   DMNetworkMonitorDestroy - Destroys a network monitor and all associated viewers
4027f51fceSHong Zhang 
41d083f849SBarry Smith   Collective on monitor
4227f51fceSHong Zhang 
4327f51fceSHong Zhang   Input Parameters:
4496a0c994SBarry Smith . monitor - monitor to destroy
4596a0c994SBarry Smith 
4696a0c994SBarry Smith   Level: intermediate
4727f51fceSHong Zhang 
48db781477SPatrick Sanan .seealso: `DMNetworkMonitorCreate`, `DMNetworkMonitorAdd`
4927f51fceSHong Zhang @*/
509371c9d4SSatish Balay PetscErrorCode DMNetworkMonitorDestroy(DMNetworkMonitor *monitor) {
5127f51fceSHong Zhang   PetscFunctionBegin;
52*48a46eb9SPierre Jolivet   while ((*monitor)->firstnode) PetscCall(DMNetworkMonitorPop(*monitor));
5327f51fceSHong Zhang 
549566063dSJacob Faibussowitsch   PetscCall(PetscFree(*monitor));
5527f51fceSHong Zhang   PetscFunctionReturn(0);
5627f51fceSHong Zhang }
5727f51fceSHong Zhang 
5827f51fceSHong Zhang /*@
5927f51fceSHong Zhang   DMNetworkMonitorPop - Removes the most recently added viewer
6027f51fceSHong Zhang 
61d083f849SBarry Smith   Collective on monitor
6227f51fceSHong Zhang 
6396a0c994SBarry Smith   Input Parameters:
6496a0c994SBarry Smith . monitor - the monitor
6596a0c994SBarry Smith 
6696a0c994SBarry Smith   Level: intermediate
6796a0c994SBarry Smith 
68db781477SPatrick Sanan .seealso: `DMNetworkMonitorCreate()`, `DMNetworkMonitorDestroy()`
6927f51fceSHong Zhang @*/
709371c9d4SSatish Balay PetscErrorCode DMNetworkMonitorPop(DMNetworkMonitor monitor) {
7127f51fceSHong Zhang   DMNetworkMonitorList node;
7227f51fceSHong Zhang 
7327f51fceSHong Zhang   PetscFunctionBegin;
7427f51fceSHong Zhang   if (monitor->firstnode) {
7527f51fceSHong Zhang     /* Update links */
7627f51fceSHong Zhang     node               = monitor->firstnode;
7727f51fceSHong Zhang     monitor->firstnode = node->next;
7827f51fceSHong Zhang 
7927f51fceSHong Zhang     /* Free list node */
809566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&(node->viewer)));
819566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&(node->v)));
829566063dSJacob Faibussowitsch     PetscCall(PetscFree(node));
8327f51fceSHong Zhang   }
8427f51fceSHong Zhang   PetscFunctionReturn(0);
8527f51fceSHong Zhang }
8627f51fceSHong Zhang 
8794ef8ddeSSatish Balay /*@C
8827f51fceSHong Zhang   DMNetworkMonitorAdd - Adds a new viewer to monitor
8927f51fceSHong Zhang 
90d083f849SBarry Smith   Collective on monitor
9196a0c994SBarry Smith 
9227f51fceSHong Zhang   Input Parameters:
9327f51fceSHong Zhang + monitor - the monitor
9427f51fceSHong Zhang . name - name of viewer
9527f51fceSHong Zhang . element - vertex / edge number
9627f51fceSHong Zhang . nodes - number of nodes
9727f51fceSHong Zhang . start - variable starting offset
9827f51fceSHong Zhang . blocksize - variable blocksize
99bb046f40SHong Zhang . xmin - xmin (or PETSC_DECIDE) for viewer
100bb046f40SHong Zhang . xmax - xmax (or PETSC_DECIDE) for viewer
10127f51fceSHong Zhang . ymin - ymin for viewer
10227f51fceSHong Zhang . ymax - ymax for viewer
10327f51fceSHong Zhang - hold - determines if plot limits should be held
10427f51fceSHong Zhang 
10596a0c994SBarry Smith   Level: intermediate
10696a0c994SBarry Smith 
10727f51fceSHong Zhang   Notes:
10827f51fceSHong Zhang   This is written to be independent of the semantics associated to the variables
10927f51fceSHong Zhang   at a given network vertex / edge.
11027f51fceSHong Zhang 
11127f51fceSHong Zhang   Precisely, the parameters nodes, start and blocksize allow you to select a general
11227f51fceSHong Zhang   strided subarray of the variables to monitor.
11327f51fceSHong Zhang 
114db781477SPatrick Sanan .seealso: `DMNetworkMonitorCreate()`, `DMNetworkMonitorDestroy()`
11527f51fceSHong Zhang @*/
1169371c9d4SSatish Balay 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) {
11727f51fceSHong Zhang   PetscDrawLG          drawlg;
11827f51fceSHong Zhang   PetscDrawAxis        axis;
11927f51fceSHong Zhang   PetscMPIInt          rank, size;
12027f51fceSHong Zhang   DMNetworkMonitorList node;
12127f51fceSHong Zhang   char                 titleBuffer[64];
12227f51fceSHong Zhang   PetscInt             vStart, vEnd, eStart, eEnd;
12327f51fceSHong Zhang 
12427f51fceSHong Zhang   PetscFunctionBegin;
1259566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(monitor->comm, &rank));
1269566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(monitor->comm, &size));
12727f51fceSHong Zhang 
1289566063dSJacob Faibussowitsch   PetscCall(DMNetworkGetVertexRange(monitor->network, &vStart, &vEnd));
1299566063dSJacob Faibussowitsch   PetscCall(DMNetworkGetEdgeRange(monitor->network, &eStart, &eEnd));
13027f51fceSHong Zhang 
13127f51fceSHong Zhang   /* Make window title */
13227f51fceSHong Zhang   if (vStart <= element && element < vEnd) {
13363a3b9bcSJacob Faibussowitsch     PetscCall(PetscSNPrintf(titleBuffer, sizeof(titleBuffer), "%s @ vertex %" PetscInt_FMT " [%d / %d]", name, element - vStart, rank, size - 1));
13427f51fceSHong Zhang   } else if (eStart <= element && element < eEnd) {
13563a3b9bcSJacob Faibussowitsch     PetscCall(PetscSNPrintf(titleBuffer, sizeof(titleBuffer), "%s @ edge %" PetscInt_FMT " [%d / %d]", name, element - eStart, rank, size - 1));
13627f51fceSHong Zhang   } else {
13727f51fceSHong Zhang     /* vertex / edge is not on local machine, so skip! */
13827f51fceSHong Zhang     PetscFunctionReturn(0);
13927f51fceSHong Zhang   }
14027f51fceSHong Zhang 
1419566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(1, &node));
14227f51fceSHong Zhang 
14327f51fceSHong Zhang   /* Setup viewer. */
1449566063dSJacob Faibussowitsch   PetscCall(PetscViewerDrawOpen(monitor->comm, NULL, titleBuffer, PETSC_DECIDE, PETSC_DECIDE, PETSC_DRAW_QUARTER_SIZE, PETSC_DRAW_QUARTER_SIZE, &(node->viewer)));
1459566063dSJacob Faibussowitsch   PetscCall(PetscViewerPushFormat(node->viewer, PETSC_VIEWER_DRAW_LG_XRANGE));
1469566063dSJacob Faibussowitsch   PetscCall(PetscViewerDrawGetDrawLG(node->viewer, 0, &drawlg));
1479566063dSJacob Faibussowitsch   PetscCall(PetscDrawLGGetAxis(drawlg, &axis));
1481baa6e33SBarry Smith   if (xmin != PETSC_DECIDE && xmax != PETSC_DECIDE) PetscCall(PetscDrawAxisSetLimits(axis, xmin, xmax, ymin, ymax));
1491baa6e33SBarry Smith   else PetscCall(PetscDrawAxisSetLimits(axis, 0, nodes - 1, ymin, ymax));
1509566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisSetHoldLimits(axis, hold));
15127f51fceSHong Zhang 
15227f51fceSHong Zhang   /* Setup vector storage for drawing. */
1539566063dSJacob Faibussowitsch   PetscCall(VecCreateSeq(PETSC_COMM_SELF, nodes, &(node->v)));
15427f51fceSHong Zhang 
15527f51fceSHong Zhang   node->element   = element;
15627f51fceSHong Zhang   node->nodes     = nodes;
15727f51fceSHong Zhang   node->start     = start;
15827f51fceSHong Zhang   node->blocksize = blocksize;
15927f51fceSHong Zhang 
16027f51fceSHong Zhang   node->next         = monitor->firstnode;
16127f51fceSHong Zhang   monitor->firstnode = node;
16227f51fceSHong Zhang   PetscFunctionReturn(0);
16327f51fceSHong Zhang }
16427f51fceSHong Zhang 
16527f51fceSHong Zhang /*@
16627f51fceSHong Zhang   DMNetworkMonitorView - Monitor function for TSMonitorSet.
16727f51fceSHong Zhang 
16896a0c994SBarry Smith   Collectiveon DMNetworkMonitor
16996a0c994SBarry Smith 
17027f51fceSHong Zhang   Input Parameters:
17127f51fceSHong Zhang + monitor - DMNetworkMonitor object
17227f51fceSHong Zhang - x - TS solution vector
17327f51fceSHong Zhang 
17496a0c994SBarry Smith   Level: intermediate
17596a0c994SBarry Smith 
176db781477SPatrick Sanan .seealso: `DMNetworkMonitorCreate()`, `DMNetworkMonitorDestroy()`, `DMNetworkMonitorAdd()`
17727f51fceSHong Zhang @*/
178bb046f40SHong Zhang 
1799371c9d4SSatish Balay PetscErrorCode DMNetworkMonitorView(DMNetworkMonitor monitor, Vec x) {
18027f51fceSHong Zhang   PetscInt             varoffset, i, start;
18127f51fceSHong Zhang   const PetscScalar   *xx;
18227f51fceSHong Zhang   PetscScalar         *vv;
18327f51fceSHong Zhang   DMNetworkMonitorList node;
18427f51fceSHong Zhang 
18527f51fceSHong Zhang   PetscFunctionBegin;
1869566063dSJacob Faibussowitsch   PetscCall(VecGetArrayRead(x, &xx));
18727f51fceSHong Zhang   for (node = monitor->firstnode; node; node = node->next) {
1889566063dSJacob Faibussowitsch     PetscCall(DMNetworkGetGlobalVecOffset(monitor->network, node->element, ALL_COMPONENTS, &varoffset));
1899566063dSJacob Faibussowitsch     PetscCall(VecGetArray(node->v, &vv));
19027f51fceSHong Zhang     start = varoffset + node->start;
1919371c9d4SSatish Balay     for (i = 0; i < node->nodes; i++) { vv[i] = xx[start + i * node->blocksize]; }
1929566063dSJacob Faibussowitsch     PetscCall(VecRestoreArray(node->v, &vv));
1939566063dSJacob Faibussowitsch     PetscCall(VecView(node->v, node->viewer));
19427f51fceSHong Zhang   }
1959566063dSJacob Faibussowitsch   PetscCall(VecRestoreArrayRead(x, &xx));
19627f51fceSHong Zhang   PetscFunctionReturn(0);
19727f51fceSHong Zhang }
198