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