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

# User Rev Content
1 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     }