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