xref: /petsc/src/ts/utils/dmnetworkts.c (revision e669de006f02eaefa44d29298629a9d1e3df34ad)
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