ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/toIbrep/src/toibrep.cpp
Revision: 485
Committed: Mon Feb 10 17:23:58 2014 UTC (11 years, 3 months ago) by francois
File size: 122616 byte(s)
Log Message:
Mise en version 4 de toIBrep

File Contents

# User Rev Content
1 bechet 105 #include "gestionversion.h"
2 francois 259 #include "toibrep.h"
3 francois 104 #include "mg_file.h"
4     #include "ot_mathematique.h"
5     #include "tpl_map_entite.h"
6 francois 222 #include "tpl_relation_entite.h"
7 francois 104 #include "tpl_octree.h"
8 francois 259 #include "toibrep_point.h"
9 francois 106 #include "vct.h"
10 francois 104 #include <math.h>
11 francois 259 #include <fstream>
12 francois 262 #include <string>
13 francois 259 #include "IBrep.h"
14 francois 276 #include "ot_cpu.h"
15 francois 346 #include "fem_tetra4.h"
16 francois 433 #include "fem_segment2.h"
17 francois 346 #include "xfem_tetra4.h"
18 francois 433 #include "xfem_triangle3.h"
19     #include "xfem_segment2.h"
20     #include "mg_maillage_outils.h"
21 francois 104
22 francois 433 class inter_ele_arete
23     {
24     public:
25     FEM_ELEMENT3* ele;
26     XFEM_ELEMENT3* xele;
27     MG_ARETE* are;
28     int status1;
29     int status2;
30     double xyz1[3];
31     double xyz2[3];
32     FEM_NOEUD* no1;
33     FEM_NOEUD* no2;
34     };
35 francois 104
36 francois 222
37 francois 433
38 francois 276 TOIBREP::TOIBREP(class MG_GESTIONNAIRE *g,class MG_GEOMETRIE *ge,class FEM_MAILLAGE* femm,int nbpas,OT_CPU* compt):geo(ge),gest(g),mai(femm),NPAS(nbpas),affichageactif(0),compteur(compt)
39 francois 104 {
40     }
41    
42 francois 276 TOIBREP::TOIBREP(class MG_GESTIONNAIRE *g,class MG_GEOMETRIE *ge,class FEM_MAILLAGE* femm,int nbpas):geo(ge),gest(g),mai(femm),NPAS(nbpas),affichageactif(0),compteur(NULL)
43     {
44     }
45     TOIBREP::TOIBREP(class MG_GESTIONNAIRE *g,class MG_GEOMETRIE *ge,class FEM_MAILLAGE* femm):geo(ge),gest(g),mai(femm),NPAS(50),affichageactif(0),compteur(NULL)
46     {
47     }
48     TOIBREP::TOIBREP(class MG_GESTIONNAIRE *g,class MG_GEOMETRIE *ge,class FEM_MAILLAGE* femm,class OT_CPU* compt):geo(ge),gest(g),mai(femm),NPAS(50),affichageactif(0),compteur(compt)
49     {
50     }
51 francois 104
52 francois 259 TOIBREP::~TOIBREP()
53 francois 104 {
54     }
55    
56    
57    
58 francois 276 void TOIBREP::active_affichage(void (*fonc)(char*))
59     {
60     affiche=fonc;
61     affichageactif=1;
62     }
63    
64    
65    
66 francois 259 double TOIBREP::calculdist(double *n,double x,double y,double z,FEM_NOEUD* noeud)
67 francois 104 {
68     double* xyz=noeud->get_coord();
69     double dist=sqrt((xyz[0]-x)*(xyz[0]-x)+(xyz[1]-y)*(xyz[1]-y)+(xyz[2]-z)*(xyz[2]-z));
70     OT_VECTEUR_3D vec1(n[0],n[1],n[2]);
71     OT_VECTEUR_3D vec2(xyz[0]-x,xyz[1]-y,xyz[2]-z);
72     double ps=vec1*vec2;
73     if (ps<0.) dist=-dist;
74     return dist;
75     }
76    
77 francois 281 void TOIBREP::recherche_arete_tangeante(TPL_MAP_ENTITE<MG_ARETE*> &lst,TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> &lsttopo)
78     {
79    
80    
81     LISTE_MG_ARETE::iterator it;
82     for (MG_ARETE* are=geo->get_premier_arete(it);are!=NULL;are=geo->get_suivant_arete(it))
83     {
84     if (lsttopo.existe(are))
85     if (ot.arete_virtuelle(are)) lst.ajouter(are);
86     }
87    
88     }
89    
90 francois 433 int TOIBREP::test_du_point_milieu(FEM_NOEUD* no1,FEM_NOEUD* no2,FEM_ELEMENT3* tet)
91     {
92     double *xyz1=no1->get_coord();
93     double *xyz2=no2->get_coord();
94     double xyz[3];
95     xyz[0]=0.5*(xyz1[0]+xyz2[0]);
96     xyz[1]=0.5*(xyz1[1]+xyz2[1]);
97     xyz[2]=0.5*(xyz1[2]+xyz2[2]);
98     FEM_MAILLAGE_OUTILS ot;
99     if (((ot.estdansletetra(tet,xyz[0],xyz[1],xyz[2])>>1)&1)!=0) return 1;
100     //if (((MG_MAILLAGE_OUTILS::estdansletetra(tet,xyz[0],xyz[1],xyz[2])>>1)&1)==1) return 1;
101     return 0;
102     }
103 francois 281
104 francois 433
105     void TOIBREP::oriente_tri(XFEM_ELEMENT2* tri,MG_FACE* face)
106     {
107     FEM_NOEUD* no1=tri->get_fem_noeud(0);
108     FEM_NOEUD* no2=tri->get_fem_noeud(1);
109     FEM_NOEUD* no3=tri->get_fem_noeud(2);
110     OT_VECTEUR_3D n1n2(no1->get_coord(),no2->get_coord());
111     OT_VECTEUR_3D n1n3(no1->get_coord(),no3->get_coord());
112     OT_VECTEUR_3D normal=n1n2&n1n3;
113     double *xyz=no1->get_coord();
114     double uv[0];
115     face->inverser(uv,xyz);
116     double n[3];
117     face->calcul_normale_unitaire(uv,n);
118     OT_VECTEUR_3D dir(n);
119     normal.norme();
120     double ps=normal*dir;
121     if (ps<0)
122     {
123     tri->change_noeud(1,no3);
124     tri->change_noeud(2,no2);
125     }
126     }
127    
128 francois 259 //void TOIBREP::importer(std::string nomfichier,class MagXchange* data,std::string nomfichierout)
129 francois 276 IBrep TOIBREP::importer(std::string nomfichier,std::string nomfichieribrep,MG_GROUPE_TOPOLOGIQUE* mggt)
130 francois 104 {
131 francois 222 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst;
132     if (mggt!=NULL)
133     {
134     int nb=mggt->get_nb();
135     for (int i=0;i<nb;i++)
136     {
137     lst.ajouter(mggt->get(i));
138     mggt->get(i)->get_topologie_sousjacente(&lst);
139     }
140     }
141     else
142     {
143     int nbvol=geo->get_nb_mg_volume();
144     for (int i=0;i<nbvol;i++)
145     {
146     lst.ajouter(geo->get_mg_volume(i));
147     geo->get_mg_volume(i)->get_topologie_sousjacente(&lst);
148     }
149     }
150 francois 281 affiche((char*)"Recherche aretes tangeantes");
151     TPL_MAP_ENTITE<MG_ARETE*> lstaretetan;
152     recherche_arete_tangeante(lstaretetan,lst);
153     char mess[300];
154     sprintf(mess," Nombre d'aretes tangeantes %d",lstaretetan.get_nb());
155     affiche(mess);
156     if (compteur!=NULL) compteur->ajouter_etape("Aretes tangeantes");
157     affiche((char*)"Traitement de base");
158     int nbface=geo->get_nb_mg_face();
159 francois 222 int nbvraiface=0;
160     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
161     for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it))
162     if (ele->get_dimension()==2) nbvraiface++;
163 francois 276 //if (compteur!=NULL) compteur->ajouter_etape("Traitement de base selection");
164 francois 222 int nb_noeud=mai->get_nb_fem_noeud();
165 francois 309 int nb_element3=mai->get_nb_fem_element3();
166 francois 276 std::string nomfichier2=nomfichier+"_dis.sol";
167 francois 375 FEM_SOLUTION* solution=new FEM_SOLUTION(mai,nbvraiface+lstaretetan.get_nb(),(char*)nomfichier2.c_str(),nb_noeud,"LS",MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD);
168 francois 222 int i=0;
169 francois 276 gest->ajouter_fem_solution(solution);
170     nomfichier2=nomfichier+"_ele.sol";
171 francois 375 FEM_SOLUTION* solution_ele=new FEM_SOLUTION(mai,nbvraiface+lstaretetan.get_nb(),(char*)nomfichier2.c_str(),nb_element3,"A",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3);
172 francois 276 gest->ajouter_fem_solution(solution_ele);
173 francois 222 for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it))
174 francois 106 {
175 francois 222 if (ele->get_dimension()!=2) continue;
176 francois 106 char mess[255];
177 francois 262 sprintf(mess,"F %lu",ele->get_id());
178 francois 276 solution->change_legende(i,mess);
179     solution_ele->change_legende(i,mess);
180 francois 222 ++i;
181 francois 106 }
182 francois 281 TPL_MAP_ENTITE<MG_ARETE*>::ITERATEUR itare;
183     for (MG_ARETE* are=lstaretetan.get_premier(itare);are!=NULL;are=lstaretetan.get_suivant(itare))
184     {
185     char mess[255];
186     sprintf(mess,"A %lu",are->get_id());
187     solution->change_legende(i,mess);
188     solution_ele->change_legende(i,mess);
189     ++i;
190     }
191 francois 276
192 francois 281
193 francois 276 //if (compteur!=NULL) compteur->ajouter_etape("Traitement de base creation solution");
194 francois 104 double xmin=1e300,ymin=1e300,zmin=1e308;
195     double xmax=-1e300,ymax=-1e300,zmax=-1e308;
196 francois 222 TPL_MAP_ENTITE<FEM_NOEUD*> lst_noeud;
197     LISTE_FEM_NOEUD::iterator it2;
198     i=0;
199     for (FEM_NOEUD* noeud=mai->get_premier_noeud(it2);noeud!=NULL;noeud=mai->get_suivant_noeud(it2))
200 francois 104 {
201     double* xyz=noeud->get_coord();
202     if (xyz[0]<xmin) xmin=xyz[0];
203     if (xyz[1]<ymin) ymin=xyz[1];
204     if (xyz[2]<zmin) zmin=xyz[2];
205     if (xyz[0]>xmax) xmax=xyz[0];
206     if (xyz[1]>ymax) ymax=xyz[1];
207     if (xyz[2]>zmax) zmax=xyz[2];
208 francois 281 for (int j=0;j<nbvraiface+lstaretetan.get_nb();j++)
209 francois 375 solution->ecrire(1e300,i,j);
210 francois 104 lst_noeud.ajouter(noeud);
211 francois 222 i++;
212 francois 104 }
213 francois 276 //if (compteur!=NULL) compteur->ajouter_etape("Traitement de base recherche boite");
214 francois 433 octree_tetra.initialiser(&lst_noeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
215 francois 276 //if (compteur!=NULL) compteur->ajouter_etape("Traitement de base ini octree");
216 francois 309 LISTE_FEM_ELEMENT3::iterator it3;
217 francois 276 i=0;
218 francois 309 for (FEM_ELEMENT3* tet=mai->get_premier_element3(it3);tet!=NULL;tet=mai->get_suivant_element3(it3))
219 francois 276 {
220 francois 433 octree_tetra.inserer(tet);
221 francois 281 for (int j=0;j<nbvraiface+lstaretetan.get_nb();j++)
222 francois 375 solution_ele->ecrire(0,i,j);
223 francois 276 i++;
224     }
225     if (compteur!=NULL) compteur->ajouter_etape("Traitement de base");
226 francois 106 for (int i=0;i<nbface;i++)
227 francois 346 //for (int i=0;i<1;i++)
228 francois 106 {
229 francois 281 MG_FACE* face=geo->get_mg_face(i);
230 francois 346 //MG_FACE* face=geo->get_mg_faceid(757);
231 francois 276 if (affichageactif)
232     {
233     char mess[300];
234 francois 281 sprintf(mess," Face %d numero %lu",i,face->get_id());
235 francois 276 affiche(mess);
236     }
237 francois 222 if (!lst.existe(face)) continue;
238 francois 106 vector<MG_FACE*> lstface;
239 francois 222 lstface.push_back(face);
240 francois 276 /// ici topologie virtuelle
241    
242    
243 francois 222 /*TPL_LISTE_ENTITE<double> lst;
244 francois 106 int type=face->get_surface()->get_type_geometrique(lst);
245     int idem=0;
246     for (int j=0;j<i;j++)
247     {
248     TPL_LISTE_ENTITE<double> lst2;
249     MG_FACE* face2=geo->get_mg_face(j);
250     int type2=face2->get_surface()->get_type_geometrique(lst2);
251     if (type==type2)
252     if (lst.get_nb()==lst2.get_nb())
253     {
254     int diff=0;
255     for (int i=0;i<lst.get_nb();i++)
256     if (fabs(lst.get(i)-lst2.get(i))>0.000001) diff=1;
257     if (diff==0) idem=1;
258     }
259     }
260     if (!idem) lstface.push_back(geo->get_mg_face(i));
261     for (int j=i+1;j<nbface;j++)
262     {
263     TPL_LISTE_ENTITE<double> lst2;
264     MG_FACE* face2=geo->get_mg_face(j);
265     int type2=face2->get_surface()->get_type_geometrique(lst2);
266     if (type==type2)
267     if (lst.get_nb()==lst2.get_nb())
268     {
269     int diff=0;
270     for (int i=0;i<lst.get_nb();i++)
271     if (fabs(lst.get(i)-lst2.get(i))>0.000001) diff=1;
272     if (diff==0) lstface.push_back(face2);
273     }
274 francois 222 }*/
275 francois 433 //levelsetn(&lst,&lstface,solution,solution_ele,i);
276 francois 106 }
277 francois 281
278     TPL_MAP_ENTITE<MG_ARETE*>::ITERATEUR itare2;
279     i=0;
280     for (MG_ARETE* are=lstaretetan.get_premier(itare2);are!=NULL;are=lstaretetan.get_suivant(itare2))
281     {
282     if (affichageactif)
283     {
284     char mess[300];
285     sprintf(mess," Arete tangeante %d numero %lu",i,are->get_id());
286     affiche(mess);
287     }
288     traite_arete_tangeante(are,nbface+i,solution,solution_ele);
289     i++;
290     }
291    
292    
293 francois 276 affiche((char*)"Exportation IBREP");
294     IBrep brep=exporter_IBrep(nomfichieribrep,solution,solution_ele,mggt);
295     if (compteur!=NULL) compteur->ajouter_etape("Exportation IBREP");
296 francois 346 affiche((char*)"Decoupage maillage");
297     for (int i=0;i<lstaretetan.get_nb();i++)
298     decoupe_maillage(nbface+i,solution,solution_ele,0);
299     for (int i=0;i<nbface;i++)
300     decoupe_maillage(i,solution,solution_ele,1);
301     if (compteur!=NULL) compteur->ajouter_etape("Decoupage maillage");
302     affiche((char*)"Tag maillage");
303     cree_tag_maillage();
304     if (compteur!=NULL) compteur->ajouter_etape("Tag maillage");
305 francois 276 return brep;
306 francois 106 }
307    
308 francois 346
309    
310    
311     void TOIBREP::cree_tag_maillage(void)
312     {
313     /*vector<FEM_ELEMENT3*> couche;
314     LISTE_FEM_ELEMENT3::iterator ittetra;
315     for (FEM_ELEMENT3 *tet=mai->get_premier_element3(ittetra);tet!=NULL;tet=mai->get_suivant_element3(ittetra))
316     {
317     if (tet->est_decoupe_arete_tangeante())
318     {
319     for (int i=tet->get_nb_xfem()-1;i>-1;i--)
320     tet->supprimer_xfem(mai,tet->get_xfem(i));
321     }
322     if (tet->get_nb_xfem()>0)
323     {
324     tet->change_etat(2);
325     couche.push_back(tet);
326     }
327     else tet->change_etat(3);
328     }
329     for (int i=0;i<couche.size();i++)
330     {
331     FEM_ELEMENT3* tet=couche[i];
332     for (int j=0;j<tet->get_nb_fem_noeud();j++)
333     {
334     int propage=0;
335     if (tet->get_etat()==2)
336     {
337     for (int k=0;k<tet->get_nb_xfem();k++)
338     {
339     XFEM_TETRA4* xtet=(XFEM_TETRA4*)tet->get_xfem(k);
340     if (xtet->est_noeud_fem(tet->get_fem_noeud(j))==1) propage=1;
341     }
342     }
343     if (tet->get_etat()!=2) propage=1;
344     if (propage==1)
345     {
346     for (int k=0;k<tet->get_fem_noeud(j)->get_lien_element3()->get_nb();k++)
347     {
348     if (tet->get_fem_noeud(j)->get_lien_element3()->get(k)->get_etat()==3)
349     {
350     tet->get_fem_noeud(j)->get_lien_element3()->get(k)->change_etat(1);
351     couche.push_back(tet->get_fem_noeud(j)->get_lien_element3()->get(k));
352     }
353     }
354     }
355    
356     }
357     }
358     double volume=0.;
359     for (FEM_ELEMENT3 *tet=mai->get_premier_element3(ittetra);tet!=NULL;tet=mai->get_suivant_element3(ittetra))
360     {
361     if (tet->get_etat()==1) volume=volume+get_volume(tet);
362     if (tet->get_etat()==2)
363     {
364     for (int i=0;i<tet->get_nb_xfem();i++)
365     {
366     XFEM_TETRA4* xtet=(XFEM_TETRA4*)tet->get_xfem(i);
367     volume=volume+get_volume(xtet);
368     }
369     }
370    
371     }
372     char chaine[500];
373     sprintf(chaine," Volume=%le",volume);
374     affiche(chaine);*/
375     }
376    
377    
378     double TOIBREP::get_volume(FEM_ELEMENT3* tet)
379     {
380     FEM_NOEUD *no1=tet->get_fem_noeud(0);
381     FEM_NOEUD *no2=tet->get_fem_noeud(1);
382     FEM_NOEUD *no3=tet->get_fem_noeud(2);
383     FEM_NOEUD *no4=tet->get_fem_noeud(3);
384     OT_VECTEUR_3D vec12(no1->get_coord(),no2->get_coord());
385     OT_VECTEUR_3D vec13(no1->get_coord(),no3->get_coord());
386     OT_VECTEUR_3D vec14(no1->get_coord(),no4->get_coord());
387     double vol= (vec12&vec13)*vec14*1./6.;
388     return vol;
389     }
390    
391    
392     void TOIBREP::decoupe_maillage(int num,FEM_SOLUTION* solution,FEM_SOLUTION* solution_ele,int avecsuppression)
393     {
394 francois 375 /*
395 francois 346 solution->active_solution(num);
396     solution_ele->active_solution(num);
397     LISTE_FEM_ELEMENT3::iterator ittetra;
398     for (FEM_ELEMENT3 *tet=mai->get_premier_element3(ittetra);tet!=NULL;tet=mai->get_suivant_element3(ittetra))
399     {
400     if ((tet->get_solution()>0.5) || (tet->get_nb_xfem()!=0))
401     {
402     tet->change_etat(1);
403     int nb=tet->get_nb_xfem();
404     if (nb==0)
405     {
406     int nb2=decoupe_tetra(tet,tet,mai);
407     if (nb2!=0)
408     if (avecsuppression==1) tet->decoupe_frontiere(); else tet->decoupe_arete_tangeante();
409     }
410     else
411     for (int i=nb-1;i>-1;i--)
412     {
413     calcul_valeur_sous_element(tet,tet->get_xfem(i));
414     int nb2=decoupe_tetra(tet,tet->get_xfem(i),mai);
415     if (nb2!=0) tet->supprimer_xfem(mai,tet->get_xfem(i));
416     if (nb2!=0)
417     if (avecsuppression==1) tet->decoupe_frontiere(); else tet->decoupe_arete_tangeante();
418     }
419     if (avecsuppression==1)
420     {
421     nb=tet->get_nb_xfem();
422     for (int i=nb-1;i>-1;i--)
423     {
424     if (signe_tetra(tet->get_xfem(i))==-1)
425     {
426     FEM_NOEUD* no[4];
427     no[0]=tet->get_xfem(i)->get_fem_noeud(0);
428     no[1]=tet->get_xfem(i)->get_fem_noeud(1);
429     no[2]=tet->get_xfem(i)->get_fem_noeud(2);
430     no[3]=tet->get_xfem(i)->get_fem_noeud(3);
431     tet->supprimer_xfem(mai,tet->get_xfem(i));
432     for (int j=0;j<4;j++)
433     if (no[j]->get_numero_opt()==-1)
434     if (no[j]->get_numero()==0)
435     mai->supprimer_fem_noeud(no[j]->get_id());
436     }
437     }
438     }
439     }
440     }
441 francois 375 */
442 francois 346 }
443    
444     void TOIBREP::calcul_valeur_sous_element(FEM_ELEMENT3* ele,FEM_ELEMENT3 *xele)
445     {
446     double x1=ele->get_fem_noeud(0)->get_x();
447     double y1=ele->get_fem_noeud(0)->get_y();
448     double z1=ele->get_fem_noeud(0)->get_z();
449     double x2=ele->get_fem_noeud(1)->get_x();
450     double y2=ele->get_fem_noeud(1)->get_y();
451     double z2=ele->get_fem_noeud(1)->get_z();
452     double x3=ele->get_fem_noeud(2)->get_x();
453     double y3=ele->get_fem_noeud(2)->get_y();
454     double z3=ele->get_fem_noeud(2)->get_z();
455     double x4=ele->get_fem_noeud(3)->get_x();
456     double y4=ele->get_fem_noeud(3)->get_y();
457     double z4=ele->get_fem_noeud(3)->get_z();
458     double sol1=ele->get_fem_noeud(0)->get_solution();
459     double sol2=ele->get_fem_noeud(1)->get_solution();
460     double sol3=ele->get_fem_noeud(2)->get_solution();
461     double sol4=ele->get_fem_noeud(3)->get_solution();
462     int nb=xele->get_nb_fem_noeud();
463     for (int i=0;i<nb;i++)
464     if (xele->get_fem_noeud(i)->get_numero_opt()==1)
465     {
466     double x=xele->get_fem_noeud(i)->get_x();
467     double y=xele->get_fem_noeud(i)->get_y();
468     double z=xele->get_fem_noeud(i)->get_z();
469     double u = -(x3 * y1 * z4 - x3 * y1 * z - y1 * z4 * x - z3 * y1 * x4 + z3 * y1 * x + y1 * z * x4 - y3 * x1 * z4 - z1 * y * x4 + z1 * y3 * x4 - z3 * x1 * y - z1 * y3 * x + y3 * x1 * z - z * x1 * y4 + z * x3 * y4 + z4 * y3 * x + z4 * x1 * y - z4 * x3 * y - z3 * y4 * x + z1 * y4 * x - z1 * x3 * y4 - y3 * z * x4 + z3 * x1 * y4 + z3 * y * x4 + z1 * x3 * y) / (-z1 * y2 * x3 - z1 * x2 * y4 - z1 * y3 * x4 + z1 * x2 * y3 + z1 * x3 * y4 + z3 * y1 * x4 + y2 * z3 * x1 + x2 * y1 * z4 - y1 * z2 * x4 + y1 * z2 * x3 + z1 * y2 * x4 + y3 * z2 * x4 + x1 * z2 * y4 - x1 * z2 * y3 - x3 * y1 * z4 - x3 * z2 * y4 - z3 * x1 * y4 + y2 * x3 * z4 - x2 * y3 * z4 + x2 * z3 * y4 - x2 * z3 * y1 - y2 * z3 * x4 - y2 * x1 * z4 + y3 * x1 * z4);
470     double v = (z1 * y4 * x + z1 * y2 * x4 - z1 * y2 * x + z1 * x2 * y - z1 * x2 * y4 - z1 * y * x4 + z4 * x1 * y - z * x1 * y4 + y2 * x1 * z - y1 * z4 * x + y1 * z * x4 + z * x2 * y4 - z * y2 * x4 + z4 * y2 * x - y4 * z2 * x + y * z2 * x4 - z4 * x2 * y + y1 * z2 * x - x2 * y1 * z - x1 * z2 * y + x2 * y1 * z4 - y1 * z2 * x4 + x1 * z2 * y4 - y2 * x1 * z4) / (-z1 * y2 * x3 - z1 * x2 * y4 - z1 * y3 * x4 + z1 * x2 * y3 + z1 * x3 * y4 + z3 * y1 * x4 + y2 * z3 * x1 + x2 * y1 * z4 - y1 * z2 * x4 + y1 * z2 * x3 + z1 * y2 * x4 + y3 * z2 * x4 + x1 * z2 * y4 - x1 * z2 * y3 - x3 * y1 * z4 - x3 * z2 * y4 - z3 * x1 * y4 + y2 * x3 * z4 - x2 * y3 * z4 + x2 * z3 * y4 - x2 * z3 * y1 - y2 * z3 * x4 - y2 * x1 * z4 + y3 * x1 * z4);
471     double w = -(-y2 * x3 * z - y2 * z3 * x1 + y2 * z3 * x + y2 * x1 * z - z3 * y1 * x + y1 * z2 * x - y1 * z2 * x3 - y3 * x1 * z - y3 * z2 * x + x2 * y3 * z + x2 * z3 * y1 - x2 * z3 * y - x2 * y1 * z - x1 * z2 * y + x1 * z2 * y3 + z1 * x2 * y + x3 * z2 * y + z3 * x1 * y + z1 * y2 * x3 + z1 * y3 * x - z1 * y2 * x - z1 * x2 * y3 + x3 * y1 * z - z1 * x3 * y) / (-z1 * y2 * x3 - z1 * x2 * y4 - z1 * y3 * x4 + z1 * x2 * y3 + z1 * x3 * y4 + z3 * y1 * x4 + y2 * z3 * x1 + x2 * y1 * z4 - y1 * z2 * x4 + y1 * z2 * x3 + z1 * y2 * x4 + y3 * z2 * x4 + x1 * z2 * y4 - x1 * z2 * y3 - x3 * y1 * z4 - x3 * z2 * y4 - z3 * x1 * y4 + y2 * x3 * z4 - x2 * y3 * z4 + x2 * z3 * y4 - x2 * z3 * y1 - y2 * z3 * x4 - y2 * x1 * z4 + y3 * x1 * z4);
472     double sol=(1.-u-v-w)*sol1+u*sol2+v*sol3+w*sol4;
473     xele->get_fem_noeud(i)->change_solution(sol);
474     }
475     }
476    
477    
478    
479    
480    
481     int TOIBREP::signe_tetra(FEM_ELEMENT3* tet)
482     {
483     int signep=0;
484     int signen=0;
485     int signem=0;
486     double val1=tet->get_fem_noeud(0)->get_solution();
487     double val2=tet->get_fem_noeud(1)->get_solution();
488     double val3=tet->get_fem_noeud(2)->get_solution();
489     double val4=tet->get_fem_noeud(3)->get_solution();
490     if (val1<1e200)
491     {
492     if (val1>0.00000001) signep++;
493     else if (val1<-0.00000001) signem++;
494     else signen++;
495     }
496     if (val2<1e200)
497     {
498     if (val2>0.00000001) signep++;
499     else if (val2<-0.00000001) signem++;
500     else signen++;
501     }
502     if (val3<1e200)
503     {
504     if (val3>0.00000001) signep++;
505     else if (val3<-0.00000001) signem++;
506     else signen++;
507     }
508     if (val4<1e200)
509     {
510     if (val4>0.00000001) signep++;
511     else if (val4<-0.00000001) signem++;
512     else signen++;
513 francois 375 }
514 francois 346 if ((signep==0) && (signem>0)) return -1;
515     if ((signem==0) && (signep>0)) return 1;
516     return 0;
517     }
518    
519    
520    
521 francois 281 void TOIBREP::traite_arete_tangeante(MG_ARETE* are,int numsol,FEM_SOLUTION* solution,FEM_SOLUTION* solution_ele)
522 francois 106 {
523 francois 281 //NPAS=150;
524     solution->active_solution(numsol);
525     solution_ele->active_solution(numsol);
526 francois 259 vector<TOIBREP_POINT*> lst;
527 francois 309 LISTE_FEM_ELEMENT3::iterator ittetra;
528     for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittetra);tet!=NULL;tet=mai->get_suivant_element3(ittetra))
529 francois 433 tet->change_etat(1,0);
530 francois 281 LISTE_FEM_NOEUD::iterator itnoeud;
531     for (FEM_NOEUD* no=mai->get_premier_noeud(itnoeud);no!=NULL;no=mai->get_suivant_noeud(itnoeud))
532 francois 433 no->change_etat(1,0);
533 francois 281 double tmin=are->get_tmin();
534     double tmax=are->get_tmax();
535     double eps=1e-3*(tmax-tmin);
536     for (int i=0;i<NPAS+1;i++)
537     {
538     double t=tmin+i*1.0/NPAS*(tmax-tmin);
539     double xyz[3],xyzplus[3],xyzmoins[3];
540     are->evaluer(t,xyz);
541     TOIBREP_POINT *pt=new TOIBREP_POINT(xyz[0],xyz[1],xyz[2],t,1,NULL);
542     lst.push_back(pt);
543     if (t+eps<tmax)
544     {
545     are->evaluer(t+eps,xyzplus);
546     pt->ajoute_point_eps(xyzplus);
547     }
548     if (t-eps>tmin)
549     {
550     are->evaluer(t-eps,xyzmoins);
551     pt->ajoute_point_eps(xyzmoins);
552     }
553    
554     }
555     for (int i=0;i<lst.size();i++)
556     {
557     TOIBREP_POINT* pt=lst[i];
558     double xyz[3];
559     pt->get_coord3(xyz);
560 francois 309 TPL_MAP_ENTITE<FEM_ELEMENT3*> liste;
561 francois 433 octree_tetra.rechercher(xyz[0],xyz[1],xyz[2],0.,liste);
562 francois 309 TPL_MAP_ENTITE<FEM_ELEMENT3*>::ITERATEUR it;
563     for (FEM_ELEMENT3* tet=liste.get_premier(it);tet!=NULL;tet=liste.get_suivant(it))
564 francois 281 {
565 francois 433 if (tet->get_etat(1)==1) continue;
566     int etat=outilfem.estdansletetra(tet,xyz[0],xyz[1],xyz[2]);
567     if ((outilfem.compare_etat_tetra(etat,FEM_MAILLAGE_OUTILS::SUR_FACE)) && (pt->get_interieur()))
568 francois 104 {
569 francois 281 int nbeps=pt->get_nb_point_eps();
570     for (int k=0;k<nbeps;k++)
571     {
572     double xyztmp[3];
573     pt->get_point_eps(k,xyztmp);
574 francois 433 int etattmp=outilfem.estdansletetra(tet,xyztmp[0],xyztmp[1],xyztmp[2]);
575     if (outilfem.compare_etat_tetra(etattmp,FEM_MAILLAGE_OUTILS::SUR_FACE)) {etat=FEM_MAILLAGE_OUTILS::STRICTINTERIEUR;break;}
576     if (outilfem.compare_etat_tetra(etattmp,FEM_MAILLAGE_OUTILS::INTERIEUR)) {etat=FEM_MAILLAGE_OUTILS::STRICTINTERIEUR;break;}
577     if (outilfem.compare_etat_tetra(etattmp,FEM_MAILLAGE_OUTILS::STRICTINTERIEUR)) {etat=FEM_MAILLAGE_OUTILS::STRICTINTERIEUR;break;}
578 francois 281 }
579 francois 104 }
580 francois 433 if (outilfem.compare_etat_tetra(etat,FEM_MAILLAGE_OUTILS::STRICTINTERIEUR))
581 francois 281 {
582     for (int k=0;k<tet->get_nb_fem_noeud();k++)
583     {
584     double dist=calcul_distance_level_ortho(tet->get_fem_noeud(k),are,pt);
585     tet->get_fem_noeud(k)->change_solution(dist);
586     tet->get_fem_noeud(k)->change_numero(pt->get_id());
587 francois 433 tet->change_etat(1,1); //temp
588     tet->get_fem_noeud(k)->change_etat(1,1); //temp
589 francois 281 }
590     }
591     }
592     }
593     remplir_trou_tangeant(&lst,are,solution_ele);
594    
595    
596    
597     int i=0;
598     for (FEM_NOEUD* noeud=mai->get_premier_noeud(itnoeud);noeud!=NULL;noeud=mai->get_suivant_noeud(itnoeud))
599     {
600 francois 433 if (noeud->get_etat(1)==1) solution->ecrire(noeud->get_solution(),i,numsol);
601 francois 485 else solution->ecrire(1e300,i,numsol);
602 francois 281 ++i;
603 francois 106 }
604 francois 281 i=0;
605 francois 309 for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittetra);tet!=NULL;tet=mai->get_suivant_element3(ittetra))
606 francois 281 {
607 francois 433 if (tet->get_etat(1)==1) solution_ele->ecrire(1.,i,numsol);
608 francois 281 ++i;
609     }
610     int nbpt=lst.size();
611     for (int i=0;i<nbpt;i++) delete lst[i];
612     TOIBREP_POINT::remisecompteurid();
613 francois 106 }
614 francois 281
615    
616     void TOIBREP::echantillonne_sommets(std::vector<TOIBREP_POINT*> &lst,MG_FACE* face)
617 francois 106 {
618 francois 276 TPL_MAP_ENTITE<MG_SOMMET*> lstsom;
619     int nbbou=face->get_nb_mg_boucle();
620     for (int i=0;i<nbbou;i++)
621     {
622     MG_BOUCLE* boucle=face->get_mg_boucle(i);
623     int nb_arete=boucle->get_nb_mg_coarete();
624     for (int j=0;j<nb_arete;j++)
625     {
626     MG_ARETE* are=boucle->get_mg_coarete(j)->get_arete();
627     lstsom.ajouter(are->get_cosommet1()->get_sommet());
628     lstsom.ajouter(are->get_cosommet2()->get_sommet());
629     }
630     }
631     TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR it;
632     for (MG_SOMMET* som=lstsom.get_premier(it);som!=NULL;som=lstsom.get_suivant(it))
633     {
634     double xyz[3];
635     som->get_point()->evaluer(xyz);
636     double uv[2];
637     face->inverser(uv,xyz);
638     int N=NPAS;
639     double rayon=1e-2;
640     for (int k=0;k<N+1;k++)
641     {
642     double uv2[2];
643     uv2[0]=uv[0]+rayon*cos(k*1.0/N*2.*M_PI);
644     uv2[1]=uv[1]+rayon*sin(k*1.0/N*2.*M_PI);
645     if ((face->valide_parametre_u(uv2[0])) && (face->valide_parametre_v(uv2[1])))
646     {
647     double distance=ot.calcule_distance_contour_face_uv(uv2,face);
648     if (distance>0.)
649     {
650     double xyz[3];
651     face->evaluer(uv2,xyz);
652     TOIBREP_POINT *pt=new TOIBREP_POINT(xyz[0],xyz[1],xyz[2],uv[0],uv[1],1,face);
653     lst.push_back(pt);
654     }
655     }
656     }
657    
658     }
659     }
660 francois 281 void TOIBREP::echantillonne_aretes(std::vector<TOIBREP_POINT*> &lst,MG_FACE* face)
661 francois 276 {
662 francois 281 echantillonne_sommets(lst,face);
663 francois 276 int nbbou=face->get_nb_mg_boucle();
664     for (int i=0;i<nbbou;i++)
665     {
666     MG_BOUCLE* boucle=face->get_mg_boucle(i);
667     int nb_arete=boucle->get_nb_mg_coarete();
668     for (int j=0;j<nb_arete;j++)
669     {
670     MG_ARETE* are=boucle->get_mg_coarete(j)->get_arete();
671     double tmin=are->get_tmin();
672     double tmax=are->get_tmax();
673     double N=NPAS;
674     for (int k=0;k<N+1;k++)
675     {
676     double t=tmin+k*1.0/N*(tmax-tmin);
677     double xyz[3];
678     are->evaluer(t,xyz);
679     TOIBREP_POINT *pt=new TOIBREP_POINT(xyz[0],xyz[1],xyz[2],t,1,face);
680     lst.push_back(pt);
681     // octree.inserer(pt);
682     }
683     /* double t=tmin+0.2/NPAS*(tmax-tmin);
684     double xyz[3];
685     are->evaluer(t,xyz);
686     TOIBREP_POINT *pt1=new TOIBREP_POINT(xyz[0],xyz[1],xyz[2],t,1,face);
687     lst.push_back(pt1);
688     t=tmax-0.2/NPAS*(tmax-tmin);
689     are->evaluer(t,xyz);
690     TOIBREP_POINT *pt2=new TOIBREP_POINT(xyz[0],xyz[1],xyz[2],t,1,face);
691     lst.push_back(pt2);*/
692    
693    
694    
695     }
696     }
697     }
698    
699 francois 433 //void TOIBREP::levelsetn(TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> *lsttopo,vector<MG_FACE*> *lstface,class FEM_SOLUTION* solution,FEM_SOLUTION* solution_ele,int numsol)
700     void TOIBREP::levelsetn(TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> *lsttopo,MG_FACE *face,TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> *lstentitetopoface)
701 francois 276 {
702     if (affichageactif)
703     {
704     char mess[300];
705     sprintf(mess," Echantillonnage");
706     affiche(mess);
707     }
708    
709 francois 433 //solution->active_solution(numsol);
710     //solution_ele->active_solution(numsol);
711 francois 276 vector<TOIBREP_POINT*> lst;
712 francois 433 BOITE_2D boite=ot.get_boite_2D(face);
713     echantillonne_aretes(lst,face);
714 francois 276 int trouve=0;
715     int orientation;
716     int j=0;
717     do
718     {
719     MG_COFACE* coface=face->get_mg_coface(j);
720     MG_VOLUME* vol=coface->get_coquille()->get_mg_volume();
721     if (lsttopo->existe(vol))
722 francois 104 {
723 francois 276 orientation=coface->get_orientation();
724     trouve=1;
725     }
726     j++;
727     }
728     while (trouve==0);
729 francois 309 LISTE_FEM_ELEMENT3::iterator ittetra;
730     for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittetra);tet!=NULL;tet=mai->get_suivant_element3(ittetra))
731 francois 433 tet->change_etat(1,0);
732 francois 276 LISTE_FEM_NOEUD::iterator itnoeud;
733     for (FEM_NOEUD* no=mai->get_premier_noeud(itnoeud);no!=NULL;no=mai->get_suivant_noeud(itnoeud))
734 francois 433 no->change_etat(1,0);
735 francois 276 double umin=boite.get_xmin();
736     double umax=boite.get_xmax();
737     double vmin=boite.get_ymin();
738     double vmax=boite.get_ymax();
739     if (face->get_surface()->est_periodique_u())
740     {
741     umin=0;
742     umax=face->get_surface()->get_periode_u();
743     }
744     if (face->get_surface()->est_periodique_v())
745     {
746     vmin=0;
747     vmax=face->get_surface()->get_periode_v();
748     }
749 francois 281 double epsu=1e-3*(umax-umin);
750     double epsv=1e-3*(vmax-vmin);
751     for (int i=0;i<NPAS;i++)
752     for (int j=0;j<NPAS;j++)
753 francois 276 {
754     double uv[2];
755 francois 281 uv[0]=umin+(i*1.0+0.5)/NPAS*(umax-umin);
756     uv[1]=vmin+(j*1.0+0.5)/NPAS*(vmax-vmin);
757 francois 276 double xyz[3];
758     if ((face->valide_parametre_u(uv[0])) && (face->valide_parametre_v(uv[1])))
759     {
760     double distance=ot.calcule_distance_contour_face_uv(uv,face);
761     int inte=0;
762     if (distance>0.) inte=1.; else continue;
763     face->evaluer(uv,xyz);
764     TOIBREP_POINT *pt=new TOIBREP_POINT(xyz[0],xyz[1],xyz[2],uv[0],uv[1],inte,face);
765     lst.push_back(pt);
766 francois 281 if (uv[0]+epsu<umax)
767     {
768     double uvtmp[2]={uv[0]+epsu,uv[1]};
769     double distance=ot.calcule_distance_contour_face_uv(uvtmp,face);
770     if (distance>1e-8)
771     {
772     face->evaluer(uvtmp,xyz);
773     pt->ajoute_point_eps(xyz);
774     }
775     }
776     if (uv[0]-epsu>umin)
777     {
778     double uvtmp[2]={uv[0]-epsu,uv[1]};
779     double distance=ot.calcule_distance_contour_face_uv(uvtmp,face);
780     if (distance>1e-8)
781     {
782     face->evaluer(uvtmp,xyz);
783     pt->ajoute_point_eps(xyz);
784     }
785     }
786     if (uv[1]+epsv<vmax)
787     {
788     double uvtmp[2]={uv[0],uv[1]+epsv};
789     double distance=ot.calcule_distance_contour_face_uv(uvtmp,face);
790     if (distance>1e-8)
791     {
792     face->evaluer(uvtmp,xyz);
793     pt->ajoute_point_eps(xyz);
794     }
795     }
796     if (uv[1]-epsv>vmin)
797     {
798     double uvtmp[2]={uv[0],uv[1]-epsv};
799     double distance=ot.calcule_distance_contour_face_uv(uvtmp,face);
800     if (distance>1e-8)
801     {
802     face->evaluer(uvtmp,xyz);
803     pt->ajoute_point_eps(xyz);
804     }
805     }
806 francois 276 // octree.inserer(pt);
807     }
808     }
809 francois 346 /* debut temp
810     {
811 francois 276 MG_GESTIONNAIRE gestemp;
812     MG_MAILLAGE *mai=new MG_MAILLAGE(NULL);
813     gestemp.ajouter_mg_maillage(mai);
814     for (int i=0;i<lst.size();i++)
815     {
816     double xyz[3];
817     lst[i]->get_coord3(xyz);
818     MG_NOEUD* no=new MG_NOEUD(NULL,xyz[0],xyz[1],xyz[2],TRIANGULATION);
819     mai->ajouter_mg_noeud(no);
820     if (i!=0) {MG_SEGMENT* seg=new MG_SEGMENT(NULL,no,mai->get_mg_noeud(mai->get_nb_mg_noeud()-2),TRIANGULATION);mai->ajouter_mg_segment(seg);}
821     }
822    
823     gestemp.enregistrer("debug.magic");
824 francois 346 }*/
825 francois 276 // fin temp
826     if (compteur!=NULL) compteur->ajouter_etape("Echantillonnage");
827     if (affichageactif)
828     {
829     char mess[300];
830     sprintf(mess," Preparation newton");
831     affiche(mess);
832     }
833     calcullevelsetpremierepasse(face,orientation,&lst,0,lst.size());
834     if (compteur!=NULL) compteur->ajouter_etape("Preparation newton");
835    
836     if (affichageactif)
837     {
838     char mess[300];
839     sprintf(mess," Newton");
840     affiche(mess);
841     }
842     calcullevelsetdeuxiemepasse(&lst);
843     if (compteur!=NULL) compteur->ajouter_etape("Newton");
844     if (affichageactif)
845     {
846     char mess[300];
847     sprintf(mess," Remplissage des trous");
848     affiche(mess);
849     }
850 francois 433 remplir_trou(&lst,face,orientation,lstentitetopoface);
851 francois 276 if (compteur!=NULL) compteur->ajouter_etape("Remplissage des trous");
852     //etendrelevelset(solution,numsol);
853 francois 433 /*int i=0;
854 francois 276 for (FEM_NOEUD* noeud=mai->get_premier_noeud(itnoeud);noeud!=NULL;noeud=mai->get_suivant_noeud(itnoeud))
855     {
856 francois 375 if (noeud->get_etat()==1) solution->ecrire(noeud->get_solution(),i,numsol);
857     else solution->ecrire(1e300,i,numsol);
858 francois 276 ++i;
859     }
860     i=0;
861 francois 309 for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittetra);tet!=NULL;tet=mai->get_suivant_element3(ittetra))
862 francois 276 {
863 francois 375 if (tet->get_etat()==1) solution_ele->ecrire(1.,i,numsol);
864 francois 276 ++i;
865 francois 433 }*/
866 francois 276 int nbpt=lst.size();
867     for (int i=0;i<nbpt;i++) delete lst[i];
868     TOIBREP_POINT::remisecompteurid();
869    
870    
871    
872     }
873 francois 281 void TOIBREP::remplir_trou_tangeant(std::vector<TOIBREP_POINT*> *lst,MG_ARETE* are,FEM_SOLUTION *solution_ele)
874     {
875     MG_FACE* face1=are->get_mg_coarete(0)->get_boucle()->get_mg_face();
876     MG_FACE* face2=are->get_mg_coarete(1)->get_boucle()->get_mg_face();
877 francois 309 TPL_MAP_ENTITE<FEM_ELEMENT3*> lst_element3_concerne;
878 francois 281 int num1,num2;
879     int nbchamp=solution_ele->get_nb_champ();
880     for (int i=0;i<nbchamp;i++)
881     {
882     std::string nom=solution_ele->get_legende(i);
883     char nom2[2];
884     unsigned long id;
885     sscanf(nom.c_str(),"%s %lu",nom2,&id);
886     if (id==face1->get_id()) num1=i;
887     if (id==face2->get_id()) num2=i;
888     }
889 francois 309 LISTE_FEM_ELEMENT3::iterator ittet;
890 francois 281 int i=0;
891 francois 309 for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittet);tet!=NULL;tet=mai->get_suivant_element3(ittet))
892 francois 281 {
893     if (solution_ele->lire(i,num1)>0.000001)
894 francois 309 lst_element3_concerne.ajouter(tet);
895 francois 281 if (solution_ele->lire(i,num2)>0.000001)
896 francois 309 lst_element3_concerne.ajouter(tet);
897 francois 281 i++;
898     }
899 francois 276
900 francois 281
901     int couche_active;
902     int nb_couche=0;
903     do
904     {
905     nb_couche++;
906 francois 309 TPL_MAP_ENTITE<FEM_ELEMENT3*>::ITERATEUR ittetra;
907     std::vector<FEM_ELEMENT3*> couche;
908 francois 281 couche_active=0;
909 francois 309 for (FEM_ELEMENT3* tet=lst_element3_concerne.get_premier(ittetra);tet!=NULL;tet=lst_element3_concerne.get_suivant(ittetra))
910 francois 281 {
911 francois 433 if (tet->get_etat(1)!=0) continue;
912 francois 281 FEM_NOEUD *no1=tet->get_fem_noeud(0);
913     FEM_NOEUD *no2=tet->get_fem_noeud(1);
914     FEM_NOEUD *no3=tet->get_fem_noeud(2);
915     FEM_NOEUD *no4=tet->get_fem_noeud(3);
916     int nbactif=0;
917     int nbpositif=0;
918 francois 433 if ((no1->get_etat(1)==1) || (no1->get_etat(1)==-1))
919 francois 281 {
920     nbactif++;
921     if (no1->get_solution()>0.) nbpositif++;
922     }
923 francois 433 if ((no2->get_etat(1)==1) || (no2->get_etat(1)==-1))
924 francois 281 {
925     nbactif++;
926     if (no2->get_solution()>0.) nbpositif++;
927     }
928 francois 433 if ((no3->get_etat(1)==1) || (no3->get_etat(1)==-1))
929 francois 281 {
930     nbactif++;
931     if (no3->get_solution()>0.) nbpositif++;
932     }
933 francois 433 if ((no4->get_etat(1)==1) || (no4->get_etat(1)==-1))
934 francois 281 {
935     nbactif++;
936     if (no4->get_solution()>0.) nbpositif++;
937     }
938     if ((nbactif==3) && (nbpositif<3) && (nbpositif>0))
939     {
940     couche.push_back(tet);
941     }
942     }
943     for (int i=0;i<couche.size();i++)
944     {
945 francois 309 FEM_ELEMENT3* tet=couche[i];
946 francois 281 FEM_NOEUD *no1=tet->get_fem_noeud(0);
947     FEM_NOEUD *no2=tet->get_fem_noeud(1);
948     FEM_NOEUD *no3=tet->get_fem_noeud(2);
949     FEM_NOEUD *no4=tet->get_fem_noeud(3);
950     TOIBREP_POINT* pt;
951     FEM_NOEUD* noeudref;
952 francois 433 if (no1->get_etat(1)==0) {noeudref=no1;pt=(*lst)[no2->get_numero()];}
953     if (no2->get_etat(1)==0) {noeudref=no2;pt=(*lst)[no1->get_numero()];}
954     if (no3->get_etat(1)==0) {noeudref=no3;pt=(*lst)[no1->get_numero()];}
955     if (no4->get_etat(1)==0) {noeudref=no4;pt=(*lst)[no1->get_numero()];}
956 francois 281 MG_FACE* face=pt->get_mg_face();
957     double t,xyz[3];
958     double dist=calcul_distance_level_ortho(noeudref,are,pt,t,xyz);
959     noeudref->change_solution(dist);
960 francois 433 noeudref->change_etat(1,2);
961 francois 281 TOIBREP_POINT *nvpt=new TOIBREP_POINT(xyz[0],xyz[1],xyz[2],t,0.,1,NULL);
962     lst->push_back(nvpt);
963     noeudref->change_numero(nvpt->get_id());
964     }
965 francois 309 for (FEM_ELEMENT3* tet=lst_element3_concerne.get_premier(ittetra);tet!=NULL;tet=lst_element3_concerne.get_suivant(ittetra))
966 francois 281 {
967     FEM_NOEUD *no1=tet->get_fem_noeud(0);
968     FEM_NOEUD *no2=tet->get_fem_noeud(1);
969     FEM_NOEUD *no3=tet->get_fem_noeud(2);
970     FEM_NOEUD *no4=tet->get_fem_noeud(3);
971 francois 433 if (no1->get_etat(1)!=0)
972     if (no2->get_etat(1)!=0)
973     if (no3->get_etat(1)!=0)
974     if (no4->get_etat(1)!=0)
975     if (tet->get_etat(1)==0)
976 francois 281 {
977     int reactive=0;
978     for (int i=0;i<tet->get_nb_fem_noeud();i++)
979     {
980     if (reactive) continue;
981     FEM_NOEUD* no=tet->get_fem_noeud(i);
982     TOIBREP_POINT *pt=(*lst)[no->get_numero()];
983     double t;
984     pt->get_coord1(t);
985     double eps=1e-4*(are->get_tmax()-are->get_tmin());
986     if ((t>=are->get_tmin()-eps) && (t<are->get_tmax()+eps))
987     {
988 francois 433 tet->change_etat(1,1);
989     no1->change_etat(1,1);
990     no2->change_etat(1,1);
991     no3->change_etat(1,1);
992     no4->change_etat(1,1);
993 francois 281 reactive=1;
994     couche_active=1;
995    
996     }
997    
998     }
999     if (!reactive)
1000     {
1001 francois 433 if (no1->get_etat(1)==2) no1->change_etat(1,-1);
1002     if (no2->get_etat(1)==2) no2->change_etat(1,-1);
1003     if (no3->get_etat(1)==2) no3->change_etat(1,-1);
1004     if (no4->get_etat(1)==2) no4->change_etat(1,-1);
1005     tet->change_etat(1,-1);
1006 francois 281 }
1007     }
1008     }
1009     }
1010     while (couche_active==1);
1011 francois 309 TPL_MAP_ENTITE<FEM_ELEMENT3*>::ITERATEUR ittetra;
1012     for (FEM_ELEMENT3* tet=lst_element3_concerne.get_premier(ittetra);tet!=NULL;tet=lst_element3_concerne.get_suivant(ittetra))
1013 francois 281 {
1014 francois 433 if (tet->get_etat(1)!=1) continue;
1015 francois 281 FEM_NOEUD *no1=tet->get_fem_noeud(0);
1016     FEM_NOEUD *no2=tet->get_fem_noeud(1);
1017     FEM_NOEUD *no3=tet->get_fem_noeud(2);
1018     FEM_NOEUD *no4=tet->get_fem_noeud(3);
1019     int nbpositif=0;
1020     int nbnegatif=0;
1021     double epsdist=1e-6*tet->get_boite_3D().get_rayon();
1022     if (no1->get_solution()>epsdist) nbpositif++;
1023     if (no1->get_solution()<-epsdist) nbnegatif++;
1024     if (no2->get_solution()>epsdist) nbpositif++;
1025     if (no2->get_solution()<-epsdist) nbnegatif++;
1026     if (no3->get_solution()>epsdist) nbpositif++;
1027     if (no3->get_solution()<-epsdist) nbnegatif++;
1028     if (no4->get_solution()>epsdist) nbpositif++;
1029     if (no4->get_solution()<-epsdist) nbnegatif++;
1030     if (!(((nbnegatif>0) && (nbpositif>0)) ||(nbnegatif+nbpositif==1)))
1031 francois 433 tet->change_etat(1,0);
1032 francois 281 }
1033     }
1034    
1035    
1036 francois 433 void TOIBREP::remplir_trou(std::vector<TOIBREP_POINT*> *lst,MG_FACE* face,int sens,TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> *lstentitetopoface)
1037 francois 276 {
1038     int castot=0;
1039     int cas=0;
1040 francois 280 int couche_active;
1041     int nb_couche=0;
1042 francois 309 LISTE_FEM_ELEMENT3::iterator ittetra;
1043 francois 280 do
1044     {
1045     nb_couche++;
1046 francois 281
1047 francois 309 std::vector<FEM_ELEMENT3*> couche;
1048 francois 280 couche_active=0;
1049 francois 309 for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittetra);tet!=NULL;tet=mai->get_suivant_element3(ittetra))
1050 francois 276 {
1051 francois 433 if (tet->get_etat(1)!=0) continue;
1052 francois 276 FEM_NOEUD *no1=tet->get_fem_noeud(0);
1053     FEM_NOEUD *no2=tet->get_fem_noeud(1);
1054     FEM_NOEUD *no3=tet->get_fem_noeud(2);
1055     FEM_NOEUD *no4=tet->get_fem_noeud(3);
1056     int nbactif=0;
1057     int nbpositif=0;
1058 francois 433 if ((no1->get_etat(1)==1) || (no1->get_etat(1)==-1))
1059 francois 276 {
1060     nbactif++;
1061     if (no1->get_solution()>0.) nbpositif++;
1062     }
1063 francois 433 if ((no2->get_etat(1)==1) || (no2->get_etat(1)==-1))
1064 francois 276 {
1065     nbactif++;
1066     if (no2->get_solution()>0.) nbpositif++;
1067     }
1068 francois 433 if ((no3->get_etat(1)==1) || (no3->get_etat(1)==-1))
1069 francois 276 {
1070     nbactif++;
1071     if (no3->get_solution()>0.) nbpositif++;
1072     }
1073 francois 433 if ((no4->get_etat(1)==1) || (no4->get_etat(1)==-1))
1074 francois 276 {
1075     nbactif++;
1076     if (no4->get_solution()>0.) nbpositif++;
1077     }
1078     if ((nbactif==3) && (nbpositif<3) && (nbpositif>0))
1079     {
1080     couche.push_back(tet);
1081     }
1082     }
1083     for (int i=0;i<couche.size();i++)
1084     {
1085 francois 309 FEM_ELEMENT3* tet=couche[i];
1086 francois 276 FEM_NOEUD *no1=tet->get_fem_noeud(0);
1087     FEM_NOEUD *no2=tet->get_fem_noeud(1);
1088     FEM_NOEUD *no3=tet->get_fem_noeud(2);
1089     FEM_NOEUD *no4=tet->get_fem_noeud(3);
1090     TOIBREP_POINT* pt;
1091     FEM_NOEUD* noeudref;
1092 francois 433 if (no1->get_etat(1)==0) {noeudref=no1;pt=(*lst)[no2->get_numero()];}
1093     if (no2->get_etat(1)==0) {noeudref=no2;pt=(*lst)[no1->get_numero()];}
1094     if (no3->get_etat(1)==0) {noeudref=no3;pt=(*lst)[no1->get_numero()];}
1095     if (no4->get_etat(1)==0) {noeudref=no4;pt=(*lst)[no1->get_numero()];}
1096 francois 281 MG_FACE* face=pt->get_mg_face();
1097 francois 280 double uv[2];
1098 francois 276 double xyz[3];
1099 francois 280 double dist=calcul_distance(noeudref,face,pt,xyz,uv);
1100     double normal[3];
1101 francois 276 face->calcul_normale_unitaire(uv,normal);
1102     normal[0]=normal[0]*sens*(-1.);
1103     normal[1]=normal[1]*sens*(-1.);
1104     normal[2]=normal[2]*sens*(-1.);
1105     double dist2=calculdist(normal,xyz[0],xyz[1],xyz[2],noeudref);
1106     if (dist2<0.) dist=dist*(-1);
1107     noeudref->change_solution(dist);
1108 francois 433 noeudref->change_etat(1,2);
1109 francois 280 TOIBREP_POINT *nvpt=new TOIBREP_POINT(xyz[0],xyz[1],xyz[2],uv[0],uv[1],1,face);
1110     lst->push_back(nvpt);
1111     noeudref->change_numero(nvpt->get_id());
1112 francois 276
1113     }
1114 francois 309 for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittetra);tet!=NULL;tet=mai->get_suivant_element3(ittetra))
1115 francois 276 {
1116     FEM_NOEUD *no1=tet->get_fem_noeud(0);
1117     FEM_NOEUD *no2=tet->get_fem_noeud(1);
1118     FEM_NOEUD *no3=tet->get_fem_noeud(2);
1119     FEM_NOEUD *no4=tet->get_fem_noeud(3);
1120 francois 433 if (no1->get_etat(1)!=0)
1121     if (no2->get_etat(1)!=0)
1122     if (no3->get_etat(1)!=0)
1123     if (no4->get_etat(1)!=0)
1124     if (tet->get_etat(1)==0)
1125 francois 276 {
1126     castot++;
1127 francois 280 double lstptdecoup[5*3];
1128 francois 433 int reactive=0;
1129     for (int num=0;num<2;num++)
1130     for (int i=0;i<tet->get_nb_xfem(num);i++)
1131     {
1132     if (reactive) continue;
1133     MG_ELEMENT_TOPOLOGIQUE* mgt=tet->get_xfem(num,i)->get_lien_topologie();
1134     if (lstentitetopoface->existe(mgt)==1)
1135     {
1136     cas++;
1137     tet->change_etat(1,1);
1138     no1->change_etat(1,1);
1139     no2->change_etat(1,1);
1140     no3->change_etat(1,1);
1141     no4->change_etat(1,1);
1142     reactive=1;
1143     couche_active=1;
1144     }
1145     }
1146 francois 276 int nb=0;
1147 francois 346 decoupe_tetra_noeud(tet,lstptdecoup,&nb);
1148 francois 276 for (int i=0;i<nb;i++)
1149     {
1150 francois 280 if (reactive) continue;
1151 francois 276 double uv[2];
1152 francois 280 face->inverser(uv,lstptdecoup+3*i);
1153 francois 433
1154 francois 276 if ((face->valide_parametre_u(uv[0])) && (face->valide_parametre_v(uv[1])))
1155     {
1156     double distance=ot.calcule_distance_contour_face_uv(uv,face);
1157 francois 433 if (distance>1e-10)
1158 francois 276 {
1159     cas++;
1160 francois 433 tet->change_etat(1,1);
1161     no1->change_etat(1,1);
1162     no2->change_etat(1,1);
1163     no3->change_etat(1,1);
1164     no4->change_etat(1,1);
1165 francois 280 reactive=1;
1166     couche_active=1;
1167 francois 276 }
1168     }
1169     }
1170 francois 280 if (!reactive)
1171     {
1172 francois 433 if (no1->get_etat(1)==2) no1->change_etat(1,-1);
1173     if (no2->get_etat(1)==2) no2->change_etat(1,-1);
1174     if (no3->get_etat(1)==2) no3->change_etat(1,-1);
1175     if (no4->get_etat(1)==2) no4->change_etat(1,-1);
1176     tet->change_etat(1,-1);
1177 francois 280 }
1178 francois 276 }
1179     }
1180 francois 280 }
1181     while (couche_active==1);
1182 francois 309 for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittetra);tet!=NULL;tet=mai->get_suivant_element3(ittetra))
1183 francois 281 {
1184     FEM_NOEUD *no1=tet->get_fem_noeud(0);
1185     FEM_NOEUD *no2=tet->get_fem_noeud(1);
1186     FEM_NOEUD *no3=tet->get_fem_noeud(2);
1187     FEM_NOEUD *no4=tet->get_fem_noeud(3);
1188 francois 346 /* if (no1->get_etat()==1)
1189     if (no2->get_etat()==1)
1190     if (no3->get_etat()==1)
1191     if (no4->get_etat()==1)
1192     if (tet->get_etat()!=1)
1193     tet->change_etat(1);*/
1194    
1195 francois 433 if (tet->get_etat(1)!=1) continue;
1196 francois 281 int nbpositif=0;
1197     int nbnegatif=0;
1198     double epsdist=1e-6*tet->get_boite_3D().get_rayon();
1199     if (no1->get_solution()>epsdist) nbpositif++;
1200     if (no1->get_solution()<-epsdist) nbnegatif++;
1201     if (no2->get_solution()>epsdist) nbpositif++;
1202     if (no2->get_solution()<-epsdist) nbnegatif++;
1203     if (no3->get_solution()>epsdist) nbpositif++;
1204     if (no3->get_solution()<-epsdist) nbnegatif++;
1205     if (no4->get_solution()>epsdist) nbpositif++;
1206     if (no4->get_solution()<-epsdist) nbnegatif++;
1207     if (!(((nbnegatif>0) && (nbpositif>0)) ||(nbnegatif+nbpositif==1)))
1208 francois 433 tet->change_etat(1,0);
1209 francois 281 }
1210 francois 433 if (castot!=0)
1211     {
1212     double res=cas*100.0/castot;
1213     char mess[255];
1214     sprintf(mess," %lf%% en %d couches",res,nb_couche);
1215     affiche(mess);
1216     }
1217     else
1218     {
1219     char mess[255];
1220     sprintf(mess," pas de trou");
1221     affiche(mess);
1222     }
1223 francois 276 }
1224    
1225 francois 433 int TOIBREP::decoupe_tetra(FEM_ELEMENT3* tet,MG_FACE* face)
1226 francois 276 {
1227 francois 433 std::vector<FEM_NOEUD*> lstno;
1228     FEM_NOEUD* no1=tet->get_fem_noeud(0);
1229     FEM_NOEUD* no2=tet->get_fem_noeud(1);
1230     FEM_NOEUD* no3=tet->get_fem_noeud(2);
1231     FEM_NOEUD* no4=tet->get_fem_noeud(3);
1232 francois 346 if (no1->get_solution()*no2->get_solution()<-0.00000001)
1233     {
1234     double t=no1->get_solution()/(no1->get_solution()-no2->get_solution());
1235 francois 433 if (t<0.0000000001) lstno.push_back(no1);
1236     else if (t>1.-0.0000000001) lstno.push_back(no2);
1237     else
1238     {
1239     double x=no1->get_x()+t*(no2->get_x()-no1->get_x());
1240     double y=no1->get_y()+t*(no2->get_y()-no1->get_y());
1241     double z=no1->get_z()+t*(no2->get_z()-no1->get_z());
1242     FEM_NOEUD* no=inserer_noeud(face,x,y,z);
1243     no->change_solution(0.0);
1244     no->change_etat(0,INCONNU);
1245     lstno.push_back(no);
1246     }
1247 francois 346 }
1248     if (no1->get_solution()*no3->get_solution()<-0.00000001)
1249     {
1250     double t=no1->get_solution()/(no1->get_solution()-no3->get_solution());
1251 francois 433 if (t<0.0000000001) lstno.push_back(no1);
1252     else if (t>1.-0.0000000001) lstno.push_back(no3);
1253     else
1254     {
1255     double x=no1->get_x()+t*(no3->get_x()-no1->get_x());
1256     double y=no1->get_y()+t*(no3->get_y()-no1->get_y());
1257     double z=no1->get_z()+t*(no3->get_z()-no1->get_z());
1258     FEM_NOEUD* no=inserer_noeud(face,x,y,z);
1259     no->change_solution(0.0);
1260     no->change_etat(0,INCONNU);
1261     lstno.push_back(no);
1262     }
1263 francois 346 }
1264     if (no1->get_solution()*no4->get_solution()<-0.00000001)
1265     {
1266     double t=no1->get_solution()/(no1->get_solution()-no4->get_solution());
1267 francois 433 if (t<0.0000000001) lstno.push_back(no1);
1268     else if (t>1.-0.0000000001) lstno.push_back(no4);
1269     else
1270     {
1271     double x=no1->get_x()+t*(no4->get_x()-no1->get_x());
1272     double y=no1->get_y()+t*(no4->get_y()-no1->get_y());
1273     double z=no1->get_z()+t*(no4->get_z()-no1->get_z());
1274     FEM_NOEUD* no=inserer_noeud(face,x,y,z);
1275     no->change_solution(0.0);
1276     no->change_etat(0,INCONNU);
1277     lstno.push_back(no);
1278     }
1279 francois 346 }
1280     if (no2->get_solution()*no3->get_solution()<-0.00000001)
1281     {
1282     double t=no2->get_solution()/(no2->get_solution()-no3->get_solution());
1283 francois 433 if (t<0.0000000001) lstno.push_back(no2);
1284     else if (t>1.-0.0000000001) lstno.push_back(no3);
1285     else
1286     {
1287     double x=no2->get_x()+t*(no3->get_x()-no2->get_x());
1288     double y=no2->get_y()+t*(no3->get_y()-no2->get_y());
1289     double z=no2->get_z()+t*(no3->get_z()-no2->get_z());
1290     FEM_NOEUD* no=inserer_noeud(face,x,y,z);
1291     no->change_solution(0.0);
1292     no->change_etat(0,INCONNU);
1293     lstno.push_back(no);
1294     }
1295    
1296 francois 346 }
1297     if (no2->get_solution()*no4->get_solution()<-0.00000001)
1298     {
1299     double t=no2->get_solution()/(no2->get_solution()-no4->get_solution());
1300 francois 433 if (t<0.0000000001) lstno.push_back(no2);
1301     else if (t>1.-0.0000000001) lstno.push_back(no4);
1302     else
1303     {
1304     double x=no2->get_x()+t*(no4->get_x()-no2->get_x());
1305     double y=no2->get_y()+t*(no4->get_y()-no2->get_y());
1306     double z=no2->get_z()+t*(no4->get_z()-no2->get_z());
1307     FEM_NOEUD* no=inserer_noeud(face,x,y,z);
1308     no->change_solution(0.0);
1309     no->change_etat(0,INCONNU);
1310     lstno.push_back(no);
1311     }
1312    
1313 francois 346 }
1314     if (no3->get_solution()*no4->get_solution()<-0.00000001)
1315     {
1316     double t=no3->get_solution()/(no3->get_solution()-no4->get_solution());
1317 francois 433 if (t<0.0000000001) lstno.push_back(no3);
1318     else if (t>1.-0.0000000001) lstno.push_back(no4);
1319     else
1320     {
1321     double x=no3->get_x()+t*(no4->get_x()-no3->get_x());
1322     double y=no3->get_y()+t*(no4->get_y()-no3->get_y());
1323     double z=no3->get_z()+t*(no4->get_z()-no3->get_z());
1324     FEM_NOEUD* no=inserer_noeud(face,x,y,z);
1325     no->change_solution(0.0);
1326     no->change_etat(0,INCONNU);
1327     lstno.push_back(no);
1328     }
1329    
1330    
1331     }
1332     int nb=lstno.size();
1333     if (nb==3)
1334     {
1335     FEM_NOEUD *lstnoeud[3];
1336     lstnoeud[0]=lstno[0];
1337     lstnoeud[1]=lstno[1];
1338     lstnoeud[2]=lstno[2];
1339     XFEM_TRIANGLE3* xtri=inserer_xtriangle(tet,face,lstnoeud);
1340     //XFEM_TRIANGLE3* xtri=new XFEM_TRIANGLE3(tet,face,lstnoeud);
1341     //oriente_tri(xtri,face);
1342     //mai->ajouter_xfem_element2(xtri);
1343     // XFEM_TRIANGLE3* xtri=inserer_xtriangle(tet,face,lstnoeud);
1344     xtri->change_etat(XINCONNU);
1345     tet->change_etat(0,FRONTIERE);
1346     return 1;
1347     }
1348     if (nb==4)
1349     {
1350     if (test_du_point_milieu(lstno[0],lstno[1],tet)==1)
1351     {
1352     FEM_NOEUD *lstnoeud[3];
1353     lstnoeud[0]=lstno[0];
1354     lstnoeud[1]=lstno[1];
1355     lstnoeud[2]=lstno[2];
1356     //XFEM_TRIANGLE3* xtri=new XFEM_TRIANGLE3(tet,face,lstnoeud);
1357     //oriente_tri(xtri,face);
1358     //mai->ajouter_xfem_element2(xtri);
1359     XFEM_TRIANGLE3* xtri=inserer_xtriangle(tet,face,lstnoeud);
1360     xtri->change_etat(XINCONNU);
1361     lstnoeud[0]=lstno[0];
1362     lstnoeud[1]=lstno[1];
1363     lstnoeud[2]=lstno[3];
1364     XFEM_TRIANGLE3* xtri2=inserer_xtriangle(tet,face,lstnoeud);
1365     //XFEM_TRIANGLE3* xtri2=new XFEM_TRIANGLE3(tet,face,lstnoeud);
1366     //oriente_tri(xtri2,face);
1367     //mai->ajouter_xfem_element2(xtri2);
1368     xtri2->change_etat(XINCONNU);
1369     tet->change_etat(0,FRONTIERE);
1370     }
1371     else if (test_du_point_milieu(lstno[0],lstno[2],tet)==1)
1372     {
1373     FEM_NOEUD *lstnoeud[3];
1374     lstnoeud[0]=lstno[0];
1375     lstnoeud[1]=lstno[1];
1376     lstnoeud[2]=lstno[2];
1377     //XFEM_TRIANGLE3* xtri=new XFEM_TRIANGLE3(tet,face,lstnoeud);
1378     //oriente_tri(xtri,face);
1379     //mai->ajouter_xfem_element2(xtri);
1380     XFEM_TRIANGLE3* xtri=inserer_xtriangle(tet,face,lstnoeud);
1381     xtri->change_etat(XINCONNU);
1382     lstnoeud[0]=lstno[0];
1383     lstnoeud[1]=lstno[2];
1384     lstnoeud[2]=lstno[3];
1385     XFEM_TRIANGLE3* xtri2=inserer_xtriangle(tet,face,lstnoeud);
1386     //XFEM_TRIANGLE3* xtri2=new XFEM_TRIANGLE3(tet,face,lstnoeud);
1387     //oriente_tri(xtri2,face);
1388     //mai->ajouter_xfem_element2(xtri2);
1389     xtri2->change_etat(XINCONNU);
1390     tet->change_etat(0,FRONTIERE);
1391     }
1392     else if (test_du_point_milieu(lstno[0],lstno[3],tet)==1)
1393     {
1394     FEM_NOEUD *lstnoeud[3];
1395     lstnoeud[0]=lstno[0];
1396     lstnoeud[1]=lstno[1];
1397     lstnoeud[2]=lstno[3];
1398     XFEM_TRIANGLE3* xtri=inserer_xtriangle(tet,face,lstnoeud);
1399     //XFEM_TRIANGLE3* xtri=new XFEM_TRIANGLE3(tet,face,lstnoeud);
1400     //oriente_tri(xtri,face);
1401     //mai->ajouter_xfem_element2(xtri);
1402     xtri->change_etat(XINCONNU);
1403     lstnoeud[0]=lstno[0];
1404     lstnoeud[1]=lstno[2];
1405     lstnoeud[2]=lstno[3];
1406     XFEM_TRIANGLE3* xtri2=inserer_xtriangle(tet,face,lstnoeud);
1407     //XFEM_TRIANGLE3* xtri2=new XFEM_TRIANGLE3(tet,face,lstnoeud);
1408     //oriente_tri(xtri2,face);
1409     //mai->ajouter_xfem_element2(xtri2);
1410     xtri2->change_etat(XINCONNU);
1411     tet->change_etat(0,FRONTIERE);
1412     }
1413     else if (test_du_point_milieu(lstno[1],lstno[2],tet)==1)
1414     {
1415     FEM_NOEUD *lstnoeud[3];
1416     lstnoeud[0]=lstno[0];
1417     lstnoeud[1]=lstno[1];
1418     lstnoeud[2]=lstno[2];
1419     XFEM_TRIANGLE3* xtri=inserer_xtriangle(tet,face,lstnoeud);
1420     //XFEM_TRIANGLE3* xtri=new XFEM_TRIANGLE3(tet,face,lstnoeud);
1421     //oriente_tri(xtri,face);
1422     //mai->ajouter_xfem_element2(xtri);
1423     xtri->change_etat(XINCONNU);
1424     lstnoeud[0]=lstno[1];
1425     lstnoeud[1]=lstno[2];
1426     lstnoeud[2]=lstno[3];
1427     XFEM_TRIANGLE3* xtri2=inserer_xtriangle(tet,face,lstnoeud);
1428     //XFEM_TRIANGLE3* xtri2=new XFEM_TRIANGLE3(tet,face,lstnoeud);
1429     //oriente_tri(xtri2,face);
1430     //mai->ajouter_xfem_element2(xtri2);
1431     xtri2->change_etat(XINCONNU);
1432     tet->change_etat(0,FRONTIERE);
1433     }
1434     else if (test_du_point_milieu(lstno[1],lstno[3],tet)==1)
1435     {
1436     FEM_NOEUD *lstnoeud[3];
1437     lstnoeud[0]=lstno[0];
1438     lstnoeud[1]=lstno[1];
1439     lstnoeud[2]=lstno[3];
1440     XFEM_TRIANGLE3* xtri=inserer_xtriangle(tet,face,lstnoeud);
1441     //XFEM_TRIANGLE3* xtri=new XFEM_TRIANGLE3(tet,face,lstnoeud);
1442     //oriente_tri(xtri,face);
1443     //mai->ajouter_xfem_element2(xtri);
1444     xtri->change_etat(XINCONNU);
1445     lstnoeud[0]=lstno[1];
1446     lstnoeud[1]=lstno[2];
1447     lstnoeud[2]=lstno[3];
1448     XFEM_TRIANGLE3* xtri2=inserer_xtriangle(tet,face,lstnoeud);
1449     //XFEM_TRIANGLE3* xtri2=new XFEM_TRIANGLE3(tet,face,lstnoeud);
1450     //oriente_tri(xtri2,face);
1451     //mai->ajouter_xfem_element2(xtri2);
1452     xtri2->change_etat(XINCONNU);
1453     tet->change_etat(0,FRONTIERE);
1454     }
1455     else
1456     {
1457     FEM_NOEUD *lstnoeud[3];
1458     lstnoeud[0]=lstno[0];
1459     lstnoeud[1]=lstno[2];
1460     lstnoeud[2]=lstno[3];
1461     XFEM_TRIANGLE3* xtri=inserer_xtriangle(tet,face,lstnoeud);
1462     //XFEM_TRIANGLE3* xtri=new XFEM_TRIANGLE3(tet,face,lstnoeud);
1463     //oriente_tri(xtri,face);
1464     //mai->ajouter_xfem_element2(xtri);
1465     xtri->change_etat(XINCONNU);
1466     lstnoeud[0]=lstno[1];
1467     lstnoeud[1]=lstno[2];
1468     lstnoeud[2]=lstno[3];
1469     XFEM_TRIANGLE3* xtri2=inserer_xtriangle(tet,face,lstnoeud);
1470     //XFEM_TRIANGLE3* xtri2=new XFEM_TRIANGLE3(tet,face,lstnoeud);
1471     //oriente_tri(xtri2,face);
1472     //mai->ajouter_xfem_element2(xtri2);
1473     xtri2->change_etat(XINCONNU);
1474     tet->change_etat(0,FRONTIERE);
1475     }
1476     return 2;
1477     }
1478 francois 346 }
1479    
1480    
1481    
1482    
1483     void TOIBREP::decoupe_tetra_noeud(FEM_ELEMENT3* tet,double* lst,int *nb)
1484     {
1485 francois 276 FEM_NOEUD* no1=tet->get_fem_noeud(0);
1486     FEM_NOEUD* no2=tet->get_fem_noeud(1);
1487     FEM_NOEUD* no3=tet->get_fem_noeud(2);
1488     FEM_NOEUD* no4=tet->get_fem_noeud(3);
1489     if (no1->get_solution()*no2->get_solution()<-0.00000001)
1490     {
1491     double t=no1->get_solution()/(no1->get_solution()-no2->get_solution());
1492     double x=no1->get_x()+t*(no2->get_x()-no1->get_x());
1493     double y=no1->get_y()+t*(no2->get_y()-no1->get_y());
1494     double z=no1->get_z()+t*(no2->get_z()-no1->get_z());
1495     lst[3*(*nb)]=x;
1496     lst[3*(*nb)+1]=y;
1497     lst[3*(*nb)+2]=z;
1498     (*nb)++;
1499     }
1500     if (no1->get_solution()*no3->get_solution()<-0.00000001)
1501     {
1502     double t=no1->get_solution()/(no1->get_solution()-no3->get_solution());
1503     double x=no1->get_x()+t*(no3->get_x()-no1->get_x());
1504     double y=no1->get_y()+t*(no3->get_y()-no1->get_y());
1505     double z=no1->get_z()+t*(no3->get_z()-no1->get_z());
1506     lst[3*(*nb)]=x;
1507     lst[3*(*nb)+1]=y;
1508     lst[3*(*nb)+2]=z;
1509     (*nb)++;
1510     }
1511     if (no1->get_solution()*no4->get_solution()<-0.00000001)
1512     {
1513     double t=no1->get_solution()/(no1->get_solution()-no4->get_solution());
1514     double x=no1->get_x()+t*(no4->get_x()-no1->get_x());
1515     double y=no1->get_y()+t*(no4->get_y()-no1->get_y());
1516     double z=no1->get_z()+t*(no4->get_z()-no1->get_z());
1517     lst[3*(*nb)]=x;
1518     lst[3*(*nb)+1]=y;
1519     lst[3*(*nb)+2]=z;
1520     (*nb)++;
1521     }
1522     if (no2->get_solution()*no3->get_solution()<-0.00000001)
1523     {
1524     double t=no2->get_solution()/(no2->get_solution()-no3->get_solution());
1525     double x=no2->get_x()+t*(no3->get_x()-no2->get_x());
1526     double y=no2->get_y()+t*(no3->get_y()-no2->get_y());
1527     double z=no2->get_z()+t*(no3->get_z()-no2->get_z());
1528     lst[3*(*nb)]=x;
1529     lst[3*(*nb)+1]=y;
1530     lst[3*(*nb)+2]=z;
1531     (*nb)++;
1532     }
1533     if (no2->get_solution()*no4->get_solution()<-0.00000001)
1534     {
1535     double t=no2->get_solution()/(no2->get_solution()-no4->get_solution());
1536     double x=no2->get_x()+t*(no4->get_x()-no2->get_x());
1537     double y=no2->get_y()+t*(no4->get_y()-no2->get_y());
1538     double z=no2->get_z()+t*(no4->get_z()-no2->get_z());
1539     lst[3*(*nb)]=x;
1540     lst[3*(*nb)+1]=y;
1541     lst[3*(*nb)+2]=z;
1542     (*nb)++;
1543     }
1544     if (no3->get_solution()*no4->get_solution()<-0.00000001)
1545     {
1546     double t=no3->get_solution()/(no3->get_solution()-no4->get_solution());
1547     double x=no3->get_x()+t*(no4->get_x()-no3->get_x());
1548     double y=no3->get_y()+t*(no4->get_y()-no3->get_y());
1549     double z=no3->get_z()+t*(no4->get_z()-no3->get_z());
1550     lst[3*(*nb)]=x;
1551     lst[3*(*nb)+1]=y;
1552     lst[3*(*nb)+2]=z;
1553     (*nb)++;
1554     }
1555     }
1556    
1557     void TOIBREP::calcullevelsetpremierepasse(MG_FACE* face,int sens,vector<TOIBREP_POINT*> *lst,int n1,int n2)
1558     {
1559 francois 309 /*LISTE_FEM_ELEMENT3::iterator it3;
1560     for (FEM_ELEMENT3* tet=mai->get_premier_element3(it3);tet!=NULL;tet=mai->get_suivant_element3(it3))
1561 francois 276 {
1562     double *xyz1,*xyz2,*xyz3,*xyz4;
1563     if (tet->get_nb_fem_noeud()==4)
1564     {
1565     xyz1=tet->get_fem_noeud(0)->get_coord();
1566     xyz2=tet->get_fem_noeud(1)->get_coord();
1567     xyz3=tet->get_fem_noeud(2)->get_coord();
1568     xyz4=tet->get_fem_noeud(3)->get_coord();
1569     }
1570     if (tet->get_nb_fem_noeud()==10)
1571     {
1572     xyz1=tet->get_fem_noeud(0)->get_coord();
1573     xyz2=tet->get_fem_noeud(2)->get_coord();
1574     xyz3=tet->get_fem_noeud(4)->get_coord();
1575     xyz4=tet->get_fem_noeud(9)->get_coord();
1576     }
1577     double xcentre=0.25*(xyz1[0]+xyz2[0]+xyz3[0]+xyz4[0]);
1578     double ycentre=0.25*(xyz1[1]+xyz2[1]+xyz3[1]+xyz4[1]);
1579     double zcentre=0.25*(xyz1[2]+xyz2[2]+xyz3[2]+xyz4[2]);
1580     double rayon1=(xyz1[0]-xcentre)*(xyz1[0]-xcentre)+(xyz1[1]-ycentre)*(xyz1[1]-ycentre)+(xyz1[2]-zcentre)*(xyz1[2]-zcentre);
1581     double rayon2=(xyz2[0]-xcentre)*(xyz2[0]-xcentre)+(xyz2[1]-ycentre)*(xyz2[1]-ycentre)+(xyz2[2]-zcentre)*(xyz2[2]-zcentre);
1582     double rayon3=(xyz3[0]-xcentre)*(xyz3[0]-xcentre)+(xyz3[1]-ycentre)*(xyz3[1]-ycentre)+(xyz3[2]-zcentre)*(xyz3[2]-zcentre);
1583     double rayon4=(xyz4[0]-xcentre)*(xyz4[0]-xcentre)+(xyz4[1]-ycentre)*(xyz4[1]-ycentre)+(xyz4[2]-zcentre)*(xyz4[2]-zcentre);
1584     double rayon=std::max(rayonETRA_ACTIF1,std::max(rayon2,std::max(rayon3,rayon4)));
1585     rayon=sqrt(rayon);
1586     TPL_MAP_ENTITE<TOIBREP_POINT*> liste;
1587     octree.rechercher(xcentre,ycentre,zcentre,rayon,liste);
1588     TPL_MAP_ENTITE<TOIBREP_POINT*>::ITERATEUR it;
1589     for (TOIBREP_POINT* pt=liste.get_premier(it);pt!=NULL;pt=liste.get_suivant(it))
1590     {
1591     double xyzpt[3];
1592     pt->get_coord3(xyzpt);
1593     int etat=estdansletetra(tet,xyzpt[0],xyzpt[1],xyzpt[2]);
1594     if (compare_etat(etat,INTERIEUR))
1595     {
1596     for (int k=0;k<tet->get_nb_fem_noeud();k++)
1597     {
1598     double normal[3];
1599     double uv[2];
1600     face->inverser(uv,xyzpt);
1601     face->calcul_normale_unitaire(uv,normal);
1602     normal[0]=normal[0]*sens*(-1.);
1603     normal[1]=normal[1]*sens*(-1.);
1604     normal[2]=normal[2]*sens*(-1.);
1605     double dist=calculdist(normal,xyzpt[0],xyzpt[1],xyzpt[2],tet->get_fem_noeud(k));
1606     if (fabs(dist)<fabs(tet->get_fem_noeud(k)->get_solution()))
1607     {
1608     tet->get_fem_noeud(k)->change_solution(dist);
1609     tet->get_fem_noeud(k)->change_numero(pt->get_id());
1610     pt->change_coord2(uv);
1611     }
1612     }
1613     }
1614     if ((compare_etat(etat,STRICTINTERIEUR)) && (pt->get_interieur()))
1615     {
1616     tet->change_etat(1);
1617     for (int k=0;k<tet->get_nb_fem_noeud();k++)
1618     tet->get_fem_noeud(k)->change_etat(1);
1619     }
1620     if (tet->get_etat()==1) break;
1621     }
1622    
1623     }
1624     octree.vide();
1625 francois 281 it}*/
1626 francois 309 /*LISTE_FEM_ELEMENT3::iterator it3;
1627     for (FEM_ELEMENT3* tet=mai->get_premier_element3(it3);tet!=NULL;tet=mai->get_suivant_element3(it3))
1628 francois 276 octree.inserer(tet);*/
1629     for (int i=n1;i<n2;i++)
1630     {
1631 francois 259 TOIBREP_POINT* pt=(*lst)[i];
1632 francois 104 double uv[2];
1633 francois 106 double xyz[3];
1634     pt->get_coord3(xyz);
1635 francois 222 double normal[3];
1636 francois 104 face->inverser(uv,xyz);
1637     face->calcul_normale_unitaire(uv,normal);
1638 francois 222 normal[0]=normal[0]*sens*(-1.);
1639     normal[1]=normal[1]*sens*(-1.);
1640     normal[2]=normal[2]*sens*(-1.);
1641 francois 309 TPL_MAP_ENTITE<FEM_ELEMENT3*> liste;
1642 francois 433 octree_tetra.rechercher(xyz[0],xyz[1],xyz[2],0.,liste);
1643 francois 309 TPL_MAP_ENTITE<FEM_ELEMENT3*>::ITERATEUR it;
1644     for (FEM_ELEMENT3* tet=liste.get_premier(it);tet!=NULL;tet=liste.get_suivant(it))
1645 francois 104 {
1646 francois 433 if (tet->get_etat(1)==1) continue;
1647     int etat=outilfem.estdansletetra(tet,xyz[0],xyz[1],xyz[2]);
1648     if ((outilfem.compare_etat_tetra(etat,FEM_MAILLAGE_OUTILS::SUR_FACE)) && (pt->get_interieur()))
1649 francois 281 {
1650     int nbeps=pt->get_nb_point_eps();
1651     for (int k=0;k<nbeps;k++)
1652     {
1653     double xyztmp[3];
1654     pt->get_point_eps(k,xyztmp);
1655 francois 433 int etattmp=outilfem.estdansletetra(tet,xyztmp[0],xyztmp[1],xyztmp[2]);
1656     if (outilfem.compare_etat_tetra(etattmp,FEM_MAILLAGE_OUTILS::SUR_FACE)) {etat=FEM_MAILLAGE_OUTILS::STRICTINTERIEUR;break;}
1657     if (outilfem.compare_etat_tetra(etattmp,FEM_MAILLAGE_OUTILS::INTERIEUR)) {etat=FEM_MAILLAGE_OUTILS::STRICTINTERIEUR;break;}
1658     if (outilfem.compare_etat_tetra(etattmp,FEM_MAILLAGE_OUTILS::STRICTINTERIEUR)) {etat=FEM_MAILLAGE_OUTILS::STRICTINTERIEUR;break;}
1659 francois 281 }
1660     }
1661 francois 433 if (outilfem.compare_etat_tetra(etat,FEM_MAILLAGE_OUTILS::INTERIEUR))
1662 francois 104 {
1663 francois 222 for (int k=0;k<tet->get_nb_fem_noeud();k++)
1664 francois 106 {
1665 francois 222 double dist=calculdist(normal,xyz[0],xyz[1],xyz[2],tet->get_fem_noeud(k));
1666     if (fabs(dist)<fabs(tet->get_fem_noeud(k)->get_solution()))
1667     {
1668     tet->get_fem_noeud(k)->change_solution(dist);
1669     tet->get_fem_noeud(k)->change_numero(pt->get_id());
1670     pt->change_coord2(uv);
1671     }
1672 francois 106 }
1673 francois 104 }
1674 francois 433 if ((outilfem.compare_etat_tetra(etat,FEM_MAILLAGE_OUTILS::STRICTINTERIEUR)) && (pt->get_interieur()))
1675 francois 276 {
1676 francois 433 tet->change_etat(1,1);
1677 francois 276 for (int k=0;k<tet->get_nb_fem_noeud();k++)
1678     {
1679 francois 433 tet->get_fem_noeud(k)->change_etat(1,1);
1680 francois 276 //octree.supprimer(tet);
1681     }
1682     }
1683 francois 104 }
1684     }
1685 francois 276 //octree.vide();
1686    
1687    
1688    
1689    
1690 francois 106 }
1691    
1692 francois 276 void TOIBREP::calcullevelsetdeuxiemepasse(vector<TOIBREP_POINT*> *lst)
1693 francois 106 {
1694 francois 276 LISTE_FEM_NOEUD::iterator itno;
1695     for (FEM_NOEUD* no=mai->get_premier_noeud(itno);no!=NULL;no=mai->get_suivant_noeud(itno))
1696     if (no->get_solution()<1e250)
1697 francois 106 {
1698 francois 276 TOIBREP_POINT* pt=(*lst)[no->get_numero()];
1699 francois 281 MG_FACE* face=pt->get_mg_face();
1700     double xyz[3],uv[2];
1701     double dist=calcul_distance(no,face,pt,xyz,uv);
1702     int signe=1;
1703     if (no->get_solution()<0) signe=-1;
1704     no->change_solution(signe*dist);
1705 francois 106 }
1706 francois 104
1707 francois 276
1708    
1709    
1710 francois 106 }
1711    
1712 francois 281
1713    
1714     double TOIBREP::calcul_distance(FEM_NOEUD* noeud,MG_ARETE* are,TOIBREP_POINT* pt,double &tii,double *xyz,double precision)
1715 francois 106 {
1716 francois 281 double eps;
1717 francois 106 are->inverser(tii,noeud->get_coord());
1718     int compteur=0;
1719     OT_VECTEUR_3D Pt(noeud->get_x(),noeud->get_y(),noeud->get_z());
1720     do
1721     {
1722     compteur++;
1723     double ti=tii;
1724     double xyz[3],dxyz[3],ddxyz[3];
1725     are->deriver_seconde(ti,ddxyz,dxyz,xyz);
1726     OT_VECTEUR_3D Ct(xyz[0],xyz[1],xyz[2]);
1727     OT_VECTEUR_3D Ct_deriver(dxyz[0],dxyz[1],dxyz[2]);
1728     OT_VECTEUR_3D Ct_deriver_seconde(ddxyz[0],ddxyz[1],ddxyz[2]);
1729     OT_VECTEUR_3D Distance = Ct-Pt;
1730     tii=ti-Ct_deriver*Distance/(Ct_deriver_seconde*Distance+Ct_deriver.get_longueur2());
1731     eps=fabs(tii-ti);
1732     if (compteur>500) return 1e300;
1733     if (tii<are->get_tmin())
1734     {
1735     tii=are->get_tmin();
1736     eps=0.;
1737     }
1738     if (tii>are->get_tmax())
1739     {
1740     tii=are->get_tmax();
1741     eps=0.;
1742     }
1743     }
1744     while (eps>precision);
1745     are->evaluer(tii,xyz);
1746     OT_VECTEUR_3D Ct(xyz[0],xyz[1],xyz[2]);
1747     double distance=(Ct-Pt).get_longueur();
1748 francois 281 return distance;
1749 francois 106 }
1750    
1751 francois 281
1752     double TOIBREP::calcul_distance_level_ortho(FEM_NOEUD* no,MG_ARETE* are,TOIBREP_POINT* pt,double precision)
1753     {
1754     double t;
1755     double xyz[3];
1756     return calcul_distance_level_ortho(no,are,pt,t,xyz,precision);
1757     }
1758    
1759     double TOIBREP::calcul_distance_level_ortho(FEM_NOEUD* no,MG_ARETE* are,TOIBREP_POINT* pt,double &t,double *xyz,double precision)
1760     {
1761     calcul_distance(no,are,pt,t,xyz,precision);
1762     double dir[3];
1763     are->deriver(t,dir);
1764     double uv[2];
1765     MG_FACE* face=are->get_mg_coarete(0)->get_boucle()->get_mg_face();
1766     face->inverser(uv,xyz);
1767     double nor[3];
1768     face->calcul_normale_unitaire(uv,nor);
1769     OT_VECTEUR_3D dirv(dir);
1770     OT_VECTEUR_3D norv(nor);
1771     OT_VECTEUR_3D sensv=norv&dirv;
1772     double d=-(sensv.get_x()*xyz[0]+sensv.get_y()*xyz[1],sensv.get_z()*xyz[2]);
1773     double dist=fabs(sensv.get_x()*no->get_x()+sensv.get_y()*no->get_y()+sensv.get_z()*no->get_z()+d);
1774     OT_VECTEUR_3D distv(no->get_x()-xyz[0],no->get_y()-xyz[1],no->get_z()-xyz[2]);
1775     if (sensv*distv<0.) dist=-dist;
1776     return dist;
1777     }
1778    
1779    
1780 francois 280 double TOIBREP::calcul_distance(FEM_NOEUD* noeud,MG_FACE* face,TOIBREP_POINT* pt,double *xyz,double *uv,double precision)
1781 francois 106 {
1782     double uvii[2],eps;
1783     pt->get_coord2(uvii);
1784     int compteur=0;
1785     OT_VECTEUR_3D Pt(noeud->get_x(),noeud->get_y(),noeud->get_z());
1786     double delta_u,delta_v;
1787     do
1788     {
1789     compteur++;
1790     double uvi[2];
1791     uvi[0]=uvii[0];
1792     uvi[1]=uvii[1];
1793     double xyzduu[3],xyzdvv[3],xyzduv[3],xyzdu[3],xyzdv[3],xyz[3];
1794     face->deriver_seconde(uvi,xyzduu,xyzduv,xyzdvv,xyz,xyzdu,xyzdv);
1795     OT_VECTEUR_3D S(xyz[0],xyz[1],xyz[2]);
1796     OT_VECTEUR_3D Su(xyzdu[0],xyzdu[1],xyzdu[2]);
1797     OT_VECTEUR_3D Sv(xyzdv[0],xyzdv[1],xyzdv[2]);
1798     OT_VECTEUR_3D Suu(xyzduu[0],xyzduu[1],xyzduu[2]);
1799     OT_VECTEUR_3D Suv(xyzduv[0],xyzduv[1],xyzduv[2]);
1800     OT_VECTEUR_3D Svv(xyzdvv[0],xyzdvv[1],xyzdvv[2]);
1801     OT_VECTEUR_3D Distance = S-Pt;
1802     double a[4],b[2];
1803     a[0]=Su.get_longueur2()+Distance*Suu;
1804     a[1]=Su*Sv+Distance*Suv;
1805     a[2]=Su*Sv+Distance*Suv;
1806     a[3]=Sv.get_longueur2()+Distance*Svv;
1807     b[0]=Distance*Su;b[0]=-b[0];
1808     b[1]=Distance*Sv;b[1]=-b[1];
1809     double deltau,deltav;
1810     double denominateur_delta=(a[0]*a[3]-a[2]*a[1]);
1811     if (a[0]<1E-12)
1812     deltau=0;
1813     else delta_u=(b[0]*a[3]-b[1]*a[1])/denominateur_delta;
1814     if (a[3]<1E-12)
1815     deltav=0;
1816     else delta_v=(a[0]*b[1]-a[2]*b[0])/denominateur_delta;
1817     /*if (fabs(denominateur_delta) < ( (fabs(a[0])+fabs(a[1])+fabs(a[2])+fabs(a[3]))*1e-12 ) )
1818     return 1e300;*/
1819     uvii[0]=uvi[0]+delta_u;
1820     uvii[1]=uvi[1]+delta_v;
1821     if (face->get_surface()->est_periodique_u()==1)
1822     {
1823     if(uvii[0]<0.) uvii[0]=face->get_surface()->get_periode_u()-uvii[0];
1824     if(uvii[0]>face->get_surface()->get_periode_u()) uvii[0]=uvii[0]-face->get_surface()->get_periode_u();
1825     }
1826     if (face->get_surface()->est_periodique_v()==1)
1827     {
1828     if(uvii[1]<0.) uvii[0]=face->get_surface()->get_periode_v()-uvii[1];
1829     if(uvii[1]>face->get_surface()->get_periode_v()) uvii[1]=uvii[1]-face->get_surface()->get_periode_v();
1830     }
1831     delta_u=uvii[0]-uvi[0];
1832     delta_v=uvii[1]-uvi[1];
1833     if (compteur>500) return 1e300;
1834     }
1835    
1836     while ((fabs(delta_u)>precision)||(fabs(delta_v)>precision));
1837     face->evaluer(uvii,xyz);
1838     OT_VECTEUR_3D S(xyz[0],xyz[1],xyz[2]);
1839     double distance=(S-Pt).get_longueur();
1840 francois 280 uv[0]=uvii[0];
1841     uv[1]=uvii[1];
1842 francois 106 return distance;
1843     }
1844    
1845    
1846 francois 276
1847 francois 259 void TOIBREP::etendrelevelset(FEM_SOLUTION* sol,int numsol)
1848 francois 222 {
1849     sol->active_solution(numsol);
1850    
1851    
1852     LISTE_FM know;
1853     LISTE_FM trial;
1854     LISTE_FM far;
1855     LISTE_FM exterieur;
1856     LISTE_FM_TRI trialtri;
1857     LISTE_FM_TRI_ID trialtriid;
1858    
1859    
1860 francois 309 LISTE_FEM_ELEMENT3::iterator ittet;
1861     for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittet);tet!=NULL;tet=mai->get_suivant_element3(ittet))
1862 francois 222 {
1863     tet->change_solution(0.);
1864     int numsol=0;
1865     if (tet->get_fem_noeud(0)->get_solution()<1e200) {numsol++;tet->get_fem_noeud(0)->change_numero(1);} else tet->get_fem_noeud(0)->change_numero(0);
1866     if (tet->get_fem_noeud(1)->get_solution()<1e200) {numsol++;tet->get_fem_noeud(1)->change_numero(1);} else tet->get_fem_noeud(1)->change_numero(0);
1867     if (tet->get_fem_noeud(2)->get_solution()<1e200) {numsol++;tet->get_fem_noeud(2)->change_numero(1);} else tet->get_fem_noeud(2)->change_numero(0);
1868     if (tet->get_fem_noeud(3)->get_solution()<1e200) {numsol++;tet->get_fem_noeud(3)->change_numero(1);} else tet->get_fem_noeud(3)->change_numero(0);
1869     if (numsol==4)
1870     ajouter_liste(know,tet);
1871    
1872     else if (numsol==3)
1873     {
1874     if (tet->get_fem_noeud(0)->get_numero()==0) tet->change_numero(0);
1875     else if (tet->get_fem_noeud(1)->get_numero()==0) tet->change_numero(1);
1876     else if (tet->get_fem_noeud(2)->get_numero()==0) tet->change_numero(2);
1877     else tet->change_numero(3);
1878     ajouter_liste(trial,tet);
1879     }
1880     else
1881     ajouter_liste(far,tet);
1882    
1883     }
1884     for (LISTE_FM::iterator i=trial.begin();i!=trial.end();i++)
1885     {
1886 francois 309 FEM_ELEMENT3* tet=*i;
1887 francois 222 int signe;
1888     double sol=resoudgradT(tet,&signe);
1889     if (fabs(sol)>0.00000001)
1890     {
1891     if (fabs(sol)<fabs(tet->get_fem_noeud(tet->get_numero())->get_solution()))
1892     {
1893     tet->get_fem_noeud(tet->get_numero())->change_solution(sol);
1894     ajouter_liste(trialtri,trialtriid,tet,fabs(tet->get_fem_noeud(tet->get_numero())->get_solution()));
1895     }
1896     }
1897     else
1898     {
1899     ajouter_liste(exterieur,tet);
1900     tet->change_solution(1e300);
1901     }
1902     }
1903     int fin=0;
1904     LISTE_FM_TRI::iterator itfin=trialtri.end();
1905     itfin--;
1906     double longref=(*itfin).first;
1907     do
1908     {
1909     LISTE_FM_TRI::iterator it=trialtri.begin();
1910 francois 309 FEM_ELEMENT3* tet=(*it).second;
1911 francois 222 double longcourant=(*it).first;
1912     supprimer_liste(trialtri,trialtriid,tet);
1913     ajouter_liste(know,tet);
1914     FEM_NOEUD* noeud=tet->get_fem_noeud(tet->get_numero());
1915     noeud->change_numero(1);
1916     if (noeud->get_solution()>20000)
1917     cout << "BUGGGGGGG" <<endl;
1918 francois 309 int nbtetra=noeud->get_lien_element3()->get_nb();
1919 francois 222 for (int i=0;i<nbtetra;i++)
1920     {
1921 francois 309 FEM_ELEMENT3* tet2=noeud->get_lien_element3()->get(i);
1922 francois 222 if (tet2==tet) continue;
1923     LISTE_FM_TRI_ID::iterator it=trialtriid.find(tet2->get_id());
1924     if (it!=trialtriid.end())
1925     {
1926     int signe;
1927     double sol=resoudgradT(tet2,&signe);
1928     double solution=tet2->get_fem_noeud(tet2->get_numero())->get_solution();
1929     if (fabs(sol)>0.00000001)
1930     if (!((solution<1e200)&&(sol*solution<0)))
1931     if (fabs(sol)<fabs(solution))
1932     {
1933     supprimer_liste(trialtri,trialtriid,tet2);
1934     ajouter_liste(trialtri,trialtriid,tet2,fabs(sol));
1935     tet2->get_fem_noeud(tet2->get_numero())->change_solution(sol);
1936     }
1937     }
1938     LISTE_FM::iterator it2=find(far.begin(),far.end(),tet2);
1939     if (it2!=far.end())
1940     {
1941     int numsol=0;
1942     if (tet2->get_fem_noeud(0)->get_numero()==1) numsol++;
1943     if (tet2->get_fem_noeud(1)->get_numero()==1) numsol++;
1944     if (tet2->get_fem_noeud(2)->get_numero()==1) numsol++;
1945     if (tet2->get_fem_noeud(3)->get_numero()==1) numsol++;
1946     //if (numsol==4)
1947     //cout << " BUG " <<endl;
1948     if (numsol==3)
1949     {
1950     if (tet2->get_fem_noeud(0)->get_numero()==0) tet2->change_numero(0);
1951     else if (tet2->get_fem_noeud(1)->get_numero()==0) tet2->change_numero(1);
1952     else if (tet2->get_fem_noeud(2)->get_numero()==0) tet2->change_numero(2);
1953     else tet2->change_numero(3);
1954     int signe;
1955     double sol=resoudgradT(tet2,&signe);
1956     double ancsol=tet2->get_fem_noeud(tet2->get_numero())->get_solution();
1957     if (fabs(sol)>0.00000001)
1958     {
1959     if (!((ancsol<1e200) && (ancsol*sol<0.) ))
1960     {
1961     tet2->get_fem_noeud(tet2->get_numero())->change_solution(sol);
1962     supprimer_liste(far,tet2);
1963     ajouter_liste(trialtri,trialtriid,tet2,fabs(sol));
1964     }
1965     }
1966     else
1967     {
1968     tet2->change_solution(1e300);
1969     ajouter_liste(exterieur,tet2);
1970     }
1971     }
1972     }
1973     }
1974     if (trialtri.size()==0) fin=1;
1975     if (exterieur.size()>0)
1976     if (fin==0)
1977     if (longcourant>longref)
1978     {
1979     int nombre=exterieur.size();
1980     for (int i=0;i<nombre;i++)
1981     {
1982 francois 309 FEM_ELEMENT3* tet2=(*(exterieur.begin()));
1983 francois 222 supprimer_liste(exterieur,tet2);
1984     ajouter_liste(know,tet2);
1985     for (int nd=0;nd<4;nd++)
1986     {
1987     FEM_NOEUD* noeud=tet2->get_fem_noeud(nd);
1988 francois 309 int nbtetra=noeud->get_lien_element3()->get_nb();
1989 francois 222 for (int i=0;i<nbtetra;i++)
1990     {
1991 francois 309 FEM_ELEMENT3* tet3=noeud->get_lien_element3()->get(i);
1992 francois 222 if (tet2==tet3) continue;
1993     LISTE_FM::iterator it2=find(far.begin(),far.end(),tet3);
1994     if (it2!=far.end())
1995     {
1996     supprimer_liste(far,tet3);
1997     ajouter_liste(exterieur,tet3);
1998     tet3->change_solution(1e300);
1999     }
2000     }
2001     }
2002     }
2003     LISTE_FM_TRI::iterator itfin=trialtri.end();
2004     itfin--;
2005     longref=(*itfin).first;
2006     }
2007     }
2008     while (fin==0);
2009     LISTE_FEM_NOEUD::iterator itnoeud;
2010     for (FEM_NOEUD* noeud=mai->get_premier_noeud(itnoeud);noeud!=NULL;noeud=mai->get_suivant_noeud(itnoeud))
2011     noeud->change_numero(0);
2012 francois 309 for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittet);tet!=NULL;tet=mai->get_suivant_element3(ittet))
2013 francois 222 {
2014     if (tet->get_solution()>1e200) continue;
2015     tet->get_fem_noeud(0)->change_numero(1);
2016     tet->get_fem_noeud(1)->change_numero(1);
2017     tet->get_fem_noeud(2)->change_numero(1);
2018     tet->get_fem_noeud(3)->change_numero(1);
2019     }
2020     int i=0;
2021     for (FEM_NOEUD* noeud=mai->get_premier_noeud(itnoeud);noeud!=NULL;noeud=mai->get_suivant_noeud(itnoeud))
2022     {
2023 francois 375 if (noeud->get_numero()==1) sol->ecrire(noeud->get_solution(),i,numsol); else sol->ecrire(1e300,i,numsol);
2024 francois 222 ++i;
2025     }
2026     }
2027 francois 276 IBrep TOIBREP::exporter_IBrep(string chemin,FEM_SOLUTION* solution,FEM_SOLUTION *solution_ele,MG_GROUPE_TOPOLOGIQUE* mggt)
2028 francois 259 {
2029     TPL_MAP_ENTITE<MG_VOLUME*> lst;
2030     if (mggt==NULL)
2031     {
2032     int nbvol=geo->get_nb_mg_volume();
2033     for (int i=0;i<nbvol;i++)
2034     lst.ajouter(geo->get_mg_volume(i));
2035     }
2036     else
2037     {
2038     int nbmggt=mggt->get_nb();
2039     for (int i=0;i<nbmggt;i++)
2040     if (mggt->get(i)->get_dimension()==3)
2041     lst.ajouter((MG_VOLUME*)mggt->get(i));
2042     }
2043     IBrep brep(100);
2044     int nbvolexp=lst.get_nb();
2045     for (int i=0;i<nbvolexp;i++)
2046     {
2047     MG_VOLUME* vol=lst.get(i);
2048     int nbcoq=vol->get_nb_mg_coquille();
2049     IVolumeN ivoltmp(vol->get_id());
2050 francois 263 pair<IVolume*,bool> pair_ivol=brep.AddVolume(ivoltmp);
2051 francois 282 if (vol->get_idoriginal()!="") brep.SetName(pair_ivol.first,vol->get_idoriginal());
2052 francois 263 IVolume* ivol=pair_ivol.first;
2053 francois 259 for (int j=0;j<nbcoq;j++)
2054     {
2055     MG_COQUILLE* coq=vol->get_mg_coquille(j);
2056     int nbface=coq->get_nb_mg_coface();
2057     IShell ishell(nbface);
2058     for (int k=0;k<nbface;k++)
2059     {
2060     MG_COFACE* coface=coq->get_mg_coface(k);
2061     ishell[k]=coface->get_id();
2062     MG_FACE* face=coface->get_face();
2063     int sens=coface->get_orientation();
2064     ICoFaceN icoface(coface->get_id(),face->get_id(),sens);
2065     brep.AddCoFace(icoface);
2066     IFace* iface=brep.GetFace(face->get_id());
2067     if (iface==NULL)
2068     {
2069     IFaceN ifacenew(face->get_id());
2070 francois 263 pair<IFace*,bool> pair_iface=brep.AddFace(ifacenew);
2071 francois 282 if (face->get_idoriginal()!="") brep.SetName(pair_iface.first,face->get_idoriginal());
2072 francois 263 iface=pair_iface.first;
2073 francois 259 int nbbou=face->get_nb_mg_boucle();
2074     for (int l=0;l<nbbou;l++)
2075     {
2076     MG_BOUCLE* bou=face->get_mg_boucle(l);
2077     int nbare=bou->get_nb_mg_coarete();
2078     ILoop iloop(nbare);
2079     for (int m=0;m<nbare;m++)
2080     {
2081     MG_COARETE* coare=bou->get_mg_coarete(m);
2082     iloop[m]=coare->get_id();
2083     MG_ARETE* are=coare->get_arete();
2084     int sens=coare->get_orientation();
2085     ICoEdgeN icoedge(coare->get_id(),are->get_id(),sens,face->get_id());
2086     brep.AddCoEdge(icoedge);
2087     IEdge* iedge=brep.GetEdge(are->get_id());
2088     IVertex *ivertex1,*ivertex2;
2089     ICoVertex *icover1,*icover2;
2090     if (iedge==NULL)
2091     {
2092     MG_COSOMMET* cover1=are->get_cosommet1();
2093     MG_COSOMMET* cover2=are->get_cosommet2();
2094     MG_SOMMET* ver1=cover1->get_sommet();
2095     MG_SOMMET* ver2=cover2->get_sommet();
2096     ICoVertexN icovertmp1(cover1->get_id(),are->get_id(),ver1->get_id(),cover1->get_t());
2097     ICoVertexN icovertmp2(cover2->get_id(),are->get_id(),ver2->get_id(),cover2->get_t());
2098 francois 263 pair<ICoVertex*,bool> pair_icover1=brep.AddCoVertex(icovertmp1);
2099     pair<ICoVertex*,bool> pair_icover2=brep.AddCoVertex(icovertmp2);
2100     icover1=pair_icover1.first;
2101     icover2=pair_icover2.first;
2102 francois 259 IEdgeN iedgetmp(are->get_id(),cover1->get_id(),cover2->get_id());
2103     ivertex1=brep.GetVertex(ver1->get_id());
2104     ivertex2=brep.GetVertex(ver2->get_id());
2105     if (ivertex1==NULL)
2106     {
2107     MG_POINT* pt=ver1->get_point();
2108     double xyz[3];
2109     pt->evaluer(xyz);
2110     IVertexN ivertex(ver1->get_id(),xyz);
2111 francois 263 pair<IVertex*,bool> pair_ivertex1=brep.AddVertex(ivertex);
2112 francois 282 if (ver1->get_idoriginal()!="") brep.SetName(pair_ivertex1.first,ver1->get_idoriginal());
2113 francois 263 ivertex1=pair_ivertex1.first;
2114 francois 259 }
2115     if (ivertex2==NULL)
2116     {
2117     MG_POINT* pt=ver2->get_point();
2118     double xyz[3];
2119     pt->evaluer(xyz);
2120     IVertexN ivertex(ver2->get_id(),xyz);
2121 francois 263 pair<IVertex*,bool> pair_ivertex2=brep.AddVertex(ivertex);
2122 francois 282 if (ver2->get_idoriginal()!="") brep.SetName(pair_ivertex2.first,ver2->get_idoriginal());
2123 francois 263 ivertex2=pair_ivertex2.first;
2124 francois 259 }
2125     ivertex1->AddCoVertex(cover1->get_id());
2126     ivertex2->AddCoVertex(cover2->get_id());
2127 francois 263 pair<IEdge*,bool> pair_iedge=brep.AddEdge(iedgetmp);
2128 francois 282 if (are->get_idoriginal()!="") brep.SetName(pair_iedge.first,are->get_idoriginal());
2129 francois 263 iedge=pair_iedge.first;
2130 francois 259 }
2131     iedge->AddCoEdge(coare->get_id(),brep);
2132     if (sens==1)
2133     {
2134     icover1=brep.GetCoVertex(iedge->FromCoVertex());
2135     ivertex1=brep.GetVertex(icover1->Vertex());
2136     ivertex1->AddFace(face->get_id());
2137     }
2138     else
2139     {
2140     icover2=brep.GetCoVertex(iedge->ToCoVertex());
2141     ivertex2=brep.GetVertex(icover2->Vertex());
2142     ivertex2->AddFace(face->get_id());
2143     }
2144     }
2145     iface->AddLoop(iloop);
2146     }
2147     }
2148     iface->AddCoFace(coface->get_id());
2149     }
2150     ivol->AddShell(ishell);
2151     }
2152     }
2153     int nbsol=solution->get_nb_champ();
2154 francois 281 //unsigned long *correspondface=new unsigned long[nbsol];
2155 francois 262 for (int i=0;i<nbsol;i++)
2156     {
2157     std::string nom=solution->get_legende(i);
2158     char nom2[2];
2159     unsigned long id;
2160 francois 272 sscanf(nom.c_str(),"%s %lu",nom2,&id);
2161 francois 282 std::pair<IField *,bool> fld=brep.AddField(id);
2162     if (nom2[0]!='F')
2163     {
2164     IField *f=fld.first;
2165     f->info.tag=1;
2166     }
2167 francois 262 }
2168 francois 259 LISTE_FEM_NOEUD::iterator itnoeud;
2169     int i=0;
2170     for (FEM_NOEUD* noeud=mai->get_premier_noeud(itnoeud);noeud!=NULL;noeud=mai->get_suivant_noeud(itnoeud))
2171     {
2172     int nbsolnoeud=0;
2173     for (int j=0;j<nbsol;j++)
2174     {
2175     if (solution->lire(i,j)<1e200) nbsolnoeud++;
2176     }
2177     double *xyz=noeud->get_coord();
2178     INodeN inoeudtmp(noeud->get_id(),xyz[0],xyz[1],xyz[2],nbsolnoeud);
2179 francois 263 pair<INode*,bool> pair_inoeud=brep.AddNode(inoeudtmp);
2180     INode* inoeud=pair_inoeud.first;
2181 francois 259 int num=0;
2182 francois 281 IBrep::iterator_fields itf=brep.begin_fields();
2183 francois 259 for (int j=0;j<nbsol;j++)
2184     {
2185     if (solution->lire(i,j)<1e200)
2186     {
2187 francois 281 inoeud->Fields()[num]=(*itf).num;
2188 francois 259 inoeud->Values()[num]=solution->lire(i,j);
2189     num++;
2190 francois 281 }
2191     itf++;
2192 francois 259 }
2193     i++;
2194     }
2195 francois 309 LISTE_FEM_ELEMENT3::iterator ittet;
2196 francois 259 int num=0;
2197 francois 276 i=0;
2198 francois 309 for (FEM_ELEMENT3* tet=mai->get_premier_element3(ittet);tet!=NULL;tet=mai->get_suivant_element3(ittet))
2199 francois 259 {
2200 francois 276 int nbsolele=0;
2201     for (int j=0;j<nbsol;j++)
2202     {
2203     if (fabs(solution_ele->lire(i,j)-1.)<0.0000000001) nbsolele++;
2204     }
2205     IElementN xfemele(IElement::TETRAHEDRON,nbsolele);
2206 francois 259 num++;
2207     xfemele.num=num;
2208     xfemele.GetNode(0)=tet->get_fem_noeud(0)->get_id();
2209     xfemele.GetNode(1)=tet->get_fem_noeud(1)->get_id();
2210     xfemele.GetNode(2)=tet->get_fem_noeud(2)->get_id();
2211     xfemele.GetNode(3)=tet->get_fem_noeud(3)->get_id();
2212 francois 276 int num=0;
2213 francois 281 IBrep::iterator_fields itf=brep.begin_fields();
2214 francois 276 for (int j=0;j<nbsol;j++)
2215     {
2216     if (fabs(solution_ele->lire(i,j)-1.)<0.0000000001)
2217     {
2218 francois 281 xfemele.Fields()[num]=(*itf).num;
2219 francois 276 num++;
2220     }
2221 francois 281 itf++;
2222 francois 276 }
2223 francois 259 brep.AddElement(xfemele);
2224 francois 276 i++;
2225 francois 259 }
2226 francois 222
2227 francois 259
2228    
2229    
2230     std::ofstream output(chemin.c_str());
2231     output << brep << std::endl;
2232     output.close();
2233    
2234 francois 262
2235    
2236    
2237 francois 276 return brep;
2238 francois 259 }
2239    
2240    
2241    
2242 francois 433
2243    
2244    
2245    
2246    
2247    
2248    
2249    
2250    
2251    
2252    
2253    
2254    
2255    
2256    
2257    
2258    
2259    
2260    
2261    
2262    
2263    
2264    
2265    
2266    
2267    
2268    
2269    
2270    
2271    
2272    
2273    
2274    
2275    
2276    
2277    
2278    
2279    
2280    
2281    
2282    
2283    
2284    
2285    
2286    
2287     int TOIBREP::intersection_segment_triangle(FEM_NOEUD* nos1,FEM_NOEUD* nos2,FEM_NOEUD* no1,FEM_NOEUD *no2,FEM_NOEUD *no3,double *uv,double *xyz)
2288     {
2289     OT_VECTEUR_3D ori(no1->get_coord());
2290     OT_VECTEUR_3D vec1(no1->get_coord(),no2->get_coord());
2291     OT_VECTEUR_3D vec2(no1->get_coord(),no3->get_coord());
2292     OT_VECTEUR_3D vecdir(nos1->get_coord(),nos2->get_coord());
2293     OT_VECTEUR_3D moinsvecdir=(-1.)*vecdir;
2294     OT_VECTEUR_3D f(no1->get_coord(),nos1->get_coord());
2295     OT_MATRICE_3D A(vec1,vec2,moinsvecdir);
2296     OT_MATRICE_3D Bu(f,vec2,moinsvecdir);
2297     OT_MATRICE_3D Bv(vec1,f,moinsvecdir);
2298     OT_MATRICE_3D Bt(vec1,vec2,f);
2299     double det=A.get_determinant();
2300     if (fabs(det)<1e-10) return 0;
2301     uv[0]=Bu.get_determinant()/det;
2302     uv[1]=Bv.get_determinant()/det;
2303     uv[2]=Bt.get_determinant()/det;
2304     if (uv[2]<1e-10) return 0;
2305     if (uv[2]>1.-1e-10) return 0;
2306     if (uv[0]<-1e-10) return 0;
2307     if (uv[0]>1+1e-10) return 0;
2308     if (uv[1]<-1e-10) return 0;
2309     if (uv[1]>1+1e-10) return 0;
2310     if (uv[0]+uv[1]<-1e-10) return 0;
2311     if (uv[0]+uv[1]>1+1e-10) return 0;
2312     xyz[0]=(nos1->get_coord())[0]+uv[2]*vecdir.get_x();
2313     xyz[1]=(nos1->get_coord())[1]+uv[2]*vecdir.get_y();
2314     xyz[2]=(nos1->get_coord())[2]+uv[2]*vecdir.get_z();
2315     return 1;
2316     }
2317    
2318    
2319     int TOIBREP::intersection_arete_triangle(MG_ARETE* are,FEM_NOEUD* no1,FEM_NOEUD *no2,FEM_NOEUD *no3,double *uv,double *xyz)
2320     {
2321     OT_VECTEUR_3D ori(no1->get_coord());
2322     OT_VECTEUR_3D vec1(no1->get_coord(),no2->get_coord());
2323     OT_VECTEUR_3D vec2(no1->get_coord(),no3->get_coord());
2324     uv[0]=0.;
2325     uv[1]=0.;
2326     double tdep=uv[2];
2327     if (uv[2]>are->get_tmax()) return 0;
2328     double titer=are->get_tmax()-tdep;
2329     int ok=0;
2330     int nbiter=0;
2331     do
2332     {
2333     nbiter++;
2334     if (nbiter>40) ok=2;
2335     double arexyz[3],darexyz[3];
2336     are->evaluer(uv[2],arexyz);
2337     are->deriver(uv[2],darexyz);
2338     double f1=ori.get_x()+uv[0]*vec1.get_x()+uv[1]*vec2.get_x()-arexyz[0];
2339     double f2=ori.get_y()+uv[0]*vec1.get_y()+uv[1]*vec2.get_y()-arexyz[1];
2340     double f3=ori.get_z()+uv[0]*vec1.get_z()+uv[1]*vec2.get_z()-arexyz[2];
2341     OT_VECTEUR_3D vecdare(darexyz);
2342     vecdare=(-1.)*vecdare;
2343     OT_VECTEUR_3D f(-f1,-f2,-f3);
2344     OT_MATRICE_3D A(vec1,vec2,vecdare);
2345     OT_MATRICE_3D Bu(f,vec2,vecdare);
2346     OT_MATRICE_3D Bv(vec1,f,vecdare);
2347     OT_MATRICE_3D Bt(vec1,vec2,f);
2348     double det=A.get_determinant();
2349     if (fabs(det)<1e-10)
2350     {
2351     if (nbiter==1)
2352     {
2353     uv[2]=tdep+0.05*titer;
2354     continue;
2355     }
2356     else ok=2;
2357     }
2358     double du=Bu.get_determinant()/det;
2359     double dv=Bv.get_determinant()/det;
2360     double dt=Bt.get_determinant()/det;
2361     uv[0]=uv[0]+du;
2362     uv[1]=uv[1]+dv;
2363     uv[2]=uv[2]+dt;
2364     if (are->get_courbe()->est_periodique())
2365     if (uv[2]<are->get_tmin()) uv[2]=uv[2]+are->get_courbe()->get_periode();
2366     if (fabs(du)<1e-11)
2367     if (fabs(dv)<1e-11)
2368     if (fabs(dt)<1e-11) ok=1;
2369     }
2370     while (ok==0);
2371     //if (ok==2) {uv[2]=tdep+0.1;return intersection_arete_triangle(are,no1,no2,no3,uv,xyz);}
2372     if (ok==2) return 0;
2373     if (uv[2]<tdep+1e-10) return 0;
2374     if (uv[2]>are->get_tmax()-1e-10) return 0;
2375     if (uv[0]<-1e-10) return 0;
2376     if (uv[0]>1+1e-10) return 0;
2377     if (uv[1]<-1e-10) return 0;
2378     if (uv[1]>1+1e-10) return 0;
2379     if (uv[0]+uv[1]<-1e-10) return 0;
2380     if (uv[0]+uv[1]>1+1e-10) return 0;
2381     are->evaluer(uv[2],xyz);
2382     return 1;
2383     }
2384    
2385     void TOIBREP::decoupe_element2_par_element1et0(FEM_ELEMENT3* ele,TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> *lstentitetopo)
2386     {
2387     TPL_MAP_ENTITE<FEM_NOEUD*> lst;
2388     int nb=ele->get_nb_xfem(0);
2389     for (int i=0;i<nb;i++)
2390     if (lstentitetopo->existe(ele->get_xfem(0,i)->get_lien_topologie()))
2391     lst.ajouter(((XFEM_ELEMENT0*)ele->get_xfem(0,i))->get_fem_noeud(0));
2392     nb=ele->get_nb_xfem(1);
2393     for (int i=0;i<nb;i++)
2394     if (lstentitetopo->existe(ele->get_xfem(1,i)->get_lien_topologie()))
2395     {
2396     lst.ajouter(((XFEM_ELEMENT1*)ele->get_xfem(1,i))->get_fem_noeud(0));
2397     lst.ajouter(((XFEM_ELEMENT1*)ele->get_xfem(1,i))->get_fem_noeud(1));
2398     }
2399     TPL_MAP_ENTITE<FEM_NOEUD*>::ITERATEUR it;
2400     for (FEM_NOEUD* no=lst.get_premier(it);no!=NULL;no=lst.get_suivant(it))
2401     decoupe_element2(ele,no);
2402    
2403     }
2404    
2405     int TOIBREP::decoupe_element2(FEM_ELEMENT3* ele,FEM_NOEUD* no)
2406     {
2407     TPL_LISTE_ENTITE<XFEM_ELEMENT2*> lst;
2408     int nb=ele->get_nb_xfem(2);
2409     for (int i=0;i<nb;i++)
2410     lst.ajouter((XFEM_ELEMENT2*)ele->get_xfem(2,i));
2411     for (int i=0;i<nb;i++)
2412     decoupe_element(lst.get(i),no);
2413    
2414     }
2415    
2416     int TOIBREP::decoupe_element(XFEM_ELEMENT2 *ele,FEM_NOEUD* no)
2417     {
2418     if (no->get_id()==598016)
2419     std::cout << std::endl;
2420     if (ele->get_lien_topologie()->est_topologie_sousjacente(no->get_lien_topologie())==0) return 0;
2421     int status=outilfem.projeteestdansletriangle(ele,no->get_x(),no->get_y(),no->get_z());
2422     if (status==0) return 0;
2423     int arete1=outilfem.compare_etat_triangle(status,FEM_MAILLAGE_OUTILS::ARETE1);
2424     int arete2=outilfem.compare_etat_triangle(status,FEM_MAILLAGE_OUTILS::ARETE2);
2425     int arete3=outilfem.compare_etat_triangle(status,FEM_MAILLAGE_OUTILS::ARETE3);
2426     int aretetot=arete1+arete2+arete3;
2427     if (aretetot==2)
2428     return 0;
2429     FEM_NOEUD *lstno[3];
2430     if (arete1==0)
2431     {
2432     lstno[0]=ele->get_fem_noeud(0);
2433     lstno[1]=no;
2434     lstno[2]=ele->get_fem_noeud(1);
2435     /*
2436     XFEM_TRIANGLE3 *xtri=new XFEM_TRIANGLE3(ele->get_fem_element_maillage(),ele->get_lien_topologie(),lstno);
2437     mai->ajouter_xfem_element2(xtri);
2438     oriente_tri(xtri,(MG_FACE*)ele->get_lien_topologie());*/
2439     XFEM_TRIANGLE3 *xtri=inserer_xtriangle(ele->get_fem_element_maillage(),(MG_FACE*)ele->get_lien_topologie(),lstno);
2440     if (xtri!=NULL)
2441     {
2442     xtri->change_etat(ele->get_etat());
2443     ele->get_fem_element_maillage()->change_etat(0,FRONTIERE);
2444     }
2445     }
2446     if (arete2==0)
2447     {
2448     lstno[0]=ele->get_fem_noeud(1);
2449     lstno[1]=no;
2450     lstno[2]=ele->get_fem_noeud(2);
2451     //XFEM_TRIANGLE3 *xtri=new XFEM_TRIANGLE3(ele->get_fem_element_maillage(),ele->get_lien_topologie(),lstno);
2452     //mai->ajouter_xfem_element2(xtri);
2453     //oriente_tri(xtri,(MG_FACE*)ele->get_lien_topologie());
2454     //xtri->change_etat(ele->get_etat());
2455     //ele->get_fem_element_maillage()->change_etat(0,FRONTIERE);
2456     XFEM_TRIANGLE3 *xtri=inserer_xtriangle(ele->get_fem_element_maillage(),(MG_FACE*)ele->get_lien_topologie(),lstno);
2457     if (xtri!=NULL)
2458     {
2459     xtri->change_etat(ele->get_etat());
2460     ele->get_fem_element_maillage()->change_etat(0,FRONTIERE);
2461     }
2462     }
2463     if (arete3==0)
2464     {
2465     lstno[0]=ele->get_fem_noeud(2);
2466     lstno[1]=no;
2467     lstno[2]=ele->get_fem_noeud(0);
2468     //XFEM_TRIANGLE3 *xtri=new XFEM_TRIANGLE3(ele->get_fem_element_maillage(),ele->get_lien_topologie(),lstno);
2469     //mai->ajouter_xfem_element2(xtri);
2470     //oriente_tri(xtri,(MG_FACE*)ele->get_lien_topologie());
2471     //xtri->change_etat(ele->get_etat());
2472     //ele->get_fem_element_maillage()->change_etat(0,FRONTIERE);
2473     XFEM_TRIANGLE3 *xtri=inserer_xtriangle(ele->get_fem_element_maillage(),(MG_FACE*)ele->get_lien_topologie(),lstno);
2474     if (xtri!=NULL)
2475     {
2476     xtri->change_etat(ele->get_etat());
2477     ele->get_fem_element_maillage()->change_etat(0,FRONTIERE);
2478     }
2479     }
2480     mai->supprimer_xfem_element2id(ele->get_id());
2481     return 1;
2482     }
2483    
2484    
2485    
2486     int TOIBREP::decoupe_element(int status,FEM_ELEMENT3 *ele,FEM_NOEUD* no,FEM_NOEUD* no1,FEM_NOEUD* no2,FEM_NOEUD* no3,FEM_NOEUD* no4)
2487     {
2488     int face1=outilfem.compare_etat_tetra(status,FEM_MAILLAGE_OUTILS::FACE1);
2489     int face2=outilfem.compare_etat_tetra(status,FEM_MAILLAGE_OUTILS::FACE2);
2490     int face3=outilfem.compare_etat_tetra(status,FEM_MAILLAGE_OUTILS::FACE3);
2491     int face4=outilfem.compare_etat_tetra(status,FEM_MAILLAGE_OUTILS::FACE4);
2492     int facetot=face1+face2+face3+face4;
2493     if (facetot==3)
2494     return 0;
2495     FEM_NOEUD *lstno[4];
2496     if (face3==0)
2497     {
2498     lstno[0]=no1;
2499     lstno[1]=no;
2500     lstno[2]=no3;
2501     lstno[3]=no4;
2502     XFEM_TETRA4* xtet1=new XFEM_TETRA4(ele,ele->get_lien_topologie(),lstno);
2503     mai->ajouter_xfem_element3(xtet1);
2504     xtet1->change_etat(XINCONNU);
2505     ele->change_etat(0,FRONTIERE);
2506     }
2507     if (face2==0)
2508     {
2509     lstno[0]=no1;
2510     lstno[1]=no2;
2511     lstno[2]=no;
2512     lstno[3]=no4;
2513     XFEM_TETRA4* xtet2=new XFEM_TETRA4(ele,ele->get_lien_topologie(),lstno);
2514     mai->ajouter_xfem_element3(xtet2);
2515     xtet2->change_etat(XINCONNU);
2516     ele->change_etat(0,FRONTIERE);
2517     }
2518     if (face1==0)
2519     {
2520     lstno[0]=no1;
2521     lstno[1]=no2;
2522     lstno[2]=no3;
2523     lstno[3]=no;
2524     XFEM_TETRA4* xtet3=new XFEM_TETRA4(ele,ele->get_lien_topologie(),lstno);
2525     mai->ajouter_xfem_element3(xtet3);
2526     xtet3->change_etat(XINCONNU);
2527     ele->change_etat(0,FRONTIERE);
2528     }
2529     if (face4==0)
2530     {
2531     lstno[0]=no;
2532     lstno[1]=no2;
2533     lstno[2]=no3;
2534     lstno[3]=no4;
2535     XFEM_TETRA4* xtet4=new XFEM_TETRA4(ele,ele->get_lien_topologie(),lstno);
2536     mai->ajouter_xfem_element3(xtet4);
2537     xtet4->change_etat(XINCONNU);
2538     ele->change_etat(0,FRONTIERE);
2539     }
2540     return 1;
2541     }
2542    
2543    
2544     void TOIBREP::decoupe_element(int status,FEM_NOEUD* no,FEM_ELEMENT3* ele)
2545     {
2546     double *xyz=no->get_coord();
2547     if (ele->get_nb_xfem(3)==0)
2548     decoupe_element(status,ele,no,ele->get_fem_noeud(0),ele->get_fem_noeud(1),ele->get_fem_noeud(2),ele->get_fem_noeud(3));
2549     else
2550     {
2551     int nb=ele->get_nb_xfem(3);
2552     for (int i=nb-1;i>-1;i--)
2553     {
2554     XFEM_ELEMENT3* xele3=(XFEM_ELEMENT3*)ele->get_xfem(3,i);
2555     int status=outilfem.estdansletetra(xele3,xyz[0],xyz[1],xyz[2]);
2556     if (outilfem.compare_etat_tetra(status,FEM_MAILLAGE_OUTILS::INTERIEUR)==1)
2557     {
2558     int res=decoupe_element(status,ele,no,xele3->get_fem_noeud(0),xele3->get_fem_noeud(1),xele3->get_fem_noeud(2),xele3->get_fem_noeud(3));
2559     if (res==1) mai->supprimer_xfem_element3id(xele3->get_id());
2560     }
2561    
2562     }
2563     if (ele->verifie_validite_decoupage_xfem()==0)
2564     std::cout << "pb " << ele->get_id() << " " << nb <<"," << ele->get_nb_xfem(3) << " xfem" << std::endl;
2565    
2566     }
2567     }
2568    
2569     void TOIBREP::decoupe_element(XFEM_ELEMENT1* xseg,inter_ele_arete *ele_inter)
2570     {
2571     std::map<double,FEM_NOEUD*> lstnoeud;
2572     for (int i=0;i<ele_inter->ele->get_nb_xfem(3);i++)
2573     {
2574     XFEM_TETRA4* xtet=(XFEM_TETRA4*)ele_inter->ele->get_xfem(3,i);
2575     double xyz1[3],xyz2[3],xyz3[3],xyz4[3],uv1[3],uv2[3],uv3[3],uv4[3];
2576     int inter_face1=intersection_segment_triangle(xseg->get_fem_noeud(0),xseg->get_fem_noeud(1),xtet->get_fem_noeud(0),xtet->get_fem_noeud(1),xtet->get_fem_noeud(2),uv1,xyz1);
2577     int inter_face2=intersection_segment_triangle(xseg->get_fem_noeud(0),xseg->get_fem_noeud(1),xtet->get_fem_noeud(0),xtet->get_fem_noeud(1),xtet->get_fem_noeud(3),uv2,xyz2);
2578     int inter_face3=intersection_segment_triangle(xseg->get_fem_noeud(0),xseg->get_fem_noeud(1),xtet->get_fem_noeud(0),xtet->get_fem_noeud(2),xtet->get_fem_noeud(3),uv3,xyz3);
2579     int inter_face4=intersection_segment_triangle(xseg->get_fem_noeud(0),xseg->get_fem_noeud(1),xtet->get_fem_noeud(1),xtet->get_fem_noeud(2),xtet->get_fem_noeud(3),uv4,xyz4);
2580     if (inter_face1==1)
2581     {
2582     std::map<double,FEM_NOEUD*>::iterator it=lstnoeud.lower_bound(uv1[2]-1e-6);
2583     double l=0.;
2584     if (it!=lstnoeud.end())
2585     l=(uv1[2]-it->first)*(uv1[2]-it->first);
2586     if ((l>1e-10) || (it==lstnoeud.end()))
2587     {
2588     FEM_NOEUD* no=inserer_noeud(ele_inter->are,xyz1[0],xyz1[1],xyz1[2]);
2589     no->change_etat(0,FRONTIERE);
2590     std::pair<double,FEM_NOEUD*> tmp(uv1[2],no);
2591     lstnoeud.insert(tmp);
2592     }
2593     }
2594     if (inter_face2==1)
2595     {
2596     std::map<double,FEM_NOEUD*>::iterator it=lstnoeud.lower_bound(uv2[2]-1e-6);
2597     double l=0.;
2598     if (it!=lstnoeud.end())
2599     l=(uv2[2]-it->first)*(uv2[2]-it->first);
2600     if ((l>1e-10) || (it==lstnoeud.end()))
2601     {
2602     FEM_NOEUD* no=inserer_noeud(ele_inter->are,xyz2[0],xyz2[1],xyz2[2]);
2603     no->change_etat(0,FRONTIERE);
2604     std::pair<double,FEM_NOEUD*> tmp(uv2[2],no);
2605     lstnoeud.insert(tmp);
2606     }
2607     }
2608     if (inter_face1==3)
2609     {
2610     std::map<double,FEM_NOEUD*>::iterator it=lstnoeud.lower_bound(uv3[2]-1e-6);
2611     double l=0.;
2612     if (it!=lstnoeud.end())
2613     l=(uv3[2]-it->first)*(uv3[2]-it->first);
2614     if ((l>1e-10) || (it==lstnoeud.end()))
2615     {
2616     FEM_NOEUD* no=inserer_noeud(ele_inter->are,xyz3[0],xyz3[1],xyz3[2]);
2617     no->change_etat(0,FRONTIERE);
2618     std::pair<double,FEM_NOEUD*> tmp(uv3[2],no);
2619     lstnoeud.insert(tmp);
2620     }
2621     }
2622     if (inter_face4==1)
2623     {
2624     std::map<double,FEM_NOEUD*>::iterator it=lstnoeud.lower_bound(uv4[2]-1e-6);
2625     double l=0.;
2626     if (it!=lstnoeud.end())
2627     l=(uv4[2]-it->first)*(uv4[2]-it->first);
2628     if ((l>1e-10) || (it==lstnoeud.end()))
2629     {
2630     FEM_NOEUD* no=inserer_noeud(ele_inter->are,xyz4[0],xyz4[1],xyz4[2]);
2631     no->change_etat(0,FRONTIERE);
2632     std::pair<double,FEM_NOEUD*> tmp(uv4[2],no);
2633     lstnoeud.insert(tmp);
2634     }
2635     }
2636     }
2637     int nbnoeudcree=lstnoeud.size();
2638     for (std::map<double,FEM_NOEUD*>::iterator it=lstnoeud.begin();it!=lstnoeud.end();it++)
2639     decoupe_element(-1,it->second,ele_inter->ele);
2640     std::pair<double,FEM_NOEUD*> tmp(0.,xseg->get_fem_noeud(0));
2641     lstnoeud.insert(tmp);
2642     std::pair<double,FEM_NOEUD*> tmp2(1.,xseg->get_fem_noeud(1));
2643     lstnoeud.insert(tmp2);
2644     std::map<double,FEM_NOEUD*>::iterator it=lstnoeud.begin();
2645     std::map<double,FEM_NOEUD*>::iterator it2=lstnoeud.begin();
2646     it2++;
2647     for (int i=0;i<nbnoeudcree+1;i++)
2648     {
2649     FEM_NOEUD* tab[2];
2650     tab[0]=it->second;
2651     tab[1]=it2->second;
2652     XFEM_SEGMENT2* sxseg=new XFEM_SEGMENT2(ele_inter->ele,xseg->get_lien_topologie(),tab);
2653     mai->ajouter_xfem_element1(sxseg);
2654     sxseg->change_etat(XFRONTIERE);
2655     it++;
2656     it2++;
2657     OT_VECTEUR_3D vec(tab[0]->get_coord(),tab[1]->get_coord());
2658     if (vec.get_longueur()<1e-10)
2659     std::cout << " toto " << std::endl;
2660    
2661     }
2662     mai->supprimer_xfem_element1id(xseg->get_id());
2663    
2664    
2665    
2666    
2667    
2668    
2669    
2670     /*if (ele_inter->ele->get_nb_xfem(3)==0)
2671     {
2672     decoupe_element(ele_inter->status1,ele_inter->ele,ele_inter->no1,ele_inter->ele->get_fem_noeud(0),ele_inter->ele->get_fem_noeud(1),ele_inter->ele->get_fem_noeud(2),ele_inter->ele->get_fem_noeud(3));
2673     if (ele_inter->ele->get_nb_xfem(3)==0) decoupe_element(ele_inter->status2,ele_inter->ele,ele_inter->no2,ele_inter->ele->get_fem_noeud(0),ele_inter->ele->get_fem_noeud(1),ele_inter->ele->get_fem_noeud(2),ele_inter->ele->get_fem_noeud(3));
2674     for (int i=0;i<ele_inter->ele->get_nb_xfem(3);i++)
2675     {
2676     XFEM_ELEMENT3* xele;//=ele_inter->ele->get_xfem(i);
2677     int status=outilfem.estdansletetra(xele,ele_inter->xyz2[0],ele_inter->xyz2[1],ele_inter->xyz2[2]);
2678     if (outilfem.compare_etat(status,FEM_MAILLAGE_OUTILS::INTERIEUR)==1)
2679     {
2680     decoupe_element(ele_inter->status2,ele_inter->ele,ele_inter->no2,xele->get_fem_noeud(0),xele->get_fem_noeud(1),xele->get_fem_noeud(2),xele->get_fem_noeud(3));
2681     mai->supprimer_xfem_element3id(xele->get_id());
2682     }
2683    
2684     }
2685    
2686     }
2687     else
2688     {
2689     int inter;
2690     double t=0.;
2691     FEM_NOEUD* no1=ele_inter->no1;
2692     double xyz1[3]={ele_inter->xyz1[0],ele_inter->xyz1[1],ele_inter->xyz1[2]};
2693     do
2694     {
2695     inter_ele_arete xele_inter;
2696     inter=decoupe_segment_xtetra(ele_inter->ele,xseg,xyz1,ele_inter->xyz2,t,xele_inter);
2697     if (inter==1)
2698     {
2699     FEM_NOEUD* no2=new FEM_NOEUD(ele_inter->ele->get_mg_element_maillage()->get_lien_topologie(),xele_inter.xyz2[0],xele_inter.xyz2[1],xele_inter.xyz2[2]);
2700     mai->ajouter_fem_noeud(no2);
2701     FEM_NOEUD* tab[2];
2702     tab[0]=no1;
2703     tab[1]=no2;
2704     XFEM_SEGMENT2* xseg;//=new XFEM_SEGMENT2((FEM_SEGMENT2*)seg,tab);
2705     mai->ajouter_xfem_element1(xseg);
2706     xele_inter.no1=no1;
2707     xele_inter.no2=no2;
2708     //decoupe_element(xseg,&xele_inter);
2709     xyz1[0]=xele_inter.xyz2[0];
2710     xyz1[1]=xele_inter.xyz2[1];
2711     xyz1[2]=xele_inter.xyz2[2];
2712     no1=no2;
2713     mai->supprimer_xfem_element3id(xele_inter.xele->get_id());
2714     }
2715    
2716     }
2717     while (inter!=0);
2718     FEM_NOEUD* tab[2];
2719     tab[0]=no1;
2720     tab[1]=ele_inter->no2;
2721     //FEM_SEGMENT2* seg=new FEM_SEGMENT2(are,tab);
2722     //mai->ajouter_fem_element1(seg);
2723     //mai->supprimer_xfem_element3id(xele->get_id());
2724     }*/
2725     }
2726     void TOIBREP::decoupe_xtri(FEM_ELEMENT3 *tet,int nb_xtri)
2727     {
2728     if (tet->get_id()==433021)
2729     std::cout <<"ttoot";
2730     if (nb_xtri!=2) return;
2731     int nbseg=5;
2732     int nbno=4;
2733     FEM_NOEUD** tabnoeud=new FEM_NOEUD*[nbno];
2734     FEM_NOEUD* tab1[3];
2735     FEM_NOEUD* tab2[3];
2736     XFEM_ELEMENT2* xtri1=(XFEM_ELEMENT2*)tet->get_xfem(2,tet->get_nb_xfem(2)-1);
2737     tab1[0]=xtri1->get_fem_noeud(0);
2738     tab1[1]=xtri1->get_fem_noeud(1);
2739     tab1[2]=xtri1->get_fem_noeud(2);
2740     XFEM_ELEMENT2* xtri2=(XFEM_ELEMENT2*)tet->get_xfem(2,tet->get_nb_xfem(2)-2);
2741     tab2[0]=xtri2->get_fem_noeud(0);
2742     tab2[1]=xtri2->get_fem_noeud(1);
2743     tab2[2]=xtri2->get_fem_noeud(2);
2744     if (tab1[0]!=tab2[0])
2745     if (tab1[0]!=tab2[1])
2746     if (tab1[0]!=tab2[2])
2747     {
2748     tabnoeud[0]=tab1[0];
2749     tabnoeud[1]=tab1[1];
2750     tabnoeud[2]=tab1[2];
2751     }
2752     if (tab1[1]!=tab2[0])
2753     if (tab1[1]!=tab2[1])
2754     if (tab1[1]!=tab2[2])
2755     {
2756     tabnoeud[0]=tab1[1];
2757     tabnoeud[1]=tab1[2];
2758     tabnoeud[2]=tab1[0];
2759     }
2760     if (tab1[2]!=tab2[0])
2761     if (tab1[2]!=tab2[1])
2762     if (tab1[2]!=tab2[2])
2763     {
2764     tabnoeud[0]=tab1[2];
2765     tabnoeud[1]=tab1[0];
2766     tabnoeud[2]=tab1[1];
2767     }
2768     if (tab2[2]!=tab1[0])
2769     if (tab2[2]!=tab1[1])
2770     if (tab2[2]!=tab1[2])
2771     tabnoeud[3]=tab2[2];
2772     if (tab2[1]!=tab1[0])
2773     if (tab2[1]!=tab1[1])
2774     if (tab2[1]!=tab1[2])
2775     tabnoeud[3]=tab2[1];
2776     if (tab2[0]!=tab1[0])
2777     if (tab2[0]!=tab1[1])
2778     if (tab2[0]!=tab1[2])
2779     tabnoeud[3]=tab2[0];
2780     TPL_LISTE_ENTITE<XFEM_ELEMENT1*> listeasupprimer;
2781     int nbxfem1=tet->get_nb_xfem(1);
2782     for (int i=0;i<nbxfem1;i++)
2783     {
2784     XFEM_ELEMENT1* xfem1=(XFEM_ELEMENT1*)tet->get_xfem(1,i);
2785     FEM_NOEUD* no1=xfem1->get_fem_noeud(0);
2786     FEM_NOEUD* no2=xfem1->get_fem_noeud(1);
2787     if ((no1->get_id()==598025) && (no2->get_id()==598034))
2788     std::cout <<"ttoot";
2789     if ((no2->get_id()==598025) && (no1->get_id()==598034))
2790     std::cout <<"ttoot";
2791     double xyz[3];
2792     int inter=inter_segment_segment_plan(xtri1,tabnoeud[1],tabnoeud[2],no1,no2,xyz);
2793     if (xtri1->get_lien_topologie()->get_id()==789)
2794     if (tet->get_nb_xfem(1)==1)
2795     //if (tet->get_nb_xfem(2)==2)
2796     if (inter==0)
2797     std::cout << tet->get_id();
2798     if (inter==1)
2799     {
2800     FEM_NOEUD* no=inserer_noeud(xfem1->get_lien_topologie(),xyz[0],xyz[1],xyz[2]);
2801     no->change_etat(0,INCONNU);
2802     FEM_NOEUD* tab[2];
2803     tab[0]=no1;
2804     tab[1]=no;
2805     XFEM_SEGMENT2* sxseg1=new XFEM_SEGMENT2(tet,xfem1->get_lien_topologie(),tab);
2806     mai->ajouter_xfem_element1(sxseg1);
2807     sxseg1->change_etat(XFRONTIERE);
2808     tab[0]=no;
2809     tab[1]=no2;
2810     XFEM_SEGMENT2* sxseg2=new XFEM_SEGMENT2(tet,xfem1->get_lien_topologie(),tab);
2811     mai->ajouter_xfem_element1(sxseg2);
2812     sxseg2->change_etat(XFRONTIERE);
2813     listeasupprimer.ajouter(xfem1);
2814     }
2815     }
2816     for (int i=0;i<listeasupprimer.get_nb();i++)
2817     mai->supprimer_xfem_element1id(listeasupprimer.get(i)->get_id());
2818     delete [] tabnoeud;
2819     }
2820    
2821     void TOIBREP::recherche_interieur_face(FEM_ELEMENT3* tet,MG_FACE* face,TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> *lstentitetopo)
2822     {
2823     int nb=tet->get_nb_xfem(1);
2824     int traite=0;
2825     for (int i=0;i<nb;i++)
2826     {
2827     XFEM_ELEMENT1* xfem=(XFEM_ELEMENT1*)tet->get_xfem(1,i);
2828     if (lstentitetopo->existe(xfem->get_lien_topologie())==1)
2829     {
2830     traite=1;
2831     MG_ARETE* are=(MG_ARETE*)xfem->get_lien_topologie();
2832     MG_COARETE* coare;
2833     int icor=0;
2834     do
2835     {
2836     coare=are->get_mg_coarete(icor);
2837     icor++;
2838     }
2839     while (coare->get_boucle()->get_mg_face()!=face);
2840     double ori=coare->get_orientation();
2841     double *xyz1=xfem->get_fem_noeud(0)->get_coord();
2842     double *xyz2=xfem->get_fem_noeud(1)->get_coord();
2843     double t;
2844     are->inverser(t,xyz1);
2845     double dxyz[3];
2846     are->deriver(t,dxyz);
2847     OT_VECTEUR_3D dir(dxyz);
2848     dir=ori*dir;
2849     dir.norme();
2850     OT_VECTEUR_3D dircor(xyz1,xyz2);
2851     dircor.norme();
2852     if (dir*dircor<0) dircor=(-1.)*dircor;
2853     double uv[2];
2854     face->inverser(uv,xyz1);
2855     double vecnormal[3];
2856     face->calcul_normale_unitaire(uv,vecnormal);
2857     OT_VECTEUR_3D nor(vecnormal);
2858     nor=face->get_mg_coface(0)->get_orientation()*nor;
2859     OT_VECTEUR_3D vecext=nor&dircor;
2860     int nbxtri=tet->get_nb_xfem(2);
2861     for (int j=0;j<nbxtri;j++)
2862     {
2863     XFEM_ELEMENT2* xfem2=(XFEM_ELEMENT2*)tet->get_xfem(2,j);
2864     if (xfem2->get_lien_topologie()==face)
2865     if ((xfem->get_fem_noeud(0)==xfem2->get_fem_noeud(0)) || (xfem->get_fem_noeud(0)==xfem2->get_fem_noeud(1)) || (xfem->get_fem_noeud(0)==xfem2->get_fem_noeud(2)) )
2866     if ((xfem->get_fem_noeud(1)==xfem2->get_fem_noeud(0)) || (xfem->get_fem_noeud(1)==xfem2->get_fem_noeud(1)) || (xfem->get_fem_noeud(1)==xfem2->get_fem_noeud(2)) )
2867     {
2868     double x=xfem2->get_fem_noeud(0)->get_x()+xfem2->get_fem_noeud(1)->get_x()+xfem2->get_fem_noeud(2)->get_x();
2869     double y=xfem2->get_fem_noeud(0)->get_y()+xfem2->get_fem_noeud(1)->get_y()+xfem2->get_fem_noeud(2)->get_y();
2870     double z=xfem2->get_fem_noeud(0)->get_z()+xfem2->get_fem_noeud(1)->get_z()+xfem2->get_fem_noeud(2)->get_z();
2871     OT_VECTEUR_3D dirxtri(x/3.-xyz1[0],y/3.-xyz1[1],z/3.-xyz1[2]);
2872     dirxtri.norme();
2873     if (dirxtri*vecext>0.)
2874     {
2875     xfem2->change_etat(XINTERIEUR);
2876     if (xfem2->get_fem_noeud(0)->get_etat(0)==INCONNU) xfem2->get_fem_noeud(0)->change_etat(0,FRONTIERE);
2877     if (xfem2->get_fem_noeud(1)->get_etat(0)==INCONNU) xfem2->get_fem_noeud(1)->change_etat(0,FRONTIERE);
2878     if (xfem2->get_fem_noeud(2)->get_etat(0)==INCONNU) xfem2->get_fem_noeud(2)->change_etat(0,FRONTIERE);
2879     }
2880     else
2881     {
2882     xfem2->change_etat(XEXTERIEUR);
2883     if (xfem2->get_fem_noeud(0)->get_etat(0)==INCONNU) xfem2->get_fem_noeud(0)->change_etat(0,EXTERIEUR);
2884     if (xfem2->get_fem_noeud(1)->get_etat(0)==INCONNU) xfem2->get_fem_noeud(1)->change_etat(0,EXTERIEUR);
2885     if (xfem2->get_fem_noeud(2)->get_etat(0)==INCONNU) xfem2->get_fem_noeud(2)->change_etat(0,EXTERIEUR);
2886     }
2887     }
2888     }
2889    
2890     }
2891     }/*
2892     if (traite>0)
2893     {
2894     int changement=0;
2895     do
2896     {
2897     int nb2=tet->get_nb_xfem(2);
2898     changement=0;
2899     int casatraiter=0;
2900     for (int i=0;i<nb2;i++)
2901     {
2902     XFEM_ELEMENT2* xfem=(XFEM_ELEMENT2*)tet->get_xfem(2,i);
2903     if (xfem->get_lien_topologie()==face)
2904     if (xfem->get_etat()==XINCONNU)
2905     {
2906     casatraiter=1;
2907     if ((xfem->get_fem_noeud(0)->get_etat(0)==EXTERIEUR) || (xfem->get_fem_noeud(1)->get_etat(0)==EXTERIEUR) || (xfem->get_fem_noeud(2)->get_etat(0)==EXTERIEUR))
2908     {
2909     xfem->change_etat(XEXTERIEUR);
2910     if (xfem->get_fem_noeud(0)->get_etat(0)==INCONNU) xfem->get_fem_noeud(0)->change_etat(0,EXTERIEUR);
2911     if (xfem->get_fem_noeud(1)->get_etat(0)==INCONNU) xfem->get_fem_noeud(1)->change_etat(0,EXTERIEUR);
2912     if (xfem->get_fem_noeud(2)->get_etat(0)==INCONNU) xfem->get_fem_noeud(2)->change_etat(0,EXTERIEUR);
2913     changement=1;
2914     }
2915     else
2916     if (((xfem->get_fem_noeud(0)->get_etat(0)==FRONTIERE) && (xfem->get_fem_noeud(0)->get_lien_topologie()->get_dimension()==2)) || ((xfem->get_fem_noeud(1)->get_etat(0)==FRONTIERE) && (xfem->get_fem_noeud(1)->get_lien_topologie()->get_dimension()==2)) || ((xfem->get_fem_noeud(2)->get_etat(0)==FRONTIERE) && (xfem->get_fem_noeud(2)->get_lien_topologie()->get_dimension()==2)))
2917     {
2918     xfem->change_etat(XINTERIEUR);
2919     if (xfem->get_fem_noeud(0)->get_etat(0)==INCONNU) xfem->get_fem_noeud(0)->change_etat(0,FRONTIERE);
2920     if (xfem->get_fem_noeud(1)->get_etat(0)==INCONNU) xfem->get_fem_noeud(1)->change_etat(0,FRONTIERE);
2921     if (xfem->get_fem_noeud(2)->get_etat(0)==INCONNU) xfem->get_fem_noeud(2)->change_etat(0,FRONTIERE);
2922     changement=1;
2923     }
2924     }
2925     }
2926     if (casatraiter==0) changement=1;
2927     }
2928     while (changement==0);
2929     }*/
2930     }
2931     XFEM_TRIANGLE3* TOIBREP::inserer_xtriangle(FEM_ELEMENT_MAILLAGE* tet,MG_FACE* face,FEM_NOEUD** tabnoeud)
2932     {
2933     OT_VECTEUR_3D vec1(tabnoeud[0]->get_coord(),tabnoeud[1]->get_coord());
2934     OT_VECTEUR_3D vec2(tabnoeud[0]->get_coord(),tabnoeud[2]->get_coord());
2935     OT_VECTEUR_3D vec3=vec1&vec2;
2936     double eps=0.0000000001*longueur_caracteristique*longueur_caracteristique;
2937     double aire=vec3.get_longueur()*0.5;
2938     if (aire<eps)
2939     return NULL;
2940     XFEM_TRIANGLE3* xtri=new XFEM_TRIANGLE3(tet,face,tabnoeud);
2941     oriente_tri(xtri,face);
2942     mai->ajouter_xfem_element2(xtri);
2943     if (xtri->get_id()==616861)
2944     std::cout<<""<<std::endl;
2945     if (xtri->get_id()==616862)
2946     std::cout<<""<<std::endl;
2947     if (xtri->get_id()==616855)
2948     std::cout<<""<<std::endl;
2949     return xtri;
2950     }
2951    
2952    
2953    
2954    
2955    
2956     FEM_NOEUD* TOIBREP::inserer_noeud(MG_ELEMENT_TOPOLOGIQUE* topo,double x,double y, double z)
2957     {
2958     TPL_MAP_ENTITE<FEM_NOEUD*> lstnoeud;
2959     octree_noeud.rechercher(x,y,z,0.000000001,lstnoeud);
2960     TPL_MAP_ENTITE<FEM_NOEUD*>::ITERATEUR it;
2961     for (FEM_NOEUD* no=lstnoeud.get_premier(it);no!=NULL;no=lstnoeud.get_suivant(it))
2962     {
2963     double *xyz=no->get_coord();
2964     OT_VECTEUR_3D vec(xyz[0]-x,xyz[1]-y,xyz[2]-z);
2965     if (vec.get_longueur()<0.000000001*longueur_caracteristique)
2966     {
2967     if (no->get_lien_topologie()==NULL)
2968     no->change_topologie_null(topo);
2969     return no;
2970     }
2971     }
2972     FEM_NOEUD* no=new FEM_NOEUD(topo,x,y,z);
2973     mai->ajouter_fem_noeud(no);
2974     octree_noeud.inserer(no);
2975     return no;
2976     }
2977    
2978    
2979    
2980     void TOIBREP::importer_et_decouper(MG_GROUPE_TOPOLOGIQUE* mggt)
2981     {
2982     double xmin=1e300,ymin=1e300,zmin=1e308;
2983     double xmax=-1e300,ymax=-1e300,zmax=-1e308;
2984     TPL_MAP_ENTITE<FEM_NOEUD*> lst_noeud;
2985     LISTE_FEM_NOEUD::iterator it2;
2986     for (FEM_NOEUD* noeud=mai->get_premier_noeud(it2);noeud!=NULL;noeud=mai->get_suivant_noeud(it2))
2987     {
2988     double* xyz=noeud->get_coord();
2989     if (xyz[0]<xmin) xmin=xyz[0];
2990     if (xyz[1]<ymin) ymin=xyz[1];
2991     if (xyz[2]<zmin) zmin=xyz[2];
2992     if (xyz[0]>xmax) xmax=xyz[0];
2993     if (xyz[1]>ymax) ymax=xyz[1];
2994     if (xyz[2]>zmax) zmax=xyz[2];
2995     lst_noeud.ajouter(noeud);
2996     }
2997     BOITE_3D boite(xmin,ymin,zmin,xmax,ymax,zmax);
2998     boite.change_grosseur(1.1);
2999     //if (compteur!=NULL) compteur->ajouter_etape("Traitement de base recherche boite");
3000     longueur_caracteristique=boite.get_rayon()*2.;
3001     octree_tetra.initialiser(&lst_noeud,1,boite.get_xmin(),boite.get_ymin(),boite.get_zmin(),boite.get_xmax(),boite.get_ymax(),boite.get_zmax());
3002     octree_noeud.initialiser(&octree_tetra);
3003     //if (compteur!=NULL) compteur->ajouter_etape("Traitement de base ini octree");
3004     LISTE_FEM_ELEMENT3::iterator it3;
3005     for (FEM_ELEMENT3* tet=mai->get_premier_element3(it3);tet!=NULL;tet=mai->get_suivant_element3(it3))
3006     {
3007     octree_tetra.inserer(tet);
3008     tet->change_etat(0,INCONNU);
3009     }
3010     for (FEM_NOEUD* noeud=mai->get_premier_noeud(it2);noeud!=NULL;noeud=mai->get_suivant_noeud(it2))
3011     octree_noeud.inserer(noeud);
3012     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst;
3013     if (mggt!=NULL)
3014     {
3015     int nb=mggt->get_nb();
3016     for (int i=0;i<nb;i++)
3017     {
3018     lst.ajouter(mggt->get(i));
3019     mggt->get(i)->get_topologie_sousjacente(&lst);
3020     }
3021     }
3022     else
3023     {
3024     int nbvol=geo->get_nb_mg_volume();
3025     for (int i=0;i<nbvol;i++)
3026     {
3027     lst.ajouter(geo->get_mg_volume(i));
3028     geo->get_mg_volume(i)->get_topologie_sousjacente(&lst);
3029     }
3030     }
3031    
3032     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
3033     if (affichageactif)
3034     {
3035     char mess[300];
3036     sprintf(mess," Predecoupage sommets");
3037     affiche(mess);
3038     }
3039     for (MG_ELEMENT_TOPOLOGIQUE* eletopo=lst.get_premier(it);eletopo!=NULL;eletopo=lst.get_suivant(it))
3040     if (eletopo->get_dimension()==0)
3041     {
3042     MG_SOMMET* som=(MG_SOMMET*)eletopo;
3043     double xyz[3];
3044     som->get_point()->evaluer(xyz);
3045     TPL_MAP_ENTITE<FEM_ELEMENT3*> liste;
3046     octree_tetra.rechercher(xyz[0],xyz[1],xyz[2],1e-1,liste);
3047     TPL_MAP_ENTITE<FEM_ELEMENT3*>::ITERATEUR itl;
3048     for (FEM_ELEMENT3* ele=liste.get_premier(itl);ele!=NULL;ele=liste.get_suivant(itl))
3049     {
3050     int status=outilfem.estdansletetra(ele,xyz[0],xyz[1],xyz[2]);
3051     if (outilfem.compare_etat_tetra(status,FEM_MAILLAGE_OUTILS::INTERIEUR)==1)
3052     {
3053     FEM_NOEUD* no;
3054     if (som->get_lien_fem_maillage()->get_nb()!=0) no=(FEM_NOEUD*)som->get_lien_fem_maillage()->get(0);
3055     else
3056     {
3057     no=inserer_noeud(eletopo,xyz[0],xyz[1],xyz[2]);
3058     no->change_etat(0,FRONTIERE);
3059     }
3060     XFEM_ELEMENT0 *xele0=new XFEM_ELEMENT0(ele,eletopo,&no);
3061     mai->ajouter_xfem_element0(xele0);
3062     xele0->change_etat(XFRONTIERE);
3063     decoupe_element(status,no,ele);
3064     }
3065    
3066    
3067     }
3068    
3069     }
3070     if (compteur!=NULL)
3071     {
3072     double tps=compteur->ajouter_etape("Predecoupage sommets");
3073     if (affichageactif)
3074     {
3075     char mess[300];
3076     sprintf(mess," ---> CPU : %lf",tps);
3077     affiche(mess);
3078     }
3079     }
3080     testtopo();
3081     if (affichageactif)
3082     {
3083     char mess[300];
3084     sprintf(mess," Predecoupage aretes");
3085     affiche(mess);
3086     }
3087     for (MG_ELEMENT_TOPOLOGIQUE* eletopo=lst.get_premier(it);eletopo!=NULL;eletopo=lst.get_suivant(it))
3088     if (eletopo->get_dimension()==1)
3089     {
3090     MG_ARETE* are=(MG_ARETE*)eletopo;
3091     MG_SOMMET* som1=are->get_cosommet1()->get_sommet();
3092     MG_SOMMET* som2=are->get_cosommet2()->get_sommet();
3093     double xyz1[3],xyzcible[3];
3094     inter_ele_arete ele_inter;
3095     ele_inter.are=are;
3096     som1->get_point()->evaluer(xyz1);
3097     som2->get_point()->evaluer(xyzcible);
3098     double t=are->get_tmin();
3099     FEM_NOEUD* no1=(FEM_NOEUD*)som1->get_lien_fem_maillage()->get(0);
3100     FEM_NOEUD* nofin=(FEM_NOEUD*)som2->get_lien_fem_maillage()->get(0);
3101     int inter;
3102     do
3103     {
3104     inter=decoupe_arete_tetra(are,xyz1,xyzcible,t,ele_inter);
3105     if (inter==1)
3106     {
3107     FEM_NOEUD* no2=inserer_noeud(are,ele_inter.xyz2[0],ele_inter.xyz2[1],ele_inter.xyz2[2]);
3108     no2->change_etat(0,FRONTIERE);
3109     FEM_NOEUD* tab[2];
3110     tab[0]=no1;
3111     tab[1]=no2;
3112     XFEM_SEGMENT2* xseg=new XFEM_SEGMENT2(ele_inter.ele,are,tab);
3113     mai->ajouter_xfem_element1(xseg);
3114     xseg->change_etat(XFRONTIERE);
3115     decoupe_element(ele_inter.status1,no1,ele_inter.ele);
3116     decoupe_element(ele_inter.status2,no2,ele_inter.ele);
3117     ele_inter.no1=no1;
3118     ele_inter.no2=no2;
3119     decoupe_element(xseg,&ele_inter);
3120     xyz1[0]=ele_inter.xyz2[0];
3121     xyz1[1]=ele_inter.xyz2[1];
3122     xyz1[2]=ele_inter.xyz2[2];
3123     no1=no2;
3124     }
3125    
3126     }
3127     while (inter!=0);
3128     FEM_NOEUD* tab[2];
3129     tab[0]=no1;
3130     tab[1]=nofin;
3131     XFEM_SEGMENT2* xseg=new XFEM_SEGMENT2(ele_inter.ele,are,tab);
3132     xseg->change_etat(XFRONTIERE);
3133     mai->ajouter_xfem_element1(xseg);
3134     ele_inter.no1=no1;
3135     ele_inter.no2=nofin;
3136     decoupe_element(-1,no1,ele_inter.ele);
3137     decoupe_element(-1,nofin,ele_inter.ele);
3138     decoupe_element(xseg,&ele_inter);
3139    
3140     }
3141     if (compteur!=NULL)
3142     {
3143     double tps=compteur->ajouter_etape("Predecoupage aretes");
3144     if (affichageactif)
3145     {
3146     char mess[300];
3147     sprintf(mess," ---> CPU : %lf",tps);
3148     affiche(mess);
3149     }
3150     }
3151     testtopo();
3152     if (affichageactif)
3153     {
3154     char mess[300];
3155     sprintf(mess," Decoupage XFEM");
3156     affiche(mess);
3157     }
3158     int numdebuttps;
3159     if (compteur!=NULL)
3160     {
3161     std::string nom;
3162     numdebuttps=compteur->get_nb_etape()-1;
3163     }
3164     int compteur_dim2=0;
3165     for (MG_ELEMENT_TOPOLOGIQUE* eletopo=lst.get_premier(it);eletopo!=NULL;eletopo=lst.get_suivant(it))
3166     if ((eletopo->get_dimension()==2) && (compteur_dim2++==2))
3167     {
3168     for (FEM_NOEUD* noeud=mai->get_premier_noeud(it2);noeud!=NULL;noeud=mai->get_suivant_noeud(it2))
3169     noeud->change_solution(1e300);
3170     for (FEM_ELEMENT3* tet=mai->get_premier_element3(it3);tet!=NULL;tet=mai->get_suivant_element3(it3))
3171     tet->change_solution(0.);
3172     MG_FACE* face=(MG_FACE*)eletopo;
3173     if (affichageactif)
3174     {
3175     char mess[300];
3176     sprintf(mess," Face id %lu",face->get_id());
3177     affiche(mess);
3178     }
3179     //if (!lst.existe(face)) continue;
3180     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lstentitetopo;
3181     face->get_topologie_sousjacente(&lstentitetopo);
3182     levelsetn(&lst,face,&lstentitetopo);
3183     for (FEM_ELEMENT3* tet=mai->get_premier_element3(it3);tet!=NULL;tet=mai->get_suivant_element3(it3))
3184     if (tet->get_etat(1)==1)
3185     {
3186     int nb_xtri=decoupe_tetra(tet,face);
3187     decoupe_xtri(tet,nb_xtri);
3188     decoupe_element2_par_element1et0(tet,&lstentitetopo);
3189     //recherche_interieur_face(tet,face,&lstentitetopo);
3190     }
3191     else
3192     {
3193     for (int num=0;num<2;num++)
3194     for (int i=0;i<tet->get_nb_xfem(num);i++)
3195     {
3196     MG_ELEMENT_TOPOLOGIQUE* mgt=tet->get_xfem(num,i)->get_lien_topologie();
3197     if (lstentitetopo.existe(mgt)==1)
3198     std::cout << "probleme tetra "<< num << ":" << tet->get_id() << " " << tet->get_etat(1) <<" = " << tet->get_fem_noeud(0)->get_etat(1)<< "-"<< tet->get_fem_noeud(1)->get_etat(1)<< "-"<< tet->get_fem_noeud(2)->get_etat(1)<< "-"<< tet->get_fem_noeud(3)->get_etat(1) << std::endl;
3199    
3200     }
3201     }
3202    
3203     }
3204    
3205     if (compteur!=NULL)
3206     {
3207     std::string nom;
3208     double tps;
3209     compteur->get_etape(numdebuttps,compteur->get_nb_etape()-1,nom,tps);
3210     if (affichageactif)
3211     {
3212     char mess[300];
3213     sprintf(mess," ---> CPU : %lf",tps);
3214     affiche(mess);
3215     }
3216    
3217     }
3218    
3219    
3220     for (FEM_ELEMENT3* tet=mai->get_premier_element3(it3);tet!=NULL;tet=mai->get_suivant_element3(it3))
3221     {
3222     double vol;
3223     int res=tet->verifie_validite_decoupage_xfem(&vol);
3224     int valide=res&1;
3225     int volnul=(res<<1)&1;
3226     if (valide==0)
3227     {
3228     std::cout << "Erreur decoupage tetra de id " << tet->get_id() << " volume residuel " << vol << std::endl;
3229     }
3230     if (volnul==1)
3231     {
3232     std::cout << "Erreur decoupage tetra de id " << tet->get_id() << " volume nul d'un xfem" << std::endl;
3233     }
3234     int nb1=tet->get_nb_xfem(1);
3235     for (int i=0;i<nb1;i++)
3236     {
3237     XFEM_ELEMENT1* xseg=(XFEM_ELEMENT1*)tet->get_xfem(1,i);
3238     FEM_NOEUD* no1=xseg->get_fem_noeud(0);
3239     FEM_NOEUD* no2=xseg->get_fem_noeud(1);
3240     int nb3=tet->get_nb_xfem(3);
3241     int trouve=0;
3242     for (int j=0;j<nb3;j++)
3243     {
3244     XFEM_ELEMENT3* xtettmp=(XFEM_ELEMENT3*)tet->get_xfem(3,j);
3245     FEM_NOEUD* not1=xtettmp->get_fem_noeud(0);
3246     FEM_NOEUD* not2=xtettmp->get_fem_noeud(1);
3247     FEM_NOEUD* not3=xtettmp->get_fem_noeud(2);
3248     FEM_NOEUD* not4=xtettmp->get_fem_noeud(3);
3249     if ((no1==not1) || (no1==not2) || (no1==not3) || (no1==not4))
3250     if ((no2==not1) || (no2==not2) || (no2==not3) || (no2==not4))
3251     trouve=1;
3252    
3253     }
3254     if (trouve==0)
3255     std::cout << "Erreur decoupage tetra de id " << tet->get_id() << " xfem1 pas coherent " << std::endl;
3256     }
3257     if (tet->get_id()==-407234)
3258     {
3259     MG_MAILLAGE* mgmai=mai->get_mg_maillage();
3260     FEM_MAILLAGE *femtmp=new FEM_MAILLAGE(mgmai->get_mg_geometrie(),mgmai,1);
3261     mgmai->get_gestionnaire()->ajouter_fem_maillage(femtmp);
3262     FEM_NOEUD* no1=tet->get_fem_noeud(0);
3263     FEM_NOEUD* no2=tet->get_fem_noeud(1);
3264     FEM_NOEUD* no3=tet->get_fem_noeud(2);
3265     FEM_NOEUD* no4=tet->get_fem_noeud(3);
3266     FEM_NOEUD* notmp1=new FEM_NOEUD(no1->get_lien_topologie(),no1->get_x(),no1->get_y(),no1->get_z());
3267     FEM_NOEUD* notmp2=new FEM_NOEUD(no2->get_lien_topologie(),no2->get_x(),no2->get_y(),no2->get_z());
3268     FEM_NOEUD* notmp3=new FEM_NOEUD(no3->get_lien_topologie(),no3->get_x(),no3->get_y(),no3->get_z());
3269     FEM_NOEUD* notmp4=new FEM_NOEUD(no4->get_lien_topologie(),no4->get_x(),no4->get_y(),no4->get_z());
3270     femtmp->ajouter_fem_noeud(notmp1);
3271     femtmp->ajouter_fem_noeud(notmp2);
3272     femtmp->ajouter_fem_noeud(notmp3);
3273     femtmp->ajouter_fem_noeud(notmp4);
3274     FEM_NOEUD* tab[4];
3275     tab[0]=notmp1;
3276     tab[1]=notmp2;
3277     tab[2]=notmp3;
3278     tab[3]=notmp4;
3279     FEM_TETRA4* tettmp=new FEM_TETRA4(tet->get_lien_topologie(),tet->get_mg_element_maillage(),tab);
3280     femtmp->ajouter_fem_element3(tettmp);
3281     int nb1=tet->get_nb_xfem(1);
3282     for (int j=0;j<nb1;j++)
3283     {
3284     XFEM_ELEMENT1* xtettmp=(XFEM_ELEMENT1*)tet->get_xfem(1,j);
3285     FEM_NOEUD* not1=xtettmp->get_fem_noeud(0);
3286     FEM_NOEUD* not2=xtettmp->get_fem_noeud(1);
3287     FEM_NOEUD* notmp1=new FEM_NOEUD(not1->get_lien_topologie(),not1->get_x(),not1->get_y(),not1->get_z());
3288     FEM_NOEUD* notmp2=new FEM_NOEUD(not2->get_lien_topologie(),not2->get_x(),not2->get_y(),not2->get_z());
3289     femtmp->ajouter_fem_noeud(notmp1);
3290     femtmp->ajouter_fem_noeud(notmp2);
3291     FEM_NOEUD* tab[4];
3292     tab[0]=notmp1;
3293     tab[1]=notmp2;
3294     XFEM_SEGMENT2* xtet2=new XFEM_SEGMENT2(tettmp,tet->get_lien_topologie(),tab);
3295     femtmp->ajouter_xfem_element1(xtet2);
3296     OT_VECTEUR_3D vec(notmp1->get_coord(),notmp2->get_coord());
3297     std::cout << vec.get_longueur() << std::endl;
3298     }
3299     int nb3=tet->get_nb_xfem(3);
3300     for (int j=0;j<nb3;j++)
3301     {
3302     XFEM_ELEMENT3* xtettmp=(XFEM_ELEMENT3*)tet->get_xfem(3,j);
3303     FEM_NOEUD* not1=xtettmp->get_fem_noeud(0);
3304     FEM_NOEUD* not2=xtettmp->get_fem_noeud(1);
3305     FEM_NOEUD* not3=xtettmp->get_fem_noeud(2);
3306     FEM_NOEUD* not4=xtettmp->get_fem_noeud(3);
3307     FEM_NOEUD* notmp1=new FEM_NOEUD(not1->get_lien_topologie(),not1->get_x(),not1->get_y(),not1->get_z());
3308     FEM_NOEUD* notmp2=new FEM_NOEUD(not2->get_lien_topologie(),not2->get_x(),not2->get_y(),not2->get_z());
3309     FEM_NOEUD* notmp3=new FEM_NOEUD(not3->get_lien_topologie(),not3->get_x(),not3->get_y(),not3->get_z());
3310     FEM_NOEUD* notmp4=new FEM_NOEUD(not4->get_lien_topologie(),not4->get_x(),not4->get_y(),not4->get_z());
3311     femtmp->ajouter_fem_noeud(notmp1);
3312     femtmp->ajouter_fem_noeud(notmp2);
3313     femtmp->ajouter_fem_noeud(notmp3);
3314     femtmp->ajouter_fem_noeud(notmp4);
3315     FEM_NOEUD* tab[4];
3316     tab[0]=notmp1;
3317     tab[1]=notmp2;
3318     tab[2]=notmp3;
3319     tab[3]=notmp4;
3320     XFEM_TETRA4* xtet2=new XFEM_TETRA4(tettmp,tet->get_lien_topologie(),tab);
3321     femtmp->ajouter_xfem_element3(xtet2);
3322     }
3323    
3324    
3325     }
3326    
3327     }
3328    
3329    
3330    
3331     }
3332    
3333    
3334     int TOIBREP::decoupe_segment_xtetra(FEM_ELEMENT3* ele,XFEM_ELEMENT1* seg,double *xyz,double *xyzcible,double &t,inter_ele_arete& xele_inter)
3335     {
3336     int code_retour=0;
3337     int nb=ele->get_nb_xfem(3);
3338     for (int i=0;i<nb;i++)
3339     {
3340     XFEM_ELEMENT3* xele=(XFEM_ELEMENT3*)ele->get_xfem(3,i);
3341     int status=outilfem.estdansletetra(xele,xyz[0],xyz[1],xyz[2]);
3342     if (outilfem.compare_etat_tetra(status,FEM_MAILLAGE_OUTILS::INTERIEUR)==1)
3343     {
3344     int status2=outilfem.estdansletetra(xele,xyzcible[0],xyzcible[1],xyzcible[2]);
3345     if (outilfem.compare_etat_tetra(status2,FEM_MAILLAGE_OUTILS::INTERIEUR)==1) return 0;
3346     double xyz1[3],uv1[3],xyz4[3],uv4[3],xyz2[3],uv2[3],xyz3[3],uv3[3];
3347     uv1[2]=t;
3348     uv2[2]=t;
3349     uv3[2]=t;
3350     uv4[2]=t;
3351     int inter_face1=intersection_segment_triangle(seg->get_fem_noeud(0),seg->get_fem_noeud(1),xele->get_fem_noeud(0),xele->get_fem_noeud(1),xele->get_fem_noeud(2),xyz1,uv1);
3352     int inter_face2=intersection_segment_triangle(seg->get_fem_noeud(0),seg->get_fem_noeud(1),xele->get_fem_noeud(0),xele->get_fem_noeud(1),xele->get_fem_noeud(3),xyz2,uv2);
3353     int inter_face3=intersection_segment_triangle(seg->get_fem_noeud(0),seg->get_fem_noeud(1),xele->get_fem_noeud(0),xele->get_fem_noeud(2),xele->get_fem_noeud(3),xyz3,uv3);
3354     int inter_face4=intersection_segment_triangle(seg->get_fem_noeud(0),seg->get_fem_noeud(1),xele->get_fem_noeud(1),xele->get_fem_noeud(2),xele->get_fem_noeud(3),xyz4,uv4);
3355     xele_inter.status2=1;
3356     if (inter_face1==1)
3357     {
3358     t=uv1[2];
3359     xele_inter.xele=xele;
3360     xele_inter.xyz1[0]=xyz[0];
3361     xele_inter.xyz1[1]=xyz[1];
3362     xele_inter.xyz1[2]=xyz[2];
3363     xele_inter.xyz2[0]=xyz1[0];
3364     xele_inter.xyz2[1]=xyz1[1];
3365     xele_inter.xyz2[2]=xyz1[2];
3366     xele_inter.status1=status;
3367     xele_inter.status2=xele_inter.status2+4;
3368     code_retour=1;
3369     }
3370     if (inter_face2==1)
3371     {
3372     t=uv2[1];
3373     xele_inter.xele=xele;
3374     xele_inter.xyz1[0]=xyz[0];
3375     xele_inter.xyz1[1]=xyz[1];
3376     xele_inter.xyz1[2]=xyz[2];
3377     xele_inter.xyz2[0]=xyz2[0];
3378     xele_inter.xyz2[1]=xyz2[1];
3379     xele_inter.xyz2[2]=xyz2[2];
3380     xele_inter.status1=status;
3381     xele_inter.status2=xele_inter.status2+8;
3382     code_retour=1;
3383     }
3384     if (inter_face3==1)
3385     {
3386     t=uv3[2];
3387     xele_inter.xele=xele;
3388     xele_inter.xyz1[0]=xyz[0];
3389     xele_inter.xyz1[1]=xyz[1];
3390     xele_inter.xyz1[2]=xyz[2];
3391     xele_inter.xyz2[0]=xyz3[0];
3392     xele_inter.xyz2[1]=xyz3[1];
3393     xele_inter.xyz2[2]=xyz3[2];
3394     xele_inter.status1=status;
3395     xele_inter.status2=xele_inter.status2+16;
3396     code_retour=1;
3397     }
3398     if (inter_face4==1)
3399     {
3400     t=uv4[2];
3401     xele_inter.xele=xele;
3402     xele_inter.xyz1[0]=xyz[0];
3403     xele_inter.xyz1[1]=xyz[1];
3404     xele_inter.xyz1[2]=xyz[2];
3405     xele_inter.xyz2[0]=xyz4[0];
3406     xele_inter.xyz2[1]=xyz4[1];
3407     xele_inter.xyz2[2]=xyz4[2];
3408     xele_inter.status1=status;
3409     xele_inter.status2=xele_inter.status2+32;
3410     code_retour=1;
3411     }
3412    
3413     }
3414     }
3415     }
3416    
3417    
3418     int TOIBREP::decoupe_arete_tetra(MG_ARETE* are,double *xyz,double *xyzcible,double &t,inter_ele_arete& ele_inter)
3419     {
3420     int code_retour=0;
3421     TPL_MAP_ENTITE<FEM_ELEMENT3*> liste;
3422     octree_tetra.rechercher(xyz[0],xyz[1],xyz[2],1e-10,liste);
3423     TPL_MAP_ENTITE<FEM_ELEMENT3*>::ITERATEUR itl;
3424     for (FEM_ELEMENT3* ele=liste.get_premier(itl);ele!=NULL;ele=liste.get_suivant(itl))
3425     {
3426     int status=outilfem.estdansletetra(ele,xyz[0],xyz[1],xyz[2]);
3427     if (outilfem.compare_etat_tetra(status,FEM_MAILLAGE_OUTILS::INTERIEUR)==1)
3428     {
3429     int status2=outilfem.estdansletetra(ele,xyzcible[0],xyzcible[1],xyzcible[2]);
3430     if (outilfem.compare_etat_tetra(status2,FEM_MAILLAGE_OUTILS::INTERIEUR)==1) {ele_inter.ele=ele;return 0;}
3431     double uv1[3],xyz1[3],uv2[3],xyz2[3],uv3[3],xyz3[3],uv4[3],xyz4[3];
3432     int inter_face1,inter_face2,inter_face3,inter_face4;
3433     int boucle=0;
3434     double titer=are->get_tmax()-t;
3435     do
3436     {
3437     if (t+boucle*0.05*titer>are->get_tmax()) break;
3438     uv1[2]=t+boucle*0.05*titer;
3439     uv2[2]=t+boucle*0.05*titer;
3440     uv3[2]=t+boucle*0.05*titer;
3441     uv4[2]=t+boucle*0.05*titer;
3442     inter_face1=intersection_arete_triangle(are,ele->get_fem_noeud(0),ele->get_fem_noeud(1),ele->get_fem_noeud(2),uv1,xyz1);
3443     inter_face2=intersection_arete_triangle(are,ele->get_fem_noeud(0),ele->get_fem_noeud(1),ele->get_fem_noeud(3),uv2,xyz2);
3444     inter_face3=intersection_arete_triangle(are,ele->get_fem_noeud(0),ele->get_fem_noeud(2),ele->get_fem_noeud(3),uv3,xyz3);
3445     inter_face4=intersection_arete_triangle(are,ele->get_fem_noeud(1),ele->get_fem_noeud(2),ele->get_fem_noeud(3),uv4,xyz4);
3446     boucle++;
3447     }
3448     while (inter_face1+inter_face2+inter_face3+inter_face4==0);
3449     ele_inter.status2=1;
3450     if (inter_face1==1)
3451     {
3452     OT_VECTEUR_3D vec(xyz,xyz1);
3453     if (vec.get_longueur()<1e-10) inter_face1=0;
3454     else
3455     {
3456     t=uv1[2];
3457     ele_inter.ele=ele;
3458     ele_inter.status2=ele_inter.status2+4;
3459     ele_inter.status1=status;
3460     ele_inter.xyz1[0]=xyz[0];
3461     ele_inter.xyz1[1]=xyz[1];
3462     ele_inter.xyz1[2]=xyz[2];
3463     ele_inter.xyz2[0]=xyz1[0];
3464     ele_inter.xyz2[1]=xyz1[1];
3465     ele_inter.xyz2[2]=xyz1[2];
3466     code_retour=1;
3467    
3468     }
3469     }
3470     if (inter_face2==1)
3471     {
3472     OT_VECTEUR_3D vec(xyz,xyz2);
3473     if (vec.get_longueur()<1e-10) inter_face1=0;
3474     else
3475     {
3476     t=uv2[2];
3477     ele_inter.ele=ele;
3478     ele_inter.status2=ele_inter.status2+8;
3479     ele_inter.status1=status;
3480     ele_inter.xyz1[0]=xyz[0];
3481     ele_inter.xyz1[1]=xyz[1];
3482     ele_inter.xyz1[2]=xyz[2];
3483     ele_inter.xyz2[0]=xyz2[0];
3484     ele_inter.xyz2[1]=xyz2[1];
3485     ele_inter.xyz2[2]=xyz2[2];
3486     code_retour=1;
3487     }
3488    
3489     }
3490     if (inter_face3==1)
3491     {
3492     OT_VECTEUR_3D vec(xyz,xyz3);
3493     if (vec.get_longueur()<1e-10) inter_face1=0;
3494     else
3495     {
3496     t=uv3[2];
3497     ele_inter.ele=ele;
3498     ele_inter.status2=ele_inter.status2+16;
3499     ele_inter.status1=status;
3500     ele_inter.xyz1[0]=xyz[0];
3501     ele_inter.xyz1[1]=xyz[1];
3502     ele_inter.xyz1[2]=xyz[2];
3503     ele_inter.xyz2[0]=xyz3[0];
3504     ele_inter.xyz2[1]=xyz3[1];
3505     ele_inter.xyz2[2]=xyz3[2];
3506     code_retour=1;
3507     }
3508    
3509     }
3510     if (inter_face4==1)
3511     {
3512     OT_VECTEUR_3D vec(xyz,xyz4);
3513     if (vec.get_longueur()<1e-10) inter_face1=0;
3514     else
3515     {
3516     t=uv4[2];
3517     ele_inter.ele=ele;
3518     ele_inter.status2=ele_inter.status2+32;
3519     ele_inter.status1=status;
3520     ele_inter.xyz1[0]=xyz[0];
3521     ele_inter.xyz1[1]=xyz[1];
3522     ele_inter.xyz1[2]=xyz[2];
3523     ele_inter.xyz2[0]=xyz4[0];
3524     ele_inter.xyz2[1]=xyz4[1];
3525     ele_inter.xyz2[2]=xyz4[2];
3526     code_retour=1;
3527    
3528     }
3529    
3530     }
3531     }
3532     }
3533     return code_retour;
3534     }
3535    
3536    
3537    
3538    
3539    
3540    
3541    
3542    
3543    
3544    
3545    
3546    
3547    
3548    
3549    
3550    
3551    
3552 francois 309 void TOIBREP::ajouter_liste(LISTE_FM_TRI &lst,LISTE_FM_TRI_ID &lstid,FEM_ELEMENT3* tet,double val)
3553 francois 222 {
3554 francois 309 pair<double,FEM_ELEMENT3*> p(val,tet);
3555 francois 222 LISTE_FM_TRI::iterator it=lst.insert(p);
3556     lstid[tet->get_id()]=it;
3557     }
3558    
3559 francois 309 void TOIBREP::supprimer_liste(LISTE_FM_TRI &lst,LISTE_FM_TRI_ID &lstid,FEM_ELEMENT3* tet)
3560 francois 222 {
3561     LISTE_FM_TRI::iterator it2=lstid[tet->get_id()];
3562     LISTE_FM_TRI_ID::iterator it3=lstid.find(tet->get_id());
3563     lstid.erase(it3);
3564     lst.erase(it2);
3565     }
3566    
3567 francois 309 void TOIBREP::ajouter_liste(LISTE_FM& lst,FEM_ELEMENT3* tet)
3568 francois 222 {
3569     lst.push_back(tet);
3570     }
3571    
3572 francois 309 void TOIBREP::supprimer_liste(LISTE_FM& lst,FEM_ELEMENT3* tet)
3573 francois 222 {
3574     LISTE_FM::iterator it=find(lst.begin(),lst.end(),tet);
3575     if (it!=lst.end()) lst.erase(it);
3576     }
3577    
3578    
3579    
3580 francois 309 double TOIBREP::resoudgradT(FEM_ELEMENT3* tet,int *signe)
3581 francois 222 {
3582     double j[9];
3583     double N[12];
3584     double jN[12]={0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.};
3585     double T[4];
3586     double uv[2]={0.25,0.25};
3587    
3588    
3589     tet->get_inverse_jacob(j,uv);
3590     for (int i=0;i<3;i++)
3591     for (int k=0;k<4;k++)
3592     N[i*4+k]=tet->get_fonction_derive_interpolation(k+1,i+1,uv);
3593     int premier=0;
3594     double tmin=1e300;
3595     double tmax=-1e300;
3596     for (int i=0;i<4;i++)
3597     {
3598     if (i==tet->get_numero()) continue;
3599     T[i]=tet->get_fem_noeud(i)->get_solution();
3600     if (fabs(T[i])>0.000001)
3601     {
3602     if (premier==0)
3603     if (T[i]>0) (*signe)=1; else (*signe)=-1;
3604     else if (T[i]*(*signe)<0) (*signe)=0;
3605     }
3606     T[i]=fabs(T[i]);
3607     if (tet->get_numero()!=i)
3608     {
3609     if (T[i]<tmin) tmin=T[i];
3610     if (T[i]>tmax) tmax=T[i];
3611     }
3612     premier=1;
3613     }
3614     for (int i=0;i<3;i++)
3615     for (int k=0;k<4;k++)
3616     for (int l=0;l<3;l++)
3617     jN[i*4+k]=jN[i*4+k]+j[i*3+l]*N[l*4+k];
3618     double a=0.,b=0.,c=-1.;
3619     for (int i=0;i<3;i++)
3620     {
3621     double coef=0.;
3622     double coefinc=0.;
3623     for (int l=0;l<4;l++)
3624     {
3625     if (tet->get_numero()!=l) coef=coef+jN[i*4+l]*T[l];
3626     else coefinc=coefinc+jN[i*4+l];
3627     }
3628     c=c+coef*coef;
3629     a=a+coefinc*coefinc;
3630     b=b+2*coef*coefinc;
3631     }
3632     /*if (*signe==0)
3633     cout << "attention " <<endl;*/
3634     double det=b*b-4.*a*c;
3635     if (det<0.) det=0.; else det=sqrt(det);
3636     double sol1=(-b-det)/2./a;
3637     double sol2=(-b+det)/2./a;
3638     double sol=sol1;
3639     if (sol2>sol1) sol=sol2;
3640     if (sol<tmin*0.99)
3641     sol=0.;
3642     sol=sol*(*signe);
3643     return sol;
3644     }
3645 francois 433
3646    
3647    
3648    
3649    
3650    
3651    
3652    
3653     int TOIBREP::inter_segment_segment_plan(XFEM_ELEMENT2 *xfem2,FEM_NOEUD *no1,FEM_NOEUD *no2,FEM_NOEUD *nos1,FEM_NOEUD *nos2,double *xyz)
3654     {
3655     OT_VECTEUR_3D n1n2(xfem2->get_fem_noeud(0)->get_coord(),xfem2->get_fem_noeud(1)->get_coord());
3656     OT_VECTEUR_3D n1n3(xfem2->get_fem_noeud(0)->get_coord(),xfem2->get_fem_noeud(2)->get_coord());
3657     OT_VECTEUR_3D n=n1n2&n1n3;
3658     n.norme();
3659     double d=-(n.get_x()*xfem2->get_fem_noeud(0)->get_x()+n.get_y()*xfem2->get_fem_noeud(0)->get_y()+n.get_z()*xfem2->get_fem_noeud(0)->get_z());
3660     double t1=-(n.get_x()*nos1->get_x()+n.get_y()*nos1->get_y()+n.get_z()*nos1->get_z()+d);
3661     double t2=-(n.get_x()*nos2->get_x()+n.get_y()*nos2->get_y()+n.get_z()*nos2->get_z()+d);
3662     double xyzs1p[3];
3663     xyzs1p[0]=nos1->get_x()+t2*n.get_x();
3664     xyzs1p[1]=nos1->get_y()+t2*n.get_y();
3665     xyzs1p[2]=nos1->get_z()+t2*n.get_z();
3666     double xyzs2p[3];
3667     xyzs2p[0]=nos2->get_x()+t2*n.get_x();
3668     xyzs2p[1]=nos2->get_y()+t2*n.get_y();
3669     xyzs2p[2]=nos2->get_z()+t2*n.get_z();
3670     double *xyz1=no1->get_coord();
3671     double *xyz2=no2->get_coord();
3672     double ab[3],cd[3],ac[3];
3673     ab[0]=xyz2[0]-xyz1[0];
3674     ab[1]=xyz2[1]-xyz1[1];
3675     ab[2]=xyz2[2]-xyz1[2];
3676     cd[0]=xyzs2p[0]-xyzs1p[0];
3677     cd[1]=xyzs2p[1]-xyzs1p[1];
3678     cd[2]=xyzs2p[2]-xyzs1p[2];
3679     ac[0]=xyzs1p[0]-xyz1[0];
3680     ac[1]=xyzs1p[1]-xyz1[1];
3681     ac[2]=xyzs1p[2]-xyz1[2];
3682     int n1,n2;
3683     double det1=-ab[0]*cd[1]+ab[1]*cd[0];
3684     double det2=-ab[0]*cd[2]+ab[2]*cd[0];
3685     double det3=-ab[1]*cd[2]+ab[2]*cd[1];
3686     double det;
3687     if ( (fabs(det1)>=fabs(det2)) && (fabs(det1)>=fabs(det3)) )
3688     {
3689     n1=0;
3690     n2=1;
3691     det=det1;
3692     }
3693     else
3694     {
3695     if ( (fabs(det2)>=fabs(det1)) && (fabs(det2)>=fabs(det3)) )
3696     {
3697     n1=0;
3698     n2=2;
3699     det=det2;
3700     }
3701     else
3702     {
3703     if ( (fabs(det3)>=fabs(det2)) && (fabs(det3)>=fabs(det1)) )
3704     {
3705     n1=1;
3706     n2=2;
3707     det=det3;
3708     }
3709     else return 0;
3710     }
3711     }
3712     double tt=ab[n1]*ac[n2]-ab[n2]*ac[n1];
3713     tt=tt/det;
3714     if (tt<0.0000000001) return 0;
3715     if (tt>1.-0.0000000001) return 0;
3716     xyz[0]=nos1->get_x()+tt*(nos2->get_x()-nos1->get_x());
3717     xyz[1]=nos1->get_y()+tt*(nos2->get_y()-nos1->get_y());
3718     xyz[2]=nos1->get_z()+tt*(nos2->get_z()-nos1->get_z());
3719     return 1;
3720     }
3721    
3722    
3723    
3724     void TOIBREP::testtopo(void)
3725     {
3726     LISTE_XFEM_ELEMENT0::iterator it0;
3727     LISTE_XFEM_ELEMENT1::iterator it1;
3728     LISTE_XFEM_ELEMENT2::iterator it2;
3729     LISTE_XFEM_ELEMENT3::iterator it3;
3730     for (XFEM_ELEMENT0 *ele=mai->get_premier_xelement0(it0);ele!=NULL;ele=mai->get_suivant_xelement0(it0))
3731     {
3732     if (ele->get_fem_noeud(0)->get_lien_topologie()==NULL) std::cout << "Noeud de xele 0 " << ele->get_fem_noeud(0)->get_id() << " non attache à la topologie" << std::endl;
3733     }
3734     for (XFEM_ELEMENT1 *ele=mai->get_premier_xelement1(it1);ele!=NULL;ele=mai->get_suivant_xelement1(it1))
3735     {
3736     if (ele->get_lien_topologie()==NULL) std::cout << "Xele1 " << ele->get_id() << " non attache à la topologie " << std::endl;
3737     if (ele->get_fem_noeud(0)->get_lien_topologie()==NULL) std::cout << "Noeud de xele 1 " << ele->get_fem_noeud(0)->get_id() << " non attache à la topologie. " << ele->get_fem_noeud(0)->get_lien_element3()->get_nb() << " tetras lies" << std::endl;
3738     if (ele->get_fem_noeud(1)->get_lien_topologie()==NULL) std::cout << "Noeud de xele 1 " << ele->get_fem_noeud(1)->get_id() << " non attache à la topologie. " << ele->get_fem_noeud(0)->get_lien_element3()->get_nb() << " tetras lies" << std::endl;
3739     }
3740     for (XFEM_ELEMENT2 *ele=mai->get_premier_xelement2(it2);ele!=NULL;ele=mai->get_suivant_xelement2(it2))
3741     {
3742     if (ele->get_lien_topologie()==NULL) std::cout << "Xele2 " << ele->get_id() << " non attache à la topologie " << std::endl;
3743     if (ele->get_fem_noeud(0)->get_lien_topologie()==NULL) std::cout << "Noeud de xele 2 " << ele->get_fem_noeud(0)->get_id() << " non attache à la topologie" << std::endl;
3744     if (ele->get_fem_noeud(1)->get_lien_topologie()==NULL) std::cout << "Noeud de xele 2 " << ele->get_fem_noeud(1)->get_id() << " non attache à la topologie" << std::endl;
3745     }
3746     /*for (XFEM_ELEMENT3 *ele=mai->get_premier_xelement3(it3);ele!=NULL;ele=mai->get_suivant_xelement3(it3))
3747     {
3748     if (ele->get_fem_noeud(0)->get_lien_topologie()==NULL) std::cout << "Noeud de xele 3" << ele->get_fem_noeud(0)->get_id() << " non attache à la topologie" << std::endl;
3749     if (ele->get_fem_noeud(1)->get_lien_topologie()==NULL) std::cout << "Noeud de xele 3" << ele->get_fem_noeud(1)->get_id() << " non attache à la topologie" << std::endl;
3750     if (ele->get_fem_noeud(2)->get_lien_topologie()==NULL) std::cout << "Noeud de xele 3" << ele->get_fem_noeud(2)->get_id() << " non attache à la topologie" << std::endl;
3751     }*/
3752    
3753    
3754     }
3755