1 /***********************************************************************
2 *
3 *               *****   ***    ***
4 *                  *   *   *  *   *
5 *                 *     ***    ***
6 *                *     *   *  *   *
7 *               *****   ***    ***
8 *
9 * A FREE Finite Elements Analysis Program in ANSI C for the Windows &
10 * the UNIX OS.
11 *
12 * Composed and edited and copyright by
13 * Professor Dr.-Ing. Frank Rieg, University of Bayreuth, Germany
14 *
15 * eMail:
16 * frank.rieg@uni-bayreuth.de
17 * dr.frank.rieg@t-online.de
18 *
19 * V15.0  November 18, 2015
20 *
21 * This program is free software; you can redistribute it and/or modify
22 * it under the terms of the GNU General Public License as published by
23 * the Free Software Foundation; either version 2, or (at your option)
24 * any later version.
25 *
26 * This program is distributed in the hope that it will be useful,
27 * but WITHOUT ANY WARRANTY; without even the implied warranty of
28 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
29 * GNU General Public License for more details.
30 *
31 * You should have received a copy of the GNU General Public License
32 * along with this program; see the file COPYING.  If not, write to
33 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
34 ***********************************************************************/
35 /**********************************************************
36 *  Compilerunit M12.C enthaelt:
37 *  tet188  mit Licht
38 *  tet288  mit Spannungen, Eckknoten
39 *  tet388  Hidden Line
40 *  tet488  mit Spannungen, Elemente
41 *  18.11.2015 RIEG
42 **********************************************************/
43 
44 /*----------------------------------------------------------------------
45 * Windows
46 *---------------------------------------------------------------------*/
47 #ifdef FR_WIN
48 #include <z88o.h>
49 #include <windows.h>
50 #include <commctrl.h>
51 #include <gl\gl.h>
52 #include <stdio.h>    /* fprintf,fgets,sscanf */
53 #endif
54 
55 /*----------------------------------------------------------------------
56 * UNIX
57 *---------------------------------------------------------------------*/
58 #ifdef FR_UNIX
59 #include <z88o.h>
60 #include <stdio.h>    /* fprintf,fgets,sscanf */
61 #include <GL/gl.h>
62 #include <GL/glx.h>
63 #endif
64 
65 /***********************************************************************
66 * hier beginnt Function tet188: mit Licht
67 ***********************************************************************/
tet188(void)68 int tet188(void)
69 {
70 extern FR_DOUBLEAY xv;
71 extern FR_DOUBLEAY yv;
72 extern FR_DOUBLEAY zv;
73 
74 extern FR_DOUBLE   xe[];
75 extern FR_DOUBLE   ye[];
76 extern FR_DOUBLE   ze[];
77 
78 extern FR_DOUBLE   vx[];
79 extern FR_DOUBLE   vy[];
80 extern FR_DOUBLE   vz[];
81 
82 extern FR_INT4AY   ityp;
83 extern FR_INT4AY   koi;
84 extern FR_INT4AY   koffs;
85 
86 extern FR_INT4     ne;
87 
88 FR_DOUBLE ax,ay,az,bx,by,bz;
89 
90 FR_INT4            i,j;
91 
92 /***********************************************************************
93 * Schleife ueber alle Elemente
94 ***********************************************************************/
95 for (i= 1; i <= ne; i++)
96   {
97 
98 /*----------------------------------------------------------------------
99 * Stab 4 u. 9, Balken 2 und 13, Welle 5, Balken 25
100 *---------------------------------------------------------------------*/
101   if(ityp[i] == 4 || ityp[i] == 9  ||
102      ityp[i] == 2 || ityp[i] == 13 ||
103      ityp[i] == 5 || ityp[i] == 25)
104     {
105 
106 /*======================================================================
107 * die zwei Eck-Punkte fuer jeden Stab holen
108 *=====================================================================*/
109     for (j= 1; j <= 2; j++)
110       {
111       xe[j]= xv[koi[koffs[i]+j-1]];
112       ye[j]= yv[koi[koffs[i]+j-1]];
113       ze[j]= zv[koi[koffs[i]+j-1]];
114       }
115 
116 /*======================================================================
117 * ... und rendern
118 *=====================================================================*/
119     glBegin(GL_LINES);
120       glVertex3d( xe[1],ye[1],ze[1]);
121       glVertex3d( xe[2],ye[2],ze[2]);
122     glEnd();
123     }  /* Stab 4 u. 9, Balken 2 und 13, Welle 5, Balken 25 */
124 
125 /*----------------------------------------------------------------------
126 * Scheibe 7,Torus 8,Scheibe 11,Torus 12 u.Platte 19 u. 20, Schale 23
127 *---------------------------------------------------------------------*/
128   if(ityp[i] == 7  || ityp[i] == 8  ||
129      ityp[i] == 11 || ityp[i] == 12 ||
130      ityp[i] == 19 || ityp[i] == 20 || ityp[i] == 23)
131     {
132 
133 /*======================================================================
134 * die vier Eck-Punkte fuer jede Scheibe oder Platte holen
135 *=====================================================================*/
136   if(ityp[i] != 19)
137     {
138     for (j= 1; j <= 4; j++)
139       {
140       xe[j]= xv[koi[koffs[i]+j-1]];
141       ye[j]= yv[koi[koffs[i]+j-1]];
142       ze[j]= zv[koi[koffs[i]+j-1]];
143       }
144     }
145   else
146     {
147     xe[1]= xv[koi[koffs[i]]];
148     ye[1]= yv[koi[koffs[i]]];
149     ze[1]= zv[koi[koffs[i]]];
150 
151     xe[2]= xv[koi[koffs[i]+12]];
152     ye[2]= yv[koi[koffs[i]+12]];
153     ze[2]= zv[koi[koffs[i]+12]];
154 
155     xe[3]= xv[koi[koffs[i]+15]];
156     ye[3]= yv[koi[koffs[i]+15]];
157     ze[3]= zv[koi[koffs[i]+15]];
158 
159     xe[4]= xv[koi[koffs[i]+3]];
160     ye[4]= yv[koi[koffs[i]+3]];
161     ze[4]= zv[koi[koffs[i]+3]];
162     }
163 
164 /*======================================================================
165 * den Normalenvektor bestimmen
166 *=====================================================================*/
167     /* erster Vektor */
168     ax= xe[2]-xe[1];
169     ay= ye[2]-ye[1];
170     az= ze[2]-ze[1];
171 
172     /* zweiter Vektor */
173     bx= xe[4]-xe[1];
174     by= ye[4]-ye[1];
175     bz= ze[4]-ze[1];
176 
177     /* Kreuzprodukt */
178     vx[1]= ay*bz-by*az;
179     vy[1]= az*bx-bz*ax;
180     vz[1]= ax*by-bx*ay;
181 
182 /*======================================================================
183 * ... und rendern
184 *=====================================================================*/
185     glBegin(GL_QUADS);
186       glNormal3d( vx[1],vy[1],vz[1]);
187       glVertex3d( xe[1],ye[1],ze[1]);
188       glVertex3d( xe[2],ye[2],ze[2]);
189       glVertex3d( xe[3],ye[3],ze[3]);
190       glVertex3d( xe[4],ye[4],ze[4]);
191     glEnd();
192     }  /* Scheibe 7,11,Torus 8,12 u.Platte 19 u.20, Schale 23 */
193 
194 /*----------------------------------------------------------------------
195 * Scheibe 3, Torus 6, Scheibe 14, Torus 15, Platte 18, Schale 24
196 *---------------------------------------------------------------------*/
197   if(ityp[i] == 3  || ityp[i] == 14 ||
198      ityp[i] == 6  || ityp[i] == 15 ||
199      ityp[i] == 18 || ityp[i] == 24)
200     {
201 
202 /*======================================================================
203 * die drei Eck-Punkte fuer jede Scheibe oder Platte holen
204 *=====================================================================*/
205   for (j= 1; j <= 3; j++)
206     {
207     xe[j]= xv[koi[koffs[i]+j-1]];
208     ye[j]= yv[koi[koffs[i]+j-1]];
209     ze[j]= zv[koi[koffs[i]+j-1]];
210     }
211 
212 /*======================================================================
213 * den Normalenvektor bestimmen
214 *=====================================================================*/
215     /* erster Vektor */
216     ax= xe[2]-xe[1];
217     ay= ye[2]-ye[1];
218     az= ze[2]-ze[1];
219 
220     /* zweiter Vektor */
221     bx= xe[3]-xe[1];
222     by= ye[3]-ye[1];
223     bz= ze[3]-ze[1];
224 
225     /* Kreuzprodukt */
226     vx[1]= ay*bz-by*az;
227     vy[1]= az*bx-bz*ax;
228     vz[1]= ax*by-bx*ay;
229 
230 /*======================================================================
231 * ... und rendern
232 *=====================================================================*/
233     glBegin(GL_TRIANGLES);
234       glNormal3d( vx[1],vy[1],vz[1]);
235       glVertex3d( xe[1],ye[1],ze[1]);
236       glVertex3d( xe[2],ye[2],ze[2]);
237       glVertex3d( xe[3],ye[3],ze[3]);
238     glEnd();
239     }  /* Scheibe 3,14, Torus 6,15, Platte 18, Schale 24 */
240 
241 /*----------------------------------------------------------------------
242 * Tetraeder 16 und 17
243 *---------------------------------------------------------------------*/
244   if(ityp[i] == 16 || ityp[i] == 17)
245     {
246 /*======================================================================
247 * die vier Punkte fuer jeden Tetraeder holen
248 *=====================================================================*/
249     for (j= 1; j <= 4; j++)
250       {
251       xe[j]= xv[koi[koffs[i]+j-1]];
252       ye[j]= yv[koi[koffs[i]+j-1]];
253       ze[j]= zv[koi[koffs[i]+j-1]];
254       }
255 
256 /*======================================================================
257 * die Normalenvektoren fuer die vier Dreiecke bestimmen
258 *=====================================================================*/
259 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
260 * erster Normalenvektor
261 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
262     /* erster Vektor */
263     ax= xe[3]-xe[1];
264     ay= ye[3]-ye[1];
265     az= ze[3]-ze[1];
266 
267     /* zweiter Vektor */
268     bx= xe[2]-xe[1];
269     by= ye[2]-ye[1];
270     bz= ze[2]-ze[1];
271 
272     /* Kreuzprodukt */
273     vx[1]= ay*bz-by*az;
274     vy[1]= az*bx-bz*ax;
275     vz[1]= ax*by-bx*ay;
276 
277 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
278 * zweiter Normalenvektor
279 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
280     /* erster Vektor */
281     ax= xe[2]-xe[1];
282     ay= ye[2]-ye[1];
283     az= ze[2]-ze[1];
284 
285     /* zweiter Vektor */
286     bx= xe[4]-xe[1];
287     by= ye[4]-ye[1];
288     bz= ze[4]-ze[1];
289 
290     /* Kreuzprodukt */
291     vx[2]= ay*bz-by*az;
292     vy[2]= az*bx-bz*ax;
293     vz[2]= ax*by-bx*ay;
294 
295 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
296 * dritter Normalenvektor
297 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
298     /* erster Vektor */
299     ax= xe[4]-xe[1];
300     ay= ye[4]-ye[1];
301     az= ze[4]-ze[1];
302 
303     /* zweiter Vektor */
304     bx= xe[3]-xe[1];
305     by= ye[3]-ye[1];
306     bz= ze[3]-ze[1];
307 
308     /* Kreuzprodukt */
309     vx[3]= ay*bz-by*az;
310     vy[3]= az*bx-bz*ax;
311     vz[3]= ax*by-bx*ay;
312 
313 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
314 * vierter Normalenvektor
315 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
316     /* erster Vektor */
317     ax= xe[3]-xe[2];
318     ay= ye[3]-ye[2];
319     az= ze[3]-ze[2];
320 
321     /* zweiter Vektor */
322     bx= xe[4]-xe[2];
323     by= ye[4]-ye[2];
324     bz= ze[4]-ze[2];
325 
326     /* Kreuzprodukt */
327     vx[4]= ay*bz-by*az;
328     vy[4]= az*bx-bz*ax;
329     vz[4]= ax*by-bx*ay;
330 
331 /*======================================================================
332 * ... und rendern
333 *=====================================================================*/
334     glBegin(GL_TRIANGLES);
335       glNormal3d( vx[1],vy[1],vz[1]);
336       glVertex3d( xe[1],ye[1],ze[1]);
337       glVertex3d( xe[3],ye[3],ze[3]);
338       glVertex3d( xe[2],ye[2],ze[2]);
339 
340       glNormal3d( vx[2],vy[2],vz[2]);
341       glVertex3d( xe[1],ye[1],ze[1]);
342       glVertex3d( xe[2],ye[2],ze[2]);
343       glVertex3d( xe[4],ye[4],ze[4]);
344 
345       glNormal3d( vx[3],vy[3],vz[3]);
346       glVertex3d( xe[1],ye[1],ze[1]);
347       glVertex3d( xe[4],ye[4],ze[4]);
348       glVertex3d( xe[3],ye[3],ze[3]);
349 
350       glNormal3d( vx[4],vy[4],vz[4]);
351       glVertex3d( xe[2],ye[2],ze[2]);
352       glVertex3d( xe[3],ye[3],ze[3]);
353       glVertex3d( xe[4],ye[4],ze[4]);
354     glEnd();
355     }  /* Ende Tetraeder 16 und 17 */
356 
357 /*----------------------------------------------------------------------
358 * Hexaeder 1, 10 und 21
359 *---------------------------------------------------------------------*/
360   if(ityp[i] == 1 || ityp[i] == 10 || ityp[i] == 21)
361     {
362 /*======================================================================
363 * die acht Punkte fuer jeden Hexaeder holen
364 *=====================================================================*/
365 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
366 * Hexaeder 1 und 10
367 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
368     if(ityp[i] == 1 || ityp[i] == 10)
369       {
370       for (j= 1; j <= 8; j++)
371         {
372         xe[j]= xv[koi[koffs[i]+j-1]];
373         ye[j]= yv[koi[koffs[i]+j-1]];
374         ze[j]= zv[koi[koffs[i]+j-1]];
375         }
376       }
377 
378 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
379 * Volumenschalenele. 21
380 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
381     if(ityp[i] == 21)
382       {
383       for (j= 1; j <= 4; j++)
384         {
385         xe[j]= xv[koi[koffs[i]+j-1]];
386         ye[j]= yv[koi[koffs[i]+j-1]];
387         ze[j]= zv[koi[koffs[i]+j-1]];
388         }
389       for (j= 5; j <= 8; j++)
390         {
391         xe[j]= xv[koi[koffs[i]+j+4-1]];
392         ye[j]= yv[koi[koffs[i]+j+4-1]];
393         ze[j]= zv[koi[koffs[i]+j+4-1]];
394         }
395       }
396 
397 /*======================================================================
398 * die Normalenvektoren fuer die 12 Dreiecke (2 pro Seite) bestimmen
399 *=====================================================================*/
400 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
401 * erster Normalenvektor
402 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
403     /* erster Vektor */
404     ax= xe[2]-xe[1];
405     ay= ye[2]-ye[1];
406     az= ze[2]-ze[1];
407 
408     /* zweiter Vektor */
409     bx= xe[3]-xe[1];
410     by= ye[3]-ye[1];
411     bz= ze[3]-ze[1];
412 
413     /* Kreuzprodukt */
414     vx[1]= ay*bz-by*az;
415     vy[1]= az*bx-bz*ax;
416     vz[1]= ax*by-bx*ay;
417 
418 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
419 * zweiter Normalenvektor
420 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
421     /* erster Vektor */
422     ax= xe[3]-xe[1];
423     ay= ye[3]-ye[1];
424     az= ze[3]-ze[1];
425 
426     /* zweiter Vektor */
427     bx= xe[4]-xe[1];
428     by= ye[4]-ye[1];
429     bz= ze[4]-ze[1];
430 
431     /* Kreuzprodukt */
432     vx[2]= ay*bz-by*az;
433     vy[2]= az*bx-bz*ax;
434     vz[2]= ax*by-bx*ay;
435 
436 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
437 * dritter Normalenvektor
438 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
439     /* erster Vektor */
440     ax= xe[6]-xe[5];
441     ay= ye[6]-ye[5];
442     az= ze[6]-ze[5];
443 
444     /* zweiter Vektor */
445     bx= xe[2]-xe[5];
446     by= ye[2]-ye[5];
447     bz= ze[2]-ze[5];
448 
449     /* Kreuzprodukt */
450     vx[3]= ay*bz-by*az;
451     vy[3]= az*bx-bz*ax;
452     vz[3]= ax*by-bx*ay;
453 
454 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
455 * vierter Normalenvektor
456 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
457     /* erster Vektor */
458     ax= xe[2]-xe[5];
459     ay= ye[2]-ye[5];
460     az= ze[2]-ze[5];
461 
462     /* zweiter Vektor */
463     bx= xe[1]-xe[5];
464     by= ye[1]-ye[5];
465     bz= ze[1]-ze[5];
466 
467     /* Kreuzprodukt */
468     vx[4]= ay*bz-by*az;
469     vy[4]= az*bx-bz*ax;
470     vz[4]= ax*by-bx*ay;
471 
472 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
473 * fuenfter Normalenvektor
474 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
475     /* erster Vektor */
476     ax= xe[7]-xe[6];
477     ay= ye[7]-ye[6];
478     az= ze[7]-ze[6];
479 
480     /* zweiter Vektor */
481     bx= xe[3]-xe[6];
482     by= ye[3]-ye[6];
483     bz= ze[3]-ze[6];
484 
485     /* Kreuzprodukt */
486     vx[5]= ay*bz-by*az;
487     vy[5]= az*bx-bz*ax;
488     vz[5]= ax*by-bx*ay;
489 
490 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
491 * sechster Normalenvektor
492 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
493     /* erster Vektor */
494     ax= xe[3]-xe[6];
495     ay= ye[3]-ye[6];
496     az= ze[3]-ze[6];
497 
498     /* zweiter Vektor */
499     bx= xe[2]-xe[6];
500     by= ye[2]-ye[6];
501     bz= ze[2]-ze[6];
502 
503     /* Kreuzprodukt */
504     vx[6]= ay*bz-by*az;
505     vy[6]= az*bx-bz*ax;
506     vz[6]= ax*by-bx*ay;
507 
508 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
509 * 7. Normalenvektor
510 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
511     /* erster Vektor */
512     ax= xe[7]-xe[8];
513     ay= ye[7]-ye[8];
514     az= ze[7]-ze[8];
515 
516     /* zweiter Vektor */
517     bx= xe[5]-xe[8];
518     by= ye[5]-ye[8];
519     bz= ze[5]-ze[8];
520 
521     /* Kreuzprodukt */
522     vx[7]= ay*bz-by*az;
523     vy[7]= az*bx-bz*ax;
524     vz[7]= ax*by-bx*ay;
525 
526 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
527 * 8. Normalenvektor
528 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
529     /* erster Vektor */
530     ax= xe[6]-xe[7];
531     ay= ye[6]-ye[7];
532     az= ze[6]-ze[7];
533 
534     /* zweiter Vektor */
535     bx= xe[5]-xe[7];
536     by= ye[5]-ye[7];
537     bz= ze[5]-ze[7];
538 
539     /* Kreuzprodukt */
540     vx[8]= ay*bz-by*az;
541     vy[8]= az*bx-bz*ax;
542     vz[8]= ax*by-bx*ay;
543 
544 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
545 * 9. Normalenvektor
546 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
547     /* erster Vektor */
548     ax= xe[8]-xe[7];
549     ay= ye[8]-ye[7];
550     az= ze[8]-ze[7];
551 
552     /* zweiter Vektor */
553     bx= xe[3]-xe[7];
554     by= ye[3]-ye[7];
555     bz= ze[3]-ze[7];
556 
557     /* Kreuzprodukt */
558     vx[9]= ay*bz-by*az;
559     vy[9]= az*bx-bz*ax;
560     vz[9]= ax*by-bx*ay;
561 
562 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
563 * 10. Normalenvektor
564 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
565     /* erster Vektor */
566     ax= xe[4]-xe[8];
567     ay= ye[4]-ye[8];
568     az= ze[4]-ze[8];
569 
570     /* zweiter Vektor */
571     bx= xe[3]-xe[8];
572     by= ye[3]-ye[8];
573     bz= ze[3]-ze[8];
574 
575     /* Kreuzprodukt */
576     vx[10]= ay*bz-by*az;
577     vy[10]= az*bx-bz*ax;
578     vz[10]= ax*by-bx*ay;
579 
580 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
581 * 11. Normalenvektor
582 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
583     /* erster Vektor */
584     ax= xe[5]-xe[8];
585     ay= ye[5]-ye[8];
586     az= ze[5]-ze[8];
587 
588     /* zweiter Vektor */
589     bx= xe[4]-xe[8];
590     by= ye[4]-ye[8];
591     bz= ze[4]-ze[8];
592 
593     /* Kreuzprodukt */
594     vx[11]= ay*bz-by*az;
595     vy[11]= az*bx-bz*ax;
596     vz[11]= ax*by-bx*ay;
597 
598 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
599 * 12. Normalenvektor
600 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
601     /* erster Vektor */
602     ax= xe[1]-xe[5];
603     ay= ye[1]-ye[5];
604     az= ze[1]-ze[5];
605 
606     /* zweiter Vektor */
607     bx= xe[4]-xe[5];
608     by= ye[4]-ye[5];
609     bz= ze[4]-ze[5];
610 
611     /* Kreuzprodukt */
612     vx[12]= ay*bz-by*az;
613     vy[12]= az*bx-bz*ax;
614     vz[12]= ax*by-bx*ay;
615 
616 
617 /*======================================================================
618 * ... und rendern
619 *=====================================================================*/
620     glBegin(GL_TRIANGLES);
621       glNormal3d( vx[1],vy[1],vz[1]);
622       glVertex3d( xe[1],ye[1],ze[1]);
623       glVertex3d( xe[2],ye[2],ze[2]);
624       glVertex3d( xe[3],ye[3],ze[3]);
625 
626       glNormal3d( vx[2],vy[2],vz[2]);
627       glVertex3d( xe[1],ye[1],ze[1]);
628       glVertex3d( xe[3],ye[3],ze[3]);
629       glVertex3d( xe[4],ye[4],ze[4]);
630 
631       glNormal3d( vx[3],vy[3],vz[3]);
632       glVertex3d( xe[5],ye[5],ze[5]);
633       glVertex3d( xe[6],ye[6],ze[6]);
634       glVertex3d( xe[2],ye[2],ze[2]);
635 
636       glNormal3d( vx[4],vy[4],vz[4]);
637       glVertex3d( xe[5],ye[5],ze[5]);
638       glVertex3d( xe[2],ye[2],ze[2]);
639       glVertex3d( xe[1],ye[1],ze[1]);
640 
641       glNormal3d( vx[5],vy[5],vz[5]);
642       glVertex3d( xe[6],ye[6],ze[6]);
643       glVertex3d( xe[7],ye[7],ze[7]);
644       glVertex3d( xe[3],ye[3],ze[3]);
645 
646       glNormal3d( vx[6],vy[6],vz[6]);
647       glVertex3d( xe[6],ye[6],ze[6]);
648       glVertex3d( xe[3],ye[3],ze[3]);
649       glVertex3d( xe[2],ye[2],ze[2]);
650 
651       glNormal3d( vx[7],vy[7],vz[7]);
652       glVertex3d( xe[5],ye[5],ze[5]);
653       glVertex3d( xe[8],ye[8],ze[8]);
654       glVertex3d( xe[7],ye[7],ze[7]);
655 
656       glNormal3d( vx[8],vy[8],vz[8]);
657       glVertex3d( xe[5],ye[5],ze[5]);
658       glVertex3d( xe[7],ye[7],ze[7]);
659       glVertex3d( xe[6],ye[6],ze[6]);
660 
661       glNormal3d( vx[9],vy[9],vz[9]);
662       glVertex3d( xe[3],ye[3],ze[3]);
663       glVertex3d( xe[7],ye[7],ze[7]);
664       glVertex3d( xe[8],ye[8],ze[8]);
665 
666       glNormal3d( vx[10],vy[10],vz[10]);
667       glVertex3d( xe[3],ye[3],ze[3]);
668       glVertex3d( xe[8],ye[8],ze[8]);
669       glVertex3d( xe[4],ye[4],ze[4]);
670 
671       glNormal3d( vx[11],vy[11],vz[11]);
672       glVertex3d( xe[4],ye[4],ze[4]);
673       glVertex3d( xe[8],ye[8],ze[8]);
674       glVertex3d( xe[5],ye[5],ze[5]);
675 
676       glNormal3d( vx[12],vy[12],vz[12]);
677       glVertex3d( xe[4],ye[4],ze[4]);
678       glVertex3d( xe[5],ye[5],ze[5]);
679       glVertex3d( xe[1],ye[1],ze[1]);
680     glEnd();
681     }  /* Ende Hexaeder 1, 10 und 21 */
682 
683 /*----------------------------------------------------------------------
684 * Volumenschale 22
685 *---------------------------------------------------------------------*/
686   if(ityp[i] == 22)
687     {
688 /*======================================================================
689 * die sechs Punkte fuer jede Schale holen
690 *=====================================================================*/
691     for (j= 1; j <= 3; j++)
692       {
693       xe[j]= xv[koi[koffs[i]+j-1]];
694       ye[j]= yv[koi[koffs[i]+j-1]];
695       ze[j]= zv[koi[koffs[i]+j-1]];
696       }
697     for (j= 4; j <= 6; j++)
698       {
699       xe[j]= xv[koi[koffs[i]+j+3-1]];
700       ye[j]= yv[koi[koffs[i]+j+3-1]];
701       ze[j]= zv[koi[koffs[i]+j+3-1]];
702       }
703 
704 /*======================================================================
705 * die Normalenvektoren fuer 8 Dreiecke (2 pro Seiten-Seite) bestimmen
706 *=====================================================================*/
707 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
708 * erster Normalenvektor (Deckflaeche)
709 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
710     /* erster Vektor */
711     ax= xe[2]-xe[1];
712     ay= ye[2]-ye[1];
713     az= ze[2]-ze[1];
714 
715     /* zweiter Vektor */
716     bx= xe[3]-xe[1];
717     by= ye[3]-ye[1];
718     bz= ze[3]-ze[1];
719 
720     /* Kreuzprodukt */
721     vx[1]= ay*bz-by*az;
722     vy[1]= az*bx-bz*ax;
723     vz[1]= ax*by-bx*ay;
724 
725 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
726 * zweiter Normalenvektor (Unterseite)
727 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
728     /* erster Vektor */
729     ax= xe[5]-xe[4];
730     ay= ye[5]-ye[4];
731     az= ze[5]-ze[4];
732 
733     /* zweiter Vektor */
734     bx= xe[6]-xe[4];
735     by= ye[6]-ye[4];
736     bz= ze[6]-ze[4];
737 
738     /* Kreuzprodukt */
739     vx[2]= ay*bz-by*az;
740     vy[2]= az*bx-bz*ax;
741     vz[2]= ax*by-bx*ay;
742 
743 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
744 * dritter Normalenvektor
745 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
746     /* erster Vektor */
747     ax= xe[5]-xe[4];
748     ay= ye[5]-ye[4];
749     az= ze[5]-ze[4];
750 
751     /* zweiter Vektor */
752     bx= xe[1]-xe[4];
753     by= ye[1]-ye[4];
754     bz= ze[1]-ze[4];
755 
756     /* Kreuzprodukt */
757     vx[3]= ay*bz-by*az;
758     vy[3]= az*bx-bz*ax;
759     vz[3]= ax*by-bx*ay;
760 
761 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
762 * vierter Normalenvektor
763 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
764     /* erster Vektor */
765     ax= xe[5]-xe[1];
766     ay= ye[5]-ye[1];
767     az= ze[5]-ze[1];
768 
769     /* zweiter Vektor */
770     bx= xe[2]-xe[1];
771     by= ye[2]-ye[1];
772     bz= ze[2]-ze[1];
773 
774     /* Kreuzprodukt */
775     vx[4]= ay*bz-by*az;
776     vy[4]= az*bx-bz*ax;
777     vz[4]= ax*by-bx*ay;
778 
779 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
780 * fuenfter Normalenvektor
781 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
782     /* erster Vektor */
783     ax= xe[6]-xe[5];
784     ay= ye[6]-ye[5];
785     az= ze[6]-ze[5];
786 
787     /* zweiter Vektor */
788     bx= xe[2]-xe[5];
789     by= ye[2]-ye[5];
790     bz= ze[2]-ze[5];
791 
792     /* Kreuzprodukt */
793     vx[5]= ay*bz-by*az;
794     vy[5]= az*bx-bz*ax;
795     vz[5]= ax*by-bx*ay;
796 
797 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
798 * sechster Normalenvektor
799 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
800     /* erster Vektor */
801     ax= xe[6]-xe[2];
802     ay= ye[6]-ye[2];
803     az= ze[6]-ze[2];
804 
805     /* zweiter Vektor */
806     bx= xe[3]-xe[2];
807 
808 
809     by= ye[3]-ye[2];
810     bz= ze[3]-ze[2];
811 
812     /* Kreuzprodukt */
813     vx[6]= ay*bz-by*az;
814     vy[6]= az*bx-bz*ax;
815     vz[6]= ax*by-bx*ay;
816 
817 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
818 * 7. Normalenvektor
819 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
820     /* erster Vektor */
821     ax= xe[4]-xe[6];
822     ay= ye[4]-ye[6];
823     az= ze[4]-ze[6];
824 
825     /* zweiter Vektor */
826     bx= xe[3]-xe[6];
827     by= ye[3]-ye[6];
828     bz= ze[3]-ze[6];
829 
830     /* Kreuzprodukt */
831     vx[7]= ay*bz-by*az;
832     vy[7]= az*bx-bz*ax;
833     vz[7]= ax*by-bx*ay;
834 
835 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
836 * 8. Normalenvektor
837 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
838     /* erster Vektor */
839     ax= xe[4]-xe[3];
840     ay= ye[4]-ye[3];
841     az= ze[4]-ze[3];
842 
843     /* zweiter Vektor */
844     bx= xe[1]-xe[3];
845     by= ye[1]-ye[3];
846     bz= ze[1]-ze[3];
847 
848     /* Kreuzprodukt */
849     vx[8]= ay*bz-by*az;
850     vy[8]= az*bx-bz*ax;
851     vz[8]= ax*by-bx*ay;
852 
853 /*======================================================================
854 * ... und rendern
855 *=====================================================================*/
856     glBegin(GL_TRIANGLES);
857       glNormal3d( vx[1],vy[1],vz[1]);
858       glVertex3d( xe[1],ye[1],ze[1]);
859       glVertex3d( xe[2],ye[2],ze[2]);
860       glVertex3d( xe[3],ye[3],ze[3]);
861 
862       glNormal3d( vx[2],vy[2],vz[2]);
863       glVertex3d( xe[4],ye[4],ze[4]);
864       glVertex3d( xe[5],ye[5],ze[5]);
865       glVertex3d( xe[6],ye[6],ze[6]);
866 
867       glNormal3d( vx[3],vy[3],vz[3]);
868       glVertex3d( xe[4],ye[4],ze[4]);
869       glVertex3d( xe[5],ye[5],ze[5]);
870       glVertex3d( xe[1],ye[1],ze[1]);
871 
872       glNormal3d( vx[4],vy[4],vz[4]);
873       glVertex3d( xe[1],ye[1],ze[1]);
874       glVertex3d( xe[5],ye[5],ze[5]);
875       glVertex3d( xe[2],ye[2],ze[2]);
876 
877       glNormal3d( vx[5],vy[5],vz[5]);
878       glVertex3d( xe[5],ye[5],ze[5]);
879       glVertex3d( xe[6],ye[6],ze[6]);
880       glVertex3d( xe[2],ye[2],ze[2]);
881 
882       glNormal3d( vx[6],vy[6],vz[6]);
883       glVertex3d( xe[2],ye[2],ze[2]);
884       glVertex3d( xe[6],ye[6],ze[6]);
885       glVertex3d( xe[3],ye[3],ze[3]);
886 
887       glNormal3d( vx[7],vy[7],vz[7]);
888       glVertex3d( xe[6],ye[6],ze[6]);
889       glVertex3d( xe[4],ye[4],ze[4]);
890       glVertex3d( xe[3],ye[3],ze[3]);
891 
892       glNormal3d( vx[8],vy[8],vz[8]);
893       glVertex3d( xe[3],ye[3],ze[3]);
894       glVertex3d( xe[4],ye[4],ze[4]);
895       glVertex3d( xe[1],ye[1],ze[1]);
896 
897     glEnd();
898     }  /* Ende Volumenschale 22 */
899 
900 
901   }  /* Ende Schleife ueber alle Elemente */
902 
903 return 0;
904 }
905 
906 /***********************************************************************
907 * hier beginnt Function tet288: mit Spannungen oder Verschiebungen an
908 * den Eckknoten
909 ***********************************************************************/
tet288(void)910 int tet288(void)
911 {
912 extern FR_DOUBLEAY xv;
913 extern FR_DOUBLEAY yv;
914 extern FR_DOUBLEAY zv;
915 
916 extern FR_DOUBLE   xe[];
917 extern FR_DOUBLE   ye[];
918 extern FR_DOUBLE   ze[];
919 
920 extern FR_DOUBLE   vx[];
921 extern FR_DOUBLE   vy[];
922 extern FR_DOUBLE   vz[];
923 
924 extern GLfloat     rot[];
925 extern GLfloat     gruen[];
926 extern GLfloat     blau[];
927 
928 extern FR_INT4AY   ifarbe;
929 
930 extern FR_INT4AY   ityp;
931 extern FR_INT4AY   koi;
932 extern FR_INT4AY   koffs;
933 
934 extern FR_INT4     kf[];
935 
936 extern FR_INT4     ne;
937 
938 FR_INT4            i,j,k;
939 
940 static FR_INT4     jp7[5]= {0,1,2,3,4};
941 
942 static FR_INT4     jp16[13]={0,1,3,2,1,2,4,1,4,3,2,3,4};
943 
944 static FR_INT4     jp10[37]={0,1,2,3,1,3,4,5,6,2,5,2,1,6,7,3,6,3,2,
945                                5,8,7,5,7,6,3,7,8,3,8,4,4,8,5,4,5,1};
946 
947 static FR_INT4     jp22[25]={0,1,2,3,4,6,5,4,5,1,1,5,2,5,6,2,2,6,3,
948                                6,4,3,3,4,1};
949 
950 /***********************************************************************
951 * Schleife ueber alle Elemente
952 ***********************************************************************/
953 for (i= 1; i <= ne; i++)
954   {
955 
956 /*----------------------------------------------------------------------
957 * Stab 4 u. 9, Balken 2 und 13, Welle 5, Balken 25
958 *---------------------------------------------------------------------*/
959   if(ityp[i] == 4 || ityp[i] == 9  ||
960      ityp[i] == 2 || ityp[i] == 13 ||
961      ityp[i] == 5 || ityp[i] == 25)
962     {
963 
964 /*======================================================================
965 * die zwei Eck-Punkte fuer jeden Stab holen
966 *=====================================================================*/
967     for (j= 1; j <= 2; j++)
968       {
969       xe[j]= xv[koi[koffs[i]+j-1]];
970       ye[j]= yv[koi[koffs[i]+j-1]];
971       ze[j]= zv[koi[koffs[i]+j-1]];
972       kf[j]= koi[koffs[i]+j-1];
973       }
974 
975 /*======================================================================
976 * ... und rendern
977 *=====================================================================*/
978     glBegin(GL_LINES);
979       for(k= 1; k <= 2; k++)
980         {
981         glColor3f (rot  [ifarbe[kf[jp7[k]]]],
982                    gruen[ifarbe[kf[jp7[k]]]],
983                    blau [ifarbe[kf[jp7[k]]]]);
984         glVertex3d(xe[k],ye[k],ze[k]);
985         }
986     glEnd();
987     }  /* Stab 4 u. 9, Balken 2 und 13, Welle 5, Balken 25 */
988 
989 /*----------------------------------------------------------------------
990 * Scheibe 7,Torus 8,Scheibe 11,Torus 12 u.Platte 19 u.20,Schale 23
991 *---------------------------------------------------------------------*/
992   if(ityp[i] == 7  || ityp[i] == 8  ||
993      ityp[i] == 11 || ityp[i] == 12 ||
994      ityp[i] == 19 || ityp[i] == 20 || ityp[i] == 23)
995     {
996 
997 /*======================================================================
998 * die vier Eck-Punkte fuer jede Scheibe oder Platte holen
999 *=====================================================================*/
1000   if(ityp[i] != 19)
1001     {
1002     for (j= 1; j <= 4; j++)
1003       {
1004       xe[j]= xv[koi[koffs[i]+j-1]];
1005       ye[j]= yv[koi[koffs[i]+j-1]];
1006       ze[j]= zv[koi[koffs[i]+j-1]];
1007       kf[j]= koi[koffs[i]+j-1];
1008       }
1009     }
1010   else
1011     {
1012     xe[1]= xv[koi[koffs[i]]];
1013     ye[1]= yv[koi[koffs[i]]];
1014     ze[1]= zv[koi[koffs[i]]];
1015     kf[1]= koi[koffs[i]];
1016 
1017     xe[2]= xv[koi[koffs[i]+12]];
1018     ye[2]= yv[koi[koffs[i]+12]];
1019     ze[2]= zv[koi[koffs[i]+12]];
1020     kf[2]= koi[koffs[i]+12];
1021 
1022     xe[3]= xv[koi[koffs[i]+15]];
1023     ye[3]= yv[koi[koffs[i]+15]];
1024     ze[3]= zv[koi[koffs[i]+15]];
1025     kf[3]= koi[koffs[i]+15];
1026 
1027     xe[4]= xv[koi[koffs[i]+3]];
1028     ye[4]= yv[koi[koffs[i]+3]];
1029     ze[4]= zv[koi[koffs[i]+3]];
1030     kf[4]= koi[koffs[i]+3];
1031     }
1032 
1033 /*======================================================================
1034 * ... und rendern
1035 *=====================================================================*/
1036     glBegin(GL_QUADS);
1037       for(k= 1; k <= 4; k++)
1038         {
1039         glColor3f (rot  [ifarbe[kf[jp7[k]]]],
1040                    gruen[ifarbe[kf[jp7[k]]]],
1041                    blau [ifarbe[kf[jp7[k]]]]);
1042         glVertex3d(xe[jp7[k]],ye[jp7[k]],ze[jp7[k]]);
1043         }
1044     glEnd();
1045     }  /* Scheibe 7,11,Torus 8,12 u.Platte 19 u.20,Schale 23 */
1046 
1047 /*----------------------------------------------------------------------
1048 * Scheibe 3, Torus 6, Scheibe 14, Torus 15, Platte 18, Schale 24
1049 *---------------------------------------------------------------------*/
1050   if(ityp[i] == 3  || ityp[i] == 14 ||
1051      ityp[i] == 6  || ityp[i] == 15 ||
1052      ityp[i] == 18 || ityp[i] == 24)
1053     {
1054 
1055 /*======================================================================
1056 * die drei Eck-Punkte fuer jede Scheibe oder Platte holen
1057 *=====================================================================*/
1058   for (j= 1; j <= 3; j++)
1059     {
1060     xe[j]= xv[koi[koffs[i]+j-1]];
1061     ye[j]= yv[koi[koffs[i]+j-1]];
1062     ze[j]= zv[koi[koffs[i]+j-1]];
1063     kf[j]= koi[koffs[i]+j-1];
1064     }
1065 
1066 /*======================================================================
1067 * ... und rendern
1068 *=====================================================================*/
1069     glBegin(GL_TRIANGLES);
1070       for(k= 1; k <= 3; k++)
1071         {
1072         glColor3f (rot  [ifarbe[kf[jp7[k]]]],
1073                    gruen[ifarbe[kf[jp7[k]]]],
1074                    blau [ifarbe[kf[jp7[k]]]]);
1075         glVertex3d(xe[jp7[k]],ye[jp7[k]],ze[jp7[k]]);
1076         }
1077     glEnd();
1078     }  /* Scheibe 3,14, Torus 6,15, Platte 18, Schale 24 */
1079 
1080 /*----------------------------------------------------------------------
1081 * Tetraeder 16 und 17
1082 *---------------------------------------------------------------------*/
1083   if(ityp[i] == 16 || ityp[i] == 17)
1084     {
1085 
1086 /*======================================================================
1087 * die vier Punkte fuer jeden Tetraeder holen
1088 *=====================================================================*/
1089     for (j= 1; j <= 4; j++)
1090       {
1091       xe[j]= xv[koi[koffs[i]+j-1]];
1092       ye[j]= yv[koi[koffs[i]+j-1]];
1093       ze[j]= zv[koi[koffs[i]+j-1]];
1094       kf[j]= koi[koffs[i]+j-1];
1095       }
1096 
1097 /*======================================================================
1098 * ... und rendern
1099 *=====================================================================*/
1100     glBegin(GL_TRIANGLES);
1101       for(k= 1; k <= 12; k++)
1102         {
1103         glColor3f (rot  [ifarbe[kf[jp16[k]]]],
1104                    gruen[ifarbe[kf[jp16[k]]]],
1105                    blau [ifarbe[kf[jp16[k]]]]);
1106         glVertex3d(xe[jp16[k]],ye[jp16[k]],ze[jp16[k]]);
1107         }
1108     glEnd();
1109     }  /* Ende Tetraeder 16 und 17 */
1110 
1111 /*----------------------------------------------------------------------
1112 * Hexaeder 1, 10 und 21
1113 *---------------------------------------------------------------------*/
1114   if(ityp[i] == 1 || ityp[i] == 10  || ityp[i] == 21)
1115     {
1116 /*======================================================================
1117 * die acht Punkte fuer jeden Hexaeder holen
1118 *=====================================================================*/
1119 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1120 * Hexaeder 1 und 10
1121 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
1122     if(ityp[i] == 1 || ityp[i] == 10)
1123       {
1124       for (j= 1; j <= 8; j++)
1125         {
1126         xe[j]= xv[koi[koffs[i]+j-1]];
1127         ye[j]= yv[koi[koffs[i]+j-1]];
1128         ze[j]= zv[koi[koffs[i]+j-1]];
1129         kf[j]=    koi[koffs[i]+j-1];
1130         }
1131       }
1132 
1133 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1134 * Volumenschalenele. 21
1135 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
1136     if(ityp[i] == 21)
1137       {
1138       for (j= 1; j <= 4; j++)
1139         {
1140         xe[j]= xv[koi[koffs[i]+j-1]];
1141         ye[j]= yv[koi[koffs[i]+j-1]];
1142         ze[j]= zv[koi[koffs[i]+j-1]];
1143         kf[j]=    koi[koffs[i]+j-1];
1144         }
1145       for (j= 5; j <= 8; j++)
1146         {
1147         xe[j]= xv[koi[koffs[i]+j+4-1]];
1148         ye[j]= yv[koi[koffs[i]+j+4-1]];
1149         ze[j]= zv[koi[koffs[i]+j+4-1]];
1150         kf[j]=    koi[koffs[i]+j+4-1];
1151         }
1152       }
1153 
1154 /*======================================================================
1155 * ... und rendern
1156 *=====================================================================*/
1157     glBegin(GL_TRIANGLES);
1158       for(k= 1; k <= 36; k++) /* 12 Dreiecke */
1159         {
1160         glColor3f (rot  [ifarbe[kf[jp10[k]]]],
1161                    gruen[ifarbe[kf[jp10[k]]]],
1162                    blau [ifarbe[kf[jp10[k]]]]);
1163         glVertex3d(xe[jp10[k]],ye[jp10[k]],ze[jp10[k]]);
1164         }
1165     glEnd();
1166     }  /* Ende Hexaeder 1, 10 und Schale 21 */
1167 
1168 /*----------------------------------------------------------------------
1169 * Volumenschale 22
1170 *---------------------------------------------------------------------*/
1171   if(ityp[i] == 22)
1172     {
1173 /*======================================================================
1174 * die sechs Punkte fuer jede Schale holen
1175 *=====================================================================*/
1176     for (j= 1; j <= 3; j++)
1177       {
1178       xe[j]= xv[koi[koffs[i]+j-1]];
1179       ye[j]= yv[koi[koffs[i]+j-1]];
1180       ze[j]= zv[koi[koffs[i]+j-1]];
1181       kf[j]=    koi[koffs[i]+j-1];
1182       }
1183     for (j= 4; j <= 6; j++)
1184       {
1185       xe[j]= xv[koi[koffs[i]+j+3-1]];
1186       ye[j]= yv[koi[koffs[i]+j+3-1]];
1187       ze[j]= zv[koi[koffs[i]+j+3-1]];
1188       kf[j]=    koi[koffs[i]+j+3-1];
1189       }
1190 
1191 /*======================================================================
1192 * ... und rendern
1193 *=====================================================================*/
1194     glBegin(GL_TRIANGLES);
1195       for(k= 1; k <= 24; k++) /* 8 Dreiecke */
1196         {
1197         glColor3f (rot  [ifarbe[kf[jp22[k]]]],
1198                    gruen[ifarbe[kf[jp22[k]]]],
1199                    blau [ifarbe[kf[jp22[k]]]]);
1200         glVertex3d(xe[jp22[k]],ye[jp22[k]],ze[jp22[k]]);
1201         }
1202     glEnd();
1203     }  /* Ende Volumenschale 22 */
1204 
1205   }  /* Ende Schleife ueber alle Elemente */
1206 
1207 return 0;
1208 }
1209 
1210 /***********************************************************************
1211 * hier beginnt Function tet388: Hidden Line
1212 ***********************************************************************/
tet388(void)1213 int tet388(void)
1214 {
1215 extern FR_DOUBLEAY xv;
1216 extern FR_DOUBLEAY yv;
1217 extern FR_DOUBLEAY zv;
1218 
1219 extern FR_DOUBLE   xe[];
1220 extern FR_DOUBLE   ye[];
1221 extern FR_DOUBLE   ze[];
1222 
1223 extern FR_INT4AY   ityp;
1224 extern FR_INT4AY   koi;
1225 extern FR_INT4AY   koffs;
1226 
1227 extern FR_INT4     ne;
1228 
1229 FR_INT4            i,j,k;
1230 
1231 static FR_INT4     jp7[5]=  {0,1,2,3,4};
1232 
1233 static FR_INT4     jp16[13]={0,1,3,2,1,2,4,1,4,3,2,3,4};
1234 
1235 static FR_INT4     jp10[25]={0,1,2,3,4,5,6,7,8,1,2,6,5,2,3,7,6,
1236                                3,4,8,7,1,4,8,5};
1237 
1238 static FR_INT4     jd22[7] ={0,1,2,3,4,5,6};
1239 
1240 static FR_INT4     jv22[13]={0,1,4,5,2,2,5,6,3,3,6,4,1};
1241 
1242 /***********************************************************************
1243 * Schleife ueber alle Elemente
1244 ***********************************************************************/
1245 for (i= 1; i <= ne; i++)
1246   {
1247 
1248 /*----------------------------------------------------------------------
1249 * Stab 4 u. 9, Balken 2 und 13, Welle 5, Balken 25
1250 *---------------------------------------------------------------------*/
1251   if(ityp[i] == 4 || ityp[i] == 9  ||
1252      ityp[i] == 2 || ityp[i] == 13 ||
1253      ityp[i] == 5 || ityp[i] == 25)
1254     {
1255 
1256 /*======================================================================
1257 * die zwei Eck-Punkte fuer jeden Stab holen
1258 *=====================================================================*/
1259   for (j= 1; j <= 2; j++)
1260     {
1261     xe[j]= xv[koi[koffs[i]+j-1]];
1262     ye[j]= yv[koi[koffs[i]+j-1]];
1263     ze[j]= zv[koi[koffs[i]+j-1]];
1264     }
1265 
1266 /*======================================================================
1267 * ... und rendern
1268 *=====================================================================*/
1269     glBegin(GL_LINES);
1270       glVertex3d( xe[1],ye[1],ze[1]);
1271       glVertex3d( xe[2],ye[2],ze[2]);
1272     glEnd();
1273     }  /* Stab 4 u. 9, Balken 2 und 13, Welle 5, Balken 25 */
1274 
1275 
1276 /*----------------------------------------------------------------------
1277 * Scheibe 7,Torus 8,Scheibe 11,Torus 12 u.Platte 19 u.20,Schale 23
1278 *---------------------------------------------------------------------*/
1279   if(ityp[i] == 7  || ityp[i] == 8  ||
1280      ityp[i] == 11 || ityp[i] == 12 ||
1281      ityp[i] == 19 || ityp[i] == 20 || ityp[i] == 23)
1282     {
1283 
1284 /*======================================================================
1285 * die vier Eck-Punkte fuer jede Scheibe oder Platte holen
1286 *=====================================================================*/
1287   if(ityp[i] != 19)
1288     {
1289     for (j= 1; j <= 4; j++)
1290       {
1291       xe[j]= xv[koi[koffs[i]+j-1]];
1292       ye[j]= yv[koi[koffs[i]+j-1]];
1293       ze[j]= zv[koi[koffs[i]+j-1]];
1294       }
1295     }
1296   else
1297     {
1298     xe[1]= xv[koi[koffs[i]]];
1299     ye[1]= yv[koi[koffs[i]]];
1300     ze[1]= zv[koi[koffs[i]]];
1301 
1302     xe[2]= xv[koi[koffs[i]+12]];
1303     ye[2]= yv[koi[koffs[i]+12]];
1304     ze[2]= zv[koi[koffs[i]+12]];
1305 
1306     xe[3]= xv[koi[koffs[i]+15]];
1307     ye[3]= yv[koi[koffs[i]+15]];
1308     ze[3]= zv[koi[koffs[i]+15]];
1309 
1310     xe[4]= xv[koi[koffs[i]+3]];
1311     ye[4]= yv[koi[koffs[i]+3]];
1312     ze[4]= zv[koi[koffs[i]+3]];
1313     }
1314 
1315 /*======================================================================
1316 * ... und rendern
1317 *=====================================================================*/
1318     glBegin(GL_QUADS);
1319       for(k= 1; k <= 4; k++)
1320         glVertex3d(xe[jp7[k]],ye[jp7[k]],ze[jp7[k]]);
1321     glEnd();
1322     }  /* Scheibe 7,11,Torus 8,12 u.Platte 19 u.20,Schale 23 */
1323 
1324 /*----------------------------------------------------------------------
1325 * Scheibe 3, Torus 6, Scheibe 14, Torus 15, Platte 18, Schale 24
1326 *---------------------------------------------------------------------*/
1327   if(ityp[i] == 3  || ityp[i] == 14 ||
1328      ityp[i] == 6  || ityp[i] == 15 ||
1329      ityp[i] == 18 || ityp[i] == 24)
1330     {
1331 
1332 /*======================================================================
1333 * die drei Eck-Punkte fuer jede Scheibe oder Platte holen
1334 *=====================================================================*/
1335   for (j= 1; j <= 3; j++)
1336     {
1337     xe[j]= xv[koi[koffs[i]+j-1]];
1338     ye[j]= yv[koi[koffs[i]+j-1]];
1339     ze[j]= zv[koi[koffs[i]+j-1]];
1340     }
1341 
1342 /*======================================================================
1343 * ... und rendern
1344 *=====================================================================*/
1345     glBegin(GL_TRIANGLES);
1346       for(k= 1; k <= 3; k++)
1347         glVertex3d(xe[jp7[k]],ye[jp7[k]],ze[jp7[k]]);
1348     glEnd();
1349     }  /* Scheibe 3,14, Torus 6,15, Platte 18, Schale 24 */
1350 
1351 /*----------------------------------------------------------------------
1352 * Tetraeder 16 und 17
1353 *---------------------------------------------------------------------*/
1354   if(ityp[i] == 16 || ityp[i] == 17)
1355     {
1356 
1357 /*======================================================================
1358 * die vier Eck-Punkte fuer jeden Tetraeder holen
1359 *=====================================================================*/
1360     for (j= 1; j <= 4; j++)
1361       {
1362       xe[j]= xv[koi[koffs[i]+j-1]];
1363       ye[j]= yv[koi[koffs[i]+j-1]];
1364       ze[j]= zv[koi[koffs[i]+j-1]];
1365       }
1366 
1367 /*======================================================================
1368 * ... und rendern
1369 *=====================================================================*/
1370     glBegin(GL_TRIANGLES);
1371       for(k= 1; k <= 12; k++)
1372         glVertex3d(xe[jp16[k]],ye[jp16[k]],ze[jp16[k]]);
1373     glEnd();
1374     }  /* Ende Tetraeder 16 und 17 */
1375 
1376 /*----------------------------------------------------------------------
1377 * Hexaeder 1, 10 und 21
1378 *---------------------------------------------------------------------*/
1379   if(ityp[i] == 1 || ityp[i] == 10 || ityp[i] == 21)
1380     {
1381 /*======================================================================
1382 * die acht Punkte fuer jeden Hexaeder holen
1383 *=====================================================================*/
1384 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1385 * Hexaeder 1 und 10: die 8 Eckknoten
1386 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
1387     if(ityp[i] == 1 || ityp[i] == 10)
1388       {
1389       for (j= 1; j <= 8; j++)
1390         {
1391         xe[j]= xv[koi[koffs[i]+j-1]];
1392         ye[j]= yv[koi[koffs[i]+j-1]];
1393         ze[j]= zv[koi[koffs[i]+j-1]];
1394         }
1395       }
1396 
1397 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1398 * Volumenschalenele. 21: die 8 Eckknoten
1399 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
1400     if(ityp[i] == 21)
1401       {
1402       for (j= 1; j <= 4; j++)
1403         {
1404         xe[j]= xv[koi[koffs[i]+j-1]];
1405         ye[j]= yv[koi[koffs[i]+j-1]];
1406         ze[j]= zv[koi[koffs[i]+j-1]];
1407         }
1408       for (j= 5; j <= 8; j++)
1409         {
1410         xe[j]= xv[koi[koffs[i]+j+4-1]];
1411         ye[j]= yv[koi[koffs[i]+j+4-1]];
1412         ze[j]= zv[koi[koffs[i]+j+4-1]];
1413         }
1414       }
1415 
1416 /*======================================================================
1417 * ... und rendern
1418 *=====================================================================*/
1419     glBegin(GL_QUADS);
1420       for(k= 1; k <= 24; k++)
1421         glVertex3d(xe[jp10[k]],ye[jp10[k]],ze[jp10[k]]);
1422     glEnd();
1423     }  /* Ende Hexaeder 1, 10 und 21 */
1424 
1425 /*----------------------------------------------------------------------
1426 * Volumenschale 22
1427 *---------------------------------------------------------------------*/
1428   if(ityp[i] == 22)
1429     {
1430     for (j= 1; j <= 3; j++)
1431       {
1432       xe[j]= xv[koi[koffs[i]+j-1]];
1433       ye[j]= yv[koi[koffs[i]+j-1]];
1434       ze[j]= zv[koi[koffs[i]+j-1]];
1435       }
1436     for (j= 4; j <= 6; j++)
1437       {
1438       xe[j]= xv[koi[koffs[i]+j+3-1]];
1439       ye[j]= yv[koi[koffs[i]+j+3-1]];
1440       ze[j]= zv[koi[koffs[i]+j+3-1]];
1441       }
1442 
1443 /*======================================================================
1444 * ... und rendern
1445 *=====================================================================*/
1446     glBegin(GL_TRIANGLES);
1447       for(k= 1; k <= 6; k++)
1448         glVertex3d(xe[jd22[k]],ye[jd22[k]],ze[jd22[k]]);
1449     glEnd();
1450 
1451     glBegin(GL_QUADS);
1452       for(k= 1; k <= 12; k++)
1453         glVertex3d(xe[jv22[k]],ye[jv22[k]],ze[jv22[k]]);
1454     glEnd();
1455     }  /* Ende Volumenschale 22 */
1456 
1457 
1458   }  /* Ende Schleife ueber alle Elemente */
1459 
1460 return 0;
1461 }
1462 
1463 /***********************************************************************
1464 * hier beginnt Function tet488: Spannungen pro Element
1465 ***********************************************************************/
tet488(void)1466 int tet488(void)
1467 {
1468 extern FR_DOUBLEAY xv;
1469 extern FR_DOUBLEAY yv;
1470 extern FR_DOUBLEAY zv;
1471 
1472 extern FR_DOUBLE   xe[];
1473 extern FR_DOUBLE   ye[];
1474 extern FR_DOUBLE   ze[];
1475 
1476 extern FR_DOUBLE   vx[];
1477 extern FR_DOUBLE   vy[];
1478 extern FR_DOUBLE   vz[];
1479 
1480 extern GLfloat     rot[];
1481 extern GLfloat     gruen[];
1482 extern GLfloat     blau[];
1483 
1484 extern FR_INT4AY   jfarbe;
1485 
1486 extern FR_INT4AY   ityp;
1487 extern FR_INT4AY   koi;
1488 extern FR_INT4AY   koffs;
1489 
1490 extern FR_INT4     ne;
1491 
1492 FR_INT4            i,j,k;
1493 
1494 static FR_INT4     jp7[5]=  {0,1,2,3,4};
1495 
1496 static FR_INT4     jp16[13]={0,1,3,2,1,2,4,1,4,3,2,3,4};
1497 
1498 static FR_INT4     jp10[37]={0,1,2,3,1,3,4,5,6,2,5,2,1,6,7,3,6,3,2,
1499                                5,8,7,5,7,6,3,7,8,3,8,4,4,8,5,4,5,1};
1500 
1501 static FR_INT4     jp22[25]={0,1,2,3,4,6,5,4,5,1,1,5,2,5,6,2,2,6,3,
1502                                6,4,3,3,4,1};
1503 
1504 /***********************************************************************
1505 * Schleife ueber alle Elemente
1506 ***********************************************************************/
1507 for (i= 1; i <= ne; i++)
1508   {
1509 
1510 /*----------------------------------------------------------------------
1511 * Stab 4 u. 9, Balken 2 und 13, Welle 5, Balken 25
1512 *---------------------------------------------------------------------*/
1513   if(ityp[i] == 4 || ityp[i] == 9  ||
1514      ityp[i] == 2 || ityp[i] == 13 ||
1515      ityp[i] == 5 || ityp[i] == 25)
1516     {
1517 
1518 /*======================================================================
1519 * die zwei Eck-Punkte fuer jeden Stab holen
1520 *=====================================================================*/
1521     for (j= 1; j <= 2; j++)
1522       {
1523       xe[j]= xv[koi[koffs[i]+j-1]];
1524       ye[j]= yv[koi[koffs[i]+j-1]];
1525       ze[j]= zv[koi[koffs[i]+j-1]];
1526       }
1527 
1528 /*======================================================================
1529 * ... und rendern
1530 *=====================================================================*/
1531     glBegin(GL_LINES);
1532       glColor3f (rot[jfarbe[i]],gruen[jfarbe[i]],blau [jfarbe[i]]);
1533       glVertex3d( xe[1],ye[1],ze[1]);
1534       glVertex3d( xe[2],ye[2],ze[2]);
1535     glEnd();
1536     }    /* Stab 4 u. 9, Balken 2 und 13, Welle 5, Balken 25*/
1537 
1538 
1539 /*----------------------------------------------------------------------
1540 * Scheibe 7,Torus 8,Scheibe 11,Torus 12 u. Platte 19 u.20,Schale 23
1541 *---------------------------------------------------------------------*/
1542   if(ityp[i] == 7  || ityp[i] == 8  ||
1543      ityp[i] == 11 || ityp[i] == 12 ||
1544      ityp[i] == 19 || ityp[i] == 20 || ityp[i] == 23)
1545     {
1546 
1547 /*======================================================================
1548 * die vier Eck-Punkte fuer jede Scheibe oder Platte holen
1549 *=====================================================================*/
1550   if(ityp[i] != 19)
1551     {
1552     for (j= 1; j <= 4; j++)
1553       {
1554       xe[j]= xv[koi[koffs[i]+j-1]];
1555       ye[j]= yv[koi[koffs[i]+j-1]];
1556       ze[j]= zv[koi[koffs[i]+j-1]];
1557       }
1558     }
1559   else
1560     {
1561     xe[1]= xv[koi[koffs[i]]];
1562     ye[1]= yv[koi[koffs[i]]];
1563     ze[1]= zv[koi[koffs[i]]];
1564 
1565     xe[2]= xv[koi[koffs[i]+12]];
1566     ye[2]= yv[koi[koffs[i]+12]];
1567     ze[2]= zv[koi[koffs[i]+12]];
1568 
1569     xe[3]= xv[koi[koffs[i]+15]];
1570     ye[3]= yv[koi[koffs[i]+15]];
1571     ze[3]= zv[koi[koffs[i]+15]];
1572 
1573     xe[4]= xv[koi[koffs[i]+3]];
1574     ye[4]= yv[koi[koffs[i]+3]];
1575     ze[4]= zv[koi[koffs[i]+3]];
1576     }
1577 
1578 /*======================================================================
1579 * ... und rendern
1580 *=====================================================================*/
1581     glBegin(GL_QUADS);
1582       glColor3f (rot[jfarbe[i]],gruen[jfarbe[i]],blau [jfarbe[i]]);
1583       for(k= 1; k <= 4; k++)
1584         glVertex3d(xe[jp7[k]],ye[jp7[k]],ze[jp7[k]]);
1585     glEnd();
1586     }  /* Scheibe 7,11, Torus 8,12 und Platte 19 u.20,Schale 23 */
1587 
1588 /*----------------------------------------------------------------------
1589 * Scheibe 3, Torus 6, Scheibe 14, Torus 15, Platte 18, Schale 24
1590 *---------------------------------------------------------------------*/
1591   if(ityp[i] == 3  || ityp[i] == 14 ||
1592      ityp[i] == 6  || ityp[i] == 15 ||
1593      ityp[i] == 18 || ityp[i] == 24)
1594     {
1595 
1596 /*======================================================================
1597 * die drei Eck-Punkte fuer jede Scheibe oder Platte holen
1598 *=====================================================================*/
1599   for (j= 1; j <= 3; j++)
1600     {
1601     xe[j]= xv[koi[koffs[i]+j-1]];
1602     ye[j]= yv[koi[koffs[i]+j-1]];
1603     ze[j]= zv[koi[koffs[i]+j-1]];
1604     }
1605 
1606 /*======================================================================
1607 * ... und rendern
1608 *=====================================================================*/
1609     glBegin(GL_TRIANGLES);
1610       glColor3f (rot[jfarbe[i]],gruen[jfarbe[i]],blau [jfarbe[i]]);
1611       for(k= 1; k <= 3; k++)
1612         glVertex3d(xe[jp7[k]],ye[jp7[k]],ze[jp7[k]]);
1613     glEnd();
1614     }  /* Scheibe 3,14, Torus 6,15, Platte 18, Schale 24 */
1615 
1616 /*----------------------------------------------------------------------
1617 * Tetraeder 16 und 17
1618 *---------------------------------------------------------------------*/
1619   if(ityp[i] == 16 || ityp[i] == 17)
1620     {
1621 
1622 /*======================================================================
1623 * die vier Eck-Punkte fuer jeden Tetraeder holen
1624 *=====================================================================*/
1625     for (j= 1; j <= 4; j++)
1626       {
1627       xe[j]= xv[koi[koffs[i]+j-1]];
1628       ye[j]= yv[koi[koffs[i]+j-1]];
1629       ze[j]= zv[koi[koffs[i]+j-1]];
1630       }
1631 
1632 /*======================================================================
1633 * ... und rendern
1634 *=====================================================================*/
1635     glBegin(GL_TRIANGLES);
1636       glColor3f (rot[jfarbe[i]],gruen[jfarbe[i]],blau [jfarbe[i]]);
1637       for(k= 1; k <= 12; k++)
1638         glVertex3d(xe[jp16[k]],ye[jp16[k]],ze[jp16[k]]);
1639     glEnd();
1640     }  /* Ende Tetraeder 16 und 17 */
1641 
1642 /*----------------------------------------------------------------------
1643 * Hexaeder 1, 10 und 21
1644 *---------------------------------------------------------------------*/
1645   if(ityp[i] == 1 || ityp[i] == 10 || ityp[i] == 21)
1646     {
1647 /*======================================================================
1648 * die acht Punkte fuer jeden Hexaeder holen
1649 *=====================================================================*/
1650 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1651 * Hexaeder 1 und 10: die 8 Eckknoten
1652 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
1653     if(ityp[i] == 1 || ityp[i] == 10)
1654       {
1655       for (j= 1; j <= 8; j++)
1656         {
1657         xe[j]= xv[koi[koffs[i]+j-1]];
1658         ye[j]= yv[koi[koffs[i]+j-1]];
1659         ze[j]= zv[koi[koffs[i]+j-1]];
1660         }
1661       }
1662 
1663 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1664 * Volumenschalenele. 21: die 8 Eckknoten
1665 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
1666     if(ityp[i] == 21)
1667       {
1668       for (j= 1; j <= 4; j++)
1669         {
1670         xe[j]= xv[koi[koffs[i]+j-1]];
1671         ye[j]= yv[koi[koffs[i]+j-1]];
1672         ze[j]= zv[koi[koffs[i]+j-1]];
1673         }
1674       for (j= 5; j <= 8; j++)
1675         {
1676         xe[j]= xv[koi[koffs[i]+j+4-1]];
1677         ye[j]= yv[koi[koffs[i]+j+4-1]];
1678         ze[j]= zv[koi[koffs[i]+j+4-1]];
1679         }
1680       }
1681 
1682 /*======================================================================
1683 * ... und rendern
1684 *=====================================================================*/
1685     glBegin(GL_TRIANGLES);
1686       glColor3f (rot[jfarbe[i]],gruen[jfarbe[i]],blau [jfarbe[i]]);
1687       for(k= 1; k <= 36; k++)
1688         glVertex3d(xe[jp10[k]],ye[jp10[k]],ze[jp10[k]]);
1689     glEnd();
1690     }  /* Ende Hexaeder 1, 10 und 21 */
1691 
1692 /*----------------------------------------------------------------------
1693 * Volumenschale 22
1694 *---------------------------------------------------------------------*/
1695   if(ityp[i] == 22)
1696     {
1697     for (j= 1; j <= 3; j++)
1698       {
1699       xe[j]= xv[koi[koffs[i]+j-1]];
1700       ye[j]= yv[koi[koffs[i]+j-1]];
1701       ze[j]= zv[koi[koffs[i]+j-1]];
1702       }
1703     for (j= 4; j <= 6; j++)
1704       {
1705       xe[j]= xv[koi[koffs[i]+j+3-1]];
1706       ye[j]= yv[koi[koffs[i]+j+3-1]];
1707       ze[j]= zv[koi[koffs[i]+j+3-1]];
1708       }
1709 
1710 /*======================================================================
1711 * ... und rendern
1712 *=====================================================================*/
1713     glBegin(GL_TRIANGLES);
1714       glColor3f (rot[jfarbe[i]],gruen[jfarbe[i]],blau [jfarbe[i]]);
1715       for(k= 1; k <= 24; k++)
1716         glVertex3d(xe[jp22[k]],ye[jp22[k]],ze[jp22[k]]);
1717     glEnd();
1718     }  /* Ende Volumenschale 22 */
1719 
1720 
1721   }  /* Ende Schleife ueber alle Elemente */
1722 
1723 return 0;
1724 }
1725 
1726