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 7d083f849SBarry Smith Collective 827f51fceSHong Zhang 927f51fceSHong Zhang Input Parameters: 1096a0c994SBarry Smith . network - network to monitor 1127f51fceSHong Zhang 1227f51fceSHong Zhang Output Parameters: 132bf73ac6SHong Zhang . 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 DMNetworkMonitor monitor; 222d2f4133SHong Zhang MPI_Comm comm; 2327f51fceSHong Zhang PetscMPIInt size; 2427f51fceSHong Zhang 2527f51fceSHong Zhang PetscFunctionBegin; 269566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)network,&comm)); 279566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 285c6496baSHong Zhang PetscCheck(size == 1,PETSC_COMM_SELF,PETSC_ERR_SUP,"Parallel DMNetworkMonitor is not supported yet"); 292d2f4133SHong Zhang 309566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(1,&monitor)); 312d2f4133SHong Zhang monitor->comm = comm; 3227f51fceSHong Zhang monitor->network = network; 33390e1bf2SBarry Smith monitor->firstnode = NULL; 3427f51fceSHong Zhang 3527f51fceSHong Zhang *monitorptr = monitor; 3627f51fceSHong Zhang PetscFunctionReturn(0); 3727f51fceSHong Zhang } 3827f51fceSHong Zhang 3927f51fceSHong Zhang /*@ 4027f51fceSHong Zhang DMNetworkMonitorDestroy - Destroys a network monitor and all associated viewers 4127f51fceSHong Zhang 42d083f849SBarry Smith Collective on monitor 4327f51fceSHong Zhang 4427f51fceSHong Zhang Input Parameters: 4596a0c994SBarry Smith . monitor - monitor to destroy 4696a0c994SBarry Smith 4796a0c994SBarry Smith Level: intermediate 4827f51fceSHong Zhang 4927f51fceSHong Zhang .seealso: DMNetworkMonitorCreate, DMNetworkMonitorAdd 5027f51fceSHong Zhang @*/ 5127f51fceSHong Zhang PetscErrorCode DMNetworkMonitorDestroy(DMNetworkMonitor *monitor) 5227f51fceSHong Zhang { 5327f51fceSHong Zhang PetscFunctionBegin; 5427f51fceSHong Zhang while ((*monitor)->firstnode) { 559566063dSJacob Faibussowitsch PetscCall(DMNetworkMonitorPop(*monitor)); 5627f51fceSHong Zhang } 5727f51fceSHong Zhang 589566063dSJacob Faibussowitsch PetscCall(PetscFree(*monitor)); 5927f51fceSHong Zhang PetscFunctionReturn(0); 6027f51fceSHong Zhang } 6127f51fceSHong Zhang 6227f51fceSHong Zhang /*@ 6327f51fceSHong Zhang DMNetworkMonitorPop - Removes the most recently added viewer 6427f51fceSHong Zhang 65d083f849SBarry Smith Collective on monitor 6627f51fceSHong Zhang 6796a0c994SBarry Smith Input Parameters: 6896a0c994SBarry Smith . monitor - the monitor 6996a0c994SBarry Smith 7096a0c994SBarry Smith Level: intermediate 7196a0c994SBarry Smith 7296a0c994SBarry Smith .seealso: DMNetworkMonitorCreate(), DMNetworkMonitorDestroy() 7327f51fceSHong Zhang @*/ 7427f51fceSHong Zhang PetscErrorCode DMNetworkMonitorPop(DMNetworkMonitor monitor) 7527f51fceSHong Zhang { 7627f51fceSHong Zhang DMNetworkMonitorList node; 7727f51fceSHong Zhang 7827f51fceSHong Zhang PetscFunctionBegin; 7927f51fceSHong Zhang if (monitor->firstnode) { 8027f51fceSHong Zhang /* Update links */ 8127f51fceSHong Zhang node = monitor->firstnode; 8227f51fceSHong Zhang monitor->firstnode = node->next; 8327f51fceSHong Zhang 8427f51fceSHong Zhang /* Free list node */ 859566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&(node->viewer))); 869566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(node->v))); 879566063dSJacob Faibussowitsch PetscCall(PetscFree(node)); 8827f51fceSHong Zhang } 8927f51fceSHong Zhang PetscFunctionReturn(0); 9027f51fceSHong Zhang } 9127f51fceSHong Zhang 9294ef8ddeSSatish Balay /*@C 9327f51fceSHong Zhang DMNetworkMonitorAdd - Adds a new viewer to monitor 9427f51fceSHong Zhang 95d083f849SBarry Smith Collective on monitor 9696a0c994SBarry Smith 9727f51fceSHong Zhang Input Parameters: 9827f51fceSHong Zhang + monitor - the monitor 9927f51fceSHong Zhang . name - name of viewer 10027f51fceSHong Zhang . element - vertex / edge number 10127f51fceSHong Zhang . nodes - number of nodes 10227f51fceSHong Zhang . start - variable starting offset 10327f51fceSHong Zhang . blocksize - variable blocksize 104bb046f40SHong Zhang . xmin - xmin (or PETSC_DECIDE) for viewer 105bb046f40SHong Zhang . xmax - xmax (or PETSC_DECIDE) for viewer 10627f51fceSHong Zhang . ymin - ymin for viewer 10727f51fceSHong Zhang . ymax - ymax for viewer 10827f51fceSHong Zhang - hold - determines if plot limits should be held 10927f51fceSHong Zhang 11096a0c994SBarry Smith Level: intermediate 11196a0c994SBarry Smith 11227f51fceSHong Zhang Notes: 11327f51fceSHong Zhang This is written to be independent of the semantics associated to the variables 11427f51fceSHong Zhang at a given network vertex / edge. 11527f51fceSHong Zhang 11627f51fceSHong Zhang Precisely, the parameters nodes, start and blocksize allow you to select a general 11727f51fceSHong Zhang strided subarray of the variables to monitor. 11827f51fceSHong Zhang 11996a0c994SBarry Smith .seealso: DMNetworkMonitorCreate(), DMNetworkMonitorDestroy() 12027f51fceSHong Zhang @*/ 121bb046f40SHong Zhang 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) 12227f51fceSHong Zhang { 12327f51fceSHong Zhang PetscDrawLG drawlg; 12427f51fceSHong Zhang PetscDrawAxis axis; 12527f51fceSHong Zhang PetscMPIInt rank, size; 12627f51fceSHong Zhang DMNetworkMonitorList node; 12727f51fceSHong Zhang char titleBuffer[64]; 12827f51fceSHong Zhang PetscInt vStart,vEnd,eStart,eEnd; 12927f51fceSHong Zhang 13027f51fceSHong Zhang PetscFunctionBegin; 1319566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(monitor->comm, &rank)); 1329566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(monitor->comm, &size)); 13327f51fceSHong Zhang 1349566063dSJacob Faibussowitsch PetscCall(DMNetworkGetVertexRange(monitor->network, &vStart, &vEnd)); 1359566063dSJacob Faibussowitsch PetscCall(DMNetworkGetEdgeRange(monitor->network, &eStart, &eEnd)); 13627f51fceSHong Zhang 13727f51fceSHong Zhang /* Make window title */ 13827f51fceSHong Zhang if (vStart <= element && element < vEnd) { 139*63a3b9bcSJacob Faibussowitsch PetscCall(PetscSNPrintf(titleBuffer, sizeof(titleBuffer), "%s @ vertex %" PetscInt_FMT " [%d / %d]", name, element - vStart, rank, size-1)); 14027f51fceSHong Zhang } else if (eStart <= element && element < eEnd) { 141*63a3b9bcSJacob Faibussowitsch PetscCall(PetscSNPrintf(titleBuffer, sizeof(titleBuffer), "%s @ edge %" PetscInt_FMT " [%d / %d]", name, element - eStart, rank, size-1)); 14227f51fceSHong Zhang } else { 14327f51fceSHong Zhang /* vertex / edge is not on local machine, so skip! */ 14427f51fceSHong Zhang PetscFunctionReturn(0); 14527f51fceSHong Zhang } 14627f51fceSHong Zhang 1479566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(1, &node)); 14827f51fceSHong Zhang 14927f51fceSHong Zhang /* Setup viewer. */ 1509566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawOpen(monitor->comm, NULL, titleBuffer, PETSC_DECIDE, PETSC_DECIDE, PETSC_DRAW_QUARTER_SIZE, PETSC_DRAW_QUARTER_SIZE, &(node->viewer))); 1519566063dSJacob Faibussowitsch PetscCall(PetscViewerPushFormat(node->viewer, PETSC_VIEWER_DRAW_LG_XRANGE)); 1529566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDrawLG(node->viewer, 0, &drawlg)); 1539566063dSJacob Faibussowitsch PetscCall(PetscDrawLGGetAxis(drawlg, &axis)); 154bb046f40SHong Zhang if (xmin != PETSC_DECIDE && xmax != PETSC_DECIDE) { 1559566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisSetLimits(axis, xmin, xmax, ymin, ymax)); 156bb046f40SHong Zhang } else { 1579566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisSetLimits(axis, 0, nodes-1, ymin, ymax)); 158bb046f40SHong Zhang } 1599566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisSetHoldLimits(axis, hold)); 16027f51fceSHong Zhang 16127f51fceSHong Zhang /* Setup vector storage for drawing. */ 1629566063dSJacob Faibussowitsch PetscCall(VecCreateSeq(PETSC_COMM_SELF, nodes, &(node->v))); 16327f51fceSHong Zhang 16427f51fceSHong Zhang node->element = element; 16527f51fceSHong Zhang node->nodes = nodes; 16627f51fceSHong Zhang node->start = start; 16727f51fceSHong Zhang node->blocksize = blocksize; 16827f51fceSHong Zhang 16927f51fceSHong Zhang node->next = monitor->firstnode; 17027f51fceSHong Zhang monitor->firstnode = node; 17127f51fceSHong Zhang PetscFunctionReturn(0); 17227f51fceSHong Zhang } 17327f51fceSHong Zhang 17427f51fceSHong Zhang /*@ 17527f51fceSHong Zhang DMNetworkMonitorView - Monitor function for TSMonitorSet. 17627f51fceSHong Zhang 17796a0c994SBarry Smith Collectiveon DMNetworkMonitor 17896a0c994SBarry Smith 17927f51fceSHong Zhang Input Parameters: 18027f51fceSHong Zhang + monitor - DMNetworkMonitor object 18127f51fceSHong Zhang - x - TS solution vector 18227f51fceSHong Zhang 18396a0c994SBarry Smith Level: intermediate 18496a0c994SBarry Smith 18596a0c994SBarry Smith .seealso: DMNetworkMonitorCreate(), DMNetworkMonitorDestroy(), DMNetworkMonitorAdd() 18627f51fceSHong Zhang @*/ 187bb046f40SHong Zhang 18827f51fceSHong Zhang PetscErrorCode DMNetworkMonitorView(DMNetworkMonitor monitor,Vec x) 18927f51fceSHong Zhang { 19027f51fceSHong Zhang PetscInt varoffset,i,start; 19127f51fceSHong Zhang const PetscScalar *xx; 19227f51fceSHong Zhang PetscScalar *vv; 19327f51fceSHong Zhang DMNetworkMonitorList node; 19427f51fceSHong Zhang 19527f51fceSHong Zhang PetscFunctionBegin; 1969566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(x, &xx)); 19727f51fceSHong Zhang for (node = monitor->firstnode; node; node = node->next) { 1989566063dSJacob Faibussowitsch PetscCall(DMNetworkGetGlobalVecOffset(monitor->network, node->element, ALL_COMPONENTS, &varoffset)); 1999566063dSJacob Faibussowitsch PetscCall(VecGetArray(node->v, &vv)); 20027f51fceSHong Zhang start = varoffset + node->start; 20127f51fceSHong Zhang for (i = 0; i < node->nodes; i++) { 20227f51fceSHong Zhang vv[i] = xx[start+i*node->blocksize]; 20327f51fceSHong Zhang } 2049566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(node->v, &vv)); 2059566063dSJacob Faibussowitsch PetscCall(VecView(node->v, node->viewer)); 20627f51fceSHong Zhang } 2079566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(x, &xx)); 20827f51fceSHong Zhang PetscFunctionReturn(0); 20927f51fceSHong Zhang } 210