ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/toIbrep/src/toibrep.cpp
Revision: 1075
Committed: Tue Aug 10 17:02:54 2021 UTC (3 years, 9 months ago) by francois
File size: 122862 byte(s)
Log Message:
suppression de warning avec le dernier compilateur

File Contents

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