ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/toIbrep/src/toibrep.cpp
Revision: 906
Committed: Mon Nov 13 22:30:18 2017 UTC (7 years, 6 months ago) by couturad
File size: 122786 byte(s)
Log Message:
Nouveau opencascade commit 1

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