ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/toIbrep/src/toibrep.cpp
Revision: 488
Committed: Mon Feb 10 18:09:02 2014 UTC (11 years, 3 months ago) by francois
File size: 122668 byte(s)
Log Message:
resolution de mise en module independant du code d'eric

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