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