1 
2 /* ----------------------------------------------------------------  */
3 /* elemChecker korrigiert falsch orientierte elemente 24.06.97 wi    */
4 /* ACHTUNG! liefert jetzt einen pointer auf ein int-feld:            */
5 /* sum_korrelems,elemnr(1),elemnr(2)...                              */
6 /* ----------------------------------------------------------------  */
7 
8 #include <extUtil.h>
9 
elemChecker(int sum_e,int * elems,Nodes * node,Elements * elem)10 int elemChecker(int sum_e, int *elems, Nodes *node, Elements *elem)
11 {
12   int i, j, e;
13   double v12[3], v13[3], v15[3], v15n[3], vn[3];
14   double bv12,bv13,bv15, bvn, bv15n, bgrenz;
15   int epuf[27];
16   int e_korr=0;
17 
18   for (e=0; e<sum_e; e++)
19   {
20     i=elems[e];
21     if( (elem[i].type == 1)||(elem[i].type == 4) )   /* HEXA */
22     {
23       v_result( &node[elem[i].nod[0]].nx, &node[elem[i].nod[1]].nx, v12);
24       v_result( &node[elem[i].nod[0]].nx, &node[elem[i].nod[3]].nx, v13);
25       v_result( &node[elem[i].nod[0]].nx, &node[elem[i].nod[4]].nx, v15);
26       bv12=v_betrag(v12);
27       bv13=v_betrag(v13);
28       bv15=v_betrag(v15);
29       if((bv12<1e-15)||(bv13<1e-15)||(bv15<1e-15))
30       {
31         v_result( &node[elem[i].nod[6]].nx, &node[elem[i].nod[5]].nx, v12);
32         v_result( &node[elem[i].nod[6]].nx, &node[elem[i].nod[7]].nx, v13);
33         v_result( &node[elem[i].nod[6]].nx, &node[elem[i].nod[2]].nx, v15);
34       }
35       bv15=v_betrag(v15);
36       v_prod(v12,v13,vn);
37       v_result(v15,vn,v15n);
38       bvn=v_betrag(vn);
39       bgrenz=sqrt(bvn*bvn+bv15*bv15);
40       bv15n=v_betrag(v15n);
41 
42       // printf ("elemcheck:%d vn x=%e y=%e z=%e\n",elem[i].nr,vn[0],vn[1],vn[2]);
43       if (bv15n > bgrenz)
44       {
45         // printf ("elem %d wrong defined, v15n=%e vgrenz=%e\n", elem[i].nr,bv15n,bgrenz);
46         for (j=0; j<8; j++)
47         {
48           epuf[j] = elem[i].nod[j];
49         }
50         elem[i].nod[0] = epuf[4];
51         elem[i].nod[1] = epuf[5];
52         elem[i].nod[2] = epuf[6];
53         elem[i].nod[3] = epuf[7];
54         elem[i].nod[4] = epuf[0];
55         elem[i].nod[5] = epuf[1];
56         elem[i].nod[6] = epuf[2];
57         elem[i].nod[7] = epuf[3];
58         e_korr++;
59         if (elem[i].type == 4)
60         {
61           for (j=0; j<4; j++)
62           {
63             epuf[j] = elem[i].nod[j+8];
64             epuf[j+4] = elem[i].nod[j+16];
65           }
66           elem[i].nod[8] = epuf[4];
67           elem[i].nod[9] = epuf[5];
68           elem[i].nod[10] = epuf[6];
69           elem[i].nod[11] = epuf[7];
70           elem[i].nod[16] = epuf[0];
71           elem[i].nod[17] = epuf[1];
72           elem[i].nod[18] = epuf[2];
73           elem[i].nod[19] = epuf[3];
74         }
75 
76       }
77     }
78 
79     else if( (elem[i].type == 2)||(elem[i].type == 5) )   /* PENTA */
80     {
81       v_result( &node[elem[i].nod[0]].nx, &node[elem[i].nod[1]].nx, v12);
82       v_result( &node[elem[i].nod[0]].nx, &node[elem[i].nod[2]].nx, v13);
83       v_result( &node[elem[i].nod[0]].nx, &node[elem[i].nod[3]].nx, v15);
84       v_prod(v12,v13,vn);
85       v_result(v15,vn,v15n);
86       bvn=v_betrag(vn);
87       bv15=v_betrag(v15);
88       bgrenz=sqrt(bvn*bvn+bv15*bv15);
89       bv15n=v_betrag(v15n);
90 
91       /* printf ("elemcheck:%d vn x=%e y=%e z=%e\n",elem[i].nr,vn[0],vn[1],vn[2]); */
92       if (bv15n > bgrenz)
93         {
94         /* printf ("elem %d wrong defined, v15n=%e vgrenz=%e\n", elem[i].nr,bv15n,bgrenz);  */
95         for (j=0; j<6; j++)
96           {
97           epuf[j] = elem[i].nod[j];
98           }
99         elem[i].nod[0] = epuf[3];
100         elem[i].nod[1] = epuf[4];
101         elem[i].nod[2] = epuf[5];
102         elem[i].nod[3] = epuf[0];
103         elem[i].nod[4] = epuf[1];
104         elem[i].nod[5] = epuf[2];
105         e_korr++;
106         if (elem[i].type == 5)
107         {
108           for (j=0; j<3; j++)
109           {
110             epuf[j] = elem[i].nod[j+6];
111             epuf[j+3] = elem[i].nod[j+12];
112           }
113           elem[i].nod[6] = epuf[3];
114           elem[i].nod[7] = epuf[4];
115           elem[i].nod[8] = epuf[5];
116           elem[i].nod[12] = epuf[0];
117           elem[i].nod[13] = epuf[1];
118           elem[i].nod[14] = epuf[2];
119         }
120 
121       }
122     }
123 
124     else if( (elem[i].type == 3)||(elem[i].type == 6) )   /* TET */
125     {
126       v_result( &node[elem[i].nod[0]].nx, &node[elem[i].nod[1]].nx, v12);
127       v_result( &node[elem[i].nod[0]].nx, &node[elem[i].nod[2]].nx, v13);
128       v_result( &node[elem[i].nod[0]].nx, &node[elem[i].nod[3]].nx, v15);
129       v_prod(v12,v13,vn);
130       v_result(v15,vn,v15n);
131       bvn=v_betrag(vn);
132       bv15=v_betrag(v15);
133       bgrenz=sqrt(bvn*bvn+bv15*bv15);
134       bv15n=v_betrag(v15n);
135 
136       /* printf ("elemcheck:%d vn x=%e y=%e z=%e\n",elem[i].nr,vn[0],vn[1],vn[2]); */
137       if (bv15n > bgrenz)
138       {
139         /* printf ("elem %d wrong defined, v15n=%e vgrenz=%e\n", elem[i].nr,bv15n,bgrenz);  */
140         for (j=0; j<4; j++) epuf[j] = elem[i].nod[j];
141         elem[i].nod[0] = epuf[1];
142         elem[i].nod[1] = epuf[2];
143         elem[i].nod[2] = epuf[3];
144         elem[i].nod[3] = epuf[0];
145         e_korr++;
146         if (elem[i].type == 6)
147         {
148           for (j=4; j<10; j++) epuf[j] = elem[i].nod[j];
149           elem[i].nod[4] = epuf[5];
150           elem[i].nod[5] = epuf[9];
151           elem[i].nod[6] = epuf[8];
152           elem[i].nod[7] = epuf[4];
153           elem[i].nod[8] = epuf[6];
154           elem[i].nod[9] = epuf[7];
155         }
156 
157       }
158     }
159 
160   }
161   return (e_korr);
162 }
163 
164