File: graph-tools.tex

package info (click to toggle)
alberta 3.1.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 19,176 kB
  • sloc: ansic: 135,836; cpp: 6,601; makefile: 2,801; sh: 333; fortran: 180; lisp: 177; xml: 30
file content (891 lines) | stat: -rw-r--r-- 44,966 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Graphics output}%
\label{S:gfx}
\idx{graphics routines|(}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ALBERTA provides one and two dimensional interactive graphic
subroutines built on the X--Windows and GL/OpenGL interfaces, and one,
two and three dimensional interactive graphics via the gltools
\cite{gltools}. Additionally, interfaces for
post--processing data with the GRAPE visualization environment \cite{Grape} 
as well as with the General Mesh Viewer \cite{GMV} are
supplied.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{One and two dimensional graphics subroutines}
\label{S:graph_1d2d}

A set of subroutines for opening, closing of graphic output
windows, and several display routines are provided, like drawing
the underlying mesh, displaying scalar finite element functions
as a graph in 1d, and using iso--lines or iso--colors in  2d. For vector
valued functions $\vec{v}$ similar routines are available, which display
the modulus $|\vec{v}|$.

The routines use the following type definitions for window identification,
color specification in [red, green, blue] coordinates, with
$0\leq \text{red, green, blue} \leq 1$, and standard colors
\ddx{GRAPH_WINDOW@{\code{GRAPH\_WINDOW}}}
\idx{graphics routines!GRAPH_WINDOW@{\code{GRAPH\_WINDOW}}}
\ddx{GRAPH_RGBCOLOR@{\code{GRAPH\_RGBCOLOR}}}
\idx{graphics routines!GRAPH_RGBCOLOR@{\code{GRAPH\_RGBCOLOR}}}
\cdx{rgb_black@{\code{rgb\_black}}}%
\idx{graphics routines!rgb_black@{\code{rgb\_black}}}%
\cdx{rgb_white@{\code{rgb\_white}}}%
\idx{graphics routines!rgb_white@{\code{rgb\_white}}}%
\cdx{rgb_red@{\code{rgb\_red}}}%
\idx{graphics routines!rgb_red@{\code{rgb\_red}}}%
\cdx{rgb_green@{\code{rgb\_green}}}%
\idx{graphics routines!rgb_green@{\code{rgb\_green}}}%
\cdx{rgb_blue@{\code{rgb\_blue}}}%
\idx{graphics routines!rgb_blue@{\code{rgb\_blue}}}%
\cdx{rgb_yellow@{\code{rgb\_yellow}}}%
\idx{graphics routines!rgb_yellow@{\code{rgb\_yellow}}}%
\cdx{rgb_magenta@{\code{rgb\_magenta}}}%
\idx{graphics routines!rgb_magenta@{\code{rgb\_magenta}}}%
\cdx{rgb_cyan@{\code{rgb\_cyan}}}%
\idx{graphics routines!rgb_cyan@{\code{rgb\_cyan}}}%
\cdx{rgb_grey50@{\code{rgb\_grey50}}}%
\idx{graphics routines!rgb_grey50@{\code{rgb\_grey50}}}%
\cdx{rgb_albert@{\code{rgb\_albert}}}%
\idx{graphics routines!rgb_albert@{\code{rgb\_albert}}}%
\cdx{rgb_alberta@{\code{rgb\_alberta}}}%
\idx{graphics routines!rgb_alberta@{\code{rgb\_alberta}}}%
\bv\begin{verbatim}
typedef void * GRAPH_WINDOW;

typedef float  GRAPH_RGBCOLOR[3];

extern const GRAPH_RGBCOLOR rgb_black; 
extern const GRAPH_RGBCOLOR rgb_white;  
extern const GRAPH_RGBCOLOR rgb_red;    
extern const GRAPH_RGBCOLOR rgb_green;  
extern const GRAPH_RGBCOLOR rgb_blue;   
extern const GRAPH_RGBCOLOR rgb_yellow; 
extern const GRAPH_RGBCOLOR rgb_magenta;
extern const GRAPH_RGBCOLOR rgb_cyan;   
extern const GRAPH_RGBCOLOR rgb_grey50; 

extern const GRAPH_RGBCOLOR rgb_albert;
extern const GRAPH_RGBCOLOR rgb_alberta;
\end{verbatim}\ev
%
The last two colors correspond to the two different colors in 
the \ALBERTA logo.

The following graphic routines are available for one and two dimensions:
\fdx{graph_open_window()@{\code{graph\_open\_window()}}}%
\idx{graphics routines!graph_open_window()@{\code{graph\_open\_window()}}}%
\fdx{graph_close_window()@{\code{graph\_close\_window()}}}%
\idx{graphics routines!graph_close_window()@{\code{graph\_close\_window()}}}%
\fdx{graph_clear_window()@{\code{graph\_clear\_window()}}}%
\idx{graphics routines!graph_clear_window()@{\code{graph\_clear\_window()}}}%
\fdx{graph_mesh()@{\code{graph\_mesh()}}}
\idx{graphics routines!graph_mesh()@{\code{graph\_mesh()}}}
\fdx{graph_drv()@{\code{graph\_drv()}}}
\idx{graphics routines!graph_drv()@{\code{graph\_drv()}}}
\fdx{graph_drv_d()@{\code{graph\_drv\_d()}}}
\idx{graphics routines!graph_drv_d()@{\code{graph\_drv\_d()}}}
\fdx{graph_el_est()@{\code{graph\_el\_est()}}}
\idx{graphics routines!graph_el_est()@{\code{graph\_el\_est()}}}
\fdx{graph_fvalues()@{\code{graph\_fvalues()}}}
\idx{graphics routines!graph_fvalues()@{\code{graph\_fvalues()}}}
\fdx{graph_line()@{\code{graph\_line()}}}
\idx{graphics routines!graph_line()@{\code{graph\_line()}}}
\fdx{graph_point()@{\code{graph\_point()}}}
\idx{graphics routines!graph_point()@{\code{graph\_point()}}}
\fdx{graph_points()@{\code{graph\_points()}}}
\idx{graphics routines!graph_points()@{\code{graph\_points()}}}
\bv\begin{verbatim}
GRAPH_WINDOW graph_open_window(const char *, const char *, REAL *, MESH *);
void graph_close_window(GRAPH_WINDOW);
void graph_clear_window(GRAPH_WINDOW, const GRAPH_RGBCOLOR);
void graph_mesh(GRAPH_WINDOW, MESH *, const GRAPH_RGBCOLOR, FLAGS);
void graph_drv(GRAPH_WINDOW, const DOF_REAL_VEC *, REAL, REAL, int);
void graph_drv_d(GRAPH_WINDOW, const DOF_REAL_D_VEC *, REAL, REAL, int);
void graph_el_est(GRAPH_WINDOW, MESH *, REAL (*)(EL *), REAL, REAL);
void graph_line(GRAPH_WINDOW, , const REAL [2], const REAL [2],
                const GRAPH_RGBCOLOR, REAL);
void graph_point(GRAPH_WINDOW, const REAL [2], const GRAPH_RGBCOLOR, float);
void graph_points(GRAPH_WINDOW, int, REAL (*)[2], const GRAPH_RGBCOLOR, float);
\end{verbatim}\ev
Description:
\begin{descr}
\kitem{graph\_open\_window(title, geometry, world, mesh)} the
  function re\-turns a pointer to a \code{GRAPH\_WINDOW} which is opened for
  display; if the window could not be opened, the return value is \nil;
  in 1d the $y$-direction of the graphic window is used for displaying the 
  graphs of functions;

\code{title} is an optional string holding a window title, if
\code{title} is \nil, a default title is used; \code{geometry} is an
optional string holding the window geometry in X11 format ``WxH'' or
``WxH+X+Y'', if \nil, a default geometry is used;

\code{world} is an optional pointer to an array of \emph{world
  coordinates} (xmin, xmax, ymin, ymax) to specify which part of a
   triangulation is displayed in this window, if \code{world} is
  \nil and \code{mesh} is not \nil, \code{mesh->diam} is used to select
  a range of world coordinates; in 1d, the range of the $y$-direction
  is set to $[-1,1]$; if both \code{world} and \code{mesh} are \nil, 
  the unit square $[0,1]\times[0,1]$ is displayed in 1d and 2d.

\kitem{graph\_close\_window(win)} closes the graphic window \code{win},
previously opened by the function \code{graph\_open\_window()}.

\kitem{graph\_clear\_window(win, c)} clears the graphic window 
\code{win} and sets the background color \code{c}; if \code{c}
is \nil, white is used as background color.

\kitem{graph\_mesh(win, mesh, c, flag)} displays the underlying 
\code{mesh} in the graphic window \code{win};
\code{c} is an optional color used for drawing lines, if \code{c} is \nil
black as a default color is used; the last argument
\code{flag} allows for a selection of an additional display; \code{flag}
may be \code{0} or the bitwise \textsf{OR} of some of the following flags:
\begin{descr}
\kitem{GRAPH\_MESH\_BOUNDARY}\cdx{GRAPH_MESH_BOUNDARY@{\code{GRAPH\_MESH\_BOUNDARY}}}
      only boundary edges are drawn, otherwise
      all edges of the triangulation are drawn;
      \code{c} is the display color for all edges if not \nil; otherwise
      the display color for Dirichlet boundary vertices/edges is
      blue and for Neumann vertices/edges the color is red; 
\kitem{GRAPH\_MESH\_ELEMENT\_MARK}\cdx{GRAPH_MESH_ELEMENT_MARK@{\code{GRAPH\_MESH\_ELEMENT\_MARK}}}
      triangles marked for refinement are filled red, and triangles marked for
      coarsening are filled blue, unmarked triangles are filled white;
\kitem{GRAPH\_MESH\_VERTEX\_DOF}\cdx{GRAPH_MESH_VERTEX_DOF@{\code{GRAPH\_MESH\_VERTEX\_DOF}}}
      the \emph{first\/}  DOF at each vertex is written near the vertex;
      currently only working in 2d when the library is not using OpenGL.
\kitem{GRAPH\_MESH\_ELEMENT\_INDEX}\cdx{GRAPH_MESH_ELEMENT_INDEX@{\code{GRAPH\_MESH\_ELEMENT\_INDEX}}}
     element indices are written inside the element, only available for
     \code{EL\_INDEX == 1};
     currently only working in 2d when the library is not using OpenGL.
\end{descr}

\kitem{graph\_drv(win, u, min, max, n\_refine)} displays the finite element
function stored in the \code{DOF\_REAL\_VEC} \code{u} in the graphic window 
\code{win}; in 1d, the graph
of $\code{u}$ is plotted in black, in 2d an iso-color display of \code{u}
is used; \code{min} and \code{max} specify a range of \code{u} which is 
displayed; if $\code{min} \geq \code{max}$, \code{min} and \code{max} of
\code{u} are computed by \code{graph\_drv()}; in 2d, coloring is adjusted
to the values of \code{min} and \code{max}; the display routine
always uses the linear interpolant on a simplex;  
if $\code{n\_refine} > 0$, each simplex is recursively bisected into 
$2^{\code{mesh->dim*n\_refine}}$ sub--simplices, and the linear interpolant
on these sub--simplices is displayed; for $\code{n\_refine} < 0$ the
default value \code{u->admin->bas\_fcts->degree-1} is used.

\kitem{graph\_drv\_d(win, v, min, max, n\_refine)} displays the
modulus of the vector valued finite element function stored in the
\code{DOF\_REAL\_D\_VEC} \code{v} in the graphic window \code{win};
the other arguments are the same as for \code{graph\_drv()}.

\kitem{graph\_el\_est(win, mesh, get\_el\_est)} displays
piecewise constant values over the triangulation \code{mesh}, 
like local error indicators, in the graphics window \code{win};
\code{get\_el\_est} is a pointer to a function which returns the 
constant value on each element; by this function the piecewise
constant function is defined.

\kitem{graph\_line(win, p0, p1, c, lw)} draws the line segment with
start point \code{p0} and end point \code{p1} in $(x,y)$ coordinates
in the graphic window \code{win}; \code{c} is an optional argument and
may specify the line color to be used; if \code{c} is \nil black is
used; \code{lw} specifies the linewidth (currently only for OpenGL
graphics); if $\code{lw} \leq 0$ the default linewidth \code{1.0} is
set.

\kitem{graph\_point(win, p, c, diam)} draws a point at the position \code{p}
in $(x,y)$ coordinates in the graphic window \code{win}; \code{c} is an
optional argument and may specify the color to be used; if \code{c} is \nil
black is used; \code{diam} specifies the drawing diameter (currently only for
OpenGL graphics); if $\code{diam} \leq 0$ the default diameter \code{1.0} is
set.

\kitem{graph\_points(win, np, p, c, diam)} draws a \code{np} points at the 
positions \code{p} in $(x,y)$ coordinates in the graphic window 
\code{win}; \code{c} is an
optional argument and may specify the color to be used; if \code{c} is \nil
black is used; \code{diam} specifies the drawing diameter (currently only for
OpenGL graphics); if $\code{diam} \leq 0$ the default diameter \code{1.0} is
set.
\end{descr}

\subsubsection{Graphic routines for two dimensions}\label{S:graph_2d}

The following routines are specialized routines for two dimensional
graphic output:
\fdx{graph_level_2d()@{\code{graph\_level\_2d()}}}
\idx{graphics routines!graph_level_2d()@{\code{graph\_level\_2d()}}}
\fdx{graph_levels_2d()@{\code{graph\_levels\_2d()}}}
\idx{graphics routines!graph_levels\_2d()@{\code{graph\_levels\_2d()}}}
\fdx{graph_level_d_2d()@{\code{graph\_level\_d\_2d()}}}
\idx{graphics routines!graph_level_d_2d()@{\code{graph\_level\_d\_2d()}}}
\fdx{graph_levels_d_2d()@{\code{graph\_levels\_d\_2d()}}}
\idx{graphics routines!graph_levels_d_2d()@{\code{graph\_levels\_d\_2d()}}}
\fdx{graph_fvalues_2d()@{\code{graph\_fvalues\_2d()}}}
\idx{graphics routines!graph_fvalues_2d()@{\code{graph\_fvalues\_2d()}}}
\bv\begin{verbatim}
void graph_level_2d(GRAPH_WINDOW, const DOF_REAL_VEC *, REAL,
                 const GRAPH_RGBCOLOR, int);
void graph_levels_2d(GRAPH_WINDOW, const DOF_REAL_VEC *, int, const REAL *,
                  const GRAPH_RGBCOLOR *, int);
void graph_level_d_2d(GRAPH_WINDOW, const DOF_REAL_D_VEC *, REAL,
                   const GRAPH_RGBCOLOR, int);
void graph_levels_d_2d(GRAPH_WINDOW, const DOF_REAL_D_VEC *, int, const REAL *,
                    const GRAPH_RGBCOLOR *, int);
void graph_fvalues_2d(GRAPH_WINDOW, MESH *, 
                      REAL (*)(const EL_INFO *, const REAL *),
                      FLAGS, REAL, REAL, int);
\end{verbatim}\ev

\begin{descr}
\kitem{graph\_level\_2d(win, v, level, c, n\_refine)} draws a single selected 
isoline at value \code{level} of the scalar finite element function
stored in the \code{DOF\_REAL\_VEC} \code{u} in the graphic window 
\code{win}; by the argument \code{c} a line color for the isoline can be
specified; if \code{c} is \nil, black is used as line color;
the display routine always uses the linear
interpolant of \code{u} on a simplex; if $\code{n\_refine} > 0$, each
triangle is recursively bisected into $2^{\code{2*n\_refine}}$
sub--triangles, and the selected isoline of the linear interpolant 
on these sub--triangles is displayed; for $\code{n\_refine} < 0$ the
default value \code{u->admin->bas\_fcts->degree-1} is used.

\kitem{graph\_levels\_2d(win, u, n, levels, c, n\_refine)} draws
\code{n} selected isolines at values \code{level[0]}, \dots, 
\code{level[n-1]} of the scalar finite element function
stored in the \code{DOF\_REAL\_VEC} \code{u} in the graphic window 
\code{win}; if \code{level} is \nil, \code{n} equally distant 
isolines between the minimum and maximum of \code{u} are selected;
\code{c} is an optional vector of \code{n} color values for the \code{n} 
isolines, if \nil, then default color values are used; the 
argument \code{n\_refine} again chooses a level of refinement,
where iso-lines of the piecewise linear interpolant is displayed;
for $\code{n\_refine} < 0$ the default value 
\code{u->admin->bas\_fcts->degree-1} is used.

\kitem{graph\_level\_d\_2d(win, v, level, c, n\_refine)} draws a single
selected isoline at values \code{level} of the modulus of a vector
valued finite element function stored in the \code{DOF\_REAL\_D\_VEC}
\code{v} in the graphic window \code{win}; the arguments are the same
as for \code{graph\_level()}.

\kitem{graph\_levels\_d\_2d(win, v, n, levels, c, n\_refine)} draws
\code{n} selected isolines at values \code{level[0]}, \dots, 
\code{level[n-1]} of the modulus of a vector valued finite element function
stored in the \code{DOF\_REAL\_D\_VEC} \code{v} in the graphic window 
\code{win}; the arguments are the same as for \code{graph\_levels()}.

\kitem{graph\_fvalues\_2d(win, mesh, f, flag, min, max, n\_refine)} displays 
the function \code{f} in the graphic window \code{win}; \code{f}
is a pointer to a function for evaluating values on single elements;
\code{f(el\_info, lambda)} returns the value of the function on
\code{el\_info->el} at the barycentric coordinates \code{lambda};

an iso-color display of \code{f} is used; \code{min} and \code{max} specify a 
range of \code{f} which is displayed; if $\code{min} \geq \code{max}$,
\code{min} and \code{max} of \code{f} are computed by
\code{graph\_fvalues\_2d()}; coloring is adjusted to the values of
\code{min} and \code{max}; the display routine always uses the linear
interpolant of \code{f} on a simplex; if $\code{n\_refine} > 0$, each
simplex is recursively bisected into $2^{\code{2*n\_refine}}$
sub--simplices, and the linear interpolant on these sub--simplices is
displayed.
\end{descr}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{gltools interface}\label{S:graph_gltools}%
\idx{gltools graphics|(}

The following interface for using the interactive gltools graphics of
WIAS Berlin \cite{gltools} is implemented. The gltools are freely
available under the  terms of the MIT license, see

\begin{flushleft}
\url{http://www.wias-berlin.de/software/gltools/}
\end{flushleft}

The \ALBERTA interface to the gltools is compatible with version
\code{gltools-2-4}.  It can be used for 1d, 2d, and 3d triangulation,
but only when \code{mesh->dim} equals \code{DIM\_OF\_WORLD}. For window
identification we use the data type
\idx{gltools graphics!GLTOOLS_WINDOW@{\code{GLTOOLS\_WINDOW}}}%
\ddx{GLTOOLS_WINDOW@{\code{GLTOOLS\_WINDOW}}}%
\idx{graphics routines!GLTOOLS_WINDOW@{\code{GLTOOLS\_WINDOW}}}%
\bv\begin{verbatim}
typedef void*    GLTOOLS_WINDOW;
\end{verbatim}\ev
The interface provides the following functions:
\fdx{open_gltools_window()@{\code{open\_gltools\_window()}}}%
\idx{gltools graphics!open_gltools_window()@{\code{open\_gltools\_window()}}}%
\idx{graphics routines!open_gltools_window()@{\code{open\_gltools\_window()}}}%
\fdx{close_gltools_window()@{\code{close\_gltools\_window()}}}%
\idx{gltools graphics!close_gltools_window()@{\code{close\_gltools\_window()}}}%
\idx{graphics routines!close_gltools_window()@{\code{close\_gltools\_window()}}}%
\idx{gltools graphics!gltools_mesh()@{\code{gltools\_mesh()}}}%
\idx{graphics routines!gltools_mesh()@{\code{gltools\_mesh()}}}%
\fdx{gltools_mesh()@{\code{gltools\_mesh()}}}%
\idx{gltools graphics!gltools_drv()@{\code{gltools\_drv()}}}%
\idx{graphics routines!gltools_drv()@{\code{gltools\_drv()}}}%
\fdx{gltools_drv()@{\code{gltools\_drv()}}}%
\idx{gltools graphics!gltools_drv_d()@{\code{gltools\_drv\_d()}}}%
\idx{graphics routines!gltools_drv_d()@{\code{gltools\_drv\_d()}}}%
\fdx{gltools_drv_d()@{\code{gltools\_drv\_d()}}}%
\idx{gltools graphics!gltools_vec()@{\code{gltools\_vec()}}}%
\idx{graphics routines!gltools_vec()@{\code{gltools\_vec()}}}%
\fdx{gltools_vec()@{\code{gltools\_vec()}}}%
\idx{gltools graphics!gltools_est()@{\code{gltools\_est()}}}%
\idx{graphics routines!gltools_est()@{\code{gltools\_est()}}}%
\fdx{gltools_est()@{\code{gltools\_est()}}}%
\idx{gltools graphics!gltools_disp_mesh()@{\code{gltools\_disp\_mesh()}}}%
\idx{graphics routines!gltools_disp_mesh()@{\code{gltools\_disp\_mesh()}}}%
\fdx{gltools_disp_mesh()@{\code{gltools\_disp\_mesh()}}}%
\idx{gltools graphics!gltools_disp_drv()@{\code{gltools\_disp\_drv()}}}%
\idx{graphics routines!gltools_disp_drv()@{\code{gltools\_disp\_drv()}}}%
\fdx{gltools_disp_drv()@{\code{gltools\_disp\_drv()}}}%
\idx{gltools graphics!gltools_disp_drv_d()@{\code{gltools\_disp\_drv\_d()}}}%
\idx{graphics routines!gltools_disp_drv_d()@{\code{gltools\_disp\_drv\_d()}}}%
\fdx{gltools_disp_drv_d()@{\code{gltools\_disp\_drv\_d()}}}%
\idx{gltools graphics!gltools_disp_vec()@{\code{gltools\_disp\_vec()}}}%
\idx{graphics routines!gltools_disp_vec()@{\code{gltools\_disp\_vec()}}}%
\fdx{gltools_disp_vec()@{\code{gltools\_disp\_vec()}}}%
\idx{gltools graphics!gltools_disp_est()@{\code{gltools\_disp\_est()}}}%
\idx{graphics routines!gltools_disp_est()@{\code{gltools\_disp\_est()}}}%
\fdx{gltools_disp_est()@{\code{gltools\_disp\_est()}}}%
\bv\begin{verbatim}
GLTOOLS_WINDOW open_gltools_window(const char *, const char *, const REAL *,
                                   MESH *, int);
void close_gltools_window(GLTOOLS_WINDOW);

void gltools_mesh(GLTOOLS_WINDOW, MESH *, int);
void gltools_drv(GLTOOLS_WINDOW, const DOF_REAL_VEC *, REAL, REAL);
void gltools_drv_d(GLTOOLS_WINDOW, const DOF_REAL_D_VEC *, REAL, REAL);
void gltools_vec(GLTOOLS_WINDOW, const DOF_REAL_D_VEC *, REAL, REAL);
void gltools_est(GLTOOLS_WINDOW, MESH *, REAL (*)(EL *), REAL, REAL);

void gltools_disp_mesh(GLTOOLS_WINDOW, MESH *, int, const DOF_REAL_VEC *);
void gltools_disp_drv(GLTOOLS_WINDOW, const DOF_REAL_VEC *, REAL, REAL,
                      const DOF_REAL_VEC *);
void gltools_disp_drv_d(GLTOOLS_WINDOW, const DOF_REAL_D_VEC *, REAL, REAL,
                      const DOF_REAL_VEC *);
void gltools_disp_vec(GLTOOLS_WINDOW, const DOF_REAL_D_VEC *, REAL, REAL,
                      const DOF_REAL_VEC *);
void gltools_disp_est(GLTOOLS_WINDOW, MESH *, REAL (*)(EL *), REAL, REAL,
                      const DOF_REAL_VEC *);
\end{verbatim}\ev
Description:
\begin{descr}
\kitem{open\_gltools\_window(title, geometry, world, mesh, dialog)}
       the function re\-turns a \code{GLTOOLS\_WINDOW} which is opened
       for display; if the window could not be opened, the return value
       is \nil; \code{title} is an optional string holding a title
       for the window; if \code{title} is \nil, a default is used;
       \code{geometry} is an optional string holding the window
       geometry in X11 format (``WxH'' or ``WxH+X+Y''), if \nil, a
       default geometry is used; the optional argument \code{world} is
       a pointer to an array of \emph{world coordinates} (xmin, xmax,
       ymin, ymax) for 2d and (xmin, xmax, ymin, ymax, zmin, zmax) for
       3d, it can be used to specify which part of the mesh will be
       displayed in the window; if \code{world} is \nil, either
       \code{mesh} or the default domain $[0,1]^{d}$ is used;
       \code{mesh} is an optional pointer to a mesh to select a range
       of world coordinates which will be displayed in the window; if
       both \code{world} and \code{mesh} are \nil, the default domain
       $[0,1]^{d}$ is used; display is not done or is done in
       an interactive mode depending on whether \code{dialog} equals \code{0}
       or not; in interactive mode type \code{'h'} to get a list of
       all key bindings;
\kitem{close\_gltools\_window(win)} closes the window \code{win}
        which has been previously opened by \code{open\_gltools\_window()};
\kitem{gltools\_mesh(win, mesh, mark)} displays the elements of \code{mesh} in
       the graphic window \code{win}; if \code{mark} is not zero 
       the piecewise constant function sign(\code{el->mark}) is
       shown;
       
\kitem{gltools\_drv(win, u, min, max)} displays the
       \code{DOF\_REAL\_VEC} \code{u} in the graphic window
       \code{win}; for higher order elements it is possible to display
       the vector on a refined grid; the key \code{'P'} toggles
       between refined and not refined mode; \code{min} and \code{max}
       define the range of the discrete function for display; if
       \code{min} $\geq$ \code{max} this range is adjusted
       automatically;

\kitem{gltools\_drv\_d(win, ud, min, max)} displays the modulus of the
       \code{DOF\_REAL\_D\_VEC} \code{ud} in the graphic window
       \code{win}; for higher order elements it is possible to display
       the vector on a refined grid; the key \code{'P'} toggles
       between refined and not refined mode; \code{min} and \code{max}
       define the range of the modulus of discrete function for display; if
       \code{min} $\geq$ \code{max} this range is adjusted
       automatically;

\kitem{gltools\_vec(win, ud, min, max)} displays the vector field given by
       \code{DOF\_REAL\_D\_VEC} \code{ud} in the graphic window
       \code{win}; for higher order elements it is possible to display
       the vector on a refined grid; the key \code{'P'} toggles
       between refined and not refined mode; \code{min} and \code{max}
       define the range of the modulus of discrete function for display; if
       \code{min} $\geq$ \code{max} this range is adjusted
       automatically;

\kitem{gltools\_est(win, mesh, get\_el\_est, min, max)} displays the 
       estimated error on \code{mesh} as a piecewise constant function
       in the graphic window \code{win}; the local indicators are accessed by
       \code{get\_el\_est()} on each element;
       \code{min} and \code{max} define the range for display; 
       if \code{min} $\geq$ \code{max} this range is adjusted automatically;

       \code{gltools\_est()} can also be used to display any piecewise
       constant function on the mesh, where local values are accessed by
       \code{get\_el\_est()};

\kitem{gltools\_disp\_mesh(win, mesh, mark, disp)} 
       additionally to \code{gltools\_mesh()}, a distortion of the
       geometry by a displacement vector field 
       \code{DOF\_REAL\_D\_VEC} \code{disp} is shown; this can be used in
       solid mechanics applications, e.g.;
\kitem{gltools\_disp\_drv(win, u, min, max, disp)} 
       similar to  \code{gltools\_drv()} but displayed on the 
       distorted geometry given by \code{DOF\_REAL\_D\_VEC} \code{disp};
\kitem{gltools\_disp\_drv\_d(win, ud, min, max, disp)} 
       similar to \code{gltools\_drv\_d()} but displayed on the 
       distorted geometry given by \code{DOF\_REAL\_D\_VEC} \code{disp};
\kitem{gltools\_disp\_vec(win, ud, min, max, disp)}
       similar to the function \code{gltools\_vec()} but displayed on the 
       distorted geometry given by \code{DOF\_REAL\_D\_VEC} \code{disp};
\kitem{gltools\_disp\_est(win, mesh, get\_el\_est, min, max, disp)}
       similar to the function \code{gltools\_est()} but displayed on the 
       distorted geometry given by \code{DOF\_REAL\_D\_VEC} \code{disp}.
 \end{descr}%
\idx{gltools graphics|)}

\subsection{GRAPE interface}\label{S:graph_GRAPE}%
\idx{GRAPE interface|(}

Visualization using the GRAPE library \cite{Grape} is only possible as
a post--processing step.  Data of the actual geometry and finite
element functions is written to file by \code{write\_mesh[\_xdr]()}
and \code{write\_dof\_real[\_d]\_vec[\_xdr]()} and then read by some
programs, using the GRAPE mesh interface for the visualization.  We
recommend using the \code{xdr} routines for portability of the stored
binary data.  The use of the GRAPE $h$--mesh and $hp$--mesh interfaces
is work in progress and the description of these programs will be done
in the near future.  References to visualization methods used in GRAPE
applying to \ALBERTA can be found in \cite{HORSS:03,RSS:95b,RSS:96}.

For obtaining the GRAPE library, please see
\begin{flushleft}
\url{http://www.iam.uni-bonn.de/sfb256/grape/}
\end{flushleft}

\idx{alberta_grape@{\code{alberta\_grape}}}
\idx{GRAPE interface!alberta_grape@{\code{alberta\_grape}}}
\idx{alberta_movi@{\code{alberta\_movi}}}
\idx{GRAPE interface!alberta_movi@{\code{alberta\_movi}}}
%%
The distribution of \ALBERTA contains source files with the
implementation of GRAPE mesh interface to \ALBERTA in the
\code{add\_ons/grape/} subdirectory. Having access to the GRAPE
library (Version 5.4.2), this interface can be compiled and linked
with the \ALBERTA and GRAPE library into the executables
\code{alberta\_grape??} and \code{alberta\_movi??}, where the
two-digit suffix \code{??} codes for the mesh-dimension and
\code{DIM\_OF\_WORLD}. Currently, however, only co-dimension $0$
versions in 2d and 3d are available.  The path of the GRAPE header
file and library has to be specified during the installation of
\ALBERTA, compare Section~\ref{S:install}.

The presence of the GRAPE library and header-file is determined at
configure time. If it is found, then the four GRAPE-programs are
compiled automatically when running \code{make} in the top-level
directory of the \ALBERTA distribution and installed below
\code{PREFIX/bin/} running \code{make install}

The program \code{alberta\_grape??} is mainly designed for displaying
finite element data on a single grid, i.\,e. one or several
scalar/vector-valued finite element functions on the corresponding
mesh.  \code{alberta\_grape??}  expects mesh data stored by
\code{write\_mesh[\_xdr]()} and \code{write\_dof\_real[\_xdr]()} or
\code{write\_dof\_real\_d[\_xdr]()} defined on the same mesh.
\bv\begin{lstlisting}
 alberta_grape22 -m mesh.xdr -s scalar.xdr -v vector.xdr
\end{lstlisting}\ev
will display the 2d mesh stored in the file \code{mesh.xdr} 
together with the scalar finite element function stored in 
\code{scalar.xdr} and the vector valued finite element function
stored in \code{vector.xdr}.

\code{alberta\_grape?? --help} gives some online-help, including a
short example:
%%
\bv\begin{verbatim}
jane_john_doe@street ~ $ 
jane_john_doe@street ~ $ alberta_grape33 --help
Usage: alberta_grape33 [-p PATH] [OPTIONS]
          -m  MESH [-s DRV] [-v DRDV] [[-m MESH1] [-s DRV1] [-v DRDV1] ...]

Example:
 alberta_grape33 --mesh=mymesh -s temperature --vector velocity

    where "mymesh", "temperature" and "velocity" are file-names.

If a long option shows an argument as mandatory, then it is mandatory
for the equivalent short option also.  Similarly for optional arguments.

The order of the options _is_ significant in the following cases:
`-p PATH' alters the search path for all following data-files.
`-m MESH' specifies a new mesh for all following DRVs and DRDVs (see below)

Options:
  -m, --mesh=MESH
            The file-name of an ALBERTA-mesh gnereated by the ALBERTA
            library routines `write_mesh()' or `write_mesh_xdr()'
            `-x' and `-b' options below.
            This option is mandatory and may not be omitted. This option
            may be specified multiple times. All following dof-vectors
            given by the `-s' and `-v' options must belong to the most
            recently specified mesh.
  -b, --binary
            Expect MESH, DRV and DRDV to contain data in host dependent
            byte-order, generated by `write_SOMETHING()' routines of the
            ALBERTA library (SOMETHING is `mesh', `dof_real_vec' etc.
  -x, --xdr
            This is the default and just mentioned here for completeness.
            Expect MESH, DRV and DRDV to contain data in network
            byte-order, generated by `write_SOMETHING_xdr()' routines
            of the ALBERTA library. Per convention this means big-endian
            byte-order.
  -s, --scalar=DRV
            Load the data-file DRV which must contain a DOF_REAL_VEC
            dumped to disk by `write_dof_real_vec[_xdr]()'.
            This option may be specified multiple times. The DOF_REAL_VECs
            must belong to the most recently specified mesh.
            See `-m' and `-b' above.
  -v, --vector=DRDV
            Load the data-file DRDV which must contain a DOF_REAL_VEC_D
            dumped to disk by `write_dof_real_d_vec[_xdr]()'.
            This option may be specified multiple times. The vector
            must belong to the most recently specified mesh.
            See `-m' and `-b' above.
  -p, --path=PATH
            Specify a path prefix for all following data-files. This option
            may be specified multiple times. PATH is supposed to be the
            directory containing all data-files specified by the following
            `-m', `-s' and `-v' options.
  -h, --help
            Print this help.
\end{verbatim}\ev

The program \code{alberta\_movi??} is designed for displaying finite
element data on a sequence of grids with one or several
scalar/vector-valued finite element functions. This is the standard
visualization tool for post--processing data from time--dependent
simulations. \code{alberta\_movi??}
expects a sequence of mesh data stored by \code{write\_mesh[\_xdr]()} and
finite element data of this mesh stored by
\code{write\_dof\_real[\_xdr]()} or
\code{write\_dof\_real\_d[\_xdr]()},
where the filenames for the sequence of meshes and finite element
functions are generated by the function \code{generate\_filename()},
explained in \secref{S:generate_filename}. Section~\ref{S:heat_timestep}
shows how to write such a sequence of data in a time-dependent
problem. 

Similar to \code{alberta\_grape??} the command
\code{alberta\_movi?? --help} gives some online-help:
%%
\bv\begin{verbatim}
jane_john_doe@street ~ $ 
jane_john_doe@street ~ $ alberta_movi33 --help
Usage: alberta_movi33 START END [-p PATH] [OPTIONS]
          -m  MESH [-s DRV] [-v DRDV] [[-s DRV1] [-v DRDV1] ...]

Example:
  alberta_movi33 --mesh=mymesh 0 10 -i 5 -s u_h --vector v_h

  reads grid mesh000000 with scalar function u_h000000 and
  vector function v_h000000, then mesh000005 with u_h000005 and
  v_h000005, and finally mesh000010 with u_h000010 and v_h000010

If a long option shows an argument as mandatory, then it is mandatory
for the equivalent short option also.  Similarly for optional arguments.

The order of the options is not significant with the exception that the
non-option arguments START and END must come _first_.

Non-option arguments:
  START END
            Two integers specifying the start- and end-scene. The actual
            file names of the data-files are generated by appending a six
            digit number which loops between START and END.
            See also `-i' below.
Options:
  -i, --increment=INC
            INC is an integers specifying the increment while reading in
            the time scenes. To read e.g. only every second time-scene
            use `-i 2'. INC defaults to 1
  -m, --mesh=MESH
            The file-name prefix of an ALBERTA-mesh gnereated by the ALBERTA
            library routines `write_mesh()' or `write_mesh_xdr()'
            `-x' and `-b' options below. The actual file name is generated
            by appending a six digit time-scene number to MESH, unless
            the `-f' option is also specified, see below.
            This option is mandatory and may not be omitted.
  -f, --fixed-mesh
            Use a single fixed mesh for all time-scenes (i.e. in the
            non-adaptive case). If `-f' is used `-m MESH' gives the actual
            file name of the mesh and not only the mesh-prefix. See `-m'
            above.
  -s, --scalar=DRV
            Load the data-files DRVXXXXXX which must contain DOF_REAL_VECs
            dumped to disk by `write_dof_real_vec[_xdr]()'.
            `XXXXXX' stands for the time-scene number.
            This option may be specified multiple times. The DOF_REAL_VECs
            must belong to the meshes specified with the `-m' option.
            See `-m', `-b', `-p' and `-i'.
  -v, --vector=DRDV
            Load the data-files DRDVXXXXXX which contain DOF_REAL_VEC_Ds
            dumped to disk by `write_dof_real_d_vec[_xdr]()'.
            `XXXXXX' stands for the time-scene number.
            This option may be specified multiple times. The vectors
            must belong to the meshes specified with the `-m' option.
            See `-m', `-b', `-p' and `-i'.
  -p, --path=PATH
            Specify a path prefix for all data-files. PATH is supposed to
            be the directory containing all data-files specified by the
            `-m', `-s' and `-v' options.
  -B, --Bar
            Generate a time-progress-bar when displaying the data in GRAPE.
  -b, --binary
            Expect MESH, DRV and DRDV to contain data in host dependent
            byte-order, generated by `write_SOMETHING()' routines of the
            ALBERTA library (SOMETHING is `mesh', `dof_real_vec' etc.
  -x, --xdr
            This is the default and just mentioned here for completeness.
            Expect MESH, DRV and DRDV to contain data in network
            byte-order, generated by `write_SOMETHING_xdr()' routines
            of the ALBERTA library. Per convention this means big-endian
            byte-order.
  -h, --help
            Print this help.
\end{verbatim}\ev

\idx{GRAPE interface|)}

\subsection{Paraview interface}
\label{S:graph_paraview}
\label{S:graph_Paraview}
\idx{Paraview interface|(}
%%
The Paraview interface (\url{http://www.paraview.org/}) -- like the
GRAPE-interface -- is available as a set of separate programs which
can be used to display finite element data in a post-processing step.
The corresponding programs do not require any support package and are
always compiled when running \code{make} and installed below
\code{PREFIX/bin/} when running \code{make install}. The programs are
named \code{alberta2paraview2d} and \code{alberta2paraview3d}. The
calling convention is somewhat similar to the GRAPE support-programs,
and running the programs with the \code{--help} command-line switch
displays an online-help, including some simple examples:
%%
\bv\begin{verbatim}
jane_john_doe@street ~ $ 
jane_john_doe@street ~ $ alberta2paraview3d --help
Usage: alberta2paraview3d [-t FIRST LAST] [-i STEP] [-p PATH] [-o OUTPUT]
          -m  MESH [-s DRV] [-v DRDV] [[-m MESH1] [-s DRV1] [-v DRDV1] ...]

Example for converting stationary data:
  alberta2paraview3d \
       -r lagrange_degree --mesh mymesh -s temperature --vector velocity
    where "mymesh", "temperature" and "velocity" are file-names.

Example for converting a sequence of files resulting from a transient
problem:
  alberta2paraview3d -t 0 10 -i 5 -p PATH --mesh mymesh -s u_h --vector v_h

  reads grid mymesh000000 with scalar function u_h000000 and
  vector function v_h000000, then mesh000005 with u_h000005 and
  v_h000005, and finally mesh000010 with u_h000010 and v_h000010

If a long option shows an argument as mandatory, then it is mandatory
for the equivalent short option also.  Similarly for optional arguments.

The order of the options _is_ significant in the following cases:
`-p PATH' alters the search path for all following data-files.
`-m MESH' specifies a new mesh for all following DRVs and DRDVs (see below)
`-b|-x'   alters the expected data-format for all following files
          (see below)

Options:
  -t, --transient FIRST LAST
            Convert a sequence of mesh- and data-files. The file-names
            must end with 6-digit decimal number. FIRST and LAST specify the
            first and last member of this sequence.
  -i, --interval SKIP
            In conjunction with `-t' use only every SKIP-th frame in the
            given sequence of files.
  -m, --mesh MESH
            The file-name of an ALBERTA-mesh gnereated by the ALBERTA
            library routines `write_mesh()' or `write_mesh_xdr()'
            `-x' options below.
            This option is mandatory and may not be omitted. This option
            may be specified multiple times. All following dof-vectors
            given by the `-s' and `-v' options must belong to the most
            recently specified mesh.
  -a, --ascii
            Write the paraview file in ASCII format.
  -r, --refined LAGRANGE-DEGREE
            Expect Lagrange-degree (between 0 and 4) to refine the given
            MESH
            To select 'no refinement' simply do not specify `--refined',
            'Lagrange-degree = 0' is the default.
  -u, --unperforated
            For a 3d mesh refine without holes (produces a lot more
            elements). To select mesh-refine with holes simply do not
            specify `--unperforated' (refinement with holes is the default).
  -b, --binary
            Write the paraview file in binary format.
            To select ASCII OUTPUT format simply do not specify `--binary',
            because ASCII OUTPUT format is the default.
  -x, --xdr
            This is the default and just mentioned here for completeness.
            Expect MESH, DRV and DRDV to contain data in network
            byte-order, generated by `write_SOMETHING_xdr()' routines
            of the ALBERTA library. Per convention this means big-endian
            byte-order. '-l' and '-x' may be specified multiple times.

  -l, --legacy
            Expect MESH, DRV and DRDV to contain data in ALBERTA's
            legacy file-format, generated by `write_SOMETHING()' routines
            of the ALBERTA library. This may not work, because the format
            of those data-files is byte-order dependent and thus not portable
            across different computer architectures. '-l' and '-x' may be
            specified multiple times.
  -s, --scalar DRV
            Load the data-file DRV which must contain a DOF_REAL_VEC
            dumped to disk by `write_dof_real_vec[_xdr]()'.
            This option may be specified multiple times. The DOF_REAL_VECs
            must belong to the most recently specified mesh.
            See `-m' above.
  -v, --vector DRDV
            Load the data-file DRDV which must contain a DOF_REAL_VEC_D
            dumped to disk by `write_dof_real_d_vec[_xdr]()'.
            This option may be specified multiple times. The vector
            must belong to the most recently specified mesh.
            See `-m' above.
  -o, --output FILENAME
            Specify an output file-name. If this option is omitted, then the
            output file-name is"alberta".
  -d, --pvd_output FILENAME
            Specify an pvd_output file-name,in conjuncion with'-t'.
             "alberta_paraview_movi"is the default
  -p, --path PATH
            Specify a path prefix for all following data-files. This option
            may be specified multiple times. PATH is supposed to be the
            directory containing all data-files specified by the following
            `-m', `-s' and `-v' options.
  -h, --help
            Print this help.

\end{verbatim}\ev
%%
\idx{Paraview interface|)}%

\subsection{Geomview interface}
\label{S:graph_Geomview}
\idx{Geomview interface|(}
%%
Geomview (\url{http://www.geomview.org/}) is a quite ancient rendering
engine, originally developed by the Geometry Center
(\url{http://www.geom.uiuc.edu/}). It is easy to use, but as such not
a visualization tool for finite element data, and mainly aiming at
displaying 2-surfaces. Currently, Geomview is the only way to directly
visualize 2d and 3d simulations with co-dimension larger than $1$,
respectively $0$. The suite of demo-programs contains a rudimentary
interface to Geomview, the use is demonstrated in the demo-programs
using parametric meshes, like \code{src/Common/ellipt-sphere.c}.
%%
\idx{Geomview interface|)}%

\subsection{GMV interface}
\label{S:graph_GMV}%
\idx{GMV interface|(}

A second possibility to visualize \ALBERTA meshes and vectors as a 
post--processing step is to use the General Mesh Viewer (GMV) developed 
at the Los Alamos National Laboratories. For information on how to obtain
this program see
\begin{flushleft}
\url{http://www-xdiv.lanl.gov/XCM/gmv/GMVHome.html}
\end{flushleft}
GMV is a standalone program and support for the GMV interface in \ALBERTA 
is always built in. At the moment, this interface is the only one which 
supports all of the following features: embedded meshes 
(\code{mesh->dim < DIM\_OF\_WORLD}), parametric meshes, generation of movie
sequences, reusing meshes for several vectors to reduce disk space, and 
several more. The \ALBERTA interface was written for GMV 4.0.

The interface contains the following functions:

\fdx{write_mesh_gmv()@{\code{write\_mesh\_gmv()}}}
\idx{graphics routines!write_mesh_gmv()@{\code{write\_mesh\_gmv()}}}
\fdx{write_dof_vec_gmv()@{\code{write\_dof\_vec\_gmv()}}}
\idx{graphics routines!write_dof_vec_gmv()@{\code{write\_dof\_vec\_gmv()}}}
\bv\begin{verbatim}
int write_mesh_gmv(MESH *, const char *, int, int, const int, 
                   DOF_REAL_VEC **, const int, DOF_REAL_D_VEC **,
                   DOF_REAL_D_VEC *, REAL)

int write_dof_vec_gmv(MESH *, const char *, const char *, int, int, const int,
                      DOF_REAL_VEC **drv_ptr, const int, DOF_REAL_D_VEC **,
                      DOF_REAL_D_VEC *, REAL);
\end{verbatim}\ev
Description:
\begin{descr}
\kitem{write\_mesh\_gmv(mesh,name,asc,ref,n\_drv,drvs,n\_drdv,drdvs,vel,time)}
Writes an \ALBERTA triangulation and DOF vectors into a file \code{name} 
readable by the GMV program. The parameter \code{asc}, if set to \true
directs \ALBERTA to write the data in GMV ASCII format, otherwise a native
binary format is used. The triangulation is stored in \code{mesh}. The 
parameters \code{n\_drv} and \code{n\_drdv} state the number of 
\code{DOF\_REAL\_VEC}s and \code{DOF\_REAL\_D\_VEC}s to store in the file. 
These vectors are passed as arrays of pointers \code{drvs} and \code{drdvs}.
At the moment there is a limit of 250 vectors of either type which may 
be written at once. The additional argument \code{vel} is used for one 
\code{DOF\_REAL\_D\_VEC} which has the meaning of a velocity field. This 
results in a special treatment by GMV; GMV will automatically create a 
new field storing the velocity magnitudes on reading the file. The 
argument \code{time} stores a time value for instationary simulations.

As most other visualization packages, GMV
is only able to display linear data. To alleviate this problem, the parameter 
\code{ref}, if set to \true, directs the interface to output
a virtually refined triangulation to avoid loss of data when visualizing 
higher order Lagrange DOF vectors. This only works for Lagrange finite 
element spaces.
\kitem{write\_dof\_vec\_gmv(mesh,mfile,name,asc,ref,n\_drv,drvs,n\_drdv,drdvs,vel,time)}
This routine works in a similar way as \code{write\_mesh\_gmv()}. The only 
difference is that the mesh triangulation is not output into the file. Instead,
\ALBERTA generates a GMV file containing a reference to another GMV file 
\code{mfile} containing the mesh. The mesh file must have been output 
previously using \code{write\_mesh\_gmv()}. No refinement or coarsening must
occur between these calls, otherwise GMV will be unable to use the old mesh.

The advantage of this is that disk space is saved, since there is no need to 
repeatedly write entire mesh triangulations for instationary simulations 
without mesh changes. This also saves time on reading the GMV file.
\end{descr}
\idx{GMV interface|)}%
\idx{graphics routines|)}


%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "alberta-man"
%%% End: