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