127f51fceSHong Zhang #include <petscdmnetwork.h> /*I "petscdmnetwork.h" I*/ 227f51fceSHong Zhang #include <petscdraw.h> 327f51fceSHong Zhang 427f51fceSHong Zhang /*@ 527f51fceSHong Zhang DMNetworkMonitorCreate - Creates a network monitor context 627f51fceSHong Zhang 727f51fceSHong Zhang Collective on MPI_Comm 827f51fceSHong Zhang 927f51fceSHong Zhang Input Parameters: 1096a0c994SBarry Smith . network - network to monitor 1127f51fceSHong Zhang 1227f51fceSHong Zhang Output Parameters: 1396a0c994SBarry Smith . Monitorptr - Location to put network monitor context 1427f51fceSHong Zhang 1596a0c994SBarry Smith Level: intermediate 1696a0c994SBarry Smith 1796a0c994SBarry Smith .seealso: DMNetworkMonitorDestroy(), DMNetworkMonitorAdd() 1827f51fceSHong Zhang @*/ 1927f51fceSHong Zhang PetscErrorCode DMNetworkMonitorCreate(DM network,DMNetworkMonitor *monitorptr) 2027f51fceSHong Zhang { 2127f51fceSHong Zhang PetscErrorCode ierr; 2227f51fceSHong Zhang DMNetworkMonitor monitor; 232d2f4133SHong Zhang MPI_Comm comm; 2427f51fceSHong Zhang PetscMPIInt size; 2527f51fceSHong Zhang 2627f51fceSHong Zhang PetscFunctionBegin; 272d2f4133SHong Zhang ierr = PetscObjectGetComm((PetscObject)network,&comm);CHKERRQ(ierr); 282d2f4133SHong 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"); 302d2f4133SHong Zhang 3127f51fceSHong Zhang ierr = PetscMalloc1(1,&monitor);CHKERRQ(ierr); 322d2f4133SHong Zhang monitor->comm = comm; 3327f51fceSHong Zhang monitor->network = network; 34390e1bf2SBarry Smith monitor->firstnode = NULL; 3527f51fceSHong Zhang 3627f51fceSHong Zhang *monitorptr = monitor; 3727f51fceSHong Zhang PetscFunctionReturn(0); 3827f51fceSHong Zhang } 3927f51fceSHong Zhang 4027f51fceSHong Zhang /*@ 4127f51fceSHong Zhang DMNetworkMonitorDestroy - Destroys a network monitor and all associated viewers 4227f51fceSHong Zhang 4327f51fceSHong Zhang Collective on DMNetworkMonitor 4427f51fceSHong Zhang 4527f51fceSHong Zhang Input Parameters: 4696a0c994SBarry Smith . monitor - monitor to destroy 4796a0c994SBarry Smith 4896a0c994SBarry Smith Level: intermediate 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 /*@ 6627f51fceSHong Zhang DMNetworkMonitorPop - Removes the most recently added viewer 6727f51fceSHong Zhang 6896a0c994SBarry Smith Collective on DMNetworkMonitor 6927f51fceSHong Zhang 7096a0c994SBarry Smith Input Parameters: 7196a0c994SBarry Smith . monitor - the monitor 7296a0c994SBarry Smith 7396a0c994SBarry Smith Level: intermediate 7496a0c994SBarry Smith 7596a0c994SBarry Smith .seealso: DMNetworkMonitorCreate(), DMNetworkMonitorDestroy() 7627f51fceSHong Zhang @*/ 7727f51fceSHong Zhang PetscErrorCode DMNetworkMonitorPop(DMNetworkMonitor monitor) 7827f51fceSHong Zhang { 7927f51fceSHong Zhang PetscErrorCode ierr; 8027f51fceSHong Zhang DMNetworkMonitorList node; 8127f51fceSHong Zhang 8227f51fceSHong Zhang PetscFunctionBegin; 8327f51fceSHong Zhang if (monitor->firstnode) { 8427f51fceSHong Zhang /* Update links */ 8527f51fceSHong Zhang node = monitor->firstnode; 8627f51fceSHong Zhang monitor->firstnode = node->next; 8727f51fceSHong Zhang 8827f51fceSHong Zhang /* Free list node */ 8927f51fceSHong Zhang ierr = PetscViewerDestroy(&(node->viewer));CHKERRQ(ierr); 9027f51fceSHong Zhang ierr = VecDestroy(&(node->v));CHKERRQ(ierr); 9127f51fceSHong Zhang ierr = PetscFree(node);CHKERRQ(ierr); 9227f51fceSHong Zhang } 9327f51fceSHong Zhang PetscFunctionReturn(0); 9427f51fceSHong Zhang } 9527f51fceSHong Zhang 96*94ef8ddeSSatish Balay /*@C 9727f51fceSHong Zhang DMNetworkMonitorAdd - Adds a new viewer to monitor 9827f51fceSHong Zhang 9996a0c994SBarry Smith Collective on DMNetworkMonitor 10096a0c994SBarry Smith 10127f51fceSHong Zhang Input Parameters: 10227f51fceSHong Zhang + monitor - the monitor 10327f51fceSHong Zhang . name - name of viewer 10427f51fceSHong Zhang . element - vertex / edge number 10527f51fceSHong Zhang . nodes - number of nodes 10627f51fceSHong Zhang . start - variable starting offset 10727f51fceSHong Zhang . blocksize - variable blocksize 10827f51fceSHong Zhang . ymin - ymin for viewer 10927f51fceSHong Zhang . ymax - ymax for viewer 11027f51fceSHong Zhang - hold - determines if plot limits should be held 11127f51fceSHong Zhang 11296a0c994SBarry Smith Level: intermediate 11396a0c994SBarry Smith 11427f51fceSHong Zhang Notes: 11527f51fceSHong Zhang This is written to be independent of the semantics associated to the variables 11627f51fceSHong Zhang at a given network vertex / edge. 11727f51fceSHong Zhang 11827f51fceSHong Zhang Precisely, the parameters nodes, start and blocksize allow you to select a general 11927f51fceSHong Zhang strided subarray of the variables to monitor. 12027f51fceSHong Zhang 12196a0c994SBarry Smith .seealso: DMNetworkMonitorCreate(), DMNetworkMonitorDestroy() 12227f51fceSHong Zhang @*/ 123232215b8SHong Zhang PetscErrorCode DMNetworkMonitorAdd(DMNetworkMonitor monitor,const char *name,PetscInt element,PetscInt nodes,PetscInt start,PetscInt blocksize,PetscReal ymin,PetscReal ymax,PetscBool hold) 12427f51fceSHong Zhang { 12527f51fceSHong Zhang PetscErrorCode ierr; 12627f51fceSHong Zhang PetscDrawLG drawlg; 12727f51fceSHong Zhang PetscDrawAxis axis; 12827f51fceSHong Zhang PetscMPIInt rank, size; 12927f51fceSHong Zhang DMNetworkMonitorList node; 13027f51fceSHong Zhang char titleBuffer[64]; 13127f51fceSHong Zhang PetscInt vStart,vEnd,eStart,eEnd; 13227f51fceSHong Zhang 13327f51fceSHong Zhang PetscFunctionBegin; 13427f51fceSHong Zhang ierr = MPI_Comm_rank(monitor->comm, &rank);CHKERRQ(ierr); 13527f51fceSHong Zhang ierr = MPI_Comm_size(monitor->comm, &size);CHKERRQ(ierr); 13627f51fceSHong Zhang 137947b95d8SBarry Smith ierr = DMNetworkGetVertexRange(monitor->network, &vStart, &vEnd);CHKERRQ(ierr); 138947b95d8SBarry Smith ierr = DMNetworkGetEdgeRange(monitor->network, &eStart, &eEnd);CHKERRQ(ierr); 13927f51fceSHong Zhang 14027f51fceSHong Zhang /* Make window title */ 14127f51fceSHong Zhang if (vStart <= element && element < vEnd) { 14227f51fceSHong Zhang ierr = PetscSNPrintf(titleBuffer, 64, "%s @ vertex %d [%d / %d]", name, element - vStart, rank, size-1);CHKERRQ(ierr); 14327f51fceSHong Zhang } else if (eStart <= element && element < eEnd) { 14427f51fceSHong Zhang ierr = PetscSNPrintf(titleBuffer, 64, "%s @ edge %d [%d / %d]", name, element - eStart, rank, size-1);CHKERRQ(ierr); 14527f51fceSHong Zhang } else { 14627f51fceSHong Zhang /* vertex / edge is not on local machine, so skip! */ 14727f51fceSHong Zhang PetscFunctionReturn(0); 14827f51fceSHong Zhang } 14927f51fceSHong Zhang 15027f51fceSHong Zhang ierr = PetscMalloc1(1, &node);CHKERRQ(ierr); 15127f51fceSHong Zhang 15227f51fceSHong Zhang /* Setup viewer. */ 153390e1bf2SBarry Smith ierr = PetscViewerDrawOpen(monitor->comm, NULL, titleBuffer, PETSC_DECIDE, PETSC_DECIDE, PETSC_DRAW_QUARTER_SIZE, PETSC_DRAW_QUARTER_SIZE, &(node->viewer));CHKERRQ(ierr); 15427f51fceSHong Zhang ierr = PetscViewerPushFormat(node->viewer, PETSC_VIEWER_DRAW_LG);CHKERRQ(ierr); 15527f51fceSHong Zhang ierr = PetscViewerDrawGetDrawLG(node->viewer, 0, &drawlg);CHKERRQ(ierr); 15627f51fceSHong Zhang ierr = PetscDrawLGGetAxis(drawlg, &axis);CHKERRQ(ierr); 15727f51fceSHong Zhang ierr = PetscDrawAxisSetLimits(axis, 0, nodes-1, ymin, ymax);CHKERRQ(ierr); 15827f51fceSHong Zhang ierr = PetscDrawAxisSetHoldLimits(axis, hold);CHKERRQ(ierr); 15927f51fceSHong Zhang 16027f51fceSHong Zhang /* Setup vector storage for drawing. */ 16127f51fceSHong Zhang ierr = VecCreateSeq(PETSC_COMM_SELF, nodes, &(node->v));CHKERRQ(ierr); 16227f51fceSHong Zhang 16327f51fceSHong Zhang node->element = element; 16427f51fceSHong Zhang node->nodes = nodes; 16527f51fceSHong Zhang node->start = start; 16627f51fceSHong Zhang node->blocksize = blocksize; 16727f51fceSHong Zhang 16827f51fceSHong Zhang node->next = monitor->firstnode; 16927f51fceSHong Zhang monitor->firstnode = node; 17027f51fceSHong Zhang PetscFunctionReturn(0); 17127f51fceSHong Zhang } 17227f51fceSHong Zhang 17327f51fceSHong Zhang /*@ 17427f51fceSHong Zhang DMNetworkMonitorView - Monitor function for TSMonitorSet. 17527f51fceSHong Zhang 17696a0c994SBarry Smith Collectiveon DMNetworkMonitor 17796a0c994SBarry Smith 17827f51fceSHong Zhang Input Parameters: 17927f51fceSHong Zhang + monitor - DMNetworkMonitor object 18027f51fceSHong Zhang - x - TS solution vector 18127f51fceSHong Zhang 18296a0c994SBarry Smith Level: intermediate 18396a0c994SBarry Smith 18496a0c994SBarry Smith .seealso: DMNetworkMonitorCreate(), DMNetworkMonitorDestroy(), DMNetworkMonitorAdd() 18527f51fceSHong Zhang @*/ 18627f51fceSHong Zhang PetscErrorCode DMNetworkMonitorView(DMNetworkMonitor monitor,Vec x) 18727f51fceSHong Zhang { 18827f51fceSHong Zhang PetscErrorCode ierr; 18927f51fceSHong Zhang PetscInt varoffset,i,start; 19027f51fceSHong Zhang const PetscScalar *xx; 19127f51fceSHong Zhang PetscScalar *vv; 19227f51fceSHong Zhang DMNetworkMonitorList node; 19327f51fceSHong Zhang 19427f51fceSHong Zhang PetscFunctionBegin; 19527f51fceSHong Zhang ierr = VecGetArrayRead(x, &xx);CHKERRQ(ierr); 19627f51fceSHong Zhang for (node = monitor->firstnode; node; node = node->next) { 19727f51fceSHong Zhang ierr = DMNetworkGetVariableGlobalOffset(monitor->network, node->element, &varoffset);CHKERRQ(ierr); 19827f51fceSHong Zhang ierr = VecGetArray(node->v, &vv);CHKERRQ(ierr); 19927f51fceSHong Zhang start = varoffset + node->start; 20027f51fceSHong Zhang for (i = 0; i < node->nodes; i++) { 20127f51fceSHong Zhang vv[i] = xx[start+i*node->blocksize]; 20227f51fceSHong Zhang } 20327f51fceSHong Zhang ierr = VecRestoreArray(node->v, &vv);CHKERRQ(ierr); 20427f51fceSHong Zhang ierr = VecView(node->v, node->viewer);CHKERRQ(ierr); 20527f51fceSHong Zhang } 20627f51fceSHong Zhang ierr = VecRestoreArrayRead(x, &xx);CHKERRQ(ierr); 20727f51fceSHong Zhang PetscFunctionReturn(0); 20827f51fceSHong Zhang } 209