1 #include <alberta.h>
2 
3 #include "demographics.h" /* just to keep the proto-type consistent */
4 
5 /*---8<---------------------------------------------------------------------*/
6 /*---   graphical output of mesh, discrete solution, estimate, and error ---*/
7 /*--------------------------------------------------------------------->8---*/
8 
9 #if !ALBERTA_USE_GRAPHICS
10 
graphics(MESH * mesh,DOF_REAL_VEC * u_h,REAL (* get_est)(EL * el),REAL (* u)(const REAL_D x),REAL time)11 void graphics(MESH *mesh, DOF_REAL_VEC *u_h, REAL (*get_est)(EL *el),
12 	      REAL (*u)(const REAL_D x), REAL time)
13 {
14   FUNCNAME("graphics");
15   MSG("Graphics disabled by compile-time switch !ALBERTA_USE_GRAPHICS");
16 }
17 
graphics_d(MESH * mesh,DOF_REAL_D_VEC * u_h,DOF_REAL_VEC * p_h,REAL (* get_est)(EL * el),const REAL * (* u)(const REAL_D val,REAL_D x),REAL time)18 void graphics_d(MESH *mesh, DOF_REAL_D_VEC *u_h, DOF_REAL_VEC *p_h,
19 		REAL (*get_est)(EL *el),
20 		const REAL *(*u)(const REAL_D val, REAL_D x),
21 		REAL time)
22 {
23   FUNCNAME("graphics_d");
24   MSG("Graphics disabled by compile-time switch !ALBERTA_USE_GRAPHICS");
25 }
26 
27 #else
28 
29 # if !HAVE_LIBGLTOOLS
30 /*---8<---------------------------------------------------------------------*/
31 /*---   simple GL graphics ...                                           ---*/
32 /*---   nothing will be done in 3d                                       ---*/
33 /*--------------------------------------------------------------------->8---*/
34 
graphics(MESH * mesh,DOF_REAL_VEC * u_h,REAL (* get_est)(EL * el),REAL (* u)(const REAL_D x),REAL time)35 void graphics(MESH *mesh, DOF_REAL_VEC *u_h, REAL (*get_est)(EL *el),
36 	      REAL (*u)(const REAL_D x), REAL time)
37 {
38   FUNCNAME("graphics");
39   static int first = true;
40   static GRAPH_WINDOW win_est=NULL, win_val=NULL, win_mesh=NULL, win_err=NULL;
41   static DOF_REAL_VEC   *u_diff = NULL;
42   int    refine = 0;
43 
44   if (first)
45   {
46     int size[4] = { 0, };
47     char   geom[128] = "500x500+0+0";
48     GET_PARAMETER(1, "graphic windows", "%d %d %d %d", size, size+1, size+2, size+3);
49 
50     if (size[0] > 0)
51     {
52       sprintf(geom, "%dx%d+%d+%d", size[0], size[0], 0, 0);
53       win_val = graph_open_window("ALBERTA values", geom, NULL, mesh);
54     }
55     if (size[1] > 0)
56     {
57       sprintf(geom, "%dx%d+%d+%d", size[0], size[0], size[0], 0);
58       win_est = graph_open_window("ALBERTA estimate", geom, NULL, mesh);
59     }
60     if (size[2] > 0)
61     {
62       sprintf(geom, "%dx%d+%d+%d", size[2], size[2], size[0]+size[1], 0);
63       win_mesh = graph_open_window("ALBERTA mesh", geom, NULL, mesh);
64     }
65     if (size[3] > 0)
66     {
67       sprintf(geom, "%dx%d+%d+%d", size[3], size[3], 0, size[0]);
68       win_err = graph_open_window("ALBERTA error (u_h-u)", geom, NULL, mesh);
69     }
70     first = false;
71   }
72 
73   if (mesh && win_mesh)
74   {
75     graph_clear_window(win_mesh, rgb_white);
76     graph_mesh(win_mesh, mesh, rgb_black, 2);
77   }
78   if (u_h && win_val)
79   {
80     graph_clear_window(win_val, rgb_white);
81     refine = u_h->fe_space->bas_fcts->degree;
82     if (refine<2) refine=0;
83     graph_drv(win_val, u_h, 0.0, 0.0, refine);
84   }
85 
86   if (get_est && win_est)
87   {
88     graph_clear_window(win_est, rgb_white);
89     graph_mesh(win_est, mesh, rgb_blue, 0);
90     graph_el_est(win_est, mesh, get_est, 0.0, 0.0);
91   }
92 
93   if(u && u_h && win_err) {
94     if(!u_diff)
95       u_diff = get_dof_real_vec("u_h - u", u_h->fe_space);
96 
97     interpol(u, u_diff);
98     dof_xpay(-1.0, u_h, u_diff);
99     graph_drv(win_err, u_diff, 0.0, 0.0, refine);
100   }
101 
102   WAIT;
103 
104   return;
105 }
106 
graphics_d(MESH * mesh,DOF_REAL_D_VEC * u_h,REAL (* get_est)(EL * el),const REAL * (* u)(const REAL_D val,REAL_D x),REAL time)107 void graphics_d(MESH *mesh, DOF_REAL_D_VEC *u_h, REAL (*get_est)(EL *el),
108 		const REAL *(*u)(const REAL_D val, REAL_D x), REAL time)
109 {
110   FUNCNAME("graphics_d");
111   static int first = true;
112   static GRAPH_WINDOW win_est=NULL, win_val=NULL, win_mesh=NULL, win_err=NULL;
113   static DOF_REAL_D_VEC   *u_diff = NULL;
114   int    refine = 0;
115 
116   if (first)
117   {
118     int size[4] = { 0, };
119     char   geom[128] = "500x500+0+0";
120     GET_PARAMETER(1, "graphic windows", "%d %d %d %d", size, size+1, size+2, size+3);
121 
122     if (size[0] > 0)
123     {
124       sprintf(geom, "%dx%d+%d+%d", size[0], size[0], 0, 0);
125       win_val = graph_open_window("ALBERTA values", geom, NULL, mesh);
126     }
127     if (size[1] > 0)
128     {
129       sprintf(geom, "%dx%d+%d+%d", size[0], size[0], size[0], 0);
130       win_est = graph_open_window("ALBERTA estimate", geom, NULL, mesh);
131     }
132     if (size[2] > 0)
133     {
134       sprintf(geom, "%dx%d+%d+%d", size[2], size[2], size[0]+size[1], 0);
135       win_mesh = graph_open_window("ALBERTA mesh", geom, NULL, mesh);
136     }
137     if (size[3] > 0)
138     {
139       sprintf(geom, "%dx%d+%d+%d", size[3], size[3], 0, size[0]);
140       win_err = graph_open_window("ALBERTA error ||u_h-u||", geom, NULL, mesh);
141     }
142     first = false;
143   }
144 
145   if (mesh && win_mesh)
146   {
147     graph_clear_window(win_mesh, rgb_white);
148     graph_mesh(win_mesh, mesh, rgb_black, 2);
149   }
150   if (u_h && win_val)
151   {
152     graph_clear_window(win_val, rgb_white);
153     refine = u_h->fe_space->bas_fcts->degree;
154     if (refine<2) refine=0;
155     graph_drv_d(win_val, u_h, 0.0, 0.0, refine);
156   }
157 
158   if (get_est && win_est)
159   {
160     graph_clear_window(win_est, rgb_white);
161     graph_mesh(win_est, mesh, rgb_blue, 0);
162     graph_el_est(win_est, mesh, get_est, 0.0, 0.0);
163   }
164 
165   if(u && u_h && win_err) {
166     if(!u_diff)
167       u_diff = get_dof_real_d_vec("u_h - u", u_h->fe_space);
168 
169     interpol_d(u, u_diff);
170     dof_xpay_d(-1.0, u_h, u_diff);
171     graph_drv_d(win_err, u_diff, 0.0, 0.0, refine);
172   }
173 
174   WAIT;
175 
176   return;
177 }
178 # else
179 
graphics(MESH * mesh,DOF_REAL_VEC * u_h,REAL (* get_est)(EL * el),REAL (* u)(const REAL_D x),REAL time)180 void graphics(MESH *mesh, DOF_REAL_VEC *u_h, REAL (*get_est)(EL *el),
181 	      REAL (*u)(const REAL_D x) , REAL time)
182 {
183   FUNCNAME("graphics");
184   static int first = true;
185   static GLTOOLS_WINDOW  win_est=NULL, win_val=NULL, win_mesh=NULL, win_err=NULL;
186   static DOF_REAL_VEC   *u_diff = NULL;
187   static REAL  min, max;
188 
189   if (first)
190   {
191     int size[4] = { 0, };
192     char   geom[128] = "500x500+0+0";
193     GET_PARAMETER(1, "graphic windows", "%d %d %d %d", size, size+1, size+2, size+3);
194 
195     GET_PARAMETER(1, "gltools range", "%e %e", &min, &max);
196 
197     if (size[0] > 0)
198     {
199       sprintf(geom, "%dx%d+%d+%d", size[0], size[0], 0, 0);
200       win_val = open_gltools_window("ALBERTA values", geom, NULL, mesh, true);
201     }
202 
203     if (size[1] > 0)
204     {
205       sprintf(geom, "%dx%d+%d+%d", size[1], size[1], size[0], 0);
206       win_est = open_gltools_window("ALBERTA estimate", geom, NULL, mesh, true);
207     }
208 
209     if (size[2] > 0)
210     {
211       sprintf(geom, "%dx%d+%d+%d", size[2], size[2], size[0]+size[1], 0);
212       win_mesh = open_gltools_window("ALBERTA mesh", geom, NULL, mesh, true);
213     }
214 
215     if (size[3] > 0)
216     {
217       sprintf(geom, "%dx%d+%d+%d", size[3], size[3], 0, size[0]);
218       win_err=open_gltools_window("ALBERTA error (u_h-u)", geom, NULL, mesh, true);
219     }
220     first = false;
221   }
222 
223 
224   if (mesh && win_mesh) {
225     gltools_mesh(win_mesh, mesh, 0, time);
226   }
227 
228 
229   if (u_h && win_val) {
230     gltools_drv(win_val, u_h, min, max, time);
231   }
232 
233   if (get_est && win_est ) {
234     gltools_est(win_est, mesh, get_est, 0.0, -1.0, time);
235   }
236 
237   if(u && u_h && win_err) {
238     if(!u_diff)
239       u_diff = get_dof_real_vec("u_h - u", u_h->fe_space);
240 
241     interpol(u, u_diff);
242     dof_xpay(-1.0, u_h, u_diff);
243     gltools_drv(win_err, u_diff, 0.0, -1.0, time);
244   }
245 
246   return;
247 }
248 
graphics_d(MESH * mesh,DOF_REAL_D_VEC * u_h,DOF_REAL_VEC * p_h,REAL (* get_est)(EL * el),const REAL * (* u)(const REAL_D val,REAL_D x),REAL time)249 void graphics_d(MESH *mesh, DOF_REAL_D_VEC *u_h, DOF_REAL_VEC *p_h,
250 		REAL (*get_est)(EL *el),
251 		const REAL *(*u)(const REAL_D val, REAL_D x),
252 		REAL time)
253 {
254   FUNCNAME("graphics_d");
255   static int first = true;
256   static GLTOOLS_WINDOW win_est, win_val, win_vec, win_pressure;
257   static GLTOOLS_WINDOW win_mesh, win_err;
258   static DOF_REAL_D_VEC *u_diff;
259   static REAL  min, max;
260 
261   if (first)
262   {
263     int size[6] = { 0, };
264     char   geom[128] = "500x500+0+0";
265     GET_PARAMETER(1, "graphic windows", "%d %d %d %d %d %d",
266 		  size, size+1, size+2, size+3, size+4, size+5);
267 
268     GET_PARAMETER(1, "gltools range", "%e %e", &min, &max);
269 
270     if (size[0] > 0)
271     {
272       sprintf(geom, "%dx%d+%d+%d", size[0], size[0], 0, 0);
273       win_val = open_gltools_window("ALBERTA values", geom, NULL, mesh, true);
274     }
275 
276     if (size[1] > 0)
277     {
278       sprintf(geom, "%dx%d+%d+%d", size[1], size[1], size[0], 0);
279       win_vec = open_gltools_window("ALBERTA values (vectors)",
280 				    geom, NULL, mesh, true);
281     }
282 
283     if (size[2] > 0)
284     {
285       sprintf(geom, "%dx%d+%d+%d", size[2], size[2], size[0]+size[1], 0);
286       win_pressure = open_gltools_window("ALBERTA pressure",
287 					 geom, NULL, mesh, true);
288     }
289 
290     if (size[3] > 0)
291     {
292       sprintf(geom, "%dx%d+%d+%d",
293 	      size[3], size[3], 0, size[0]);
294       win_est = open_gltools_window("ALBERTA estimate", geom, NULL, mesh, true);
295     }
296 
297     if (size[4] > 0)
298     {
299       sprintf(geom, "%dx%d+%d+%d", size[4], size[4], size[3], size[0]);
300       win_mesh = open_gltools_window("ALBERTA mesh", geom, NULL, mesh, true);
301     }
302 
303     if (size[5] > 0)
304     {
305       sprintf(geom, "%dx%d+%d+%d", size[5], size[5], size[3]+size[4], size[0]);
306       win_err=open_gltools_window("ALBERTA error ||u_h-u||",
307 				  geom, NULL, mesh, true);
308     }
309     first = false;
310   }
311 
312 
313   if (mesh && win_mesh) {
314     gltools_mesh(win_mesh, mesh, 0, time);
315   }
316 
317   if (u_h && win_val) {
318     gltools_drv_d(win_val, u_h, min, max, time);
319   }
320 
321   if (u_h && win_vec) {
322     gltools_vec(win_vec, u_h, min, max, time);
323   }
324 
325   if (p_h && win_pressure) {
326     gltools_drv(win_pressure, p_h, min, max, time);
327   }
328 
329   if (get_est && win_est) {
330     gltools_est(win_est, mesh, get_est, 0.0, -1.0, time);
331   }
332 
333   if(u && u_h && win_err) {
334     if(!u_diff) {
335       u_diff = get_dof_real_d_vec("u_h - u", u_h->fe_space);
336     }
337 
338     interpol_d(u, u_diff);
339     dof_xpay_d(-1.0, u_h, u_diff);
340     gltools_drv_d(win_err, u_diff, 0.0, -1.0, time);
341   }
342 
343   return;
344 }
345 # endif /* HAVE_LIBGLTOOLS */
346 
347 #endif /* USE_GRAPHICS */
348