1e669de00SBarry Smith #include <petsc/private/dmnetworkimpl.h> /*I "petscdmplex.h" I*/ 2e669de00SBarry Smith #include <petscts.h> 3e669de00SBarry Smith #include <petscdraw.h> 4e669de00SBarry Smith 5e669de00SBarry Smith /* 64500feddSGetnet Betrie TSMonitorLGCtxDestroy - Destroys line graph contexts that where created with TSMonitorLGCtxNetworkCreate(). 7e669de00SBarry Smith 8c3339decSBarry Smith Collective 9e669de00SBarry Smith 10e669de00SBarry Smith Input Parameter: 11e669de00SBarry Smith . ctx - the monitor context 12e669de00SBarry Smith 13e669de00SBarry Smith */ 14d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGCtxNetworkDestroy(TSMonitorLGCtxNetwork *ctx) 15d71ae5a4SJacob Faibussowitsch { 16e669de00SBarry Smith PetscInt i; 17e669de00SBarry Smith 18e669de00SBarry Smith PetscFunctionBegin; 1948a46eb9SPierre Jolivet for (i = 0; i < (*ctx)->nlg; i++) PetscCall(PetscDrawLGDestroy(&(*ctx)->lg[i])); 209566063dSJacob Faibussowitsch PetscCall(PetscFree((*ctx)->lg)); 219566063dSJacob Faibussowitsch PetscCall(PetscFree(*ctx)); 223ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23e669de00SBarry Smith } 24e669de00SBarry Smith 25d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGCtxNetworkCreate(TS ts, const char host[], const char label[], int x, int y, int m, int n, PetscInt howoften, TSMonitorLGCtxNetwork *ctx) 26d71ae5a4SJacob Faibussowitsch { 27e669de00SBarry Smith PetscDraw draw; 28e669de00SBarry Smith MPI_Comm comm; 29e669de00SBarry Smith DM dm; 30e669de00SBarry Smith PetscInt i, Start, End, e, nvar; 31e669de00SBarry Smith 32e669de00SBarry Smith PetscFunctionBegin; 339566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 349566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)ts, &comm)); 359566063dSJacob Faibussowitsch PetscCall(PetscNew(ctx)); 36e669de00SBarry Smith i = 0; 37e669de00SBarry Smith /* loop over edges counting number of line graphs needed */ 389566063dSJacob Faibussowitsch PetscCall(DMNetworkGetEdgeRange(dm, &Start, &End)); 39e669de00SBarry Smith for (e = Start; e < End; e++) { 409566063dSJacob Faibussowitsch PetscCall(DMNetworkGetComponent(dm, e, ALL_COMPONENTS, NULL, NULL, &nvar)); 41e669de00SBarry Smith if (!nvar) continue; 42e669de00SBarry Smith i++; 43e669de00SBarry Smith } 44e669de00SBarry Smith /* loop over vertices */ 459566063dSJacob Faibussowitsch PetscCall(DMNetworkGetVertexRange(dm, &Start, &End)); 46e669de00SBarry Smith for (e = Start; e < End; e++) { 479566063dSJacob Faibussowitsch PetscCall(DMNetworkGetComponent(dm, e, ALL_COMPONENTS, NULL, NULL, &nvar)); 48e669de00SBarry Smith if (!nvar) continue; 49e669de00SBarry Smith i++; 50e669de00SBarry Smith } 51e669de00SBarry Smith (*ctx)->nlg = i; 529566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(i, &(*ctx)->lg)); 53e669de00SBarry Smith 54e669de00SBarry Smith i = 0; 55e669de00SBarry Smith /* loop over edges creating all needed line graphs*/ 569566063dSJacob Faibussowitsch PetscCall(DMNetworkGetEdgeRange(dm, &Start, &End)); 57e669de00SBarry Smith for (e = Start; e < End; e++) { 589566063dSJacob Faibussowitsch PetscCall(DMNetworkGetComponent(dm, e, ALL_COMPONENTS, NULL, NULL, &nvar)); 59e669de00SBarry Smith if (!nvar) continue; 609566063dSJacob Faibussowitsch PetscCall(PetscDrawCreate(comm, host, label, x, y, m, n, &draw)); 619566063dSJacob Faibussowitsch PetscCall(PetscDrawSetFromOptions(draw)); 629566063dSJacob Faibussowitsch PetscCall(PetscDrawLGCreate(draw, nvar, &(*ctx)->lg[i])); 639566063dSJacob Faibussowitsch PetscCall(PetscDrawLGSetFromOptions((*ctx)->lg[i])); 649566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&draw)); 65e669de00SBarry Smith i++; 66e669de00SBarry Smith } 67e669de00SBarry Smith /* loop over vertices */ 689566063dSJacob Faibussowitsch PetscCall(DMNetworkGetVertexRange(dm, &Start, &End)); 69e669de00SBarry Smith for (e = Start; e < End; e++) { 709566063dSJacob Faibussowitsch PetscCall(DMNetworkGetComponent(dm, e, ALL_COMPONENTS, NULL, NULL, &nvar)); 71e669de00SBarry Smith if (!nvar) continue; 729566063dSJacob Faibussowitsch PetscCall(PetscDrawCreate(comm, host, label, x, y, m, n, &draw)); 739566063dSJacob Faibussowitsch PetscCall(PetscDrawSetFromOptions(draw)); 749566063dSJacob Faibussowitsch PetscCall(PetscDrawLGCreate(draw, nvar, &(*ctx)->lg[i])); 759566063dSJacob Faibussowitsch PetscCall(PetscDrawLGSetFromOptions((*ctx)->lg[i])); 769566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&draw)); 77e669de00SBarry Smith i++; 78e669de00SBarry Smith } 799566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&draw)); 80e669de00SBarry Smith (*ctx)->howoften = howoften; 813ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 82e669de00SBarry Smith } 83e669de00SBarry Smith 84e669de00SBarry Smith /* 85bcf0153eSBarry Smith TSMonitorLGCtxNetworkSolution - Monitors progress of the `TS` solvers for a `DMNETWORK` solution with one window for each vertex and each edge 86e669de00SBarry Smith 87c3339decSBarry Smith Collective 88e669de00SBarry Smith 89e669de00SBarry Smith Input Parameters: 90bcf0153eSBarry Smith + ts - the `TS` context 91e669de00SBarry Smith . step - current time-step 92e669de00SBarry Smith . ptime - current time 93e669de00SBarry Smith . u - current solution 94bcf0153eSBarry Smith - dctx - the `TSMonitorLGCtxNetwork` object that contains all the options for the monitoring, this is created with `TSMonitorLGCtxCreateNetwork()` 95e669de00SBarry Smith 96bcf0153eSBarry Smith Options Database Key: 97*b43aa488SJacob Faibussowitsch . -ts_monitor_lg_solution_variables - monitor solution variables 98e669de00SBarry Smith 99e669de00SBarry Smith Level: intermediate 100e669de00SBarry Smith 101bcf0153eSBarry Smith Note: 102e669de00SBarry Smith Each process in a parallel run displays its component solutions in a separate window 103e669de00SBarry Smith 104e669de00SBarry Smith */ 105d71ae5a4SJacob Faibussowitsch PetscErrorCode TSMonitorLGCtxNetworkSolution(TS ts, PetscInt step, PetscReal ptime, Vec u, void *dctx) 106d71ae5a4SJacob Faibussowitsch { 107e669de00SBarry Smith TSMonitorLGCtxNetwork ctx = (TSMonitorLGCtxNetwork)dctx; 108e669de00SBarry Smith const PetscScalar *xv; 109e669de00SBarry Smith PetscScalar *yv; 110e669de00SBarry Smith PetscInt i, v, Start, End, offset, nvar, e; 111e669de00SBarry Smith TSConvergedReason reason; 112e669de00SBarry Smith DM dm; 113e669de00SBarry Smith Vec uv; 114e669de00SBarry Smith 115e669de00SBarry Smith PetscFunctionBegin; 1163ba16761SJacob Faibussowitsch if (step < 0) PetscFunctionReturn(PETSC_SUCCESS); /* -1 indicates interpolated solution */ 117e669de00SBarry Smith if (!step) { 118e669de00SBarry Smith PetscDrawAxis axis; 119e669de00SBarry Smith 120e669de00SBarry Smith for (i = 0; i < ctx->nlg; i++) { 1219566063dSJacob Faibussowitsch PetscCall(PetscDrawLGGetAxis(ctx->lg[i], &axis)); 1229566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisSetLabels(axis, "Solution as function of time", "Time", "Solution")); 1239566063dSJacob Faibussowitsch PetscCall(PetscDrawLGReset(ctx->lg[i])); 124e669de00SBarry Smith } 125e669de00SBarry Smith } 126e669de00SBarry Smith 127e669de00SBarry Smith if (ctx->semilogy) { 128e669de00SBarry Smith PetscInt n, j; 129e669de00SBarry Smith 1309566063dSJacob Faibussowitsch PetscCall(VecDuplicate(u, &uv)); 1319566063dSJacob Faibussowitsch PetscCall(VecCopy(u, uv)); 1329566063dSJacob Faibussowitsch PetscCall(VecGetArray(uv, &yv)); 1339566063dSJacob Faibussowitsch PetscCall(VecGetLocalSize(uv, &n)); 134e669de00SBarry Smith for (j = 0; j < n; j++) { 1354500feddSGetnet Betrie if (PetscRealPart(yv[j]) <= 0.0) yv[j] = -12; 1364e936a74SSatish Balay else yv[j] = PetscLog10Real(PetscRealPart(yv[j])); 137e669de00SBarry Smith } 138e669de00SBarry Smith xv = yv; 139e669de00SBarry Smith } else { 1409566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(u, &xv)); 141e669de00SBarry Smith } 142e669de00SBarry Smith /* iterate over edges */ 1439566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 144e669de00SBarry Smith i = 0; 1459566063dSJacob Faibussowitsch PetscCall(DMNetworkGetEdgeRange(dm, &Start, &End)); 146e669de00SBarry Smith for (e = Start; e < End; e++) { 1479566063dSJacob Faibussowitsch PetscCall(DMNetworkGetComponent(dm, e, ALL_COMPONENTS, NULL, NULL, &nvar)); 148e669de00SBarry Smith if (!nvar) continue; 149e669de00SBarry Smith 1509566063dSJacob Faibussowitsch PetscCall(DMNetworkGetLocalVecOffset(dm, e, ALL_COMPONENTS, &offset)); 1519566063dSJacob Faibussowitsch PetscCall(PetscDrawLGAddCommonPoint(ctx->lg[i], ptime, (const PetscReal *)(xv + offset))); 152e669de00SBarry Smith i++; 153e669de00SBarry Smith } 154e669de00SBarry Smith 155e669de00SBarry Smith /* iterate over vertices */ 1569566063dSJacob Faibussowitsch PetscCall(DMNetworkGetVertexRange(dm, &Start, &End)); 157e669de00SBarry Smith for (v = Start; v < End; v++) { 1589566063dSJacob Faibussowitsch PetscCall(DMNetworkGetComponent(dm, v, ALL_COMPONENTS, NULL, NULL, &nvar)); 159e669de00SBarry Smith if (!nvar) continue; 160e669de00SBarry Smith 1619566063dSJacob Faibussowitsch PetscCall(DMNetworkGetLocalVecOffset(dm, v, ALL_COMPONENTS, &offset)); 1629566063dSJacob Faibussowitsch PetscCall(PetscDrawLGAddCommonPoint(ctx->lg[i], ptime, (const PetscReal *)(xv + offset))); 163e669de00SBarry Smith i++; 164e669de00SBarry Smith } 165e669de00SBarry Smith if (ctx->semilogy) { 1669566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(uv, &yv)); 1679566063dSJacob Faibussowitsch PetscCall(VecDestroy(&uv)); 168e669de00SBarry Smith } else { 1699566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(u, &xv)); 170e669de00SBarry Smith } 171e669de00SBarry Smith 1729566063dSJacob Faibussowitsch PetscCall(TSGetConvergedReason(ts, &reason)); 173e669de00SBarry Smith if (((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && reason)) { 174e669de00SBarry Smith for (i = 0; i < ctx->nlg; i++) { 1759566063dSJacob Faibussowitsch PetscCall(PetscDrawLGDraw(ctx->lg[i])); 1769566063dSJacob Faibussowitsch PetscCall(PetscDrawLGSave(ctx->lg[i])); 177e669de00SBarry Smith } 178e669de00SBarry Smith } 1793ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 180e669de00SBarry Smith } 181