ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/toIbrep/src/toibrep.cpp
Revision: 1158
Committed: Thu Jun 13 22:18:49 2024 UTC (11 months, 3 weeks ago) by francois
File size: 122637 byte(s)
Log Message:
compatibilité Ubuntu 22.04
Suppression des refeences à Windows
Ajout d'une banière

File Contents

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