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