xref: /petsc/src/dm/impls/network/networkmonitor.c (revision 96a0c9949c19278363492ba7462c3ac2a88a3ed1)
127f51fceSHong Zhang #include <petscdmnetwork.h> /*I  "petscdmnetwork.h"  I*/
227f51fceSHong Zhang #include <petscdraw.h>
327f51fceSHong Zhang 
427f51fceSHong Zhang #undef __FUNCT__
527f51fceSHong Zhang #define __FUNCT__ "DMNetworkMonitorCreate"
627f51fceSHong Zhang /*@
727f51fceSHong Zhang   DMNetworkMonitorCreate - Creates a network monitor context
827f51fceSHong Zhang 
927f51fceSHong Zhang   Collective on MPI_Comm
1027f51fceSHong Zhang 
1127f51fceSHong Zhang   Input Parameters:
12*96a0c994SBarry Smith . network - network to monitor
1327f51fceSHong Zhang 
1427f51fceSHong Zhang   Output Parameters:
15*96a0c994SBarry Smith . Monitorptr - Location to put network monitor context
1627f51fceSHong Zhang 
17*96a0c994SBarry Smith   Level: intermediate
18*96a0c994SBarry Smith 
19*96a0c994SBarry Smith .seealso: DMNetworkMonitorDestroy(), DMNetworkMonitorAdd()
2027f51fceSHong Zhang @*/
2127f51fceSHong Zhang PetscErrorCode DMNetworkMonitorCreate(DM network,DMNetworkMonitor *monitorptr)
2227f51fceSHong Zhang {
2327f51fceSHong Zhang   PetscErrorCode   ierr;
2427f51fceSHong Zhang   DMNetworkMonitor monitor;
252d2f4133SHong Zhang   MPI_Comm         comm;
2627f51fceSHong Zhang   PetscMPIInt      size;
2727f51fceSHong Zhang 
2827f51fceSHong Zhang   PetscFunctionBegin;
292d2f4133SHong Zhang   ierr = PetscObjectGetComm((PetscObject)network,&comm);CHKERRQ(ierr);
302d2f4133SHong Zhang   ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr);
3127f51fceSHong Zhang   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Parallel DMNetworkMonitor is not supported yet");
322d2f4133SHong Zhang 
3327f51fceSHong Zhang   ierr = PetscMalloc1(1,&monitor);CHKERRQ(ierr);
342d2f4133SHong Zhang   monitor->comm      = comm;
3527f51fceSHong Zhang   monitor->network   = network;
3627f51fceSHong Zhang   monitor->firstnode = PETSC_NULL;
3727f51fceSHong Zhang 
3827f51fceSHong Zhang   *monitorptr = monitor;
3927f51fceSHong Zhang   PetscFunctionReturn(0);
4027f51fceSHong Zhang }
4127f51fceSHong Zhang 
4227f51fceSHong Zhang #undef __FUNCT__
4327f51fceSHong Zhang #define __FUNCT__ "DMNetworkMonitorDestroy"
4427f51fceSHong Zhang /*@
4527f51fceSHong Zhang   DMNetworkMonitorDestroy - Destroys a network monitor and all associated viewers
4627f51fceSHong Zhang 
4727f51fceSHong Zhang   Collective on DMNetworkMonitor
4827f51fceSHong Zhang 
4927f51fceSHong Zhang   Input Parameters:
50*96a0c994SBarry Smith . monitor - monitor to destroy
51*96a0c994SBarry Smith 
52*96a0c994SBarry Smith   Level: intermediate
5327f51fceSHong Zhang 
5427f51fceSHong Zhang .seealso: DMNetworkMonitorCreate, DMNetworkMonitorAdd
5527f51fceSHong Zhang @*/
5627f51fceSHong Zhang PetscErrorCode DMNetworkMonitorDestroy(DMNetworkMonitor *monitor)
5727f51fceSHong Zhang {
5827f51fceSHong Zhang   PetscErrorCode ierr;
5927f51fceSHong Zhang 
6027f51fceSHong Zhang   PetscFunctionBegin;
6127f51fceSHong Zhang   while ((*monitor)->firstnode) {
6227f51fceSHong Zhang     ierr = DMNetworkMonitorPop(*monitor);CHKERRQ(ierr);
6327f51fceSHong Zhang   }
6427f51fceSHong Zhang 
6527f51fceSHong Zhang   ierr = PetscFree(*monitor);CHKERRQ(ierr);
6627f51fceSHong Zhang   PetscFunctionReturn(0);
6727f51fceSHong Zhang }
6827f51fceSHong Zhang 
6927f51fceSHong Zhang #undef __FUNCT__
7027f51fceSHong Zhang #define __FUNCT__ "DMNetworkMonitorPop"
7127f51fceSHong Zhang /*@
7227f51fceSHong Zhang   DMNetworkMonitorPop - Removes the most recently added viewer
7327f51fceSHong Zhang 
74*96a0c994SBarry Smith   Collective on DMNetworkMonitor
7527f51fceSHong Zhang 
76*96a0c994SBarry Smith   Input Parameters:
77*96a0c994SBarry Smith . monitor - the monitor
78*96a0c994SBarry Smith 
79*96a0c994SBarry Smith   Level: intermediate
80*96a0c994SBarry Smith 
81*96a0c994SBarry Smith .seealso: DMNetworkMonitorCreate(), DMNetworkMonitorDestroy()
8227f51fceSHong Zhang @*/
8327f51fceSHong Zhang PetscErrorCode DMNetworkMonitorPop(DMNetworkMonitor monitor)
8427f51fceSHong Zhang {
8527f51fceSHong Zhang   PetscErrorCode       ierr;
8627f51fceSHong Zhang   DMNetworkMonitorList node;
8727f51fceSHong Zhang 
8827f51fceSHong Zhang   PetscFunctionBegin;
8927f51fceSHong Zhang   if (monitor->firstnode) {
9027f51fceSHong Zhang     /* Update links */
9127f51fceSHong Zhang     node = monitor->firstnode;
9227f51fceSHong Zhang     monitor->firstnode = node->next;
9327f51fceSHong Zhang 
9427f51fceSHong Zhang     /* Free list node */
9527f51fceSHong Zhang     ierr = PetscViewerDestroy(&(node->viewer));CHKERRQ(ierr);
9627f51fceSHong Zhang     ierr = VecDestroy(&(node->v));CHKERRQ(ierr);
9727f51fceSHong Zhang     ierr = PetscFree(node);CHKERRQ(ierr);
9827f51fceSHong Zhang   }
9927f51fceSHong Zhang   PetscFunctionReturn(0);
10027f51fceSHong Zhang }
10127f51fceSHong Zhang 
10227f51fceSHong Zhang #undef __FUNCT__
10327f51fceSHong Zhang #define __FUNCT__ "DMNetworkMonitorAdd"
10427f51fceSHong Zhang /*@
10527f51fceSHong Zhang   DMNetworkMonitorAdd - Adds a new viewer to monitor
10627f51fceSHong Zhang 
107*96a0c994SBarry Smith   Collective on DMNetworkMonitor
108*96a0c994SBarry Smith 
10927f51fceSHong Zhang   Input Parameters:
11027f51fceSHong Zhang + monitor - the monitor
11127f51fceSHong Zhang . name - name of viewer
11227f51fceSHong Zhang . element - vertex / edge number
11327f51fceSHong Zhang . nodes - number of nodes
11427f51fceSHong Zhang . start - variable starting offset
11527f51fceSHong Zhang . blocksize - variable blocksize
11627f51fceSHong Zhang . ymin - ymin for viewer
11727f51fceSHong Zhang . ymax - ymax for viewer
11827f51fceSHong Zhang - hold - determines if plot limits should be held
11927f51fceSHong Zhang 
120*96a0c994SBarry Smith   Level: intermediate
121*96a0c994SBarry Smith 
12227f51fceSHong Zhang   Notes:
12327f51fceSHong Zhang   This is written to be independent of the semantics associated to the variables
12427f51fceSHong Zhang   at a given network vertex / edge.
12527f51fceSHong Zhang 
12627f51fceSHong Zhang   Precisely, the parameters nodes, start and blocksize allow you to select a general
12727f51fceSHong Zhang   strided subarray of the variables to monitor.
12827f51fceSHong Zhang 
129*96a0c994SBarry Smith .seealso: DMNetworkMonitorCreate(), DMNetworkMonitorDestroy()
13027f51fceSHong Zhang @*/
131232215b8SHong Zhang PetscErrorCode DMNetworkMonitorAdd(DMNetworkMonitor monitor,const char *name,PetscInt element,PetscInt nodes,PetscInt start,PetscInt blocksize,PetscReal ymin,PetscReal ymax,PetscBool hold)
13227f51fceSHong Zhang {
13327f51fceSHong Zhang   PetscErrorCode       ierr;
13427f51fceSHong Zhang   PetscDrawLG          drawlg;
13527f51fceSHong Zhang   PetscDrawAxis        axis;
13627f51fceSHong Zhang   PetscMPIInt          rank, size;
13727f51fceSHong Zhang   DMNetworkMonitorList node;
13827f51fceSHong Zhang   char                 titleBuffer[64];
13927f51fceSHong Zhang   PetscInt             vStart,vEnd,eStart,eEnd;
14027f51fceSHong Zhang 
14127f51fceSHong Zhang   PetscFunctionBegin;
14227f51fceSHong Zhang   ierr = MPI_Comm_rank(monitor->comm, &rank);CHKERRQ(ierr);
14327f51fceSHong Zhang   ierr = MPI_Comm_size(monitor->comm, &size);CHKERRQ(ierr);
14427f51fceSHong Zhang 
14527f51fceSHong Zhang   ierr = DMNetworkGetVertexRange(monitor->network, &vStart, &vEnd);
14627f51fceSHong Zhang   ierr = DMNetworkGetEdgeRange(monitor->network, &eStart, &eEnd);
14727f51fceSHong Zhang 
14827f51fceSHong Zhang   /* Make window title */
14927f51fceSHong Zhang   if (vStart <= element && element < vEnd) {
15027f51fceSHong Zhang     ierr = PetscSNPrintf(titleBuffer, 64, "%s @ vertex %d [%d / %d]", name, element - vStart, rank, size-1);CHKERRQ(ierr);
15127f51fceSHong Zhang   } else if (eStart <= element && element < eEnd) {
15227f51fceSHong Zhang     ierr = PetscSNPrintf(titleBuffer, 64, "%s @ edge %d [%d / %d]", name, element - eStart, rank, size-1);CHKERRQ(ierr);
15327f51fceSHong Zhang   } else {
15427f51fceSHong Zhang     /* vertex / edge is not on local machine, so skip! */
15527f51fceSHong Zhang     PetscFunctionReturn(0);
15627f51fceSHong Zhang   }
15727f51fceSHong Zhang 
15827f51fceSHong Zhang   ierr = PetscMalloc1(1, &node);CHKERRQ(ierr);
15927f51fceSHong Zhang 
16027f51fceSHong Zhang   /* Setup viewer. */
16127f51fceSHong Zhang   ierr = PetscViewerDrawOpen(monitor->comm, PETSC_NULL, titleBuffer, PETSC_DECIDE, PETSC_DECIDE, PETSC_DRAW_QUARTER_SIZE, PETSC_DRAW_QUARTER_SIZE, &(node->viewer));CHKERRQ(ierr);
16227f51fceSHong Zhang   ierr = PetscViewerPushFormat(node->viewer, PETSC_VIEWER_DRAW_LG);CHKERRQ(ierr);
16327f51fceSHong Zhang   ierr = PetscViewerDrawGetDrawLG(node->viewer, 0, &drawlg);CHKERRQ(ierr);
16427f51fceSHong Zhang   ierr = PetscDrawLGGetAxis(drawlg, &axis);CHKERRQ(ierr);
16527f51fceSHong Zhang   ierr = PetscDrawAxisSetLimits(axis, 0, nodes-1, ymin, ymax);CHKERRQ(ierr);
16627f51fceSHong Zhang   ierr = PetscDrawAxisSetHoldLimits(axis, hold);CHKERRQ(ierr);
16727f51fceSHong Zhang 
16827f51fceSHong Zhang   /* Setup vector storage for drawing. */
16927f51fceSHong Zhang   ierr = VecCreateSeq(PETSC_COMM_SELF, nodes, &(node->v));CHKERRQ(ierr);
17027f51fceSHong Zhang 
17127f51fceSHong Zhang   node->element   = element;
17227f51fceSHong Zhang   node->nodes     = nodes;
17327f51fceSHong Zhang   node->start     = start;
17427f51fceSHong Zhang   node->blocksize = blocksize;
17527f51fceSHong Zhang 
17627f51fceSHong Zhang   node->next         = monitor->firstnode;
17727f51fceSHong Zhang   monitor->firstnode = node;
17827f51fceSHong Zhang   PetscFunctionReturn(0);
17927f51fceSHong Zhang }
18027f51fceSHong Zhang 
18127f51fceSHong Zhang #undef __FUNCT__
18227f51fceSHong Zhang #define __FUNCT__ "DMNetworkMonitorView"
18327f51fceSHong Zhang /*@
18427f51fceSHong Zhang   DMNetworkMonitorView - Monitor function for TSMonitorSet.
18527f51fceSHong Zhang 
186*96a0c994SBarry Smith   Collectiveon DMNetworkMonitor
187*96a0c994SBarry Smith 
18827f51fceSHong Zhang   Input Parameters:
18927f51fceSHong Zhang + monitor - DMNetworkMonitor object
19027f51fceSHong Zhang - x - TS solution vector
19127f51fceSHong Zhang 
192*96a0c994SBarry Smith   Level: intermediate
193*96a0c994SBarry Smith 
194*96a0c994SBarry Smith .seealso: DMNetworkMonitorCreate(), DMNetworkMonitorDestroy(), DMNetworkMonitorAdd()
19527f51fceSHong Zhang @*/
19627f51fceSHong Zhang PetscErrorCode DMNetworkMonitorView(DMNetworkMonitor monitor,Vec x)
19727f51fceSHong Zhang {
19827f51fceSHong Zhang   PetscErrorCode      ierr;
19927f51fceSHong Zhang   PetscInt            varoffset,i,start;
20027f51fceSHong Zhang   const PetscScalar   *xx;
20127f51fceSHong Zhang   PetscScalar         *vv;
20227f51fceSHong Zhang   DMNetworkMonitorList node;
20327f51fceSHong Zhang 
20427f51fceSHong Zhang   PetscFunctionBegin;
20527f51fceSHong Zhang   ierr = VecGetArrayRead(x, &xx);CHKERRQ(ierr);
20627f51fceSHong Zhang   for (node = monitor->firstnode; node; node = node->next) {
20727f51fceSHong Zhang     ierr = DMNetworkGetVariableGlobalOffset(monitor->network, node->element, &varoffset);CHKERRQ(ierr);
20827f51fceSHong Zhang     ierr = VecGetArray(node->v, &vv);CHKERRQ(ierr);
20927f51fceSHong Zhang     start = varoffset + node->start;
21027f51fceSHong Zhang     for (i = 0; i < node->nodes; i++) {
21127f51fceSHong Zhang       vv[i] = xx[start+i*node->blocksize];
21227f51fceSHong Zhang     }
21327f51fceSHong Zhang     ierr = VecRestoreArray(node->v, &vv);CHKERRQ(ierr);
21427f51fceSHong Zhang     ierr = VecView(node->v, node->viewer);CHKERRQ(ierr);
21527f51fceSHong Zhang   }
21627f51fceSHong Zhang   ierr = VecRestoreArrayRead(x, &xx);CHKERRQ(ierr);
21727f51fceSHong Zhang   PetscFunctionReturn(0);
21827f51fceSHong Zhang }
219