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