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