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: 12*96a0c994SBarry Smith . network - network to monitor 1327f51fceSHong Zhang 1427f51fceSHong Zhang Output Parameters: 15*96a0c994SBarry Smith . Monitorptr - Location to put network monitor context 1627f51fceSHong Zhang 17*96a0c994SBarry Smith Level: intermediate 18*96a0c994SBarry Smith 19*96a0c994SBarry Smith .seealso: DMNetworkMonitorDestroy(), DMNetworkMonitorAdd() 2027f51fceSHong Zhang @*/ 2127f51fceSHong Zhang PetscErrorCode DMNetworkMonitorCreate(DM network,DMNetworkMonitor *monitorptr) 2227f51fceSHong Zhang { 2327f51fceSHong Zhang PetscErrorCode ierr; 2427f51fceSHong Zhang DMNetworkMonitor monitor; 252d2f4133SHong Zhang MPI_Comm comm; 2627f51fceSHong Zhang PetscMPIInt size; 2727f51fceSHong Zhang 2827f51fceSHong Zhang PetscFunctionBegin; 292d2f4133SHong Zhang ierr = PetscObjectGetComm((PetscObject)network,&comm);CHKERRQ(ierr); 302d2f4133SHong Zhang ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr); 3127f51fceSHong Zhang if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Parallel DMNetworkMonitor is not supported yet"); 322d2f4133SHong Zhang 3327f51fceSHong Zhang ierr = PetscMalloc1(1,&monitor);CHKERRQ(ierr); 342d2f4133SHong Zhang monitor->comm = comm; 3527f51fceSHong Zhang monitor->network = network; 3627f51fceSHong Zhang monitor->firstnode = PETSC_NULL; 3727f51fceSHong Zhang 3827f51fceSHong Zhang *monitorptr = monitor; 3927f51fceSHong Zhang PetscFunctionReturn(0); 4027f51fceSHong Zhang } 4127f51fceSHong Zhang 4227f51fceSHong Zhang #undef __FUNCT__ 4327f51fceSHong Zhang #define __FUNCT__ "DMNetworkMonitorDestroy" 4427f51fceSHong Zhang /*@ 4527f51fceSHong Zhang DMNetworkMonitorDestroy - Destroys a network monitor and all associated viewers 4627f51fceSHong Zhang 4727f51fceSHong Zhang Collective on DMNetworkMonitor 4827f51fceSHong Zhang 4927f51fceSHong Zhang Input Parameters: 50*96a0c994SBarry Smith . monitor - monitor to destroy 51*96a0c994SBarry Smith 52*96a0c994SBarry Smith Level: intermediate 5327f51fceSHong Zhang 5427f51fceSHong Zhang .seealso: DMNetworkMonitorCreate, DMNetworkMonitorAdd 5527f51fceSHong Zhang @*/ 5627f51fceSHong Zhang PetscErrorCode DMNetworkMonitorDestroy(DMNetworkMonitor *monitor) 5727f51fceSHong Zhang { 5827f51fceSHong Zhang PetscErrorCode ierr; 5927f51fceSHong Zhang 6027f51fceSHong Zhang PetscFunctionBegin; 6127f51fceSHong Zhang while ((*monitor)->firstnode) { 6227f51fceSHong Zhang ierr = DMNetworkMonitorPop(*monitor);CHKERRQ(ierr); 6327f51fceSHong Zhang } 6427f51fceSHong Zhang 6527f51fceSHong Zhang ierr = PetscFree(*monitor);CHKERRQ(ierr); 6627f51fceSHong Zhang PetscFunctionReturn(0); 6727f51fceSHong Zhang } 6827f51fceSHong Zhang 6927f51fceSHong Zhang #undef __FUNCT__ 7027f51fceSHong Zhang #define __FUNCT__ "DMNetworkMonitorPop" 7127f51fceSHong Zhang /*@ 7227f51fceSHong Zhang DMNetworkMonitorPop - Removes the most recently added viewer 7327f51fceSHong Zhang 74*96a0c994SBarry Smith Collective on DMNetworkMonitor 7527f51fceSHong Zhang 76*96a0c994SBarry Smith Input Parameters: 77*96a0c994SBarry Smith . monitor - the monitor 78*96a0c994SBarry Smith 79*96a0c994SBarry Smith Level: intermediate 80*96a0c994SBarry Smith 81*96a0c994SBarry Smith .seealso: DMNetworkMonitorCreate(), DMNetworkMonitorDestroy() 8227f51fceSHong Zhang @*/ 8327f51fceSHong Zhang PetscErrorCode DMNetworkMonitorPop(DMNetworkMonitor monitor) 8427f51fceSHong Zhang { 8527f51fceSHong Zhang PetscErrorCode ierr; 8627f51fceSHong Zhang DMNetworkMonitorList node; 8727f51fceSHong Zhang 8827f51fceSHong Zhang PetscFunctionBegin; 8927f51fceSHong Zhang if (monitor->firstnode) { 9027f51fceSHong Zhang /* Update links */ 9127f51fceSHong Zhang node = monitor->firstnode; 9227f51fceSHong Zhang monitor->firstnode = node->next; 9327f51fceSHong Zhang 9427f51fceSHong Zhang /* Free list node */ 9527f51fceSHong Zhang ierr = PetscViewerDestroy(&(node->viewer));CHKERRQ(ierr); 9627f51fceSHong Zhang ierr = VecDestroy(&(node->v));CHKERRQ(ierr); 9727f51fceSHong Zhang ierr = PetscFree(node);CHKERRQ(ierr); 9827f51fceSHong Zhang } 9927f51fceSHong Zhang PetscFunctionReturn(0); 10027f51fceSHong Zhang } 10127f51fceSHong Zhang 10227f51fceSHong Zhang #undef __FUNCT__ 10327f51fceSHong Zhang #define __FUNCT__ "DMNetworkMonitorAdd" 10427f51fceSHong Zhang /*@ 10527f51fceSHong Zhang DMNetworkMonitorAdd - Adds a new viewer to monitor 10627f51fceSHong Zhang 107*96a0c994SBarry Smith Collective on DMNetworkMonitor 108*96a0c994SBarry Smith 10927f51fceSHong Zhang Input Parameters: 11027f51fceSHong Zhang + monitor - the monitor 11127f51fceSHong Zhang . name - name of viewer 11227f51fceSHong Zhang . element - vertex / edge number 11327f51fceSHong Zhang . nodes - number of nodes 11427f51fceSHong Zhang . start - variable starting offset 11527f51fceSHong Zhang . blocksize - variable blocksize 11627f51fceSHong Zhang . ymin - ymin for viewer 11727f51fceSHong Zhang . ymax - ymax for viewer 11827f51fceSHong Zhang - hold - determines if plot limits should be held 11927f51fceSHong Zhang 120*96a0c994SBarry Smith Level: intermediate 121*96a0c994SBarry Smith 12227f51fceSHong Zhang Notes: 12327f51fceSHong Zhang This is written to be independent of the semantics associated to the variables 12427f51fceSHong Zhang at a given network vertex / edge. 12527f51fceSHong Zhang 12627f51fceSHong Zhang Precisely, the parameters nodes, start and blocksize allow you to select a general 12727f51fceSHong Zhang strided subarray of the variables to monitor. 12827f51fceSHong Zhang 129*96a0c994SBarry Smith .seealso: DMNetworkMonitorCreate(), DMNetworkMonitorDestroy() 13027f51fceSHong Zhang @*/ 131232215b8SHong Zhang PetscErrorCode DMNetworkMonitorAdd(DMNetworkMonitor monitor,const char *name,PetscInt element,PetscInt nodes,PetscInt start,PetscInt blocksize,PetscReal ymin,PetscReal ymax,PetscBool hold) 13227f51fceSHong Zhang { 13327f51fceSHong Zhang PetscErrorCode ierr; 13427f51fceSHong Zhang PetscDrawLG drawlg; 13527f51fceSHong Zhang PetscDrawAxis axis; 13627f51fceSHong Zhang PetscMPIInt rank, size; 13727f51fceSHong Zhang DMNetworkMonitorList node; 13827f51fceSHong Zhang char titleBuffer[64]; 13927f51fceSHong Zhang PetscInt vStart,vEnd,eStart,eEnd; 14027f51fceSHong Zhang 14127f51fceSHong Zhang PetscFunctionBegin; 14227f51fceSHong Zhang ierr = MPI_Comm_rank(monitor->comm, &rank);CHKERRQ(ierr); 14327f51fceSHong Zhang ierr = MPI_Comm_size(monitor->comm, &size);CHKERRQ(ierr); 14427f51fceSHong Zhang 14527f51fceSHong Zhang ierr = DMNetworkGetVertexRange(monitor->network, &vStart, &vEnd); 14627f51fceSHong Zhang ierr = DMNetworkGetEdgeRange(monitor->network, &eStart, &eEnd); 14727f51fceSHong Zhang 14827f51fceSHong Zhang /* Make window title */ 14927f51fceSHong Zhang if (vStart <= element && element < vEnd) { 15027f51fceSHong Zhang ierr = PetscSNPrintf(titleBuffer, 64, "%s @ vertex %d [%d / %d]", name, element - vStart, rank, size-1);CHKERRQ(ierr); 15127f51fceSHong Zhang } else if (eStart <= element && element < eEnd) { 15227f51fceSHong Zhang ierr = PetscSNPrintf(titleBuffer, 64, "%s @ edge %d [%d / %d]", name, element - eStart, rank, size-1);CHKERRQ(ierr); 15327f51fceSHong Zhang } else { 15427f51fceSHong Zhang /* vertex / edge is not on local machine, so skip! */ 15527f51fceSHong Zhang PetscFunctionReturn(0); 15627f51fceSHong Zhang } 15727f51fceSHong Zhang 15827f51fceSHong Zhang ierr = PetscMalloc1(1, &node);CHKERRQ(ierr); 15927f51fceSHong Zhang 16027f51fceSHong Zhang /* Setup viewer. */ 16127f51fceSHong Zhang ierr = PetscViewerDrawOpen(monitor->comm, PETSC_NULL, titleBuffer, PETSC_DECIDE, PETSC_DECIDE, PETSC_DRAW_QUARTER_SIZE, PETSC_DRAW_QUARTER_SIZE, &(node->viewer));CHKERRQ(ierr); 16227f51fceSHong Zhang ierr = PetscViewerPushFormat(node->viewer, PETSC_VIEWER_DRAW_LG);CHKERRQ(ierr); 16327f51fceSHong Zhang ierr = PetscViewerDrawGetDrawLG(node->viewer, 0, &drawlg);CHKERRQ(ierr); 16427f51fceSHong Zhang ierr = PetscDrawLGGetAxis(drawlg, &axis);CHKERRQ(ierr); 16527f51fceSHong Zhang ierr = PetscDrawAxisSetLimits(axis, 0, nodes-1, ymin, ymax);CHKERRQ(ierr); 16627f51fceSHong Zhang ierr = PetscDrawAxisSetHoldLimits(axis, hold);CHKERRQ(ierr); 16727f51fceSHong Zhang 16827f51fceSHong Zhang /* Setup vector storage for drawing. */ 16927f51fceSHong Zhang ierr = VecCreateSeq(PETSC_COMM_SELF, nodes, &(node->v));CHKERRQ(ierr); 17027f51fceSHong Zhang 17127f51fceSHong Zhang node->element = element; 17227f51fceSHong Zhang node->nodes = nodes; 17327f51fceSHong Zhang node->start = start; 17427f51fceSHong Zhang node->blocksize = blocksize; 17527f51fceSHong Zhang 17627f51fceSHong Zhang node->next = monitor->firstnode; 17727f51fceSHong Zhang monitor->firstnode = node; 17827f51fceSHong Zhang PetscFunctionReturn(0); 17927f51fceSHong Zhang } 18027f51fceSHong Zhang 18127f51fceSHong Zhang #undef __FUNCT__ 18227f51fceSHong Zhang #define __FUNCT__ "DMNetworkMonitorView" 18327f51fceSHong Zhang /*@ 18427f51fceSHong Zhang DMNetworkMonitorView - Monitor function for TSMonitorSet. 18527f51fceSHong Zhang 186*96a0c994SBarry Smith Collectiveon DMNetworkMonitor 187*96a0c994SBarry Smith 18827f51fceSHong Zhang Input Parameters: 18927f51fceSHong Zhang + monitor - DMNetworkMonitor object 19027f51fceSHong Zhang - x - TS solution vector 19127f51fceSHong Zhang 192*96a0c994SBarry Smith Level: intermediate 193*96a0c994SBarry Smith 194*96a0c994SBarry Smith .seealso: DMNetworkMonitorCreate(), DMNetworkMonitorDestroy(), DMNetworkMonitorAdd() 19527f51fceSHong Zhang @*/ 19627f51fceSHong Zhang PetscErrorCode DMNetworkMonitorView(DMNetworkMonitor monitor,Vec x) 19727f51fceSHong Zhang { 19827f51fceSHong Zhang PetscErrorCode ierr; 19927f51fceSHong Zhang PetscInt varoffset,i,start; 20027f51fceSHong Zhang const PetscScalar *xx; 20127f51fceSHong Zhang PetscScalar *vv; 20227f51fceSHong Zhang DMNetworkMonitorList node; 20327f51fceSHong Zhang 20427f51fceSHong Zhang PetscFunctionBegin; 20527f51fceSHong Zhang ierr = VecGetArrayRead(x, &xx);CHKERRQ(ierr); 20627f51fceSHong Zhang for (node = monitor->firstnode; node; node = node->next) { 20727f51fceSHong Zhang ierr = DMNetworkGetVariableGlobalOffset(monitor->network, node->element, &varoffset);CHKERRQ(ierr); 20827f51fceSHong Zhang ierr = VecGetArray(node->v, &vv);CHKERRQ(ierr); 20927f51fceSHong Zhang start = varoffset + node->start; 21027f51fceSHong Zhang for (i = 0; i < node->nodes; i++) { 21127f51fceSHong Zhang vv[i] = xx[start+i*node->blocksize]; 21227f51fceSHong Zhang } 21327f51fceSHong Zhang ierr = VecRestoreArray(node->v, &vv);CHKERRQ(ierr); 21427f51fceSHong Zhang ierr = VecView(node->v, node->viewer);CHKERRQ(ierr); 21527f51fceSHong Zhang } 21627f51fceSHong Zhang ierr = VecRestoreArrayRead(x, &xx);CHKERRQ(ierr); 21727f51fceSHong Zhang PetscFunctionReturn(0); 21827f51fceSHong Zhang } 219