127f51fceSHong Zhang #include <petscdmnetwork.h> /*I "petscdmnetwork.h" I*/ 227f51fceSHong Zhang #include <petscdraw.h> 327f51fceSHong Zhang 427f51fceSHong Zhang #undef __FUNCT__ 527f51fceSHong Zhang #define __FUNCT__ "DMNetworkMonitorCreate" 627f51fceSHong Zhang /*@ 727f51fceSHong Zhang DMNetworkMonitorCreate - Creates a network monitor context 827f51fceSHong Zhang 927f51fceSHong Zhang Collective on MPI_Comm 1027f51fceSHong Zhang 1127f51fceSHong Zhang Input Parameters: 1227f51fceSHong Zhang + network - network to monitor 1327f51fceSHong Zhang 1427f51fceSHong Zhang Output Parameters: 1527f51fceSHong Zhang + Monitorptr - Location to put network monitor context 1627f51fceSHong Zhang 1727f51fceSHong Zhang .seealso: DMNetworkMonitorDestroy, DMNetworkMonitorAdd 1827f51fceSHong Zhang @*/ 1927f51fceSHong Zhang PetscErrorCode DMNetworkMonitorCreate(DM network,DMNetworkMonitor *monitorptr) 2027f51fceSHong Zhang { 2127f51fceSHong Zhang PetscErrorCode ierr; 2227f51fceSHong Zhang DMNetworkMonitor monitor; 23*2d2f4133SHong Zhang MPI_Comm comm; 2427f51fceSHong Zhang PetscMPIInt size; 2527f51fceSHong Zhang 2627f51fceSHong Zhang PetscFunctionBegin; 27*2d2f4133SHong Zhang ierr = PetscObjectGetComm((PetscObject)network,&comm);CHKERRQ(ierr); 28*2d2f4133SHong Zhang ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr); 2927f51fceSHong Zhang if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Parallel DMNetworkMonitor is not supported yet"); 30*2d2f4133SHong Zhang 3127f51fceSHong Zhang ierr = PetscMalloc1(1,&monitor);CHKERRQ(ierr); 32*2d2f4133SHong Zhang monitor->comm = comm; 3327f51fceSHong Zhang monitor->network = network; 3427f51fceSHong Zhang monitor->firstnode = PETSC_NULL; 3527f51fceSHong Zhang 3627f51fceSHong Zhang *monitorptr = monitor; 3727f51fceSHong Zhang PetscFunctionReturn(0); 3827f51fceSHong Zhang } 3927f51fceSHong Zhang 4027f51fceSHong Zhang #undef __FUNCT__ 4127f51fceSHong Zhang #define __FUNCT__ "DMNetworkMonitorDestroy" 4227f51fceSHong Zhang /*@ 4327f51fceSHong Zhang DMNetworkMonitorDestroy - Destroys a network monitor and all associated viewers 4427f51fceSHong Zhang 4527f51fceSHong Zhang Collective on DMNetworkMonitor 4627f51fceSHong Zhang 4727f51fceSHong Zhang Input Parameters: 4827f51fceSHong Zhang + monitor - monitor to destroy 4927f51fceSHong Zhang 5027f51fceSHong Zhang .seealso: DMNetworkMonitorCreate, DMNetworkMonitorAdd 5127f51fceSHong Zhang @*/ 5227f51fceSHong Zhang PetscErrorCode DMNetworkMonitorDestroy(DMNetworkMonitor *monitor) 5327f51fceSHong Zhang { 5427f51fceSHong Zhang PetscErrorCode ierr; 5527f51fceSHong Zhang 5627f51fceSHong Zhang PetscFunctionBegin; 5727f51fceSHong Zhang while ((*monitor)->firstnode) { 5827f51fceSHong Zhang ierr = DMNetworkMonitorPop(*monitor);CHKERRQ(ierr); 5927f51fceSHong Zhang } 6027f51fceSHong Zhang 6127f51fceSHong Zhang ierr = PetscFree(*monitor);CHKERRQ(ierr); 6227f51fceSHong Zhang PetscFunctionReturn(0); 6327f51fceSHong Zhang } 6427f51fceSHong Zhang 6527f51fceSHong Zhang #undef __FUNCT__ 6627f51fceSHong Zhang #define __FUNCT__ "DMNetworkMonitorPop" 6727f51fceSHong Zhang /*@ 6827f51fceSHong Zhang DMNetworkMonitorPop - Removes the most recently added viewer 6927f51fceSHong Zhang 7027f51fceSHong Zhang Input Parameters: 7127f51fceSHong Zhang + monitor - the monitor 7227f51fceSHong Zhang 7327f51fceSHong Zhang .seealso: DMNetworkMonitorCreate, DMNetworkMonitorDestroy 7427f51fceSHong Zhang @*/ 7527f51fceSHong Zhang PetscErrorCode DMNetworkMonitorPop(DMNetworkMonitor monitor) 7627f51fceSHong Zhang { 7727f51fceSHong Zhang PetscErrorCode ierr; 7827f51fceSHong Zhang DMNetworkMonitorList node; 7927f51fceSHong Zhang 8027f51fceSHong Zhang PetscFunctionBegin; 8127f51fceSHong Zhang if (monitor->firstnode) { 8227f51fceSHong Zhang /* Update links */ 8327f51fceSHong Zhang node = monitor->firstnode; 8427f51fceSHong Zhang monitor->firstnode = node->next; 8527f51fceSHong Zhang 8627f51fceSHong Zhang /* Free list node */ 8727f51fceSHong Zhang ierr = PetscViewerDestroy(&(node->viewer));CHKERRQ(ierr); 8827f51fceSHong Zhang ierr = VecDestroy(&(node->v));CHKERRQ(ierr); 8927f51fceSHong Zhang ierr = PetscFree(node);CHKERRQ(ierr); 9027f51fceSHong Zhang } 9127f51fceSHong Zhang PetscFunctionReturn(0); 9227f51fceSHong Zhang } 9327f51fceSHong Zhang 9427f51fceSHong Zhang #undef __FUNCT__ 9527f51fceSHong Zhang #define __FUNCT__ "DMNetworkMonitorAdd" 9627f51fceSHong Zhang /*@ 9727f51fceSHong Zhang DMNetworkMonitorAdd - Adds a new viewer to monitor 9827f51fceSHong Zhang 9927f51fceSHong Zhang Input Parameters: 10027f51fceSHong Zhang + monitor - the monitor 10127f51fceSHong Zhang . name - name of viewer 10227f51fceSHong Zhang . element - vertex / edge number 10327f51fceSHong Zhang . nodes - number of nodes 10427f51fceSHong Zhang . start - variable starting offset 10527f51fceSHong Zhang . blocksize - variable blocksize 10627f51fceSHong Zhang . ymin - ymin for viewer 10727f51fceSHong Zhang . ymax - ymax for viewer 10827f51fceSHong Zhang - hold - determines if plot limits should be held 10927f51fceSHong Zhang 11027f51fceSHong Zhang Notes: 11127f51fceSHong Zhang This is written to be independent of the semantics associated to the variables 11227f51fceSHong Zhang at a given network vertex / edge. 11327f51fceSHong Zhang 11427f51fceSHong Zhang Precisely, the parameters nodes, start and blocksize allow you to select a general 11527f51fceSHong Zhang strided subarray of the variables to monitor. 11627f51fceSHong Zhang 11727f51fceSHong Zhang .seealso: DMNetworkMonitorCreate, DMNetworkMonitorDestroy 11827f51fceSHong Zhang @*/ 11927f51fceSHong Zhang PetscErrorCode DMNetworkMonitorAdd(DMNetworkMonitor monitor,const char *name,PetscInt element,PetscInt nodes,PetscInt start,PetscInt blocksize,PetscScalar ymin,PetscScalar ymax,PetscBool hold) 12027f51fceSHong Zhang { 12127f51fceSHong Zhang PetscErrorCode ierr; 12227f51fceSHong Zhang PetscDrawLG drawlg; 12327f51fceSHong Zhang PetscDrawAxis axis; 12427f51fceSHong Zhang PetscMPIInt rank, size; 12527f51fceSHong Zhang DMNetworkMonitorList node; 12627f51fceSHong Zhang char titleBuffer[64]; 12727f51fceSHong Zhang PetscInt vStart,vEnd,eStart,eEnd; 12827f51fceSHong Zhang 12927f51fceSHong Zhang PetscFunctionBegin; 13027f51fceSHong Zhang ierr = MPI_Comm_rank(monitor->comm, &rank);CHKERRQ(ierr); 13127f51fceSHong Zhang ierr = MPI_Comm_size(monitor->comm, &size);CHKERRQ(ierr); 13227f51fceSHong Zhang 13327f51fceSHong Zhang ierr = DMNetworkGetVertexRange(monitor->network, &vStart, &vEnd); 13427f51fceSHong Zhang ierr = DMNetworkGetEdgeRange(monitor->network, &eStart, &eEnd); 13527f51fceSHong Zhang 13627f51fceSHong Zhang /* Make window title */ 13727f51fceSHong Zhang if (vStart <= element && element < vEnd) { 13827f51fceSHong Zhang ierr = PetscSNPrintf(titleBuffer, 64, "%s @ vertex %d [%d / %d]", name, element - vStart, rank, size-1);CHKERRQ(ierr); 13927f51fceSHong Zhang } else if (eStart <= element && element < eEnd) { 14027f51fceSHong Zhang ierr = PetscSNPrintf(titleBuffer, 64, "%s @ edge %d [%d / %d]", name, element - eStart, rank, size-1);CHKERRQ(ierr); 14127f51fceSHong Zhang } else { 14227f51fceSHong Zhang /* vertex / edge is not on local machine, so skip! */ 14327f51fceSHong Zhang PetscFunctionReturn(0); 14427f51fceSHong Zhang } 14527f51fceSHong Zhang 14627f51fceSHong Zhang ierr = PetscMalloc1(1, &node);CHKERRQ(ierr); 14727f51fceSHong Zhang 14827f51fceSHong Zhang /* Setup viewer. */ 14927f51fceSHong Zhang ierr = PetscViewerDrawOpen(monitor->comm, PETSC_NULL, titleBuffer, PETSC_DECIDE, PETSC_DECIDE, PETSC_DRAW_QUARTER_SIZE, PETSC_DRAW_QUARTER_SIZE, &(node->viewer));CHKERRQ(ierr); 15027f51fceSHong Zhang ierr = PetscViewerPushFormat(node->viewer, PETSC_VIEWER_DRAW_LG);CHKERRQ(ierr); 15127f51fceSHong Zhang ierr = PetscViewerDrawGetDrawLG(node->viewer, 0, &drawlg);CHKERRQ(ierr); 15227f51fceSHong Zhang ierr = PetscDrawLGGetAxis(drawlg, &axis);CHKERRQ(ierr); 15327f51fceSHong Zhang ierr = PetscDrawAxisSetLimits(axis, 0, nodes-1, ymin, ymax);CHKERRQ(ierr); 15427f51fceSHong Zhang ierr = PetscDrawAxisSetHoldLimits(axis, hold);CHKERRQ(ierr); 15527f51fceSHong Zhang 15627f51fceSHong Zhang /* Setup vector storage for drawing. */ 15727f51fceSHong Zhang ierr = VecCreateSeq(PETSC_COMM_SELF, nodes, &(node->v));CHKERRQ(ierr); 15827f51fceSHong Zhang 15927f51fceSHong Zhang node->element = element; 16027f51fceSHong Zhang node->nodes = nodes; 16127f51fceSHong Zhang node->start = start; 16227f51fceSHong Zhang node->blocksize = blocksize; 16327f51fceSHong Zhang 16427f51fceSHong Zhang node->next = monitor->firstnode; 16527f51fceSHong Zhang monitor->firstnode = node; 16627f51fceSHong Zhang PetscFunctionReturn(0); 16727f51fceSHong Zhang } 16827f51fceSHong Zhang 16927f51fceSHong Zhang #undef __FUNCT__ 17027f51fceSHong Zhang #define __FUNCT__ "DMNetworkMonitorView" 17127f51fceSHong Zhang /*@ 17227f51fceSHong Zhang DMNetworkMonitorView - Monitor function for TSMonitorSet. 17327f51fceSHong Zhang 17427f51fceSHong Zhang Input Parameters: 17527f51fceSHong Zhang + monitor - DMNetworkMonitor object 17627f51fceSHong Zhang - x - TS solution vector 17727f51fceSHong Zhang 17827f51fceSHong Zhang .seealso: DMNetworkMonitorCreate, DMNetworkMonitorDestroy, DMNetworkMonitorAdd 17927f51fceSHong Zhang @*/ 18027f51fceSHong Zhang PetscErrorCode DMNetworkMonitorView(DMNetworkMonitor monitor,Vec x) 18127f51fceSHong Zhang { 18227f51fceSHong Zhang PetscErrorCode ierr; 18327f51fceSHong Zhang PetscInt varoffset,i,start; 18427f51fceSHong Zhang const PetscScalar *xx; 18527f51fceSHong Zhang PetscScalar *vv; 18627f51fceSHong Zhang DMNetworkMonitorList node; 18727f51fceSHong Zhang 18827f51fceSHong Zhang PetscFunctionBegin; 18927f51fceSHong Zhang ierr = VecGetArrayRead(x, &xx);CHKERRQ(ierr); 19027f51fceSHong Zhang for (node = monitor->firstnode; node; node = node->next) { 19127f51fceSHong Zhang ierr = DMNetworkGetVariableGlobalOffset(monitor->network, node->element, &varoffset);CHKERRQ(ierr); 19227f51fceSHong Zhang ierr = VecGetArray(node->v, &vv);CHKERRQ(ierr); 19327f51fceSHong Zhang start = varoffset + node->start; 19427f51fceSHong Zhang for (i = 0; i < node->nodes; i++) { 19527f51fceSHong Zhang vv[i] = xx[start+i*node->blocksize]; 19627f51fceSHong Zhang } 19727f51fceSHong Zhang ierr = VecRestoreArray(node->v, &vv);CHKERRQ(ierr); 19827f51fceSHong Zhang ierr = VecView(node->v, node->viewer);CHKERRQ(ierr); 19927f51fceSHong Zhang } 20027f51fceSHong Zhang ierr = VecRestoreArrayRead(x, &xx);CHKERRQ(ierr); 20127f51fceSHong Zhang PetscFunctionReturn(0); 20227f51fceSHong Zhang } 203