xref: /petsc/src/dm/impls/network/networkmonitor.c (revision 27f51fce48c3d062b4eda6fb010df9e0616de504)
1*27f51fceSHong Zhang #include <petscdmnetwork.h> /*I  "petscdmnetwork.h"  I*/
2*27f51fceSHong Zhang #include <petscdraw.h>
3*27f51fceSHong Zhang 
4*27f51fceSHong Zhang #undef __FUNCT__
5*27f51fceSHong Zhang #define __FUNCT__ "DMNetworkMonitorCreate"
6*27f51fceSHong Zhang /*@
7*27f51fceSHong Zhang   DMNetworkMonitorCreate - Creates a network monitor context
8*27f51fceSHong Zhang 
9*27f51fceSHong Zhang   Collective on MPI_Comm
10*27f51fceSHong Zhang 
11*27f51fceSHong Zhang   Input Parameters:
12*27f51fceSHong Zhang + network - network to monitor
13*27f51fceSHong Zhang 
14*27f51fceSHong Zhang   Output Parameters:
15*27f51fceSHong Zhang + Monitorptr - Location to put network monitor context
16*27f51fceSHong Zhang 
17*27f51fceSHong Zhang .seealso: DMNetworkMonitorDestroy, DMNetworkMonitorAdd
18*27f51fceSHong Zhang @*/
19*27f51fceSHong Zhang PetscErrorCode DMNetworkMonitorCreate(DM network,DMNetworkMonitor *monitorptr)
20*27f51fceSHong Zhang {
21*27f51fceSHong Zhang   PetscErrorCode   ierr;
22*27f51fceSHong Zhang   DMNetworkMonitor monitor;
23*27f51fceSHong Zhang   PetscMPIInt      size;
24*27f51fceSHong Zhang 
25*27f51fceSHong Zhang   PetscFunctionBegin;
26*27f51fceSHong Zhang   ierr = MPI_Comm_size(monitor->comm, &size);CHKERRQ(ierr);
27*27f51fceSHong Zhang   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Parallel DMNetworkMonitor is not supported yet");
28*27f51fceSHong Zhang   ierr = PetscMalloc1(1,&monitor);CHKERRQ(ierr);
29*27f51fceSHong Zhang   ierr = PetscObjectGetComm((PetscObject)network,&monitor->comm);CHKERRQ(ierr);
30*27f51fceSHong Zhang   monitor->network   = network;
31*27f51fceSHong Zhang   monitor->firstnode = PETSC_NULL;
32*27f51fceSHong Zhang 
33*27f51fceSHong Zhang   *monitorptr = monitor;
34*27f51fceSHong Zhang   PetscFunctionReturn(0);
35*27f51fceSHong Zhang }
36*27f51fceSHong Zhang 
37*27f51fceSHong Zhang #undef __FUNCT__
38*27f51fceSHong Zhang #define __FUNCT__ "DMNetworkMonitorDestroy"
39*27f51fceSHong Zhang /*@
40*27f51fceSHong Zhang   DMNetworkMonitorDestroy - Destroys a network monitor and all associated viewers
41*27f51fceSHong Zhang 
42*27f51fceSHong Zhang   Collective on DMNetworkMonitor
43*27f51fceSHong Zhang 
44*27f51fceSHong Zhang   Input Parameters:
45*27f51fceSHong Zhang + monitor - monitor to destroy
46*27f51fceSHong Zhang 
47*27f51fceSHong Zhang .seealso: DMNetworkMonitorCreate, DMNetworkMonitorAdd
48*27f51fceSHong Zhang @*/
49*27f51fceSHong Zhang PetscErrorCode DMNetworkMonitorDestroy(DMNetworkMonitor *monitor)
50*27f51fceSHong Zhang {
51*27f51fceSHong Zhang   PetscErrorCode ierr;
52*27f51fceSHong Zhang 
53*27f51fceSHong Zhang   PetscFunctionBegin;
54*27f51fceSHong Zhang   while ((*monitor)->firstnode) {
55*27f51fceSHong Zhang     ierr = DMNetworkMonitorPop(*monitor);CHKERRQ(ierr);
56*27f51fceSHong Zhang   }
57*27f51fceSHong Zhang 
58*27f51fceSHong Zhang   ierr = PetscFree(*monitor);CHKERRQ(ierr);
59*27f51fceSHong Zhang   PetscFunctionReturn(0);
60*27f51fceSHong Zhang }
61*27f51fceSHong Zhang 
62*27f51fceSHong Zhang #undef __FUNCT__
63*27f51fceSHong Zhang #define __FUNCT__ "DMNetworkMonitorPop"
64*27f51fceSHong Zhang /*@
65*27f51fceSHong Zhang   DMNetworkMonitorPop - Removes the most recently added viewer
66*27f51fceSHong Zhang 
67*27f51fceSHong Zhang   Input Parameters:
68*27f51fceSHong Zhang + monitor - the monitor
69*27f51fceSHong Zhang 
70*27f51fceSHong Zhang .seealso: DMNetworkMonitorCreate, DMNetworkMonitorDestroy
71*27f51fceSHong Zhang @*/
72*27f51fceSHong Zhang PetscErrorCode DMNetworkMonitorPop(DMNetworkMonitor monitor)
73*27f51fceSHong Zhang {
74*27f51fceSHong Zhang   PetscErrorCode       ierr;
75*27f51fceSHong Zhang   DMNetworkMonitorList node;
76*27f51fceSHong Zhang 
77*27f51fceSHong Zhang   PetscFunctionBegin;
78*27f51fceSHong Zhang   if (monitor->firstnode) {
79*27f51fceSHong Zhang     /* Update links */
80*27f51fceSHong Zhang     node = monitor->firstnode;
81*27f51fceSHong Zhang     monitor->firstnode = node->next;
82*27f51fceSHong Zhang 
83*27f51fceSHong Zhang     /* Free list node */
84*27f51fceSHong Zhang     ierr = PetscViewerDestroy(&(node->viewer));CHKERRQ(ierr);
85*27f51fceSHong Zhang     ierr = VecDestroy(&(node->v));CHKERRQ(ierr);
86*27f51fceSHong Zhang     ierr = PetscFree(node);CHKERRQ(ierr);
87*27f51fceSHong Zhang   }
88*27f51fceSHong Zhang   PetscFunctionReturn(0);
89*27f51fceSHong Zhang }
90*27f51fceSHong Zhang 
91*27f51fceSHong Zhang #undef __FUNCT__
92*27f51fceSHong Zhang #define __FUNCT__ "DMNetworkMonitorAdd"
93*27f51fceSHong Zhang /*@
94*27f51fceSHong Zhang   DMNetworkMonitorAdd - Adds a new viewer to monitor
95*27f51fceSHong Zhang 
96*27f51fceSHong Zhang   Input Parameters:
97*27f51fceSHong Zhang + monitor - the monitor
98*27f51fceSHong Zhang . name - name of viewer
99*27f51fceSHong Zhang . element - vertex / edge number
100*27f51fceSHong Zhang . nodes - number of nodes
101*27f51fceSHong Zhang . start - variable starting offset
102*27f51fceSHong Zhang . blocksize - variable blocksize
103*27f51fceSHong Zhang . ymin - ymin for viewer
104*27f51fceSHong Zhang . ymax - ymax for viewer
105*27f51fceSHong Zhang - hold - determines if plot limits should be held
106*27f51fceSHong Zhang 
107*27f51fceSHong Zhang   Notes:
108*27f51fceSHong Zhang   This is written to be independent of the semantics associated to the variables
109*27f51fceSHong Zhang   at a given network vertex / edge.
110*27f51fceSHong Zhang 
111*27f51fceSHong Zhang   Precisely, the parameters nodes, start and blocksize allow you to select a general
112*27f51fceSHong Zhang   strided subarray of the variables to monitor.
113*27f51fceSHong Zhang 
114*27f51fceSHong Zhang .seealso: DMNetworkMonitorCreate, DMNetworkMonitorDestroy
115*27f51fceSHong Zhang @*/
116*27f51fceSHong Zhang PetscErrorCode DMNetworkMonitorAdd(DMNetworkMonitor monitor,const char *name,PetscInt element,PetscInt nodes,PetscInt start,PetscInt blocksize,PetscScalar ymin,PetscScalar ymax,PetscBool hold)
117*27f51fceSHong Zhang {
118*27f51fceSHong Zhang   PetscErrorCode       ierr;
119*27f51fceSHong Zhang   PetscDrawLG          drawlg;
120*27f51fceSHong Zhang   PetscDrawAxis        axis;
121*27f51fceSHong Zhang   PetscMPIInt          rank, size;
122*27f51fceSHong Zhang   DMNetworkMonitorList node;
123*27f51fceSHong Zhang   char                 titleBuffer[64];
124*27f51fceSHong Zhang   PetscInt             vStart,vEnd,eStart,eEnd;
125*27f51fceSHong Zhang 
126*27f51fceSHong Zhang   PetscFunctionBegin;
127*27f51fceSHong Zhang   ierr = MPI_Comm_rank(monitor->comm, &rank);CHKERRQ(ierr);
128*27f51fceSHong Zhang   ierr = MPI_Comm_size(monitor->comm, &size);CHKERRQ(ierr);
129*27f51fceSHong Zhang 
130*27f51fceSHong Zhang   ierr = DMNetworkGetVertexRange(monitor->network, &vStart, &vEnd);
131*27f51fceSHong Zhang   ierr = DMNetworkGetEdgeRange(monitor->network, &eStart, &eEnd);
132*27f51fceSHong Zhang 
133*27f51fceSHong Zhang   /* Make window title */
134*27f51fceSHong Zhang   if (vStart <= element && element < vEnd) {
135*27f51fceSHong Zhang     ierr = PetscSNPrintf(titleBuffer, 64, "%s @ vertex %d [%d / %d]", name, element - vStart, rank, size-1);CHKERRQ(ierr);
136*27f51fceSHong Zhang   } else if (eStart <= element && element < eEnd) {
137*27f51fceSHong Zhang     ierr = PetscSNPrintf(titleBuffer, 64, "%s @ edge %d [%d / %d]", name, element - eStart, rank, size-1);CHKERRQ(ierr);
138*27f51fceSHong Zhang   } else {
139*27f51fceSHong Zhang     /* vertex / edge is not on local machine, so skip! */
140*27f51fceSHong Zhang     PetscFunctionReturn(0);
141*27f51fceSHong Zhang   }
142*27f51fceSHong Zhang 
143*27f51fceSHong Zhang   ierr = PetscMalloc1(1, &node);CHKERRQ(ierr);
144*27f51fceSHong Zhang 
145*27f51fceSHong Zhang   /* Setup viewer. */
146*27f51fceSHong Zhang   ierr = PetscViewerDrawOpen(monitor->comm, PETSC_NULL, titleBuffer, PETSC_DECIDE, PETSC_DECIDE, PETSC_DRAW_QUARTER_SIZE, PETSC_DRAW_QUARTER_SIZE, &(node->viewer));CHKERRQ(ierr);
147*27f51fceSHong Zhang   ierr = PetscViewerPushFormat(node->viewer, PETSC_VIEWER_DRAW_LG);CHKERRQ(ierr);
148*27f51fceSHong Zhang   ierr = PetscViewerDrawGetDrawLG(node->viewer, 0, &drawlg);CHKERRQ(ierr);
149*27f51fceSHong Zhang   ierr = PetscDrawLGGetAxis(drawlg, &axis);CHKERRQ(ierr);
150*27f51fceSHong Zhang   ierr = PetscDrawAxisSetLimits(axis, 0, nodes-1, ymin, ymax);CHKERRQ(ierr);
151*27f51fceSHong Zhang   ierr = PetscDrawAxisSetHoldLimits(axis, hold);CHKERRQ(ierr);
152*27f51fceSHong Zhang 
153*27f51fceSHong Zhang   /* Setup vector storage for drawing. */
154*27f51fceSHong Zhang   ierr = VecCreateSeq(PETSC_COMM_SELF, nodes, &(node->v));CHKERRQ(ierr);
155*27f51fceSHong Zhang 
156*27f51fceSHong Zhang   node->element   = element;
157*27f51fceSHong Zhang   node->nodes     = nodes;
158*27f51fceSHong Zhang   node->start     = start;
159*27f51fceSHong Zhang   node->blocksize = blocksize;
160*27f51fceSHong Zhang 
161*27f51fceSHong Zhang   node->next         = monitor->firstnode;
162*27f51fceSHong Zhang   monitor->firstnode = node;
163*27f51fceSHong Zhang   PetscFunctionReturn(0);
164*27f51fceSHong Zhang }
165*27f51fceSHong Zhang 
166*27f51fceSHong Zhang #undef __FUNCT__
167*27f51fceSHong Zhang #define __FUNCT__ "DMNetworkMonitorView"
168*27f51fceSHong Zhang /*@
169*27f51fceSHong Zhang   DMNetworkMonitorView - Monitor function for TSMonitorSet.
170*27f51fceSHong Zhang 
171*27f51fceSHong Zhang   Input Parameters:
172*27f51fceSHong Zhang + monitor - DMNetworkMonitor object
173*27f51fceSHong Zhang - x - TS solution vector
174*27f51fceSHong Zhang 
175*27f51fceSHong Zhang .seealso: DMNetworkMonitorCreate, DMNetworkMonitorDestroy, DMNetworkMonitorAdd
176*27f51fceSHong Zhang @*/
177*27f51fceSHong Zhang PetscErrorCode DMNetworkMonitorView(DMNetworkMonitor monitor,Vec x)
178*27f51fceSHong Zhang {
179*27f51fceSHong Zhang   PetscErrorCode      ierr;
180*27f51fceSHong Zhang   PetscInt            varoffset,i,start;
181*27f51fceSHong Zhang   const PetscScalar   *xx;
182*27f51fceSHong Zhang   PetscScalar         *vv;
183*27f51fceSHong Zhang   DMNetworkMonitorList node;
184*27f51fceSHong Zhang 
185*27f51fceSHong Zhang   PetscFunctionBegin;
186*27f51fceSHong Zhang   ierr = VecGetArrayRead(x, &xx);CHKERRQ(ierr);
187*27f51fceSHong Zhang   for (node = monitor->firstnode; node; node = node->next) {
188*27f51fceSHong Zhang     ierr = DMNetworkGetVariableGlobalOffset(monitor->network, node->element, &varoffset);CHKERRQ(ierr);
189*27f51fceSHong Zhang     ierr = VecGetArray(node->v, &vv);CHKERRQ(ierr);
190*27f51fceSHong Zhang     start = varoffset + node->start;
191*27f51fceSHong Zhang     for (i = 0; i < node->nodes; i++) {
192*27f51fceSHong Zhang       vv[i] = xx[start+i*node->blocksize];
193*27f51fceSHong Zhang     }
194*27f51fceSHong Zhang     ierr = VecRestoreArray(node->v, &vv);CHKERRQ(ierr);
195*27f51fceSHong Zhang     ierr = VecView(node->v, node->viewer);CHKERRQ(ierr);
196*27f51fceSHong Zhang   }
197*27f51fceSHong Zhang   ierr = VecRestoreArrayRead(x, &xx);CHKERRQ(ierr);
198*27f51fceSHong Zhang   PetscFunctionReturn(0);
199*27f51fceSHong Zhang }
200