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