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);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 = 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);CHKERRQ(ierr); 137 ierr = MPI_Comm_size(monitor->comm, &size);CHKERRQ(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 = DMNetworkGetVariableGlobalOffset(monitor->network, node->element, &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