xref: /petsc/src/ts/utils/dmnetworkts.c (revision 4500fedd937e98a714938d3e38e5844b5af6cf6f)
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 /*
6*4500feddSGetnet 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
98*4500feddSGetnet 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++) {
140*4500feddSGetnet Betrie       if (PetscRealPart(yv[j]) <= 0.0) yv[j] = -12;
141e669de00SBarry Smith       else            yv[j] = PetscLog10Real(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);
156*4500feddSGetnet 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);
167*4500feddSGetnet 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