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