/*@C DMNetworkMonitorAdd - Adds a new viewer to monitor Collective on DMNetworkMonitor Input Parameters: + monitor - the monitor . name - name of viewer . element - vertex / edge number . nodes - number of nodes . start - variable starting offset . blocksize - variable blocksize . xmin - xmin (or PETSC_DECIDE) for viewer . xmax - xmax (or PETSC_DECIDE) for viewer . ymin - ymin for viewer . ymax - ymax for viewer - hold - determines if plot limits should be held Level: intermediate Notes: This is written to be independent of the semantics associated to the variables at a given network vertex / edge. Precisely, the parameters nodes, start and blocksize allow you to select a general strided subarray of the variables to monitor. .seealso: DMNetworkMonitorCreate(), DMNetworkMonitorDestroy() @*/ PetscErrorCode DMNetworkMonitorAdd(DMNetworkMonitor monitor,const char *name,PetscInt element,PetscInt nodes,PetscInt start,PetscInt blocksize,PetscReal xmin,PetscReal xmax,PetscReal ymin,PetscReal ymax,PetscBool hold) { PetscErrorCode ierr; PetscDrawLG drawlg; PetscDrawAxis axis; PetscMPIInt rank, size; DMNetworkMonitorList node; char titleBuffer[64]; PetscInt vStart,vEnd,eStart,eEnd; PetscFunctionBegin; ierr = MPI_Comm_rank(monitor->comm, &rank);CHKERRQ(ierr); ierr = MPI_Comm_size(monitor->comm, &size);CHKERRQ(ierr); ierr = DMNetworkGetVertexRange(monitor->network, &vStart, &vEnd);CHKERRQ(ierr); ierr = DMNetworkGetEdgeRange(monitor->network, &eStart, &eEnd);CHKERRQ(ierr); /* Make window title */ if (vStart <= element && element < vEnd) { ierr = PetscSNPrintf(titleBuffer, 64, "%s @ vertex %d [%d / %d]", name, element - vStart, rank, size-1);CHKERRQ(ierr); } else if (eStart <= element && element < eEnd) { ierr = PetscSNPrintf(titleBuffer, 64, "%s @ edge %d [%d / %d]", name, element - eStart, rank, size-1);CHKERRQ(ierr); } else { /* vertex / edge is not on local machine, so skip! */ PetscFunctionReturn(0); } ierr = PetscMalloc1(1, &node);CHKERRQ(ierr); /* Setup viewer. */ ierr = PetscViewerDrawOpen(monitor->comm, NULL, titleBuffer, PETSC_DECIDE, PETSC_DECIDE, PETSC_DRAW_QUARTER_SIZE, PETSC_DRAW_QUARTER_SIZE, &(node->viewer));CHKERRQ(ierr); ierr = PetscViewerPushFormat(node->viewer, PETSC_VIEWER_DRAW_LG_XRANGE);CHKERRQ(ierr); ierr = PetscViewerDrawGetDrawLG(node->viewer, 0, &drawlg);CHKERRQ(ierr); ierr = PetscDrawLGGetAxis(drawlg, &axis);CHKERRQ(ierr); if (xmin != PETSC_DECIDE && xmax != PETSC_DECIDE) { ierr = PetscDrawAxisSetLimits(axis, xmin, xmax, ymin, ymax);CHKERRQ(ierr); } else { ierr = PetscDrawAxisSetLimits(axis, 0, nodes-1, ymin, ymax);CHKERRQ(ierr); } ierr = PetscDrawAxisSetHoldLimits(axis, hold);CHKERRQ(ierr); /* Setup vector storage for drawing. */ ierr = VecCreateSeq(PETSC_COMM_SELF, nodes, &(node->v));CHKERRQ(ierr); node->element = element; node->nodes = nodes; node->start = start; node->blocksize = blocksize; node->next = monitor->firstnode; monitor->firstnode = node; PetscFunctionReturn(0); }
void PETSC_STDCALL petscdrawaxissetholdlimits_(PetscDrawAxis axis,PetscTruth *hold, int *__ierr ){ *__ierr = PetscDrawAxisSetHoldLimits( (PetscDrawAxis)PetscToPointer((axis) ),*hold); }