ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/acismesh/o3d_inv_face.cpp
Revision: 1
Committed: Mon Jun 11 22:53:07 2007 UTC (17 years, 11 months ago)
File size: 20682 byte(s)
Log Message:

File Contents

# Content
1 /*****************************************************************
2
3 o3d_inv_face.cpp Type:Func
4
5 remaillage par suppression d une face
6
7 Date de creation : 29-4-1999 14 :30 :39
8 Derniere version : 29-4-1999 14 :30 :39
9
10 Vincent FRANCOIS
11
12 *****************************************************************/
13
14
15
16
17
18 /**************************/
19 /* include */
20 #include <stdio.h>
21 #include <string.h>
22 #include <stdlib.h>
23 #include <math.h>
24 #include "const.h"
25 #include "memoire.h"
26 #include "struct.h"
27 #include "struct3d.h"
28 #include "prototype.h"
29
30 /**************************/
31 /* variables globales */
32 extern struct environnement env;
33 extern struct s_mesh *mesh;
34
35
36
37 /**************************/
38 /* programme principal */
39
40 int o3d_inv_face(struct s_tetra *tet)
41 {
42 int face[4];
43 struct s_tetra *tet_voisin,**l_tetra,*tet_nv,*tmp,*tmp2,*tettmp;
44 int facenum,cas;
45 struct s_noeud *no1,*no2,*no3,*noa,*nob,*noc,*nod,*no;
46 struct s_triangle *tri1,*tri2,*tri3,*tri4;
47 int i,j,k;
48 float ab[4],ad[4],ac[4],vec[4];
49 float eps,volume,volume_ori;
50 float crit1,crit2,crit3,crit_opt,crit_solution[4],crit_dep,crit;
51 int n4,n5,num,nummin;
52
53
54 crit_solution[0]=0.;
55 crit_solution[1]=0.;
56 crit_solution[2]=0.;
57 crit_solution[3]=0.;
58 if (tet->triangle[0]->type==BODY) face[0]=1; else face[0]=0;
59 if (tet->triangle[1]->type==BODY) face[1]=1; else face[1]=0;
60 if (tet->triangle[2]->type==BODY) face[2]=1; else face[2]=0;
61 if (tet->triangle[3]->type==BODY) face[3]=1; else face[3]=0;
62 for (facenum=0;facenum<4;facenum++)
63 {
64 if (face[facenum])
65 {
66 tet_voisin=NULL;
67 no1=ADRESSE(tet->triangle[facenum]->n1,noeud,mesh->);
68 no2=ADRESSE(tet->triangle[facenum]->n2,noeud,mesh->);
69 no3=ADRESSE(tet->triangle[facenum]->n3,noeud,mesh->);
70 for (i=0;i<no1->nb_tetra;i++)
71 for (j=0;j<no2->nb_tetra;j++)
72 for (k=0;k<no3->nb_tetra;k++)
73 if ((no1->tetra[i]==no2->tetra[j]) && (no1->tetra[i]==no3->tetra[k]))
74 if (no1->tetra[i]!=tet)
75 if (no1->tetra[i]->etat==ACTIF)
76 tet_voisin=no1->tetra[i];
77
78 noa=ADRESSE(tet->n1,noeud,mesh->);
79 nob=ADRESSE(tet->n2,noeud,mesh->);
80 noc=ADRESSE(tet->n3,noeud,mesh->);
81 nod=ADRESSE(tet->n4,noeud,mesh->);
82 VEC(ab,noa,nob);
83 VEC(ac,noa,noc);
84 VEC(ad,noa,nod);
85 PVEC(vec,ab,ac);
86 volume_ori=(float)fabs((double)PSCA(vec,ad));
87 noa=ADRESSE(tet_voisin->n1,noeud,mesh->);
88 nob=ADRESSE(tet_voisin->n2,noeud,mesh->);
89 noc=ADRESSE(tet_voisin->n3,noeud,mesh->);
90 nod=ADRESSE(tet_voisin->n4,noeud,mesh->);
91 VEC(ab,noa,nob);
92 VEC(ac,noa,noc);
93 VEC(ad,noa,nod);
94 PVEC(vec,ab,ac);
95 volume_ori=volume_ori+(float)fabs((double)PSCA(vec,ad));
96 if (tet->n1!=no1->num)
97 if (tet->n1!=no2->num)
98 if (tet->n1!=no3->num)
99 n4=tet->n1;
100 if (tet->n2!=no1->num)
101 if (tet->n2!=no2->num)
102 if (tet->n2!=no3->num)
103 n4=tet->n2;
104 if (tet->n3!=no1->num)
105 if (tet->n3!=no2->num)
106 if (tet->n3!=no3->num)
107 n4=tet->n3;
108 if (tet->n4!=no1->num)
109 if (tet->n4!=no2->num)
110 if (tet->n4!=no3->num)
111 n4=tet->n1;
112 if (tet_voisin->n1!=no1->num)
113 if (tet_voisin->n1!=no2->num)
114 if (tet_voisin->n1!=no3->num)
115 n5=tet_voisin->n1;
116 if (tet_voisin->n2!=no1->num)
117 if (tet_voisin->n2!=no2->num)
118 if (tet_voisin->n2!=no3->num)
119 n5=tet_voisin->n2;
120 if (tet_voisin->n3!=no1->num)
121 if (tet_voisin->n3!=no2->num)
122 if (tet_voisin->n3!=no3->num)
123 n5=tet_voisin->n3;
124 if (tet_voisin->n4!=no1->num)
125 if (tet_voisin->n4!=no2->num)
126 if (tet_voisin->n4!=no3->num)
127 n5=tet_voisin->n4;
128 MINI(crit_dep,tet->crit,tet_voisin->crit);
129
130 noa=ADRESSE(n4,noeud,mesh->);
131 nob=ADRESSE(no1->num,noeud,mesh->);
132 noc=ADRESSE(no2->num,noeud,mesh->);
133 nod=ADRESSE(n5,noeud,mesh->);
134 VEC(ab,noa,nob);
135 VEC(ac,noa,noc);
136 VEC(ad,noa,nod);
137 PVEC(vec,ab,ac);
138 volume=(float)fabs((double)PSCA(vec,ad));
139 noa=ADRESSE(n4,noeud,mesh->);
140 nob=ADRESSE(n5,noeud,mesh->);
141 noc=ADRESSE(no2->num,noeud,mesh->);
142 nod=ADRESSE(no3->num,noeud,mesh->);
143 VEC(ab,noa,nob);
144 VEC(ac,noa,noc);
145 VEC(ad,noa,nod);
146 PVEC(vec,ab,ac);
147 volume=volume+(float)fabs((double)PSCA(vec,ad));
148 noa=ADRESSE(n4,noeud,mesh->);
149 nob=ADRESSE(n5,noeud,mesh->);
150 noc=ADRESSE(no1->num,noeud,mesh->);
151 nod=ADRESSE(no3->num,noeud,mesh->);
152 VEC(ab,noa,nob);
153 VEC(ac,noa,noc);
154 VEC(ad,noa,nod);
155 PVEC(vec,ab,ac);
156 volume=volume+(float)fabs((double)PSCA(vec,ad));
157 eps=0.0018*(float)pow((double)volume,0.666666666);
158 if (EGAL(volume,volume_ori,eps))
159 {
160 crit1=o3d_cal_qual(n4,no1->num,no2->num,n5);
161 crit2=o3d_cal_qual(n4,n5,no2->num,no3->num);
162 crit3=o3d_cal_qual(n4,n5,no1->num,no3->num);
163 MINI(crit_opt,crit1,crit2);
164 MINI(crit_opt,crit_opt,crit3);
165 if (crit_opt>crit_dep)
166 crit_solution[facenum]=crit_opt;
167 else crit_solution[facenum]=0.;
168 }
169 else crit_solution[facenum]=0.;
170 }
171
172 }
173 MAXI(crit_opt,crit_solution[0],crit_solution[1]);
174 MAXI(crit_opt,crit_opt,crit_solution[2]);
175 MAXI(crit_opt,crit_opt,crit_solution[3]);
176 if (crit_opt!=0)
177 {
178 if (crit_opt==crit_solution[0]) facenum=0;
179 if (crit_opt==crit_solution[1]) facenum=1;
180 if (crit_opt==crit_solution[2]) facenum=2;
181 if (crit_opt==crit_solution[3]) facenum=3;
182 no1=ADRESSE(tet->triangle[facenum]->n1,noeud,mesh->);
183 no2=ADRESSE(tet->triangle[facenum]->n2,noeud,mesh->);
184 no3=ADRESSE(tet->triangle[facenum]->n3,noeud,mesh->);
185 tet_voisin=NULL;
186 for (i=0;i<no1->nb_tetra;i++)
187 for (j=0;j<no2->nb_tetra;j++)
188 for (k=0;k<no3->nb_tetra;k++)
189 if ((no1->tetra[i]==no2->tetra[j]) && (no1->tetra[i]==no3->tetra[k]))
190 if (no1->tetra[i]->etat==ACTIF)
191 if (no1->tetra[i]!=tet)
192 tet_voisin=no1->tetra[i];
193 if (tet->n1!=no1->num)
194 if (tet->n1!=no2->num)
195 if (tet->n1!=no3->num)
196 n4=tet->n1;
197 if (tet->n2!=no1->num)
198 if (tet->n2!=no2->num)
199 if (tet->n2!=no3->num)
200 n4=tet->n2;
201 if (tet->n3!=no1->num)
202 if (tet->n3!=no2->num)
203 if (tet->n3!=no3->num)
204 n4=tet->n3;
205 if (tet->n4!=no1->num)
206 if (tet->n4!=no2->num)
207 if (tet->n4!=no3->num)
208 n4=tet->n1;
209 if (tet_voisin->n1!=no1->num)
210 if (tet_voisin->n1!=no2->num)
211 if (tet_voisin->n1!=no3->num)
212 n5=tet_voisin->n1;
213 if (tet_voisin->n2!=no1->num)
214 if (tet_voisin->n2!=no2->num)
215 if (tet_voisin->n2!=no3->num)
216 n5=tet_voisin->n2;
217 if (tet_voisin->n3!=no1->num)
218 if (tet_voisin->n3!=no2->num)
219 if (tet_voisin->n3!=no3->num)
220 n5=tet_voisin->n3;
221 if (tet_voisin->n4!=no1->num)
222 if (tet_voisin->n4!=no2->num)
223 if (tet_voisin->n4!=no3->num)
224 n5=tet_voisin->n4;
225 l_tetra=(struct s_tetra **)calloc(mesh->nb_tetra+1,sizeof(struct s_tetra *));
226 ERREUR_ALLOC(l_tetra);
227 for (k=0;k<4;k++)
228 {
229 if (k==0) no=ADRESSE(tet->n1,noeud,mesh->);
230 if (k==1) no=ADRESSE(tet->n2,noeud,mesh->);
231 if (k==2) no=ADRESSE(tet->n3,noeud,mesh->);
232 if (k==3) no=ADRESSE(tet->n4,noeud,mesh->);
233 j=0;
234 while ( (j<no->nb_tetra) )
235 {
236 if (no->tetra[j]==tet)
237 {
238 if (j!=(no->nb_tetra-1))
239 {
240 memcpy(l_tetra,&(no->tetra[j+1]),(no->nb_tetra-1-j)*sizeof(struct s_tetra *));
241 memcpy(&(no->tetra[j]),l_tetra,(no->nb_tetra-1-j)*sizeof(struct s_tetra *));
242 }
243 no->tetra[no->nb_tetra-1]=NULL;
244 no->nb_tetra--;
245 }
246 else j++;
247 }
248 }
249 MINI(nummin,tet->n1,tet->n2);
250 MINI(nummin,nummin,tet->n3);
251 MINI(nummin,nummin,tet->n4);
252 no=ADRESSE(nummin,noeud,mesh->);
253 tettmp=no->tete_tet_petit;
254 if (tettmp==tet)
255 {
256 no->tete_tet_petit=no->tete_tet_petit->suiv;
257 if (no->tete_tet_petit==NULL) no->queue_tet_petit=NULL;
258 }
259 else
260 {
261 while (tettmp->suiv!=tet) tettmp=tettmp->suiv;
262 tettmp->suiv=tettmp->suiv->suiv;
263 if (tettmp->suiv==NULL) no->queue_tet_petit=tettmp;
264 }
265 tet->suiv=NULL;
266 cas=(int)(tet->crit*10.);
267 tmp=tet->suivant;
268 tmp2=tet->precedent;
269 if (tet->precedent!=NULL) tet->precedent->suivant=tmp;
270 else mesh->tete_tetra[cas]=tmp;
271 if (tet->suivant!=NULL) tet->suivant->precedent=tmp2;
272 else mesh->queue_tetra[cas]=tmp2;
273 tet->precedent=NULL;
274 tet->suivant=NULL;
275 tet->n1=(-1);
276 tet->n2=(-1);
277 tet->n3=(-1);
278 tet->n4=(-1);
279 tet->crit=0.;
280 tet->opt=0;
281 if (tet->triangle[0]->type==FACE) {tet->triangle[0]->tetra[0]=NULL;tet->triangle[0]->tetra[1]=NULL;}
282 else if (tet->triangle[0]->tetra[0]==tet) {tet->triangle[0]->tetra[0]=tet->triangle[0]->tetra[1];tet->triangle[0]->tetra[1]=NULL;}
283 if (tet->triangle[1]->type==FACE) {tet->triangle[1]->tetra[0]=NULL;tet->triangle[1]->tetra[1]=NULL;}
284 else if (tet->triangle[1]->tetra[0]==tet) {tet->triangle[1]->tetra[0]=tet->triangle[1]->tetra[1];tet->triangle[1]->tetra[1]=NULL;}
285 if (tet->triangle[2]->type==FACE) {tet->triangle[2]->tetra[0]=NULL;tet->triangle[2]->tetra[1]=NULL;}
286 else if (tet->triangle[2]->tetra[0]==tet) {tet->triangle[2]->tetra[0]=tet->triangle[2]->tetra[1];tet->triangle[2]->tetra[1]=NULL;}
287 if (tet->triangle[3]->type==FACE) {tet->triangle[3]->tetra[0]=NULL;tet->triangle[3]->tetra[1]=NULL;}
288 else if (tet->triangle[3]->tetra[0]==tet) {tet->triangle[3]->tetra[0]=tet->triangle[3]->tetra[1];tet->triangle[3]->tetra[1]=NULL;}
289 tet->triangle[0]=NULL;
290 tet->triangle[1]=NULL;
291 tet->triangle[2]=NULL;
292 tet->triangle[3]=NULL;
293 for (k=0;k<4;k++)
294 {
295 if (k==0) no=ADRESSE(tet_voisin->n1,noeud,mesh->);
296 if (k==1) no=ADRESSE(tet_voisin->n2,noeud,mesh->);
297 if (k==2) no=ADRESSE(tet_voisin->n3,noeud,mesh->);
298 if (k==3) no=ADRESSE(tet_voisin->n4,noeud,mesh->);
299 j=0;
300 while ( (j<no->nb_tetra) )
301 {
302 if (no->tetra[j]==tet_voisin)
303 {
304 if (j!=(no->nb_tetra-1))
305 {
306 memcpy(l_tetra,&(no->tetra[j+1]),(no->nb_tetra-1-j)*sizeof(struct s_tetra *));
307 memcpy(&(no->tetra[j]),l_tetra,(no->nb_tetra-1-j)*sizeof(struct s_tetra *));
308 }
309 no->tetra[no->nb_tetra-1]=NULL;
310 no->nb_tetra--;
311 }
312 else j++;
313 }
314 }
315 MINI(nummin,tet_voisin->n1,tet_voisin->n2);
316 MINI(nummin,nummin,tet_voisin->n3);
317 MINI(nummin,nummin,tet_voisin->n4);
318 no=ADRESSE(nummin,noeud,mesh->);
319 tettmp=no->tete_tet_petit;
320 if (tettmp==tet_voisin)
321 {
322 no->tete_tet_petit=no->tete_tet_petit->suiv;
323 if (no->tete_tet_petit==NULL) no->queue_tet_petit=NULL;
324 }
325 else
326 {
327 while (tettmp->suiv!=tet_voisin) tettmp=tettmp->suiv;
328 tettmp->suiv=tettmp->suiv->suiv;
329 if (tettmp->suiv==NULL) no->queue_tet_petit=tettmp;
330 }
331 tet_voisin->suiv=NULL;
332 cas=(int)(tet_voisin->crit*10.);
333 tmp=tet_voisin->suivant;
334 tmp2=tet_voisin->precedent;
335 if (tet_voisin->precedent!=NULL) tet_voisin->precedent->suivant=tmp;
336 else mesh->tete_tetra[cas]=tmp;
337 if (tet_voisin->suivant!=NULL) tet_voisin->suivant->precedent=tmp2;
338 else mesh->queue_tetra[cas]=tmp2;
339 tet_voisin->precedent=NULL;
340 tet_voisin->suivant=NULL;
341 tet_voisin->n1=(-1);
342 tet_voisin->n2=(-1);
343 tet_voisin->n3=(-1);
344 tet_voisin->n4=(-1);
345 tet_voisin->crit=0.;
346 tet_voisin->opt=0;
347 if (tet_voisin->triangle[0]->type==FACE) {tet_voisin->triangle[0]->tetra[0]=NULL;tet_voisin->triangle[0]->tetra[1]=NULL;}
348 else if (tet_voisin->triangle[0]->tetra[0]==tet_voisin) {tet_voisin->triangle[0]->tetra[0]=tet_voisin->triangle[0]->tetra[1];tet_voisin->triangle[0]->tetra[1]=NULL;}
349 if (tet_voisin->triangle[1]->type==FACE) {tet_voisin->triangle[1]->tetra[0]=NULL;tet_voisin->triangle[1]->tetra[1]=NULL;}
350 else if (tet_voisin->triangle[1]->tetra[0]==tet) {tet_voisin->triangle[1]->tetra[0]=tet_voisin->triangle[1]->tetra[1];tet_voisin->triangle[1]->tetra[1]=NULL;}
351 if (tet_voisin->triangle[2]->type==FACE) {tet_voisin->triangle[2]->tetra[0]=NULL;tet_voisin->triangle[2]->tetra[1]=NULL;}
352 else if (tet_voisin->triangle[2]->tetra[0]==tet) {tet_voisin->triangle[2]->tetra[0]=tet_voisin->triangle[2]->tetra[1];tet_voisin->triangle[2]->tetra[1]=NULL;}
353 if (tet_voisin->triangle[3]->type==FACE) {tet_voisin->triangle[3]->tetra[0]=NULL;tet_voisin->triangle[3]->tetra[1]=NULL;}
354 else if (tet_voisin->triangle[3]->tetra[0]==tet) {tet_voisin->triangle[3]->tetra[0]=tet_voisin->triangle[3]->tetra[1];tet_voisin->triangle[3]->tetra[1]=NULL;}
355 tet_voisin->triangle[0]=NULL;
356 tet_voisin->triangle[1]=NULL;
357 tet_voisin->triangle[2]=NULL;
358 tet_voisin->triangle[3]=NULL;
359 free(l_tetra);
360 crit=m3d_cal_qual(n4,no1->num,no2->num,n5);
361 tet->n1=n4;
362 tet->n2=no1->num;
363 tet->n3=no2->num;
364 tet->n4=n5;
365 if (crit==0.)
366 {
367 tet->n3=n5;
368 tet->n4=no2->num;
369 }
370 m3d_i_triangle(&tri1,tet->n1,tet->n3,tet->n2,TOTAL);
371 m3d_i_triangle(&tri2,tet->n1,tet->n2,tet->n4,TOTAL);
372 m3d_i_triangle(&tri3,tet->n2,tet->n3,tet->n4,TOTAL);
373 m3d_i_triangle(&tri4,tet->n1,tet->n4,tet->n3,TOTAL);
374 if (tri1->tetra[0]==NULL) tri1->tetra[0]=tet; else tri1->tetra[1]=tet;
375 if (tri2->tetra[0]==NULL) tri2->tetra[0]=tet; else tri2->tetra[1]=tet;
376 if (tri3->tetra[0]==NULL) tri3->tetra[0]=tet; else tri3->tetra[1]=tet;
377 if (tri4->tetra[0]==NULL) tri4->tetra[0]=tet; else tri4->tetra[1]=tet;
378 tri1->front=2;
379 tri2->front=2;
380 tri3->front=2;
381 tri4->front=2;
382 tet->type=BODY;
383 tet->num_ent=0;
384 tet->crit=m3d_cal_qual(tet->n1,tet->n2,tet->n3,tet->n4);
385 tet->triangle[0]=tri1;
386 tet->triangle[1]=tri2;
387 tet->triangle[2]=tri3;
388 tet->triangle[3]=tri4;
389 tet->etat=ACTIF;
390 no=ADRESSE(tet->n1,noeud,mesh->);
391 NEW_POINTEUR(num,tetra,no->);
392 no->tetra[num]=tet;
393 no=ADRESSE(tet->n2,noeud,mesh->);
394 NEW_POINTEUR(num,tetra,no->);
395 no->tetra[num]=tet;
396 no=ADRESSE(tet->n3,noeud,mesh->);
397 NEW_POINTEUR(num,tetra,no->);
398 no->tetra[num]=tet;
399 no=ADRESSE(tet->n4,noeud,mesh->);
400 NEW_POINTEUR(num,tetra,no->);
401 no->tetra[num]=tet;
402 MINI(nummin,tet->n1,tet->n2);
403 MINI(nummin,nummin,tet->n3);
404 MINI(nummin,nummin,tet->n4);
405 no=ADRESSE(nummin,noeud,mesh->);
406 if (no->tete_tet_petit==NULL)
407 {
408 no->tete_tet_petit=tet;
409 no->queue_tet_petit=tet;
410 }
411 else
412 {
413 no->queue_tet_petit->suiv=tet;
414 no->queue_tet_petit=tet;
415 }
416 m3d_ord_tet(tet);
417 crit=m3d_cal_qual(n4,n5,no2->num,no3->num);
418 tet_voisin->n1=n4;
419 tet_voisin->n2=n5;
420 tet_voisin->n3=no2->num;
421 tet_voisin->n4=no3->num;
422 if (crit==0.)
423 {
424 tet_voisin->n3=no3->num;
425 tet_voisin->n4=no2->num;
426 }
427 m3d_i_triangle(&tri1,tet_voisin->n1,tet_voisin->n3,tet_voisin->n2,TOTAL);
428 m3d_i_triangle(&tri2,tet_voisin->n1,tet_voisin->n2,tet_voisin->n4,TOTAL);
429 m3d_i_triangle(&tri3,tet_voisin->n2,tet_voisin->n3,tet_voisin->n4,TOTAL);
430 m3d_i_triangle(&tri4,tet_voisin->n1,tet_voisin->n4,tet_voisin->n3,TOTAL);
431 if (tri1->tetra[0]==NULL) tri1->tetra[0]=tet_voisin; else tri1->tetra[1]=tet_voisin;
432 if (tri2->tetra[0]==NULL) tri2->tetra[0]=tet_voisin; else tri2->tetra[1]=tet_voisin;
433 if (tri3->tetra[0]==NULL) tri3->tetra[0]=tet_voisin; else tri3->tetra[1]=tet_voisin;
434 if (tri4->tetra[0]==NULL) tri4->tetra[0]=tet_voisin; else tri4->tetra[1]=tet_voisin;
435 tri1->front=2;
436 tri2->front=2;
437 tri3->front=2;
438 tri4->front=2;
439 tet_voisin->type=BODY;
440 tet_voisin->num_ent=0;
441 tet_voisin->crit=m3d_cal_qual(tet_voisin->n1,tet_voisin->n2,tet_voisin->n3,tet_voisin->n4);
442 tet_voisin->triangle[0]=tri1;
443 tet_voisin->triangle[1]=tri2;
444 tet_voisin->triangle[2]=tri3;
445 tet_voisin->triangle[3]=tri4;
446 tet_voisin->etat=ACTIF;
447 no=ADRESSE(tet_voisin->n1,noeud,mesh->);
448 NEW_POINTEUR(num,tetra,no->);
449 no->tetra[num]=tet_voisin;
450 no=ADRESSE(tet_voisin->n2,noeud,mesh->);
451 NEW_POINTEUR(num,tetra,no->);
452 no->tetra[num]=tet_voisin;
453 no=ADRESSE(tet_voisin->n3,noeud,mesh->);
454 NEW_POINTEUR(num,tetra,no->);
455 no->tetra[num]=tet_voisin;
456 no=ADRESSE(tet_voisin->n4,noeud,mesh->);
457 NEW_POINTEUR(num,tetra,no->);
458 no->tetra[num]=tet_voisin;
459 MINI(nummin,tet_voisin->n1,tet_voisin->n2);
460 MINI(nummin,nummin,tet_voisin->n3);
461 MINI(nummin,nummin,tet_voisin->n4);
462 no=ADRESSE(nummin,noeud,mesh->);
463 if (no->tete_tet_petit==NULL)
464 {
465 no->tete_tet_petit=tet_voisin;
466 no->queue_tet_petit=tet_voisin;
467 }
468 else
469 {
470 no->queue_tet_petit->suiv=tet_voisin;
471 no->queue_tet_petit=tet_voisin;
472 }
473
474 m3d_ord_tet(tet_voisin);
475 NEW_ENTITE(tet_nv,tetra,mesh->);
476 crit=m3d_cal_qual(n4,n5,no1->num,no3->num);
477 tet_nv->num=mesh->nb_tetra-1;
478 tet_nv->n1=n4;
479 tet_nv->n2=n5;
480 tet_nv->n3=no1->num;
481 tet_nv->n4=no3->num;
482 if (crit==0.)
483 {
484 tet_nv->n3=no3->num;
485 tet_nv->n4=no1->num;
486 }
487 m3d_i_triangle(&tri1,tet_nv->n1,tet_nv->n3,tet_nv->n2,TOTAL);
488 m3d_i_triangle(&tri2,tet_nv->n1,tet_nv->n2,tet_nv->n4,TOTAL);
489 m3d_i_triangle(&tri3,tet_nv->n2,tet_nv->n3,tet_nv->n4,TOTAL);
490 m3d_i_triangle(&tri4,tet_nv->n1,tet_nv->n4,tet_nv->n3,TOTAL);
491 if (tri1->tetra[0]==NULL) tri1->tetra[0]=tet_nv; else tri1->tetra[1]=tet_nv;
492 if (tri2->tetra[0]==NULL) tri2->tetra[0]=tet_nv; else tri2->tetra[1]=tet_nv;
493 if (tri3->tetra[0]==NULL) tri3->tetra[0]=tet_nv; else tri3->tetra[1]=tet_nv;
494 if (tri4->tetra[0]==NULL) tri4->tetra[0]=tet_nv; else tri4->tetra[1]=tet_nv;
495 tri1->front=2;
496 tri2->front=2;
497 tri3->front=2;
498 tri4->front=2;
499 tet_nv->type=BODY;
500 tet_nv->num_ent=0;
501 tet_nv->crit=m3d_cal_qual(tet_nv->n1,tet_nv->n2,tet_nv->n3,tet_nv->n4);
502 tet_nv->triangle[0]=tri1;
503 tet_nv->triangle[1]=tri2;
504 tet_nv->triangle[2]=tri3;
505 tet_nv->triangle[3]=tri4;
506 tet_nv->etat=ACTIF;
507 no=ADRESSE(tet_nv->n1,noeud,mesh->);
508 NEW_POINTEUR(num,tetra,no->);
509 no->tetra[num]=tet_nv;
510 no=ADRESSE(tet_nv->n2,noeud,mesh->);
511 NEW_POINTEUR(num,tetra,no->);
512 no->tetra[num]=tet_nv;
513 no=ADRESSE(tet_nv->n3,noeud,mesh->);
514 NEW_POINTEUR(num,tetra,no->);
515 no->tetra[num]=tet_nv;
516 no=ADRESSE(tet_nv->n4,noeud,mesh->);
517 NEW_POINTEUR(num,tetra,no->);
518 no->tetra[num]=tet_nv;
519 MINI(nummin,tet_nv->n1,tet_nv->n2);
520 MINI(nummin,nummin,tet_nv->n3);
521 MINI(nummin,nummin,tet_nv->n4);
522 no=ADRESSE(nummin,noeud,mesh->);
523 if (no->tete_tet_petit==NULL)
524 {
525 no->tete_tet_petit=tet_nv;
526 no->queue_tet_petit=tet_nv;
527 }
528 else
529 {
530 no->queue_tet_petit->suiv=tet_nv;
531 no->queue_tet_petit=tet_nv;
532 }
533 m3d_ord_tet(tet_nv);
534 return(1);
535 }
536 else return(0);
537 }