ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_outil.cpp
Revision: 388
Committed: Tue Feb 12 15:43:42 2013 UTC (12 years, 3 months ago) by francois
File size: 53076 byte(s)
Log Message:
Meilleuire structuration du calcul de l'angle matière entre deux triangles

File Contents

# User Rev Content
1 francois 283 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuilli�re et Vincent FRANCOIS
5     // D�partement de G�nie M�canique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du d�partement
8     // de g�nie m�canique de l'Universit� du Qu�bec �
9     // Trois Rivi�res
10     // Les librairies ne peuvent �tre utilis�es sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // mailleur3d_outil.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 � 11H23
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26    
27    
28     //#pragma hdrstop
29    
30     #include <math.h>
31     #include <time.h>
32     #include "mailleur3d.h"
33     #include "mailleur3d_front.h"
34     #include "ot_mathematique.h"
35     #include "ot_boite_3D.h"
36     #include "m3d_noeud.h"
37     #include "m3d_tetra.h"
38     #include "m3d_triangle.h"
39 francois 335 #include "mg_geometrie_outils.h"
40 francois 388 #include "tpl_fonctions_generiques.h"
41 francois 283 #include "const.h"
42    
43     //---------------------------------------------------------------------------
44    
45     //#pragma package(smart_init)
46    
47    
48    
49    
50    
51    
52    
53     double MAILLEUR3D::angle_front(MG_FRONT_3D* ft1,MG_FRONT_3D* ft2)
54     {
55 francois 388 MG_NOEUD* noeud1=ft1->get_noeud1();
56     MG_NOEUD* noeud2=ft1->get_noeud2();
57     MG_NOEUD* noeud3=ft1->get_noeud3();
58     MG_NOEUD* noeud4=ft2->get_noeud1();
59     MG_NOEUD* noeud5=ft2->get_noeud2();
60     MG_NOEUD* noeud6=ft2->get_noeud3();
61     return get_angle_par_noeud<MG_NOEUD*>(noeud1,noeud2,noeud3,noeud4,noeud5,noeud6);
62 francois 283 }
63    
64    
65    
66     double MAILLEUR3D::angle_front(MG_FRONT_3D* ft,MG_SEGMENT* seg)
67     {
68     MG_NOEUD* noeud1;
69     MG_NOEUD* noeud2;
70     MG_NOEUD* noeud3;
71     MG_NOEUD* noeud4;
72    
73    
74     if (seg->get_noeud1()==ft->get_noeud1())
75     {
76     noeud1=ft->get_noeud1();
77     noeud2=ft->get_noeud2();
78     noeud3=ft->get_noeud3();
79     noeud4=seg->get_noeud2();
80     }
81     if (seg->get_noeud1()==ft->get_noeud2())
82     {
83     noeud1=ft->get_noeud2();
84     noeud2=ft->get_noeud3();
85     noeud3=ft->get_noeud1();
86     noeud4=seg->get_noeud2();
87     }
88     if (seg->get_noeud1()==ft->get_noeud3())
89     {
90     noeud1=ft->get_noeud3();
91     noeud2=ft->get_noeud1();
92     noeud3=ft->get_noeud2();
93     noeud4=seg->get_noeud2();
94     }
95     if (seg->get_noeud2()==ft->get_noeud1())
96     {
97     noeud1=ft->get_noeud1();
98     noeud2=ft->get_noeud2();
99     noeud3=ft->get_noeud3();
100     noeud4=seg->get_noeud1();
101     }
102     if (seg->get_noeud2()==ft->get_noeud2())
103     {
104     noeud1=ft->get_noeud2();
105     noeud2=ft->get_noeud3();
106     noeud3=ft->get_noeud1();
107     noeud4=seg->get_noeud1();
108     }
109     if (seg->get_noeud2()==ft->get_noeud3())
110     {
111     noeud1=ft->get_noeud3();
112     noeud2=ft->get_noeud1();
113     noeud3=ft->get_noeud2();
114     noeud4=seg->get_noeud1();
115     }
116    
117     OT_VECTEUR_3D n1n2(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
118     OT_VECTEUR_3D n1n3(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
119     OT_VECTEUR_3D n1n4(noeud4->get_x()-noeud1->get_x(),noeud4->get_y()-noeud1->get_y(),noeud4->get_z()-noeud1->get_z());
120     OT_VECTEUR_3D n1n=n1n2&n1n3;
121     OT_MATRICE_3D mat(n1n2,n1n3,n1n);
122     OT_MATRICE_3D matx(n1n4,n1n3,n1n);
123     OT_MATRICE_3D maty(n1n2,n1n4,n1n);
124     OT_MATRICE_3D matz(n1n2,n1n3,n1n4);
125     double det=mat.get_determinant();
126     double xsi=matx.get_determinant()/det;
127     double eta=maty.get_determinant()/det;
128     double psi=matz.get_determinant()/det;
129    
130     double proj[3];
131     proj[0]=(1.-xsi-eta)*noeud1->get_x()+xsi*noeud2->get_x()+eta*noeud3->get_x();
132     proj[1]=(1.-xsi-eta)*noeud1->get_y()+xsi*noeud2->get_y()+eta*noeud3->get_y();
133     proj[2]=(1.-xsi-eta)*noeud1->get_z()+xsi*noeud2->get_z()+eta*noeud3->get_z();
134     OT_VECTEUR_3D n1nproj(noeud1->get_x()-proj[0],noeud1->get_y()-proj[1],noeud1->get_z()-proj[2]);
135     //n1n4.norme();
136     //n1nproj.norme();
137     double ps=n1n4*n1nproj;
138     if (!(OPERATEUR::egal(ps,0.0,0.0001))) ps=ps/n1n4.get_longueur()/n1nproj.get_longueur();
139     else ps=0.;
140     if (ps>1.) ps=1.;
141     if (ps<-1.) ps=-1.;
142     double angle=acos(ps);
143     if ((xsi<0.) || (eta<0.) ) angle=angle+M_PI/2.;
144     if (psi<0.) angle=2*M_PI-angle;
145     return angle;
146    
147     }
148    
149    
150    
151    
152    
153     class MG_TETRA* MAILLEUR3D::insere_tetra(class MG_VOLUME* mgvol,class MG_FRONT_3D* ft,MG_NOEUD* noeud4,int type,TPL_MAP_ENTITE<class MG_TRIANGLE*>& liste_intersection)
154     {
155     clock_t cpu1=clock(); //debug
156     liste_intersection.vide();
157     MG_NOEUD* noeud1=ft->get_noeud1();
158     MG_NOEUD* noeud2=ft->get_noeud2();
159     MG_NOEUD* noeud3=ft->get_noeud3();
160    
161     // existence du tetra
162     MG_NOEUD* noeud;
163 francois 363 MG_TETRA* tet=mg_maillage->get_mg_tetra(noeud1,noeud2,noeud3,noeud4);
164 francois 283 if (tet!=NULL)
165     {
166     clock_t cpu2=clock(); //debug
167     cpu[11]=cpu[11]+(cpu2-cpu1)/CLK_TCK;
168     nbfois[11]++;
169    
170     return NULL;
171     }
172     // validit� de la solution
173     TPL_MAP_ENTITE<MG_FRONT_3D*> liste;
174     double x=0.25*(noeud1->get_x()+noeud2->get_x()+noeud3->get_x()+noeud4->get_x());
175     double y=0.25*(noeud1->get_y()+noeud2->get_y()+noeud3->get_y()+noeud4->get_y());
176     double z=0.25*(noeud1->get_z()+noeud2->get_z()+noeud3->get_z()+noeud4->get_z());
177     double longueur=1.2*sqrt((x-noeud1->get_x())*(x-noeud1->get_x())+(y-noeud1->get_y())*(y-noeud1->get_y())+(z-noeud1->get_z())*(z-noeud1->get_z()));
178     octree_de_front->rechercher(x,y,z,longueur,liste);
179     int nb_liste=liste.get_nb();
180     for (int i=0;i<nb_liste;i++)
181     {
182     MG_FRONT_3D* fttmp=liste.get(i);
183     clock_t cpu11=clock(); //debug
184    
185     int inter=inter_tetra_triangle(noeud1,noeud2,noeud3,noeud4,fttmp->get_noeud1(),fttmp->get_noeud2(),fttmp->get_noeud3());
186     clock_t cpu22=clock(); //debug
187     cpu[12]=cpu[12]+(cpu22-cpu11)/CLK_TCK;
188     nbfois[12]++;
189    
190     if (inter==true)
191     liste_intersection.ajouter(fttmp->get_triangle());
192     }
193     int nb_inter=liste_intersection.get_nb();
194     if (nb_inter>0)
195     {
196     clock_t cpu2=clock(); //debug
197     cpu[11]=cpu[11]+(cpu2-cpu1)/CLK_TCK;
198     nbfois[11]++;
199     return NULL;
200     }
201     // evaluation de la situation locale on ne cree pas deux tetra voisin de volume presque nul
202     MG_TRIANGLE* triangle1=mg_maillage->get_mg_triangle(noeud1->get_id(),noeud3->get_id(),noeud2->get_id());
203     MG_TRIANGLE* triangle2=mg_maillage->get_mg_triangle(noeud1->get_id(),noeud2->get_id(),noeud4->get_id());
204     MG_TRIANGLE* triangle3=mg_maillage->get_mg_triangle(noeud2->get_id(),noeud3->get_id(),noeud4->get_id());
205     MG_TRIANGLE* triangle4=mg_maillage->get_mg_triangle(noeud1->get_id(),noeud4->get_id(),noeud3->get_id());
206     double vol1=-1.;
207     double vol2=-1.;
208     double vol3=-1.;
209     double vol4=-1.;
210     if (type==GENERATION_NOEUD)
211     {
212     if (triangle1!=NULL)
213     if (triangle1->get_type_entite()==IDM3D_TRIANGLE)
214     {
215     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle1;
216     MG_TETRA* tet=tri->get_voisin(0);
217     if (tet->get_type_entite()==IDM3D_TETRA)
218     {
219     M3D_TETRA* mtet=(M3D_TETRA*)tet;
220     vol1=mtet->get_volume();
221     }
222     }
223     if (triangle2!=NULL)
224     if (triangle2->get_type_entite()==IDM3D_TRIANGLE)
225     {
226     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle2;
227     MG_TETRA* tet=tri->get_voisin(0);
228     if (tet->get_type_entite()==IDM3D_TETRA)
229     {
230     M3D_TETRA* mtet=(M3D_TETRA*)tet;
231     vol2=mtet->get_volume();
232     }
233     }
234     if (triangle3!=NULL)
235     if (triangle3->get_type_entite()==IDM3D_TRIANGLE)
236     {
237     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle3;
238     MG_TETRA* tet=tri->get_voisin(0);
239     if (tet->get_type_entite()==IDM3D_TETRA)
240     {
241     M3D_TETRA* mtet=(M3D_TETRA*)tet;
242     vol3=mtet->get_volume();
243     }
244     }
245     if (triangle4!=NULL)
246     if (triangle4->get_type_entite()==IDM3D_TRIANGLE)
247     {
248     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle4;
249     MG_TETRA* tet=tri->get_voisin(0);
250     if (tet->get_type_entite()==IDM3D_TETRA)
251     {
252     M3D_TETRA* mtet=(M3D_TETRA*)tet;
253     vol4=mtet->get_volume();
254     }
255     }
256     double vol=calcule_volume(noeud1,noeud2,noeud3,noeud4);
257     // calcul du vol du tetra ideal
258     OT_VECTEUR_3D ab(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
259     OT_VECTEUR_3D ac(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
260     OT_VECTEUR_3D da(noeud1->get_x()-noeud4->get_x(),noeud1->get_y()-noeud4->get_y(),noeud1->get_z()-noeud4->get_z());
261     OT_VECTEUR_3D vec=ab&ac;
262     vec.norme();
263     double lg_tet_ideal=fabs(vec*da*ft->get_ifail()*sqrt(3./2.));
264     double vol_ideal=sqrt(2.)/12.*lg_tet_ideal*lg_tet_ideal*lg_tet_ideal;
265     if (vol<0.1*vol_ideal)
266     {
267     if ((vol1>0.) && (vol1<0.1*vol_ideal)) {
268     clock_t cpu2=clock(); //debug
269     cpu[11]=cpu[11]+(cpu2-cpu1)/CLK_TCK;
270     nbfois[11]++;
271     return NULL;
272     }
273     if ((vol2>0.) && (vol2<0.1*vol_ideal)) {
274     clock_t cpu2=clock(); //debug
275     cpu[11]=cpu[11]+(cpu2-cpu1)/CLK_TCK;
276     nbfois[11]++;
277     return NULL;
278     }
279     if ((vol3>0.) && (vol3<0.1*vol_ideal)) {
280     clock_t cpu2=clock(); //debug
281     cpu[11]=cpu[11]+(cpu2-cpu1)/CLK_TCK;
282     nbfois[11]++;
283     return NULL;
284     }
285     if ((vol4>0.) && (vol4<0.1*vol_ideal)) {
286     clock_t cpu2=clock(); //debug
287     cpu[11]=cpu[11]+(cpu2-cpu1)/CLK_TCK;
288     nbfois[11]++;
289     return NULL;
290     }
291     }
292     }
293    
294    
295    
296    
297     // insertion du tetra
298     if (triangle1==NULL) triangle1=insere_triangle(mgvol,noeud1,noeud3,noeud2,MAILLEUR_AUTO);
299     if (triangle2==NULL) triangle2=insere_triangle(mgvol,noeud1,noeud2,noeud4,MAILLEUR_AUTO);
300     if (triangle3==NULL) triangle3=insere_triangle(mgvol,noeud2,noeud3,noeud4,MAILLEUR_AUTO);
301     if (triangle4==NULL) triangle4=insere_triangle(mgvol,noeud1,noeud4,noeud3,MAILLEUR_AUTO);
302     MG_TETRA* tetra=cree_tetra(mgvol,noeud1,noeud2,noeud3,noeud4,triangle1,triangle2,triangle3,triangle4,MAILLEUR_AUTO);
303     mg_maillage->ajouter_mg_tetra(tetra);
304     if (triangle1->get_type_entite()==IDM3D_TRIANGLE)
305     {
306     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle1;
307     tri->ajouter_voisin(tetra);
308     }
309     if (triangle2->get_type_entite()==IDM3D_TRIANGLE)
310     {
311     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle2;
312     tri->ajouter_voisin(tetra);
313     }
314     if (triangle3->get_type_entite()==IDM3D_TRIANGLE)
315     {
316     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle3;
317     tri->ajouter_voisin(tetra);
318     }
319     if (triangle4->get_type_entite()==IDM3D_TRIANGLE)
320     {
321     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)triangle4;
322     tri->ajouter_voisin(tetra);
323     }
324     clock_t cpu2=clock(); //debug
325     cpu[11]=cpu[11]+(cpu2-cpu1)/CLK_TCK;
326     nbfois[11]++;
327    
328     return tetra;
329    
330     }
331    
332    
333    
334     class MG_TRIANGLE* MAILLEUR3D::insere_triangle(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,int origine)
335     {
336     clock_t cpu1=clock(); //debug
337     // existence du triangle
338     MG_TRIANGLE* triangle=mg_maillage->get_mg_triangle(noeud1->get_id(),noeud3->get_id(),noeud2->get_id());
339     if (triangle!=NULL) return NULL;
340     // insertion du triangle
341     MG_SEGMENT* segment1=mg_maillage->get_mg_segment(noeud1->get_id(),noeud2->get_id());
342     MG_SEGMENT* segment2=mg_maillage->get_mg_segment(noeud1->get_id(),noeud3->get_id());
343     MG_SEGMENT* segment3=mg_maillage->get_mg_segment(noeud2->get_id(),noeud3->get_id());
344     if (segment1==NULL) segment1=cree_segment(mgvol,noeud1,noeud2,origine);
345     if (segment2==NULL) segment2=cree_segment(mgvol,noeud1,noeud3,origine);
346     if (segment3==NULL) segment3=cree_segment(mgvol,noeud2,noeud3,origine);
347     MG_TRIANGLE* tri=cree_triangle(mgvol,noeud1,noeud2,noeud3,segment1,segment2,segment3,origine);
348     clock_t cpu2=clock(); //debug
349     cpu[6]=cpu[6]+(cpu2-cpu1)/CLK_TCK;
350     nbfois[6]++;
351     return tri;
352     }
353    
354    
355    
356     class MG_SEGMENT* MAILLEUR3D::insere_segment(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,int origine)
357     {
358     clock_t cpu1=clock(); //debug
359     //existence du segment
360     MG_SEGMENT* segment=mg_maillage->get_mg_segment(noeud1->get_id(),noeud2->get_id());
361     if (segment!=NULL) return NULL;
362     // insertion du segment
363     MG_SEGMENT* seg=cree_segment(mgvol,noeud1,noeud2,origine);
364     clock_t cpu2=clock(); //debug
365     cpu[7]=cpu[7]+(cpu2-cpu1)/CLK_TCK;
366     nbfois[7]++;
367     return seg;
368     }
369    
370    
371    
372    
373     MG_TETRA* MAILLEUR3D::cree_tetra(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4,MG_TRIANGLE* triangle1,MG_TRIANGLE* triangle2,MG_TRIANGLE* triangle3,MG_TRIANGLE* triangle4,int origine)
374     {
375     M3D_TETRA* tetra=new M3D_TETRA(mgvol,noeud1,noeud2,noeud3,noeud4,triangle1,triangle2,triangle3,triangle4,origine);
376     mg_maillage->ajouter_mg_tetra(tetra);
377     return tetra;
378     }
379    
380    
381     MG_TRIANGLE* MAILLEUR3D::cree_triangle(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_SEGMENT* segment1,MG_SEGMENT* segment2,MG_SEGMENT* segment3,int origine)
382     {
383     M3D_TRIANGLE* tri=new M3D_TRIANGLE(mgvol,noeud1,noeud2,noeud3,segment1,segment2,segment3,origine);
384     mg_maillage->ajouter_mg_triangle(tri);
385     return tri;
386     }
387    
388    
389    
390     MG_SEGMENT* MAILLEUR3D::cree_segment(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,int origine)
391     {
392     MG_SEGMENT* seg=mg_maillage->ajouter_mg_segment(mgvol,noeud1,noeud2,origine);
393     return seg;
394     }
395    
396    
397    
398     double MAILLEUR3D::calcule_volume(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4)
399     {
400     OT_VECTEUR_3D ab(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
401     OT_VECTEUR_3D ac(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
402     OT_VECTEUR_3D da(noeud1->get_x()-noeud4->get_x(),noeud1->get_y()-noeud4->get_y(),noeud1->get_z()-noeud4->get_z());
403    
404     OT_VECTEUR_3D pvec=ab&ac;
405     double volume=pvec*da;
406     volume=fabs(volume)/3.;
407     return volume;
408     }
409    
410    
411    
412     double MAILLEUR3D::calcule_longueur_caracteristique(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4)
413     {
414    
415     OT_VECTEUR_3D ab(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
416     double lg=ab.get_longueur();
417     int nb=1;
418     if (noeud3!=NULL)
419     {
420     OT_VECTEUR_3D ac(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
421     OT_VECTEUR_3D bc(noeud3->get_x()-noeud2->get_x(),noeud3->get_y()-noeud2->get_y(),noeud3->get_z()-noeud2->get_z());
422     lg=lg+ac.get_longueur()+bc.get_longueur();
423     nb=3;
424     }
425     if (noeud4!=NULL)
426     {
427     OT_VECTEUR_3D da(noeud1->get_x()-noeud4->get_x(),noeud1->get_y()-noeud4->get_y(),noeud1->get_z()-noeud4->get_z());
428     OT_VECTEUR_3D bd(noeud4->get_x()-noeud2->get_x(),noeud4->get_y()-noeud2->get_y(),noeud4->get_z()-noeud2->get_z());
429     OT_VECTEUR_3D cd(noeud4->get_x()-noeud3->get_x(),noeud4->get_y()-noeud3->get_y(),noeud4->get_z()-noeud3->get_z());
430     lg=lg+da.get_longueur()+bd.get_longueur()+cd.get_longueur();
431     nb=6;
432     }
433     lg=lg*1./nb;
434     return lg;
435    
436     }
437    
438    
439    
440    
441     int MAILLEUR3D::genere_noeud(MG_VOLUME* mgvol,MG_FRONT_3D* ft,TPL_MAP_ENTITE<MG_NOEUD*> &liste_noeud,std::vector<CAS_FRONT*> &liste_cas)
442     {
443     clock_t cpu1=clock(); //debug
444     MG_NOEUD* noeud1=ft->get_noeud1();
445     MG_NOEUD* noeud2=ft->get_noeud2();
446     MG_NOEUD* noeud3=ft->get_noeud3();
447     OT_VECTEUR_3D n1n2(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
448     OT_VECTEUR_3D n1n3(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
449     OT_VECTEUR_3D normal=n1n2&n1n3;
450     normal.norme();
451     double xyz1[3]={noeud1->get_x(),noeud1->get_y(),noeud1->get_z()};
452     double xyz2[3]={noeud2->get_x(),noeud2->get_y(),noeud2->get_z()};
453     double xyz3[3]={noeud3->get_x(),noeud3->get_y(),noeud3->get_z()};
454     double hauteur=0.81649658*ft->get_triangle()->get_longueur();
455     double xyzg[3]={0.333333333333*(xyz1[0]+xyz2[0]+xyz3[0]),0.333333333333*(xyz1[1]+xyz2[1]+xyz3[1]),0.333333333333*(xyz1[2]+xyz2[2]+xyz3[2])};
456     double xyz4[3];
457     do
458     {
459     xyz4[0]=xyzg[0]+hauteur*normal.get_x();
460     xyz4[1]=xyzg[1]+hauteur*normal.get_y();
461     xyz4[2]=xyzg[2]+hauteur*normal.get_z();
462     hauteur=hauteur*0.9;
463     }
464     while (metrique->valide_parametre(xyz4)==0);
465     double l1=calcul_distance_metrique(xyz1,xyz2);
466     double l2=calcul_distance_metrique(xyz1,xyz3);
467     double l3=calcul_distance_metrique(xyz2,xyz3);
468     double l=0.333333333333333*(l1+l2+l3);
469     double longueur_desiree=0.81649658*(priorite_metrique+(1-priorite_metrique)*l);
470     longueur_desiree=longueur_desiree/ft->get_ifail();
471     ajuste_distance_metrique(xyzg,xyz4,longueur_desiree);
472     OT_VECTEUR_3D hauteurajustee(xyzg[0]-xyz4[0],xyzg[1]-xyz4[1],xyzg[2]-xyz4[2]);
473     hauteur=hauteurajustee.get_longueur();
474    
475     // recherche des voisins
476     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_front;
477     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_front_proche;
478     octree_de_front->rechercher(xyz4[0],xyz4[1],xyz4[2],hauteur*1.837117307,liste_front);
479     int nb_liste=liste_front.get_nb();
480     double disref=(priorite_metrique+(1-priorite_metrique)*l)/ft->get_ifail();
481     MG_NOEUD* noeudref=NULL;
482     for (int i=0;i<nb_liste;i++)
483     {
484     MG_FRONT_3D* ft2=liste_front.get(i);
485     for (int j=0;j<3;j++)
486     {
487     MG_NOEUD* noeud_tmp;
488     if (j==0) noeud_tmp=ft2->get_noeud1();
489     if (j==1) noeud_tmp=ft2->get_noeud2();
490     if (j==2) noeud_tmp=ft2->get_noeud3();
491     double *xyz_tmp=noeud_tmp->get_coord();
492     double dis=calcul_distance_metrique(xyz_tmp,xyz4,1);
493     if (dis<disref)
494     {
495     disref=dis;
496     noeudref=noeud_tmp;
497     }
498     }
499     if (ft2!=ft)
500     {
501     double dismin=evaluer_distance_noeud_triangle(xyz4[0],xyz4[1],xyz4[2],ft2->get_triangle());
502     if (dismin<hauteur) liste_front_proche.ajouter(ft2);
503     }
504     }
505     // il y a un noeud proche
506     if (noeudref!=NULL)
507     {
508     double dis2=calcul_distance_metrique(noeudref->get_coord(),xyzg,2);
509     if (dis2<longueur_desiree*1.5)
510     if (noeudref!=noeud1)
511     if (noeudref!=noeud2)
512     if (noeudref!=noeud3)
513     {
514     liste_noeud.ajouter(noeudref);
515     clock_t cpu2=clock(); //debug
516     cpu[8]=cpu[8]+(cpu2-cpu1)/CLK_TCK;
517     nbfois[8]++;
518     return EXISTE;
519     }
520     }
521     // il n y a pas de noeud proche mais il y a une face proche
522     int nb_proche=liste_front_proche.get_nb();
523     int nb_cas=liste_cas.size();
524     if (nb_proche>0)
525     {
526     for (int i=0;i<nb_proche;i++)
527     {
528     MG_FRONT_3D* fttmp=liste_front_proche.get(i);
529     int ok=0;
530     for (int j=0;j<nb_cas;j++)
531     {
532     MG_NOEUD* casnoeud=liste_cas[j]->mgnoeud;
533     if ((fttmp->get_noeud1()==casnoeud) || (fttmp->get_noeud2()==casnoeud) || (fttmp->get_noeud3()==casnoeud) )
534     {
535     ok=1;
536     break;
537     }
538     }
539     if (ok==1) continue;
540     MG_NOEUD* noeudtmp=fttmp->get_noeud1();
541     if (noeudtmp!=noeud1)
542     if (noeudtmp!=noeud2)
543     if (noeudtmp!=noeud3) liste_noeud.ajouter(noeudtmp);
544     noeudtmp=fttmp->get_noeud2();
545     if (noeudtmp!=noeud1)
546     if (noeudtmp!=noeud2)
547     if (noeudtmp!=noeud3) liste_noeud.ajouter(noeudtmp);
548     noeudtmp=fttmp->get_noeud3();
549     if (noeudtmp!=noeud1)
550     if (noeudtmp!=noeud2)
551     if (noeudtmp!=noeud3) liste_noeud.ajouter(noeudtmp);
552    
553     }
554     clock_t cpu2=clock(); //debug
555     cpu[8]=cpu[8]+(cpu2-cpu1)/CLK_TCK;
556     nbfois[8]++;
557     if (liste_noeud.get_nb()>0) return MULTIEXISTE;
558     }
559     // il faut creer un noeud c est parfait c est qu on veut.
560     M3D_NOEUD* nouveau_noeud=new M3D_NOEUD(mgvol,xyz4[0],xyz4[1],xyz4[2],MAILLEUR_AUTO);
561     mg_maillage->ajouter_mg_noeud(nouveau_noeud);
562     liste_noeud.ajouter(nouveau_noeud);
563     clock_t cpu2=clock(); //debug
564     cpu[8]=cpu[8]+(cpu2-cpu1)/CLK_TCK;
565     nbfois[8]++;
566     return CREATION;
567     }
568    
569    
570    
571     double MAILLEUR3D::evaluer_distance_noeud_triangle(double x,double y,double z,MG_TRIANGLE* tri)
572     {
573     double eps=0.0001;
574     MG_NOEUD* noeud1=tri->get_noeud1();
575     MG_NOEUD* noeud2=tri->get_noeud2();
576     MG_NOEUD* noeud3=tri->get_noeud3();
577     OT_VECTEUR_3D n1n2(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
578     OT_VECTEUR_3D n1n3(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
579     OT_VECTEUR_3D n1n4(x-noeud1->get_x(),y-noeud1->get_y(),z-noeud1->get_z());
580     OT_VECTEUR_3D n1n=n1n2&n1n3;
581     OT_MATRICE_3D matbase(n1n2,n1n3,n1n);
582     OT_MATRICE_3D matxsi(n1n4,n1n3,n1n);
583     OT_MATRICE_3D mateta(n1n2,n1n4,n1n);
584     double xsi=matxsi.get_determinant()/matbase.get_determinant();
585     double eta=mateta.get_determinant()/matbase.get_determinant();
586     double dis;
587     if ((eta>-eps) && (xsi>-eps) && (eta+xsi<1.0+eps))
588     {
589     double xproj=(1-xsi-eta)*noeud1->get_x()+xsi*noeud2->get_x()+eta*noeud3->get_x();
590     double yproj=(1-xsi-eta)*noeud1->get_y()+xsi*noeud2->get_y()+eta*noeud3->get_y();
591     double zproj=(1-xsi-eta)*noeud1->get_z()+xsi*noeud2->get_z()+eta*noeud3->get_z();
592     OT_VECTEUR_3D vec(x-xproj,y-yproj,z-zproj);
593     dis=vec.get_longueur();
594     }
595     else
596     {
597     OT_VECTEUR_3D nn1(x-noeud1->get_x(),y-noeud1->get_y(),z-noeud1->get_z());
598     OT_VECTEUR_3D nn2(x-noeud2->get_x(),y-noeud2->get_y(),z-noeud2->get_z());
599     OT_VECTEUR_3D nn3(x-noeud3->get_x(),y-noeud3->get_y(),z-noeud3->get_z());
600     dis=0.3333333333333*(nn1.get_longueur()+nn2.get_longueur()+nn3.get_longueur());
601     }
602     return dis;
603     }
604    
605    
606     void MAILLEUR3D::detruit_tetra(MG_TRIANGLE* tri)
607     {
608     clock_t cpu1=clock(); //debug
609    
610     M3D_TRIANGLE* mtri;
611     //if (tri->get_type_entite()==IDMG_TRIANGLE) return;
612     //else mtri=(M3D_TRIANGLE*)tri;
613     mtri=(M3D_TRIANGLE*)tri;
614    
615     M3D_TETRA* tet=(M3D_TETRA*)mtri->get_voisin(0);
616     M3D_TRIANGLE* mtriangle1=(M3D_TRIANGLE*)tet->get_triangle1();
617     M3D_TRIANGLE* mtriangle2=(M3D_TRIANGLE*)tet->get_triangle2();
618     M3D_TRIANGLE* mtriangle3=(M3D_TRIANGLE*)tet->get_triangle3();
619     M3D_TRIANGLE* mtriangle4=(M3D_TRIANGLE*)tet->get_triangle4();
620    
621    
622     tet->etat_detruit();
623     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_de_front;
624     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_de_front2;
625     MG_FRONT_3D* fttet1=NULL;
626     MG_FRONT_3D* fttet2=NULL;
627     MG_FRONT_3D* fttet3=NULL;
628     MG_FRONT_3D* fttet4=NULL;
629    
630     if (mtriangle1->get_etat_front()==FRONT_ACTIF)
631     {
632     MG_FRONT_3D* fttmp=mtriangle1->get_mgfront();
633     fttet1=fttmp;
634     liste_de_front.ajouter(fttmp->get_front_voisin(0));
635     liste_de_front.ajouter(fttmp->get_front_voisin(1));
636     liste_de_front.ajouter(fttmp->get_front_voisin(2));
637     //supprimer_front_en_reculant(fttmp);
638     mtriangle1->supprimer_voisin(tet);
639     }
640     else
641     {
642     MG_FRONT_3D* ftn1=ajouter_front_courant(PRIORITAIRE,tet->get_noeud1(),tet->get_noeud2(),tet->get_noeud3(),mtriangle1);
643     ftn1->incremente_ifail();
644     mtriangle1->supprimer_voisin(tet);
645     liste_de_front2.ajouter(ftn1);
646     }
647     if (mtriangle2->get_etat_front()==FRONT_ACTIF)
648     {
649     MG_FRONT_3D* fttmp=mtriangle2->get_mgfront();
650     fttet2=fttmp;
651     liste_de_front.ajouter(fttmp->get_front_voisin(0));
652     liste_de_front.ajouter(fttmp->get_front_voisin(1));
653     liste_de_front.ajouter(fttmp->get_front_voisin(2));
654     //supprimer_front_en_reculant(fttmp);
655     mtriangle2->supprimer_voisin(tet);
656     }
657     else
658     {
659     MG_FRONT_3D* ftn1=ajouter_front_courant(PRIORITAIRE,tet->get_noeud1(),tet->get_noeud4(),tet->get_noeud2(),mtriangle2);
660     ftn1->incremente_ifail();
661     mtriangle2->supprimer_voisin(tet);
662     liste_de_front2.ajouter(ftn1);
663     }
664     if (mtriangle3->get_etat_front()==FRONT_ACTIF)
665     {
666     MG_FRONT_3D* fttmp=mtriangle3->get_mgfront();
667     fttet3=fttmp;
668     liste_de_front.ajouter(fttmp->get_front_voisin(0));
669     liste_de_front.ajouter(fttmp->get_front_voisin(1));
670     liste_de_front.ajouter(fttmp->get_front_voisin(2));
671     //supprimer_front_en_reculant(fttmp);
672     mtriangle3->supprimer_voisin(tet);
673     }
674     else
675     {
676     MG_FRONT_3D* ftn1=ajouter_front_courant(PRIORITAIRE,tet->get_noeud2(),tet->get_noeud4(),tet->get_noeud3(),mtriangle3);
677     ftn1->incremente_ifail();
678     mtriangle3->supprimer_voisin(tet);
679     liste_de_front2.ajouter(ftn1);
680     }
681     if (mtriangle4->get_etat_front()==FRONT_ACTIF)
682     {
683     MG_FRONT_3D* fttmp=mtriangle4->get_mgfront();
684     fttet4=fttmp;
685     liste_de_front.ajouter(fttmp->get_front_voisin(0));
686     liste_de_front.ajouter(fttmp->get_front_voisin(1));
687     liste_de_front.ajouter(fttmp->get_front_voisin(2));
688     //supprimer_front_en_reculant(fttmp);
689     mtriangle4->supprimer_voisin(tet);
690     }
691     else
692     {
693     MG_FRONT_3D* ftn1=ajouter_front_courant(PRIORITAIRE,tet->get_noeud1(),tet->get_noeud3(),tet->get_noeud4(),mtriangle4);
694     ftn1->incremente_ifail();
695     mtriangle4->supprimer_voisin(tet);
696     liste_de_front2.ajouter(ftn1);
697     }
698    
699     if (fttet1!=NULL)
700     {
701     liste_de_front.supprimer(fttet1);
702     supprimer_front_en_reculant(fttet1);
703     }
704     if (fttet2!=NULL)
705     {
706     liste_de_front.supprimer(fttet2);
707     supprimer_front_en_reculant(fttet2);
708     }
709     if (fttet3!=NULL)
710     {
711     liste_de_front.supprimer(fttet3);
712     supprimer_front_en_reculant(fttet3);
713     }
714     if (fttet4!=NULL)
715     {
716     liste_de_front.supprimer(fttet4);
717     supprimer_front_en_reculant(fttet4);
718     }
719     int nb_liste1=liste_de_front.get_nb();
720     for (int i=0;i<nb_liste1;i++)
721     if (liste_de_front.get(i)!=NULL)
722     mise_a_jour_voisin_front(liste_de_front.get(i));
723     int nb_liste2=liste_de_front2.get_nb();
724     for (int i=0;i<nb_liste2;i++)
725     {
726     mise_a_jour_voisin_front(liste_de_front2.get(i));
727     mise_a_jour_voisin_front(liste_de_front2.get(i)->get_front_voisin(0));
728     mise_a_jour_voisin_front(liste_de_front2.get(i)->get_front_voisin(1));
729     mise_a_jour_voisin_front(liste_de_front2.get(i)->get_front_voisin(2));
730     }
731    
732     for (int k=0;k<4;k++)
733     {
734     MG_NOEUD* noeud;
735     if (k==0) noeud=tet->get_noeud1();
736     if (k==1) noeud=tet->get_noeud2();
737     if (k==2) noeud=tet->get_noeud3();
738     if (k==3) noeud=tet->get_noeud4();
739     int nb_tet=noeud->get_lien_tetra()->get_nb();
740    
741     if (noeud->get_type_entite()==IDM3D_NOEUD)
742     {
743     int test=false;
744     M3D_NOEUD* mnoeud=(M3D_NOEUD*)noeud;
745     for (int i=0;i<nb_tet;i++)
746     {
747     MG_TETRA* tet=noeud->get_lien_tetra()->get(i);
748     if (tet->get_type_entite()==IDM3D_TETRA)
749     {
750     M3D_TETRA* mtet=(M3D_TETRA*)tet;
751     if (mtet->get_etat()==ACTIF) test=true;
752     }
753     else test=true;
754     }
755     if (test==false) mnoeud->etat_detruit();
756     }
757     }
758     clock_t cpu2=clock();
759     cpu[9]=cpu[9]+(cpu2-cpu1)/CLK_TCK;
760     nbfois[9]++;
761    
762     }
763    
764     double MAILLEUR3D::calcul_distance_metrique(MG_SEGMENT* seg,int pas)
765     {
766     double *xyz1=seg->get_noeud1()->get_coord();
767     double *xyz2=seg->get_noeud2()->get_coord();
768     return calcul_distance_metrique(xyz1,xyz2,pas);
769     }
770    
771     double MAILLEUR3D::calcul_distance_metrique(double *xyz1,double* xyz2,int pas)
772     {
773     double longueur=0.;
774     double dxyz[3];
775     dxyz[0]=xyz2[0]-xyz1[0];
776     dxyz[1]=xyz2[1]-xyz1[1];
777     dxyz[2]=xyz2[2]-xyz1[2];
778     for (int i=0;i<pas;i++)
779     {
780     double ti=1.0*i/pas;
781     double tii=1.0*(i+1)/pas;
782     double tgauss1=0.7886751345*tii+0.2113248654*ti;
783     double xyz[3];
784     xyz[0]=xyz1[0]+tgauss1*(xyz2[0]-xyz1[0]);
785     xyz[1]=xyz1[1]+tgauss1*(xyz2[1]-xyz1[1]);
786     xyz[2]=xyz1[2]+tgauss1*(xyz2[2]-xyz1[2]);
787     double tenseur[9];
788     metrique->evaluer(xyz,tenseur);
789     double val= sqrt(dxyz[0]*dxyz[0]*tenseur[0]+dxyz[0]*dxyz[1]*tenseur[3]+dxyz[0]*dxyz[2]*tenseur[6]+dxyz[1]*dxyz[0]*tenseur[1]+dxyz[1]*dxyz[1]*tenseur[4]+dxyz[1]*dxyz[2]*tenseur[7]+dxyz[2]*dxyz[0]*tenseur[2]+dxyz[2]*dxyz[1]*tenseur[5]+dxyz[2]*dxyz[2]*tenseur[8]);
790     longueur=longueur+0.5*(tii-ti)*val;
791     double tgauss2=0.7886751345*ti+0.2113248654*tii;
792     xyz[0]=xyz1[0]+tgauss2*(xyz2[0]-xyz1[0]);
793     xyz[1]=xyz1[1]+tgauss2*(xyz2[1]-xyz1[1]);
794     xyz[2]=xyz1[2]+tgauss2*(xyz2[2]-xyz1[2]);
795     metrique->evaluer(xyz,tenseur);
796     val= sqrt(dxyz[0]*dxyz[0]*tenseur[0]+dxyz[0]*dxyz[1]*tenseur[3]+dxyz[0]*dxyz[2]*tenseur[6]+dxyz[1]*dxyz[0]*tenseur[1]+dxyz[1]*dxyz[1]*tenseur[4]+dxyz[1]*dxyz[2]*tenseur[7]+dxyz[2]*dxyz[0]*tenseur[2]+dxyz[2]*dxyz[1]*tenseur[5]+dxyz[2]*dxyz[2]*tenseur[8]);
797     longueur=longueur+0.5*(tii-ti)*val;
798     }
799     return longueur;
800     }
801    
802     void MAILLEUR3D::ajuste_distance_metrique(double *xyz1,double *xyz2,double longueur_desiree,int pas)
803     {
804     double longueur=0,ancienne_longueur;
805     double ti,tii;
806     double dxyz[3];
807     dxyz[0]=xyz2[0]-xyz1[0];
808     dxyz[1]=xyz2[1]-xyz1[1];
809     dxyz[2]=xyz2[2]-xyz1[2];
810     int i=0;
811     do
812     {
813     ancienne_longueur=longueur;
814     ti=1.0*i/pas;
815     tii=1.0*(i+1)/pas;
816     double tgauss1=0.7886751345*tii+0.2113248654*ti;
817     double xyz[3];
818     xyz[0]=xyz1[0]+tgauss1*(xyz2[0]-xyz1[0]);
819     xyz[1]=xyz1[1]+tgauss1*(xyz2[1]-xyz1[1]);
820     xyz[2]=xyz1[2]+tgauss1*(xyz2[2]-xyz1[2]);
821     if (i+1>pas)
822     {
823     int val=metrique->valide_parametre(xyz);
824     if (!val) return;
825     }
826     double tenseur[9];
827     metrique->evaluer(xyz,tenseur);
828     double val= sqrt(dxyz[0]*dxyz[0]*tenseur[0]+dxyz[0]*dxyz[1]*tenseur[3]+dxyz[0]*dxyz[2]*tenseur[6]+dxyz[1]*dxyz[0]*tenseur[1]+dxyz[1]*dxyz[1]*tenseur[4]+dxyz[1]*dxyz[2]*tenseur[7]+dxyz[2]*dxyz[0]*tenseur[2]+dxyz[2]*dxyz[1]*tenseur[5]+dxyz[2]*dxyz[2]*tenseur[8]);
829     longueur=longueur+0.5*(tii-ti)*val;
830     double tgauss2=0.7886751345*ti+0.2113248654*tii;
831     xyz[0]=xyz1[0]+tgauss2*(xyz2[0]-xyz1[0]);
832     xyz[1]=xyz1[1]+tgauss2*(xyz2[1]-xyz1[1]);
833     xyz[2]=xyz1[2]+tgauss2*(xyz2[2]-xyz1[2]);
834     if (i+1>pas)
835     {
836     int val=metrique->valide_parametre(xyz);
837     if (!val) return;
838     }
839     metrique->evaluer(xyz,tenseur);
840     val= sqrt(dxyz[0]*dxyz[0]*tenseur[0]+dxyz[0]*dxyz[1]*tenseur[3]+dxyz[0]*dxyz[2]*tenseur[6]+dxyz[1]*dxyz[0]*tenseur[1]+dxyz[1]*dxyz[1]*tenseur[4]+dxyz[1]*dxyz[2]*tenseur[7]+dxyz[2]*dxyz[0]*tenseur[2]+dxyz[2]*dxyz[1]*tenseur[5]+dxyz[2]*dxyz[2]*tenseur[8]);
841     longueur=longueur+0.5*(tii-ti)*val;
842     i++;
843     }
844     while (longueur<longueur_desiree);
845     double t=ti+(tii-ti)*(longueur_desiree-ancienne_longueur)/(longueur-ancienne_longueur);
846     xyz2[0]=xyz1[0]+t*(xyz2[0]-xyz1[0]);
847     xyz2[1]=xyz1[1]+t*(xyz2[1]-xyz1[1]);
848     xyz2[2]=xyz1[2]+t*(xyz2[2]-xyz1[2]);
849     }
850    
851     void MAILLEUR3D::detruit_element_inactif(void)
852     {
853     clock_t cpu1=clock();
854     TPL_MAP_ENTITE<MG_TETRA*> lsttet;
855     TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
856     LISTE_MG_TETRA::iterator it;
857    
858     for (MG_TETRA* tet=mg_maillage->get_premier_tetra(it);tet!=NULL;tet=mg_maillage->get_suivant_tetra(it))
859     {
860     M3D_TETRA* mtet=(M3D_TETRA*)tet;
861     if (mtet->get_etat()==DETRUIT)
862     lsttet.ajouter(tet);
863     }
864     LISTE_MG_NOEUD::iterator it2;
865     for (MG_NOEUD* noeud=mg_maillage->get_premier_noeud(it2);noeud!=NULL;noeud=mg_maillage->get_suivant_noeud(it2))
866     {
867     if (noeud->get_type_entite()==IDM3D_NOEUD)
868     {
869     M3D_NOEUD* mnoeud=(M3D_NOEUD*)noeud;
870     if (mnoeud->get_etat()==DETRUIT)
871     lstnoeud.ajouter(noeud);
872     }
873     }
874     TPL_MAP_ENTITE<MG_TETRA*>::ITERATEUR it3;
875     for (MG_TETRA* tet=lsttet.get_premier(it3);tet!=NULL;tet=lsttet.get_suivant(it3))
876     mg_maillage->supprimer_mg_tetraid(tet->get_id());
877     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it4;
878     for (MG_NOEUD* noeud=lstnoeud.get_premier(it4);noeud!=NULL;noeud=lstnoeud.get_suivant(it4))
879     mg_maillage->supprimer_mg_noeudid(noeud->get_id());
880    
881     clock_t cpu2=clock();
882     cpu[10]=cpu[10]+(cpu2-cpu1)/CLK_TCK;
883     nbfois[10]++;
884     }
885    
886    
887    
888     double MAILLEUR3D::calcul_volume_tetra_metrique(MG_TETRA* tet)
889     {
890     double *xyz1=tet->get_noeud1()->get_coord();
891     double *xyz2=tet->get_noeud2()->get_coord();
892     double *xyz3=tet->get_noeud3()->get_coord();
893     double *xyz4=tet->get_noeud4()->get_coord();
894     /*double xyzm[3];
895     double xyzg[3];
896     xyzm[0]=(xyz1[0]+xyz2[0])/2.;
897     xyzm[1]=(xyz1[1]+xyz2[1])/2.;
898     xyzm[2]=(xyz1[2]+xyz2[2])/2.;
899     xyzg[0]=(xyz1[0]+xyz2[0]+xyz3[0])/3.;
900     xyzg[1]=(xyz1[1]+xyz2[1]+xyz3[1])/3.;
901     xyzg[2]=(xyz1[2]+xyz2[2]+xyz3[2])/3.;
902     double base=calcul_distance_metrique(xyz1,xyz2);
903     double hauteur=calcul_distance_metrique(xyzm,xyz3);
904     double hauteur2=calcul_distance_metrique(xyzg,xyz4);
905     double vol=base*hauteur*hauteur2*1.414213562;*/
906     double a=0.1381966012;
907     double b=0.5854101965;
908     double poids_gauss[4],xsi_gauss[4],eta_gauss[4],zeta_gauss[4];
909     poids_gauss[0]=0.041666666666666;
910     xsi_gauss[0]=a;
911     eta_gauss[0]=a;
912     zeta_gauss[0]=a;
913     poids_gauss[1]=0.041666666666666;
914     xsi_gauss[1]=a;
915     eta_gauss[1]=a;
916     zeta_gauss[1]=b;
917     poids_gauss[2]=0.041666666666666;
918     xsi_gauss[2]=a;
919     eta_gauss[2]=b;
920     zeta_gauss[2]=a;
921     poids_gauss[3]=0.041666666666666;
922     xsi_gauss[3]=b;
923     eta_gauss[3]=a;
924     zeta_gauss[3]=a;
925     OT_VECTEUR_3D vec1(xyz1,xyz2);
926     OT_VECTEUR_3D vec2(xyz1,xyz3);
927     OT_VECTEUR_3D vec3(xyz1,xyz4);
928     double facteur=(vec1&vec2)*vec3;
929     double vol=0.;
930     for (int j=0;j<4;j++)
931     {
932     double xyz[3];
933     xyz[0]=(1-xsi_gauss[j]-eta_gauss[j]-zeta_gauss[j])*xyz1[0]+xsi_gauss[j]*xyz2[0]+eta_gauss[j]*xyz3[0]+zeta_gauss[j]*xyz4[0];
934     xyz[1]=(1-xsi_gauss[j]-eta_gauss[j]-zeta_gauss[j])*xyz1[1]+xsi_gauss[j]*xyz2[1]+eta_gauss[j]*xyz3[1]+zeta_gauss[j]*xyz4[1];
935     xyz[2]=(1-xsi_gauss[j]-eta_gauss[j]-zeta_gauss[j])*xyz1[2]+xsi_gauss[j]*xyz2[2]+eta_gauss[j]*xyz3[2]+zeta_gauss[j]*xyz4[2];
936     double tenseur[9];
937     metrique->evaluer(xyz,tenseur);
938     double dens=1/sqrt(tenseur[0]);
939     dens=dens*dens*dens;
940     vol=vol+poids_gauss[j]*facteur*8.485281374/dens;
941     }
942    
943     return vol;
944     }
945    
946    
947     void MAILLEUR3D::analyse_maillage_obtenu(double &vol)
948     {
949     int nb=mg_maillage->get_nb_mg_tetra();
950     vol=0.;
951     for (int i=0;i<nb;i++)
952     {
953     MG_TETRA* tet=mg_maillage->get_mg_tetra(i);
954     vol=vol+calcul_volume_tetra_metrique(tet);
955     }
956     }
957    
958    
959     void MAILLEUR3D::insere_contrainte_tetra(MG_VOLUME* mgvol,TPL_LISTE_ENTITE<MG_TETRA*> *lsttet)
960     {
961     map<long,long,less<long> > lstcorrespondancenoeud;
962     int nbtet=lsttet->get_nb();
963     for (int i=0;i<nbtet;i++)
964     {
965     M3D_TETRA* tet=(M3D_TETRA*)lsttet->get(i);
966     double *xyz1=tet->get_noeud1()->get_coord();
967     double *xyz2=tet->get_noeud2()->get_coord();
968     double *xyz3=tet->get_noeud3()->get_coord();
969     double *xyz4=tet->get_noeud4()->get_coord();
970     double xyz[3];
971     xyz[0]=(xyz1[0]+xyz2[0]+xyz3[0]+xyz4[0])*0.25;
972     xyz[1]=(xyz1[1]+xyz2[1]+xyz3[1]+xyz4[1])*0.25;
973     xyz[2]=(xyz1[2]+xyz2[2]+xyz3[2]+xyz4[2])*0.25;
974     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_trouvee;
975     OT_VECTEUR_3D vec1(xyz,xyz1);
976     OT_VECTEUR_3D vec2(xyz,xyz2);
977     OT_VECTEUR_3D vec3(xyz,xyz3);
978     OT_VECTEUR_3D vec4(xyz,xyz4);
979     double rayonrecherche=vec1.get_longueur();
980     if (vec2.get_longueur()>rayonrecherche) rayonrecherche=vec2.get_longueur();
981     if (vec3.get_longueur()>rayonrecherche) rayonrecherche=vec3.get_longueur();
982     if (vec4.get_longueur()>rayonrecherche) rayonrecherche=vec4.get_longueur();
983     rayonrecherche=rayonrecherche*1.1;
984     octree_de_front->rechercher(xyz[0],xyz[1],xyz[2],rayonrecherche,liste_trouvee);
985     MG_NOEUD* noeudref1=NULL;
986     if (lstcorrespondancenoeud.find(tet->get_noeud1()->get_nouveau_numero())!=lstcorrespondancenoeud.end())
987     noeudref1=mg_maillage->get_mg_noeudid(lstcorrespondancenoeud[tet->get_noeud1()->get_nouveau_numero()]);
988     MG_NOEUD* noeudref2=NULL;
989     if (lstcorrespondancenoeud.find(tet->get_noeud2()->get_nouveau_numero())!=lstcorrespondancenoeud.end())
990     noeudref2=mg_maillage->get_mg_noeudid(lstcorrespondancenoeud[tet->get_noeud2()->get_nouveau_numero()]);
991     MG_NOEUD* noeudref3=NULL;
992     if (lstcorrespondancenoeud.find(tet->get_noeud3()->get_nouveau_numero())!=lstcorrespondancenoeud.end())
993     noeudref3=mg_maillage->get_mg_noeudid(lstcorrespondancenoeud[tet->get_noeud3()->get_nouveau_numero()]);
994     MG_NOEUD* noeudref4=NULL;
995     if (lstcorrespondancenoeud.find(tet->get_noeud4()->get_nouveau_numero())!=lstcorrespondancenoeud.end())
996     noeudref4=mg_maillage->get_mg_noeudid(lstcorrespondancenoeud[tet->get_noeud4()->get_nouveau_numero()]);
997     int nbtrouve=liste_trouvee.get_nb();
998     for (int j=0;j<nbtrouve;j++)
999     {
1000     if ((noeudref1!=NULL) && (noeudref2!=NULL) && (noeudref3!=NULL) && (noeudref4!=NULL) ) break;
1001     MG_FRONT_3D* ft=liste_trouvee.get(j);
1002     TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
1003     lstnoeud.ajouter(ft->get_noeud1());
1004     lstnoeud.ajouter(ft->get_noeud2());
1005     lstnoeud.ajouter(ft->get_noeud3());
1006     if (noeudref1==NULL)
1007     {
1008     int nb=lstnoeud.get_nb();
1009     for (int k=0;k<nb;k++)
1010     {
1011     double *xyztmp=lstnoeud.get(k)->get_coord();
1012     OT_VECTEUR_3D vec(xyztmp,xyz1);
1013     double longueur=vec.get_longueur();
1014     if (longueur<1e-6*rayonrecherche)
1015     {
1016     noeudref1=lstnoeud.get(k);
1017     lstnoeud.supprimer(lstnoeud.get(k));
1018     break;
1019     }
1020     }
1021     }
1022     if (noeudref2==NULL)
1023     {
1024     int nb=lstnoeud.get_nb();
1025     for (int k=0;k<nb;k++)
1026     {
1027     double *xyztmp=lstnoeud.get(k)->get_coord();
1028     OT_VECTEUR_3D vec(xyztmp,xyz2);
1029     double longueur=vec.get_longueur();
1030     if (longueur<1e-6*rayonrecherche)
1031     {
1032     noeudref2=lstnoeud.get(k);
1033     lstnoeud.supprimer(lstnoeud.get(k));
1034     break;
1035     }
1036     }
1037     }
1038     if (noeudref3==NULL)
1039     {
1040     int nb=lstnoeud.get_nb();
1041     for (int k=0;k<nb;k++)
1042     {
1043     double *xyztmp=lstnoeud.get(k)->get_coord();
1044     OT_VECTEUR_3D vec(xyztmp,xyz3);
1045     double longueur=vec.get_longueur();
1046     if (longueur<1e-6*rayonrecherche)
1047     {
1048     noeudref3=lstnoeud.get(k);
1049     lstnoeud.supprimer(lstnoeud.get(k));
1050     break;
1051     }
1052     }
1053     }
1054     if (noeudref4==NULL)
1055     {
1056     int nb=lstnoeud.get_nb();
1057     for (int k=0;k<nb;k++)
1058     {
1059     double *xyztmp=lstnoeud.get(k)->get_coord();
1060     OT_VECTEUR_3D vec(xyztmp,xyz4);
1061     double longueur=vec.get_longueur();
1062     if (longueur<1e-6*rayonrecherche)
1063     {
1064     noeudref4=lstnoeud.get(k);
1065     lstnoeud.supprimer(lstnoeud.get(k));
1066     break;
1067     }
1068     }
1069     }
1070     }
1071     if (noeudref1==NULL)
1072     {
1073     noeudref1=mg_maillage->ajouter_mg_noeud(mgvol,xyz1[0],xyz1[1],xyz1[2],IMPOSE);
1074     if (tet->get_noeud1()->get_nouveau_numero()!=(-1))
1075     {
1076     noeudref1->change_nouveau_numero(tet->get_noeud1()->get_nouveau_numero());
1077     pair<long,long> tmp(noeudref1->get_nouveau_numero(),noeudref1->get_id());
1078     lstcorrespondancenoeud.insert(tmp);
1079     }
1080     }
1081     if (noeudref2==NULL)
1082     {
1083     noeudref2=mg_maillage->ajouter_mg_noeud(mgvol,xyz2[0],xyz2[1],xyz2[2],IMPOSE);
1084     if (tet->get_noeud2()->get_nouveau_numero()!=(-1))
1085     {
1086     noeudref2->change_nouveau_numero(tet->get_noeud2()->get_nouveau_numero());
1087     pair<long,long> tmp(noeudref2->get_nouveau_numero(),noeudref2->get_id());
1088     lstcorrespondancenoeud.insert(tmp);
1089     }
1090     }
1091     if (noeudref3==NULL)
1092     {
1093     noeudref3=mg_maillage->ajouter_mg_noeud(mgvol,xyz3[0],xyz3[1],xyz3[2],IMPOSE);
1094     if (tet->get_noeud3()->get_nouveau_numero()!=(-1))
1095     {
1096     noeudref3->change_nouveau_numero(tet->get_noeud3()->get_nouveau_numero());
1097     pair<long,long> tmp(noeudref3->get_nouveau_numero(),noeudref3->get_id());
1098     lstcorrespondancenoeud.insert(tmp);
1099     }
1100     }
1101     if (noeudref4==NULL)
1102     {
1103     noeudref4=mg_maillage->ajouter_mg_noeud(mgvol,xyz4[0],xyz4[1],xyz4[2],IMPOSE);
1104     if (tet->get_noeud4()->get_nouveau_numero()!=(-1))
1105     {
1106     noeudref4->change_nouveau_numero(tet->get_noeud4()->get_nouveau_numero());
1107     pair<long,long> tmp(noeudref4->get_nouveau_numero(),noeudref4->get_id());
1108     lstcorrespondancenoeud.insert(tmp);
1109     }
1110     }
1111     M3D_TRIANGLE* triangle1=(M3D_TRIANGLE*)mg_maillage->get_mg_triangle(noeudref1->get_id(),noeudref3->get_id(),noeudref2->get_id());
1112     M3D_TRIANGLE* triangle2=(M3D_TRIANGLE*)mg_maillage->get_mg_triangle(noeudref1->get_id(),noeudref2->get_id(),noeudref4->get_id());
1113     M3D_TRIANGLE* triangle3=(M3D_TRIANGLE*)mg_maillage->get_mg_triangle(noeudref2->get_id(),noeudref3->get_id(),noeudref4->get_id());
1114     M3D_TRIANGLE* triangle4=(M3D_TRIANGLE*)mg_maillage->get_mg_triangle(noeudref1->get_id(),noeudref4->get_id(),noeudref3->get_id());
1115     if (triangle1==NULL) triangle1=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref1,noeudref3,noeudref2,IMPOSE);
1116     if (triangle2==NULL) triangle2=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref1,noeudref2,noeudref4,IMPOSE);
1117     if (triangle3==NULL) triangle3=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref2,noeudref3,noeudref4,IMPOSE);
1118     if (triangle4==NULL) triangle4=(M3D_TRIANGLE*)insere_triangle(mgvol,noeudref1,noeudref4,noeudref3,IMPOSE);
1119     MG_TETRA* tetra=cree_tetra(mgvol,noeudref1,noeudref2,noeudref3,noeudref4,triangle1,triangle2,triangle3,triangle4,IMPOSE);
1120     tetra->change_nouveau_numero(tet->get_nouveau_numero());
1121     mg_maillage->ajouter_mg_tetra(tetra);
1122     triangle1->ajouter_voisin(tetra);
1123     triangle2->ajouter_voisin(tetra);
1124     triangle3->ajouter_voisin(tetra);
1125     triangle4->ajouter_voisin(tetra);
1126     MG_FRONT_3D *ftref1=NULL;
1127     MG_FRONT_3D *ftref2=NULL;
1128     MG_FRONT_3D *ftref3=NULL;
1129     MG_FRONT_3D *ftref4=NULL;
1130     if (triangle1->get_etat_front()==FRONT_ACTIF) ftref1=triangle1->get_mgfront();
1131     if (triangle2->get_etat_front()==FRONT_ACTIF) ftref2=triangle2->get_mgfront();
1132     if (triangle3->get_etat_front()==FRONT_ACTIF) ftref3=triangle3->get_mgfront();
1133     if (triangle4->get_etat_front()==FRONT_ACTIF) ftref4=triangle4->get_mgfront();
1134     TPL_MAP_ENTITE<MG_FRONT_3D*> lstfront;
1135     MG_FRONT_3D *ft1=NULL;
1136     MG_FRONT_3D *ft2=NULL;
1137     MG_FRONT_3D *ft3=NULL;
1138     MG_FRONT_3D *ft4=NULL;
1139     if (ftref1==NULL) ft1=mise_a_jour_front(tetra,0,NONFORCE);
1140     else
1141     {
1142     lstfront.ajouter(ftref1->get_front_voisin(0));
1143     lstfront.ajouter(ftref1->get_front_voisin(1));
1144     lstfront.ajouter(ftref1->get_front_voisin(2));
1145     supprimer_front_en_avancant_sans_delete(ftref1);
1146     }
1147     if (ftref2==NULL) ft2=mise_a_jour_front(tetra,1,NONFORCE);
1148     else
1149     {
1150     lstfront.ajouter(ftref2->get_front_voisin(0));
1151     lstfront.ajouter(ftref2->get_front_voisin(1));
1152     lstfront.ajouter(ftref2->get_front_voisin(2));
1153     supprimer_front_en_avancant_sans_delete(ftref2);
1154     }
1155     if (ftref3==NULL) ft3=mise_a_jour_front(tetra,2,NONFORCE);
1156     else
1157     {
1158     lstfront.ajouter(ftref3->get_front_voisin(0));
1159     lstfront.ajouter(ftref3->get_front_voisin(1));
1160     lstfront.ajouter(ftref3->get_front_voisin(2));
1161     supprimer_front_en_avancant_sans_delete(ftref3);
1162     }
1163     if (ftref4==NULL) ft4=mise_a_jour_front(tetra,3,NONFORCE);
1164     else
1165     {
1166     lstfront.ajouter(ftref4->get_front_voisin(0));
1167     lstfront.ajouter(ftref4->get_front_voisin(1));
1168     lstfront.ajouter(ftref4->get_front_voisin(2));
1169     supprimer_front_en_avancant_sans_delete(ftref4);
1170     }
1171     if (ftref1!=NULL) {
1172     lstfront.supprimer(ftref1);
1173     delete ftref1;
1174     }
1175     if (ftref2!=NULL) {
1176     lstfront.supprimer(ftref2);
1177     delete ftref2;
1178     }
1179     if (ftref3!=NULL) {
1180     lstfront.supprimer(ftref3);
1181     delete ftref3;
1182     }
1183     if (ftref4!=NULL) {
1184     lstfront.supprimer(ftref4);
1185     delete ftref4;
1186     }
1187     if (ft1!=NULL)
1188     {
1189     mise_a_jour_voisin_front(ft1);
1190     lstfront.ajouter(ft1->get_front_voisin(0));
1191     lstfront.ajouter(ft1->get_front_voisin(1));
1192     lstfront.ajouter(ft1->get_front_voisin(2));
1193     }
1194     if (ft2!=NULL)
1195     {
1196     mise_a_jour_voisin_front(ft2);
1197     lstfront.ajouter(ft2->get_front_voisin(0));
1198     lstfront.ajouter(ft2->get_front_voisin(1));
1199     lstfront.ajouter(ft2->get_front_voisin(2));
1200     }
1201     if (ft3!=NULL)
1202     {
1203     mise_a_jour_voisin_front(ft3);
1204     lstfront.ajouter(ft3->get_front_voisin(0));
1205     lstfront.ajouter(ft3->get_front_voisin(1));
1206     lstfront.ajouter(ft3->get_front_voisin(2));
1207     }
1208     if (ft4!=NULL)
1209     {
1210     mise_a_jour_voisin_front(ft4);
1211     lstfront.ajouter(ft4->get_front_voisin(0));
1212     lstfront.ajouter(ft4->get_front_voisin(1));
1213     lstfront.ajouter(ft4->get_front_voisin(2));
1214     }
1215    
1216     for (int l=0;l<lstfront.get_nb();l++) mise_a_jour_voisin_front(lstfront.get(l));
1217    
1218     }
1219     }
1220    
1221     void MAILLEUR3D::insere_contrainte_triangle(MG_VOLUME* mgvol,TPL_LISTE_ENTITE<MG_TRIANGLE*> *lsttri)
1222     {
1223     int nbtri=lsttri->get_nb();
1224     for (int i=0;i<nbtri;i++)
1225     {
1226     M3D_TRIANGLE* tri=(M3D_TRIANGLE*)lsttri->get(i);
1227     double *xyz1=tri->get_noeud1()->get_coord();
1228     double *xyz2=tri->get_noeud2()->get_coord();
1229     double *xyz3=tri->get_noeud3()->get_coord();
1230     double xyz[3];
1231     xyz[0]=(xyz1[0]+xyz2[0]+xyz3[0])/3.;
1232     xyz[1]=(xyz1[1]+xyz2[1]+xyz3[1])/3.;
1233     xyz[2]=(xyz1[2]+xyz2[2]+xyz3[2])/3.;
1234     TPL_MAP_ENTITE<MG_FRONT_3D*> liste_trouvee;
1235     OT_VECTEUR_3D vec1(xyz,xyz1);
1236     OT_VECTEUR_3D vec2(xyz,xyz2);
1237     OT_VECTEUR_3D vec3(xyz,xyz3);
1238     double rayonrecherche=vec1.get_longueur();
1239     if (vec2.get_longueur()>rayonrecherche) rayonrecherche=vec2.get_longueur();
1240     if (vec3.get_longueur()>rayonrecherche) rayonrecherche=vec3.get_longueur();
1241     rayonrecherche=rayonrecherche*1.1;
1242     octree_de_front->rechercher(xyz[0],xyz[2],xyz[2],rayonrecherche,liste_trouvee);
1243     MG_NOEUD* noeudref1=NULL;
1244     MG_NOEUD* noeudref2=NULL;
1245     MG_NOEUD* noeudref3=NULL;
1246     int nbtrouve=liste_trouvee.get_nb();
1247     for (int j=0;j<nbtrouve;j++)
1248     {
1249     MG_FRONT_3D* ft=liste_trouvee.get(j);
1250     TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
1251     lstnoeud.ajouter(ft->get_noeud1());
1252     lstnoeud.ajouter(ft->get_noeud2());
1253     lstnoeud.ajouter(ft->get_noeud3());
1254     int nb=lstnoeud.get_nb();
1255     for (int k=0;k<nb;k++)
1256     {
1257     double *xyztmp=lstnoeud.get(k)->get_coord();
1258     OT_VECTEUR_3D vec(xyztmp,xyz1);
1259     double longueur=vec.get_longueur();
1260     if (longueur<1e-10*rayonrecherche)
1261     {
1262     noeudref1=lstnoeud.get(k);
1263     lstnoeud.supprimer(lstnoeud.get(k));
1264     break;
1265     }
1266     }
1267     nb=lstnoeud.get_nb();
1268     for (int k=0;k<nb;k++)
1269     {
1270     double *xyztmp=lstnoeud.get(k)->get_coord();
1271     OT_VECTEUR_3D vec(xyztmp,xyz2);
1272     double longueur=vec.get_longueur();
1273     if (longueur<1e-10*rayonrecherche)
1274     {
1275     noeudref2=lstnoeud.get(k);
1276     lstnoeud.supprimer(lstnoeud.get(k));
1277     break;
1278     }
1279     }
1280     nb=lstnoeud.get_nb();
1281     for (int k=0;k<nb;k++)
1282     {
1283     double *xyztmp=lstnoeud.get(k)->get_coord();
1284     OT_VECTEUR_3D vec(xyztmp,xyz3);
1285     double longueur=vec.get_longueur();
1286     if (longueur<1e-10*rayonrecherche)
1287     {
1288     noeudref3=lstnoeud.get(k);
1289     lstnoeud.supprimer(lstnoeud.get(k));
1290     break;
1291     }
1292     }
1293    
1294     }
1295     if (noeudref1==NULL)
1296     {
1297     noeudref1=mg_maillage->ajouter_mg_noeud(mgvol,xyz1[0],xyz1[1],xyz1[2],IMPOSE);
1298     noeudref1->change_nouveau_numero(tri->get_noeud1()->get_nouveau_numero());
1299     }
1300     if (noeudref2==NULL)
1301     {
1302     noeudref2=mg_maillage->ajouter_mg_noeud(mgvol,xyz2[0],xyz2[1],xyz2[2],IMPOSE);
1303     noeudref2->change_nouveau_numero(tri->get_noeud2()->get_nouveau_numero());
1304     }
1305     if (noeudref3==NULL)
1306     {
1307     noeudref3=mg_maillage->ajouter_mg_noeud(mgvol,xyz3[0],xyz3[1],xyz3[2],IMPOSE);
1308     noeudref3->change_nouveau_numero(tri->get_noeud3()->get_nouveau_numero());
1309     }
1310    
1311     MG_SEGMENT* segment1=mg_maillage->get_mg_segment(noeudref1->get_id(),noeudref2->get_id());
1312     MG_SEGMENT* segment2=mg_maillage->get_mg_segment(noeudref1->get_id(),noeudref3->get_id());
1313     MG_SEGMENT* segment3=mg_maillage->get_mg_segment(noeudref2->get_id(),noeudref3->get_id());
1314     if (segment1==NULL) segment1=cree_segment(mgvol,noeudref1,noeudref2,IMPOSE);
1315     if (segment2==NULL) segment2=cree_segment(mgvol,noeudref1,noeudref3,IMPOSE);
1316     if (segment3==NULL) segment3=cree_segment(mgvol,noeudref2,noeudref3,IMPOSE);
1317     MG_TRIANGLE* nvtri=cree_triangle(mgvol,noeudref1,noeudref2,noeudref3,segment1,segment2,segment3,IMPOSE);
1318     MG_TRIANGLE* nvtri2=cree_triangle(mgvol,noeudref1,noeudref3,noeudref2,segment1,segment2,segment3,IMPOSE);
1319     //MG_TRIANGLE* nvtri=insere_triangle(mgvol,noeudref1,noeudref2,noeudref3,IMPOSE);
1320     //MG_TRIANGLE* nvtri2=insere_triangle(mgvol,noeudref1,noeudref3,noeudref2,IMPOSE);
1321     MG_FRONT_3D *ft=ajouter_front_courant(NONFORCE,noeudref1,noeudref2,noeudref3,nvtri);
1322     MG_FRONT_3D *ft2=ajouter_front_courant(NONFORCE,noeudref1,noeudref3,noeudref2,nvtri2);
1323     mise_a_jour_voisin_front(ft);
1324     mise_a_jour_voisin_front(ft2);
1325     mise_a_jour_voisin_front(ft->get_front_voisin(0));
1326     mise_a_jour_voisin_front(ft->get_front_voisin(1));
1327     mise_a_jour_voisin_front(ft->get_front_voisin(2));
1328     mise_a_jour_voisin_front(ft2->get_front_voisin(0));
1329     mise_a_jour_voisin_front(ft2->get_front_voisin(1));
1330     mise_a_jour_voisin_front(ft2->get_front_voisin(2));
1331    
1332     }
1333    
1334    
1335    
1336    
1337     }
1338