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