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 92fe279fdSBarry Smith Input Parameter: 1096a0c994SBarry Smith . network - network to monitor 1127f51fceSHong Zhang 122fe279fdSBarry Smith Output Parameter: 1320f4b53cSBarry Smith . monitorptr - the `DMNetworkMonitor` object 1427f51fceSHong Zhang 1596a0c994SBarry Smith Level: intermediate 1696a0c994SBarry Smith 1720f4b53cSBarry Smith .seealso: `DM`, `DMNETWORK`, `DMNetworkMonitor`, `DMNetworkMonitorDestroy()`, `DMNetworkMonitorAdd()` 1827f51fceSHong Zhang @*/ 19d71ae5a4SJacob Faibussowitsch PetscErrorCode DMNetworkMonitorCreate(DM network, DMNetworkMonitor *monitorptr) 20d71ae5a4SJacob Faibussowitsch { 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; 363ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3727f51fceSHong Zhang } 3827f51fceSHong Zhang 3927f51fceSHong Zhang /*@ 4027f51fceSHong Zhang DMNetworkMonitorDestroy - Destroys a network monitor and all associated viewers 4127f51fceSHong Zhang 4220f4b53cSBarry Smith Collective 4327f51fceSHong Zhang 442fe279fdSBarry Smith Input Parameter: 4596a0c994SBarry Smith . monitor - monitor to destroy 4696a0c994SBarry Smith 4796a0c994SBarry Smith Level: intermediate 4827f51fceSHong Zhang 495f25b224SDuncan Campbell .seealso: `DM`, `DMNETWORK`, `DMNetworkMonitor`, `DMNetworkMonitorCreate()`, `DMNetworkMonitorAdd()` 5027f51fceSHong Zhang @*/ 51d71ae5a4SJacob Faibussowitsch PetscErrorCode DMNetworkMonitorDestroy(DMNetworkMonitor *monitor) 52d71ae5a4SJacob Faibussowitsch { 5327f51fceSHong Zhang PetscFunctionBegin; 5448a46eb9SPierre Jolivet while ((*monitor)->firstnode) PetscCall(DMNetworkMonitorPop(*monitor)); 5527f51fceSHong Zhang 569566063dSJacob Faibussowitsch PetscCall(PetscFree(*monitor)); 573ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5827f51fceSHong Zhang } 5927f51fceSHong Zhang 6027f51fceSHong Zhang /*@ 6120f4b53cSBarry Smith DMNetworkMonitorPop - Removes the most recently added viewer to a `DMNetworkMonitor` 6227f51fceSHong Zhang 6320f4b53cSBarry Smith Collective 6427f51fceSHong Zhang 652fe279fdSBarry Smith Input Parameter: 6696a0c994SBarry Smith . monitor - the monitor 6796a0c994SBarry Smith 6896a0c994SBarry Smith Level: intermediate 6996a0c994SBarry Smith 7020f4b53cSBarry Smith .seealso: `DM`, `DMNETWORK`, `DMNetworkMonitor`, `DMNetworkMonitorCreate()`, `DMNetworkMonitorDestroy()` 7127f51fceSHong Zhang @*/ 72d71ae5a4SJacob Faibussowitsch PetscErrorCode DMNetworkMonitorPop(DMNetworkMonitor monitor) 73d71ae5a4SJacob Faibussowitsch { 7427f51fceSHong Zhang DMNetworkMonitorList node; 7527f51fceSHong Zhang 7627f51fceSHong Zhang PetscFunctionBegin; 7727f51fceSHong Zhang if (monitor->firstnode) { 7827f51fceSHong Zhang /* Update links */ 7927f51fceSHong Zhang node = monitor->firstnode; 8027f51fceSHong Zhang monitor->firstnode = node->next; 8127f51fceSHong Zhang 8227f51fceSHong Zhang /* Free list node */ 83f4f49eeaSPierre Jolivet PetscCall(PetscViewerDestroy(&node->viewer)); 84f4f49eeaSPierre Jolivet PetscCall(VecDestroy(&node->v)); 859566063dSJacob Faibussowitsch PetscCall(PetscFree(node)); 8627f51fceSHong Zhang } 873ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8827f51fceSHong Zhang } 8927f51fceSHong Zhang 9094ef8ddeSSatish Balay /*@C 9120f4b53cSBarry Smith DMNetworkMonitorAdd - Adds a new viewer to a `DMNetworkMonitor` 9227f51fceSHong Zhang 9320f4b53cSBarry Smith Collective 9496a0c994SBarry Smith 9527f51fceSHong Zhang Input Parameters: 9627f51fceSHong Zhang + monitor - the monitor 9727f51fceSHong Zhang . name - name of viewer 9827f51fceSHong Zhang . element - vertex / edge number 9927f51fceSHong Zhang . nodes - number of nodes 10027f51fceSHong Zhang . start - variable starting offset 10127f51fceSHong Zhang . blocksize - variable blocksize 10220f4b53cSBarry Smith . xmin - xmin (or `PETSC_DECIDE`) for viewer 10320f4b53cSBarry Smith . xmax - xmax (or `PETSC_DECIDE`) for viewer 10427f51fceSHong Zhang . ymin - ymin for viewer 10527f51fceSHong Zhang . ymax - ymax for viewer 10627f51fceSHong Zhang - hold - determines if plot limits should be held 10727f51fceSHong Zhang 10896a0c994SBarry Smith Level: intermediate 10996a0c994SBarry Smith 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 11720f4b53cSBarry Smith .seealso: `DM`, `DMNETWORK`, `DMNetworkMonitor`, `DMNetworkMonitorCreate()`, `DMNetworkMonitorDestroy()` 11827f51fceSHong Zhang @*/ 119d71ae5a4SJacob Faibussowitsch 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) 120d71ae5a4SJacob Faibussowitsch { 12127f51fceSHong Zhang PetscDrawLG drawlg; 12227f51fceSHong Zhang PetscDrawAxis axis; 12327f51fceSHong Zhang PetscMPIInt rank, size; 12427f51fceSHong Zhang DMNetworkMonitorList node; 12527f51fceSHong Zhang char titleBuffer[64]; 12627f51fceSHong Zhang PetscInt vStart, vEnd, eStart, eEnd; 12727f51fceSHong Zhang 12827f51fceSHong Zhang PetscFunctionBegin; 1299566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(monitor->comm, &rank)); 1309566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(monitor->comm, &size)); 13127f51fceSHong Zhang 1329566063dSJacob Faibussowitsch PetscCall(DMNetworkGetVertexRange(monitor->network, &vStart, &vEnd)); 1339566063dSJacob Faibussowitsch PetscCall(DMNetworkGetEdgeRange(monitor->network, &eStart, &eEnd)); 13427f51fceSHong Zhang 13527f51fceSHong Zhang /* Make window title */ 13627f51fceSHong Zhang if (vStart <= element && element < vEnd) { 13763a3b9bcSJacob Faibussowitsch PetscCall(PetscSNPrintf(titleBuffer, sizeof(titleBuffer), "%s @ vertex %" PetscInt_FMT " [%d / %d]", name, element - vStart, rank, size - 1)); 13827f51fceSHong Zhang } else if (eStart <= element && element < eEnd) { 13963a3b9bcSJacob Faibussowitsch PetscCall(PetscSNPrintf(titleBuffer, sizeof(titleBuffer), "%s @ edge %" PetscInt_FMT " [%d / %d]", name, element - eStart, rank, size - 1)); 14027f51fceSHong Zhang } else { 14127f51fceSHong Zhang /* vertex / edge is not on local machine, so skip! */ 1423ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 14327f51fceSHong Zhang } 14427f51fceSHong Zhang 1459566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(1, &node)); 14627f51fceSHong Zhang 14727f51fceSHong Zhang /* Setup viewer. */ 148f4f49eeaSPierre Jolivet PetscCall(PetscViewerDrawOpen(monitor->comm, NULL, titleBuffer, PETSC_DECIDE, PETSC_DECIDE, PETSC_DRAW_QUARTER_SIZE, PETSC_DRAW_QUARTER_SIZE, &node->viewer)); 1499566063dSJacob Faibussowitsch PetscCall(PetscViewerPushFormat(node->viewer, PETSC_VIEWER_DRAW_LG_XRANGE)); 1509566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDrawLG(node->viewer, 0, &drawlg)); 1519566063dSJacob Faibussowitsch PetscCall(PetscDrawLGGetAxis(drawlg, &axis)); 15213bcc0bdSJacob Faibussowitsch if (xmin != (PetscReal)PETSC_DECIDE && xmax != (PetscReal)PETSC_DECIDE) PetscCall(PetscDrawAxisSetLimits(axis, xmin, xmax, ymin, ymax)); 1531baa6e33SBarry Smith else PetscCall(PetscDrawAxisSetLimits(axis, 0, nodes - 1, ymin, ymax)); 1549566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisSetHoldLimits(axis, hold)); 15527f51fceSHong Zhang 15627f51fceSHong Zhang /* Setup vector storage for drawing. */ 157f4f49eeaSPierre Jolivet PetscCall(VecCreateSeq(PETSC_COMM_SELF, nodes, &node->v)); 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; 1663ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 16727f51fceSHong Zhang } 16827f51fceSHong Zhang 169*ffeef943SBarry Smith /*@C 170*ffeef943SBarry Smith DMNetworkMonitorView - A `DMNETWORK` specific monitor function for `TSMonitorSet()` 17127f51fceSHong Zhang 172*ffeef943SBarry Smith Collective, No Fortran support 17396a0c994SBarry Smith 17427f51fceSHong Zhang Input Parameters: 17520f4b53cSBarry Smith + monitor - `DMNetworkMonitor` object 17620f4b53cSBarry Smith - x - `TS` solution vector 17727f51fceSHong Zhang 17896a0c994SBarry Smith Level: intermediate 17996a0c994SBarry Smith 180*ffeef943SBarry Smith .seealso: `DM`, `DMNETWORK`, `DMNetworkMonitor`, `DMNetworkMonitorCreate()`, `DMNetworkMonitorDestroy()`, `DMNetworkMonitorAdd()` 18127f51fceSHong Zhang @*/ 182d71ae5a4SJacob Faibussowitsch PetscErrorCode DMNetworkMonitorView(DMNetworkMonitor monitor, Vec x) 183d71ae5a4SJacob Faibussowitsch { 18427f51fceSHong Zhang PetscInt varoffset, i, start; 18527f51fceSHong Zhang const PetscScalar *xx; 18627f51fceSHong Zhang PetscScalar *vv; 18727f51fceSHong Zhang DMNetworkMonitorList node; 18827f51fceSHong Zhang 18927f51fceSHong Zhang PetscFunctionBegin; 1909566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(x, &xx)); 19127f51fceSHong Zhang for (node = monitor->firstnode; node; node = node->next) { 1929566063dSJacob Faibussowitsch PetscCall(DMNetworkGetGlobalVecOffset(monitor->network, node->element, ALL_COMPONENTS, &varoffset)); 1939566063dSJacob Faibussowitsch PetscCall(VecGetArray(node->v, &vv)); 19427f51fceSHong Zhang start = varoffset + node->start; 195ad540459SPierre Jolivet for (i = 0; i < node->nodes; i++) vv[i] = xx[start + i * node->blocksize]; 1969566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(node->v, &vv)); 1979566063dSJacob Faibussowitsch PetscCall(VecView(node->v, node->viewer)); 19827f51fceSHong Zhang } 1999566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(x, &xx)); 2003ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 20127f51fceSHong Zhang } 202