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 8e669de00SBarry Smith Collective on TSMonitorLGCtx_Network 9e669de00SBarry Smith 10e669de00SBarry Smith Input Parameter: 11e669de00SBarry Smith . ctx - the monitor context 12e669de00SBarry Smith 13e669de00SBarry Smith */ 14e669de00SBarry Smith PetscErrorCode TSMonitorLGCtxNetworkDestroy(TSMonitorLGCtxNetwork *ctx) 15e669de00SBarry Smith { 16e669de00SBarry Smith PetscErrorCode ierr; 17e669de00SBarry Smith PetscInt i; 18e669de00SBarry Smith 19e669de00SBarry Smith PetscFunctionBegin; 20e669de00SBarry Smith for (i=0; i<(*ctx)->nlg; i++) { 21e669de00SBarry Smith ierr = PetscDrawLGDestroy(&(*ctx)->lg[i]);CHKERRQ(ierr); 22e669de00SBarry Smith } 23e669de00SBarry Smith ierr = PetscFree((*ctx)->lg);CHKERRQ(ierr); 24e669de00SBarry Smith ierr = PetscFree(*ctx);CHKERRQ(ierr); 25e669de00SBarry Smith PetscFunctionReturn(0); 26e669de00SBarry Smith } 27e669de00SBarry Smith 28e669de00SBarry Smith PetscErrorCode TSMonitorLGCtxNetworkCreate(TS ts,const char host[],const char label[],int x,int y,int m,int n,PetscInt howoften,TSMonitorLGCtxNetwork *ctx) 29e669de00SBarry Smith { 30e669de00SBarry Smith PetscDraw draw; 31e669de00SBarry Smith PetscErrorCode ierr; 32e669de00SBarry Smith MPI_Comm comm; 33e669de00SBarry Smith DM dm; 34e669de00SBarry Smith PetscInt i,Start,End,e,nvar; 35e669de00SBarry Smith 36e669de00SBarry Smith PetscFunctionBegin; 37e669de00SBarry Smith ierr = TSGetDM(ts,&dm);CHKERRQ(ierr); 38e669de00SBarry Smith ierr = PetscObjectGetComm((PetscObject)ts,&comm);CHKERRQ(ierr); 39e669de00SBarry Smith ierr = PetscNew(ctx);CHKERRQ(ierr); 40e669de00SBarry Smith i = 0; 41e669de00SBarry Smith /* loop over edges counting number of line graphs needed */ 42e669de00SBarry Smith ierr = DMNetworkGetEdgeRange(dm,&Start,&End);CHKERRQ(ierr); 43e669de00SBarry Smith for (e=Start; e<End; e++) { 44e669de00SBarry Smith ierr = DMNetworkGetNumVariables(dm,e,&nvar);CHKERRQ(ierr); 45e669de00SBarry Smith if (!nvar) continue; 46e669de00SBarry Smith i++; 47e669de00SBarry Smith } 48e669de00SBarry Smith /* loop over vertices */ 49e669de00SBarry Smith ierr = DMNetworkGetVertexRange(dm,&Start,&End);CHKERRQ(ierr); 50e669de00SBarry Smith for (e=Start; e<End; e++) { 51e669de00SBarry Smith ierr = DMNetworkGetNumVariables(dm,e,&nvar);CHKERRQ(ierr); 52e669de00SBarry Smith if (!nvar) continue; 53e669de00SBarry Smith i++; 54e669de00SBarry Smith } 55e669de00SBarry Smith (*ctx)->nlg = i; 56e669de00SBarry Smith ierr = PetscMalloc1(i,&(*ctx)->lg);CHKERRQ(ierr); 57e669de00SBarry Smith 58e669de00SBarry Smith i = 0; 59e669de00SBarry Smith /* loop over edges creating all needed line graphs*/ 60e669de00SBarry Smith ierr = DMNetworkGetEdgeRange(dm,&Start,&End);CHKERRQ(ierr); 61e669de00SBarry Smith for (e=Start; e<End; e++) { 62e669de00SBarry Smith ierr = DMNetworkGetNumVariables(dm,e,&nvar);CHKERRQ(ierr); 63e669de00SBarry Smith if (!nvar) continue; 64e669de00SBarry Smith ierr = PetscDrawCreate(comm,host,label,x,y,m,n,&draw);CHKERRQ(ierr); 65e669de00SBarry Smith ierr = PetscDrawSetFromOptions(draw);CHKERRQ(ierr); 66e669de00SBarry Smith ierr = PetscDrawLGCreate(draw,nvar,&(*ctx)->lg[i]);CHKERRQ(ierr); 67e669de00SBarry Smith ierr = PetscDrawLGSetFromOptions((*ctx)->lg[i]);CHKERRQ(ierr); 68e669de00SBarry Smith ierr = PetscDrawDestroy(&draw);CHKERRQ(ierr); 69e669de00SBarry Smith i++; 70e669de00SBarry Smith } 71e669de00SBarry Smith /* loop over vertices */ 72e669de00SBarry Smith ierr = DMNetworkGetVertexRange(dm,&Start,&End);CHKERRQ(ierr); 73e669de00SBarry Smith for (e=Start; e<End; e++) { 74e669de00SBarry Smith ierr = DMNetworkGetNumVariables(dm,e,&nvar);CHKERRQ(ierr); 75e669de00SBarry Smith if (!nvar) continue; 76e669de00SBarry Smith ierr = PetscDrawCreate(comm,host,label,x,y,m,n,&draw);CHKERRQ(ierr); 77e669de00SBarry Smith ierr = PetscDrawSetFromOptions(draw);CHKERRQ(ierr); 78e669de00SBarry Smith ierr = PetscDrawLGCreate(draw,nvar,&(*ctx)->lg[i]);CHKERRQ(ierr); 79e669de00SBarry Smith ierr = PetscDrawLGSetFromOptions((*ctx)->lg[i]);CHKERRQ(ierr); 80e669de00SBarry Smith ierr = PetscDrawDestroy(&draw);CHKERRQ(ierr); 81e669de00SBarry Smith i++; 82e669de00SBarry Smith } 83e669de00SBarry Smith ierr = PetscDrawDestroy(&draw);CHKERRQ(ierr); 84e669de00SBarry Smith (*ctx)->howoften = howoften; 85e669de00SBarry Smith PetscFunctionReturn(0); 86e669de00SBarry Smith } 87e669de00SBarry Smith 88e669de00SBarry Smith /* 89e669de00SBarry Smith TSMonitorLGCtxNetworkSolution - Monitors progress of the TS solvers for a DMNetwork solution with one window for each vertex and each edge 90e669de00SBarry Smith 91e669de00SBarry Smith Collective on TS 92e669de00SBarry Smith 93e669de00SBarry Smith Input Parameters: 94e669de00SBarry Smith + ts - the TS context 95e669de00SBarry Smith . step - current time-step 96e669de00SBarry Smith . ptime - current time 97e669de00SBarry Smith . u - current solution 984500feddSGetnet Betrie - dctx - the TSMonitorLGCtxNetwork object that contains all the options for the monitoring, this is created with TSMonitorLGCtxCreateNetwork() 99e669de00SBarry Smith 100e669de00SBarry Smith Options Database: 101e669de00SBarry Smith . -ts_monitor_lg_solution_variables 102e669de00SBarry Smith 103e669de00SBarry Smith Level: intermediate 104e669de00SBarry Smith 105e669de00SBarry Smith Notes: 106e669de00SBarry Smith Each process in a parallel run displays its component solutions in a separate window 107e669de00SBarry Smith 108e669de00SBarry Smith */ 109e669de00SBarry Smith PetscErrorCode TSMonitorLGCtxNetworkSolution(TS ts,PetscInt step,PetscReal ptime,Vec u,void *dctx) 110e669de00SBarry Smith { 111e669de00SBarry Smith PetscErrorCode ierr; 112e669de00SBarry Smith TSMonitorLGCtxNetwork ctx = (TSMonitorLGCtxNetwork)dctx; 113e669de00SBarry Smith const PetscScalar *xv; 114e669de00SBarry Smith PetscScalar *yv; 115e669de00SBarry Smith PetscInt i,v,Start,End,offset,nvar,e; 116e669de00SBarry Smith TSConvergedReason reason; 117e669de00SBarry Smith DM dm; 118e669de00SBarry Smith Vec uv; 119e669de00SBarry Smith 120e669de00SBarry Smith PetscFunctionBegin; 121e669de00SBarry Smith if (step < 0) PetscFunctionReturn(0); /* -1 indicates interpolated solution */ 122e669de00SBarry Smith if (!step) { 123e669de00SBarry Smith PetscDrawAxis axis; 124e669de00SBarry Smith 125e669de00SBarry Smith for (i=0; i<ctx->nlg; i++) { 126e669de00SBarry Smith ierr = PetscDrawLGGetAxis(ctx->lg[i],&axis);CHKERRQ(ierr); 127e669de00SBarry Smith ierr = PetscDrawAxisSetLabels(axis,"Solution as function of time","Time","Solution");CHKERRQ(ierr); 128e669de00SBarry Smith ierr = PetscDrawLGReset(ctx->lg[i]);CHKERRQ(ierr); 129e669de00SBarry Smith } 130e669de00SBarry Smith } 131e669de00SBarry Smith 132e669de00SBarry Smith if (ctx->semilogy) { 133e669de00SBarry Smith PetscInt n,j; 134e669de00SBarry Smith 135e669de00SBarry Smith ierr = VecDuplicate(u,&uv);CHKERRQ(ierr); 136e669de00SBarry Smith ierr = VecCopy(u,uv);CHKERRQ(ierr); 137e669de00SBarry Smith ierr = VecGetArray(uv,&yv);CHKERRQ(ierr); 138e669de00SBarry Smith ierr = VecGetLocalSize(uv,&n);CHKERRQ(ierr); 139e669de00SBarry Smith for (j=0; j<n; j++) { 1404500feddSGetnet Betrie if (PetscRealPart(yv[j]) <= 0.0) yv[j] = -12; 141*4e936a74SSatish Balay else yv[j] = PetscLog10Real(PetscRealPart(yv[j])); 142e669de00SBarry Smith } 143e669de00SBarry Smith xv = yv; 144e669de00SBarry Smith } else { 145e669de00SBarry Smith ierr = VecGetArrayRead(u,&xv);CHKERRQ(ierr); 146e669de00SBarry Smith } 147e669de00SBarry Smith /* iterate over edges */ 148e669de00SBarry Smith ierr = TSGetDM(ts,&dm);CHKERRQ(ierr); 149e669de00SBarry Smith i = 0; 150e669de00SBarry Smith ierr = DMNetworkGetEdgeRange(dm,&Start,&End);CHKERRQ(ierr); 151e669de00SBarry Smith for (e=Start; e<End; e++) { 152e669de00SBarry Smith ierr = DMNetworkGetNumVariables(dm,e,&nvar);CHKERRQ(ierr); 153e669de00SBarry Smith if (!nvar) continue; 154e669de00SBarry Smith 155e669de00SBarry Smith ierr = DMNetworkGetVariableOffset(dm,e,&offset);CHKERRQ(ierr); 1564500feddSGetnet Betrie ierr = PetscDrawLGAddCommonPoint(ctx->lg[i],ptime,(const PetscReal*)(xv+offset));CHKERRQ(ierr); 157e669de00SBarry Smith i++; 158e669de00SBarry Smith } 159e669de00SBarry Smith 160e669de00SBarry Smith /* iterate over vertices */ 161e669de00SBarry Smith ierr = DMNetworkGetVertexRange(dm,&Start,&End);CHKERRQ(ierr); 162e669de00SBarry Smith for (v=Start; v<End; v++) { 163e669de00SBarry Smith ierr = DMNetworkGetNumVariables(dm,v,&nvar);CHKERRQ(ierr); 164e669de00SBarry Smith if (!nvar) continue; 165e669de00SBarry Smith 166e669de00SBarry Smith ierr = DMNetworkGetVariableOffset(dm,v,&offset);CHKERRQ(ierr); 1674500feddSGetnet Betrie ierr = PetscDrawLGAddCommonPoint(ctx->lg[i],ptime,(const PetscReal*)(xv+offset));CHKERRQ(ierr); 168e669de00SBarry Smith i++; 169e669de00SBarry Smith } 170e669de00SBarry Smith if (ctx->semilogy) { 171e669de00SBarry Smith ierr = VecRestoreArray(uv,&yv);CHKERRQ(ierr); 172e669de00SBarry Smith ierr = VecDestroy(&uv);CHKERRQ(ierr); 173e669de00SBarry Smith } else { 174e669de00SBarry Smith ierr = VecRestoreArrayRead(u,&xv);CHKERRQ(ierr); 175e669de00SBarry Smith } 176e669de00SBarry Smith 177e669de00SBarry Smith ierr = TSGetConvergedReason(ts,&reason);CHKERRQ(ierr); 178e669de00SBarry Smith if (((ctx->howoften > 0) && (!(step % ctx->howoften))) || ((ctx->howoften == -1) && reason)) { 179e669de00SBarry Smith for (i=0; i<ctx->nlg; i++) { 180e669de00SBarry Smith ierr = PetscDrawLGDraw(ctx->lg[i]);CHKERRQ(ierr); 181e669de00SBarry Smith ierr = PetscDrawLGSave(ctx->lg[i]);CHKERRQ(ierr); 182e669de00SBarry Smith } 183e669de00SBarry Smith } 184e669de00SBarry Smith PetscFunctionReturn(0); 185e669de00SBarry Smith } 186